table of contents
| RPM-LUA(7) | Miscellaneous Information Manual | RPM-LUA(7) |
الاسم¶
rpm-lua - مفسر Lua المضمن في RPM
موجز¶
%scriptlet -p <lua>
%{lua:...}
الوصف¶
Lua هي لغة برمجة عامة الغرض صُممت خصيصًا لتُضمن في البرامج الأخرى، ويضم RPM مفسر Lua مضمنًا للاستخدام في rpm-macros(7) المتقدمة وبريمجات المعاملات.
يجعل مفسر Lua المضمن أشياءً متنوعة ممكنة كانت صعبة أو مستحيلة باستخدام وحدات الماكرو المجردة أو سكريبتات الصدفة الخارجية، مثل المساعدة في القضاء على حلقات الاعتمادية في بريمجات الحزم.
وحدات الماكرو¶
الوصول إلى وحدات الماكرو¶
يتضمن امتداد rpm وظائف متنوعة للتعامل مع وحدات الماكرو، ولكن الطريقة الأكثر ملاءمة للوصول إلى rpm-macroproc(7) من بيئة Lua في RPM هي عبر جدول macros العام.
لا تفرق Lua بين صيغ فهرس الجدول واسم الحقل، لذا فإن macros.foo و macros['foo'] متكافئان، استخدم ما يناسب الغرض بشكل أفضل.
مثل أي جدول Lua حقيقي، تٌعاد العناصر غير الموجودة كقيمة nil، ويمكن استخدام التعيين لتعريف أو إلغاء تعريف وحدات الماكرو.
مثال:
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
تتشارك جميع وحدات الماكرو بيئة تنفيذ Lua العامة نفسها.
استدعاء وحدات الماكرو الوسيطية¶
يمكن استدعاء وحدات الماكرو الوسيطية (بما في ذلك جميع وحدات الماكرو المدمجة) بطريقة Lua أصلية عبر جدول macros، باستخدام صيغة macros.الاسم() أو macros[الاسم]().
تُمرر المعطيات عبر معطى واحد، والذي يكون إما
- سلسلة نصية واحدة، وفي هذه الحالة تُوسّع وتُجزّأ باستخدام القواعد الأصلية للماكرو
- جدولاً، وفي هذه الحالة تُستخدم محتويات الجدول كمعطيات حرفية لا تُوسّع بأي شكل من الأشكال
مثال 1:
macros.with('foo')
مثال 2:
macros.dostuff({'one', 'two', 'three'})
إرجاع البيانات¶
حسب التعريف، فإن أي شيء يُطبع عبر print() في Lua سينتهي به المطاف في توسعة الماكرو. يمكن لوحدات ماكرو Lua أيضًا أن تستخدم return لإرجاع مخرجاتها، مما يجعل برمجة وحدات الماكرو المساعدة تبدو أكثر طبيعية.
مثال:
%sum() %{lua:
local v = 0
for _, a in ipairs(arg) do
v = v + tonumber(a)
end
return v
}
الخيارات والمعطيات¶
تستقبل وحدات ماكرو Lua الوسيطية خياراتها ومعطياتها في جدولين محليين هما opt و arg، حيث يحتوي opt على قيم الخيارات المعالجة مفهرسة بحرف الخيار، ويحتوي arg على معطيات مفهرسة رقميًا.
يتواجد هذان الجدولان دائمًا بغض النظر عما إذا كانت الخيارات أو المعطيات قد مُررت بالفعل لتبسيط الاستخدام.
مثال:
%foo(a:b) %{lua:
if opt.b then
print('do b')
else
print('or not')
end
if opt.a == 's' then
print('do s')
end
if #arg == 0 then
print('no arguments :(')
else
for i = 1, #arg do
print(arg[i])
end
end
}
البريمجات¶
يمكن استخدام Lua الداخلية كمفسر لأي من بريمجات معاملات RPM، بما في ذلك المشغلات ومشغلات الملفات:
مثال:
%pre -p <lua>
print('أهلاً من Lua')
بينما تُعد /bin/sh العريقة عادةً أكثر ملاءمة لأنشطة السكريبت المتعلقة بالتحزيم، فإن مفسر Lua المضمن له ميزات فريدة لبريمجات المعاملات: فهي لا تضيف أي اعتماديات إضافية للحزم، وبالتالي يمكن أن تساعد في القضاء على حلقات الاعتمادية. يمكن أن يكون هذا فرقًا حاسمًا في مجموعة حزم "التمهيد" المبكرة في التثبيت الأولي.
على وجه الخصوص، يُعد سكريبت Lua المضمن هو الخيار الوحيد القابل للاستخدام بشكل عام في بريمجات %pretrans أثناء التثبيت الأولي للنظام.
كما أن Lua المضمنة أسرع بكثير من تنفيذ مفسر قد يكون ثقيلاً لمجرد تشغيل سطرين من سكريبت صدفة.
ملاحظة: يجب ألا تضع البريمجات التي تستخدم Lua الداخلية افتراضات حول مشاركة بيئة التنفيذ مع بريمجات أخرى.
المعطيات¶
يمكن الوصول إلى معطيات البريمجات من جدول arg عام.
ملاحظة: في Lua، تبدأ الفهارس عادةً من 1 (واحد) بدلاً من 0 (صفر)، وللأفضل أو للأسوأ، يتبع تطبيق RPM هذه الممارسة. وبالتالي فإن فهارس معطيات البريمجات تختلف بواحد عن التوقعات العامة بناءً على معطيات البريمجات التقليدية. المعطى الذي يحتوي على عدد نسخ الحزم المثبتة هو arg[2] والمعطى المماثل لأهداف المشغلات هو arg[3]، مقارنة بـ $1 و $2 التقليديين في سكريبتات الصدفة.
مثال:
%postun -p <lua> if arg[2] == 0 then
print("erasing") end
الحزم القابلة للنقل¶
تحمل بريمجات الحزم القابلة للنقل بالإضافة إلى ذلك جدول RPM_INSTALL_PREFIX عاماً يحتوي على جميع البوادئ الممكنة للحزمة.
أُضيف: 4.18.0
حالة الخروج¶
بينما لا ينبغي السماح للبريمجات بالفشل بشكل طبيعي، يمكنك الإشارة إلى حالة فشل البريمج باستخدام دالة error(الرسالة، [المستوى]) في Lua إذا احتجت لذلك.
ملفات SPEC¶
في سياق تحليل ملف rpm-spec(5) باستخدام rpmbuild(1) أو rpmspec(1)، تحتوي بيئة Lua في RPM على الجداول العامة التالية الخاصة بملف spec:
patches
patch_nums
sources
source_nums
مثال:
for i, p in ipairs(patches) do
print(string.format("echo %d: %sn", patch_nums[i], patches[i])) end
الامتدادات¶
بالإضافة إلى مكتبات Lua القياسية (رهناً بإصدار Lua الذي رُبط به RPM)، تتوفر الامتدادات التالية في مفسر Lua الداخلي لـ RPM. يمكن استخدامها في جميع السياقات التي يمكن استخدام Lua الداخلية فيها.
امتداد rpm¶
تتوفر الدوال التالية الخاصة بـ RPM:
b64decode(المعطى)
مثال:
blob = 'binary data' print(blob) e = rpm.b64encode(blob) print(e) d = rpm.b64decode(e) print(d)
b64encode(المعطى [، طول_السطر])
define("الاسم المتن")
مثال:
rpm.define('foo 1')
execute(المسار [، معطى1 [،...])
لتحكم أفضل في تنفيذ العملية والمخرجات، انظر rpm.spawn().
أُضيف: 4.15.0
مثال:
rpm.execute('ls', '-l', '/')
مثال:
rpm.expand('%{_libdir}/mydir')
glob(النمط، [الأعلام])
مثال:
for i, p in ipairs(rpm.glob('*')) do
print(p)
end
interactive()
مثال:
rpm --eval "%{lua: rpm.interactive()}"
isdefined(الاسم)
مثال:
if rpm.isdefined('_libdir') then
...
end
load(المسار)
مثال:
rpm.load('my.macros')
open(المسار، [الوضع[.الأعلام]])
المسار هو سلسلة اسم الملف، متبوعة اختيارياً بسلسلة الوضع لتحديد سلوك الفتح:
- a: الفتح للإلحاق
- w: الفتح للكتابة، مع القطع
- r: الفتح للقراءة (مبدئي)
- +: الفتح للقراءة والكتابة
- x: الإخفاق في حال وجود الملف
ويُتبع اختيارياً بـ rpm-payloadflags(7) للضغط وفك الضغط.
أُضيف: 4.17.0
مثال:
f = rpm.open('some.txt.gz', 'r.gzdio')
print(f:read())
كائن rpm.fd المُعاد يملك الدوال (methods) التالية:
fd:close()
غلق دفق الملف.
مثال:
f = rpm.open('file')
f:close()
fd:flush()
إفراغ دفق الملف.
مثال:
f = rpm.open('file', 'w')
f:write('foo')
f:flush()
f:close()
fd:read([len])
قراءة البيانات من دفق الملف بما يصل إلى len من البايتات، أو قراءة الملف كاملاً إذا لم يُحدد الطول.
مثال:
f = rpm.open('/some/file')
print(f:read())
fd:seek(mode, offset)
إعادة تعيين إزاحة الملف للدفق. mode هو أحد الخيارات set أو cur أو end، والإزاحة (offset) تكون مرتبطة بالوضع المختاد: مطلقة، أو نسبية للوضع الحالي، أو نسبية للنهاية. لا تدعم كل الدفق عمليات الإزاحة.
يُعيد إزاحة الملف بعد العملية.
انظر أيضاً lseek(3).
مثال:
f = rpm.open('newfile', 'w')
f:seek('set', 555)
f:close()
fd:write(buf [, len])
كتابة البيانات الموجودة في buf إلى دفق الملف، إما بالكامل أو بما يصل إلى len من البايتات إذا حُدد الطول.
مثال:
f = rpm.open('newfile', 'w')
f:write('data data')
f:close()
fd:reopen(mode)
إعادة فتح دفق بوضع جديد (انظر rpm.open()).
مثال:
rpm.open('some.txt.gz')
f = f:reopen('r.gzdio')
print(f:read())}
redirect2null(fdno) (مهجور)
هذه الدالة مهجورة ومتاحة فقط لحزم RPM v4 من أجل التوافقية مع الإصدارات السابقة. استخدم `rpm.spawn()` أو `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({command} [, {actions}])
{command} هو جدول يتكون من الأمر ووسائطه. يمكن استخدام جدول ثانٍ اختياري لتمرير إجراءات متنوعة متعلقة بتنفيذ الأمر، والإجراءات المدعومة حالياً هي:
| الإجراء | الوسيط (الوسائط) | الوصف |---------|---------------------- | *stdin* | المسار | إعادة توجيه المدخل القياسي إلى المسار | *stdout*| المسار | إعادة توجيه المخرج القياسي إلى المسار | *stderr*| المسار | إعادة توجيه الخطأ القياسي إلى المسار
يُعيد حالة خروج الأمر: صفر عند النجاح، أو صف (nil, message, code) عند الإخفاق.
أُضيف: 4.20
مثال:
rpm.spawn({'systemctl', 'restart', 'httpd'}, {stderr='/dev/null'})
undefine(name)
لاحظ أن هذا يخرج فقط أحدث تعريف للماكرو بالاسم المعطى من المكدس، أي أنه قد تظل هناك تعريفات ماكرو بنفس الاسم بعد عملية إلغاء التعريف.
مثال:
rpm.undefine('zzz')
vercmp(v1, v2)
ملاحظة: في RPM الأقدم من 4.16 كانت هذه العملية تعمل على أجزاء الإصدار فقط، وهو ما لا يعطي نتائج صحيحة على سلاسل EVR الكاملة.
مثال:
rpm.vercmp('1.2-1', '2.0-1')
ver(evr), ver(e, v, r)
أُضيف: 4.17.0
مثال:
v1 = rpm.ver('5:1.0-2)
v2 = rpm.ver(3, '5a', 1)
if v1 < v2 then
...
end
if v1.e then
...
end
امتداد posix¶
تقدم مكتبة Lua القياسية مجموعة محدودة نوعاً ما من عمليات الإدخال والإخراج (io). يعزز امتداد posix بشكل كبير ما يمكن القيام به من Lua.
الدوال التالية متاحة في مساحة أسماء posix، أي لاستدعائها استخدم posix.function(). تركز هذه الوثائق على اتفاقيات واجهة برمجة تطبيقات Lua، وللمزيد من المعلومات حول استدعاءات النظام المقابلة ارجع إلى دليل النظام، مثل access(3) لـ posix.access().
access(path [, mode])
- r: قابل للقراءة
- w: قابل للكتابة
- x: قابل للتنفيذ
- f: موجود
مثال:
if posix.access('/bin/rpm', 'x') then
...
end
chdir(path)
مثال:
posix.chdir('/tmp')
chmod(path, mode)
مثال:
posix.chmod('aa', 600)
posix.chmod('bb', 'rw-')
posix.chmod('cc', 'u+x')
chown(path, user, group)
ملاحظة: هذه عملية ذات امتيازات.
مثال:
posix.chown('aa', 0, 0)
posix.chown('bb', 'nobody', 'nobody')
ctermid()
dir([path])
مثال:
for i,p in pairs(posix.dir('/')) do
print(p..'n')
end
errno()
مثال:
f = '/zzz' if not posix.chmod(f, 100) then
s, n = posix.errno()
print(f, s) end
exec(path [, args...]) (مهجور)
هذه الدالة مهجورة ومتاحة فقط لحزم RPM v4 من أجل التوافقية مع الإصدارات السابقة. استخدم rpm.spawn() أو rpm.execute() بدلاً منها.
files([path])
مثال:
for f in posix.files('/') do
print(f..'n')
end
fork() (مهجور)
هذه الدالة مهجورة ومتاحة فقط لحزم RPM v4 من أجل التوافقية مع الإصدارات السابقة. استخدم rpm.spawn() أو rpm.execute() بدلاً منها.
مثال:
pid = posix.fork() if pid == 0 then
posix.exec('/foo/bar') elseif pid > 0 then
posix.wait(pid) end
getcwd()
getenv(name)
مثال:
if posix.getenv('HOME') ~= posix.getcwd() then
print('not at home')
end
getgroup(group)
مثال:
print(posix.getgroup('wheel').gid)
getlogin()
getpasswd([المستخدم [, المحدد]])
- name
- uid
- gid
- dir
- shell
- gecos
- passwd
إذا أُغفل، أُعيد جدول يحتوي على كل هذه الحقول.
مثال:
pw = posix.getpasswd(posix.getlogin(), 'shell')|
getprocessid([المحدد])
- egid: معرف المجموعة الفعال
- euid: معرف المستخدم الفعال
- gid: معرف المجموعة
- uid: معرف المستخدم
- pgrp: معرف مجموعة الأب
- pid: معرف العملية
- ppid: معرف العملية الأب
إذا أُغفل، أُعيد جدول يحتوي على كل هذه الحقول.
مثال:
if posix.getprocessid('pid') == 1 then
...
end
kill(pid [, الإشارة])
مثال:
posix.kill(posix.getprocessid('pid'))
link(المسار_القديم, المسار_الجديد)
مثال:
f = rpm.open('aaa', 'w')
posix.link('aaa', 'bbb')
mkdir(المسار)
mkfifo(المسار)
مثال:
posix.mkfifo('/tmp/badplace')
pathconf(المسار [, المحدد])
- link_max
- max_canon
- max_input
- name_max
- path_max
- pipe_buf
- chown_restricted
- no_trunc
- vdisable.
إذا أُغفل، أُعيد جدول يحتوي على كل هذه الحقول.
مثال:
posix.pathconf('/', 'path_max')
putenv(السلسلة)
readlink(المسار)
مثال:
posix.mkdir('aaa')
posix.symlink('aaa', 'bbb')
print(posix.readlink('bbb'))
rmdir(المسار)
setgid(المجموعة)
ملاحظة: هذه عملية ذات امتيازات.
setuid(المستخدم)
ملاحظة: هذه عملية ذات امتيازات.
مثال:
posix.setuid('nobody')
sleep(الثواني)
stat(المسار [, المحدد])
- mode
- ino
- dev
- nlink
- uid
- gid
- size
- atime
- mtime
- ctime
- type.
إذا أُغفل، أُعيد جدول يحتوي على كل هذه الحقول.
مثال:
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(المسار_القديم, المسار_الجديد)
مثال:
posix.mkdir('aaa')
posix.symlink('aaa', 'bbb')
sysconf([المحدد])
- arg_max
- child_max
- clk_tck
- ngroups_max
- stream_max
- tzname_max
- open_max
- job_control
- saved_ids
- version.
إذا أُغفل، أُعيد جدول يحتوي على كل هذه الحقول.
مثال:
posix.sysconf('open_max')|
times([المحدد])
- utime
- stime
- cutime
- cstime
- elapsed
إذا أُغفل، أُعيد جدول يحتوي على كل هذه الحقول.
مثال:
t = posix.times() print(t.utime, t.stime)
ttyname([fd])
مثال:
if not posix.ttyname() then
... endif
umask([mode])
مثال:
print(posix.umask())
posix.umask(222)
posix.umask('ug-w')
posix.umask('rw-rw-r--')
uname(format)
- %m: اسم نوع العتاد
- %n: اسم هذه العقدة
- %r: مستوى الإصدارة الحالي لهذا التنفيذ
- %s: اسم نظام التشغيل هذا
- %v: مستوى النسخة الحالي لهذا التنفيذ
مثال:
print(posix.uname('%s %r'))
utime(path [, mtime [, ctime]])
إذا أُهمل mtime أو ctime، يُستخدم الوقت الحالي، بشكل مشابه لـ touch(1).
مثال:
posix.mkdir('aaa')
posix.utime('aaa', 0, 0)
wait([pid]) (مهجور)
هذه الدالة مهجورة ومتاحة فقط لحزم RPM v4 من أجل التوافقية مع الإصدارات السابقة. استخدم rpm.spawn() أو rpm.execute() بدلاً منها.
مثال:
pid = posix.fork() if pid == 0 then
posix.exec('/bin/ls')) elseif pid > 0 then
posix.wait(pid) end
setenv(name, value [, overwrite])
مثال:
posix.setenv('HOME', '/me', true)
unsetenv(name)
التوسيع والتخصيص¶
عند الاستهلال، ينفذ RPM سكربت استهلال لوا عام init.lua من الدليل الذي يتوسع إليه %getconfdir، وعادة ما يكون /usr/lib/rpm/init.lua. يمكن استخدام هذا لتخصيص بيئة لوا في rpm دون إعادة تجميع RPM.
بالنسبة لمفسر لوا المضمن، يُبحث عن الوحدات المحملة باستخدام require بشكل رئيس من %{getconfdir}/lua/. يعد %_rpmluadir اختصارًا لهذا المسار.
انظر أيضًا¶
ترجمة¶
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>
هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.
إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.
| 10 أبريل 2026 | RPM 6.0.1 |