nedo-vision-worker 1.1.3__tar.gz → 1.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/PKG-INFO +1 -3
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/README.md +0 -2
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/__init__.py +1 -1
- nedo_vision_worker-1.2.0/nedo_vision_worker/cli.py +224 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/database/DatabaseManager.py +3 -3
- nedo_vision_worker-1.2.0/nedo_vision_worker/doctor.py +1133 -0
- nedo_vision_worker-1.2.0/nedo_vision_worker/models/ai_model.py +62 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/AIModelService_pb2.py +12 -10
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/AIModelService_pb2_grpc.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/DatasetSourceService_pb2.py +2 -2
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/DatasetSourceService_pb2_grpc.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/HumanDetectionService_pb2.py +2 -2
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/HumanDetectionService_pb2_grpc.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/PPEDetectionService_pb2.py +2 -2
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/PPEDetectionService_pb2_grpc.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/VisionWorkerService_pb2.py +2 -2
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/VisionWorkerService_pb2_grpc.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2.py +2 -2
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourcePipelineService_pb2_grpc.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourceService_pb2.py +2 -2
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/WorkerSourceService_pb2_grpc.py +1 -1
- nedo_vision_worker-1.2.0/nedo_vision_worker/services/AIModelClient.py +386 -0
- nedo_vision_worker-1.2.0/nedo_vision_worker/services/DirectDeviceToRTMPStreamer.py +534 -0
- nedo_vision_worker-1.2.0/nedo_vision_worker/services/GrpcClientBase.py +189 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/PPEDetectionClient.py +0 -7
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/RestrictedAreaClient.py +0 -5
- nedo_vision_worker-1.2.0/nedo_vision_worker/services/SharedDirectDeviceClient.py +278 -0
- nedo_vision_worker-1.2.0/nedo_vision_worker/services/SharedVideoStreamServer.py +315 -0
- nedo_vision_worker-1.2.0/nedo_vision_worker/services/SystemWideDeviceCoordinator.py +236 -0
- nedo_vision_worker-1.2.0/nedo_vision_worker/services/VideoSharingDaemon.py +832 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/VideoStreamClient.py +30 -13
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerSourceClient.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerSourcePipelineClient.py +28 -6
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerSourceUpdater.py +30 -3
- nedo_vision_worker-1.2.0/nedo_vision_worker/util/VideoProbeUtil.py +327 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DataSyncWorker.py +1 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/PipelineImageWorker.py +1 -1
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/VideoStreamWorker.py +27 -3
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/WorkerManager.py +2 -29
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker_service.py +22 -5
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/PKG-INFO +1 -3
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/SOURCES.txt +5 -0
- nedo_vision_worker-1.1.3/nedo_vision_worker/cli.py +0 -195
- nedo_vision_worker-1.1.3/nedo_vision_worker/doctor.py +0 -453
- nedo_vision_worker-1.1.3/nedo_vision_worker/models/ai_model.py +0 -29
- nedo_vision_worker-1.1.3/nedo_vision_worker/services/AIModelClient.py +0 -362
- nedo_vision_worker-1.1.3/nedo_vision_worker/services/GrpcClientBase.py +0 -155
- nedo_vision_worker-1.1.3/nedo_vision_worker/util/VideoProbeUtil.py +0 -120
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/config/ConfigurationManager.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/config/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/database/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/initializer/AppInitializer.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/initializer/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/auth.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/config.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/dataset_source.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/logs.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/ppe_detection.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/ppe_detection_label.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/restricted_area_violation.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/user.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline_config.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline_debug.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/models/worker_source_pipeline_detection.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/protos/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/AIModelRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/DatasetSourceRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/PPEDetectionRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/RestrictedAreaRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourcePipelineDebugRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourcePipelineDetectionRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourcePipelineRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/WorkerSourceRepository.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/repositories/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/ConnectionInfoClient.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/DatasetSourceClient.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/FileToRTMPServer.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/GrpcClientManager.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/ImageUploadClient.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/RTSPtoRTMPStreamer.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/SystemUsageClient.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/WorkerStatusClient.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/services/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/HardwareID.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/ImageUploader.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/Networking.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/PlatformDetector.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/SystemMonitor.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/util/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/CoreActionWorker.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DataSenderWorker.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DatasetFrameSender.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/DatasetFrameWorker.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/PPEDetectionManager.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/PipelineActionWorker.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/RabbitMQListener.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/RestrictedAreaManager.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/SystemUsageManager.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/worker/__init__.py +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/dependency_links.txt +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/entry_points.txt +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/requires.txt +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker.egg-info/top_level.txt +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/pyproject.toml +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/setup.cfg +0 -0
- {nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/setup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: nedo-vision-worker
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.2.0
|
|
4
4
|
Summary: Nedo Vision Worker Service Library for AI Vision Processing
|
|
5
5
|
Author-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
6
6
|
Maintainer-email: Willy Achmat Fauzi <willy.achmat@gmail.com>
|
|
@@ -179,10 +179,8 @@ This will check:
|
|
|
179
179
|
- ✅ Python version and dependencies
|
|
180
180
|
- ✅ FFmpeg installation and functionality
|
|
181
181
|
- ✅ OpenCV installation and optimizations
|
|
182
|
-
- ✅ gRPC connectivity
|
|
183
182
|
- ✅ NVIDIA GPU support and capabilities
|
|
184
183
|
- ✅ Storage permissions
|
|
185
|
-
- ✅ Network connectivity
|
|
186
184
|
|
|
187
185
|
## 📖 Quick Start
|
|
188
186
|
|
|
@@ -126,10 +126,8 @@ This will check:
|
|
|
126
126
|
- ✅ Python version and dependencies
|
|
127
127
|
- ✅ FFmpeg installation and functionality
|
|
128
128
|
- ✅ OpenCV installation and optimizations
|
|
129
|
-
- ✅ gRPC connectivity
|
|
130
129
|
- ✅ NVIDIA GPU support and capabilities
|
|
131
130
|
- ✅ Storage permissions
|
|
132
|
-
- ✅ Network connectivity
|
|
133
131
|
|
|
134
132
|
## 📖 Quick Start
|
|
135
133
|
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import signal
|
|
3
|
+
import sys
|
|
4
|
+
import traceback
|
|
5
|
+
import logging
|
|
6
|
+
from typing import NoReturn
|
|
7
|
+
|
|
8
|
+
from .worker_service import WorkerService
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class NedoWorkerCLI:
|
|
12
|
+
"""Main CLI application for Nedo Vision Worker Service."""
|
|
13
|
+
|
|
14
|
+
def __init__(self):
|
|
15
|
+
self.logger = logging.getLogger(__name__)
|
|
16
|
+
self._setup_signal_handlers()
|
|
17
|
+
|
|
18
|
+
def _setup_signal_handlers(self) -> None:
|
|
19
|
+
"""Set up signal handlers for graceful shutdown."""
|
|
20
|
+
signal.signal(signal.SIGINT, self._signal_handler)
|
|
21
|
+
signal.signal(signal.SIGTERM, self._signal_handler)
|
|
22
|
+
|
|
23
|
+
def _signal_handler(self, signum: int, frame) -> NoReturn:
|
|
24
|
+
"""Handle system signals for graceful shutdown."""
|
|
25
|
+
self.logger.info(f"Received signal {signum}, shutting down...")
|
|
26
|
+
sys.exit(0)
|
|
27
|
+
|
|
28
|
+
def create_parser(self) -> argparse.ArgumentParser:
|
|
29
|
+
"""Create and configure the argument parser."""
|
|
30
|
+
parser = argparse.ArgumentParser(
|
|
31
|
+
description="Nedo Vision Worker Service",
|
|
32
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
33
|
+
epilog="""
|
|
34
|
+
Examples:
|
|
35
|
+
# Check system dependencies and requirements
|
|
36
|
+
nedo-worker doctor
|
|
37
|
+
|
|
38
|
+
# Start worker service
|
|
39
|
+
nedo-worker run --token your-token-here
|
|
40
|
+
|
|
41
|
+
# Start with custom configuration
|
|
42
|
+
nedo-worker run --token your-token-here \\
|
|
43
|
+
--rtmp-server rtmp://custom.server.com:1935/live \\
|
|
44
|
+
--server-host custom.server.com \\
|
|
45
|
+
--storage-path /custom/storage/path
|
|
46
|
+
"""
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
parser.add_argument(
|
|
50
|
+
"--version",
|
|
51
|
+
action="version",
|
|
52
|
+
version="nedo-vision-worker 1.2.0"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
subparsers = parser.add_subparsers(
|
|
56
|
+
dest='command',
|
|
57
|
+
help='Available commands',
|
|
58
|
+
required=True
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
self._add_doctor_command(subparsers)
|
|
62
|
+
self._add_run_command(subparsers)
|
|
63
|
+
|
|
64
|
+
return parser
|
|
65
|
+
|
|
66
|
+
def _add_doctor_command(self, subparsers) -> None:
|
|
67
|
+
"""Add the doctor command."""
|
|
68
|
+
subparsers.add_parser(
|
|
69
|
+
'doctor',
|
|
70
|
+
help='Check system dependencies and requirements',
|
|
71
|
+
description='Run diagnostic checks for FFmpeg, OpenCV, gRPC and other dependencies'
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
def _add_run_command(self, subparsers) -> None:
|
|
75
|
+
"""Add the run command with its arguments."""
|
|
76
|
+
run_parser = subparsers.add_parser(
|
|
77
|
+
'run',
|
|
78
|
+
help='Start the worker service',
|
|
79
|
+
description='Start the Nedo Vision Worker Service'
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
run_parser.add_argument(
|
|
83
|
+
"--token",
|
|
84
|
+
required=True,
|
|
85
|
+
help="Authentication token for the worker (obtained from frontend)"
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
run_parser.add_argument(
|
|
89
|
+
"--server-host",
|
|
90
|
+
default="be.vision.sindika.co.id",
|
|
91
|
+
help="Server hostname for communication (default: %(default)s)"
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
run_parser.add_argument(
|
|
95
|
+
"--server-port",
|
|
96
|
+
type=int,
|
|
97
|
+
default=50051,
|
|
98
|
+
help="Server port for gRPC communication (default: %(default)s)"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
run_parser.add_argument(
|
|
102
|
+
"--rtmp-server",
|
|
103
|
+
default="rtmp://live.vision.sindika.co.id:1935/live",
|
|
104
|
+
help="RTMP server URL for video streaming (default: %(default)s)"
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
run_parser.add_argument(
|
|
108
|
+
"--storage-path",
|
|
109
|
+
default="data",
|
|
110
|
+
help="Storage path for databases and files (default: %(default)s)"
|
|
111
|
+
)
|
|
112
|
+
|
|
113
|
+
run_parser.add_argument(
|
|
114
|
+
"--system-usage-interval",
|
|
115
|
+
type=int,
|
|
116
|
+
default=30,
|
|
117
|
+
metavar="SECONDS",
|
|
118
|
+
help="System usage reporting interval in seconds (default: %(default)s)"
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
run_parser.add_argument(
|
|
122
|
+
"--log-level",
|
|
123
|
+
choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
|
|
124
|
+
default="INFO",
|
|
125
|
+
help="Set the logging level (default: %(default)s)"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
def run_doctor_command(self) -> int:
|
|
129
|
+
"""Execute the doctor command."""
|
|
130
|
+
try:
|
|
131
|
+
from .doctor import main as doctor_main
|
|
132
|
+
return doctor_main()
|
|
133
|
+
except ImportError as e:
|
|
134
|
+
self.logger.error(f"Failed to import doctor module: {e}")
|
|
135
|
+
return 1
|
|
136
|
+
except Exception as e:
|
|
137
|
+
self.logger.error(f"Doctor command failed: {e}")
|
|
138
|
+
return 1
|
|
139
|
+
|
|
140
|
+
def run_worker_service(self, args: argparse.Namespace) -> int:
|
|
141
|
+
"""Start and run the worker service."""
|
|
142
|
+
# Configure logging
|
|
143
|
+
logging.basicConfig(
|
|
144
|
+
level=getattr(logging, args.log_level),
|
|
145
|
+
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
146
|
+
)
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
# Create the worker service
|
|
150
|
+
service = WorkerService(
|
|
151
|
+
server_host=args.server_host,
|
|
152
|
+
token=args.token,
|
|
153
|
+
system_usage_interval=args.system_usage_interval,
|
|
154
|
+
rtmp_server=args.rtmp_server,
|
|
155
|
+
storage_path=args.storage_path,
|
|
156
|
+
server_port=args.server_port
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
# Log startup information
|
|
160
|
+
self._log_startup_info(args)
|
|
161
|
+
|
|
162
|
+
# Start the service
|
|
163
|
+
service.run()
|
|
164
|
+
|
|
165
|
+
# Keep the service running
|
|
166
|
+
self._wait_for_service(service)
|
|
167
|
+
|
|
168
|
+
return 0
|
|
169
|
+
|
|
170
|
+
except KeyboardInterrupt:
|
|
171
|
+
self.logger.info("Shutdown requested by user")
|
|
172
|
+
return 0
|
|
173
|
+
except Exception as e:
|
|
174
|
+
self.logger.error(f"Service failed: {e}")
|
|
175
|
+
if args.log_level == "DEBUG":
|
|
176
|
+
traceback.print_exc()
|
|
177
|
+
return 1
|
|
178
|
+
|
|
179
|
+
def _log_startup_info(self, args: argparse.Namespace) -> None:
|
|
180
|
+
"""Log service startup information."""
|
|
181
|
+
self.logger.info("🚀 Starting Nedo Vision Worker Service...")
|
|
182
|
+
self.logger.info(f"🌐 Server: {args.server_host}")
|
|
183
|
+
self.logger.info(f"🔑 Token: {args.token[:8]}{'*' * (len(args.token) - 8)}")
|
|
184
|
+
self.logger.info(f"⏱️ System Usage Interval: {args.system_usage_interval}s")
|
|
185
|
+
self.logger.info(f"📡 RTMP Server: {args.rtmp_server}")
|
|
186
|
+
self.logger.info(f"💾 Storage Path: {args.storage_path}")
|
|
187
|
+
self.logger.info("Press Ctrl+C to stop the service")
|
|
188
|
+
|
|
189
|
+
def _wait_for_service(self, service: WorkerService) -> None:
|
|
190
|
+
"""Wait for the service to run and handle shutdown."""
|
|
191
|
+
import time
|
|
192
|
+
|
|
193
|
+
try:
|
|
194
|
+
while getattr(service, 'running', False):
|
|
195
|
+
time.sleep(1)
|
|
196
|
+
except KeyboardInterrupt:
|
|
197
|
+
self.logger.info("🛑 Shutdown requested...")
|
|
198
|
+
finally:
|
|
199
|
+
if hasattr(service, 'stop'):
|
|
200
|
+
service.stop()
|
|
201
|
+
self.logger.info("✅ Service stopped successfully")
|
|
202
|
+
|
|
203
|
+
def run(self) -> int:
|
|
204
|
+
"""Main entry point for the CLI application."""
|
|
205
|
+
parser = self.create_parser()
|
|
206
|
+
args = parser.parse_args()
|
|
207
|
+
|
|
208
|
+
if args.command == 'doctor':
|
|
209
|
+
return self.run_doctor_command()
|
|
210
|
+
elif args.command == 'run':
|
|
211
|
+
return self.run_worker_service(args)
|
|
212
|
+
else:
|
|
213
|
+
parser.print_help()
|
|
214
|
+
return 1
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def main() -> int:
|
|
218
|
+
"""Main CLI entry point."""
|
|
219
|
+
cli = NedoWorkerCLI()
|
|
220
|
+
return cli.run()
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
if __name__ == "__main__":
|
|
224
|
+
sys.exit(main())
|
{nedo_vision_worker-1.1.3 → nedo_vision_worker-1.2.0}/nedo_vision_worker/database/DatabaseManager.py
RENAMED
|
@@ -20,13 +20,13 @@ _storage_path = None # Global storage path
|
|
|
20
20
|
def set_storage_path(storage_path: str):
|
|
21
21
|
"""Set the global storage path for the application."""
|
|
22
22
|
global _storage_path
|
|
23
|
-
_storage_path = Path(storage_path)
|
|
23
|
+
_storage_path = Path(storage_path).resolve() # Convert to absolute path
|
|
24
24
|
|
|
25
25
|
def _get_storage_paths():
|
|
26
26
|
"""Get storage paths using the configured storage path."""
|
|
27
27
|
global _storage_path
|
|
28
28
|
if _storage_path is None:
|
|
29
|
-
_storage_path = Path("data") # Default fallback
|
|
29
|
+
_storage_path = Path("data").resolve() # Default fallback as absolute path
|
|
30
30
|
|
|
31
31
|
return {
|
|
32
32
|
"db": _storage_path / "sqlite",
|
|
@@ -38,7 +38,7 @@ def get_storage_path(subdir: str = None) -> Path:
|
|
|
38
38
|
"""Get a storage path for a specific subdirectory."""
|
|
39
39
|
global _storage_path
|
|
40
40
|
if _storage_path is None:
|
|
41
|
-
_storage_path = Path("data") # Default fallback
|
|
41
|
+
_storage_path = Path("data").resolve() # Default fallback as absolute path
|
|
42
42
|
|
|
43
43
|
if subdir:
|
|
44
44
|
return _storage_path / subdir
|