Merge pull request #1043 from CvH/proftpd

proftpd: initial add-on
This commit is contained in:
Christian Hewitt 2016-12-11 07:42:18 +04:00 committed by GitHub
commit 187a102a47
13 changed files with 550 additions and 0 deletions

View File

@ -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
}

View File

@ -0,0 +1,2 @@
100
- initial LibreELEC release

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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 <http://www.gnu.org/licenses/>.
################################################################################
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()

View File

@ -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

View File

@ -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
<Global>
Umask 022
TimesGMT off
DenyFilter \*.*/
PassivePorts 45000 45100
</Global>
<Directory /*>
AllowOverwrite on
AllowStoreRestart on
AllowRetrieveRestart on
GroupOwner root
</Directory>
<IfModule mod_tls.c>
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
</IfModule>
#<IfModule mod_lang.c>
# UseEncoding utf8 cp1251
#</IfModule>

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<!-- proftpd -->
<string id="40000">General</string>
<string id="40010">Settings</string>
<string id="40030">Allow Overwrite</string>
<string id="40040">Port</string>
<string id="40050">Max Clients</string>
<string id="40060">Max Clients per Host</string>
<string id="40070">Max Hosts per User</string>
<string id="40080">Max Instances</string>
<string id="40090">Umask</string>
<string id="40100">Server Name</string>
<string id="40110">Server Ident</string>
<string id="40120">Server Ident Text</string>
<string id="40180">Allow Store Restart</string>
<string id="40190">Allow Retrieve Restart</string>
<string id="40200">Allow Root Login</string>
<string id="40210">Debug level</string>
<string id="50000">User</string>
<string id="50010">Hash Algorithm</string>
<string id="50020">Username 1</string>
<string id="50030">User Password 1</string>
<string id="50040">User Path 1</string>
<string id="50050">Username 2</string>
<string id="50060">User Password 2</string>
<string id="50070">User Path 2</string>
<string id="50080">Username 3</string>
<string id="50090">User Password 3</string>
<string id="50100">User Path 3</string>
<string id="50110">Username 4</string>
<string id="50120">User Password 4</string>
<string id="50130">User Path 4</string>
<string id="50140">Username 5</string>
<string id="50150">User Password 5</string>
<string id="50160">User Path 5</string>
<string id="60000">TLS</string>
<string id="60010">Allow TLS Engine</string>
<string id="60020">TLS Required</string>
<string id="60030">Certificat Lifetime (Days)</string>
<string id="60040">Certificat Hash Algorithm</string>
<string id="60050">Certificat Cryptosystem</string>
<string id="60060">Certificat Bit-Strength</string>
<string id="70000">FXP</string>
<string id="70010">Allow Foreign Address</string>
<string id="70020">Passive Portrange Start</string>
<string id="70030">Passive Portrange End</string>
<string id="70040">Enable Masquerade Address</string>
<string id="70050">Masquerade Address</string>
</strings>

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<settings>
<category label="40000">
<setting type="lsep" />
<setting id="Port" type="number" label="40040" default="21" />
<setting id="MaxClients" type="number" label="40050" default="10" />
<setting id="MaxClientsPerHost" type="number" label="40060" default="5" />
<setting id="MaxHostsPerUser" type="number" label="40070" default="5" />
<setting id="MaxInstances" type="number" label="40080" default="30" />
<setting id="Umask" type="number" label="40090" default="022" />
<setting id="ServerName" type="text" label="40100" default="ProFTPD on LibreELEC"/>
<setting id="ServerIdent" type="bool" label="40110" default="true" />
<setting id="ServerIdentText" type="text" label="40120" default="LibreELEC" visible="eq(-1,true)" />
<setting id="AllowOverwrite" type="bool" label="40030" default="true" />
<setting id="AllowStoreRestart" type="bool" label="40180" default="true" />
<setting id="AllowRetrieveRestart" type="bool" label="40190" default="true" />
<setting id="RootLogin" type="bool" label="40200" default="true" />
<setting id="Debuglevel" type="labelenum" label="40210" default="0" values="0|1|2|3|4|5|6|7|8|9|10" />
</category>
<category label="60000">
<setting type="lsep" />
<setting id="TLSEngine" type="bool" label="60010" default="true" />
<setting id="TLSRequired" type="bool" label="60020" default="false" visible="eq(-1,true)" />
<setting id="CertTTL" type="number" label="60030" default="36500" />
<setting id="CertHash" type="enum" label="60040" default="sha1" values="sha1" />
<setting id="CertCrypto" type="enum" label="60050" default="x509" values="rsa|x509" />
<setting id="CertBitStrength" type="number" label="60060" default="2048" />
</category>
<category label="70000">
<setting type="lsep" />
<setting id="AllowForeignAddress" type="bool" label="70010" default="true" />
<setting id="PassivePorts" type="number" label="70020" default="45000" />
<setting id="PassivePorts2" type="number" label="70030" default="45100" />
<setting id="MasqueradeAddress" type="bool" label="70040" default="true" />
<setting id="MasqueradeAddress2" type="text" label="70050" default="127.0.0.1" visible="eq(-1,true)" />
</category>
<category label="50000">
<setting type="lsep" />
<setting id="CryptoHash" type="enum" label="50010" default="sha-512" values="sha-512|sha-256|md5" />
<setting type="lsep" />
<setting id="Username1" type="text" label="50020" default="" />
<setting id="Userpass1" type="text" label="50030" default="" enable="!eq(-1,)" />
<setting id="Userpath1" type="folder" label="50040" default="/storage" enable="!eq(-1,)" option="writeable" />
<setting type="lsep" />
<setting id="Username2" type="text" label="50050" default="" visible="!eq(-3,)" />
<setting id="Userpass2" type="text" label="50060" default="" visible="!eq(-4,)" enable="!eq(-1,)" />
<setting id="Userpath2" type="folder" label="50070" default="/storage" visible="!eq(-5,)" enable="!eq(-1,)" option="writeable" />
<setting type="lsep" />
<setting id="Username3" type="text" label="50080" default="" visible="!eq(-3,)" />
<setting id="Userpass3" type="text" label="50090" default="" visible="!eq(-4,)" enable="!eq(-1,)" />
<setting id="Userpath3" type="folder" label="50100" default="/storage" visible="!eq(-5,)" enable="!eq(-1,)" option="writeable" />
<setting type="lsep" />
<setting id="Username4" type="text" label="50110" default="" visible="!eq(-3,)" />
<setting id="Userpass4" type="text" label="50120" default="" visible="!eq(-4,)" enable="!eq(-1,)" />
<setting id="Userpath4" type="folder" label="50130" default="/storage" visible="!eq(-5,)" enable="!eq(-1,)" option="writeable" />
<setting type="lsep" />
<setting id="Username5" type="text" label="50140" default="" visible="!eq(-3,)" />
<setting id="Userpass5" type="text" label="50150" default="" visible="!eq(-4,)" enable="!eq(-1,)" />
<setting id="Userpath5" type="folder" label="50160" default="/storage" visible="!eq(-5,)" enable="!eq(-1,)" option="writeable" />
</category>
</settings>

View File

@ -0,0 +1,43 @@
<settings>
<setting id="AllowForeignAddress" value="true" />
<setting id="AllowOverwrite" value="true" />
<setting id="AllowRetrieveRestart" value="true" />
<setting id="AllowStoreRestart" value="true" />
<setting id="CertBitStrength" value="2048" />
<setting id="CertCrypto" value="0" />
<setting id="CertHash" value="0" />
<setting id="CertTTL" value="36500" />
<setting id="CryptoHash" value="0" />
<setting id="MasqueradeAddress" value="false" />
<setting id="MasqueradeAddress2" value="192.168.1.5" />
<setting id="MaxClients" value="10" />
<setting id="MaxClientsPerHost" value="5" />
<setting id="MaxHostsPerUser" value="5" />
<setting id="MaxInstances" value="30" />
<setting id="PassivePorts" value="45000" />
<setting id="PassivePorts2" value="45100" />
<setting id="Port" value="21" />
<setting id="RootLogin" value="true" />
<setting id="Debuglevel" value="0" />
<setting id="ServerIdent" value="true" />
<setting id="ServerIdentText" value="LibreELEC" />
<setting id="ServerName" value="ProFTPD on LibreELEC" />
<setting id="TLSEngine" value="true" />
<setting id="TLSRequired" value="false" />
<setting id="Umask" value="022" />
<setting id="Username1" value="" />
<setting id="Username2" value="" />
<setting id="Username3" value="" />
<setting id="Username4" value="" />
<setting id="Username5" value="" />
<setting id="Userpass1" value="" />
<setting id="Userpass2" value="" />
<setting id="Userpass3" value="" />
<setting id="Userpass4" value="" />
<setting id="Userpass5" value="" />
<setting id="Userpath1" value="/storage" />
<setting id="Userpath2" value="/storage" />
<setting id="Userpath3" value="/storage" />
<setting id="Userpath4" value="/storage" />
<setting id="Userpath5" value="/storage" />
</settings>

View File

@ -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