RPM-LUA(7) Miscellaneous Information Manual RPM-LUA(7) NAMN rpm-lua -- RPM-inbaddad Lua-tolk SYNOPSIS %scriptlet -p %{lua:} BESKRIVNING Lua ar ett generellt programmeringssprak specifikt designat for att baddas in i andra program, och RPM inkluderar en inbaddad Lua-tolk som kan anvandas i avancerade rpm-macros(7) och transaktionsskript. Den inbaddade Lua-tolken gor diverse saker mojligt som ar svara eller omojliga med vanliga makron eller externa skalskript, sasom hjalp att eliminera beroendeslingor fran paketskript. MAKRON Komma at makron Rpm-utokningen har diverse funktioner for att arbeta med makron, men det bekvamaste sattet att komma at rpm-macroproc(7) fran RPM-Lua-miljon ar via den globala macros-tabellen. Lua gor ingen skillnad mellan tabellindex och faltnamnssyntax sa macros.apa och macros['apa'] ar likvardiga, anvand vad som passar bast for andamalet. Som i en verklig Lua-tabell returneras poster som inte finns som nil, och tilldelning kan anvandas for 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 All macros share the same global Lua execution environment. Anrop av parametriserade makron Parametriserade makron (inklusive alla inbyggda makron) kan anropas pa ett normalt Lua-satt via tabellen macros, med antingen syntaxen macros.namn() eller macros[namn](). Argument skickas via ett enda argument, som ar antingen o en enda strang, i vilket fall den expanderas och delas med vanliga makroregler o en tabell, i vilket fall tabellinnehallet anvands som bokstavliga argument som inte expanderas pa nagot satt Exempel 1: macros.med(apa') Exempel 2: macros.jobba({'ett', 'tva', 'tre'}) Returnera data By definition, anything print()'ed in Lua will end up in the macro expansion. Lua macros can also return their output, which makes programming helper macros look more natural. 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 far sina flaggor och argument som tva lokala tabeller opt och arg, dar opt innehaller bearbetade flaggvarden med flaggbokstaven som nyckel, och arg innehaller argument med numeriska index. Dessa tabeller finns alltid oavsett huruvida flaggor eller argument faktiskt skickades for att forenkla anvandningen. Exempel: %apa(a:b) %{lua: if opt.b then print('gor b') else print('eller inte') end if opt.a == 's' then print('gor 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 anvandas som tolk av RPM i transaktionsskript, inklusive utlosare och filutlosare: Exempel: %pre -p print('Hej fran Lua') Medan den arevordiga /bin/sh vanligen ar mer bekvam for paketrelaterade skriptaktiviteter har den inbaddadde Lua-tolken nagra unika fordelar for transaktionsskript: de lagger inte till nagra extra beroenden till paketet och kan pa sa satt hjalpa till att eliminera beroendeslingor. Detta kan vara en avgorande skillnad i den tidiga uppsattningen "uppstartspaket" i den initiala installationen. Speciellt ar ett inbaddat Lua-skript den enda allmant anvandbara mojligheten i %pretrans-skript under den initiala installationen av ett system. Inbaddad Lua ar ocksa mycket snabbare an att kora en potentiellt tungviktig tolk bara for att kora ett par rader i ett skalskript. Observera: skript som anvander den interna Lua:n skall inte gora antaganden om att dela kormiljo med andra skript. Argument Skriptargument ar tillgangliga fran en global tabell arg. Observera: i Lua startar index normalt pa 1 (ett) istallet for 0 (noll), och pa gott och ont foljer RPM-implementationen denna praktik. Skriptens argumentindex skiljer alltsa ett steg fran de vanliga forvantningarna baserade pa traditionella skriptargument. Argumentet som innehaller antalet installerade paketinstanser ar arg[2] och det liknande argumentet till utlosarmal ar arg[3], till skillnad mot det vanliga $1 och $2 i skalskript. Exempel: %postun -p if arg[2] == 0 then print("raderar") end Omlokaliserbara paket Skript i omlokaliserbara paket far dessutom en global tabell RPM_INSTALL_PREFIX som innehaller alla mojliga prefix i paketet. Tillagt i: 4.18.0 Slutstatus Aven om skript normalt inte skall tillatas att misslyckas kan man signalera felstatus fran skript genom att anvanda Lua:s funktion error(medd, [niva]) om man behover det. SPEC-FILER I sammanhanget av en rpm-spec(5)-filtolkning med rpmbuild(1) eller rpmspec(1) innehaller RPM-Lua-miljon foljande spec-specifika globala tabeller: patches Filnamnen pa patcharna i spec:en, i den ordning de forekom i spec:en. patch_nums Numren pa patcharna i spec:en, i den ordning de forekom i spec:en. sources Filnamnen pa kallkoden i spec:en, i den ordning de forekom i spec:en. source_nums Filnamnen pa kallkoden i spec:en, i den ordning de forekom i spec:en. Exempel: for i, p in ipairs(patches) do print(string.format("echo %d: %sn", patch_nums[i], patches[i])) end UTOKNINGAR Utover Lua:s standardbibliotek (med forbehall for Lua-versionen RPM ar lankad med) ar foljande utokningar tillgangliga i alla sammanhang dar den interna Lua:n kan anvandas. rpm-utokningar Foljande RPM-specifika funktioner ar tillgangliga: b64decode(arg) Utfor base64-avkodning av argumentet. Se aven b64encode(). Exempel: blob = 'binardata' print(blob) e = rpm.b64encode(blob) print(e) d = rpm.b64decode(e) print(d) b64encode(arg [, radlangd]) Utfor base64-kodning av argumentet. Radlangden far specificeras via ett andra argument. Se aven b64decode(). define("namn kropp") Definiera ett globalt makro namn till kropp. Se aven MAKRON. Exempel: rpm.define('apa 1') execute(sokvag [, arg1 [,]) Kor ett externt kommando. Detta ar praktiskt for att kora externa hjalpkommandon utan att vara beroende av skalet. sokvag ar kommandot att kora, foljt av ett valfritt antal argument att skicka till kommandot. For battre styrning av processkorningen och utdata, se rpm.spawn().+-& Tillagt i: 4.15.0 Exempel: rpm.execute('ls', '-l', '/') expand(arg) Utfor RPM-makroexpansion av strangen arg. Se aven MAKRON. Exempel: rpm.expand('%{_libdir}/minkat') glob(monster, [flaggor]) Returnera en tabell med sokvagar som matchar monster. Om flaggor innehaller c, returnera monster ifall inget matchar. Exempel: for i, p in ipairs(rpm.glob('*')) do print(p) end interactive() Starta en interaktiv session for testning och felsokning. Anvand rpmlua(1) istallet. Exempel: rpm --eval "%{lua: rpm.interactive()}" isdefined(namn) Testa huruvida makrot namn ar definierat och huruvida det ar parametriskt, returnerar tva booleaner. Se aven MAKRON. (Tillagt i 4.17.0) Exempel: if rpm.isdefined('_libdir') then end load(sokvag) Ladda en makrofil fran den givna sokvagen. Samma som det inbyggda makrot %{load:}. Exempel: rpm.load('mina.makron') open(sokvag, [lage[.flaggor]]) Oppna en filstrom med RPM:s IO-funktioner, med stod for transparent komprimering och dekomprimering. path is filename string, optionally followed with mode string to specify open behavior: o a: oppna for tillagg pa slutet o w: oppna for skrivning, hugg av o r: oppna for lasning (standard) o +: oppna for lasning och skrivning o x: misslyckas om filen redan finns och eventuellt foljd av rpm-payloadflags(7) for komprimering och dekomprimering. Tillagt i: 4.17.0 Exempel: f = rpm.open('nagon.txt.gz', 'r.gzdio') print(f:read()) Det returnerade rpm.fd-objektet har foljande metoder: fd:close() Stang filstrommen. Exempel: f = rpm.open('fil') f:close() fd:flush() Tom filstrommen. Exempel: f = rpm.open('fil', 'w') f:write('apa') f:flush() f:close() fd:read([langd]) Las data fran filstrommen upp till langd byte eller om det inte angetts, hela filen. Exempel: f = rpm.open('/nagon/fil') print(f:read()) fd:seek(lage, avstand) Positionera om filavstandet i strommen. lage ar en av set, cur och end, och avstandet ar relativt laget: absolut, relativt aktuellt eller relativt slutet. Inte alla strommar stodjer att soka. Returnerar filavstandet efter atgarden. Se aven lseek(3). Exempel: f = rpm.open('nyfil', 'w') f:seek('set', 555) f:close() fd:write(buf [, langd]) Skriv data i buf till filstrommen, antingen i sin helhet eller upp till langd byte om angett. Exempel: f = rpm.open('nyfil', 'w') f:write('data data') f:close() fd:reopen(lage) Oppna om en strom i ett nytt lage (se rpm.open()). Exempel: rpm.open(nagon.txt.gz') f = f:reopen('r.gzdio') print(f:read())} redirect2null(fdnr) (FORALDRAT) Omdirigera filbeskrivare fdnr till /dev/null (fore 4.16 var detta kant som posix.redirect2null()) Denna funktion ar foraldrad och bara tillganglig for RPM v4-paket for bakatkompatibilitet. anvand "rpm.spawn()" eller "rpm.execute()" istallet. 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} [, {atgarder}]) Yngla av, aven kant som kor, ett externt program. {kommando} ar en tabell som bestar av kommandot och dess argument. En frivillig andra tabell kan anvandas for att skicka diverse atgarder relaterade till kommandokorningen, for narvarande stodjs: | Atgard | Argument | Beskrivning |---------|------------------- | *stdin* | sokvag | Omdirigera standard in till sokvag | *stdout*| sokvag | Omdirigera standard ut till sokvag | *stderr*| sokvag | Omdirigera standard fel till sokvag 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) Avdefiniera ett makro. Se aven MACRON. Observera att detta endast plockar bort den senaste makrodefinitionen av det givna namnet fran stacken, d.v.s. det kan fortfarande finnas makrodefinitioner med samma namn efter atgarden undefine. Exempel: rpm.undefine('zzz') vercmp(v1, v2) Utfor jamforelse av RPM-versioner pa argumentstrangar. Returnerar -1, 0 eller 1 om v1 ar mindre an, lika med eller storre an v2. Se rpm-version(7). Observera: i RPM < 4.16 arbetade detta endast pa versionssegment, vilket inte producerar korrekta resultat pa fullstandiga EVR-strangar. Exempel: rpm.vercmp('1.2-1', '2.0-1') ver(evr), ver(e, v, r) Skapa RPM-versionsojbekt. Detta tar antingen en evr-strang som tolkas till dess komponenter, eller epok, version och utgava i separata argument (vilka kan vara antingen strangar eller tal). Objektet har tre attribut: e for epok, v for version och r for utgava, kan skrivas i sin EVR-form och stodjer inbyggd jamforelse i Lua. 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 begransad uppsattning io-atgarder. Utvidgningen posix utokar kraftigt vad som kan goras fran Lua. Foljande funktioner ar tillgangliga i namnrymden posix, d.v.s for att anropa dem anvand posix.funktion(). Denna dokumentation koncentrerar sig pa Lua:s API-konventioner, for ytterligare information om motsvarande systemanrop referera systemmanualen, t.ex. access(3) for posix.access(). access(sokvag [, lage]) Testa atkomligheten for filen/katalogen sokvag. Se access(3). Om lage utelamnas testas existensen, annars ar det en kombination av foljande tester: o r: lasbar o w: skrivbar o x: korbar o f: finns Exempel: if posix.access('/bin/rpm', 'x') then end chdir(sokvag) Andra aktuell arbetskatalog till sokvag. Se chdir(1). Exempel: posix.chdir('/tmp') chmod(sokvag, lage) Change file/directory mode. Mode can be either an octal number as for chmod(2) system call, or a string presentation similar to chmod(1). Exempel: posix.chmod('aa', 600) posix.chmod('bb', 'rw-') posix.chmod('cc', 'u+x') chown(sokvag, anvandare, grupp) Andra filen/katalogen sokvags agare/grupp. Argumenten anvandare och grupp kan antingen vara numeriska id-varden eller anvandar-/gruppnamn. Se chown(2) och chown(1). Observera: detta ar en privilegierad atgard. Exempel: posix.chown('aa', 0, 0) posix.chown('bb', 'nobody', 'nobody') ctermid() Hamta den styrande terminalens namn. Se ctermid(3). Exempel: print(posix.ctermid()) dir([sokvag]) Hamta katalogens innehall -- som readdir(3). Om sokvag utelamnas anvands den aktuella katalogen. Exempel: for i,p in pairs(posix.dir('/')) do print(p..'n') end errno() Hamta strerror(3)-meddelandet och motsvarande nummer for det aktuella errno(3). Exempel: f = '/zzz' if not posix.chmod(f, 100) then s, n = posix.errno() print(f, s) end exec(sokvag [, arg]) (FORALDRAT) Kor ett program. Detta far bara utforas efter posix.fork(). Denna funktion ar foraldrad och endast tillganglig for bakatkompatibilitet med RPM v4-paket. Anvand rpm.spawn() eller rpm.execute() istallet. files([sokvag]) Iterera over kataloginnehall. Om sokvag utelamnas anvands den aktuella katalogen. Exempel: for f in posix.files('/') do print(f..'n') end fork() (FORALDRAT) Grena av en ny process. Se fork(2). Denna funktion ar foraldrad och endast tillganglig for bakatkompatibilitet med RPM v4-paket. Anvand rpm.spawn() eller rpm.execute() istallet. Exempel: pid = posix.fork() if pid == 0 then posix.exec('/apa/bepa') elseif pid > 0 then posix.wait(pid) end getcwd() Get current directory. See getcwd(3). Exempel: if posix.getcwd() ~= '/' then endif getenv(namn) Hamta en miljovariabel. Se getenv(3). Exempel: if posix.getenv('HOME') ~= posix.getcwd() then print('inte hemma') end getgroup(grupp) Hamta group(5)-information om en grupp. grupp kan antingen vara ett numeriskt id eller ett gruppnamn. Om utelamnat anvands den aktuella gruppen. Returnerar en tabell med falten name och gid satta till gruppnamnet respektive dess id, och index fran 1 och framat specificerar gruppmedlemmar. Exempel: print(posix.getgroup('wheel').gid) getlogin() Hamta inloggningsnamnet. Se getlogin(3). Exempel: n = posix.getlogin() getpasswd([anvandare [, valjare]]) Get passwd(5) information for a user account. user may be either a numeric id or username. If omitted, current user is used. The optional selector argument may be one of: o name o uid o gid o dir o shell o gecos o passwd Om det utelamnas returneras en tabell med alla dessa falt. Exempel: pw = posix.getpasswd(posix.getlogin(), 'shell')| getprocessid([valjare]) Hamta information om den aktuella processen. Det frivilliga argumentet valjare kan vara ett av o egid: effektivt grupp-id o euid: effektivt anvandar-id o gid: grupp-id o uid: anvandar-id o pgrp: foralderns grupp-id o pid: process id o ppid: foralderns pid Om det utelamnas returneras en tabell med alla dessa falt. Exempel: if posix.getprocessid('pid') == 1 then end kill(pid [, signal]) Skicka en signal(7) till en process. signal maste vara ett numeriskt varde, t.ex. 9 for SIGKILL. Om det utelamnas anvands SIGTERM. Se aven kill(2). Exempel: posix.kill(posix.getprocessid('pid')) link(gammalsokvag, nysokvag) Skapa ett nytt namn pa newpath for en fil pa oldpath, aven kant som hardlank. Se aven link(2). Exempel: f = rpm.open('aaa', 'w') posix.link('aaa', 'bbb') mkdir(sokvag) Skapa en ny katalog pa path. Se aven mkdir(2). Exempel: posix.mkdir('/tmp') mkfifo(sokvag) Skapa en FIFO aven kant som namngivet ror pa sokvag. Se aven mkfifo(2). Exempel: posix.mkfifo('/tmp/dumplats') pathconf(sokvag [, valjare]) Hamta pathconf(3)-information for sokvag. Den frivilliga valjaren kan vara en av 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. Om det utelamnas returneras en tabell med alla dessa falt. Exempel: posix.pathconf('/', 'path_max') putenv(strang) Andra eller lagg till en miljovariabel. Se aven putenv(3). Exempel: posix.putenv('HOME=/mig') readlink(sokvag) Las vardet av den symboliska lanken pa sokvag. Se aven readlink(2). Exempel: posix.mkdir('aaa') posix.symlink('aaa', 'bbb') print(posix.readlink('bbb')) rmdir(sokvag) Ta bort katalogen sokvag. Se aven rmdir(2). Exempel: posix.rmdir('/tmp') setgid(grupp) Satt gruppidentitet. grupp kan anges antingen som ett numeriskt id eller gruppnamn. Se aven setgid(2). Observera: detta ar en privilegierad atgard. setuid(anvandare) Set user identity. user may be specified either as a numeric id or username. See also setuid(2). Observera: detta ar en privilegierad atgard. Exempel: posix.setuid('nobody') sleep(sekunder) Sov under sekunder. Se aven sleep(3). Exempel: posix.sleep(5) stat(sokvag [, valjare]) Hamta fil-stat(3)-information om en fil pa sokvag. Den frivilliga valjare kan vara en av o mode o ino o dev o nlink o uid o gid o size o atime o mtime o ctime o type. Om det utelamnas returneras en tabell med alla dessa falt. 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(gammalsokvag, nysokvag) Skapa en symbolisk lank pa nysokvag till gammalsokvag. Se aven symlink(2). Exempel: posix.mkdir('aaa') posix.symlink('aaa', 'bbb') sysconf([valjare]) Hamta sysconf(3)-information. Det frivilliga argumentet valjare kan vara en av: 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. Om det utelamnas returneras en tabell med alla dessa falt. Exempel: posix.sysconf('open_max')| times([valjare]) Hamta processens och invantade barnprocessers times(2). Det frivilliga argumentet valjare kan vara ett av o utime o stime o cutime o cstime o elapsed Om det utelamnas returneras en tabell med alla dessa falt. Exempel: t = posix.times() print(t.utime, t.stime) ttyname([fb]) Get name of a terminal associated with file descriptor fd. If fd is omitted, 0 (aka standard input) is used. See ttyname(3). Exempel: if not posix.ttyname() then endif umask([lage]) Hamta eller satt processens umask(2). lage kan anges som ett oktalt tal eller en rattighetsstrang liknande posix.chmod(). Exempel: print(posix.umask()) posix.umask(222) posix.umask('ug-w') posix.umask('rw-rw-r--') uname(format) Hamta uname(2)-information om det aktuella systemet. Foljande formatdirektiv stodjs: o %m: Namnet pa hardvarutypen o %n: Namnet pa denna nod o %r: Aktuell utgaveniva for denna implementation o %s: Namnet pa detta operativsystem o %v: Aktuell versionsniva pa denna implementation Exempel: print(posix.uname('%s %r')) utime(sokvag [, mtid [, ctid]]) Andra senaste atkomst- och andringstider. mtid och ctid uttrycks i sekunder sedan epoken. Se utime(2). Om mtid eller ctid utelamnas anvands aktuell tid, i likhet med touch(1). Exempel: posix.mkdir('aaa') posix.utime('aaa', 0, 0) wait([pid]) (FORALDRAT) Vanta pa en barnprocess. Om pid anges, vanta pa just det barnet. Se aven wait(2). Denna funktion ar foraldrad och endast tillganglig for bakatkompatibilitet med RPM v4-paket. Anvand rpm.spawn() eller rpm.execute() istallet. Exempel: pid = posix.fork() if pid == 0 then posix.exec('/bin/ls')) elseif pid > 0 then posix.wait(pid) end setenv(namn, varde [, ersatt]) Andra eller lagg till miljovariabeln namn. Det frivilliga ersatt ar en boolean vilken avgor beteendet nar en variabel med samma namn redan finns. Se aven setenv(3). Exempel: posix.setenv('HOME', '/mig', true) unsetenv(namn) Ta bort variabeln namn fran miljon. Se aven unsetenv(3). Exempel: posix.unsetenv('HOME') UTVIDGNING OCH ANPASSNING Vid initieringen kor RPM ett global Lua-initiieringsskript init.lua fran katalogen som %getconfdir expanderar till, normalt /usr/lib/rpm/init.lua. Detta kan anvandas for att anpassa rpm-Lua-miljon utan att kompilera om RPM. For den inbaddade Lua-tolken soks moduler laddade med require primart fran %{getconfdir}/lua/. %_rpmluadir ar en kortform for denna sokvag. SE AVEN rpm-macros(7) rpm-payloadflags(7) rpmlua(1) rpm-version(7) https://www.lua.org/ OVERSATTNING Den svenska oversattningen av denna manualsida skapades av Goran Uddeborg Denna oversattning ar fri dokumentation; las GNU General Public License Version 3 eller senare for upphovsrattsvillkor. Vi tar INGET ANSVAR. Om du hittar fel i oversattningen av denna manualsida, skicka ett mail till . RPM 6.0.1 8 januari 2026 RPM-LUA(7)