Loading opds_catalog/management/commands/sopds_telebot.py 0 → 100644 +113 −0 Original line number Diff line number Diff line import os import signal import sys import logging from django.core.management.base import BaseCommand from django.db import transaction, connection, connections from django.conf import settings as main_settings from opds_catalog.models import Counter from opds_catalog.sopdscan import opdsScanner from opds_catalog import settings from constance import config class Command(BaseCommand): help = 'SimpleOPDS Telegram Bot engine.' def add_arguments(self, parser): parser.add_argument('command', help='Use [ start | stop | restart ]') parser.add_argument('--verbose',action='store_true', dest='verbose', default=False, help='Set verbosity level for SimpleOPDS telebot.') parser.add_argument('--daemon',action='store_true', dest='daemonize', default=False, help='Daemonize server') def handle(self, *args, **options): self.pidfile = os.path.join(main_settings.BASE_DIR, config.SOPDS_TELEBOT_PID) action = options['command'] self.logger = logging.getLogger('') self.logger.setLevel(logging.DEBUG) formatter=logging.Formatter('%(asctime)s %(levelname)-8s %(message)s') if settings.LOGLEVEL!=logging.NOTSET: # Создаем обработчик для записи логов в файл fh = logging.FileHandler(config.SOPDS_TELEBOT_LOG) fh.setLevel(settings.LOGLEVEL) fh.setFormatter(formatter) self.logger.addHandler(fh) if options['verbose']: # Создадим обработчик для вывода логов на экран с максимальным уровнем вывода ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) self.logger.addHandler(ch) if (options["daemonize"] and (action in ["start"])): if sys.platform == "win32": self.stdout.write("On Windows platform Daemonize not working.") else: daemonize() if action == "start": self.start() elif action == "stop": pid = open(self.pidfile, "r").read() self.stop(pid) elif action == "restart": pid = open(self.pidfile, "r").read() self.restart(pid) def start(self): writepid(self.pidfile) quit_command = 'CTRL-BREAK' if sys.platform == 'win32' else 'CONTROL-C' self.stdout.write("Quit the sopds_telebot with %s.\n"%quit_command) try: self.sched.start() except (KeyboardInterrupt, SystemExit): pass def stop(self, pid): try: os.kill(int(pid), signal.SIGTERM) except OSError as e: self.stdout.write("Error stopping sopds_telebot: %s"%str(e)) def restart(self, pid): self.stop(pid) self.start() def writepid(pid_file): """ Write the process ID to disk. """ fp = open(pid_file, "w") fp.write(str(os.getpid())) fp.close() def daemonize(): """ Detach from the terminal and continue as a daemon. """ # swiped from twisted/scripts/twistd.py # See http://www.erlenstar.demon.co.uk/unix/faq_toc.html#TOC16 if os.fork(): # launch child and... os._exit(0) # kill off parent os.setsid() if os.fork(): # launch child and... os._exit(0) # kill off parent again. os.umask(0) std_in = open("/dev/null", 'r') std_out = open(config.SOPDS_TELEBOT_LOG, 'a+') os.dup2(std_in.fileno(), sys.stdin.fileno()) os.dup2(std_out.fileno(), sys.stdout.fileno()) os.dup2(std_out.fileno(), sys.stderr.fileno()) os.close(std_in.fileno()) os.close(std_out.fileno()) sopds/settings.py +7 −2 Original line number Diff line number Diff line Loading @@ -174,6 +174,8 @@ CONSTANCE_CONFIG = OrderedDict([ ('SOPDS_SCAN_START_DIRECTLY', (False,_('Turn once scanning directly'))), ('SOPDS_CACHE_TIME', (1200, _('Pages cache time'))), ('SOPDS_TELEBOT_API_TOKEN', ('', _('Telegramm API Token'))), ('SOPDS_AUTH', (True,_('Enable authentication'))), ('SOPDS_ALPHABET_MENU', (True,_('Enable alphabet submenu'))), ('SOPDS_DOUBLES_HIDE', (True,_('This flag hides found doublicates'))), Loading Loading @@ -204,8 +206,10 @@ CONSTANCE_CONFIG = OrderedDict([ ('SOPDS_SERVER_LOG', (os.path.join(BASE_DIR,'opds_catalog/log/sopds_server.log'),_('Path to logfile for sopds_server process'))), ('SOPDS_SCANNER_LOG', (os.path.join(BASE_DIR,'opds_catalog/log/sopds_scanner.log'),_('Path to logfile for sopds_scanner process'))), ('SOPDS_TELEBOT_LOG', (os.path.join(BASE_DIR, 'opds_catalog/log/sopds_telebot.log'), _('Path to logfile for sopds_telebot process'))), ('SOPDS_SERVER_PID', (os.path.join(BASE_DIR,'opds_catalog/tmp/sopds_server.pid'),_('Path to pidfile for sopds_server process'))), ('SOPDS_SCANNER_PID', (os.path.join(BASE_DIR,'opds_catalog/tmp/sopds_scanner.pid'),_('Path to pidfile for sopds_scanner process'))), ('SOPDS_TELEBOT_PID', (os.path.join(BASE_DIR, 'opds_catalog/tmp/sopds_telebot.pid'), _('Path to pidfile for sopds_telebot process'))), ]) Loading @@ -214,8 +218,9 @@ CONSTANCE_CONFIG_FIELDSETS = { '2. Server Options': ('SOPDS_AUTH', 'SOPDS_ALPHABET_MENU', 'SOPDS_DOUBLES_HIDE', 'SOPDS_COVER_SHOW', 'SOPDS_SPLITITEMS', 'SOPDS_MAXITEMS', 'SOPDS_TITLE_AS_FILENAME', 'SOPDS_NOCOVER_PATH'), '3. Scanner Options': ('SOPDS_FB2SAX','SOPDS_ZIPSCAN','SOPDS_ZIPCODEPAGE', 'SOPDS_INPX_ENABLE', 'SOPDS_INPX_SKIP_UNCHANGED', 'SOPDS_INPX_TEST_ZIP', 'SOPDS_INPX_TEST_FILES', 'SOPDS_DELETE_LOGICAL'), '4. Scanner Shedule': ('SOPDS_SCAN_SHED_MIN', 'SOPDS_SCAN_SHED_HOUR', 'SOPDS_SCAN_SHED_DAY','SOPDS_SCAN_SHED_DOW'), '5. Converters Options': ('SOPDS_FB2TOEPUB', 'SOPDS_FB2TOMOBI', 'SOPDS_TEMP_DIR'), '6. Log & PID Files': ('SOPDS_SERVER_LOG', 'SOPDS_SCANNER_LOG', 'SOPDS_SERVER_PID','SOPDS_SCANNER_PID'), '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN'), '6. Converters Options': ('SOPDS_FB2TOEPUB', 'SOPDS_FB2TOMOBI', 'SOPDS_TEMP_DIR'), '7. Log & PID Files': ('SOPDS_SERVER_LOG', 'SOPDS_SCANNER_LOG', 'SOPDS_TELEBOT_LOG','SOPDS_SERVER_PID','SOPDS_SCANNER_PID','SOPDS_TELEBOT_PID'), } Loading
opds_catalog/management/commands/sopds_telebot.py 0 → 100644 +113 −0 Original line number Diff line number Diff line import os import signal import sys import logging from django.core.management.base import BaseCommand from django.db import transaction, connection, connections from django.conf import settings as main_settings from opds_catalog.models import Counter from opds_catalog.sopdscan import opdsScanner from opds_catalog import settings from constance import config class Command(BaseCommand): help = 'SimpleOPDS Telegram Bot engine.' def add_arguments(self, parser): parser.add_argument('command', help='Use [ start | stop | restart ]') parser.add_argument('--verbose',action='store_true', dest='verbose', default=False, help='Set verbosity level for SimpleOPDS telebot.') parser.add_argument('--daemon',action='store_true', dest='daemonize', default=False, help='Daemonize server') def handle(self, *args, **options): self.pidfile = os.path.join(main_settings.BASE_DIR, config.SOPDS_TELEBOT_PID) action = options['command'] self.logger = logging.getLogger('') self.logger.setLevel(logging.DEBUG) formatter=logging.Formatter('%(asctime)s %(levelname)-8s %(message)s') if settings.LOGLEVEL!=logging.NOTSET: # Создаем обработчик для записи логов в файл fh = logging.FileHandler(config.SOPDS_TELEBOT_LOG) fh.setLevel(settings.LOGLEVEL) fh.setFormatter(formatter) self.logger.addHandler(fh) if options['verbose']: # Создадим обработчик для вывода логов на экран с максимальным уровнем вывода ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) ch.setFormatter(formatter) self.logger.addHandler(ch) if (options["daemonize"] and (action in ["start"])): if sys.platform == "win32": self.stdout.write("On Windows platform Daemonize not working.") else: daemonize() if action == "start": self.start() elif action == "stop": pid = open(self.pidfile, "r").read() self.stop(pid) elif action == "restart": pid = open(self.pidfile, "r").read() self.restart(pid) def start(self): writepid(self.pidfile) quit_command = 'CTRL-BREAK' if sys.platform == 'win32' else 'CONTROL-C' self.stdout.write("Quit the sopds_telebot with %s.\n"%quit_command) try: self.sched.start() except (KeyboardInterrupt, SystemExit): pass def stop(self, pid): try: os.kill(int(pid), signal.SIGTERM) except OSError as e: self.stdout.write("Error stopping sopds_telebot: %s"%str(e)) def restart(self, pid): self.stop(pid) self.start() def writepid(pid_file): """ Write the process ID to disk. """ fp = open(pid_file, "w") fp.write(str(os.getpid())) fp.close() def daemonize(): """ Detach from the terminal and continue as a daemon. """ # swiped from twisted/scripts/twistd.py # See http://www.erlenstar.demon.co.uk/unix/faq_toc.html#TOC16 if os.fork(): # launch child and... os._exit(0) # kill off parent os.setsid() if os.fork(): # launch child and... os._exit(0) # kill off parent again. os.umask(0) std_in = open("/dev/null", 'r') std_out = open(config.SOPDS_TELEBOT_LOG, 'a+') os.dup2(std_in.fileno(), sys.stdin.fileno()) os.dup2(std_out.fileno(), sys.stdout.fileno()) os.dup2(std_out.fileno(), sys.stderr.fileno()) os.close(std_in.fileno()) os.close(std_out.fileno())
sopds/settings.py +7 −2 Original line number Diff line number Diff line Loading @@ -174,6 +174,8 @@ CONSTANCE_CONFIG = OrderedDict([ ('SOPDS_SCAN_START_DIRECTLY', (False,_('Turn once scanning directly'))), ('SOPDS_CACHE_TIME', (1200, _('Pages cache time'))), ('SOPDS_TELEBOT_API_TOKEN', ('', _('Telegramm API Token'))), ('SOPDS_AUTH', (True,_('Enable authentication'))), ('SOPDS_ALPHABET_MENU', (True,_('Enable alphabet submenu'))), ('SOPDS_DOUBLES_HIDE', (True,_('This flag hides found doublicates'))), Loading Loading @@ -204,8 +206,10 @@ CONSTANCE_CONFIG = OrderedDict([ ('SOPDS_SERVER_LOG', (os.path.join(BASE_DIR,'opds_catalog/log/sopds_server.log'),_('Path to logfile for sopds_server process'))), ('SOPDS_SCANNER_LOG', (os.path.join(BASE_DIR,'opds_catalog/log/sopds_scanner.log'),_('Path to logfile for sopds_scanner process'))), ('SOPDS_TELEBOT_LOG', (os.path.join(BASE_DIR, 'opds_catalog/log/sopds_telebot.log'), _('Path to logfile for sopds_telebot process'))), ('SOPDS_SERVER_PID', (os.path.join(BASE_DIR,'opds_catalog/tmp/sopds_server.pid'),_('Path to pidfile for sopds_server process'))), ('SOPDS_SCANNER_PID', (os.path.join(BASE_DIR,'opds_catalog/tmp/sopds_scanner.pid'),_('Path to pidfile for sopds_scanner process'))), ('SOPDS_TELEBOT_PID', (os.path.join(BASE_DIR, 'opds_catalog/tmp/sopds_telebot.pid'), _('Path to pidfile for sopds_telebot process'))), ]) Loading @@ -214,8 +218,9 @@ CONSTANCE_CONFIG_FIELDSETS = { '2. Server Options': ('SOPDS_AUTH', 'SOPDS_ALPHABET_MENU', 'SOPDS_DOUBLES_HIDE', 'SOPDS_COVER_SHOW', 'SOPDS_SPLITITEMS', 'SOPDS_MAXITEMS', 'SOPDS_TITLE_AS_FILENAME', 'SOPDS_NOCOVER_PATH'), '3. Scanner Options': ('SOPDS_FB2SAX','SOPDS_ZIPSCAN','SOPDS_ZIPCODEPAGE', 'SOPDS_INPX_ENABLE', 'SOPDS_INPX_SKIP_UNCHANGED', 'SOPDS_INPX_TEST_ZIP', 'SOPDS_INPX_TEST_FILES', 'SOPDS_DELETE_LOGICAL'), '4. Scanner Shedule': ('SOPDS_SCAN_SHED_MIN', 'SOPDS_SCAN_SHED_HOUR', 'SOPDS_SCAN_SHED_DAY','SOPDS_SCAN_SHED_DOW'), '5. Converters Options': ('SOPDS_FB2TOEPUB', 'SOPDS_FB2TOMOBI', 'SOPDS_TEMP_DIR'), '6. Log & PID Files': ('SOPDS_SERVER_LOG', 'SOPDS_SCANNER_LOG', 'SOPDS_SERVER_PID','SOPDS_SCANNER_PID'), '5. Telegramm Bot Options': ('SOPDS_TELEBOT_API_TOKEN'), '6. Converters Options': ('SOPDS_FB2TOEPUB', 'SOPDS_FB2TOMOBI', 'SOPDS_TEMP_DIR'), '7. Log & PID Files': ('SOPDS_SERVER_LOG', 'SOPDS_SCANNER_LOG', 'SOPDS_TELEBOT_LOG','SOPDS_SERVER_PID','SOPDS_SCANNER_PID','SOPDS_TELEBOT_PID'), }