aboutsummaryrefslogtreecommitdiffstats
path: root/community/jool-tools/jool.initd
diff options
context:
space:
mode:
Diffstat (limited to 'community/jool-tools/jool.initd')
-rw-r--r--community/jool-tools/jool.initd99
1 files changed, 99 insertions, 0 deletions
diff --git a/community/jool-tools/jool.initd b/community/jool-tools/jool.initd
new file mode 100644
index 0000000000..e666c45729
--- /dev/null
+++ b/community/jool-tools/jool.initd
@@ -0,0 +1,99 @@
+#!/sbin/openrc-run
+
+case "${RC_SVCNAME#*[.-]}" in
+ jool[_-]siit)
+ name="SIIT"
+ description="Stateless IP/ICMP Translator"
+ command="/usr/bin/jool_siit"
+ kmod_name="jool_siit"
+ ;;
+ *)
+ name="NAT64"
+ description="Stateful NAT64"
+ kmod_name="jool"
+ command="/usr/bin/jool"
+ ;;
+esac
+
+: ${cfgfile:="/etc/jool/$RC_SVCNAME.conf"}
+
+required_files="$cfgfile"
+
+depends() {
+ need net
+}
+
+start_pre() {
+ resolve_instance_name
+
+ # Don't load module if it's already loaded.
+ if modprobe -qn "$kmod_name" && ! modprobe -qn --first-time "$kmod_name"; then
+ return 0
+ fi
+
+ ebegin "Loading $kmod_name kernel module"
+ modprobe -q $kmod_name
+ eend $?
+}
+
+start() {
+ ebegin "Loading $name instance $instance_name"
+ $command -i "$instance_name" file handle "$cfgfile"
+ eend $?
+}
+
+stop_pre() {
+ resolve_instance_name
+}
+
+stop() {
+ case $(instance_status) in
+ Running)
+ ebegin "Unloading $name instance $instance_name"
+ $command instance remove "$instance_name"
+ eend $?
+ ;;
+ *)
+ ewarn "WARNING: $name instance $instance_name is not running"
+ return 0
+ ;;
+ esac
+}
+
+status() {
+ resolve_instance_name
+
+ case "$(instance_status)" in
+ Running)
+ einfo "status: running"
+ return 0
+ ;;
+ Dead)
+ if service_started || service_crashed; then
+ eerror "status: crashed"
+ return 32
+ else
+ einfo "status: stopped"
+ return 3
+ fi
+ ;;
+ *)
+ eerror "status: error"
+ $command -i "$instance_name" instance status >&2
+ return 32
+ ;;
+ esac
+}
+
+instance_status() {
+ $command -i "$instance_name" instance status 2>/dev/null | head -1
+}
+
+resolve_instance_name() {
+ instance_name=$(sed -En 's/.*"instance":\s*"([^"]+)".*/\1/p' "$cfgfile")
+
+ if [ -z "$instance_name" ] && [ "${RC_SVCNAME#*[.-]}" != "$RC_SVCNAME" ]; then
+ instance_name="${RC_SVCNAME#*[.-]}"
+ fi
+ : ${instance_name:="default"}
+}