From 287e2dbcbe4b5d25e8cbe527e75c8af101bf18fd Mon Sep 17 00:00:00 2001 From: jc Date: Fri, 29 Apr 2016 19:23:23 +0200 Subject: [PATCH] tinc: initial addon --- packages/addons/service/tinc/changelog.txt | 2 + packages/addons/service/tinc/icon/icon.png | Bin 0 -> 19866 bytes packages/addons/service/tinc/package.mk | 59 ++++++++++++ .../addons/service/tinc/source/bin/subnet-up | 18 ++++ .../service/tinc/source/bin/tinc-service | 81 ++++++++++++++++ .../addons/service/tinc/source/bin/tinc-up | 2 + .../addons/service/tinc/source/default.py | 88 ++++++++++++++++++ .../resources/language/English/strings.po | 70 ++++++++++++++ .../tinc/source/resources/settings.xml | 24 +++++ .../service/tinc/source/settings-default.xml | 11 +++ .../system.d/service.system.tinc.service | 13 +++ 11 files changed, 368 insertions(+) create mode 100755 packages/addons/service/tinc/changelog.txt create mode 100644 packages/addons/service/tinc/icon/icon.png create mode 100644 packages/addons/service/tinc/package.mk create mode 100755 packages/addons/service/tinc/source/bin/subnet-up create mode 100644 packages/addons/service/tinc/source/bin/tinc-service create mode 100755 packages/addons/service/tinc/source/bin/tinc-up create mode 100644 packages/addons/service/tinc/source/default.py create mode 100644 packages/addons/service/tinc/source/resources/language/English/strings.po create mode 100644 packages/addons/service/tinc/source/resources/settings.xml create mode 100644 packages/addons/service/tinc/source/settings-default.xml create mode 100644 packages/addons/service/tinc/source/system.d/service.system.tinc.service diff --git a/packages/addons/service/tinc/changelog.txt b/packages/addons/service/tinc/changelog.txt new file mode 100755 index 0000000000..9455e1f3c8 --- /dev/null +++ b/packages/addons/service/tinc/changelog.txt @@ -0,0 +1,2 @@ +8.0.100 +- Initial addon diff --git a/packages/addons/service/tinc/icon/icon.png b/packages/addons/service/tinc/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..112b784f83af5aa432f539577fb053d9dc10b4af GIT binary patch literal 19866 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 literal 0 HcmV?d00001 diff --git a/packages/addons/service/tinc/package.mk b/packages/addons/service/tinc/package.mk new file mode 100644 index 0000000000..c06f39baaa --- /dev/null +++ b/packages/addons/service/tinc/package.mk @@ -0,0 +1,59 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016 Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +PKG_NAME="tinc" +PKG_VERSION="1.1pre12" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="GPLv2" +PKG_SITE="http://www.tinc-vpn.org/" +PKG_URL="${PKG_SITE}/packages/$PKG_NAME-$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain libressl lzo" +PKG_PRIORITY="optional" +PKG_SECTION="service/system" +PKG_SHORTDESC="tinc Virtual Private Network Daemon" +PKG_LONGDESC="tinc is a virtual private network (VPN) daemon that uses tunnelling and encryption to create a secure private network between hosts on the Internet. Because the VPN appears to the IP level network code as a normal network device, there is no need to adapt any existing software. This allows VPN sites to share information with each other over the Internet without exposing any information to others." + +PKG_AUTORECONF="yes" + +PKG_IS_ADDON="yes" +PKG_ADDON_TYPE="xbmc.service" +PKG_ADDON_PROVIDES="" +PKG_ADDON_REPOVERSION="8.0" +PKG_MAINTAINER="Anton Voyl (awiouy at gmail dot com)" + +PKG_CONFIGURE_OPTS_TARGET="--disable-curses \ + --disable-readline \ + --sysconfdir=/storage/.cache" + +pre_configure_target() { + # tinc fails to build in subdirs + cd $ROOT/$PKG_BUILD + rm -rf .$TARGET_NAME +} + +makeinstall_target() { + : +} + +addon() { + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin + cp $PKG_BUILD/src/tinc \ + $PKG_BUILD/src/tincd \ + $ADDON_BUILD/$PKG_ADDON_ID/bin +} diff --git a/packages/addons/service/tinc/source/bin/subnet-up b/packages/addons/service/tinc/source/bin/subnet-up new file mode 100755 index 0000000000..1a5cbdf504 --- /dev/null +++ b/packages/addons/service/tinc/source/bin/subnet-up @@ -0,0 +1,18 @@ +#!/bin/sh +. /etc/profile +oe_setup_addon service.system.tinc + +case "$SUBNET" in + ??:??:??:??:??:??) + : + ;; + *) + if [ "$NAME" == "$NODE" ] + then + ip addr replace "$SUBNET/$tinc_mask" dev "$INTERFACE" + elif [ "$tinc_mask" == "32" ] + then + ip route replace "$SUBNET" dev "$INTERFACE" + fi + ;; +esac diff --git a/packages/addons/service/tinc/source/bin/tinc-service b/packages/addons/service/tinc/source/bin/tinc-service new file mode 100644 index 0000000000..0901a54331 --- /dev/null +++ b/packages/addons/service/tinc/source/bin/tinc-service @@ -0,0 +1,81 @@ +#!/bin/sh +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016 Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ + +. /etc/profile +oe_setup_addon service.system.tinc + +config="$ADDON_HOME/.config" +dev="vmnetz" +host="$ADDON_HOME/Host" +hosts="$ADDON_HOME/Hosts" + +rm -rf "$host" +rm -f "$hosts" + +if [ -z "$tinc_name" ] +then + rm -rf "$config" + exit 0 +fi + +read_name="$(tinc -c $config get name)" + +if [ "$read_name" != "$tinc_name" ] +then + rm -rf "$config" + tinc -c "$config" init "$tinc_name" +fi + +mkdir -p "$host" +ln -s "$config/hosts/$tinc_name" "$host/$tinc_name" +ln -nsf "$config/hosts" "$hosts" + +for var in address port subnet +do + eval "tinc_var=\$tinc_$var" + if [ -z "$tinc_var" ] + then + tinc -c "$config" del "$var" + else + tinc -c "$config" set "$var" "$tinc_var" + fi +done + +cp "$ADDON_DIR/bin/subnet-up" \ + "$ADDON_DIR/bin/tinc-up" \ + "$config" + +case "$tinc_subnets" in + "default") + subnets="" + ;; + "strict subnets") + subnets="-o StrictSubnets=yes" + ;; + "tunnel server") + subnets="-o TunnelServer=yes" + ;; +esac + +tincd -c "$config" \ + -n "$dev" \ + -o AutoConnect=yes \ + -o LocalDiscovery=yes \ + -o mode="$tinc_mode" \ + $subnets diff --git a/packages/addons/service/tinc/source/bin/tinc-up b/packages/addons/service/tinc/source/bin/tinc-up new file mode 100755 index 0000000000..396cfd071c --- /dev/null +++ b/packages/addons/service/tinc/source/bin/tinc-up @@ -0,0 +1,2 @@ +#!/bin/sh +ip link set up dev "$INTERFACE" diff --git a/packages/addons/service/tinc/source/default.py b/packages/addons/service/tinc/source/default.py new file mode 100644 index 0000000000..c7cb3a4f32 --- /dev/null +++ b/packages/addons/service/tinc/source/default.py @@ -0,0 +1,88 @@ +################################################################################ +# This file is part of LibreELEC - https://libreelec.tv +# Copyright (C) 2016 Team LibreELEC +# +# LibreELEC is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. +# +# LibreELEC is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with LibreELEC. If not, see . +################################################################################ +import os.path +import random +import socket +import struct +import subprocess +import urllib2 +import xbmc +import xbmcaddon + + +ADDON = xbmcaddon.Addon() +ID = ADDON.getAddonInfo('id') +PATH = ADDON.getAddonInfo('path') +TINC = os.path.join(PATH, 'bin', 'tinc') + +def run_code(cmd, *argv): + return subprocess.call(cmd.format(*argv).split()) + +def run_lines(cmd, *argv): + try: + return subprocess.check_output(cmd.format(*argv).split()).splitlines() + except subprocess.CalledProcessError: + return [] + + +class Monitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self) + + def onSettingsChanged(self): + run_code('systemctl restart {}'.format(ID)) + + +if __name__ == '__main__': + for network in run_lines('{} network', TINC): + run_code('{} -n {} start', TINC, network) + + if ADDON.getSetting('tinc_wizard') == 'true': + try: + ip = urllib2.urlopen('http://ip.42.pl/raw').read() + address = socket.gethostbyaddr(ip)[0] + ADDON.setSetting('tinc_address', address) + except: + pass + + network, mask = '10.0.0.0/8'.split('/') + mask = 2 ** (32 - int(mask)) - 1 + network = struct.unpack('!L', socket.inet_aton(network))[0] & -mask + ip = network + random.randint(1, mask - 1) + name = format(ip, '08x') + subnet = socket.inet_ntoa(struct.pack('!L', ip)) + ADDON.setSetting('tinc_name', name) + ADDON.setSetting('tinc_subnet', subnet) + + port = int(ADDON.getSetting('tinc_port')) + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + try: + s.bind(('', port)) + s.close() + except socket.error: + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.bind(('', 0)) + a, port = s.getsockname() + s.close() + ADDON.setSetting('tinc_port', str(port)) + + ADDON.setSetting('tinc_wizard', 'false') + run_code('systemctl restart {}'.format(ID)) + + Monitor().waitForAbort() diff --git a/packages/addons/service/tinc/source/resources/language/English/strings.po b/packages/addons/service/tinc/source/resources/language/English/strings.po new file mode 100644 index 0000000000..82efcf4fdf --- /dev/null +++ b/packages/addons/service/tinc/source/resources/language/English/strings.po @@ -0,0 +1,70 @@ +# Kodi Media Center language file +# Addon Name: tinc +# Addon id: service.system.tinc +# Addon Provider: awiouy at gmail dot com +msgid "" +msgstr "" + +msgctxt "#30000" +msgid "Configuration" +msgstr "" + +msgctxt "#30001" +msgid "Virtual Private Network" +msgstr "" + +msgctxt "#30002" +msgid "Name" +msgstr "" + +msgctxt "#30003" +msgid "Subnet" +msgstr "" + +msgctxt "#30004" +msgid "Mask" +msgstr "" + +msgctxt "#30005" +msgid "Mode" +msgstr "" + +msgctxt "#30006" +msgid "Subnet Discovery" +msgstr "" + +msgctxt "#30007" +msgid "Public Network" +msgstr "" + +msgctxt "#30008" +msgid "Address" +msgstr "" + +msgctxt "#30009" +msgid "Port" +msgstr "" + +msgctxt "#30010" +msgid "Instructions" +msgstr "" + +msgctxt "#30011" +msgid "1. Configure local node (see tinc-vpn.org/documentation-1.1)" +msgstr "" + +msgctxt "#30012" +msgid "2. Enable port forwarding on your router (see e.g. portforward.com)" +msgstr "" + +msgctxt "#30013" +msgid "3. Distribute local host file from userdata/addon_data/service.system.tinc/Host" +msgstr "" + +msgctxt "#30014" +msgid "4. Collect remote host files in userdata/addon_data/service.system.tinc/Hosts" +msgstr "" + +msgctxt "#30015" +msgid "5. Restart tinc to load remote host files" +msgstr "" diff --git a/packages/addons/service/tinc/source/resources/settings.xml b/packages/addons/service/tinc/source/resources/settings.xml new file mode 100644 index 0000000000..c9919ea0ac --- /dev/null +++ b/packages/addons/service/tinc/source/resources/settings.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/addons/service/tinc/source/settings-default.xml b/packages/addons/service/tinc/source/settings-default.xml new file mode 100644 index 0000000000..38d2d1c812 --- /dev/null +++ b/packages/addons/service/tinc/source/settings-default.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/packages/addons/service/tinc/source/system.d/service.system.tinc.service b/packages/addons/service/tinc/source/system.d/service.system.tinc.service new file mode 100644 index 0000000000..59f6f7f125 --- /dev/null +++ b/packages/addons/service/tinc/source/system.d/service.system.tinc.service @@ -0,0 +1,13 @@ +[Unit] +Description=tinc for LibreELEC +Documentation=http://tinc-vpn.org/docs/ +After=network-online.target +Requires=network-online.target + +[Service] +Type=forking +ExecStart=/bin/sh /storage/.kodi/addons/service.system.tinc/bin/tinc-service +Restart=on-failure + +[Install] +WantedBy=kodi.target