#!/usr/bin/ruby
require 'getoptlong'
require 'fileutils'

class User
  include FileUtils    # henter inn metodene cd, mkdir, chmod m.m i klassen vår.

  GROUP = "deltaker"               # Vi definerer konstanter for gruppe,
  HOME_BASE = "/home/deltaker"     # katalogplassering og
  MODE = 0755                      # filrettigheter.

  def initialize( username )
    @name = username
    raise ArgumentError, "Need username." unless @name   # Må ha et brukernavn.
    @homedir =    HOME_BASE + File::SEPARATOR + @name    # Subkataloger...
    @public_html = @homedir + File::SEPARATOR + "public_html"
    @cgi_bin = @public_html + File::SEPARATOR + "cgi-bin"
  end

  def make( adduser = false )
    make_user if adduser
    make_dir( @homedir,     MODE )    # Lager de forskjellige katalogene.
    make_dir( @public_html, MODE )
    make_dir( @cgi_bin,     MODE )
  end 

  def make_dir( dir, mode = 0755 )
    mkdir( dir, :mode => mode ) rescue Errno::EEXIST   # Forsøk å lage katalog.
    chmod( mode, dir )             # Sett rettighetene i tilfelle mkdir feilet.
    cd( dir )                      # Forflytter oss til katalogen og ...
    system("chown #{@name} . * -Rf")         # kjører eksterne kommandoer
    system("chgrp #{GROUP} . * -Rf")         # for å endre fileierskap.
  end

  def make_user                # Kjører eksternt program 'useradd'.
    `useradd -g #{GROUP} -d #{@homedir} #{@name} `  
  end
  private :make_user, :make_dir

end

if __FILE__ == $0 then
  opsjoner = GetoptLong.new(      # Henter kommandolinjeopsjonene.
                       ["--username", "-u", GetoptLong::REQUIRED_ARGUMENT],
                       ["--adduser",  "-a", GetoptLong::NO_ARGUMENT]
                       )
  username = nil
  adduser = false
  opsjoner.each do |opsjon, argument|
    case opsjon
    when "--username"
      username = argument
    when "--adduser"
      adduser = true
    end
  end
  user = User.new( username )
  user.make( adduser )
end
