From e066418fcff38f698963497c2d5ee9f8ef9d40a7 Mon Sep 17 00:00:00 2001 From: CvH Date: Fri, 26 Apr 2019 21:16:34 +0200 Subject: [PATCH 1/3] json-c: initial package --- .../addon-depends/ttyd-depends/json-c/package.mk | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 packages/addons/addon-depends/ttyd-depends/json-c/package.mk diff --git a/packages/addons/addon-depends/ttyd-depends/json-c/package.mk b/packages/addons/addon-depends/ttyd-depends/json-c/package.mk new file mode 100644 index 0000000000..4a6df9200b --- /dev/null +++ b/packages/addons/addon-depends/ttyd-depends/json-c/package.mk @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright (C) 2010-2011 Roman Weber (roman@openelec.tv) +# Copyright (C) 2009-2016 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="json-c" +PKG_VERSION="3e81b4abe359c8128bb2b4127f4e8c8c057fb004" +PKG_SHA256="85569b581e8ff0999de5a43a65332559df3aa386e757d76ac8a4915eb4fb783a" +PKG_LICENSE="MIT" +PKG_SITE="https://github.com/json-c/json-c" +PKG_URL="https://github.com/json-c/json-c/archive/$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain" +PKG_LONGDESC="Implements a reference counting object model that allows you to easily construct JSON objects in C." From 22bf53e384e42f4b52147c684dddd20b174e2f32 Mon Sep 17 00:00:00 2001 From: CvH Date: Fri, 26 Apr 2019 21:16:34 +0200 Subject: [PATCH 2/3] libwebsockets: initial package --- .../ttyd-depends/libwebsockets/package.mk | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 packages/addons/addon-depends/ttyd-depends/libwebsockets/package.mk diff --git a/packages/addons/addon-depends/ttyd-depends/libwebsockets/package.mk b/packages/addons/addon-depends/ttyd-depends/libwebsockets/package.mk new file mode 100644 index 0000000000..f1e63d2c6e --- /dev/null +++ b/packages/addons/addon-depends/ttyd-depends/libwebsockets/package.mk @@ -0,0 +1,11 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="libwebsockets" +PKG_VERSION="3.1.0" +PKG_SHA256="db948be74c78fc13f1f1a55e76707d7baae3a1c8f62b625f639e8f2736298324" +PKG_LICENSE="LGPL2+" +PKG_SITE="https://libwebsockets.org" +PKG_URL="https://github.com/warmcat/libwebsockets/archive/v$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain openssl json-c" +PKG_LONGDESC="Library for implementing network protocols with a tiny footprint." From 8ad1a514843b470eb4091346dd54b7a8004b1ba6 Mon Sep 17 00:00:00 2001 From: CvH Date: Fri, 26 Apr 2019 21:16:34 +0200 Subject: [PATCH 3/3] ttyd: initial package --- packages/addons/service/ttyd/changelog.txt | 2 ++ packages/addons/service/ttyd/icon/icon.png | Bin 0 -> 30564 bytes packages/addons/service/ttyd/package.mk | 28 ++++++++++++++++++ .../addons/service/ttyd/source/bin/ttyd.start | 18 +++++++++++ .../addons/service/ttyd/source/default.py | 20 +++++++++++++ .../resources/language/English/strings.po | 19 ++++++++++++ .../ttyd/source/resources/settings.xml | 7 +++++ .../service/ttyd/source/settings-default.xml | 4 +++ .../ttyd/source/system.d/service.ttyd.service | 14 +++++++++ 9 files changed, 112 insertions(+) create mode 100644 packages/addons/service/ttyd/changelog.txt create mode 100644 packages/addons/service/ttyd/icon/icon.png create mode 100644 packages/addons/service/ttyd/package.mk create mode 100755 packages/addons/service/ttyd/source/bin/ttyd.start create mode 100644 packages/addons/service/ttyd/source/default.py create mode 100644 packages/addons/service/ttyd/source/resources/language/English/strings.po create mode 100644 packages/addons/service/ttyd/source/resources/settings.xml create mode 100644 packages/addons/service/ttyd/source/settings-default.xml create mode 100644 packages/addons/service/ttyd/source/system.d/service.ttyd.service diff --git a/packages/addons/service/ttyd/changelog.txt b/packages/addons/service/ttyd/changelog.txt new file mode 100644 index 0000000000..939a143a03 --- /dev/null +++ b/packages/addons/service/ttyd/changelog.txt @@ -0,0 +1,2 @@ +100 +- initial LibreELEC version diff --git a/packages/addons/service/ttyd/icon/icon.png b/packages/addons/service/ttyd/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9cb07fc51b966f8d151e0d46969cf742c33f2bda GIT binary patch literal 30564 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 WiiJJHE8vH3p%mV#%G5}ihWtMw)KI4Y literal 0 HcmV?d00001 diff --git a/packages/addons/service/ttyd/package.mk b/packages/addons/service/ttyd/package.mk new file mode 100644 index 0000000000..588adefb71 --- /dev/null +++ b/packages/addons/service/ttyd/package.mk @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="ttyd" +PKG_VERSION="1.4.4" +PKG_SHA256="b910a33ddaa474c369991ba345187a8a2f4aa420389083671ba3a6c305a491d6" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="MIT" +PKG_SITE="https://github.com/tsl0922/ttyd" +PKG_URL="https://github.com/tsl0922/ttyd/archive/$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain libwebsockets" +PKG_SECTION="service" +PKG_SHORTDESC="ttyd: a tool for accessing the terminal over a browser" +PKG_LONGDESC="ttyd ($PKG_VERSION): is a simple command-line tool for sharing terminal over the web" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="Web SSH Terminal" +PKG_ADDON_TYPE="xbmc.service" + +addon() { + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin + cp -P $PKG_BUILD/.install_pkg/usr/bin/ttyd $ADDON_BUILD/$PKG_ADDON_ID/bin + + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -p $(get_build_dir json-c)/.install_pkg/usr/lib/libjson-c.so $ADDON_BUILD/$PKG_ADDON_ID/lib + cp -p $(get_build_dir libwebsockets)/.install_pkg/usr/lib/libwebsockets.so.14 $ADDON_BUILD/$PKG_ADDON_ID/lib +} diff --git a/packages/addons/service/ttyd/source/bin/ttyd.start b/packages/addons/service/ttyd/source/bin/ttyd.start new file mode 100755 index 0000000000..7387840cd1 --- /dev/null +++ b/packages/addons/service/ttyd/source/bin/ttyd.start @@ -0,0 +1,18 @@ +#!/bin/sh + +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) + +. /etc/profile + +oe_setup_addon service.ttyd + +chmod a+x $ADDON_DIR/bin/* + +if [ "$TTYD_NOLOGIN" = "true" ]; then + TTYD_NOLOGIN="bash" +elif [ "$TTYD_NOLOGIN" = "false" ]; then + TTYD_NOLOGIN="login root" +fi + +exec $ADDON_DIR/bin/ttyd -O -T xterm -p ${TTYD_WEBPORT} ${TTYD_NOLOGIN} &>$ADDON_HOME/service.log diff --git a/packages/addons/service/ttyd/source/default.py b/packages/addons/service/ttyd/source/default.py new file mode 100644 index 0000000000..67246d4782 --- /dev/null +++ b/packages/addons/service/ttyd/source/default.py @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2019-present Team LibreELEC (https://libreelec.tv) + +import subprocess +import xbmc +import xbmcaddon + + +class Monitor(xbmc.Monitor): + + def __init__(self, *args, **kwargs): + xbmc.Monitor.__init__(self) + self.id = xbmcaddon.Addon().getAddonInfo('id') + + def onSettingsChanged(self): + subprocess.call(['systemctl', 'restart', self.id]) + + +if __name__ == "__main__": + Monitor().waitForAbort() diff --git a/packages/addons/service/ttyd/source/resources/language/English/strings.po b/packages/addons/service/ttyd/source/resources/language/English/strings.po new file mode 100644 index 0000000000..c32fd1f44e --- /dev/null +++ b/packages/addons/service/ttyd/source/resources/language/English/strings.po @@ -0,0 +1,19 @@ +# Kodi Media Center language file +# Addon Name: ttyd +# Addon id: service.ttyd +# Addon Provider: Team LibreELEC +msgid "" +msgstr "" + +msgctxt "#30000" +msgid "Settings" +msgstr "" + +msgctxt "#30001" +msgid "Webui Port" +msgstr "" + +msgctxt "#30002" +msgid "[COLOR FFFF0000][SECURITY RISK][/COLOR] Allow usage without password" +msgstr "" + diff --git a/packages/addons/service/ttyd/source/resources/settings.xml b/packages/addons/service/ttyd/source/resources/settings.xml new file mode 100644 index 0000000000..ebfca1f73a --- /dev/null +++ b/packages/addons/service/ttyd/source/resources/settings.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/packages/addons/service/ttyd/source/settings-default.xml b/packages/addons/service/ttyd/source/settings-default.xml new file mode 100644 index 0000000000..ffc4900c4e --- /dev/null +++ b/packages/addons/service/ttyd/source/settings-default.xml @@ -0,0 +1,4 @@ + + false + 11111 + diff --git a/packages/addons/service/ttyd/source/system.d/service.ttyd.service b/packages/addons/service/ttyd/source/system.d/service.ttyd.service new file mode 100644 index 0000000000..cd65602731 --- /dev/null +++ b/packages/addons/service/ttyd/source/system.d/service.ttyd.service @@ -0,0 +1,14 @@ +[Unit] +Description=ttyd +After=graphical.target + +[Service] +ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.ttyd/bin/ttyd.start" +TimeoutStopSec=1 +Restart=always +RestartSec=2 +StartLimitInterval=0 +Type=forking + +[Install] +WantedBy=kodi.target