• [^] # Re: De plus en plus complexe, le système d'init...

    Posté par . En réponse à la dépêche Spéciale Lennart Poettering : nouvelles versions de systemd et PulseAudio. Évalué à 7.

    D'un pauvre script rc.M ou tu rajoutais ton /usr/local/bin/pg_ctl start -D /pathmabase, maintenant il te faut pondre un script complet start/stop/restart/magrandmereenstring avec des contraintes moisies pour gérer des cas que tu pouvais déjà gérer avant.

    T’as pas dû en écrire beaucoup des unités systemd... Je vais prendre l’exemple d’Arch qui proposait un «init à la BSD» que l’on cite souvent ici comme un exemple de bon systèmes d’initialisation.

    kdm.service:

    [Unit]
    Description=K Display Manager
    After=systemd-user-sessions.service
    [Service]
    ExecStart=/usr/bin/kdm -nodaemon
    [Install]
    Alias=display-manager.service

    ancien script kdm:

    #!/bin/bash
    . /etc/rc.conf
    . /etc/rc.d/functions
    PID=$(pidof -o %PPID /usr/bin/kdm)
    case "1ドル" in
     start)
     stat_busy "Starting KDE Desktop Manager"
     [ -z "$PID" ] && /usr/bin/kdm &>/dev/null
     if [ $? -gt 0 ]; then
    stat_fail
     else
    add_daemon kdm
     stat_done
     fi
     ;;
     stop)
     stat_busy "Stopping KDE Desktop Manager"
     [ ! -z "$PID" ] && kill $PID &> /dev/null
     if [ $? -gt 0 ]; then
    stat_fail
     else
    rm_daemon kdm
     stat_done
     fi
     ;;
     restart)
     0ドル stop
     sleep 3
     0ドル start
     ;;
     *)
     echo "usage: 0ドル {start|stop|restart}"
    esac
    exit 0

    Un autre au hasard, iptables.service:

    [Unit]
    Description=Packet Filtering Framework
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/iptables-restore /etc/iptables/iptables.rules
    ExecReload=/usr/bin/iptables-restore /etc/iptables/iptables.rules
    ExecStop=/usr/lib/systemd/scripts/iptables-flush
    RemainAfterExit=yes
    [Install]
    WantedBy=multi-user.target

    avec /usr/lib/systemd/scripts/iptables-flush:

    #!/bin/bash
    #
    # Usage: iptables-flush [6]
    #
    iptables=ip1ドルtables
    if ! type -p "$iptables"; then
    echo "error: invalid argument"
     exit 1
    fi
    while read -r table; do
    tables+=("/var/lib/$iptables/empty-$table.rules")
    done <"/proc/net/ip1ドル_tables_names"
    if (( ${#tables[*]} )); then
    cat "${tables[@]}" | "$iptables-restore"
    fi

    ancien script iptables.rc:

    #!/bin/bash
    # source application-specific settings
    [ -f /etc/conf.d/iptables ] && . /etc/conf.d/iptables
    # Set defaults if settings are missing
    [ -z "$IPTABLES_CONF" ] && IPTABLES_CONF=/etc/iptables/iptables.rules
    . /etc/rc.conf
    . /etc/rc.d/functions
    case "1ドル" in
     start)
     if [ ! -f "$IPTABLES_CONF" ]; then
    echo "Cannot load iptables rules: $IPTABLES_CONF is missing!" >&2
     exit 1
     fi
    stat_busy "Starting IP Tables"
     if [ "$IPTABLES_FORWARD" = "1" ]; then
    echo 1 >/proc/sys/net/ipv4/ip_forward
     fi
     if ck_daemon iptables; then
     /usr/sbin/iptables-restore < $IPTABLES_CONF
     if [ $? -gt 0 ]; then
    stat_fail
     else
    add_daemon iptables
     stat_done
     fi
     else
    stat_fail
     fi
     ;;
     stop)
     stat_busy "Stopping IP Tables"
     if ! ck_daemon iptables; then
    fail=0
     for table in $(cat /proc/net/ip_tables_names); do
    iptables-restore < /var/lib/iptables/empty-$table.rules
     [ $? -gt 0 ] && fail=1
     done
     if [ $fail -gt 0 ]; then
    stat_fail
     else
    rm_daemon iptables
     stat_done
     fi
     else
    stat_fail
     fi
     ;;
     restart)
     0ドル stop
     0ドル start
     ;;
     save)
     stat_busy "Saving IP Tables"
     /usr/sbin/iptables-save >$IPTABLES_CONF
     if [ $? -gt 0 ]; then
    stat_fail
     else
    stat_done
     fi
     ;;
     *)
     echo "usage: 0ドル {start|stop|restart|save}"
    esac
    exit 0

    Note au passage la duplication de code pour gérer les commandes start, stop etc et l’affichage de l’usage de la commande. Et des exemples comme ça j’en ai à la pelle. Alors bien sûr tu peux faire ton script shell de deux lignes complètement moisi... Ou utiliser systemd qui gère tout ce merdier à ta place tout en te permettant .

    C'est bien le seul argument qui me semble intéressant au sens large dans tout ce qui a été dit pour nous vendre systemd dans ce thread. Ça reste léger et ne me concerne pas.

    L’interopérabilité des distributions, point ô combine critiqué, et sûrement le plus gros défaut de l’écosystème de GNU/Linux, ça vaut le pas.

    Écrit en Bépo selon l’orthographe de 1990