table of contents
| RPM-LUA(7) | Miscellaneous Information Manual | RPM-LUA(7) |
NAMN¶
rpm-lua — RPM-inbäddad Lua-tolk
SYNOPSIS¶
%scriptlet -p <lua>
%{lua:…}
BESKRIVNING¶
Lua är ett generellt programmeringsspråk specifikt designat för att bäddas in i andra program, och RPM inkluderar en inbäddad Lua-tolk som kan användas i avancerade rpm-macros(7) och transaktionsskript.
Den inbäddade Lua-tolken gör diverse saker möjligt som är svåra eller omöjliga med vanliga makron eller externa skalskript, såsom hjälp att eliminera beroendeslingor från paketskript.
MAKRON¶
Komma åt makron¶
Rpm-utökningen har diverse funktioner för att arbeta med makron, men det bekvämaste sättet att komma åt rpm-macroproc(7) från RPM-Lua-miljön är via den globala macros-tabellen.
Lua gör ingen skillnad mellan tabellindex och fältnamnssyntax så macros.apa och macros['apa'] är likvärdiga, använd vad som passar bäst för ändamålet.
Som i en verklig Lua-tabell returneras poster som inte finns som nil, och tilldelning kan användas för att definiera eller avdefiniera makron.
Exempel:
if not macros.ditt then
macros.mitt = 'mitt makro' end local v = { '_libdir', '_bindir', '_xbindir' } for _, v in ipairs(v) do
if not macros[v] then
macros[v] = 'default'
end end
Alla makron delar samma globala Lua-körmiljö.
Anrop av parametriserade makron¶
Parametriserade makron (inklusive alla inbyggda makron) kan anropas på ett normalt Lua-sätt via tabellen macros, med antingen syntaxen macros.namn() eller macros[namn]().
Argument skickas via ett enda argument, som är antingen
- en enda sträng, i vilket fall den expanderas och delas med vanliga makroregler
- en tabell, i vilket fall tabellinnehållet används som bokstavliga argument som inte expanderas på något sätt
Exempel 1:
macros.med(apa')
Exempel 2:
macros.jobba({'ett', 'två', 'tre'})
Returnera data¶
Per definition kommer allt som print():as i Lua hamna i makroexpansionen. Lua-makron kan även göra return på sin utdata, vilket gör att programmering av hjälpmakron ser mer naturliga ut.
Exempel:
%sum() %{lua:
local v = 0
for _, a in ipairs(arg) do
v = v + tonumber(a)
end
return v
}
Flaggor och argument¶
Parametriserade Lua-makron får sina flaggor och argument som två lokala tabeller opt och arg, där opt innehåller bearbetade flaggvärden med flaggbokstaven som nyckel, och arg innehåller argument med numeriska index.
Dessa tabeller finns alltid oavsett huruvida flaggor eller argument faktiskt skickades för att förenkla användningen.
Exempel:
%apa(a:b) %{lua:
if opt.b then
print('gör b')
else
print('eller inte')
end
if opt.a == 's' then
print('gör s')
end
if #arg == 0 then
print('inga arument :(')
else
for i = 1, #arg do
print(arg[i])
end
end
}
SKRIPT¶
Den interna Lua:n kan användas som tolk av RPM i transaktionsskript, inklusive utlösare och filutlösare:
Exempel:
%pre -p <lua>
print('Hej från Lua')
Medan den ärevördiga /bin/sh vanligen är mer bekväm för paketrelaterade skriptaktiviteter har den inbäddadde Lua-tolken några unika fördelar för transaktionsskript: de lägger inte till några extra beroenden till paketet och kan på så sätt hjälpa till att eliminera beroendeslingor. Detta kan vara en avgörande skillnad i den tidiga uppsättningen ”uppstartspaket” i den initiala installationen.
Speciellt är ett inbäddat Lua-skript den enda allmänt användbara möjligheten i %pretrans-skript under den initiala installationen av ett system.
Inbäddad Lua är också mycket snabbare än att köra en potentiellt tungviktig tolk bara för att köra ett par rader i ett skalskript.
Observera: skript som använder den interna Lua:n skall inte göra antaganden om att dela körmiljö med andra skript.
Argument¶
Skriptargument är tillgängliga från en global tabell arg.
Observera: i Lua startar index normalt på 1 (ett) istället för 0 (noll), och på gott och ont följer RPM-implementationen denna praktik. Skriptens argumentindex skiljer alltså ett steg från de vanliga förväntningarna baserade på traditionella skriptargument. Argumentet som innehåller antalet installerade paketinstanser är arg[2] och det liknande argumentet till utlösarmål är arg[3], till skillnad mot det vanliga $1 och $2 i skalskript.
Exempel:
%postun -p <lua> if arg[2] == 0 then
print("raderar") end
Omlokaliserbara paket¶
Skript i omlokaliserbara paket får dessutom en global tabell RPM_INSTALL_PREFIX som innehåller alla möjliga prefix i paketet.
Tillagt i: 4.18.0
Slutstatus¶
Även om skript normalt inte skall tillåtas att misslyckas kan man signalera felstatus från skript genom att använda Lua:s funktion error(medd, [nivå]) om man behöver det.
SPEC-FILER¶
I sammanhanget av en rpm-spec(5)-filtolkning med rpmbuild(1) eller rpmspec(1) innehåller RPM-Lua-miljön följande spec-specifika globala tabeller:
patches
patch_nums
sources
source_nums
Exempel:
for i, p in ipairs(patches) do
print(string.format("echo %d: %sn", patch_nums[i], patches[i])) end
UTÖKNINGAR¶
Utöver Lua:s standardbibliotek (med förbehåll för Lua-versionen RPM är länkad med) är följande utökningar tillgängliga i alla sammanhang där den interna Lua:n kan användas.
rpm-utökningar¶
Följande RPM-specifika funktioner är tillgängliga:
b64decode(arg)
Exempel:
blob = 'binärdata' print(blob) e = rpm.b64encode(blob) print(e) d = rpm.b64decode(e) print(d)
b64encode(arg [, radlängd])
define("namn kropp")
Exempel:
rpm.define('apa 1')
execute(sökväg [, arg1 [,…])
För bättre styrning av processkörningen och utdata, se rpm.spawn().±&
Tillagt i: 4.15.0
Exempel:
rpm.execute('ls', '-l', '/')
Exempel:
rpm.expand('%{_libdir}/minkat')
glob(mönster, [flaggor])
Exempel:
for i, p in ipairs(rpm.glob('*')) do
print(p)
end
interactive()
Exempel:
rpm --eval "%{lua: rpm.interactive()}"
isdefined(namn)
Exempel:
if rpm.isdefined('_libdir') then
…
end
load(sökväg)
Exempel:
rpm.load('mina.makron')
open(sökväg, [läge[.flaggor]])
sökväg är filnamnssträngen, eventuellt följd av en sträng läge som anger specifikt öppningsbeteende:
- a: öppna för tillägg på slutet
- w: öppna för skrivning, hugg av
- r: öppna för läsning (standard)
- +: öppna för läsning och skrivning
- x: misslyckas om filen redan finns
och eventuellt följd av rpm-payloadflags(7) för komprimering och dekomprimering.
Tillagt i: 4.17.0
Exempel:
f = rpm.open('någon.txt.gz', 'r.gzdio')
print(f:read())
Det returnerade rpm.fd-objektet har följande metoder:
fd:close()
Stäng filströmmen.
Exempel:
f = rpm.open('fil')
f:close()
fd:flush()
Töm filströmmen.
Exempel:
f = rpm.open('fil', 'w')
f:write('apa')
f:flush()
f:close()
fd:read([längd])
Läs data från filströmmen upp till längd byte eller om det inte angetts, hela filen.
Exempel:
f = rpm.open('/någon/fil')
print(f:read())
fd:seek(läge, avstånd)
Positionera om filavståndet i strömmen. läge är en av set, cur och end, och avståndet är relativt läget: absolut, relativt aktuellt eller relativt slutet. Inte alla strömmar stödjer att söka.
Returnerar filavståndet efter åtgärden.
Se även lseek(3).
Exempel:
f = rpm.open('nyfil', 'w')
f:seek('set', 555)
f:close()
fd:write(buf [, längd])
Skriv data i buf till filströmmen, antingen i sin helhet eller upp till längd byte om angett.
Exempel:
f = rpm.open('nyfil', 'w')
f:write('data data')
f:close()
fd:reopen(läge)
Öppna om en ström i ett nytt läge (se rpm.open()).
Exempel:
rpm.open(någon.txt.gz')
f = f:reopen('r.gzdio')
print(f:read())}
redirect2null(fdnr) (FÖRÅLDRAT)
Denna funktion är föråldrad och bara tillgänglig för RPM v4-paket för bakåtkompatibilitet. använd ”rpm.spawn()” eller ”rpm.execute()” istället.
pid = posix.fork() if pid == 0 then
posix.redirect2null(2)
assert(posix.exec('/bin/awk')) elseif pid > 0 then
posix.wait(pid) end
spawn({kommando} [, {åtgärder}])
{kommando} är en tabell som består av kommandot och dess argument. En frivillig andra tabell kan användas för att skicka diverse åtgärder relaterade till kommandokörningen, för närvarande stödjs:
| Åtgärd | Argument | Beskrivning |---------|------------------- | *stdin* | sökväg | Omdirigera standard in till sökväg | *stdout*| sökväg | Omdirigera standard ut till sökväg | *stderr*| sökväg | Omdirigera standard fel till sökväg
Returnerar kommandots slutstatus: noll om det gick bra, eller en tupel av (nil, meddelande, kod) om det misslyckades.
Tillagt i: 4.20
Exempel:
rpm.spawn({'systemctl', 'restart', 'httpd'}, {stderr='/dev/null'})
undefine(namn)
Observera att detta endast plockar bort den senaste makrodefinitionen av det givna namnet från stacken, d.v.s. det kan fortfarande finnas makrodefinitioner med samma namn efter åtgärden undefine.
Exempel:
rpm.undefine('zzz')
vercmp(v1, v2)
Observera: i RPM < 4.16 arbetade detta endast på versionssegment, vilket inte producerar korrekta resultat på fullständiga EVR-strängar.
Exempel:
rpm.vercmp('1.2-1', '2.0-1')
ver(evr), ver(e, v, r)
Tillagt i: 4.17.0
Exempel:
v1 = rpm.ver('5:1.0-2)
v2 = rpm.ver(3, '5a', 1)
if v1 < v2 then
…
end
if v1.e then
…
end
posix-utvidgningar¶
Lua:s standardibliotek erbjuder en ganska begränsad uppsättning io-åtgärder. Utvidgningen posix utökar kraftigt vad som kan göras från Lua.
Följande funktioner är tillgängliga i namnrymden posix, d.v.s för att anropa dem använd posix.funktion(). Denna dokumentation koncentrerar sig på Lua:s API-konventioner, för ytterligare information om motsvarande systemanrop referera systemmanualen, t.ex. access(3) för posix.access().
access(sökväg [, läge])
- r: läsbar
- w: skrivbar
- x: körbar
- f: finns
Exempel:
if posix.access('/bin/rpm', 'x') then
…
end
chdir(sökväg)
Exempel:
posix.chdir('/tmp')
chmod(sökväg, läge)
Exempel:
posix.chmod('aa', 600)
posix.chmod('bb', 'rw-')
posix.chmod('cc', 'u+x')
chown(sökväg, användare, grupp)
Observera: detta är en privilegierad åtgärd.
Exempel:
posix.chown('aa', 0, 0)
posix.chown('bb', 'nobody', 'nobody')
ctermid()
dir([sökväg])
Exempel:
for i,p in pairs(posix.dir('/')) do
print(p..'n')
end
errno()
Exempel:
f = '/zzz' if not posix.chmod(f, 100) then
s, n = posix.errno()
print(f, s) end
exec(sökväg [, arg…]) (FÖRÅLDRAT)
Denna funktion är föråldrad och endast tillgänglig för bakåtkompatibilitet med RPM v4-paket. Använd rpm.spawn() eller rpm.execute() istället.
files([sökväg])
Exempel:
for f in posix.files('/') do
print(f..'n')
end
fork() (FÖRÅLDRAT)
Denna funktion är föråldrad och endast tillgänglig för bakåtkompatibilitet med RPM v4-paket. Använd rpm.spawn() eller rpm.execute() istället.
Exempel:
pid = posix.fork() if pid == 0 then
posix.exec('/apa/bepa') elseif pid > 0 then
posix.wait(pid) end
getcwd()
getenv(namn)
Exempel:
if posix.getenv('HOME') ~= posix.getcwd() then
print('inte hemma')
end
getgroup(grupp)
Exempel:
print(posix.getgroup('wheel').gid)
getlogin()
getpasswd([användare [, väljare]])
- name
- uid
- gid
- dir
- shell
- gecos
- passwd
Om det utelämnas returneras en tabell med alla dessa fält.
Exempel:
pw = posix.getpasswd(posix.getlogin(), 'shell')|
getprocessid([väljare])
- egid: effektivt grupp-id
- euid: effektivt användar-id
- gid: grupp-id
- uid: användar-id
- pgrp: förälderns grupp-id
- pid: processens id
- ppid: förälderns pid
Om det utelämnas returneras en tabell med alla dessa fält.
Exempel:
if posix.getprocessid('pid') == 1 then
…
end
kill(pid [, signal])
Exempel:
posix.kill(posix.getprocessid('pid'))
link(gammalsökväg, nysökväg)
Exempel:
f = rpm.open('aaa', 'w')
posix.link('aaa', 'bbb')
mkdir(sökväg)
mkfifo(sökväg)
Exempel:
posix.mkfifo('/tmp/dumplats')
pathconf(sökväg [, väljare])
- link_max
- max_canon
- max_input
- name_max
- path_max
- pipe_buf
- chown_restricted
- no_trunc
- vdisable.
Om det utelämnas returneras en tabell med alla dessa fält.
Exempel:
posix.pathconf('/', 'path_max')
putenv(sträng)
readlink(sökväg)
Exempel:
posix.mkdir('aaa')
posix.symlink('aaa', 'bbb')
print(posix.readlink('bbb'))
rmdir(sökväg)
setgid(grupp)
Observera: detta är en privilegierad åtgärd.
setuid(användare)
Observera: detta är en privilegierad åtgärd.
Exempel:
posix.setuid('nobody')
sleep(sekunder)
stat(sökväg [, väljare])
- mode
- ino
- dev
- nlink
- uid
- gid
- size
- atime
- mtime
- ctime
- type.
Om det utelämnas returneras en tabell med alla dessa fält.
Exempel:
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
symlink(gammalsökväg, nysökväg)
Exempel:
posix.mkdir('aaa')
posix.symlink('aaa', 'bbb')
sysconf([väljare])
- arg_max
- child_max
- clk_tck
- ngroups_max
- stream_max
- tzname_max
- open_max
- job_control
- saved_ids
- version.
Om det utelämnas returneras en tabell med alla dessa fält.
Exempel:
posix.sysconf('open_max')|
times([väljare])
- utime
- stime
- cutime
- cstime
- elapsed
Om det utelämnas returneras en tabell med alla dessa fält.
Exempel:
t = posix.times() print(t.utime, t.stime)
ttyname([fb])
Exempel:
if not posix.ttyname() then
… endif
umask([läge])
Exempel:
print(posix.umask())
posix.umask(222)
posix.umask('ug-w')
posix.umask('rw-rw-r--')
uname(format)
- %m: Namnet på hårdvarutypen
- %n: Namnet på denna nod
- %r: Aktuell utgåvenivå för denna implementation
- %s: Namnet på detta operativsystem
- %v: Aktuell versionsnivå på denna implementation
Exempel:
print(posix.uname('%s %r'))
utime(sökväg [, mtid [, ctid]])
Om mtid eller ctid utelämnas används aktuell tid, i likhet med touch(1).
Exempel:
posix.mkdir('aaa')
posix.utime('aaa', 0, 0)
wait([pid]) (FÖRÅLDRAT)
Denna funktion är föråldrad och endast tillgänglig för bakåtkompatibilitet med RPM v4-paket. Använd rpm.spawn() eller rpm.execute() istället.
Exempel:
pid = posix.fork() if pid == 0 then
posix.exec('/bin/ls')) elseif pid > 0 then
posix.wait(pid) end
setenv(namn, värde [, ersätt])
Exempel:
posix.setenv('HOME', '/mig', true)
unsetenv(namn)
UTVIDGNING OCH ANPASSNING¶
Vid initieringen kör RPM ett global Lua-initiieringsskript init.lua från katalogen som %getconfdir expanderar till, normalt /usr/lib/rpm/init.lua. Detta kan användas för att anpassa rpm-Lua-miljön utan att kompilera om RPM.
För den inbäddade Lua-tolken söks moduler laddade med require primärt från %{getconfdir}/lua/. %_rpmluadir är en kortform för denna sökväg.
SE ÄVEN¶
ÖVERSÄTTNING¶
Den svenska översättningen av denna manualsida skapades av Göran Uddeborg <goeran@uddeborg.se>
Denna översättning är fri dokumentation; läs GNU General Public License Version 3 eller senare för upphovsrättsvillkor. Vi tar INGET ANSVAR.
Om du hittar fel i översättningen av denna manualsida, skicka ett mail till Tp-sv@listor.tp-sv.se.
| 7 november 2025 | RPM 6.0.0 |