Αποστολέας Θέμα: Webmin, nosystemd & Artix Linux, μια ωραία ιστορία, για developers και όχι μόνο  (Αναγνώστηκε 232 φορές)

linuxer

  • Administrator
  • *****
  • Μηνύματα: 73
  • Systemd kills Linux Freedom - Move to Artix Linux
    • Προφίλ
    • LINUXER
+  

Artix Linux & Webmin, γιατί ο σαματάς;

Ας πούμε καταρχήν δυο λόγια περί Webmin

To Webmin, είναι ένα διαδικτυακό διαχειριστικό εργαλείο για Unix-like λειτουργικά συστήματα, το οποίο επιτρέπει στον χρήστη, να διαχειριστεί το λειτουργικό σύστημα, όπως οι χρήστες, ο ορισμός του ανώτατου ορίου των σκληρών δίσκων (disk quotas), υπηρεσίες ή αρχεία ρυθμίσεων, όπως και να τροποποιήσει και να διαχειριστεί, εφαρμογές ανοικτού κώδικα, όπως είναι ο Apache HTTP Server, η PHP και η MySQL (διαθέτει πολλά άλλα modules, και πρόσθετα, όπως το Virtualmin/Usermin κλπ).

Είναι ίσως και το πλέον διαδεδομένο, μαζί με το ISP-Config, στον χώρο αυτό.


Η πρόκληση

Από τότε που μπήκα στο Artix Linux, αλλά και παλαιότερα, από τον καιρό που ήμουν στο Arch, με γαργαλούσε η ιδέα του server σε rolling διανομή, γιατί αρκετά μας ζάλισαν τόσα χρόνια, με το ποιοτικό λογισμικό των stable διανομών, και ότι οι bleeding edge δεν κάνουν για αυτή την δουλειά κλπ κλπ κλπ...

Εδώ και λίγο καιρό, άρχισα σαν καλό παιδί, να αναζητώ για να βρω το τι ζητούσαν πολλοί χρήστες και εμείς δεν το διαθέταμε.

Πριν κάποιες εβδομάδες, οι TUs μου έβγαλαν και μπόλικη χολή, διότι το mail μου, τελειώνει σε artixlinux.org, και εκεί ήταν που πάρθηκε η απόφαση, από τους Cores, να μεταφερθούν βασικά μου πακέτα, στο Arix, όπως το Runit-Service-Manager ή rsm (πρώην rsv AUR), το οποίο με την ευκαιρία, έλαβε περισσότερη ανάπτυξη by me και validation by users, έτσι ώστε πλέον δείχνει και τα logs, και βρίσκεται στο Galaxy, το zramen-nonsystemd και τα services του, όπως και το ananicy-nosystemd και τα services του, μπήκαν στο Universe, τα Jackett-nosystemd και τα services τους, στο multiverse.






Όταν λέω services, εννοώ την υπηρεσία του πακέτου, για να ξεκινήσει και στα τρία init systems, όλα τα PKGBUILDS για τα πακέτα, είναι εδώ

Όλα αυτά τα ωραία, θα τα παρουσιάσω στην συνέχεια, για το Webmin.


Πως καθαρίζουμε τα πακέτα, από τα systemd services?

Αυτή είναι η βασικότερη αιτία, που χρησιμοποιούμε τον δικό μας build server, και δεν μπαίνουν τα πακέτα όλα από το Arch.

Ο λόγος; Στα PKGBUILDS των πακέτων, εγκαθιστούν και το systemd service, με αποτέλεσμα να πρέπει να την ακυρώνουμε και μετά να δημιουργούμε τρία πακέτα,  <service>-openrc, <service>-runit & <service>-s6 αντίστοιχα.

Αν δούμε λοιπόν το PKGBUILD του webmin, στην γραμμή 173, απενεργοποιώ απλά την εγκατάσταση του webmin.service (το οποίο έχω απομακρύνει ήδη από τις πηγές μου), ως εξής:

Κώδικας
# install -D -m 644 "$srcdir"/webmin.service "$pkgdir"/usr/lib/systemd/system/webmin.service <- get rid of systemd installation

Σημείωση:
  • Δεν υπάρχει λόγος σε init freedom συστήματα, να διατηρούμε κανένα service του systemd, εφόσον αυτό απέχει από τις θέσεις μας (αλήθεια νομίζετε ότι η κάθε Red Hat, θα έκανε το αντίστοιχο, δηλαδή να διαθέτει nosystemd init services, στα αποθετήριά της; - εδώ γελάμε) και θα ήταν αστείο το κάνουμε.
  • Αυτό είναι το δικό μας development upstream, και φυσικά μας καθιστά ανεξάρτητους, σε όλα τα επίπεδα, πχ όπως στο boot όπου δεν χρησιμοποιούμε καν shims. Επίσης συμμετέχουμε ενεργά στην ανάπτυξη των nosystemd inits και δεν περιμένουμε καμία εταιρία να μας σερβίρει την δική της «εκδοχή και την βελτιωμένη από εκείνη τεχνητά γεύση» upsteam code, αλλά στον αντίποδα, μεγαλώνουμε την διαθέσιμη ποικιλία τους.


Κατόπιν αυτού, ήρθε η σειρά των services/init, και τα οποία είναι (παρουσίαση για το s6, θα γίνει σε άλλο χρόνο, αλλά μια γεύση θα την πάρετε)

Για το OpenRC:

Κώδικας
#!/usr/bin/openrc-run

pidfile="/run/webmin.pid"
command="/etc/webmin/start"
command_background=true

restart() {
       /etc/webmin/reload
}

stop() {
       /etc/webmin/stop
}
Για το Runit:

Το εκτελέσιμο run αρχείο:
Κώδικας
#!/bin/sh

/etc/webmin/start
/etc/webmin/reload
exec pause
Και το εκτελέσιμο finish
Κώδικας
#!/bin/sh

exec /etc/webmin/stop
Για το s6:

To εκτελέσιμο run
Κώδικας
#!/usr/bin/execlineb -P
foreground { /etc/webmin/start }
exec /etc/webmin/reload
Το finish:
Κώδικας
#!/usr/bin/execlineb -P
exec /etc/webmin/stop
Και τέλος, το type:
Κώδικας
oneshot

Ωραία, μετά τι;


Μετά φυσικά, τι άλλο από τα να ήρθαν τα πρώτα ωραία αποτελέσματα του εγχειρήματος (εδώ το βλέπετε σε runit)

Έλα μου όμως που ενώ εκκινεί κανονικότατα, δεν μπορεί να διαχειριστεί τις υπηρεσίες, διότι εσωτερικά εκτελεί systemctl του systemd; Εδώ σε θέλω μάστορα, διότι ούτε fork μπορεί να γίνει, αλλά θα πρέπει εκτός της τροποποίησης του, να γίνει *3, εκεί πώς λύνεται;

Με τι άλλο, από την δημιουργία ενός Bash script, σε παγκόσμια πρώτη, του fakesystemctl, καλού-κακού; (ενός hack-aliases bash script)

Σε μόλις 237 γραμμές κώδικα bash (μαζί με κενά και comments), σύμφωνο με το shellcheck (bash linter), δημιούργησα τα aliases του systemd, έτσι ώστε να μπορεί να τα εκτελεί, αλλά για nosystemd inits, σε ενδεχόμενη εσωτερική systemctl εντολή.


Θα το δημοσιεύσω και εδώ, για να υπάρχει και να το δει περισσότερος κόσμος ;)

Κώδικας
#!/bin/bash
############################################################################################
#                  fakesystemctl a hack helper script for Artix Linux                      #
#------------------------------------------------------------------------------------------#
# Created for Webmin software installation where is enforcing the use of systemctl command #
# and there is not any other option (way) to eliminate it (due to sudo / doas restrictions #
# to operate with bash exported functions), but it also can be used with gnome-extensions. #
# This is just a simple hack, that in no terms dhould be taken as an embracing the systemd,#
# by us, but vice versa, how easily can be tresspassed, when it is a actual barrier.       #
# It may be pulled by other PKGBUILDS as a helper script, BUT IS NOT FOR PACKAGING, AS IS  #
# Webmin, Virtualmin, gnome-shell-extensions are some cases that it must be used.          #
# (if the above changes, this README and code, will be modified accordingly)               #
#------------------------------------------------------------------------------------------#
# Licence: GPL-2.0-only https://spdx.org/licenses/GPL-2.0-only.html                        #
# Copyright (c) 2021 Linuxer <linuxer@artixlinux.org>                                      #
# Release 1.0.0                                                                            #
# Code complies with shellcheck https://www.shellcheck.net                                 #
############################################################################################

# functions definitions

get_init() {
openrc="$(pidof init)"
runit="$(pidof runit)"
s6="$(pidof s6-svscan)"

if [ "$openrc" = "1" ]; then
export init_sys="openrc"
elif [ "$runit" = "1" ]; then
export init_sys="runit"
elif [ "$s6" = "1" ]; then
export init_sys="s6"
fi
}

enable() {
if [ "$init_sys" = "openrc" ]; then
rc-update add "$service default"
elif [ "$init_sys" = "runit" ]; then
ln -s "/etc/runit/sv/$service" "run/runit/service"
elif [ "$init_sys" = "s6" ]; then
sh /usr/share/libalpm/scripts/s6-rc-db-update-hook "$service"
fi
}

disable() {
if [ "$init_sys" = "openrc" ]; then
rc-update del "$service"
elif [ "$init_sys" = "runit" ]; then
unlink "run/runit/service/$service"
elif [ "$init_sys" = "s6" ]; then
s6-rc -d change "$service"
fi
}

start() {
if [ "$init_sys" = "openrc" ]; then
rc-update add "/etc/runit/sv/$service default" && pgrep -a "$service"
elif [ "$init_sys" = "runit" ]; then
sv up "$service" && pgrep -a "$service"
elif [ "$init_sys" = "s6" ]; then
s6-rc -u change "$service" && pgrep -a "$service"
fi
}

status() {
if [ "$init_sys" = "openrc" ]; then
rc-update show -v | grep "$service" && pgrep -a "$service"
elif [ "$init_sys" = "runit" ]; then
sv status "$service" && pgrep -a "$service"
elif [ "$init_sys" = "s6" ]; then
s6-rc -a list "$service" | grep "$service" && pgrep -a "$service"
fi
}

stop(){
if [ "$init_sys" = "openrc" ]; then
rc-update del "$service" default
elif [ "$init_sys" = "runit" ]; then
sv stop "$service"
elif [ "$init_sys" = "s6" ]; then
s6-rc-bundle-update delete default "$service"
fi
}

hibernate() {
loginctl hibernate
}

reboot(){
loginctl reboot
}

shutdown() {
loginctl poweroff
}

suspend() {
loginctl susppend
}

setcolors() {
local opt=$1
local colors

if [[ $opt == auto ]]; then
# no colors if stdout is not a TTY
if [[ ! -t 1 ]]; then
opt='off'
else
# stdout is a tty, check tput capability for colors
colors=$(tput colors 2>/dev/null || echo -1)
if ! [[ $colors =~ $num_re ]]; then
fatal "failed to parse output of \`tput colors\` ($colors)"
fi

if ((colors >= 8)); then
opt='on'
else
opt='off'
fi
fi
fi

case "$opt" in
on|yes|true)
#colorred=$(tput setaf 1)
colorgreen=$(tput setaf 2)
#coloryellow=$(tput setaf 3)
#colorblue=$(tput setaf 4)
colormagenta=$(tput setaf 5)
colorcyan=$(tput setaf 6)
#colorwhite=$(tput setaf 7)
#colorgray=$(tput setaf 8)
#colorbold=$(tput bold)
#colorreset=$(tput sgr0)
;;
off|no|false)
#colorred=
colorgreen=
#coloryellow=
colormagenta=
colorcyan=
#colorwhite=
#colorgray=
#colorbold=
#colorreset=
;;
*)
echo "unknown color option: '$opt'" >&2
exit 1
;;
esac
}

print_help() {
printf "\n%20s\n" "${colormagenta}---------------------------------------------------------------------------------"
printf "Artix Linux is a systemd-free distribution, so this is a hack systemctl command,\n"
printf "(c) is held by Linuxer <linuxer@artixlinux.org>, to bypass special cases of systemd deps\n"
printf "Licence: GPL-2.0-only https://spdx.org/licenses/GPL-2.0-only.html \n"
printf "Sources: https://gitea.artixlinux.org/linuxer/fakesystemctl\n"
printf "%s\n" "---------------------------------------------------------------------------------"
printf "\n%s\n" "${colorcyan}Available commands are:"
printf "\n%s\n" "${colorgreen}${tab}systemctl enable <service>"
printf "%s\n" "${tab}systemctl start <service>"
printf "%s\n" "${tab}systemctl restart <service>"
printf "%s\n" "${tab}systemctl stop <service>"
printf "%s\n" "${tab}systemctl status <service>"
printf "%s\n" "${tab}systemctl disable <service>"
printf "%s\n" "${tab}systemctl hibernate"
printf "%s\n" "${tab}systemctl reboot"
printf "%s\n" "${tab}systemctl poweroff"
printf "%s\n" "${tab}systemctl suspend"
}

# the main body of the script
num_re='^-?[0-9]+$'
tab='    '
setcolors "yes";

get_init

serviceinput="$2"

# clean up the .service suffix on user input

forbidden='.service'

if [[ "$serviceinput" =~ .*"$forbidden".* ]]; then
service=${serviceinput%.*}
else
service="$serviceinput"
fi

# main script flow

if [ -z "$1" ]; then
printf "\n%20s\n" "${colormagenta}---------------------------------------------------------------------------------"
printf "Artix Linux is a systemd-free distribution, so this is a hack systemctl command,\n"
printf "(c) is held by Linuxer <linuxer@artixlinux.org>, to bypass special cases of systemd deps\n"
printf "Licence: GPL-2.0-only https://spdx.org/licenses/GPL-2.0-only.html \n"
printf "Sources: https://gitea.artixlinux.org/linuxer/fakesystemctl\n"
printf "%s\n" "---------------------------------------------------------------------------------"
elif [ "$1" = "hibernate" ]; then
hibernate
elif [ "$1" = "reboot" ]; then
reboot
elif [ "$1" = "shutdown" ]; then
poweroff
elif [ "$1" = "suspend" ]; then
suspend
elif [ "$1" = "enable" ]; then
enable
elif [ "$1" = "disable" ]; then
disable
elif [ "$1" = "start" ]; then
start
elif [ "$1" = "restart" ]; then
start
elif [ "$1" = "status" ]; then
status
elif [ "$1" = "stop" ]; then
stop
elif [ "$1" = "-h" ]; then
print_help
elif [ "$1" = "--help" ]; then
print_help
else
printf '%s' "ERROR: wrong command detected:"
printf '%s' "$@"
printf "\n"
return 1
fi

############################################################################################
#                                      Code End                                            #
############################################################################################

Και εδώ βλέπουμε ότι πλέον το Webmin, διαχειρίζεται κανονικότατα τα services, όπως το Samba.


Ο δρόμος πλέον άνοιξε, για όλες τις nonsystemd διανομές, μάλιστα έγινε ήδη forked, από τον φίλο μου, τον Arminio Genevino, για λογαριασμό του Alpine Linux, ο οποίος έκανε σχετική δημοσίευση στο twitter.

Αν μακρηγόρησα, το έκανα πιστεύοντας, ότι αξίζει!

« Τελευταία τροποποίηση: Φεβρουάριος 19, 2021, 09:54:06 πμ από linuxer »
friendly
0
funny
0
informative
0
agree
0
disagree
0
pwnt
0
like
1
dislike
0
No reactions
No reactions
No reactions
No reactions
No reactions
No reactions
Members reacted like:
rhtoras,
No reactions

rhtoras

  • Newbie
  • *
  • Μηνύματα: 15
    • Προφίλ
    • ΟΝΕΙΡΟΦΩΝΟ
Απ: Webmin, nosystemd & Artix Linux, μια ωραία ιστορία, για developers και όχι μόνο
« Απάντηση #1 στις: Φεβρουάριος 15, 2021, 08:53:36 μμ »
Πολύ καλή κίνηση. Τώρα προσπαθώ να καταλάβω τι είναι διότι με webmin δεν έχω ασχοληθεί. Τo artix μου αρέσει που ακούει τους χρήστες του και καινοτομεί πάντως.
friendly
0
funny
0
informative
0
agree
0
disagree
0
pwnt
0
like
1
dislike
0
No reactions
No reactions
No reactions
No reactions
No reactions
No reactions
Members reacted like:
linuxer,
No reactions
Mέλος του oneirofono.gr ραδιοteam
Mixcloud.com/rhtoras

linuxer

  • Administrator
  • *****
  • Μηνύματα: 73
  • Systemd kills Linux Freedom - Move to Artix Linux
    • Προφίλ
    • LINUXER
Απ: Webmin, nosystemd & Artix Linux, μια ωραία ιστορία, για developers και όχι μόνο
« Απάντηση #2 στις: Φεβρουάριος 15, 2021, 09:39:33 μμ »
Ευχαριστούμε!

To Webmin είναι ένα κέντρο ελέγχου, σε επίπεδο web, το οποίο είτε local στον υπολογιστή σου, είτε remote σε κάποιον server, μπορεί να διαχειριστεί από ενημερώσεις/εγκαταστάσεις πακέτων, μέχρι και τους servers.
Έχεις δηλαδή ένα κέντρο διαχείριση; του κάθε συστήματος σε περιβάλλον web (δηλαδή περιηγητή-browser).

« Τελευταία τροποποίηση: Φεβρουάριος 15, 2021, 11:55:50 μμ από linuxer »
friendly
0
funny
0
informative
0
agree
0
disagree
0
pwnt
0
like
0
dislike
0
No reactions
No reactions
No reactions
No reactions
No reactions
No reactions
No reactions
No reactions

 


Powered by EzPortal