From 5a4dce59146b265ddda5c57723c1e924634027aa Mon Sep 17 00:00:00 2001 From: Ad Schellevis Date: Fri, 11 Nov 2016 18:24:31 +0100 Subject: [PATCH] (tinc) add standard plugin glue + rc script --- net/tinc/Makefile | 2 +- .../src/etc/inc/plugins.inc.d/if_tinc.inc | 105 ++++++++++++++++++ net/tinc/src/etc/rc.d/opnsense-tincd | 31 ++++++ .../OPNsense/Tinc/Api/ServiceController.php | 46 +++++++- .../mvc/app/models/OPNsense/Tinc/ACL/ACL.xml | 11 ++ .../app/models/OPNsense/Tinc/Menu/Menu.xml | 7 ++ .../mvc/app/views/OPNsense/Tinc/index.volt | 2 + .../opnsense/scripts/OPNsense/Tinc/tincd.py | 4 +- .../service/conf/actions.d/actions_tinc.conf | 23 ++++ .../service/templates/OPNsense/Tinc/+TARGETS | 1 + .../service/templates/OPNsense/Tinc/rc.conf.d | 11 ++ 11 files changed, 239 insertions(+), 4 deletions(-) create mode 100644 net/tinc/src/etc/inc/plugins.inc.d/if_tinc.inc create mode 100755 net/tinc/src/etc/rc.d/opnsense-tincd create mode 100644 net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/ACL/ACL.xml create mode 100644 net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Menu/Menu.xml create mode 100644 net/tinc/src/opnsense/service/conf/actions.d/actions_tinc.conf create mode 100644 net/tinc/src/opnsense/service/templates/OPNsense/Tinc/rc.conf.d diff --git a/net/tinc/Makefile b/net/tinc/Makefile index e58ded59a..41e14819d 100644 --- a/net/tinc/Makefile +++ b/net/tinc/Makefile @@ -1,5 +1,5 @@ PLUGIN_NAME= tinc -PLUGIN_VERSION= 0.1 +PLUGIN_VERSION= 0.2 PLUGIN_COMMENT= Tinc VPN PLUGIN_DEPENDS= tinc PLUGIN_MAINTAINER= ad@opnsense.org diff --git a/net/tinc/src/etc/inc/plugins.inc.d/if_tinc.inc b/net/tinc/src/etc/inc/plugins.inc.d/if_tinc.inc new file mode 100644 index 000000000..46039fd6e --- /dev/null +++ b/net/tinc/src/etc/inc/plugins.inc.d/if_tinc.inc @@ -0,0 +1,105 @@ + array('tinc'), + 'remote' => 'vpn', + ); + + return $logfacilities; +} + +function if_tinc_services() +{ + global $config; + + $services = array(); + $is_enabled = false; + if (isset($config['OPNsense']['proxy']['general']['enabled']) && $config['OPNsense']['proxy']['general']['enabled'] == 1) { + if (isset($config['OPNsense']['Tinc']['networks']['network'])) { + if (!isset($config['OPNsense']['Tinc']['networks']['network'][0])) { + $networks = array($config['OPNsense']['Tinc']['networks']['network']); + } else { + $networks = $config['OPNsense']['Tinc']['networks']['network']; + } + foreach ($networks as $network) { + if (!empty($network['enabled'])) { + $is_enabled = true; + break; + } + } + } + } + + if ($is_enabled) { + $services[] = array( + 'description' => gettext('Tinc server'), + 'configd' => array( + 'restart' => array('tinc restart'), + 'start' => array('tinc start'), + 'stop' => array('tinc stop'), + ), + 'name' => 'tincd', + ); + } + + return $services; +} + +function if_tinc_interfaces() +{ + global $config; + + $interfaces = array(); + + if (isset($config['OPNsense']['Tinc']['networks']['network'])) { + if (!isset($config['OPNsense']['Tinc']['networks']['network'][0])) { + $networks = array($config['OPNsense']['Tinc']['networks']['network']); + } else { + $networks = $config['OPNsense']['Tinc']['networks']['network']; + } + foreach ($networks as $network) { + if (!empty($network['enabled'])) { + $oic = array('enable' => true); + $oic['if'] = 'tinc'; + $oic['descr'] = 'TincVPN'; + $oic['type'] = 'none'; + $oic['virtual'] = true; + $oic['networks'] = array(); + $interfaces['tinc'] = $oic; + break; + } + } + } + + return $interfaces; +} diff --git a/net/tinc/src/etc/rc.d/opnsense-tincd b/net/tinc/src/etc/rc.d/opnsense-tincd new file mode 100755 index 000000000..1e3362ce4 --- /dev/null +++ b/net/tinc/src/etc/rc.d/opnsense-tincd @@ -0,0 +1,31 @@ +#!/bin/sh +# +# $FreeBSD$ +# +# PROVIDE: tincd +# REQUIRE: SERVERS +# KEYWORD: shutdown +# + +. /etc/rc.subr + +name=opnsense-tincd + +stop_cmd=tincd_stop +start_cmd=tincd_start + +# stop tincd +tincd_stop() +{ + echo "stopping tincd" + /usr/local/opnsense/scripts/OPNsense/Tinc/tincd.py stop +} + +# start tincd +tincd_start() +{ + echo "starting tincd" + /usr/local/opnsense/scripts/OPNsense/Tinc/tincd.py start +} + +run_rc_command $1 diff --git a/net/tinc/src/opnsense/mvc/app/controllers/OPNsense/Tinc/Api/ServiceController.php b/net/tinc/src/opnsense/mvc/app/controllers/OPNsense/Tinc/Api/ServiceController.php index 1ed8d1916..0da9416a3 100644 --- a/net/tinc/src/opnsense/mvc/app/controllers/OPNsense/Tinc/Api/ServiceController.php +++ b/net/tinc/src/opnsense/mvc/app/controllers/OPNsense/Tinc/Api/ServiceController.php @@ -37,7 +37,6 @@ use \OPNsense\Core\Backend; */ class ServiceController extends ApiControllerBase { - /** * reconfigure captive portal */ @@ -53,4 +52,49 @@ class ServiceController extends ApiControllerBase return array("status" => "failed"); } } + + /** + * start tinc service (in background) + * @return array + */ + public function startAction() + { + if ($this->request->isPost()) { + $backend = new Backend(); + $response = $backend->configdRun("tinc start", true); + return array("response" => $response); + } else { + return array("response" => array()); + } + } + + /** + * stop tinc service + * @return array + */ + public function stopAction() + { + if ($this->request->isPost()) { + $backend = new Backend(); + $response = $backend->configdRun("tinc stop"); + return array("response" => $response); + } else { + return array("response" => array()); + } + } + + /** + * restart tinc service + * @return array + */ + public function restartAction() + { + if ($this->request->isPost()) { + $backend = new Backend(); + $response = $backend->configdRun("tinc restart"); + return array("response" => $response); + } else { + return array("response" => array()); + } + } } diff --git a/net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/ACL/ACL.xml b/net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/ACL/ACL.xml new file mode 100644 index 000000000..91fe58bcd --- /dev/null +++ b/net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/ACL/ACL.xml @@ -0,0 +1,11 @@ + + + + WebCfg - VPN: Tinc configuration + Allow access to the 'VPN: Tinc' page. + + ui/tinc/* + api/tinc/* + + + diff --git a/net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Menu/Menu.xml b/net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Menu/Menu.xml new file mode 100644 index 000000000..6a8592eaf --- /dev/null +++ b/net/tinc/src/opnsense/mvc/app/models/OPNsense/Tinc/Menu/Menu.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/net/tinc/src/opnsense/mvc/app/views/OPNsense/Tinc/index.volt b/net/tinc/src/opnsense/mvc/app/views/OPNsense/Tinc/index.volt index 54f806f02..9f0fa9917 100644 --- a/net/tinc/src/opnsense/mvc/app/views/OPNsense/Tinc/index.volt +++ b/net/tinc/src/opnsense/mvc/app/views/OPNsense/Tinc/index.volt @@ -74,6 +74,8 @@ POSSIBILITY OF SUCH DAMAGE. message: data['status'], draggable: true }); + } else { + ajaxCall(url="/api/tinc/service/restart", sendData={}); } }); }); diff --git a/net/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py b/net/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py index a5047d32c..6015719fa 100755 --- a/net/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py +++ b/net/tinc/src/opnsense/scripts/OPNsense/Tinc/tincd.py @@ -76,11 +76,11 @@ def deploy(config_filename): tmp = network.privkey() write_file(tmp['filename'], tmp['content']) - # write if-up file + # write tinc-up file if_up = list() if_up.append("#!/bin/sh") if_up.append("ifconfig %s %s " % (interface_name, pipes.quote(network.get_local_address()))) - write_file("%s/if-up" % network.get_basepath(), '\n'.join(if_up) + "\n", 0o700) + write_file("%s/tinc-up" % network.get_basepath(), '\n'.join(if_up) + "\n", 0o700) # configure and rename new tun device, place all in group "tinc" symlink associated tun device if interface_name not in interfaces: diff --git a/net/tinc/src/opnsense/service/conf/actions.d/actions_tinc.conf b/net/tinc/src/opnsense/service/conf/actions.d/actions_tinc.conf new file mode 100644 index 000000000..522bdabbd --- /dev/null +++ b/net/tinc/src/opnsense/service/conf/actions.d/actions_tinc.conf @@ -0,0 +1,23 @@ +[gen-key] +command:/usr/local/opnsense/scripts/OPNsense/Tinc/generate_keypair.py +parameters: +type:script_output +message:generate new keypair + +[stop] +command:/usr/local/etc/rc.d/opnsense-tincd stop +parameters: +type:script +message:stop tincd + +[start] +command:/usr/local/etc/rc.d/opnsense-tincd start +parameters: +type:script +message:start tincd + +[restart] +command:/usr/local/etc/rc.d/opnsense-tincd restart +parameters: +type:script +message:restart tincd diff --git a/net/tinc/src/opnsense/service/templates/OPNsense/Tinc/+TARGETS b/net/tinc/src/opnsense/service/templates/OPNsense/Tinc/+TARGETS index fd832e540..bcc05dd49 100644 --- a/net/tinc/src/opnsense/service/templates/OPNsense/Tinc/+TARGETS +++ b/net/tinc/src/opnsense/service/templates/OPNsense/Tinc/+TARGETS @@ -1 +1,2 @@ tinc_deploy.xml:/usr/local/etc/tinc_deploy.xml +rc.conf.d:/etc/rc.conf.d/opnsense-tincd diff --git a/net/tinc/src/opnsense/service/templates/OPNsense/Tinc/rc.conf.d b/net/tinc/src/opnsense/service/templates/OPNsense/Tinc/rc.conf.d new file mode 100644 index 000000000..ade8376cd --- /dev/null +++ b/net/tinc/src/opnsense/service/templates/OPNsense/Tinc/rc.conf.d @@ -0,0 +1,11 @@ +{% set networks = [] %} +{% for network in helpers.toList('OPNsense.Tinc.networks.network') %} +{% if network.enabled == '1' %} +{% do networks.append(network) %} +{% endif %} +{% endfor %} +{% if networks|length > 0 %} +OPNtincd_enable=YES +{% else %} +OPNtincd_enable=NO +{% endif %}