Адрес: ул. Б. Очаковская 32 Москва Россия
Наши официальные канал и чат в telegram
Поднимем Devuan на вершину Distrowatch! Просто перейдите по ссылке один раз в день.

Yggdrasil

Не знаете где спросить? Спрашивайте тут
zyx
Сообщения: 2
Зарегистрирован: Чт июл 16, 2026 7:15 pm
Поблагодарили: 1 раз

Yggdrasil

Сообщение zyx »

Yggdrasil
Приветствую всех.
Отцы, подскажите плизз как поднять Yggdrasil на Devuan sysvinit?
Дефолтная установка пакета даёт неудобоваримый /usr/lib/systemd/system/yggdrasil.service
Заранее благодарен.
Аватара пользователя
root:#
Site Admin
Сообщения: 2135
Зарегистрирован: Вт ноя 08, 2022 3:27 pm
Благодарил (а): 60 раз
Поблагодарили: 28 раз

Yggdrasil

Сообщение root:# »

zyx писал(а): Чт июл 16, 2026 7:32 pmПриветствую всех.
Привет!
На Devuan (sysvinit) пакет yggdrasil при установке ставит только systemd-сервис, который не работает, потому что systemd нет. Нужно вручную сделать init-скрипт для sysvinit

Код: Выделить всё

#!/bin/sh
### BEGIN INIT INFO
# Provides:          yggdrasil
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Yggdrasil network daemon
# Description:       Yggdrasil is an IPv6 peer-to-peer mesh network.
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin
NAME=yggdrasil
DAEMON=/usr/bin/yggdrasil
CONFFILE=/etc/yggdrasil.conf
PIDFILE=/var/run/$NAME.pid
LOGFILE=/var/log/$NAME.log
USER=_yggdrasil
GROUP=_yggdrasil

[ -x "$DAEMON" ] || exit 0

# Если каталог /var/run не tmpfs (Devuan чаще с tmpfs), /run или /var/run
# PID-файл должен лежать на tmpfs, поэтому /var/run подходит.
[ -d /var/run ] || mkdir -p /var/run

start() {
    echo -n "Starting $NAME: "
    start-stop-daemon --start --background --make-pidfile \
        --pidfile "$PIDFILE" \
        --chuid "$USER:$GROUP" \
        --exec "$DAEMON" -- -useconffile "$CONFFILE" \
        >> "$LOGFILE" 2>&1
    echo "done."
}

stop() {
    echo -n "Stopping $NAME: "
    start-stop-daemon --stop --pidfile "$PIDFILE" --retry 5
    rm -f "$PIDFILE"
    echo "done."
}

status() {
    if [ -f "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") 2>/dev/null; then
        echo "$NAME is running (pid $(cat $PIDFILE))"
    else
        echo "$NAME is not running"
        return 1
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        sleep 1
        start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $0 {start|stop|restart|status}"
        exit 1
        ;;
esac

exit 0
zyx
Сообщения: 2
Зарегистрирован: Чт июл 16, 2026 7:15 pm
Поблагодарили: 1 раз

Yggdrasil

Сообщение zyx »

Не помогло.
Заработал такой вариант. Проверено на Excalibur.

Код: Выделить всё

#!/bin/sh
### BEGIN INIT INFO
# Provides:          yggdrasil
# Required-Start:    $network $remote_fs
# Required-Stop:     $network $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: yggdrasil daemon
### END INIT INFO

NAME="yggdrasil"

DAEMON="/usr/sbin/yggdrasil"
CONFIG="/etc/yggdrasil/yggdrasil.conf"
USER="yggdrasil"
GROUP="yggdrasil"

# где будет PID
PIDDIR="/var/run/yggdrasil"
PIDFILE="$PIDDIR/yggdrasil.pid"

# paths (аналог RuntimeDirectory/ReadWritePaths)
RUNDIRS="/var/run/yggdrasil /run/yggdrasil"

# capabilities из unit (нужно, чтобы setcap/capsh/ld обвязка была доступна)
# В SysV проще всего дать бинарнику capability один раз командой setcap.
# Если уже сделано — убери эти строки.
CAPS="cap_net_admin,cap_net_bind_service+ep"

case "$1" in
  start)
    echo "Starting $NAME..."

    # Права/каталоги
    for d in $RUNDIRS; do
      [ -d "$d" ] || mkdir -p "$d" 2>/dev/null
      chown -R "$USER":"$GROUP" "$d" 2>/dev/null
    done

    # modprobe tun (ExecStartPre)
    /sbin/modprobe tun 2>/dev/null || true

    # Убедимся, что у бинарника есть capabilities (если нет — попытка дать)
    if command -v setcap >/dev/null 2>&1; then
      setcap "$CAPS" "$DAEMON" 2>/dev/null || true
    fi

    # запуск
    # SysV обычно нужно background'ить процесс.
    start-stop-daemon --start --quiet \
      --chuid "$USER":"$GROUP" \
      --make-pidfile --pidfile "$PIDFILE" \
      --background --exec "$DAEMON" -- \
      -useconffile "$CONFIG"

    # проверка
    if [ -f "$PIDFILE" ]; then
      echo "$NAME started (pid $(cat "$PIDFILE" 2>/dev/null))."
    else
      echo "Failed to start $NAME (pidfile not created)."
      exit 1
    fi
    ;;

  stop)
    echo "Stopping $NAME..."

    if [ -f "$PIDFILE" ]; then
      pid="$(cat "$PIDFILE" 2>/dev/null)"
      if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
        # в systemd ExecReload=HUP, но stop = по умолчанию мягко, потом жёстко
        # здесь: сначала TERM, затем KILL
        kill -TERM "$pid" 2>/dev/null || true
        # TimeoutStopSec=5
        i=0
        while kill -0 "$pid" 2>/dev/null; do
          i=$((i+1))
          [ "$i" -ge 5 ] && break
          sleep 1
        done
        kill -KILL "$pid" 2>/dev/null || true
      fi
      rm -f "$PIDFILE" 2>/dev/null
    else
      # если pidfile нет — попробуем убить по имени (бережно)
      pkill -u "$USER" -x "$DAEMON" 2>/dev/null || true
    fi

    echo "$NAME stopped."
    ;;

  restart)
    "$0" stop
    "$0" start
    ;;

  status)
    if [ -f "$PIDFILE" ]; then
      pid="$(cat "$PIDFILE" 2>/dev/null)"
      if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
        echo "$NAME is running (pid $pid)."
        exit 0
      fi
    fi
    echo "$NAME is not running."
    exit 3
    ;;

  reload)
    # systemd ExecReload=kill -HUP $MAINPID
    if [ -f "$PIDFILE" ]; then
      pid="$(cat "$PIDFILE" 2>/dev/null)"
      if [ -n "$pid" ] && kill -HUP "$pid" 2>/dev/null; then
        echo "Reloaded $NAME."
        exit 0
      fi
    fi
    echo "Cannot reload $NAME (pidfile missing or process dead)."
    exit 1
    ;;

  *)
    echo "Usage: $0 {start|stop|restart|status|reload}"
    exit 2
    ;;
esac

exit 0