61 lines
1.5 KiB
Text
61 lines
1.5 KiB
Text
#!/sbin/openrc-run
|
|
|
|
MINISSDPD="/usr/sbin/minissdpd"
|
|
PIDFILE="/var/run/minissdpd.pid"
|
|
|
|
depend() {
|
|
need net
|
|
before miniupnpd
|
|
}
|
|
|
|
interfaceup() {
|
|
# interface exists?
|
|
if [ ! -f /sys/class/net/$1/flags ]; then return 1; fi
|
|
let "IFUP = `cat /sys/class/net/$1/flags` & 1"
|
|
# interface has UP flag?
|
|
if [ $IFUP -eq 0 ]; then return 1; fi
|
|
return 0
|
|
}
|
|
|
|
# awk script: scans the /proc routing table for local subnets
|
|
# 1. filter list for entries with a gateway (column 3) of 0.0.0.0 (ie interface-local)
|
|
# 2. read column 2 for network-order hex encoded subnet address
|
|
# 3. match against a 10.x.x.x, 172.(16-31).x.x, or 192.168.x.x address
|
|
# 4. print out any interface (column 1) that matches
|
|
privateinterfaces() {
|
|
awk -f - /proc/net/route <<'FindPrivateNetworks'
|
|
function p(m,n) { return(and(IP,m) == n); }
|
|
$3=="00000000" { IP=strtonum("0x"$2); if (p(0xff,0x0a) || p(0x1fff,0x10ac) || p(0xffff,0xa8c0)) print $1; }
|
|
FindPrivateNetworks
|
|
}
|
|
|
|
start() {
|
|
ebegin "Starting minissdpd"
|
|
|
|
ARGS=""
|
|
if [ "x$MINISSDPD_IFACE" = "x" ]; then
|
|
ewarn "No interfaces provided, using interfaces on private networks"
|
|
IFLIST=$(privateinterfaces)
|
|
else
|
|
IFLIST="$MINISSDPD_IFACE"
|
|
fi
|
|
|
|
eindent
|
|
for IF in $IFLIST; do
|
|
if interfaceup $IF; then
|
|
einfo Adding interface $IF
|
|
ARGS+="-i $IF "
|
|
else
|
|
ewarn "Interface $IF is not up"
|
|
fi
|
|
done
|
|
eoutdent
|
|
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $MINISSDPD -- $ARGS
|
|
eend $?
|
|
}
|
|
|
|
stop() {
|
|
ebegin "Stopping minissdpd"
|
|
start-stop-daemon --stop --pidfile "${PIDFILE}"
|
|
eend $?
|
|
}
|