This commit is contained in:
@@ -1,9 +1,12 @@
|
|||||||
|
import logging
|
||||||
import time
|
import time
|
||||||
|
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
from ...services.timelapse_worker import run_one_job
|
from ...services.timelapse_worker import run_one_job
|
||||||
|
|
||||||
|
logger = logging.getLogger('camlaps')
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = 'Запуск обработчика очереди таймлапсов.'
|
help = 'Запуск обработчика очереди таймлапсов.'
|
||||||
@@ -18,14 +21,24 @@ class Command(BaseCommand):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
|
logger.info('worker_cmd:handle:start')
|
||||||
once = options['once']
|
once = options['once']
|
||||||
sleep_seconds = options['sleep']
|
sleep_seconds = options['sleep']
|
||||||
|
|
||||||
if once:
|
if once:
|
||||||
|
try:
|
||||||
run_one_job()
|
run_one_job()
|
||||||
|
logger.info('worker_cmd:handle:done mode=once')
|
||||||
|
except Exception:
|
||||||
|
logger.exception('worker_cmd:handle:error mode=once')
|
||||||
|
raise
|
||||||
return
|
return
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
|
try:
|
||||||
processed = run_one_job()
|
processed = run_one_job()
|
||||||
if not processed:
|
if not processed:
|
||||||
time.sleep(sleep_seconds)
|
time.sleep(sleep_seconds)
|
||||||
|
except Exception:
|
||||||
|
logger.exception('worker_cmd:handle:error mode=loop')
|
||||||
|
raise
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import logging
|
||||||
import subprocess
|
import subprocess
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
@@ -16,6 +17,8 @@ from .services.cameras import (
|
|||||||
list_active_cameras,
|
list_active_cameras,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
logger = logging.getLogger('camlaps')
|
||||||
|
|
||||||
|
|
||||||
def index(request):
|
def index(request):
|
||||||
cameras = list_active_cameras()
|
cameras = list_active_cameras()
|
||||||
@@ -66,8 +69,11 @@ def job_list(request):
|
|||||||
|
|
||||||
@require_POST
|
@require_POST
|
||||||
def start_queue(request):
|
def start_queue(request):
|
||||||
|
logger.info('queue:start_request:start')
|
||||||
|
|
||||||
has_planned = TimelapseJob.objects.filter(status=TimelapseJob.Status.PLANNED).exists()
|
has_planned = TimelapseJob.objects.filter(status=TimelapseJob.Status.PLANNED).exists()
|
||||||
if not has_planned:
|
if not has_planned:
|
||||||
|
logger.info('queue:start_request:done no_planned_jobs=true')
|
||||||
return redirect(f"{reverse('camlaps:job_list')}?started=none")
|
return redirect(f"{reverse('camlaps:job_list')}?started=none")
|
||||||
|
|
||||||
cmd = [sys.executable, 'manage.py', 'run_timelapse_worker', '--once']
|
cmd = [sys.executable, 'manage.py', 'run_timelapse_worker', '--once']
|
||||||
@@ -83,8 +89,10 @@ def start_queue(request):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
subprocess.Popen(cmd, **kwargs)
|
subprocess.Popen(cmd, **kwargs)
|
||||||
|
logger.info('queue:start_request:done worker_started=true')
|
||||||
return redirect(f"{reverse('camlaps:job_list')}?started=worker")
|
return redirect(f"{reverse('camlaps:job_list')}?started=worker")
|
||||||
except Exception:
|
except Exception:
|
||||||
|
logger.exception('queue:start_request:error')
|
||||||
return redirect(f"{reverse('camlaps:job_list')}?started=error")
|
return redirect(f"{reverse('camlaps:job_list')}?started=error")
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -143,3 +143,35 @@ USE_TZ = True
|
|||||||
# https://docs.djangoproject.com/en/6.0/howto/static-files/
|
# https://docs.djangoproject.com/en/6.0/howto/static-files/
|
||||||
|
|
||||||
STATIC_URL = 'static/'
|
STATIC_URL = 'static/'
|
||||||
|
|
||||||
|
LOG_DIR = BASE_DIR / 'logs'
|
||||||
|
LOG_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': False,
|
||||||
|
'formatters': {
|
||||||
|
'standard': {
|
||||||
|
'format': '%(asctime)s | %(levelname)s | %(name)s | %(message)s',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'handlers': {
|
||||||
|
'console': {
|
||||||
|
'class': 'logging.StreamHandler',
|
||||||
|
'formatter': 'standard',
|
||||||
|
},
|
||||||
|
'camlaps_file': {
|
||||||
|
'class': 'logging.FileHandler',
|
||||||
|
'filename': str(LOG_DIR / 'camlaps.log'),
|
||||||
|
'formatter': 'standard',
|
||||||
|
'encoding': 'utf-8',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'camlaps': {
|
||||||
|
'handlers': ['console', 'camlaps_file'],
|
||||||
|
'level': 'INFO',
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user