diff --git a/README.md b/README.md index c745c50b518c42c44105751d824de2a06c1e6e02..ff9e5c6569a51c36e8ed5bff6895ec8ac78adb37 100644 --- a/README.md +++ b/README.md @@ -24,12 +24,6 @@ 1.3 Настраиваем ./sopds/settings.py (настройки в конце файла) LANGUAGE_CODE = 'ru-RU' - - SOPDS_ROOT_LIB = < Путь к каталогу с книгами > - SOPDS_AUTH = < False | True > - SOPDS_SCAN_SHED_MIN = '0' - SOPDS_SCAN_SHED_HOUR = '0,12' - SOPDS_INPX_ENABLE = < False | True > 1.4 Производим инициализацию базы данных и заполнение начальными данными (жанры) @@ -40,19 +34,23 @@ python3 manage.py createsuperuser -1.6 Вручную запускаем разовое сканирование коллекции книг +1.6 Настраиваем путь к Вашему каталогу с книгами (Однако Вы можете сначала запустить sopds_server согласно п.1.8. и настроить указанный параметр через веб-интерфейс) + + python3 manage.py sopds_util setconf SOPDS_ROOT_LIB 'Путь к каталогу с книгами' + +1.7 Вручную запускаем разовое сканирование коллекции книг (Выполняется относительно долго: например, моя коллекция книг в архивах объемом 180Гб сканировалась в БД MYSQL - 1час) python3 manage.py sopds_scanner scan --daemon -1.7 Запускаем встроенный HTTP/OPDS сервер +1.8 Запускаем встроенный HTTP/OPDS сервер python3 manage.py sopds_server start --daemon Однако наилучшим способом, все же является настройка в качестве HTTP/OPDS серверов Apache или Nginx (точка входа ./sopds/wsgi.py) -1.8 Запускаем SCANNER сервер (опционально, необходим для автоматизированного периодического пересканирования коллекции) +1.9 Запускаем SCANNER сервер (опционально, необходим для автоматизированного периодического пересканирования коллекции) Перед запуском SCANNER сервера необходимо убедится, что сканирование, запущеное в п.1.6 уже завершено, т.к. может возникнуть ситуация с запуском параллельного процесса сканирования, что может привести к ошибкам. Примите во внимание, что в настройках, указанных в п.1.3 задан периодический запуск сканирования 2 раза @@ -258,12 +256,18 @@ MySQL по сравнению с sqlite работает гораздо быст python3 manage.py sopds_util load_mygenres -Если вы используете MySQL и при очистке БД у вас возникла ошибка (2006, 'MySQL server has gone away'), -то добавьте в файл настройки /etc/my.cnf следующие настройки, после чего перезапустите сервер БД: +Посмотреть все параметры конфигурации: + + python3 manage.py sopds_util getconf + +Посмотреть значение конкретного параметр конфигурации: - wait_timeout = 600 - max_allowed_packet = 64M - + python3 manage.py sopds_util getconf SOPDS_ROOT_LIB + +Задать значение конкретного параметр конфигурации: + + python3 manage.py sopds_util setconf SOPDS_ROOT_LIB '\home\files\books' + Запустить однократное сканирование коллекции книг: python3 manage.py sopds_scanner scan [--verbose] [--daemon] @@ -351,9 +355,13 @@ MySQL по сравнению с sqlite работает гораздо быст (по умолчанию SOPDS_SCANNER_PID = os.path.join(settings.BASE_DIR,'opds_catalog/tmp/sopds_scanner.pid')) Параметры **SOPDS_SCAN_SHED_XXX** устанавливают значения шедулера, для периодического сканирования коллекции книг при помощи **manage.py sopds_scanner start**. Возможные значения можно найти на следующей странице: # https://apscheduler.readthedocs.io/en/latest/modules/triggers/cron.html#module-apscheduler.triggers.cron +Изменения указанных ниже параметров через Web-интерфейс или командную строку проверяется процессом sopds_scanner каждые 10 минут. +В случае обнаружения изменений sopds_scanner автоматически вносит соответсвующие изменения в планировщик. + (по умолчанию SOPDS_SCAN_SHED_MIN = '0') -(по умолчанию SOPDS_SCAN_SHED_HOUR = '0') +(по умолчанию SOPDS_SCAN_SHED_HOUR = '0,12') (по умолчанию SOPDS_SCAN_SHED_DAY = '*') (по умолчанию SOPDS_SCAN_SHED_DOW = '*') + diff --git a/opds_catalog/management/commands/sopds_util.py b/opds_catalog/management/commands/sopds_util.py index 3ab65eb06e5506812ebd360a9c198c4ca691228a..62dc81cc1eb0575d05c016ab71c3c546c6647c39 100644 --- a/opds_catalog/management/commands/sopds_util.py +++ b/opds_catalog/management/commands/sopds_util.py @@ -1,22 +1,25 @@ from django.core.management.base import BaseCommand from django.core.management import call_command from django.db import transaction +from django.conf import settings as main_settings from opds_catalog import opdsdb from opds_catalog import models from opds_catalog.models import Counter +from constance import config + class Command(BaseCommand): help = 'Utils for SOPDS.' verbose = False def add_arguments(self, parser): - parser.add_argument('command', help='Use [ clear | info | save_mygenres | load_mygenres ]') + parser.add_argument('command', action="store", nargs='*', help='Use [ clear | info | save_mygenres | load_mygenres | setconf | getconf ]') parser.add_argument('--verbose',action='store_true', dest='verbose', default=False, help='Set verbosity level for books collection scan.') parser.add_argument('--nogenres',action='store_true', dest='nogenres', default=False, help='Not install genres fom fixtures.') def handle(self, *args, **options): - action = options['command'] + action = options['command'][0] self.verbose = options['verbose'] self.nogenres = options['nogenres'] @@ -30,6 +33,13 @@ class Command(BaseCommand): self.save_mygenres() elif action == "load_mygenres": self.load_mygenres() + elif action == "setconf": + self.confparam = options['command'][1] if len(options['command'])>1 else None + self.confvalue = options['command'][2] if len(options['command'])>2 else None + self.setconf(self.confparam, self.confvalue) + elif action == "getconf": + self.confparam = options['command'][1] if len(options['command'])>1 else None + self.getconf(self.confparam) def clear(self): with transaction.atomic(): @@ -56,4 +66,17 @@ class Command(BaseCommand): Counter.objects.update_known_counters() self.stdout.write('Genres load from opds_catalog/fixtures/mygenres.json') + def setconf(self, confparam, confvalue): + if confparam and confvalue: + call_command('constance', 'set',confparam, confvalue, app_label='opds_catalog') + self.stdout.write('Config parameter %s set to %s'%(confparam, confvalue)) + + + def getconf(self, confparam): + if confparam: + call_command('constance', 'get', confparam, app_label='opds_catalog') + else: + call_command('constance', 'list', app_label='opds_catalog') + +