#!/bin/sh # PROVIDE: zerotier # REQUIRE: FILESYSTEMS devfs # BEFORE: pf ipfw # KEYWORD: shutdown # # Add these lines to /etc/rc.conf.local or /etc/rc.conf # to enable this service: # # zerotier_enable (bool): Set to NO by default. # Set it to YES to enable zerotier. # zerotier_wait_for_net (bool): Set to NO by default. Use for DHCP interfaces only # Set it to YES to require zerotier to wait until online # zerotier_alias_6addrs (str): Space-separated list of inet6 addresses to alias onto # the ZeroTier interface after it comes up. Useful for # containers using --network=host that need a specific # 6plane address assigned. Example: # zerotier_alias_6addrs="fc::9/128" . /etc/rc.subr name=zerotier rcvar=zerotier_enable desc="peer-to-peer software-defined networking" load_rc_config $name : ${zerotier_enable:=NO} : ${zerotier_wait_for_net:=NO} : ${zerotier_alias_6addrs:=} required_modules=%%ZEROTIER_IF_TAP%% pidfile="/var/run/${name}.pid" start_precmd="install -o root /dev/null ${pidfile}" command=/usr/sbin/daemon command_args=" \ -c \ -t ${name} \ -r \ -P ${pidfile} \ %%ZEROTIER_SYSLOG%% \ %%PREFIX%%/sbin/${name}-one /var/db/${name}-one/" start_postcmd=start_postcmd start_postcmd() { if checkyesno zerotier_wait_for_net; then zerotier_count=5 until %%PREFIX%%/bin/zerotier-cli status |egrep -o ONLINE\$; do warn ${name} is waiting for ONLINE status sleep 2 zerotier_count=$((zerotier_count-1)) test $zerotier_count -le 0 && break done if test $zerotier_count -le 0; then warn ${name} still not ONLINE, stopped blocking else warn ${name} is ONLINE fi fi if [ -n "${zerotier_alias_6addrs}" ]; then zerotier_iface=$(%%PREFIX%%/bin/zerotier-cli -j listnetworks 2>/dev/null \ | %%PREFIX%%/bin/jq -r '.[0].portDeviceName // empty') if [ -n "${zerotier_iface}" ]; then for addr in ${zerotier_alias_6addrs}; do ifconfig ${zerotier_iface} inet6 ${addr} alias || \ warn "${name}: failed to alias ${addr} on ${zerotier_iface}" done else warn "${name}: zerotier_alias_6addrs set but no ZeroTier interface found" fi fi } run_rc_command "$1"