From 47eb715e7638e4a346a27c4153f0d09d3f3c5dcb Mon Sep 17 00:00:00 2001 From: cvh Date: Wed, 7 Dec 2016 12:30:17 +0100 Subject: [PATCH] proftpd: initial add-on --- .../addons/addon-depends/whois/package.mk | 42 ++++++ packages/addons/service/proftpd/changelog.txt | 2 + packages/addons/service/proftpd/icon/icon.png | Bin 0 -> 27208 bytes packages/addons/service/proftpd/package.mk | 78 ++++++++++ .../proftpd/patches/proftpd-100-llu.patch | 18 +++ .../service/proftpd/source/bin/proftpd.start | 135 ++++++++++++++++++ .../addons/service/proftpd/source/default.py | 35 +++++ .../service/proftpd/source/etc/openssl.cnf | 12 ++ .../service/proftpd/source/etc/proftpd.conf | 60 ++++++++ .../resources/language/English/strings.xml | 50 +++++++ .../proftpd/source/resources/settings.xml | 61 ++++++++ .../proftpd/source/settings-default.xml | 43 ++++++ .../source/system.d/service.proftpd.service | 14 ++ 13 files changed, 550 insertions(+) create mode 100644 packages/addons/addon-depends/whois/package.mk create mode 100644 packages/addons/service/proftpd/changelog.txt create mode 100644 packages/addons/service/proftpd/icon/icon.png create mode 100644 packages/addons/service/proftpd/package.mk create mode 100644 packages/addons/service/proftpd/patches/proftpd-100-llu.patch create mode 100755 packages/addons/service/proftpd/source/bin/proftpd.start create mode 100644 packages/addons/service/proftpd/source/default.py create mode 100644 packages/addons/service/proftpd/source/etc/openssl.cnf create mode 100644 packages/addons/service/proftpd/source/etc/proftpd.conf create mode 100644 packages/addons/service/proftpd/source/resources/language/English/strings.xml create mode 100644 packages/addons/service/proftpd/source/resources/settings.xml create mode 100644 packages/addons/service/proftpd/source/settings-default.xml create mode 100644 packages/addons/service/proftpd/source/system.d/service.proftpd.service diff --git a/packages/addons/addon-depends/whois/package.mk b/packages/addons/addon-depends/whois/package.mk new file mode 100644 index 0000000000..140d203e34 --- /dev/null +++ b/packages/addons/addon-depends/whois/package.mk @@ -0,0 +1,42 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2011 Stephan Raue (stephan@openelec.tv) +# +# This Program 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, or (at your option) +# any later version. +# +# This Program 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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="whois" +PKG_VERSION="5.2.13" +PKG_REV="1" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.linux.it/~md/software/" +PKG_URL="https://github.com/rfc1036/whois/archive/v${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain" +PKG_SECTION="system" +PKG_SHORTDESC="whois is a client-side application which queries the whois directory service for information pertaining to a particular domain name." +PKG_LONGDESC="whois is a client-side application which queries the whois directory service for information pertaining to a particular domain name." + +PKG_IS_ADDON="no" +PKG_AUTORECONF="no" + +make_target() { + make mkpasswd +} + +makeinstall_target() { + : # nop +} diff --git a/packages/addons/service/proftpd/changelog.txt b/packages/addons/service/proftpd/changelog.txt new file mode 100644 index 0000000000..7b56342737 --- /dev/null +++ b/packages/addons/service/proftpd/changelog.txt @@ -0,0 +1,2 @@ +100 +- initial LibreELEC release \ No newline at end of file diff --git a/packages/addons/service/proftpd/icon/icon.png b/packages/addons/service/proftpd/icon/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..ff0e0a50376a53c55270cc2d7052e61aa466f54a GIT binary patch literal 27208 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%0A%~c}%44FMM9k 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 X3{UAgeiH-p-<)#NU!}eSjYI!GbS2dS literal 0 HcmV?d00001 diff --git a/packages/addons/service/proftpd/package.mk b/packages/addons/service/proftpd/package.mk new file mode 100644 index 0000000000..9bec2884d0 --- /dev/null +++ b/packages/addons/service/proftpd/package.mk @@ -0,0 +1,78 @@ +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2015 Stephan Raue (stephan@openelec.tv) +# +# This Program 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, or (at your option) +# any later version. +# +# This Program 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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +PKG_NAME="proftpd" +PKG_VERSION="1.3.5b" +PKG_REV="100" +PKG_ARCH="any" +PKG_LICENSE="GPL" +PKG_SITE="http://www.proftpd.org/" +PKG_URL="https://github.com/proftpd/proftpd/archive/v$PKG_VERSION.tar.gz" +PKG_DEPENDS_TARGET="toolchain libcap libressl netbsd-curses pcre whois" +PKG_SECTION="service" +PKG_SHORTDESC="ProFTPD: a FTP server for linux" +PKG_LONGDESC="ProFTPD ($PKG_VERSION): is a secure and configurable FTP server with SSL/TLS support" +PKG_AUTORECONF="no" + +PKG_IS_ADDON="yes" +PKG_ADDON_NAME="ProFTPD Server" +PKG_ADDON_TYPE="xbmc.service" + +ADDON_DIR="/storage/.kodi/addons/service.proftpd" + +PKG_CONFIGURE_OPTS_TARGET="--enable-static \ + --enable-openssl \ + --with-modules=mod_tls \ + --enable-nls \ + --localedir=$ADDON_DIR/locale \ + --enable-sendfile \ + --enable-facl \ + --enable-autoshadow \ + --enable-ctrls \ + --enable-ipv6 \ + --enable-nls \ + --enable-pcre \ + --enable-largefile" + +pre_build_target() { + mkdir -p $PKG_BUILD/.$TARGET_NAME + cp -RP $PKG_BUILD/* $PKG_BUILD/.$TARGET_NAME +} + +pre_configure_target() { + export CFLAGS="$CFLAGS -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I$SYSROOT_PREFIX/usr/include/ncurses -I$ROOT/$PKG_BUILD/.$TARGET_NAME/include/" + export LDFLAGS="$LDFLAGS -L$ROOT/$PKG_BUILD/.$TARGET_NAME/lib" +} + +makeinstall_target() { + : # nop +} + +addon() { + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/bin + cp $PKG_BUILD/.$TARGET_NAME/proftpd $ADDON_BUILD/$PKG_ADDON_ID/bin + cp $PKG_BUILD/.$TARGET_NAME/ftpwho $ADDON_BUILD/$PKG_ADDON_ID/bin + cp $PKG_BUILD/.$TARGET_NAME/ftptop $ADDON_BUILD/$PKG_ADDON_ID/bin + + cp $BUILD/whois*/mkpasswd $ADDON_BUILD/$PKG_ADDON_ID/bin + + mkdir -p $ADDON_BUILD/$PKG_ADDON_ID/locale + cp $PKG_BUILD/.$TARGET_NAME/locale/* $ADDON_BUILD/$PKG_ADDON_ID/locale +} diff --git a/packages/addons/service/proftpd/patches/proftpd-100-llu.patch b/packages/addons/service/proftpd/patches/proftpd-100-llu.patch new file mode 100644 index 0000000000..d491f49ad5 --- /dev/null +++ b/packages/addons/service/proftpd/patches/proftpd-100-llu.patch @@ -0,0 +1,18 @@ +diff -urN proftpd-1.3.4d-org/include/conf.h proftpd-1.3.4d-new/include/conf.h +--- proftpd-1.3.4d-org/include/conf.h 2011-05-23 22:35:35.000000000 +0200 ++++ proftpd-1.3.4d-new/include/conf.h 2013-07-20 12:25:28.000000000 +0200 +@@ -360,13 +360,9 @@ + + #endif + +-#if defined(HAVE_LLU) && SIZEOF_OFF_T == 8 ++/* correctly show file size larger than 2GB */ + # define PR_LU "llu" + # define pr_off_t unsigned long long +-#else +-# define PR_LU "lu" +-# define pr_off_t unsigned long +-#endif + + /******************************************************************** + * This is NOT the user configurable section. Look in options.h diff --git a/packages/addons/service/proftpd/source/bin/proftpd.start b/packages/addons/service/proftpd/source/bin/proftpd.start new file mode 100755 index 0000000000..58a324bc79 --- /dev/null +++ b/packages/addons/service/proftpd/source/bin/proftpd.start @@ -0,0 +1,135 @@ +#!/bin/sh + +################################################################################ +# This file is part of OpenELEC - http://www.openelec.tv +# Copyright (C) 2009-2013 Stephan Raue (stephan@openelec.tv) +# Copyright (C) 2012 x23 +# Copyright (C) 2012-2015 ultraman +# +# This Program 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, or (at your option) +# any later version. +# +# This Program 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 OpenELEC.tv; see the file COPYING. If not, write to +# the Free Software Foundation, 51 Franklin Street, Suite 500, Boston, MA 02110, USA. +# http://www.gnu.org/copyleft/gpl.html +################################################################################ + +. /etc/profile + +mkdir -p "/storage/.kodi/userdata/addon_data/service.proftpd" +oe_setup_addon service.proftpd + +chmod a+x $ADDON_DIR/bin/* + +if [ ! -f "$ADDON_HOME/proftpd.conf" ]; then + cp $ADDON_DIR/etc/proftpd.conf $ADDON_HOME +fi + +if [ ! -f "$ADDON_HOME/openssl.cnf" ]; then + cp $ADDON_DIR/etc/openssl.cnf $ADDON_HOME +fi + +[ -z "$Debuglevel" ] && Debuglevel=0 + +if [ ! -f "$ADDON_HOME/proftpd.cert.pem" -o ! -f "$ADDON_HOME/proftpd.key.pem" ]; then + openssl req -newkey rsa:1024 -config $ADDON_HOME/openssl.cnf -new -x509 -days "$CertTTL" -nodes -out "$ADDON_HOME/proftpd.cert.pem" -keyout "$ADDON_HOME/proftpd.key.pem" +fi + +# Edit proftpd.conf with user settings +if [ "$TLSEngine" = "false" ]; then + sed -i 's/TLSEngine.*/TLSEngine off/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/TLSEngine.*/TLSEngine on/g' $ADDON_HOME/proftpd.conf +fi + +if [ "$AllowOverwrite" = "false" ]; then + sed -i 's/AllowOverwrite.*/AllowOverwrite off/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/AllowOverwrite.*/AllowOverwrite on/g' $ADDON_HOME/proftpd.conf +fi + +sed -i 's/^Port.*/Port '$Port'/g' $ADDON_HOME/proftpd.conf +sed -i 's/MaxClients .*/MaxClients '$MaxClients'/g' $ADDON_HOME/proftpd.conf +sed -i 's/MaxClientsPerHost.*/MaxClientsPerHost '$MaxClientsPerHost'/g' $ADDON_HOME/proftpd.conf +sed -i 's/MaxHostsPerUser.*/MaxHostsPerUser '$MaxHostsPerUser'/g' $ADDON_HOME/proftpd.conf +sed -i 's/MaxInstances.*/MaxInstances '$MaxInstances'/g' $ADDON_HOME/proftpd.conf +sed -i 's/Umask.*/Umask '$Umask'/g' $ADDON_HOME/proftpd.conf +sed -i 's/ServerName.*/ServerName "'"$ServerName"'"/g' $ADDON_HOME/proftpd.conf +sed -i 's/PassivePorts.*/PassivePorts '$PassivePorts' '$PassivePorts2'/g' $ADDON_HOME/proftpd.conf + +sed -i '/MasqueradeAddress.*/d' $ADDON_HOME/proftpd.conf +if [ "$MasqueradeAddress" = "true" ]; then + sed -i '1i\MasqueradeAddress '$MasqueradeAddress2'' $ADDON_HOME/proftpd.conf +fi + +if [ "$ServerIdent" = "false" ]; then + sed -i 's/ServerIdent.*/ServerIdent off "'"$ServerIdentText"'"/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/ServerIdent.*/ServerIdent on "'"$ServerIdentText"'"/g' $ADDON_HOME/proftpd.conf +fi + +if [ "$AllowForeignAddress" = "false" ]; then + sed -i 's/AllowForeignAddress.*/AllowForeignAddress off/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/AllowForeignAddress.*/AllowForeignAddress on/g' $ADDON_HOME/proftpd.conf +fi + +if [ "$AllowStoreRestart" = "false" ]; then + sed -i 's/AllowStoreRestart.*/AllowStoreRestart off/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/AllowStoreRestart.*/AllowStoreRestart on/g' $ADDON_HOME/proftpd.conf +fi + +if [ "$AllowRetrieveRestart" = "false" ]; then + sed -i 's/AllowRetrieveRestart.*/AllowRetrieveRestart off/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/AllowRetrieveRestart.*/AllowRetrieveRestart on/g' $ADDON_HOME/proftpd.conf +fi + +if [ "$RootLogin" = "false" ]; then + sed -i 's/RootLogin.*/RootLogin off/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/RootLogin.*/RootLogin on/g' $ADDON_HOME/proftpd.conf +fi + +if [ "$TLSRequired" = "false" ]; then + sed -i 's/TLSRequired.*/TLSRequired off/g' $ADDON_HOME/proftpd.conf +else + sed -i 's/TLSRequired.*/TLSRequired on/g' $ADDON_HOME/proftpd.conf +fi + +cd "$ADDON_DIR/bin" + +case "$CryptoHash" in + "0") CryptoHash="sha-512"; SALTLength="16";; + "1") CryptoHash="sha-256"; SALTLength="16";; + "2") CryptoHash="md5"; SALTLength="8";; +esac + +mkdir -p /var/config/ +rm -f /var/config/proftpd.passwd +touch /var/config/proftpd.passwd +chmod 700 /var/config/proftpd.passwd + +for NUM in $(seq 1 100); do + USERNAME=$(eval echo \$Username${NUM}) + USERPASS=$(eval echo \$Userpass${NUM}) + USERPATH=$(eval echo \$Userpath${NUM}) + + if [ -n "$USERNAME" ]; then + echo $USERNAME:$(./mkpasswd --hash=$CryptoHash --salt=$(cat /dev/urandom | tr -cd "[:alnum:]" | head -c $SALTLength) $USERPASS):10:10::$USERPATH:/bin/false >> /var/config/proftpd.passwd + # user writes with different user/group + mkdir -p "$USERPATH" + chmod 777 "$USERPATH" + fi +done + +exec proftpd -n -d $Debuglevel -c $ADDON_HOME/proftpd.conf diff --git a/packages/addons/service/proftpd/source/default.py b/packages/addons/service/proftpd/source/default.py new file mode 100644 index 0000000000..3999a0eb31 --- /dev/null +++ b/packages/addons/service/proftpd/source/default.py @@ -0,0 +1,35 @@ +################################################################################ +# 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 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/proftpd/source/etc/openssl.cnf b/packages/addons/service/proftpd/source/etc/openssl.cnf new file mode 100644 index 0000000000..428674225e --- /dev/null +++ b/packages/addons/service/proftpd/source/etc/openssl.cnf @@ -0,0 +1,12 @@ +[ req ] +prompt = no +distinguished_name = req_distinguished_name + +[ req_distinguished_name ] +C = GB +ST = Test State +L = Test Locality +O = Org Name +OU = Org Unit Name +CN = Common Name +emailAddress = test@email.com \ No newline at end of file diff --git a/packages/addons/service/proftpd/source/etc/proftpd.conf b/packages/addons/service/proftpd/source/etc/proftpd.conf new file mode 100644 index 0000000000..de6e366765 --- /dev/null +++ b/packages/addons/service/proftpd/source/etc/proftpd.conf @@ -0,0 +1,60 @@ +ServerName "ProFTPD" +ServerType standalone +DefaultServer on +UseReverseDNS off +ServerIdent on "FTP Server" +Port 21 +RootLogin on +ListOptions "-il" +MaxClients 10 +MaxHostsPerUser 5 +MaxClientsPerHost 5 +Umask 022 +MaxInstances 30 +User root +Group root +DefaultRoot ~ +AllowForeignAddress on + +TransferLog /storage/.kodi/userdata/addon_data/service.proftpd/transfer.log +ExtendedLog /storage/.kodi/userdata/addon_data/service.proftpd/extended.log +SystemLog /storage/.kodi/userdata/addon_data/service.proftpd/service.log + +# Trace DEFAULT:10 +# TraceLog /storage/.kodi/userdata/addon_data/service.proftpd/trace.log + +AuthGroupFile /etc/group +AuthUserFile /var/config/proftpd.passwd +RequireValidShell off +AuthOrder mod_auth_unix.c mod_auth_file.c* +UseFtpUsers off +PersistentPasswd off + + + Umask 022 + TimesGMT off + DenyFilter \*.*/ + PassivePorts 45000 45100 + + + + AllowOverwrite on + AllowStoreRestart on + AllowRetrieveRestart on + GroupOwner root + + + + TLSEngine on + # Support both SSLv3 and TLSv1 + TLSProtocol SSLv3 TLSv1 + TLSRequired off + TLSVerifyClient off + TLSOptions NoSessionReuseRequired + TLSRSACertificateFile /storage/.kodi/userdata/addon_data/service.proftpd/proftpd.cert.pem + TLSRSACertificateKeyFile /storage/.kodi/userdata/addon_data/service.proftpd/proftpd.key.pem + + +# +# UseEncoding utf8 cp1251 +# diff --git a/packages/addons/service/proftpd/source/resources/language/English/strings.xml b/packages/addons/service/proftpd/source/resources/language/English/strings.xml new file mode 100644 index 0000000000..164a84b0c5 --- /dev/null +++ b/packages/addons/service/proftpd/source/resources/language/English/strings.xml @@ -0,0 +1,50 @@ + + + + General + Settings + Allow Overwrite + Port + Max Clients + Max Clients per Host + Max Hosts per User + Max Instances + Umask + Server Name + Server Ident + Server Ident Text + Allow Store Restart + Allow Retrieve Restart + Allow Root Login + Debug level + User + Hash Algorithm + Username 1 + User Password 1 + User Path 1 + Username 2 + User Password 2 + User Path 2 + Username 3 + User Password 3 + User Path 3 + Username 4 + User Password 4 + User Path 4 + Username 5 + User Password 5 + User Path 5 + TLS + Allow TLS Engine + TLS Required + Certificat Lifetime (Days) + Certificat Hash Algorithm + Certificat Cryptosystem + Certificat Bit-Strength + FXP + Allow Foreign Address + Passive Portrange Start + Passive Portrange End + Enable Masquerade Address + Masquerade Address + diff --git a/packages/addons/service/proftpd/source/resources/settings.xml b/packages/addons/service/proftpd/source/resources/settings.xml new file mode 100644 index 0000000000..9562441197 --- /dev/null +++ b/packages/addons/service/proftpd/source/resources/settings.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/addons/service/proftpd/source/settings-default.xml b/packages/addons/service/proftpd/source/settings-default.xml new file mode 100644 index 0000000000..c7d7e18b9d --- /dev/null +++ b/packages/addons/service/proftpd/source/settings-default.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/addons/service/proftpd/source/system.d/service.proftpd.service b/packages/addons/service/proftpd/source/system.d/service.proftpd.service new file mode 100644 index 0000000000..4577b2068d --- /dev/null +++ b/packages/addons/service/proftpd/source/system.d/service.proftpd.service @@ -0,0 +1,14 @@ +[Unit] +Description=ProFTPD +After=network-online.service +Requires=network-online.service + +[Service] +ExecStart=/bin/sh -c "exec sh /storage/.kodi/addons/service.proftpd/bin/proftpd.start" +TimeoutStopSec=2 +Restart=always +RestartSec=2 +StartLimitInterval=0 + +[Install] +WantedBy=kodi.target