RPM-LUA(7) Miscellaneous Information Manual RPM-LUA(7) NUME rpm-lua - interpretul intern Lua al RPM SINOPSIS %scriptlet -p %{lua:...} DESCRIERE Lua este un limbaj de programare cu scop general, conceput special pentru a fi incorporat in alte programe, iar RPM include un interpret Lua incorporat pentru utilizare in rpm-macros(7) avansate i scripturi de tranzacii. Interpretorul Lua incorporat face posibile diverse lucruri care sunt dificile sau imposibile cu macrocomenzi simple sau scripturi shell externe, cum ar fi eliminarea buclelor de dependena din scriptlet-urile pachetelor. MACROCOMENZI Accesarea macrocomenzilor Extensia rpm are diverse funcii pentru gestionarea macrocomenzilor, dar cea mai convenabila modalitate de a accesa rpm-macroproc(7) din mediul RPM Lua este prin intermediul tabelului global macros. Lua nu face diferena intre sintaxele indexului tabelului i ale numelui campului, astfel incat macros.foo i macros['foo'] sunt echivalente. Utilizai cea care se potrivete mai bine scopului. Ca orice tabel Lua real, elementele inexistente sunt returnate ca nil, iar atribuirea poate fi utilizata pentru a defini sau a anula definiia macrocomenzilor. Exemplu: if not macros.yours then macros.my = 'my macro' end local v = { '_libdir', '_bindir', '_xbindir' } for _, v in ipairs(v) do if not macros[v] then macros[v] = 'default' end end Toate macrocomenzile impartaesc acelai mediu global de execuie Lua. Apelarea macrocomenzilor parametrice Macrocomenzile parametrice (inclusiv toate macrocomenzile incorporate) pot fi apelate intr-un mod nativ Lua prin intermediul tabelului macros, folosind sintaxa macros.nume() sau macros[nume](). Argumentele sunt pasate printr-un singur argument, care este fie o un singur ir, caz in care este extins i imparit cu regulile native ale macrocomenzii o fie un tabel, caz in care coninutul tabelului este utilizat ca argumente literale care nu sunt extinse in niciun fel. Exemplul 1: macros.with('foo') Exemplul 2: macros.dostuff({'one', 'two', 'three'}) Returnarea datelor Prin definiie, orice print()'ed in Lua va ajunge in expansiunea macrocomenzii. Macrocomenzile Lua pot, de asemenea, return (sa returneze) rezultatul, ceea ce face ca macrocomenzile de ajutor pentru programare sa para mai naturale. Exemplu: %sum() %{lua: local v = 0 for _, a in ipairs(arg) do v = v + tonumber(a) end return v } Opiuni i argumente Macrocomenzile parametrice Lua primesc opiunile i argumentele lor sub forma a doua tabele locale opt i arg, unde opt conine valorile opiunilor procesate, indexate dupa caracterul opiunii, iar arg conine argumentele indexate numeric. Aceste tabele sunt intotdeauna prezente, indiferent daca opiunile sau argumentele au fost efectiv pasate pentru a simplifica utilizarea. Exemplu: %foo(a:b) %{lua: if opt.b then print('fa b') else print('sau nu') end if opt.a == 's' then print('fa s') end if #arg == 0 then print('fara argumente :(') else for i = 1, #arg do print(arg[i]) end end } SCRIPTLET-uri Lua intern poate fi utilizat ca interpret al scriptlet-urilor de tranzacii RPM, inclusiv declanatoarele i declanatoarele de fiiere: Exemplu: %pre -p print('Salutare din Lua') Dei venerabilul /bin/sh este de obicei mai convenabil pentru activitaile de scripturi legate de impachetare, interpretul Lua incorporat are cateva avantaje unice pentru scriptlet-urile de tranzacii: acestea nu adauga dependene suplimentare pachetelor i astfel pot ajuta la eliminarea buclelor de dependena. Aceasta poate fi o diferena cruciala in setul de pachete ,,bootstrap" iniial dintr-o instalare iniiala. In special, un script Lua incorporat este singura opiune general utilizabila in scriplet-urile %pretrans in timpul instalarii iniiale a unui sistem. Lua incorporat este, de asemenea, mult mai rapid decat executarea unui interpret potenial greoi doar pentru a rula cateva linii de script shell. Nota: scriptlet-urile care utilizeaza Lua intern nu trebuie sa faca presupuneri cu privire la partajarea mediului de execuie cu alte scriptlet-uri. Argumente Argumentele scriptlet-ului sunt accesibile dintr-un tabel de arg global. Nota: in Lua, indexurile incep de obicei de la 1 (unu) in loc de 0 (zero) i, in bine sau in rau, implementarea RPM urmeaza aceasta practica. Astfel, indexurile arg ale scriptlet-ului sunt cu unu mai mici decat se ateapta in mod normal, pe baza argumentelor tradiionale ale scriptlet-ului. Argumentul care conine numarul de instane ale pachetului instalat este arg[2], iar argumentul similar pentru intele declanatoare este arg[3], faa de $1 i $2 tradiionale din scripturile shell. Exemplu: %postun -p if arg[2] == 0 then print("erasing") end Pachete realocabile Scriptlet-urile pachetelor realocabile conin in plus un tabel global RPM_INSTALL_PREFIX care conine toate prefixele posibile ale pachetului. Adaugat: 4.18.0 Starea de ieire Dei scriptlet-urile nu ar trebui sa poata eua in mod normal, putei semnaliza starea de eec a scriptlet-ului utilizand funcia Lua error(mesaj, [nivel]) daca este necesar. FIIERELE DE SPECIFICAII In contextul unei analize a fiierului rpm-spec(5) cu rpmbuild(1) sau rpmspec(1), mediul RPM Lua conine urmatoarele tabele globale specifice specificaiilor: patches Numele fiierelor coreciilor (plasturilor) din specificaie, in ordinea in care apar in specificaie. patch_nums Numerele coreciilor din specificaie, in ordinea in care au aparut in specificaie. sources Numele fiierelor surselor din specificaie, in ordinea in care apar in specificaie. source_nums Numerele surselor din specificaie, in ordinea in care apar in specificaie. Exemplu: for i, p in ipairs(patches) do print(string.format("echo %d: %sn", patch_nums[i], patches[i])) end EXTENSII In plus faa de bibliotecile standard Lua (in funcie de versiunea Lua la care este legat RPM), urmatoarele extensii sunt disponibile in interpretul intern Lua al RPM. Acestea pot fi utilizate in toate contextele in care poate fi utilizat Lua intern. extensie rpm Sunt disponibile urmatoarele funcii specifice RPM: b64decode(argument) Efectueaza decodificarea base64 pe argument. A se vedea de asemenea, b64encode(). Exemplu: blob = 'binary data' print(blob) e = rpm.b64encode(blob) print(e) d = rpm.b64decode(e) print(d) b64encode(argument [, lungime-linie]) Efectueaza codificarea base64 pe argument. Lungimea liniei poate fi specificata opional prin al doilea argument. A se vedea de asemenea, b64decode(). define("nume corp") Definete o macrocomanda globala nume cu corp. A se vedea de asemenea, seciunea MACROCOMENZI. Exemplu: rpm.define('foo 1') execute(ruta [, argument1 [,...]) Executa o comanda externa. Aceasta este utila pentru executarea comenzilor auxiliare externe fara a depinde de shell. ruta este comanda de executat, urmata de un numar opional de argumente care trebuie transmise comenzii. Pentru un control mai bun asupra execuiei procesului i a rezultatului, consultai rpm.spawn(). Adaugata: 4.15.0 Exemplu: rpm.execute('ls', '-l', '/') expand(argument) Efectueaza expansiunea macrocomenzii RPM pe irul argumentului. A se vedea de asemenea, seciunea MACROCOMENZI. Exemplu: rpm.expand('%{_libdir}/mydir') glob(model, [fanioane]) Returneaza un tabel cu numele de rute care corespund cu model. Daca fanioane conine c, returneaza model in cazul in care nu exista coincidene. Exemplu: for i, p in ipairs(rpm.glob('*')) do print(p) end interactive() Lanseaza sesiunea interactiva pentru testare i depanare. Utilizai in schimb rpmlua(1). Exemplu: rpm --eval "%{lua: rpm.interactive()}" isdefined(nume) Testeaza daca o macrocomanda nume este definita i daca este parametrica, returnand doua valori booleene. A se vedea de asemenea, seciunea MACROCOMENZI. (Adaugata: 4.17.0) Exemplu: if rpm.isdefined('_libdir') then ... end load(ruta) Incarca un fiier de macrocomanda din ruta specificata. La fel ca macrocomanda incorporata %{load:...}. Exemplu: rpm.load('my.macros') open(ruta, [mod[.fanioane]]) Deschide un flux de fiiere utilizand facilitaile RPM IO, cu suport pentru comprimare i decomprimare transparenta. ruta este irul numelui fiierului, urmat opional de irul mod pentru a specifica comportamentul de deschidere: o a: deschide pentru adaugare o w: deschide pentru scriere, trunchiere o r: deschide pentru citire (implicit) o +: deschide pentru citire i scriere o x: eueaza daca fiierul exista i, opional, urmat de rpm-payloadflags(7) pentru comprimare i decomprimare. Adaugata: 4.17.0 Exemplu: f = rpm.open('some.txt.gz', 'r.gzdio') print(f:read()) Obiectul rpm.fd returnat are urmatoarele metode: fd:close() Inchide fluxul fiierului. Exemplu: f = rpm.open('file') f:close() fd:flush() Golete fluxul fiierului. Exemplu: f = rpm.open('file', 'w') f:write('foo') f:flush() f:close() fd:read([lungime]) Citete datele din fluxul de fiiere pana la lungime octei sau, daca nu este specificata, intregul fiier. Exemplu: f = rpm.open('/vreun/fiier') print(f:read()) fd:seek(mod, poziie) Repoziioneaza poziia fiierului in flux.& mod este unul dintre set, cur i end, iar poziia este relativa la mod: absoluta, relativa la curent sau relativa la sfarit.& Nu toate fluxurile accepta cautarea.& Returneaza decalajul fiierului dupa operaie. A se vedea de asemenea lseek(3). Exemplu: f = rpm.open('newfile', 'w') f:seek('set', 555) f:close() fd:write(buffer [, lungime]) Scrie datele din buffer in fluxul de fiiere, fie in intregime, fie pana la lungime octei, daca este specificata. Exemplu: f = rpm.open('newfile', 'w') f:write('data data') f:close() fd:reopen(mod) Redeschide un flux cu un mod nou (a se vedea rpm.open()). Exemplu: rpm.open('vreun.txt.gz') f = f:reopen('r.gzdio') print(f:read())} redirect2null(fdno) (OBSOLETA) Redirecioneaza descriptorul de fiier fdno catre /dev/null (inainte de 4.16, aceasta era cunoscuta sub numele de posix.redirect2null()) Aceasta funcie este invechita i disponibila numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizai in schimb ,,rpm.spawn()" sau ,,rpm.execute()". pid = posix.fork() if pid == 0 then posix.redirect2null(2) assert(posix.exec('/bin/awk')) elseif pid > 0 then posix.wait(pid) end spawn({comanda} [, {aciuni}]) Lanseaza, adica executa, un program extern. {comanda} este un tabel format din comanda i argumentele sale. Un al doilea tabel opional poate fi utilizat pentru a transmite diverse aciuni legate de executarea comenzii. In prezent, sunt acceptate urmatoarele: | Aciune | Argument(e) | Descriere |----------|------------------------- | *stdin* | ruta | Redirecioneaza intrarea standard catre ruta | *stdout* | ruta | Redirecioneaza ieirea standard catre ruta | *stderr* | ruta | Redirecioneaza ieirea de eroare standard catre ruta Returneaza starea de ieire a comenzii: zero in caz de succes sau un tuplet de (nil, mesaj, cod) in caz de eec. Adaugata: 4.20 Exemplu: rpm.spawn({'systemctl', 'restart', 'httpd'}, {stderr='/dev/null'}) undefine(nume) Anuleaza definirea unei macrocomenzi. A se vedea i seciunea MACROCOMENZI. Reinei ca aceasta afieaza doar cea mai recenta definiie a macrocomenzii cu numele dat din stiva, adica pot exista inca definiii ale macrocomenzii cu acelai nume dupa o operaie de anulare a definiiei. Exemplu: rpm.undefine('zzz') vercmp(v1, v2) Efectueaza compararea versiunilor RPM pe irurile de argumente. Returneaza -1, 0 sau 1 daca v1 este mai mica, egala sau mai mare decat v2. Consultai rpm-version(7). Nota: in RPM < 4.16, aceasta funciona numai pe segmente de versiune, ceea ce nu produce rezultate corecte pe iruri EVR complete. Exemplu: rpm.vercmp('1.2-1', '2.0-1') ver(evr), ver(e, v, r) Creeaza obiectul versiune RPM. Acesta accepta fie un ir evr care este analizat in componentele sale, fie epoca, versiunea i lansarea in argumente separate (care pot fi iruri sau numere). Obiectul are trei atribute: e pentru epoca, v pentru versiune i r pentru lansare, poate fi afiat in forma EVR i accepta comparaii native in Lua. Adaugata: 4.17.0 Exemplu: v1 = rpm.ver('5:1.0-2) v2 = rpm.ver(3, '5a', 1) if v1 < v2 then ... end if v1.e then ... end extensie posix Biblioteca standard Lua ofera un set destul de limitat de operaii de In/Ie. Extensia posix imbunataete considerabil posibilitaile oferite de Lua. Urmatoarele funcii sunt disponibile in spaiul de nume posix, adica pentru a le apela utilizai posix.funcia(). Aceasta documentaie se concentreaza pe conveniile API Lua. Pentru informaii suplimentare despre apelurile de sistem corespunzatoare, consultai manualul de sistem, de exemplu access(3) pentru posix.access(). access(ruta [, mod]) Testeaza accesibilitatea fiierului/directorului ruta. A se vedea acces(3). Daca mod este omis, se testeaza existena, in caz contrar se efectueaza o combinaie dintre urmatoarele teste: o r: poate fi citit o w: poate fi scis o x: este executabil o f: exista Exemplu: if posix.access('/bin/rpm', 'x') then ... end chdir(ruta) Schimba directorul de lucru curent la ruta. A se vedea chdir(1). Exemplu: posix.chdir('/tmp') chmod(ruta, mod) Modifica modul fiierului/directorului. Modul poate fi fie un numar octal, ca in cazul apelului de sistem chmod(2), fie o reprezentare sub forma de ir similara cu chmod(1). Exemplu: posix.chmod('aa', 600) posix.chmod('bb', 'rw-') posix.chmod('cc', 'u+x') chown(ruta, utilizator, grup) Modifica proprietarul/grupul fiierului/directorului ruta. Argumentele utilizator i grup pot fi valori numerice de identificare sau nume de utilizator/grup. A se vedea chown(2) i chown(1). Nota: Aceasta este o operaie privilegiata. Exemplu: posix.chown('aa', 0, 0) posix.chown('bb', 'nobody', 'nobody') ctermid() Obine numele terminalului de control. Consultai ctermid(3). Exemplu: print(posix.ctermid()) dir([ruta]) Obine coninutul directorului - ca readdir(3). Daca argumentul ruta este omis, se utilizeaza directorul curent. Exemplu: for i,p in pairs(posix.dir('/')) do print(p..'n') end errno() Obine mesajul strerror(3) i numarul corespunzator pentru ieirea errno(3) curenta. Exemplu: f = '/zzz' if not posix.chmod(f, 100) then s, n = posix.errno() print(f, s) end exec(ruta [, argumete...]) (OBSOLETA) Executa un program. Aceasta poate fi exectuata numai dupa posix.fork(). Aceasta funcie este invechita i disponibila numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizai in schimb rpm.spawn() sau rpm.execute(). files([ruta]) Iterare peste coninutul directorului. Daca ruta este omisa, se utilizeaza directorul curent. Exemplu: for f in posix.files('/') do print(f..'n') end fork() (OBSOLETA) Bifurca un nou proces (dintr-unul existent). A se vedea fork(2). Aceasta funcie este invechita i disponibila numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizai in schimb rpm.spawn() sau rpm.execute(). Exemplu: pid = posix.fork() if pid == 0 then posix.exec('/foo/bar') elseif pid > 0 then posix.wait(pid) end getcwd() Obine directorul curent. A se vedea getcwd(3). Exemplu: if posix.getcwd() ~= '/' then ... endif getenv(nume) Obine o variabila de mediu. Consultai getenv(3). Exemplu: if posix.getenv('HOME') ~= posix.getcwd() then print('not at home') end getgroup(group) Obine informaii grup(5) pentru un grup. grup poate fi fie un ID numeric, fie un nume de grup. Daca este omis, se utilizeaza grupul curent. Returneaza un tabel cu campurile nume i gid definite ca nume i ID de grup, respectiv, i indexuri incepand de la 1 care specifica membrii grupului. Exemplu: print(posix.getgroup('wheel').gid) getlogin() Obine numele de conectare. A se vedea getlogin(3). Exemplu: n = posix.getlogin() getpasswd([utilizator [, selector]]) Obine informaii passwd(5) pentru un cont de utilizator. utilizator poate fi fie un ID numeric, fie un nume de utilizator. Daca este omis, se utilizeaza utilizatorul curent. Argumentul opional selector poate fi unul dintre urmatoarele: o name o uid o gid o dir o shell o gecos o passwd Daca este omis, se returneaza un tabel cu toate aceste campuri. Exemplu: pw = posix.getpasswd(posix.getlogin(), 'shell')| getprocessid([selector]) Obine informaii despre procesul curent. Argumentul opional selector poate fi unul dintre o egid: ID-ul grupului efectiv o euid: ID-ul utilizatorului efectiv o gid: ID-ul grupului o uid: ID-ul utilizatorului o pgrp: id-ul grupului parinte o pid: id-ul procesului o ppid: pid-ul parinte Daca este omis, se returneaza un tabel cu toate aceste campuri. Exemplu: if posix.getprocessid('pid') == 1 then ... end kill(pid [, semnal]) Trimite un semnal(7) catre un proces. semnal trebuie sa fie o valoare numerica, de exemplu 9 pentru SIGKILL. Daca este omis, se utilizeaza SIGTERM. A se vedea de asemenea, kill(2). Exemplu: posix.kill(posix.getprocessid('pid')) link(ruta-veche, ruta-noua) Creeaza un nou nume la ruta-noua pentru un fiier de la ruta-veche, cunoscut i sub numele de legatura dura. A se vedea de asemenea, link(2). Exemplu: f = rpm.open('aaa', 'w') posix.link('aaa', 'bbb') mkdir(ruta) Creeaza un nou director la ruta. A se vedea de asemenea, mkdir(2). Exemplu: posix.mkdir('/tmp') mkfifo(ruta) Creeaza o FIFO, adica o conducta cu nume, la ruta. A se vedea de asemenea, mkfifo(2). Exemplu: posix.mkfifo('/tmp/loc-greit') pathconf(ruta [, selector]) Obine informaii pathconf(3) pentru ruta. Argumentul opional selector poate fi unul dintre urmatoarele o link_max o max_canon o max_input o name_max o path_max o pipe_buf o chown_restricted o no_trunc o vdisable. Daca este omis, se returneaza un tabel cu toate aceste campuri. Exemplu: posix.pathconf('/', 'path_max') putenv(ir) Modifica sau adauga o variabila de mediu. A se vedea de asemenea, putenv(3). Exemplu: posix.putenv('HOME=/me') readlink(ruta) Citete valoarea legaturii simbolice de la ruta. A se vedea de asemenea, readlink(2). Exemplu: posix.mkdir('aaa') posix.symlink('aaa', 'bbb') print(posix.readlink('bbb')) rmdir(ruta) Elimina un director ruta. A se vedea de asemenea, rmdir(2). Exemplu: posix.rmdir('/tmp') setgid(grup) Stabilete identitatea grupului. grup poate fi specificat fie ca un identificator numeric, fie ca nume de grup. A se vedea de asemenea, setgid(2). Nota: Aceasta este o operaie privilegiata. setuid(utilizator) Stabilete identitatea utilizatorului.& utilizator poate fi specificat fie ca un ID numeric, fie ca nume de utilizator.& A se vedea de asemenea, setuid(2).& Nota: Aceasta este o operaie privilegiata. Exemplu: posix.setuid('nobody') sleep(secunde) Adoarme pentru o durata de secunde. A se vedea de asemenea, sleep(3). Exemplu: posix.sleep(5) stat(ruta [, selector]) Obine informaii despre fiierul stat(3) din ruta. Selectorul opional selector poate fi unul dintre urmatoarele o mode o ino o dev o nlink o uid o gid o size o atime o mtime o ctime o type. Daca este omis, se returneaza un tabel cu toate aceste campuri. Exemplu: print(posix.stat('/tmp', 'mode'))| s1 = posix.stat('f1') s2 = posix.stat('f2') if s1.ino == s2.ino and s1.dev == s2.dev then ... end ssymlink(ruta-veche, ruta-noua) Creeaza o legatura simbolica la ruta-noua catre ruta-veche. A se vedea de asemenea, symlink(2). Exemplu: posix.mkdir('aaa') posix.symlink('aaa', 'bbb') sysconf([selector]) Obine informaii sysconf(3). Argumentul opional selector poate fi unul dintre urmatoarele: o arg_max o child_max o clk_tck o ngroups_max o stream_max o tzname_max o open_max o job_control o saved_ids o version. Daca este omis, se returneaza un tabel cu toate aceste campuri. Exemplu: posix.sysconf('open_max')| times([selector]) Obine procesul i procesul-copil ateptat times(2). Argumentul opional selector poate fi unul dintre o utime o stime o cutime o cstime o elapsed Daca este omis, se returneaza un tabel cu toate aceste campuri. Exemplu: t = posix.times() print(t.utime, t.stime) ttyname([fd]) Obine numele unui terminal asociat cu descriptorul de fiier fd. Daca fd este omis, se utilizeaza 0 (cunoscut i sub numele de intrarea standard). A se vedea ttyname(3). Exemplu: if not posix.ttyname() then ... endif umask([mod]) Obine sau definete procesul umask(2). mod poate fi specificat ca numar octal sau ir de moduri similar cu posix.chmod(). Exemplu: print(posix.umask()) posix.umask(222) posix.umask('ug-w') posix.umask('rw-rw-r--') uname(format) Obine informaii uname(2) despre sistemul curent. Sunt acceptate urmatoarele directive de format: o %m: Numele tipului de hardware o %n: Numele acestui nod (maini) o %r: Nivelul actual de lansare al acestei implementari o %s: Numele acestui sistem de operare o %v: Nivelul actual al versiunii acestei implementari Exemplu: print(posix.uname('%s %r')) utime(ruta [, mtime [, ctime]]) Modifica ora ultimei accesari i modificari. mtime i ctime sunt exprimate in secunde de la epoca. A se vedea utime(2). Daca mtime sau ctime sunt omise, se utilizeaza ora curenta, similar cu touch(1). Exemplu: posix.mkdir('aaa') posix.utime('aaa', 0, 0) wait([pid]) (DEPRECIATA) Ateapta un proces-copil. Daca este specificat pid, ateapta acel proces-copil particular. A se vedea de asemenea, wait(2). Aceasta funcie este invechita i disponibila numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizai in schimb rpm.spawn() sau rpm.execute(). Exemplu: pid = posix.fork() if pid == 0 then posix.exec('/bin/ls')) elseif pid > 0 then posix.wait(pid) end setenv(nume, valoare [, inlocuirea]) Modifica sau adauga variabila de mediu nume. Parametrul opional inlocuirea este o valoare booleana care definete comportamentul atunci cand exista deja o variabila cu acelai nume. A se vedea de asemenea, setenv(3). Exemplu: posix.setenv('HOME', '/me', true) unsetenv(nume) Elimina variabila nume din mediu. A se vedea de asemenea, unsetenv(3). Exemplu: posix.unsetenv('HOME') EXTINDEREA I PERSONALIZAREA La iniializare, RPM executa un script global de iniializare Lua init.lua din directorul %getconfdir, de obicei /usr/lib/rpm/init.lua. Acesta poate fi utilizat pentru a personaliza mediul Lua rpm fara a recompila RPM. Pentru interpretul Lua incorporat, modulele incarcate cu require sunt cautate in primul rand in %{getconfdir}/lua/. %_rpmluadir este o prescurtare pentru aceasta ruta. CONSULTAI I rpm-macros(7) rpm-payloadflags(7) rpmlua(1) rpm-version(7) https://www.lua.org/ TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . RPM 6.0.1 8 ianuarie 2026 RPM-LUA(7)