Skip to content

Instantly share code, notes, and snippets.

@ilpeste
Created January 12, 2011 12:57
Show Gist options
  • Save ilpeste/776131 to your computer and use it in GitHub Desktop.
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.
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
@ilpeste
Copy link
Author

ilpeste commented Jan 12, 2011

Per usare la classe

passwd = PasswdShadow.new('path/to/passwd','path/to/shadow')

Stampo il contenuto

passwd.print

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment