From 118000e0b59665922cfe496db57cff6b12f1665f Mon Sep 17 00:00:00 2001 From: Roberto Date: Thu, 1 Jan 2015 19:21:27 +0100 Subject: [PATCH 1/6] add logga(), on_incomplete_file_received() and full compliant file renaming as proftpd --- app/main.py | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/app/main.py b/app/main.py index 34486f8..3c89f15 100644 --- a/app/main.py +++ b/app/main.py @@ -19,24 +19,44 @@ def read_conf(config_file=os.path.join(this_dir, '../conf/ftp.conf')): class CustomHandler(FTPHandler): + def logga(self, message): + return + out_file = open("/home/admin/easyftp/log/rob.log","a") + out_file.write(message + "\n") + out_file.close() + def on_file_received(self, file): + self.logga("on_file_received" + file) import os head, tail = list(path.split(file))[0], list(path.split(file))[1] - os.rename(path.join(head, tail), path.join(head, tail[4:])) + os.rename(path.join(head, tail), path.join(head, tail[4:-1])) pass - + + #Rob: it seems doesn't exist ! def on_incomplete_received(self, file): + self.logga("on_incomplete_received" + file) import os os.remove(file) - def ftp_STOR(self, file, mode='w'): + self.logga("ftp_STOR" + file) head, tail = list(path.split(file))[0], list(path.split(file))[1] - file = path.join(head, ".in." + tail) - + file = path.join(head, ".in." + tail + ".") return FTPHandler.ftp_STOR(self, file, mode) + def on_incomplete_file_received(self, file): + self.logga("on_incomplete_file_received" + file) + # remove partially uploaded files. + #This happens on connection interrupted but not when Ctrl+C is pressed on FTP client (rob) + import os + os.remove(file) + #Rob: added by me + def on_incomplete_file_sent(self, file): + self.logga("on_incomplete_file_sent" + file) + # remove partially uploaded files + import os + os.remove(file) def get_server(conf=None): From d9cbc22bdb5a1cc381ac03386c3cd4e8240c8358 Mon Sep 17 00:00:00 2001 From: Roberto Date: Sun, 22 Mar 2015 18:52:16 +0100 Subject: [PATCH 2/6] added logfile conf --- conf/zdaemon.conf | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/conf/zdaemon.conf b/conf/zdaemon.conf index e71218e..53808d6 100644 --- a/conf/zdaemon.conf +++ b/conf/zdaemon.conf @@ -1,6 +1,12 @@ daemon on - program python ./app/main.py - socket-name ./socket/ftpserver.sock - transcript ./log/ftpserver.log - \ No newline at end of file + program python app/main.py + socket-name socket/ftpserver.sock + transcript log/ftpserver.log + + + + + path /var/log/easyftp.log + + From a063d64d1cefd8f1dff1a73293d6d8c28baa3c3c Mon Sep 17 00:00:00 2001 From: Roberto Date: Sun, 22 Mar 2015 18:53:23 +0100 Subject: [PATCH 3/6] added logging handler but it cannot trace log level and log time --- app/main.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/app/main.py b/app/main.py index 3c89f15..8640731 100644 --- a/app/main.py +++ b/app/main.py @@ -4,6 +4,8 @@ import os import yaml +import logging +import pyftpdlib.log from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler @@ -73,7 +75,9 @@ def get_server(conf=None): # Instantiate FTP handler class handler = CustomHandler handler.authorizer = authorizer - + #handler.log_prefix = '%(created)f [%(username)s]@%(remote_ip)s' + handler.log_prefix = '[%(username)s]@%(remote_ip)s' + # Define a customized banner (string returned when client connects) handler.banner = "simpleftp ready!" @@ -98,5 +102,11 @@ def get_server(conf=None): return server if __name__ == '__main__': + logging.basicConfig(filename='/var/log/pyftpd.log', level=logging.DEBUG) + pyftpdlib.log.LEVEL = logging.DEBUG + + #handler = FTPHandler + #handler.log_prefix = '[%(username)s]@%(remote_ip)s' + server = get_server(read_conf()) server.serve_forever() From 9fac6beba1e239240e680858113da8565bc57967 Mon Sep 17 00:00:00 2001 From: Roberto Date: Mon, 23 Mar 2015 13:07:54 +0100 Subject: [PATCH 4/6] fix logging --- app/main.py | 50 ++++++++++++++++++++++++++--------------------- conf/zdaemon.conf | 6 +++--- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/app/main.py b/app/main.py index 8640731..0a35945 100644 --- a/app/main.py +++ b/app/main.py @@ -21,43 +21,40 @@ def read_conf(config_file=os.path.join(this_dir, '../conf/ftp.conf')): class CustomHandler(FTPHandler): - def logga(self, message): - return - out_file = open("/home/admin/easyftp/log/rob.log","a") - out_file.write(message + "\n") - out_file.close() + my_log = logging.getLogger('CustomHandler') def on_file_received(self, file): - self.logga("on_file_received" + file) import os + self.my_log.debug("Rename " + os.path.basename(file) + " to original file name") head, tail = list(path.split(file))[0], list(path.split(file))[1] os.rename(path.join(head, tail), path.join(head, tail[4:-1])) pass #Rob: it seems doesn't exist ! def on_incomplete_received(self, file): - self.logga("on_incomplete_received" + file) import os + self.my_log.warn("on_incomplete_received('" + os.path.basename(file) + "')") os.remove(file) def ftp_STOR(self, file, mode='w'): - self.logga("ftp_STOR" + file) + import os + self.my_log.debug("Rename " + os.path.basename(file) + " useing temp file name .in.xxx.") head, tail = list(path.split(file))[0], list(path.split(file))[1] file = path.join(head, ".in." + tail + ".") return FTPHandler.ftp_STOR(self, file, mode) def on_incomplete_file_received(self, file): - self.logga("on_incomplete_file_received" + file) - # remove partially uploaded files. - #This happens on connection interrupted but not when Ctrl+C is pressed on FTP client (rob) import os + self.my_log.warn("Remove partially uploaded file " + os.path.basename(file)) + # remove partially uploaded file + #This happens on connection interrupted but not when Ctrl+C is pressed on FTP client (rob) os.remove(file) #Rob: added by me def on_incomplete_file_sent(self, file): - self.logga("on_incomplete_file_sent" + file) - # remove partially uploaded files import os + self.my_log.warn("Remove partially downloaded file " + os.path.basename(file)) + # remove partially downloaded files os.remove(file) def get_server(conf=None): @@ -75,8 +72,7 @@ def get_server(conf=None): # Instantiate FTP handler class handler = CustomHandler handler.authorizer = authorizer - #handler.log_prefix = '%(created)f [%(username)s]@%(remote_ip)s' - handler.log_prefix = '[%(username)s]@%(remote_ip)s' + handler.log_prefix = '[%(username)s@%(remote_ip)s:%(remote_port)s]' # Define a customized banner (string returned when client connects) handler.banner = "simpleftp ready!" @@ -92,6 +88,7 @@ def get_server(conf=None): address = (server.get('address', ''), server.get('port', '2121')) server = FTPServer(address, handler) + pyftpdlib.log.LEVEL = log_level # set a limit for connections # server.max_cons = 256 @@ -102,11 +99,20 @@ def get_server(conf=None): return server if __name__ == '__main__': - logging.basicConfig(filename='/var/log/pyftpd.log', level=logging.DEBUG) - pyftpdlib.log.LEVEL = logging.DEBUG - - #handler = FTPHandler - #handler.log_prefix = '[%(username)s]@%(remote_ip)s' - - server = get_server(read_conf()) + conf = read_conf() + log_level = logging.DEBUG + if conf.get('log').get('level').upper() == 'INFO': + log_level = logging.INFO + elif conf.get('log').get('level').upper() == 'WARN': + log_level = logging.WARN + elif conf.get('log').get('level').upper() == 'ERROR': + log_level = logging.ERROR + + logging.basicConfig(level=log_level, + format='%(asctime)s %(levelname)-5s %(name)-13s %(message)s', + datefmt='%Y-%m-%d %H:%M:%S', + filename='/var/log/pyftpd.log', + filemode='a') + + server = get_server(conf) server.serve_forever() diff --git a/conf/zdaemon.conf b/conf/zdaemon.conf index 53808d6..0ba7fc7 100644 --- a/conf/zdaemon.conf +++ b/conf/zdaemon.conf @@ -1,12 +1,12 @@ daemon on - program python app/main.py + program ./easyftp.sh socket-name socket/ftpserver.sock - transcript log/ftpserver.log + #transcript log/ftpserver.log - path /var/log/easyftp.log + path log/easyftp.log From 6e6314428bbcd8576aef6bac6dea58ba0ea281c3 Mon Sep 17 00:00:00 2001 From: Roberto Date: Mon, 23 Mar 2015 13:08:21 +0100 Subject: [PATCH 5/6] add logging level setup --- conf/ftp-example.conf | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/conf/ftp-example.conf b/conf/ftp-example.conf index 430e9a0..39576ab 100644 --- a/conf/ftp-example.conf +++ b/conf/ftp-example.conf @@ -1,3 +1,6 @@ +log: + level: INFO + users: - name: luca dir: /Users/luca @@ -16,4 +19,4 @@ server: # masquerade_address: 8.8.8.8 passive_ports: start: 60000 - end: 65535 \ No newline at end of file + end: 65535 From 76ace201aad3d5ef05cbe08843c9d3ff8b0929cf Mon Sep 17 00:00:00 2001 From: Roberto Date: Mon, 23 Mar 2015 13:08:52 +0100 Subject: [PATCH 6/6] add usefull bash scripts --- add-ftp-account.sh | 61 ++++++++++++++++++++++++++++++++++++++++++++++ easyftp.sh | 6 +++++ 2 files changed, 67 insertions(+) create mode 100755 add-ftp-account.sh create mode 100755 easyftp.sh diff --git a/add-ftp-account.sh b/add-ftp-account.sh new file mode 100755 index 0000000..20e8280 --- /dev/null +++ b/add-ftp-account.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +#------------------------------------------- +# $1 = User name +# $2 = Password +# $3 = Home directory +#------------------------------------------- + +if [ "$#" -ne 3 ]; then + echo "Illegal number of parameters" + echo "Usage:" + echo " $0 " + echo + echo "Example:" + echo " ./add-ftp-account.sh user_name password user_home_dir" + echo + exit 1 +fi + +conf="conf/ftp.conf" +perm="elrwm" + +#--CREATE NEW USER ACCOUNT +if [ -z "$( grep "name: $1" $conf )" ]; then + echo "" >> $conf + echo " - name: $1" >> $conf + echo " dir: $3" >> $conf + echo " password: $2" >> $conf + echo " permission: $perm" >> $conf + echo "Created new FTP account $1 having permission $perm" +else + echo "The user $1 already exists: ABORT !!!" + exit -1 +fi + +#--CREATE HOME DIR +if [ ! -d $3 ]; then + mkdir $3 + chown www-data:www-data $3 + chmod -R g+w $3 + chmod g+s $3 + echo "Created new home dir: $3" +fi + +#echo "HOMEs:" +#echo "$( ls -l $3/.. )" + +#--RESTART easyftp DAEMON TO ENABLE NEW ACCOUNT +daemon_restart="zdaemon -C conf/zdaemon.conf restart" +read -p "Do you want to restart EASYFTP daemon now ? ('Yes' or 'No')" response +if [ "${response^^}" == "YES" ]; then + $daemon_restart +else + echo + echo "ATTENTION:" + echo "Remember to restart daemon manually to apply config changes:" + echo " $daemon_restart" +fi + +echo "Done!" + diff --git a/easyftp.sh b/easyftp.sh new file mode 100755 index 0000000..d3dea57 --- /dev/null +++ b/easyftp.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# This script is the EasyFTP launcher + +python app/main.py +