Запуск WebDAV-сервера WebDAV-Daemon в NetBSD с помощью daemontools

Создаём каталог сервиса /service/.webdavd/:

# mkdir -p /service/.webdavd/

Создадим внутри каталога сервиса файл run со следующим содержимым:

#!/bin/sh

exec 2>&1

if [ ! -f /usr/pkg/etc/webdavd.xml ] ; then
        echo "Missing /usr/pkg/etc/webdavd.xml"
        exit 1
fi

exec \
/usr/pkg/sbin/webdavd /usr/pkg/etc/webdavd.xml

И сделаем его исполняемым:

# chmod +x /service/.webdavd/run

Создадим каталог /service/.webdavd/log/:

# mkdir /service/.webdavd/log/

Создадим внутри него скрипт run со следующим содержимым:

#!/bin/sh

exec \
setuidgid multilog \
multilog t /var/log/nginx/error

И сделаем его исполняемым:

# chmod +x /service/.webdavd/log/run

Теперь создадим каталог /var/log/webdavd, в котором multilog будет вести журналы работы сервиса:

# mkdir /var/log/webdavd/error/

Установим пользователя и группу multilog владельцами этого каталога:

# chown multilog:multilog /var/log/webdavd/error/

Остановим webdavd, если он уже запущен с помощью скрипта /etc/rc.d/webdavd:

# /etc/rc.d/webdavd stop

Запустим сервис:

# mv /service/.webdavd /service/webdavd

В такой конфигурации через multilog пропускается только журнал ошибок, но хотелось бы через него пропускать ещё и журнал доступа. Для этого в webdavd настроим запись журналов в именованный канал и настроим ещё один сервис, который назовём webdavd_access, который будет читать строки из этого канала.

Создаём каталог сервиса /service/.webdavd_access/:

# mkdir -p /service/.webdavd_access/

Создадим внутри каталога сервиса файл run со следующим содержимым:

#!/bin/sh

exec \
setuidgid multilog \
multilog t /var/log/webdavd/access/ < /var/log/webdavd/access.pipe

И сделаем его исполняемым:

# chmod +x /service/.webdavd_access/run

Создадим именованный канал, в который webdavd будет писать журналы доступа:

# mkfifo /var/log/nginx/access.pipe

Теперь создадим каталог /var/log/webdavd/access, в котором multilog будет вести журналы доступа:

# mkdir /var/log/nginx/access/

Установим пользователя и группу multilog владельцами этого каталога:

# chown multilog:multilog /var/log/nginx/access/

Запустим новый сервис:

# mv /service/.webdavd_access /service/webdavd_access

Теперь нужно прописать в файле конфигурации /usr/pkg/etc/webdavd.xml вместо имени файла журнала имя именованного канала:

<?xml version="1.0" encoding="utf-8" ?>
<server-config xmlns="http://couling.me/webdavd">
        <server>
                <access-log>/var/log/webdavd/access.pipe</access-log>
        </server>
</server-config>

Осталось только перезапустить webdavd, чтобы он перечитал свой файл конфигурации и начал писать журнал в новый файл:

# svc -du /service/webdavd

Совместимость с rc

Для совместимости с системой инициализации /etc/rc создадим скрипт /etc/rc.d/webdavd со следующим содержимым:

#!/bin/sh

# REQUIRE: DAEMON
# PROVIDE: webdavd

if [ -f /etc/rc.subr ]; then
        . /etc/rc.subr
fi

name=webdavd
rcvar=$name

load_rc_config $name
if checkyesno $rcvar ; then
        rm -f /service/$name/down
else
        touch /service/$name/down
fi

status_cmd="/usr/pkg/bin/svstat /service/$name/ | sed -e 's,^/service/\(.*\)/: up (\(pid .*\)).*$,\1 is running as \2.,g; s,^/service/\(.*\)/: down .*,\1 is not running.,g'"
start_cmd="/usr/pkg/bin/svc -u /service/${name}_access/ ; /usr/pkg/bin/svc -u /service/$name/ ; echo 'Starting $name.'"
stop_cmd="/usr/pkg/bin/svc -d /service/$name/ ; /usr/pkg/bin/svc -d /service/${name}_access/ ; echo 'Stopping $name.'"
restart_cmd="/usr/pkg/bin/svc -du /service/$name/ ; echo 'Restarting $name.'"
extra_commands="status"
run_rc_command "$1"

После создания файла нужно добавить права на его выполнение:

# chmod +x /etc/rc.d/webdavd

Теперь можно будет включать и выключать сервис webdavd привычным образом через переменную webdavd в файле /etc/rc.conf, а также запускать, останавливать, перезапускать, проверять состояние сервиса с помощью скрипта /etc/rc.d/webdavd.