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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 z zcJAZzs}I&3Hsa|Pi zQc_bFa7H;hJ1Z}|z@^U1%iG)HB)p}qtA@CP(H{o zDJjlYwG8a~Sk^9FxNu@XM$@$m7cO{cm_W5NU0By51zP0WGL15WD0Ih=*8bmqR`eyW V#RpH`V_;xl@O1TaS?83{1OOt`P^SO@ 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