Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: xinyiman - Agosto 16, 2014, 09:26:19 pm

Titolo: Libreria systemusers
Inserito da: xinyiman - Agosto 16, 2014, 09:26:19 pm
Ciao ragazzi questa è la libreria che stò creando per ottenere uno standard multipiattaforma per ottenere le info sugli utenti.

Se guardate l'esempio allegato trovate una prima bozza, al momento attuale ho bisogno di consigli per ricavare dalle info che già stampo sulla memo della form.

Che ne pensate, qual'è il modo più elegante e veloce di ricavarle?! Inoltre come cambiare la data da lettere a numeri?

Si accettano consigli :)
Titolo: Re:Libreria systemusers
Inserito da: nomorelogic - Agosto 17, 2014, 10:32:42 am
la libreria è interessante, specie perché multipiattforma

un paio di consigli:
1) ci sono dei metodi e dell1e variabili che hanno nomi in inglese ed altri in italiano. sarebbe meglio scegliere un'unica lingua per dare i nomi. in un' ottica open source sarebbe meglio l'inglese almeno tutti possono trarne vantaggio (ad esempio per fpc c'è del codice in spagnolo o portoghese: va sempre a finire che queste librerie le scarto a priori :P)

2) ho notato che nelle classi non usi le proprietà ma fai uso di metodi get/set.

Piuttosto che fare:

Codice: [Seleziona]
 
    TMovementOfUser = object
      private
             ...
             procedure setTypeMovement(appvalue: string);
             ...
      public
             ...
             function getTypeMovement: string;
             ...
    end;

sarebbe meglio:

Codice: [Seleziona]
    TMovementOfUser = object
      private
             ...
             procedure setTypeMovement(appvalue: string);
             function getTypeMovement: string;
             ...
      public
             property TypeMovement: string read getTypeMovement write setTypeMovement;

    end;

così è più pratico sia per lo scrivere (basta scrivere la riga "property" e schiacciare Ctrl+C per avere le dichiarazioni dei metodi) che per il leggere.
Inoltre è molto più flessibile: se oggi non hai bisogno dei metodi puoi scrivere:

Codice: [Seleziona]
property TypeMovement: string read FTypeMovement write FTypeMovement;

così ti verrà creata una variabile all'interno della classe e se domani vuoi sostituire la variabile con un metodo non dovrai fare altro che sostituire FTypeMovement con getTypeMovement ed il codice chiamante non dovrà essere modificato
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 17, 2014, 01:09:32 pm
Per i nomi in lingua inglese era già in lista da fare, l'altra idea giustamente come dici tu è più elegante e utile. Provvederò ad aggiornarla...invece per il consiglio su come estrapolare le date e le ore cosa mi consigli? Un'espressione regolare? O cosa?!
Titolo: Re:Libreria systemusers
Inserito da: nomorelogic - Agosto 18, 2014, 10:54:28 am
scusami ma con soli 4 giorni di ferie nel mio cervello s'è verificato un Ctrl+Alt+Canc...

Spiegami meglio qual è il problema dell'estrapolazione delle date e delle ore per favore :P
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 18, 2014, 03:20:36 pm
Nomore, per capire devi eseguire il programma postato qui sopra e vedere il risultato relativo al tuo username. Voglio capire secondo voi qual'è la soluzione migliore per estrapolare dalla singola riga del comando last la data e l'ora del login e logout.

Inoltre ti è arrivata la mia mail?
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 19, 2014, 08:41:40 am
Qualche passo avanti è stato fatto, ma deve essere ancora sistemata meglio
Titolo: Re:Libreria systemusers
Inserito da: nomorelogic - Agosto 19, 2014, 12:51:36 pm
secondo me devi usare l'output in formato iso

Codice: [Seleziona]
last --time-format iso username

in questo modo credo ti resti tutto più facile
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 19, 2014, 05:11:38 pm
già provato ma il risultato è

last --time-format iso


last: invalid option -- '-'
Usage: last [-num | -n num] [-f file] [-t YYYYMMDDHHMMSS] [-R] [-adioxFw] [username..] [tty..]
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 19, 2014, 05:22:56 pm
Infatti.
Ti dice che gli stai passando fiori quando vuole patate.

last username

cosa ti restituisce?
Stilgar
Titolo: Re:Libreria systemusers
Inserito da: El Salvador - Agosto 19, 2014, 05:31:37 pm
Perchè object e non una classe?

Citazione
TMovementOfUser = object
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 19, 2014, 05:50:47 pm
Infatti.
Ti dice che gli stai passando fiori quando vuole patate.

last username

cosa ti restituisce?
Stilgar
Quello lo so, stò solo cercando un modo con last che mi restituisca la data in formato numerico e non testuale.
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 19, 2014, 05:55:46 pm
Perchè object e non una classe?

Citazione
TMovementOfUser = object
[/quote
Comodità
Titolo: Re:Libreria systemusers
Inserito da: El Salvador - Agosto 19, 2014, 06:00:52 pm
Inoltre non potete cambiare il formato della data dell'output. Non esiste un parametro al commando Last per far questo. http://linux.about.com/library/cmd/blcmdl1_last.htm (http://linux.about.com/library/cmd/blcmdl1_last.htm)

Citazione
Comodità
Ovvero?
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 19, 2014, 06:07:14 pm
Inoltre non potete cambiare il formato della data dell'output. Non esiste un parametro al commando Last per far questo. http://linux.about.com/library/cmd/blcmdl1_last.htm (http://linux.about.com/library/cmd/blcmdl1_last.htm)

Citazione
Comodità
Ovvero?

Questo lo sapevo, io speravo in un truschino...

La comodità è che non devo usare la create e la free, siccome uso un array di tali oggetti la mia paura era dimenticarmi di liberare la memoria. con l'object non è necessario
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 19, 2014, 10:17:34 pm
hihi.
Sono sempre quello che si incasina la vita :D

http://code.metager.de/source/xref/gnu/sysvinit/src/last.c

Trovo interessante il comando last. I suoi sorgenti di + ;)

Basta che fai il parsing del file "/var/log/wtmp" 
Il cat butta fuori porcheria illegibile.

Ho trovato http://man7.org/linux/man-pages/man5/utmp.5.html
Da una struttura per la lettura dei file ...

 struct utmp {
               short   ut_type;              /* Type of record */
               pid_t   ut_pid;               /* PID of login process */
               char    ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */
               char    ut_id[4];             /* Terminal name suffix,
                                                or inittab(5) ID */
               char    ut_user[UT_NAMESIZE]; /* Username */
               char    ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or
                                                kernel version for run-level
                                                messages */
               struct  exit_status ut_exit;  /* Exit status of a process
                                                marked as DEAD_PROCESS; not
                                                used by Linux init(8) */
               /* The ut_session and ut_tv fields must be the same size when
                  compiled 32- and 64-bit.  This allows data files and shared
                  memory to be shared between 32- and 64-bit applications. */
           #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32
               int32_t ut_session;           /* Session ID (getsid(2)),
                                                used for windowing */
               struct {
                   int32_t tv_sec;           /* Seconds */
                   int32_t tv_usec;          /* Microseconds */
               } ut_tv;                      /* Time entry was made */
           #else
                long   ut_session;           /* Session ID */
                struct timeval ut_tv;        /* Time entry was made */
           #endif

               int32_t ut_addr_v6[4];        /* Internet address of remote
                                                host; IPv4 address uses
                                                just ut_addr_v6[0] */
               char __unused[20];            /* Reserved for future use */
           };


Data Type: pid_t
    The pid_t data type is a signed integer type which is capable of representing a process ID. In the GNU library, this is an int.

note :
c/c++ : short signed integer type. At least 16 bits in size. -> pascal:smallint.
i char in c sono "caratteri" ovvero shortint. ;)

http://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html
signed char
The 8-bit signed char data type can hold integer values in the range of −128 to 127.
unsigned char
The 8-bit unsigned char data type can hold integer values in the range of 0 to 255.
char
Depending on your system, the char data type is defined as having the same range as either the signed char or the unsigned char data type (they are three distinct types, however). By convention, you should use the char data type specifically for storing ASCII characters (such as `m'), including escape sequences (such as `\n').

PS:
Linux è open source ... e i comandi gnu altrettanto ... butto lì l'idea del porting dell'api da zero ;)

Stilgar

Titolo: Re:Libreria systemusers
Inserito da: nomorelogic - Agosto 19, 2014, 10:19:48 pm
già provato ma il risultato è

last --time-format iso


last: invalid option -- '-'
Usage: last [-num | -n num] [-f file] [-t YYYYMMDDHHMMSS] [-R] [-adioxFw] [username..] [tty..]

prima di consigliartelo l'ho provato...
man last
ti da qualche aiuto?

in alternativa puoi usare -t
Titolo: Re:Libreria systemusers
Inserito da: nomorelogic - Agosto 19, 2014, 10:22:08 pm
PS:
Linux è open source ... e i comandi gnu altrettanto ... butto lì l'idea del porting dell'api da zero ;)

Stilgar... troppo sole fa male :D :D :D
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 19, 2014, 10:30:24 pm

Codice: [Seleziona]
type
  TUtmp = packed record
    ut_type: short;              (* Type of record *)
    ut_pid: pid_t;               (* PID of login process *)
    ut_line: array [0..UT_LINESIZE - 1] of char; (* Device name of tty - "/dev/" *)
    ut_id: array [0..4 - 1] of char;             (* Terminal name suffix,
                                               or inittab(5) ID *)
    ut_user: array [0..UT_NAMESIZE - 1] of char; (* Username *)
    ut_host: array [0..UT_HOSTSIZE] of char; (* Hostname for remote login, or
                                               kernel version for run-level
                                               messages *)
    ut_exit: exit_status;  (* Exit status of a process
                                               marked as DEAD_PROCESS; not
                                               used by Linux init( *)
              (* The ut_session and ut_tv fields must be the same size when
                 compiled 32- and 64-bit.  This allows data files and shared
                 memory to be shared between 32- and 64-bit applications. *)
          {$if __WORDSIZE == 64 and defined __WORDSIZE_COMPAT32}
    ut_session: int32_t;           (* Session ID (getsid(2)),
                                               used for windowing *)
    ut_tv: record
      tv_sec: int32_t;           (* Seconds *)
      tv_usec: int32_t;          (* Microseconds *)
    end;                       (* Time entry was made *)
          {$else}
    ut_session: long;           (* Session ID *)
    ut_tv: timeval;        (* Time entry was made *)
          {$endif}

    ut_addr_v6: array[0..3 - 1] of int32_t;        (* Internet address of remote
                                               host; IPv4 address uses
                                               just ut_addr_v6[0] *)
    __unused: array [0..20 - 1] of char;            (* Reserved for future use *)
  end;
           
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 19, 2014, 10:34:58 pm
@nomore ... ho 3 solo birre da 0.5 in corpo :D
Sale ne uso solo al mare quando faccio il bagno ;) e quest'anno ho fatto molte docce e pochi bagni (visto i monsoni che giravano qui in veneto :D)
Intendevo il porting dell'api da zero.
Last è un comando di cui si può leggere il sorgente. Se non esiste la libreria (come in window) si può controllare e verificare cosa interessa e "modificarlo" a piacimento :p
Stavo provando a scrivere la funzione per xinyman ;)
poi torno al mio traduttore pirata :)

Stilgar
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 19, 2014, 10:43:57 pm
urca ... trovo interessante l'unità utmp ...
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 19, 2014, 10:47:02 pm
BINGO:
Codice: [Seleziona]
Program testu;
uses utmp,unixutil;
Const UTMPFile = '/var/run/utmp';
var
EndOfUsers : Boolean;
m,d,y,hh,mm,ss : Word;
begin
Set_utmp_file(UTMPFile);
Writeln ('Number of utmp entries : ',number_of_utmp_entries);
set_search_parameters (Include ,All_login_types);
Read_logged_users;
Writeln ('Number of logged users : ',Number_Of_logged_users);
While More_USers do
With Get_Next_user do
begin
Writeln ('Logtype : ',login_type_names[type_of_login]);
Writeln ('Pid : ',Pid);
Writeln ('Device : ',Device);
Writeln ('TTYname : ',TTy_Name);
EpochToLocal(login_time,y,m,d,hh,mm,ss);
Writeln ('Login Time : ',y,'/',m,'/',d,' ',hh,':',mm,':',ss);
Writeln ('User Name : ',user_name);
Writeln ('Host name : ',host_name);
Write ('IP address : ',Ip_address[1],'.',Ip_address[2]);
Writeln ('.',ip_address[3],'.',ip_address[4]);
end;
end.

va bene xinyman?
Abbastanza "poco testo"?

Stilgar
Titolo: Re:Libreria systemusers
Inserito da: nomorelogic - Agosto 19, 2014, 11:24:16 pm
wow, bel lavoro Stilgar

@xinyman
ti tocca eliminare la chiamata del comando last con TProcess (ed includere questo sorgente nella tua classe)...
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 19, 2014, 11:27:25 pm
Ho solo cercato un esempio di utilizzo della utmp ;)
Solo ricerca con google ;)

:p

Stilgar

PS:
Grazie
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 20, 2014, 02:34:57 pm
BINGO:
Codice: [Seleziona]
Program testu;
uses utmp,unixutil;
Const UTMPFile = '/var/run/utmp';
var
EndOfUsers : Boolean;
m,d,y,hh,mm,ss : Word;
begin
Set_utmp_file(UTMPFile);
Writeln ('Number of utmp entries : ',number_of_utmp_entries);
set_search_parameters (Include ,All_login_types);
Read_logged_users;
Writeln ('Number of logged users : ',Number_Of_logged_users);
While More_USers do
With Get_Next_user do
begin
Writeln ('Logtype : ',login_type_names[type_of_login]);
Writeln ('Pid : ',Pid);
Writeln ('Device : ',Device);
Writeln ('TTYname : ',TTy_Name);
EpochToLocal(login_time,y,m,d,hh,mm,ss);
Writeln ('Login Time : ',y,'/',m,'/',d,' ',hh,':',mm,':',ss);
Writeln ('User Name : ',user_name);
Writeln ('Host name : ',host_name);
Write ('IP address : ',Ip_address[1],'.',Ip_address[2]);
Writeln ('.',ip_address[3],'.',ip_address[4]);
end;
end.

va bene xinyman?
Abbastanza "poco testo"?

Stilgar

Lo avevo già provato ma questo è il risultato

Codice: [Seleziona]
francesco@netbook-mint ~/Documenti/Lazarus/test2utmp $ sudo  ./project1 
[sudo] password for francesco:
Number of utmp entries : 10
Number of logged users : 2
Logtype : Boot time
Pid : 0
Device :
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : Run level
Pid : 0
Device :
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : Login process
Pid : 0
Device : ty4
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : Login process
Pid : 0
Device : ty5
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : Login process
Pid : 0
Device : ty2
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : Login process
Pid : 0
Device : ty3
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : Login process
Pid : 0
Device : ty6
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : Login process
Pid : 0
Device : ty1
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : User process
Pid : 0
Device : ty8
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0
Logtype : User process
Pid : 0
Device : ts/2
TTYname :
Login Time : 1970/1/1 2:0:0
User Name :
Host name :
IP address : 0.0.0.0

Ovvero nessun dato utile
Titolo: Re:Libreria systemusers
Inserito da: Stilgar - Agosto 20, 2014, 02:35:45 pm
EpochToLocal(login_time,y,m,d,hh,mm,ss); Writeln ('Login Time : ',y,'/',m,'/',d,' ',hh,':',mm,':',ss);


Login Time : 1970/1/1 2:0:0
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 20, 2014, 02:36:46 pm
già provato ma il risultato è

last --time-format iso


last: invalid option -- '-'
Usage: last [-num | -n num] [-f file] [-t YYYYMMDDHHMMSS] [-R] [-adioxFw] [username..] [tty..]

prima di consigliartelo l'ho provato...
man last
ti da qualche aiuto?

in alternativa puoi usare -t

Non sono riuscito a farlo funzionare nemmeno con -t
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 20, 2014, 04:49:34 pm
Sul mio pc ho risolto così, mi testereste il sorgente anche sulle vostre versioni linux? E mi date un riscontro? Grazie mille
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 20, 2014, 05:11:25 pm
Ora mi piacerebbe inserire una funzione che faccia la verifica se l'utente e la password inseriti sono corretti. Ideee al riguardo?

Lo scopo sarebbe realizzare programmi che usino lo stesso username e password dell'accesso al sistema così da semplificare la vita agli utenti e non doversi ricordare mille password...

Titolo: Re:Libreria systemusers
Inserito da: nomorelogic - Agosto 20, 2014, 07:25:40 pm
mi sa tanto che tocca fare un approccio alla Stilgar, ovvero:
vedere cosa fanno i sorgenti di passwd
Titolo: Re:Libreria systemusers
Inserito da: xinyiman - Agosto 20, 2014, 07:38:27 pm
mi sa tanto che tocca fare un approccio alla Stilgar, ovvero:
vedere cosa fanno i sorgenti di passwd
Lo credo pure io, ma non ho voglia di farmi uno sbattone, ora vedo che fare...

anche perchè ho appena trovato questa cartella nei sorgenti fifpc

/usr/share/fpcsrc/2.6.4/packages/users/examples/

e mi sta iniziando a montare un certo qual nervoso...anche se i sorgenti per testare la password non mi funzionano...grrrrrrrrrrrrrrrrrrrrr