@@ -11,5 +15,7 @@
\ No newline at end of file
diff --git a/plugins/pureftp/index.py b/plugins/pureftp/index.py
new file mode 100755
index 000000000..c8ee11b2c
--- /dev/null
+++ b/plugins/pureftp/index.py
@@ -0,0 +1,188 @@
+# coding:utf-8
+
+import sys
+import io
+import os
+import time
+
+sys.path.append(os.getcwd() + "/class/core")
+import public
+
+app_debug = False
+if public.getOs() == 'darwin':
+ app_debug = True
+
+
+def getPluginName():
+ return 'pureftp'
+
+
+def getPluginDir():
+ return public.getPluginDir() + '/' + getPluginName()
+
+
+def getServerDir():
+ return public.getServerDir() + '/' + getPluginName()
+
+
+def getInitDFile():
+ if app_debug:
+ return '/tmp/' + getPluginName()
+ return '/etc/init.d/' + getPluginName()
+
+
+def getConf():
+ path = getServerDir() + "/etc/pure-ftpd.conf"
+ return path
+
+
+def getInitDTpl():
+ path = getPluginDir() + "/init.d/pure-ftpd.tpl"
+ return path
+
+
+def getArgs():
+ args = sys.argv[3:]
+ tmp = {}
+ args_len = len(args)
+
+ if args_len == 1:
+ t = args[0].strip('{').strip('}')
+ t = t.split(':')
+ tmp[t[0]] = t[1]
+ elif args_len > 1:
+ for i in range(len(args)):
+ t = args[i].split(':')
+ tmp[t[0]] = t[1]
+
+ return tmp
+
+
+def status():
+ cmd = "ps -ef|grep " + getPluginName() + \
+ " |grep -v grep | grep -v python | awk '{print $2}'"
+ data = public.execShell(cmd)
+ if data[0] == '':
+ return 'stop'
+ return 'start'
+
+
+def contentReplace(content):
+ service_path = public.getServerDir()
+ content = content.replace('{$ROOT_PATH}', public.getRootDir())
+ content = content.replace('{$SERVER_PATH}', service_path)
+ return content
+
+
+def initDreplace():
+
+ file_tpl = getInitDTpl()
+ service_path = os.path.dirname(os.getcwd())
+
+ initD_path = getServerDir() + '/init.d'
+ if not os.path.exists(initD_path):
+ os.mkdir(initD_path)
+ file_bin = initD_path + '/' + getPluginName()
+
+ # initd replace
+ content = public.readFile(file_tpl)
+ content = contentReplace(content)
+ public.writeFile(file_bin, content)
+ public.execShell('chmod +x ' + file_bin)
+
+ # # config replace
+ # conf_content = public.readFile(getConf())
+ # conf_content = conf_content.replace('{$SERVER_PATH}', service_path)
+ # public.writeFile(getServerDir() + '/redis.conf', conf_content)
+
+ return file_bin
+
+
+def start():
+ file = initDreplace()
+ data = public.execShell(file + ' start')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def stop():
+ file = initDreplace()
+ data = public.execShell(file + ' stop')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def restart():
+ file = initDreplace()
+ data = public.execShell(file + ' restart')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def reload():
+ file = initDreplace()
+ data = public.execShell(file + ' reload')
+ if data[1] == '':
+ return 'ok'
+ return 'fail'
+
+
+def initdStatus():
+ if not app_debug:
+ os_name = public.getOs()
+ if os_name == 'darwin':
+ return "Apple Computer does not support"
+ initd_bin = getInitDFile()
+ if os.path.exists(initd_bin):
+ return 'ok'
+ return 'fail'
+
+
+def initdInstall():
+ import shutil
+ if not app_debug:
+ os_name = public.getOs()
+ if os_name == 'darwin':
+ return "Apple Computer does not support"
+
+ source_bin = initDreplace()
+ initd_bin = getInitDFile()
+ shutil.copyfile(source_bin, initd_bin)
+ public.execShell('chmod +x ' + initd_bin)
+ return 'ok'
+
+
+def initdUinstall():
+ if not app_debug:
+ os_name = public.getOs()
+ if os_name == 'darwin':
+ return "Apple Computer does not support"
+ initd_bin = getInitDFile()
+ os.remove(initd_bin)
+ return 'ok'
+
+if __name__ == "__main__":
+ func = sys.argv[1]
+ if func == 'status':
+ print status()
+ elif func == 'start':
+ print start()
+ elif func == 'stop':
+ print stop()
+ elif func == 'restart':
+ print restart()
+ elif func == 'reload':
+ print reload()
+ elif func == 'initd_status':
+ print initdStatus()
+ elif func == 'initd_install':
+ print initdInstall()
+ elif func == 'initd_uninstall':
+ print initdUinstall()
+ elif func == 'conf':
+ print getConf()
+ else:
+ print 'error'
diff --git a/plugins/pureftp/init.d/pure-config.pl b/plugins/pureftp/init.d/pure-config.pl
new file mode 100644
index 000000000..146b3dcc2
--- /dev/null
+++ b/plugins/pureftp/init.d/pure-config.pl
@@ -0,0 +1,128 @@
+#! /usr/bin/perl
+
+# (C) 2001-2013 Aristotle Pagaltzis
+# derived from code (C) 2001-2002 Frank Denis and Matthias Andree
+
+use strict;
+
+my ($conffile, @flg) = @ARGV;
+
+my $PUREFTPD;
+-x && ($PUREFTPD=$_, last) for qw(
+ ${exec_prefix}/sbin/pure-ftpd
+ /www/server/pure-ftpd/sbin/pure-ftpd
+ /www/server/pureftpd/sbin/pure-ftpd
+ /www/server/sbin/pure-ftpd
+ /usr/sbin/pure-ftpd
+);
+
+my %simple_switch_for = (
+ IPV4Only => "-4",
+ IPV6Only => "-6",
+ ChrootEveryone => "-A",
+ BrokenClientsCompatibility => "-b",
+ Daemonize => "-B",
+ VerboseLog => "-d",
+ DisplayDotFiles => "-D",
+ AnonymousOnly => "-e",
+ NoAnonymous => "-E",
+ DontResolve => "-H",
+ AnonymousCanCreateDirs => "-M",
+ NATmode => "-N",
+ CallUploadScript => "-o",
+ AntiWarez => "-s",
+ AllowUserFXP => "-w",
+ AllowAnonymousFXP => "-W",
+ ProhibitDotFilesWrite => "-x",
+ ProhibitDotFilesRead => "-X",
+ AllowDotFiles => "-z",
+ AutoRename => "-r",
+ AnonymousCantUpload => "-i",
+ LogPID => "-1",
+ NoChmod => "-R",
+ KeepAllFiles => "-K",
+ CreateHomeDir => "-j",
+ NoRename => "-G",
+ CustomerProof => "-Z",
+ NoTruncate => "-0",
+);
+
+my %string_switch_for = (
+ FileSystemCharset => "-8",
+ ClientCharset => "-9",
+ SyslogFacility => "-f",
+ FortunesFile => "-F",
+ ForcePassiveIP => "-P",
+ Bind => "-S",
+ AnonymousBandwidth => "-t",
+ UserBandwidth => "-T",
+ TrustedIP => "-V",
+ AltLog => "-O",
+ PIDFile => "-g",
+ TLSCipherSuite => "-J",
+ CertFile => "-2",
+);
+
+my %numeric_switch_for = (
+ MaxIdleTime => "-I",
+ MaxDiskUsage => "-k",
+ TrustedGID => "-a",
+ MaxClientsNumber => "-c",
+ MaxClientsPerIP => "-C",
+ MaxLoad => "-m",
+ MinUID => "-u",
+ TLS => "-Y",
+);
+
+my %numpairb_switch_for = (
+ LimitRecursion => "-L",
+ PassivePortRange => "-p",
+ AnonymousRatio => "-q",
+ UserRatio => "-Q",
+);
+
+my %numpairc_switch_for = (
+ Umask => "-U",
+ Quota => "-n",
+ PerUserLimits => "-y",
+);
+
+my %auth_method_for = (
+ LDAPConfigFile => "ldap",
+ MySQLConfigFile => "mysql",
+ PGSQLConfigFile => "pgsql",
+ PureDB => "puredb",
+ ExtAuth => "extauth",
+);
+
+my $simple_switch = qr/(@{[join "|", keys %simple_switch_for ]})\s+yes/i;
+my $string_switch = qr/(@{[join "|", keys %string_switch_for ]})\s+(\S+)/i;
+my $numeric_switch = qr/(@{[join "|", keys %numeric_switch_for ]})\s+(\d+)/i;
+my $numpairb_switch = qr/(@{[join "|", keys %numpairb_switch_for ]})\s+(\d+)\s+(\d+)/i;
+my $numpairc_switch = qr/(@{[join "|", keys %numpairc_switch_for ]})\s+(\d+):(\d+)/i;
+my $auth_method = qr/(@{[join "|", keys %auth_method_for ]})\s+(\S+)/i;
+
+die "Usage: pure-config.pl
[extra options]\n"
+ unless defined $conffile;
+
+open CONF, "< $conffile" or die "Can't open $conffile: $!\n";
+
+!/^\s*(?:$|#)/ and (chomp, push @flg,
+ /$simple_switch/i ? ($simple_switch_for{$1}) :
+ /$string_switch/i ? ($string_switch_for{$1} . $2) :
+ /$numeric_switch/i ? ($numeric_switch_for{$1} . $2) :
+ /$numpairb_switch/i ? ($numpairb_switch_for{$1} . "$2:$3") :
+ /$numpairc_switch/i ? ($numpairc_switch_for{$1} . "$2:$3") :
+ /$auth_method/i ? ("-l" . "$auth_method_for{$1}:$2") :
+ /UnixAuthentication\s+yes/i ? ("-l" . "unix") :
+ /PAMAuthentication\s+yes/i ? ("-l" . "pam") :
+ ()
+) while ;
+
+close CONF;
+
+if (-t STDOUT) {
+ print "Running: $PUREFTPD ", join(" ", @flg), "\n";
+}
+exec { $PUREFTPD } ($PUREFTPD, @flg) or die "cannot exec $PUREFTPD: $!";
+
diff --git a/plugins/pureftp/init.d/pure-ftpd.tpl b/plugins/pureftp/init.d/pure-ftpd.tpl
new file mode 100644
index 000000000..e7e5c7dca
--- /dev/null
+++ b/plugins/pureftp/init.d/pure-ftpd.tpl
@@ -0,0 +1,78 @@
+#!/bin/bash
+#
+# chkconfig: 2345 85 15
+# description: Pure-FTPd is an FTP server daemon based upon Troll-FTPd
+# processname: pure-ftpd
+
+### BEGIN INIT INFO
+# Provides: pureftpd
+# Required-Start: $all
+# Required-Stop: $all
+# Default-Start: 2 3 4 5
+# Default-Stop: 0 1 6
+# Short-Description: starts pureftpd server
+# Description: starts pureftpd server
+### END INIT INFO
+
+# Pure-FTPd Settings
+PURE_PERL="{$SERVER_PATH}/pureftp/sbin/pure-ftpd"
+PURE_CONF="{$SERVER_PATH}/pureftp/etc/pure-ftpd.conf"
+PURE_PID="/var/run/pure-ftpd.pid"
+RETVAL=0
+prog="Pure-FTPd"
+
+start() {
+ echo -n $"Starting $prog... "
+ $PURE_PERL $PURE_CONF --daemonize
+ if [ "$?" = 0 ] ; then
+ echo " done"
+ else
+ echo " failed"
+ fi
+}
+
+stop() {
+ echo -n $"Stopping $prog... "
+ if [ ! -e $PURE_PID ]; then
+ echo -n $"$prog is not running."
+ exit 1
+ fi
+ kill `cat $PURE_PID`
+ if [ "$?" = 0 ] ; then
+ echo " done"
+ else
+ echo " failed"
+ fi
+}
+
+restart(){
+ echo $"Restarting $prog..."
+ $0 stop
+ sleep 2
+ $0 start
+}
+
+status(){
+ if [ -e $PURE_PID ]; then
+ echo $"$prog is running."
+ else
+ echo $"$prog is not running."
+ fi
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ restart)
+ restart
+ ;;
+ status)
+ status
+ ;;
+ *)
+ echo $"Usage: $0 {start|stop|restart}"
+esac
diff --git a/plugins/pureftp/install.sh b/plugins/pureftp/install.sh
index 5c8c8f0cb..7ff687692 100755
--- a/plugins/pureftp/install.sh
+++ b/plugins/pureftp/install.sh
@@ -16,6 +16,7 @@ Install_pureftp()
VER=$1
FILE=pure-ftpd-${VER}.tar.gz
+ FDIR=pure-ftpd-${VER}
DOWNLOAD=https://download.pureftpd.org/pub/pure-ftpd/releases/pure-ftpd-${VER}.tar.gz
@@ -23,22 +24,18 @@ Install_pureftp()
wget -O $serverPath/source/pureftp/$FILE $DOWNLOAD
fi
- if [ ! -d $serverPath/source/pureftp/$FILE ];then
- cd $serverPath/source/pureftp && tar zxvf $FILE
+ if [ ! -d $serverPath/source/pureftp/$FDIR ];then
+ cd $serverPath/source/pureftp && tar zxvf $FILE
fi
- cd pure-ftpd-${1} && ./configure --prefix=${serverPath}/pureftp \
- --without-inetd \
- --with-altlog \
- --with-puredb \
- --with-throttling \
- --with-peruserlimits \
- --with-tls && make && make install
-
-
-
+ cd $serverPath/source/pureftp/$FDIR && ./configure --prefix=${serverPath}/pureftp \
+ --with-everything && make && make install && make clean
+
echo "${1}" > ${serverPath}/pureftp/version.pl
echo '安装完成' > $install_tmp
+
+
+
}
Uninstall_pureftp()