Open Source im professionellen Einsatz

Anwendungsbeispiel

Viele in diesem Artikel gezeigte Ruby-Features finden sich in Listing 11 wieder, das die Aufgabenstellung aus der Einführung zu diesem Magazin-Schwerpunkt umsetzt: Es liest eine CSV-Datei zeilenweise ein, prüft Login-Namen gegen einen regulären Ausdruck und schreibt die gültigen Daten in alle relevanten Linux-Systemdateien, um die Benutzerkonten anzulegen (Abbildung 4). Selbst für Ruby-Neulinge liest es sich leicht und verrät, was es in welcher Zeile tut.

Listing 11

User aus CVS-Liste anlegen

01 # erfordert Ruby 1.9
02
03 require "csv"
04 require "fileutils"
05 require "set"
06
07 csv_file = ARGV.first
08 raise "specify a user CSV" if csv_file.nil?
09
10 raise "must be run as root" unless Process.uid == 0
11
12 def invalid_login?(login)
13   return false if login =~ /^[a-z0-9]+$/
14   warn "invalid login: #{login.inspect}"
15   true
16 end
17
18 $existing_logins = CSV.readlines("/etc/passwd", :col_sep => ":").map(&:first).to_set
19 def existing_login?(login)
20   return false unless $existing_logins.include?(login)
21   warn "existing login: #{login.inspect}"
22   true
23 end
24
25 new_users = CSV.readlines(csv_file).reject { |(login, _, _)| invalid_login?(login) or existing_login?(login) }
26
27 exit 0 if new_users.empty?
28
29 lines_by_file_name = {"passwd" => [], "group" => [], "shadow" => []}
30
31 new_users.each_with_index do |(login, lastname, firstname), i|
32   uid = i + 1001
33   lines_by_file_name["passwd"] << [login, "x", uid, uid, "#{lastname}, #{firstname}", "/bin/bash"].join(":")
34   lines_by_file_name["group"]  << [login, "x", uid, login].join(":")
35   lines_by_file_name["shadow"] << [login, "!", "", "", "", "", "", "", ""].join(":")
36 end
37
38 lines_by_file_name.each do |file_name, lines|
39   File.open("/etc/#{file_name}", "a") { |f| f.puts lines }
40 end
41
42 new_users.each do |(login, _, _)|
43   home_dir = "/home/#{login}"
44   FileUtils.mkdir_p(home_dir, :mode => 0700)
45   FileUtils.cp_r("/etc/skel/.", home_dir)
46 end

Überall Juwelen

Ruby eignet sich nicht nur für selbst geschrieben Skripte. Die Programmiersprache findet sich in den letzten Jahren oft in leistungsstarker Software zur Verwaltung größerer Systeme. Dazu gehören das Deployment-Tool Capistrano [9] und Puppet [10], ein System zum Management von Serverkonfigurationen. Dem gleichen Zweck dient das Framework Chef [11]. Das Buildsystem Rake [12] ist eine Offenbarung für alle, die bisher an GNU Make gewöhnt waren.

Wer auf dem Laufenden in Sachen Ruby-Programmierung bleiben möchte, sollte die Website Ruby Inside [13] besuchen. Dort sind auch hervorragende Tutorials zu finden. (mhu)

Der Autor

André Ben Hamou ist ein vielsprachiger Programmierer, der sich vor über zehn Jahren in Ruby verliebt hat. Beim Verlag Apress hat er das Buch "Practical Ruby for System Administration" http://prfsa.com veröffentlicht.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 5 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook