This MVP release provides a complete full-stack solution for managing action mappings in Geutebruck's GeViScope and GeViSoft video surveillance systems. ## Features ### Flutter Web Application (Port 8081) - Modern, responsive UI for managing action mappings - Action picker dialog with full parameter configuration - Support for both GSC (GeViScope) and G-Core server actions - Consistent UI for input and output actions with edit/delete capabilities - Real-time action mapping creation, editing, and deletion - Server categorization (GSC: prefix for GeViScope, G-Core: prefix for G-Core servers) ### FastAPI REST Backend (Port 8000) - RESTful API for action mapping CRUD operations - Action template service with comprehensive action catalog (247 actions) - Server management (G-Core and GeViScope servers) - Configuration tree reading and writing - JWT authentication with role-based access control - PostgreSQL database integration ### C# SDK Bridge (gRPC, Port 50051) - Native integration with GeViSoft SDK (GeViProcAPINET_4_0.dll) - Action mapping creation with correct binary format - Support for GSC and G-Core action types - Proper Camera parameter inclusion in action strings (fixes CrossSwitch bug) - Action ID lookup table with server-specific action IDs - Configuration reading/writing via SetupClient ## Bug Fixes - **CrossSwitch Bug**: GSC and G-Core actions now correctly display camera/PTZ head parameters in GeViSet - Action strings now include Camera parameter: `@ PanLeft (Comment: "", Camera: 101028)` - Proper filter flags and VideoInput=0 for action mappings - Correct action ID assignment (4198 for GSC, 9294 for G-Core PanLeft) ## Technical Stack - **Frontend**: Flutter Web, Dart, Dio HTTP client - **Backend**: Python FastAPI, PostgreSQL, Redis - **SDK Bridge**: C# .NET 8.0, gRPC, GeViSoft SDK - **Authentication**: JWT tokens - **Configuration**: GeViSoft .set files (binary format) ## Credentials - GeViSoft/GeViScope: username=sysadmin, password=masterkey - Default admin: username=admin, password=admin123 ## Deployment All services run on localhost: - Flutter Web: http://localhost:8081 - FastAPI: http://localhost:8000 - SDK Bridge gRPC: localhost:50051 - GeViServer: localhost (default port) Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
205 lines
5.0 KiB
Markdown
205 lines
5.0 KiB
Markdown
# Service Management Scripts
|
|
|
|
Simple PowerShell scripts to manage the Geutebruck API services.
|
|
|
|
## Quick Start
|
|
|
|
### Start Both Services
|
|
```powershell
|
|
.\start-services.ps1
|
|
```
|
|
|
|
### Stop Both Services
|
|
```powershell
|
|
.\stop-services.ps1
|
|
```
|
|
|
|
### Restart Both Services
|
|
```powershell
|
|
.\restart-services.ps1
|
|
```
|
|
|
|
### Check Status
|
|
```powershell
|
|
.\status-services.ps1
|
|
```
|
|
|
|
---
|
|
|
|
## What Each Script Does
|
|
|
|
### start-services.ps1
|
|
- Starts SDK Bridge (GeViScopeBridge.exe)
|
|
- Starts Python API (uvicorn)
|
|
- Checks if already running (won't start duplicates)
|
|
- Runs both in background
|
|
- Shows PIDs and URLs
|
|
|
|
### stop-services.ps1
|
|
- Stops SDK Bridge
|
|
- Stops Python API
|
|
- Safe to run even if not running
|
|
|
|
### restart-services.ps1
|
|
- Stops both services
|
|
- Waits 2 seconds
|
|
- Starts both services
|
|
|
|
### status-services.ps1
|
|
- Shows running status
|
|
- Shows PIDs
|
|
- Shows URLs
|
|
- Tests API health endpoint
|
|
|
|
---
|
|
|
|
## Running as Windows Services (Optional)
|
|
|
|
If you want the services to start automatically on boot, use NSSM (Non-Sucking Service Manager):
|
|
|
|
### 1. Install NSSM
|
|
```powershell
|
|
# Using Chocolatey
|
|
choco install nssm
|
|
|
|
# Or download from: https://nssm.cc/download
|
|
```
|
|
|
|
### 2. Install SDK Bridge Service
|
|
```powershell
|
|
nssm install GeutebruckSDKBridge "C:\DEV\COPILOT\geutebruck-api\src\sdk-bridge\GeViScopeBridge\bin\Release\net8.0\GeViScopeBridge.exe"
|
|
nssm set GeutebruckSDKBridge AppDirectory "C:\DEV\COPILOT\geutebruck-api\src\sdk-bridge\GeViScopeBridge\bin\Release\net8.0"
|
|
nssm set GeutebruckSDKBridge Description "Geutebruck SDK Bridge - gRPC server for GeViScope/GeViSoft"
|
|
nssm set GeutebruckSDKBridge Start SERVICE_AUTO_START
|
|
nssm start GeutebruckSDKBridge
|
|
```
|
|
|
|
### 3. Install Python API Service
|
|
```powershell
|
|
nssm install GeutebruckAPI "C:\DEV\COPILOT\geutebruck-api\.venv\Scripts\uvicorn.exe"
|
|
nssm set GeutebruckAPI AppParameters "main:app --host 0.0.0.0 --port 8000"
|
|
nssm set GeutebruckAPI AppDirectory "C:\DEV\COPILOT\geutebruck-api\src\api"
|
|
nssm set GeutebruckAPI Description "Geutebruck REST API - FastAPI service"
|
|
nssm set GeutebruckAPI Start SERVICE_AUTO_START
|
|
nssm set GeutebruckAPI DependOnService GeutebruckSDKBridge
|
|
nssm start GeutebruckAPI
|
|
```
|
|
|
|
### 4. Manage Windows Services
|
|
```powershell
|
|
# Start
|
|
nssm start GeutebruckSDKBridge
|
|
nssm start GeutebruckAPI
|
|
|
|
# Stop
|
|
nssm stop GeutebruckAPI
|
|
nssm stop GeutebruckSDKBridge
|
|
|
|
# Restart
|
|
nssm restart GeutebruckSDKBridge
|
|
nssm restart GeutebruckAPI
|
|
|
|
# Remove
|
|
nssm remove GeutebruckAPI confirm
|
|
nssm remove GeutebruckSDKBridge confirm
|
|
|
|
# Check status
|
|
nssm status GeutebruckSDKBridge
|
|
nssm status GeutebruckAPI
|
|
```
|
|
|
|
---
|
|
|
|
## Alternative: Task Scheduler (Auto-start on Login)
|
|
|
|
If you don't want full Windows services but want auto-start on login:
|
|
|
|
### Create Scheduled Task
|
|
```powershell
|
|
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" `
|
|
-Argument "-ExecutionPolicy Bypass -File C:\DEV\COPILOT\geutebruck-api\start-services.ps1" `
|
|
-WorkingDirectory "C:\DEV\COPILOT\geutebruck-api"
|
|
|
|
$trigger = New-ScheduledTaskTrigger -AtLogOn
|
|
|
|
$principal = New-ScheduledTaskPrincipal -UserId "$env:USERDOMAIN\$env:USERNAME" -RunLevel Highest
|
|
|
|
Register-ScheduledTask -TaskName "Geutebruck API Services" `
|
|
-Action $action `
|
|
-Trigger $trigger `
|
|
-Principal $principal `
|
|
-Description "Start Geutebruck API services on login"
|
|
```
|
|
|
|
### Remove Scheduled Task
|
|
```powershell
|
|
Unregister-ScheduledTask -TaskName "Geutebruck API Services" -Confirm:$false
|
|
```
|
|
|
|
---
|
|
|
|
## Troubleshooting
|
|
|
|
### Services Won't Start
|
|
1. Check if ports are already in use:
|
|
```powershell
|
|
netstat -ano | findstr "8000"
|
|
netstat -ano | findstr "50051"
|
|
```
|
|
|
|
2. Check GeViServer and GSCServer are running:
|
|
```powershell
|
|
Get-Process -Name "GeViServer","GSCServer"
|
|
```
|
|
|
|
3. Check logs:
|
|
- SDK Bridge: `C:\DEV\COPILOT\geutebruck-api\src\sdk-bridge\GeViScopeBridge\bin\Release\net8.0\logs\`
|
|
- Python API: Check console output or add logging
|
|
|
|
### Can't Stop Services
|
|
```powershell
|
|
# Force kill by name
|
|
Stop-Process -Name "GeViScopeBridge" -Force
|
|
Stop-Process -Name "uvicorn" -Force
|
|
|
|
# Or by port
|
|
$process = Get-NetTCPConnection -LocalPort 8000 | Select-Object -ExpandProperty OwningProcess
|
|
Stop-Process -Id $process -Force
|
|
```
|
|
|
|
### Execution Policy Error
|
|
```powershell
|
|
# Allow scripts for current user
|
|
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
|
|
|
|
# Or run with bypass
|
|
PowerShell -ExecutionPolicy Bypass -File .\start-services.ps1
|
|
```
|
|
|
|
---
|
|
|
|
## Recommended Setup
|
|
|
|
**For Development**:
|
|
- Use `start-services.ps1` / `stop-services.ps1` scripts
|
|
- Keep `--reload` flag for auto-reload on code changes
|
|
|
|
**For Production**:
|
|
- Use NSSM to create Windows services
|
|
- Remove `--reload` flag from uvicorn
|
|
- Configure services to auto-start
|
|
- Set up service recovery options in NSSM
|
|
|
|
---
|
|
|
|
## Quick Reference
|
|
|
|
| Command | Purpose |
|
|
|---------|---------|
|
|
| `.\start-services.ps1` | Start both services |
|
|
| `.\stop-services.ps1` | Stop both services |
|
|
| `.\restart-services.ps1` | Restart both services |
|
|
| `.\status-services.ps1` | Check service status |
|
|
| `http://localhost:8000/docs` | Swagger UI |
|
|
| `http://localhost:8000/health` | Health check |
|