| RPM-LUA(7) | Miscellaneous Information Manual | RPM-LUA(7) |
NUME¶
rpm-lua - interpretul intern Lua al RPM
SINOPSIS¶
%scriptlet -p <lua>
%{lua:...}
DESCRIERE¶
Lua este un limbaj de programare cu scop general, conceput special pentru a fi încorporat în alte programe, iar RPM include un interpret Lua încorporat pentru utilizare în rpm-macros(7) avansate și scripturi de tranzacții.
Interpretorul Lua încorporat face posibile diverse lucruri care sunt dificile sau imposibile cu macrocomenzi simple sau scripturi shell externe, cum ar fi eliminarea buclelor de dependență din scriptlet-urile pachetelor.
MACROCOMENZI¶
Accesarea macrocomenzilor¶
Extensia rpm are diverse funcții pentru gestionarea macrocomenzilor, dar cea mai convenabilă modalitate de a accesa rpm-macroproc(7) din mediul RPM Lua este prin intermediul tabelului global macros.
Lua nu face diferență între sintaxele indexului tabelului și ale numelui câmpului, astfel încât macros.foo și macros['foo'] sunt echivalente. Utilizați cea care se potrivește mai bine scopului.
Ca orice tabel Lua real, elementele inexistente sunt returnate ca nil, iar atribuirea poate fi utilizată pentru a defini sau a anula definiția 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 împărtășesc același mediu global de execuție Lua.
Apelarea macrocomenzilor parametrice¶
Macrocomenzile parametrice (inclusiv toate macrocomenzile încorporate) pot fi apelate într-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
- un singur șir, caz în care este extins și împărțit cu regulile native ale macrocomenzii
- fie un tabel, caz în care conținutul tabelului este utilizat ca argumente literale care nu sunt extinse în niciun fel.
Exemplul 1:
macros.with('foo')
Exemplul 2:
macros.dostuff({'one', 'two', 'three'})
Returnarea datelor¶
Prin definiție, orice print()'ed în Lua va ajunge în expansiunea macrocomenzii. Macrocomenzile Lua pot, de asemenea, return (să returneze) rezultatul, ceea ce face ca macrocomenzile de ajutor pentru programare să pară mai naturale.
Exemplu:
%sum() %{lua:
local v = 0
for _, a in ipairs(arg) do
v = v + tonumber(a)
end
return v
}
Opțiuni și argumente¶
Macrocomenzile parametrice Lua primesc opțiunile și argumentele lor sub forma a două tabele locale opt și arg, unde opt conține valorile opțiunilor procesate, indexate după caracterul opțiunii, iar arg conține argumentele indexate numeric.
Aceste tabele sunt întotdeauna prezente, indiferent dacă opțiunile sau argumentele au fost efectiv pasate pentru a simplifica utilizarea.
Exemplu:
%foo(a:b) %{lua:
if opt.b then
print('fă b')
else
print('sau nu')
end
if opt.a == 's' then
print('fă s')
end
if #arg == 0 then
print('fără 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 tranzacții RPM, inclusiv declanșatoarele și declanșatoarele de fișiere:
Exemplu:
%pre -p <lua>
print('Salutare din Lua')
Deși venerabilul /bin/sh este de obicei mai convenabil pentru activitățile de scripturi legate de împachetare, interpretul Lua încorporat are câteva avantaje unice pentru scriptlet-urile de tranzacții: acestea nu adaugă dependențe suplimentare pachetelor și astfel pot ajuta la eliminarea buclelor de dependență. Aceasta poate fi o diferență crucială în setul de pachete „bootstrap” inițial dintr-o instalare inițială.
În special, un script Lua încorporat este singura opțiune general utilizabilă în scriplet-urile %pretrans în timpul instalării inițiale a unui sistem.
Lua încorporat este, de asemenea, mult mai rapid decât executarea unui interpret potențial greoi doar pentru a rula câteva linii de script shell.
Notă: scriptlet-urile care utilizează Lua intern nu trebuie să facă presupuneri cu privire la partajarea mediului de execuție cu alte scriptlet-uri.
Argumente¶
Argumentele scriptlet-ului sunt accesibile dintr-un tabel de arg global.
Notă: în Lua, indexurile încep de obicei de la 1 (unu) în loc de 0 (zero) și, în bine sau în rău, implementarea RPM urmează această practică. Astfel, indexurile arg ale scriptlet-ului sunt cu unu mai mici decât se așteaptă în mod normal, pe baza argumentelor tradiționale ale scriptlet-ului. Argumentul care conține numărul de instanțe ale pachetului instalat este arg[2], iar argumentul similar pentru țintele declanșatoare este arg[3], față de $1 și $2 tradiționale din scripturile shell.
Exemplu:
%postun -p <lua> if arg[2] == 0 then
print("erasing") end
Pachete realocabile¶
Scriptlet-urile pachetelor realocabile conțin în plus un tabel global RPM_INSTALL_PREFIX care conține toate prefixele posibile ale pachetului.
Adăugat: 4.18.0
Starea de ieșire¶
Deși scriptlet-urile nu ar trebui să poată eșua în mod normal, puteți semnaliza starea de eșec a scriptlet-ului utilizând funcția Lua error(mesaj, [nivel]) dacă este necesar.
FIȘIERELE DE SPECIFICAȚII¶
În contextul unei analize a fișierului rpm-spec(5) cu rpmbuild(1) sau rpmspec(1), mediul RPM Lua conține următoarele tabele globale specifice specificațiilor:
patches
patch_nums
sources
source_nums
Exemplu:
for i, p in ipairs(patches) do
print(string.format("echo %d: %sn", patch_nums[i], patches[i])) end
EXTENSII¶
În plus față de bibliotecile standard Lua (în funcție de versiunea Lua la care este legat RPM), următoarele extensii sunt disponibile în interpretul intern Lua al RPM. Acestea pot fi utilizate în toate contextele în care poate fi utilizat Lua intern.
extensie rpm¶
Sunt disponibile următoarele funcții specifice RPM:
b64decode(argument)
Exemplu:
blob = 'binary data' print(blob) e = rpm.b64encode(blob) print(e) d = rpm.b64decode(e) print(d)
b64encode(argument [, lungime-linie])
define("nume corp")
Exemplu:
rpm.define('foo 1')
execute(rută [, argument1 [,...])
Pentru un control mai bun asupra execuției procesului și a rezultatului, consultați rpm.spawn().
Adăugată: 4.15.0
Exemplu:
rpm.execute('ls', '-l', '/')
Exemplu:
rpm.expand('%{_libdir}/mydir')
glob(model, [fanioane])
Exemplu:
for i, p in ipairs(rpm.glob('*')) do
print(p)
end
interactive()
Exemplu:
rpm --eval "%{lua: rpm.interactive()}"
isdefined(nume)
Exemplu:
if rpm.isdefined('_libdir') then
...
end
load(rută)
Exemplu:
rpm.load('my.macros')
open(rută, [mod[.fanioane]])
rută este șirul numelui fișierului, urmat opțional de șirul mod pentru a specifica comportamentul de deschidere:
- a: deschide pentru adăugare
- w: deschide pentru scriere, trunchiere
- r: deschide pentru citire (implicit)
- +: deschide pentru citire și scriere
- x: eșuează dacă fișierul există
și, opțional, urmat de rpm-payloadflags(7) pentru comprimare și decomprimare.
Adăugată: 4.17.0
Exemplu:
f = rpm.open('some.txt.gz', 'r.gzdio')
print(f:read())
Obiectul rpm.fd returnat are următoarele metode:
fd:close()
Închide fluxul fișierului.
Exemplu:
f = rpm.open('file')
f:close()
fd:flush()
Golește fluxul fișierului.
Exemplu:
f = rpm.open('file', 'w')
f:write('foo')
f:flush()
f:close()
fd:read([lungime])
Citește datele din fluxul de fișiere până la lungime octeți sau, dacă nu este specificată, întregul fișier.
Exemplu:
f = rpm.open('/vreun/fișier')
print(f:read())
fd:seek(mod, poziție)
Repoziționează poziția fișierului în flux.& mod este unul dintre set, cur și end, iar poziția este relativă la mod: absolută, relativă la curent sau relativă la sfârșit.& Nu toate fluxurile acceptă căutarea.&
Returnează decalajul fișierului după operație.
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 în fluxul de fișiere, fie în întregime, fie până la lungime octeți, dacă este specificată.
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) (OBSOLETĂ)
Această funcție este învechită și disponibilă numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizați în 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} [, {acțiuni}])
{comanda} este un tabel format din comandă și argumentele sale. Un al doilea tabel opțional poate fi utilizat pentru a transmite diverse acțiuni legate de executarea comenzii. În prezent, sunt acceptate următoarele:
| Acțiune | Argument(e) | Descriere |----------|------------------------- | *stdin* | rută | Redirecționează intrarea standard către rută | *stdout* | rută | Redirecționează ieșirea standard către rută | *stderr* | rută | Redirecționează ieșirea de eroare standard către rută
Returnează starea de ieșire a comenzii: zero în caz de succes sau un tuplet de (nil, mesaj, cod) în caz de eșec.
Adăugată: 4.20
Exemplu:
rpm.spawn({'systemctl', 'restart', 'httpd'}, {stderr='/dev/null'})
undefine(nume)
Rețineți că aceasta afișează doar cea mai recentă definiție a macrocomenzii cu numele dat din stivă, adică pot exista încă definiții ale macrocomenzii cu același nume după o operație de anulare a definiției.
Exemplu:
rpm.undefine('zzz')
vercmp(v1, v2)
Notă: în RPM < 4.16, aceasta funcționa 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)
Adăugată: 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 oferă un set destul de limitat de operații de In/Ieș. Extensia posix îmbunătățește considerabil posibilitățile oferite de Lua.
Următoarele funcții sunt disponibile în spațiul de nume posix, adică pentru a le apela utilizați posix.funcția(). Această documentație se concentrează pe convențiile API Lua. Pentru informații suplimentare despre apelurile de sistem corespunzătoare, consultați manualul de sistem, de exemplu access(3) pentru posix.access().
access(rută [, mod])
- r: poate fi citit
- w: poate fi scis
- x: este executabil
- f: există
Exemplu:
if posix.access('/bin/rpm', 'x') then
...
end
chdir(rută)
Exemplu:
posix.chdir('/tmp')
chmod(rută, mod)
Exemplu:
posix.chmod('aa', 600)
posix.chmod('bb', 'rw-')
posix.chmod('cc', 'u+x')
chown(rută, utilizator, grup)
Notă: Aceasta este o operație privilegiată.
Exemplu:
posix.chown('aa', 0, 0)
posix.chown('bb', 'nobody', 'nobody')
ctermid()
dir([rută])
Exemplu:
for i,p in pairs(posix.dir('/')) do
print(p..'n')
end
errno()
Exemplu:
f = '/zzz' if not posix.chmod(f, 100) then
s, n = posix.errno()
print(f, s) end
exec(rută [, argumete...]) (OBSOLETĂ)
Această funcție este învechită și disponibilă numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizați în schimb rpm.spawn() sau rpm.execute().
files([rută])
Exemplu:
for f in posix.files('/') do
print(f..'n')
end
fork() (OBSOLETĂ)
Această funcție este învechită și disponibilă numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizați în 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()
getenv(nume)
Exemplu:
if posix.getenv('HOME') ~= posix.getcwd() then
print('not at home')
end
getgroup(group)
Exemplu:
print(posix.getgroup('wheel').gid)
getlogin()
getpasswd([utilizator [, selector]])
- name
- uid
- gid
- dir
- shell
- gecos
- passwd
Dacă este omis, se returnează un tabel cu toate aceste câmpuri.
Exemplu:
pw = posix.getpasswd(posix.getlogin(), 'shell')|
getprocessid([selector])
- egid: ID-ul grupului efectiv
- euid: ID-ul utilizatorului efectiv
- gid: ID-ul grupului
- uid: ID-ul utilizatorului
- pgrp: id-ul grupului părinte
- pid: ID-ul utilizatorului părinte
- ppid: pid-ul părinte
Dacă este omis, se returnează un tabel cu toate aceste câmpuri.
Exemplu:
if posix.getprocessid('pid') == 1 then
...
end
kill(pid [, semnal])
Exemplu:
posix.kill(posix.getprocessid('pid'))
link(ruta-veche, ruta-nouă)
Exemplu:
f = rpm.open('aaa', 'w')
posix.link('aaa', 'bbb')
mkdir(rută)
mkfifo(rută)
Exemplu:
posix.mkfifo('/tmp/loc-greșit')
pathconf(rută [, selector])
- link_max
- max_canon
- max_input
- name_max
- path_max
- pipe_buf
- chown_restricted
- no_trunc
- vdisable.
Dacă este omis, se returnează un tabel cu toate aceste câmpuri.
Exemplu:
posix.pathconf('/', 'path_max')
putenv(șir)
Exemplu:
posix.putenv('HOME=/me')
readlink(rută)
Exemplu:
posix.mkdir('aaa')
posix.symlink('aaa', 'bbb')
print(posix.readlink('bbb'))
rmdir(rută)
setgid(grup)
Notă: Aceasta este o operație privilegiată.
setuid(utilizator)
Notă: Aceasta este o operație privilegiată.
Exemplu:
posix.setuid('nobody')
sleep(secunde)
stat(rută [, selector])
- mode
- ino
- dev
- nlink
- uid
- gid
- size
- atime
- mtime
- ctime
- type.
Dacă este omis, se returnează un tabel cu toate aceste câmpuri.
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-nouă)
Exemplu:
posix.mkdir('aaa')
posix.symlink('aaa', 'bbb')
sysconf([selector])
- arg_max
- child_max
- clk_tck
- ngroups_max
- stream_max
- tzname_max
- open_max
- job_control
- saved_ids
- version.
Dacă este omis, se returnează un tabel cu toate aceste câmpuri.
Exemplu:
posix.sysconf('open_max')|
times([selector])
- utime
- stime
- cutime
- cstime
- elapsed
Dacă este omis, se returnează un tabel cu toate aceste câmpuri.
Exemplu:
t = posix.times() print(t.utime, t.stime)
ttyname([fd])
Exemplu:
if not posix.ttyname() then
... endif
umask([mod])
Exemplu:
print(posix.umask())
posix.umask(222)
posix.umask('ug-w')
posix.umask('rw-rw-r--')
uname(format)
- %m: Numele tipului de hardware
- %n: Numele acestui nod (mașini)
- %r: Nivelul actual de lansare al acestei implementări
- %s: Numele acestui sistem de operare
- %v: Nivelul actual al versiunii acestei implementări
Exemplu:
print(posix.uname('%s %r'))
utime(rută [, mtime [, ctime]])
Dacă mtime sau ctime sunt omise, se utilizează ora curentă, similar cu touch(1).
Exemplu:
posix.mkdir('aaa')
posix.utime('aaa', 0, 0)
wait([pid]) (DEPRECIATĂ)
Această funcție este învechită și disponibilă numai pentru pachetele RPM v4, din motive de compatibilitate cu versiunile anterioare. Utilizați în 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 [, înlocuirea])
Exemplu:
posix.setenv('HOME', '/me', true)
unsetenv(nume)
Exemplu:
posix.unsetenv('HOME')
EXTINDEREA ȘI PERSONALIZAREA¶
La inițializare, RPM execută un script global de inițializare Lua init.lua din directorul %getconfdir, de obicei /usr/lib/rpm/init.lua. Acesta poate fi utilizat pentru a personaliza mediul Lua rpm fără a recompila RPM.
Pentru interpretul Lua încorporat, modulele încărcate cu require sunt căutate în primul rând în %{getconfdir}/lua/. %_rpmluadir este o prescurtare pentru această rută.
CONSULTAȚI ȘI¶
TRADUCERE¶
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.
| 7 noiembrie 2025 | RPM 6.0.0 |