# erfordert Ruby 1.9 require "csv" require "fileutils" require "set" csv_file = ARGV.first raise "specify a user CSV" if csv_file.nil? raise "must be run as root" unless Process.uid == 0 def invalid_login?(login) return false if login =~ /^[a-z0-9]+$/ warn "invalid login: #{login.inspect}" true end $existing_logins = CSV.readlines("/etc/passwd", :col_sep => ":").map(&:first).to_set def existing_login?(login) return false unless $existing_logins.include?(login) warn "existing login: #{login.inspect}" true end new_users = CSV.readlines(csv_file).reject { |(login, _, _)| invalid_login?(login) or existing_login?(login) } exit 0 if new_users.empty? lines_by_file_name = {"passwd" => [], "group" => [], "shadow" => []} new_users.each_with_index do |(login, lastname, firstname), i| uid = i + 1001 lines_by_file_name["passwd"] << [login, "x", uid, uid, "#{lastname}, #{firstname}", "/bin/bash"].join(":") lines_by_file_name["group"] << [login, "x", uid, login].join(":") lines_by_file_name["shadow"] << [login, "!", "", "", "", "", "", "", ""].join(":") end lines_by_file_name.each do |file_name, lines| File.open("/etc/#{file_name}", "a") { |f| f.puts lines } end new_users.each do |(login, _, _)| home_dir = "/home/#{login}" FileUtils.mkdir_p(home_dir, :mode => 0700) FileUtils.cp_r("/etc/skel/.", home_dir) end