AUGPRINT(1) Augeas AUGPRINT(1)

augprint - ایجاد یک اسکریپت برگشت‌پذیر (idempotent) برای augtool جهت یک پرونده مشخص

augprint [--pretty|-p] [--regexp[=n]|-r[n]] [--noseq|-s] [--verbose|-v] [--lens name|-l name] [--target /target|-t /target] FILE

دستور augprint یک اسکریپت augtool برای یک FILE مشخص ایجاد می‌کند که عمدتاً از دستورات "set" تشکیل شده است.

اسکریپت حاصل از نوع خودتوان (idempotent) طراحی شده است و اعمال آن روی پرونده اصلی تغییری در محتوا ایجاد نخواهد کرد.

دستور augprint هر مکان شماره‌گذاری‌شده در درخت را با یک عبارت مسیر (path-expression) جایگزین می‌کند که با استفاده از مقادیر درون آن جایگاه، موقعیت را به طور یکتا مشخص می‌سازد.

این کار عبارت مسیر را از شماره موقعیت مستقل می‌سازد، و در نتیجه آن را برای پرونده‌هایی قابل اعمال می‌کند که در آن‌ها ممکن است همان داده در موقعیت شماره دیگری وجود داشته باشد.

برای نمونه خروجی به بخش «مثال‌ها» مراجعه کنید.

به‌طور پیش‌فرض augprint عبارت‌های مسیری تولید می‌کند که از مقایسه‌های برابری ساده "=" تشکیل شده‌اند:

set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/ipaddr '127.0.0.1'

گزینه --regexp خروجی را به گونه‌ای تغییر می‌دهد که مقایسه‌های مبتنی بر عبارت‌های باقاعده تولید کند:

set /files/etc/hosts/seq::*[ipaddr=~regexp('127\\.0\\..*')]/ipaddr '127.0.0.1'

حداقل طول N عبارت باقاعده را می‌توان با "--regexp=N" مشخص کرد.

اگر با عبارت باقاعده N نویسه‌ای چند مقدار مختلف مطابقت پیدا کنند، augprint عبارت باقاعده طولانی‌تری از N را انتخاب خواهد کرد.

تنها پیوست‌شدن (Append-only)

خروجی عمدتاً بر پایه عملیات‌های set استوار است. عملیات set تنها می‌تواند:

الف) مقدار موجود را در همان جای خود تغییر دهد

ب) یک مقدار جدید را پس از آخرین موقعیت در گروه اضافه کند

این بدان معنی است که در صورت بازتولید یک مدخل، ممکن است در همان موقعیت مدنظر اولیه قرار نگیرد. به عنوان مثال، اگر مدخل مربوط به 192.0.2.3 از قبل وجود نداشته باشد، به عنوان آخرین مدخل در /etc/hosts ایجاد خواهد شد.

اغلب، چنین ردیف‌های خارج از ترتیبی تأثیری در کارایی پرونده پیکربندی حاصل ندارند. اگر ترتیب اهمیت داشته باشد، ویرایش دستی اسکریپت "augtool" مورد نیاز خواهد بود.

مقادیر تکراری (Repeated Values)

دستور augprint همیشه در یافتن عبارت مسیر یکتا برای یک موقعیت موفق نمی‌شود. در این صورت augprint موقعیت ترتیبی را به عبارتی که یکتا نیست اضافه می‌کند.

این حالت به ویژه زمانی رخ می‌دهد که مقادیر تکراری در پرونده وجود داشته باشد.

برای پرونده /etc/hosts شامل:

#------
192.0.2.3   defaultdns
#------

دستور augprint خروجی زیر را تولید می‌کند:

set /files/etc/hosts/#comment[.='--------'][1] '--------'
set /files/etc/hosts/seq::*[ipaddr='192.0.2.3']/ipaddr '192.0.2.3'
set /files/etc/hosts/seq::*[ipaddr='192.0.2.3']/canonical 'defaultdns'
set /files/etc/hosts/#comment[.='--------'][2] '--------'

دقت کنید که چگونه به مسیرهای "#comment" به ترتیب "[1]" و "[2]" بعد از "[expr]" اضافه شده است.

سایر مسیرهایی که عبارت‌های یکتا دارند مستقیماً تحت تأثیر قرار نمی‌گیرند.

گنجاندن مسیرهای شماره‌گذاری‌شده اصلی به عنوان کامنت در خروجی
تولید خروجی خواناتر با افزودن فاصله‌ها و سطرهای خالی
تولید عبارات باقاعده برای تطبیق با مقادیر، با استفاده از حداقل طول N نویسه از مقدار

مقدار N اختیاری است و پیش‌فرض آن 8 است

استفاده از LENS مشخص‌شده برای پرونده؛ بدون این گزینه، augprint از لنز پیش‌فرض برای پرونده استفاده می‌کند
تولید اسکریپت برای FILE مشخص‌شده به گونه‌ای که گویی مسیر واقعی آن targetfile بوده است

این کار لنز متناظر با targetfile را روی FILE اعمال کرده و عبارت‌های مسیر حاصل را مطابق با targetfile تغییر می‌دهد

مقدار targetfile باید نام کامل مسیر با شروع از '/' باشد

برای نحوه استفاده عملی از --target به بخش «مثال‌ها» مراجعه کنید

عدم استفاده از "seq::*" در خروجی و استفاده از "*" به جای آن؛ به عنوان مثال:
set /files/etc/hosts/*[ipaddr='127.0.0.1']/ipaddr '127.0.0.1'

مهم: خروجی حاصل دیگر ورودی جدیدی برای 127.0.0.1 ایجاد نخواهد کرد اگر از قبل وجود نداشته باشد. گزینه "--noseq" برای این است که مسیرهای حاصل با نسخه‌های augeas قبل از 1.13.0 قابل استفاده باشند (با در نظر گرفتن این محدودیت)

این مثال‌ها از پرونده /etc/hosts زیر به عنوان FILE استفاده می‌کنند:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.0.2.3   dns-a
192.0.2.4   dns-b

خروجی دستور "augtool 'print /files/etc/hosts'" چنین خواهد بود:

/files/etc/hosts
/files/etc/hosts/1
/files/etc/hosts/1/ipaddr = "127.0.0.1"
/files/etc/hosts/1/canonical = "localhost"
/files/etc/hosts/1/alias[1] = "localhost.localdomain"
/files/etc/hosts/1/alias[2] = "localhost4"
/files/etc/hosts/1/alias[3] = "localhost4.localdomain4"
/files/etc/hosts/2
/files/etc/hosts/2/ipaddr = "192.0.2.3"
/files/etc/hosts/2/canonical = "dns-a"
/files/etc/hosts/3
/files/etc/hosts/3/ipaddr = "192.0.2.4"
/files/etc/hosts/3/canonical = "dns-b"

"augprint /etc/hosts"

set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/ipaddr '127.0.0.1'
set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/canonical 'localhost'
set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/alias[.='localhost.localdomain'] 'localhost.localdomain'
set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/alias[.='localhost4'] 'localhost4'
set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/alias[.='localhost4.localdomain4'] 'localhost4.localdomain4'
set /files/etc/hosts/seq::*[ipaddr='192.0.2.3']/ipaddr '192.0.2.3'
set /files/etc/hosts/seq::*[ipaddr='192.0.2.3']/canonical 'dns-a'
set /files/etc/hosts/seq::*[ipaddr='192.0.2.4']/ipaddr '192.0.2.4'
set /files/etc/hosts/seq::*[ipaddr='192.0.2.4']/canonical 'dns-b'

"augprint --verbose /etc/hosts";

#   /files/etc/hosts
#   /files/etc/hosts/1
#   /files/etc/hosts/1/ipaddr  '127.0.0.1'
set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/ipaddr '127.0.0.1'
#   /files/etc/hosts/1/canonical  'localhost'
set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/canonical 'localhost'
#   /files/etc/hosts/1/alias[1]  'localhost.localdomain'
set /files/etc/hosts/seq::*[ipaddr='127.0.0.1']/alias[.='localhost.localdomain'] 'localhost.localdomain'
...

"augprint --regexp=4 /etc/hosts";

set /files/etc/hosts/seq::*[ipaddr=~regexp('127\\..*')]/ipaddr '127.0.0.1'
set /files/etc/hosts/seq::*[ipaddr=~regexp('127\\..*')]/canonical 'localhost'
set /files/etc/hosts/seq::*[ipaddr=~regexp('127\\..*')]/alias[.=~regexp('localhost\\..*')] 'localhost.localdomain'
set /files/etc/hosts/seq::*[ipaddr=~regexp('127\\..*')]/alias[.=~regexp('localhost4')] 'localhost4'
set /files/etc/hosts/seq::*[ipaddr=~regexp('127\\..*')]/alias[.=~regexp('localhost4\\..*')] 'localhost4.localdomain4'
set /files/etc/hosts/seq::*[ipaddr=~regexp('192\\.0\\.2\\.3')]/ipaddr '192.0.2.3'
set /files/etc/hosts/seq::*[ipaddr=~regexp('192\\.0\\.2\\.3')]/canonical 'dns-a'
set /files/etc/hosts/seq::*[ipaddr=~regexp('192\\.0\\.2\\.4')]/ipaddr '192.0.2.4'
set /files/etc/hosts/seq::*[ipaddr=~regexp('192\\.0\\.2\\.4')]/canonical 'dns-b'

توجه داشته باشید که گرچه حداقل طول ۴ تعیین شده است، اما augprint در صورت لزوم عبارات باقاعده طولانی‌تری را برای اطمینان از تطبیق یکتا انتخاب خواهد کرد.

اگر پرونده‌ای به‌طور پیش‌فرض به لنزی متصل نشده باشد، می‌توان از --lens lensname برای تعیین یک لنز استفاده کرد.

هنگامی که --lens مشخص شود، خروجی با دستورات مناسب "transform" و "load-file" پیشوندگذاری می‌شود تا اسکریپت augtool تکمیل شود، و همچنین یک دستور setm برای مستثنی کردن سایر لنزهای بارگذاری خودکار درج می‌گردد.

"augprint --lens shellvars /etc/skel/.bashrc";

setm /augeas/load/*[incl='/etc/skel/.bashrc' and label() != 'shellvars']/excl '/etc/skel/.bashrc'
transform shellvars incl /etc/skel/.bashrc
load-file /etc/skel/.bashrc
set /files/etc/skel/.bashrc/#comment[.='.bashrc'] '.bashrc'
set /files/etc/skel/.bashrc/#comment[.='Source global definitions'] 'Source global definitions'
set /files/etc/skel/.bashrc/@if[.='[ -f /etc/bashrc ]'] '[ -f /etc/bashrc ]'
set /files/etc/skel/.bashrc/@if[.='[ -f /etc/bashrc ]']/.source '/etc/bashrc'
set /files/etc/skel/.bashrc/#comment[.='User specific environment'] 'User specific environment'
...

لنزهای "simplelines" و "shellvars" معمولاً برای پرونده‌هایی که لنز اختصاصی ندارند بسیار مفیدند.

به منظور آماده‌سازی اسکریپت augtool برای یک پرونده خاص، ممکن است ترجیح داده شود به جای ویرایش پرونده اصلی، آن را در مکان دیگری کپی کرد.

گزینه --target این فرایند را ساده می‌سازد:

الف) کپی کردن /etc/hosts به یک مکان جدید

cp /etc/hosts ~

ب) ویرایش پرونده ~/hosts بر اساس نیاز

echo '192.0.2.7   defaultdns' >> ~/hosts

ج) اجرای "augprint" به صورت زیر

augprint --target /etc/hosts ~/hosts

د) رونوشت از بخش مرتبط خروجی و انتقال آن به اسکریپت augtool یا سایر کلاینت‌های Augeas

set /files/etc/hosts/seq::*[ipaddr='192.0.2.7']/ipaddr '192.0.2.7'
set /files/etc/hosts/seq::*[ipaddr='192.0.2.7']/canonical 'defaultdns'

توجه کنید که "augprint" مسیرها را متناظر با --target (/etc/hosts) تولید کرده است به جای آرگومان FILE (~/hosts).

ریشه مؤثر سیستم پرونده؛ مقدار پیش‌فرض '/' است.
فهرست شاخه‌های حاوی لنزها که با دونقطه جدا شده‌اند. شاخه‌های تعیین‌شده در اینجا پیش از شاخه‌های پیش‌فرض /usr/share/augeas/lenses و /usr/share/augeas/lenses/dist جستجو می‌شوند.

وضعیت خروج در صورت موفقیت دستور صفر و در صورت بروز هرگونه خطا ۱ خواهد بود.

تعاریف لنزها و شِماها در /usr/share/augeas/lenses و /usr/share/augeas/lenses/dist

George Hansper <george@hansper.id.au>

حق نشر ۲۰۲۲ متعلق به George Hansper است.

ابزار Augeas (و augprint) تحت مجوز کمتر فراگیر گنو (LGPL) نگارش ۲.۱ توزیع می‌شوند.

augtool(1)

وب‌سایت پروژه Augeas: https://www.augeas.net/

عبارات مسیر در Augeas: https://github.com/hercules-team/augeas/wiki/Path-expressions

2023-07-14 Augeas 1.14.1