Created
January 12, 2011 12:57
-
-
Save ilpeste/776131 to your computer and use it in GitHub Desktop.
Questa classe permette di parsare, e fare il merge dei dati dei file /etc/passwd e /etc/shadow.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class PasswdShadow | |
# Questa classe permette di parsare, e fare il merge dei dati dei file | |
# /etc/passwd e /etc/shadow. | |
############################### Classe Entry ################################# | |
# Questa classe permette di leggere una singola riga del file passwd passato. | |
class Entry | |
# Costruttore | |
def initialize | |
@attributes = {} | |
end | |
def method_missing(name, *args) | |
attribute = name.to_s | |
if attribute =~ /=$/ | |
@attributes[attribute.chop] = args[0] | |
else | |
@attributes[attribute] | |
end | |
end | |
# Metodo che legge e ritorna una linea del file e comunica eventuali errori | |
def import(fields_passwd, fields_shadow) | |
# Ottengo i campi del file /etc/passwd | |
field_names_passwd = [:user, :password, :uid, :gid, :gecos, :home, :shell] | |
puts "ERRORE: Linea non nel formato passwd corretto, non ha 7 campi." unless fields_passwd.length == 7 | |
# Ottengo i campi del file /etc/shadow | |
field_names_shadow = [:login, :shadow, :last, :min, :max, :warning, :inactive, :expire, :reserved] | |
puts "ERRORE: Linea non nel formato shadow corretto, non ha 9 campi." unless fields_shadow.length == 9 | |
# Aggiungo i campi del passwd | |
field_names_passwd.each do |field_name| | |
self.send("#{field_name}=", fields_passwd[field_names_passwd.index(field_name)].strip ) | |
end | |
# Aggiungo i campi di shadow | |
field_names_shadow.each do |field_name| | |
self.send("#{field_name}=", fields_shadow[field_names_shadow.index(field_name)].strip ) | |
end | |
end | |
end | |
########################## Classe Padre PasswdShadow ######################### | |
# Attributi | |
attr_reader :passwd_filename, :shadow_filename, :entries | |
# Costruttore | |
def initialize(passwd_filename="/etc/passwd", shadow_filename="/etc/shadow") | |
@entries = [] | |
import(passwd_filename, shadow_filename) | |
end | |
def each | |
@entries.each do |entry| | |
yield entry | |
end | |
end | |
# Metodo per stampare il risultato | |
def print | |
field_names = [:user, :password, :uid, :gid, :gecos, :home, :shell, :login, :shadow, :last, :min, :max, :warning, :inactive, :expire, :reserved] | |
@entries.each do |entry| | |
puts "UTENTE:" | |
field_names.each do |field_name| | |
puts " #{field_name}: " + entry.send("#{field_name}") | |
end | |
end | |
puts "TOTALE #{@entries.size} UTENTI" | |
end | |
# Metodo per importare i dati dai file specificati | |
def import(passwd, shadow) | |
# Lista di utenti presenti in passwd che NON hanno un corrispettivo in shadow | |
shadow_mancante = [] | |
# Per ogni linea del file passwd, verifico | |
# Import del file passwd (NB: hanno usato caratteri accentati per il campo | |
# gecos del passwd, devo leggere il file nel formato iso-8859-15) | |
File.open(passwd, "r:iso-8859-15").each do |line_passwd| | |
fields_passwd = line_passwd.split(":") | |
trovato = false | |
# Import del file shadow | |
File.open(shadow, "r").each do |line_shadow| | |
fields_shadow = line_shadow.split(":") | |
if fields_passwd[0] == fields_shadow[0] | |
trovato = true | |
entry = Entry.new | |
entry.import(fields_passwd, fields_shadow) | |
@entries << entry | |
break | |
end | |
end | |
shadow_mancante << fields_passwd[0] unless trovato | |
end | |
puts "ATTENZIONE: Gli utenti #{shadow_mancante.join(',')}, non hanno un corrispettivo nel file shadow" unless shadow_mancante.empty? | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Per usare la classe
passwd = PasswdShadow.new('path/to/passwd','path/to/shadow')
Stampo il contenuto
passwd.print