توسعه یک پلاگین ساده Sparrow با Raku و Bash

Sparrow در نوشتن اسکریپت برای خودکارسازی مدیریت سیستم با استفاده از Raku و Bash بسیار کارآمد است، در پست امروز قصد دارم یک مثال را نشان دهم …
استقرار فایل پیکربندی و راه اندازی مجدد سرویس پس از تغییرات
بیایید یک افزونه ساده ایجاد کنیم که برخی از پرچمهای پیکربندی را در فایل پیکربندی سرویس فعال/غیرفعال میکند و در صورت بروز هرگونه تغییر، سرویسی را دوباره بارگیری میکنیم. فرمت پرچم ها در فایل پیکربندی به صورت زیر است:
var=true|false
در اینجا یک نمونه از فایل پیکربندی است:
config.txt
debug=true
sentry=false
tls=false
معمولاً خدمات به عنوان واحدهای سیستمی مدیریت می شوند، بنابراین service reload
می تواند برای بارگذاری مجدد پیکربندی سرویس استفاده شود.
#!bash
# create root directory for plugin source code
# for convenience
mkdir -p service-config-reload
cd service-config-reload
اکنون در دایرکتوری ریشه افزونه:
hook.raku
:
#!raku
my $cfg-orig = config()<path>.IO.slurp();
my $cfg = $cfg-orig;
for config()<enable><> -> $f {
$cfg ~~ s/ "$f=" \S+ /$f=true/;
}
for config()<disable><> -> $f {
$cfg ~~ s/ "$f=" \S+ /$f=false/;
}
set_stdout($cfg);
if $cfg ne $cfg-orig {
set_stdout("config changed");
config()<path>.IO.spurt($cfg);
run_task "service_restart", %(
service => config()<service>,
path => config()<path>,
);
}
mkdir -p tasks/service_restart/
tasks/service_restart/task.bash
#!bash
sudo service $service reload
در برنامههای کاربردی واقعی، سرویسها ممکن است دارای قابلیت Linter باشند که قبل از اعمال پیکربندی بررسی میشود و در صورت بروز هرگونه خطایی، برنامه تغییرات خاتمه مییابد:
#!bash
set -e
sudo /usr/bin/$service --check $path
sudo service $service reload
سناریوی بسته بندی به عنوان یک افزونه به دیگران امکان استفاده از آن را می دهد.
sparrow.json
{
"name" : "service-config-reload",
"description" : "Deploy configuration file and restart service upon changes",
"version" : "0.0.1",
"category" : "linux",
"url" : "https://github.com/melezhik/sparrow-plugins/tree/master/service-config-reload"
}
این آخرین دستور افزونه را در مخزن محلی Sparrow آپلود می کند (برای جزئیات بیشتر به این سند مراجعه کنید)
#!bash
s6 --upload
استفاده از افزونه ها
در هر نقطه از سناریوی Raku، فقط این کار را انجام دهید:
#!raku
use Sparrow6::DSL;
task-run "apply and reload", "service-config-reload", %(
:path<config.txt>,
:service<app>,
enable => <tls sentry>, # enable TLS and use of Sentry for production
disable => <debug>, # disable debug mode for production
)
با تشکر برای خواندن!
کد منبع افزونه را میتوانید در اینجا پیدا کنید – https://github.com/melezhik/sparrow-plugins/tree/master/service-config-reload