blob: 0d1753d389bcde904c466ebc2b44f360a5c1c151 [file] [log] [blame]
#!/bin/sh
die() {
echo "fatal error ($1), aborting." >&2
exit 1
}
# Carefully try to clean up the directory structures we create for samba.
# We go through extra contortions here to minimize the chances that a bug
# (or a deliberate security attack) will cause us to accidentally rm -rf
# important stuff or start with special files in the wrong places.
cleanup() {
(
echo "cleaning up"
random=$(
dd if=/dev/urandom bs=20 count=1 2>/dev/null |
sha1sum |
{ read sum junk; echo "$sum"; }
)
D=clean.$random.$(date +%s).$$
for d in /var/lock/samba/subsys /tmp/samba/sockets; do
dir=$(dirname "$d")
if [ -d "$dir" ]; then
cd "$dir" || die 'cd $dir'
mkdir "$D"
[ -e "$d" ] && mv "$d" "$D"
rm -rf "$D" || die rm-rf
fi
done
umount-subdirs-of /chroot/samba
return 0
)
}
mounts() {
cd /chroot/samba && \
mount -o bind /var/media var/media && \
mount -o bind /usr/lib usr/lib && \
mount -o bind /lib lib && \
mount -o bind /var/lock/samba var/lock && \
mount -o bind /tmp/samba tmp
}
case "$1" in
start)
if is-storage-box; then
cleanup || die 'start failed'
mkdir -p /var/lock/samba/subsys /tmp/samba/sockets && \
chown video.video /var/lock/samba/subsys /tmp/samba && \
chown video.video /tmp/samba/sockets && \
mounts || die 'mounts failed'
chmod 0750 /tmp/samba/sockets && \
cd /chroot/samba/var/media && (
ionice -c 3 -n 7 chg_mod_own --uid video --gid video --mode_dir 0775 \
--mode_file 0664 tv videos pictures music
) || die 'prepare environment failed'
babysit 60 ionice -c 3 -n 7 smbd -F -D -S 2>&1 | logos smbd &
babysit 60 nmbd -F -D -S 2>&1 | logos nmbd &
fi 2>&1 | logos smbd & # run in background to avoid slowing boot
;;
stop)
# we have to kill the babysitter too, because smbd eats the SIGTERM
# exit code and returns 1 instead, so babysit thinks it needs to
# restart.
pkillwait -f 'babysit 60 smbd'
pkillwait -f 'babysit 60 nmbd'
pkillwait -x smbd
pkillwait -x nmbd
if is-storage-box; then
cleanup
fi
;;
restart)
$0 stop; $0 start
;;
reload)
pids=$(pgrep -x smbd)
[ -n "$pids" ] && kill -1 $pids
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac