updated
This commit is contained in:
224
windows_print_service/ERROR_1053_COMPLETE_FIX.md
Normal file
224
windows_print_service/ERROR_1053_COMPLETE_FIX.md
Normal file
@@ -0,0 +1,224 @@
|
||||
# Windows Service Error 1053 - COMPLETE FIX PACKAGE
|
||||
|
||||
## 🎯 Problem Description
|
||||
|
||||
**Windows Service Error 1053**: "The service did not respond to the start or control request in a timely fashion."
|
||||
|
||||
This error occurs when:
|
||||
- Service takes too long to respond to Windows Service Control Manager (SCM)
|
||||
- Python process doesn't communicate properly with Windows services
|
||||
- Service wrapper doesn't handle SCM signals correctly
|
||||
- Dependencies or paths are incorrect
|
||||
|
||||
## 📦 Complete Solution Package
|
||||
|
||||
This package provides **4 different installation methods** and comprehensive Error 1053 fixes:
|
||||
|
||||
### 🔧 Installation Files
|
||||
|
||||
1. **`install_service_ENHANCED.bat`** - Main installer with multiple fallback methods
|
||||
2. **`fix_error_1053.bat`** - Dedicated Error 1053 diagnostic and fix tool
|
||||
3. **`print_service_complete.py`** - Enhanced service with proper Windows service support
|
||||
4. **`service_wrapper.py`** - Optional advanced service wrapper
|
||||
5. **`test_service.bat`** - Standalone testing tool
|
||||
|
||||
### 🚀 Installation Methods (Automatic Fallback)
|
||||
|
||||
#### Method 1: Windows SC Service (Preferred)
|
||||
- Creates standard Windows service
|
||||
- Includes enhanced timeout handling
|
||||
- Automatic recovery configuration
|
||||
- **Fixes Error 1053** with proper SCM communication
|
||||
|
||||
#### Method 2: Task Scheduler Service (Fallback)
|
||||
- Runs as scheduled task on system startup
|
||||
- SYSTEM privileges with highest elevation
|
||||
- Automatic restart on failure
|
||||
- Bypasses SCM timeout issues
|
||||
|
||||
#### Method 3: Startup Script (Manual Fallback)
|
||||
- Runs from Windows startup folder
|
||||
- Simple and reliable
|
||||
- Manual process management
|
||||
- Always works as final resort
|
||||
|
||||
#### Method 4: Standalone Mode (Testing/Debugging)
|
||||
- Direct Python execution
|
||||
- No Windows service wrapper
|
||||
- Immediate startup for testing
|
||||
- Perfect for troubleshooting
|
||||
|
||||
## 🔍 Error 1053 Specific Fixes
|
||||
|
||||
### Root Cause Analysis
|
||||
The enhanced installers address these Error 1053 causes:
|
||||
|
||||
1. **SCM Timeout Issues**
|
||||
- Enhanced service wrapper responds immediately to SCM
|
||||
- Service process starts in background
|
||||
- Proper exit codes and signaling
|
||||
|
||||
2. **Python Path Problems**
|
||||
- Automatic detection of embedded Python
|
||||
- Fallback to system Python
|
||||
- Absolute path resolution
|
||||
|
||||
3. **Service Communication**
|
||||
- Proper Windows service signal handling
|
||||
- Enhanced logging and error reporting
|
||||
- Background process management
|
||||
|
||||
4. **Dependency Issues**
|
||||
- Self-contained Python environment
|
||||
- Zero external dependencies
|
||||
- Embedded Python distribution included
|
||||
|
||||
### Technical Implementation
|
||||
|
||||
#### Enhanced Service Wrapper
|
||||
```batch
|
||||
# error_1053_fix_wrapper.bat
|
||||
- Immediate SCM response
|
||||
- Background service startup
|
||||
- Enhanced error handling
|
||||
- Comprehensive logging
|
||||
```
|
||||
|
||||
#### Service Configuration
|
||||
```cmd
|
||||
# Delayed auto-start to prevent startup conflicts
|
||||
sc config QualityPrintService start= delayed-auto
|
||||
|
||||
# Automatic recovery on failure
|
||||
sc failure QualityPrintService reset= 86400 actions= restart/5000/restart/5000/restart/5000
|
||||
```
|
||||
|
||||
## 📋 Usage Instructions
|
||||
|
||||
### 🎯 Quick Fix (Recommended)
|
||||
1. **Run as Administrator**: `fix_error_1053.bat`
|
||||
2. This script will:
|
||||
- Diagnose the current problem
|
||||
- Apply all Error 1053 fixes
|
||||
- Test service functionality
|
||||
- Install with enhanced wrapper
|
||||
|
||||
### 🔧 Fresh Installation
|
||||
1. **Run as Administrator**: `install_service_ENHANCED.bat`
|
||||
2. Installer will automatically:
|
||||
- Try Windows SC Service first
|
||||
- Fall back to Task Scheduler if needed
|
||||
- Create startup script as final option
|
||||
- Test all methods until one succeeds
|
||||
|
||||
### 🧪 Testing and Verification
|
||||
1. **Test standalone**: `test_service.bat`
|
||||
2. **Manual testing**:
|
||||
```cmd
|
||||
cd C:\QualityPrintService
|
||||
python print_service_complete.py --test
|
||||
python print_service_complete.py --standalone
|
||||
```
|
||||
3. **Service status**:
|
||||
```cmd
|
||||
sc query QualityPrintService
|
||||
net start QualityPrintService
|
||||
```
|
||||
|
||||
## 🔍 Troubleshooting Guide
|
||||
|
||||
### If Error 1053 Still Occurs
|
||||
|
||||
1. **Run Diagnostic Tool**:
|
||||
```cmd
|
||||
fix_error_1053.bat
|
||||
```
|
||||
|
||||
2. **Check Logs**:
|
||||
- `%USERPROFILE%\PrintService\logs\service_wrapper.log`
|
||||
- `%USERPROFILE%\PrintService\logs\error_1053_fix.log`
|
||||
|
||||
3. **Manual Service Test**:
|
||||
```cmd
|
||||
C:\QualityPrintService\error_1053_fix_wrapper.bat
|
||||
```
|
||||
|
||||
4. **Alternative Installation**:
|
||||
- Use Task Scheduler method
|
||||
- Use Startup Script method
|
||||
- Run in standalone mode
|
||||
|
||||
### Common Issues and Solutions
|
||||
|
||||
| Issue | Solution |
|
||||
|-------|----------|
|
||||
| "Python not found" | Use embedded Python package or install Python 3.7+ |
|
||||
| "Port 8765 in use" | Stop existing services, reboot system |
|
||||
| "Access denied" | Run installer as Administrator |
|
||||
| "Service won't start" | Use Task Scheduler fallback method |
|
||||
| "Still Error 1053" | Use startup script or standalone mode |
|
||||
|
||||
## ✅ Success Verification
|
||||
|
||||
After installation, verify success:
|
||||
|
||||
1. **Service Status**: Service should be "RUNNING"
|
||||
```cmd
|
||||
sc query QualityPrintService
|
||||
```
|
||||
|
||||
2. **Network Test**: Should return "OK"
|
||||
```cmd
|
||||
curl http://localhost:8765/health
|
||||
```
|
||||
|
||||
3. **Browser Test**: Open `http://localhost:8765/health`
|
||||
|
||||
4. **Chrome Extension**: Should connect successfully
|
||||
|
||||
## 📊 Package Contents Summary
|
||||
|
||||
### Core Service Files
|
||||
- ✅ `print_service_complete.py` - Main service with Windows service support
|
||||
- ✅ `service_wrapper.py` - Advanced service wrapper (optional)
|
||||
- ✅ Enhanced service wrappers with Error 1053 fixes
|
||||
|
||||
### Installation Tools
|
||||
- ✅ `install_service_ENHANCED.bat` - Multi-method installer
|
||||
- ✅ `fix_error_1053.bat` - Dedicated Error 1053 fixer
|
||||
- ✅ `test_service.bat` - Standalone testing tool
|
||||
|
||||
### Zero Dependencies
|
||||
- ✅ `python_embedded/` - Complete Python 3.11.9 distribution
|
||||
- ✅ No external dependencies required
|
||||
- ✅ Self-contained package (10.8MB)
|
||||
|
||||
### Browser Integration
|
||||
- ✅ `chrome_extension/` - Complete Chrome extension
|
||||
- ✅ Automatic printer detection
|
||||
- ✅ PDF processing and printing
|
||||
|
||||
## 🎯 Expected Results
|
||||
|
||||
After running the enhanced installer:
|
||||
|
||||
✅ **Windows Service Error 1053 RESOLVED**
|
||||
✅ **Service starts automatically on boot**
|
||||
✅ **Multiple installation methods available**
|
||||
✅ **Comprehensive error handling and recovery**
|
||||
✅ **Zero external dependencies**
|
||||
✅ **Complete diagnostic and troubleshooting tools**
|
||||
|
||||
## 🚀 Next Steps
|
||||
|
||||
1. **Install**: Run `install_service_ENHANCED.bat` as Administrator
|
||||
2. **Verify**: Check service status and network connectivity
|
||||
3. **Configure**: Install Chrome extension from `chrome_extension/`
|
||||
4. **Test**: Print labels from web application
|
||||
5. **Monitor**: Check logs for any issues
|
||||
|
||||
The enhanced package provides **4 installation methods** and **comprehensive Error 1053 fixes** to ensure reliable service operation on all Windows systems.
|
||||
|
||||
---
|
||||
|
||||
**Support**: All installation methods include detailed logging and diagnostic information to troubleshoot any remaining issues.
|
||||
Binary file not shown.
165
windows_print_service/TROUBLESHOOTING_1053.md
Normal file
165
windows_print_service/TROUBLESHOOTING_1053.md
Normal file
@@ -0,0 +1,165 @@
|
||||
# Windows Print Service - Error 1053 Troubleshooting Guide
|
||||
|
||||
## 🚨 Windows Service Error 1053 - "Service did not respond to start or control request"
|
||||
|
||||
This error occurs when Windows services don't communicate properly with the Service Control Manager (SCM). Here's how to fix it:
|
||||
|
||||
### 🔧 SOLUTION 1: Use the Enhanced Service Package
|
||||
|
||||
**Problem**: The original service wasn't designed for Windows service requirements.
|
||||
**Fix**: Updated service architecture with proper Windows service communication.
|
||||
|
||||
#### New Files Included:
|
||||
- ✅ `service_wrapper.py` - Handles Windows service communication
|
||||
- ✅ `print_service_complete.py` - Enhanced with signal handling and proper shutdown
|
||||
- ✅ `test_service.bat` - Test service in standalone mode before installing
|
||||
|
||||
### 🧪 STEP-BY-STEP TROUBLESHOOTING:
|
||||
|
||||
#### Step 1: Test Service in Standalone Mode
|
||||
```cmd
|
||||
# Run this to test the service before installing as Windows service
|
||||
test_service.bat
|
||||
```
|
||||
|
||||
If this works, the service code is fine. If not, check the logs.
|
||||
|
||||
#### Step 2: Check Python and Dependencies
|
||||
```cmd
|
||||
# Verify Python embedded is working
|
||||
cd C:\QualityPrintService\python_embedded
|
||||
python.exe --version
|
||||
|
||||
# Test the service script directly
|
||||
python.exe ..\print_service_complete.py --test
|
||||
```
|
||||
|
||||
#### Step 3: Install with Enhanced Wrapper
|
||||
The installer now creates a service wrapper that properly communicates with Windows SCM:
|
||||
|
||||
```cmd
|
||||
# Uninstall old service
|
||||
sc stop QualityPrintService
|
||||
sc delete QualityPrintService
|
||||
|
||||
# Reinstall with enhanced wrapper
|
||||
install_service_complete.bat
|
||||
```
|
||||
|
||||
#### Step 4: Manual Service Control
|
||||
```cmd
|
||||
# Start service manually to see error details
|
||||
net start QualityPrintService
|
||||
|
||||
# Check service status
|
||||
sc query QualityPrintService
|
||||
|
||||
# View service logs
|
||||
type "%USERPROFILE%\PrintService\logs\service_wrapper_*.log"
|
||||
```
|
||||
|
||||
### 🔍 DIAGNOSTIC COMMANDS:
|
||||
|
||||
#### Check Service Installation:
|
||||
```cmd
|
||||
sc query QualityPrintService
|
||||
sc qc QualityPrintService
|
||||
```
|
||||
|
||||
#### Check Port Availability:
|
||||
```cmd
|
||||
netstat -an | findstr :8765
|
||||
```
|
||||
|
||||
#### Test HTTP Endpoints:
|
||||
```cmd
|
||||
curl http://localhost:8765/health
|
||||
# OR
|
||||
powershell Invoke-WebRequest -Uri "http://localhost:8765/health"
|
||||
```
|
||||
|
||||
### 📋 COMMON SOLUTIONS:
|
||||
|
||||
#### Solution A: Port Already in Use
|
||||
```cmd
|
||||
# Find process using port 8765
|
||||
netstat -ano | findstr :8765
|
||||
# Kill process if needed (replace PID)
|
||||
taskkill /PID <PID_NUMBER> /F
|
||||
```
|
||||
|
||||
#### Solution B: Python Path Issues
|
||||
```cmd
|
||||
# Verify Python embedded path in service wrapper
|
||||
type "C:\QualityPrintService\service_wrapper.bat"
|
||||
```
|
||||
|
||||
#### Solution C: Permissions Issues
|
||||
```cmd
|
||||
# Run installer as Administrator
|
||||
# Right-click install_service_complete.bat → "Run as administrator"
|
||||
```
|
||||
|
||||
#### Solution D: Service Recovery
|
||||
```cmd
|
||||
# Configure automatic recovery
|
||||
sc failure QualityPrintService reset= 86400 actions= restart/5000/restart/5000/restart/5000
|
||||
```
|
||||
|
||||
### 📊 SERVICE STATUS VERIFICATION:
|
||||
|
||||
#### Successful Service Start:
|
||||
- Service Status: RUNNING
|
||||
- HTTP Response: `{"status": "healthy", "service": "Windows Print Service"}`
|
||||
- Log Shows: "Service is ready and listening..."
|
||||
|
||||
#### Failed Service Start:
|
||||
- Service Status: STOPPED or START_PENDING
|
||||
- HTTP Response: Connection refused
|
||||
- Log Shows: Error messages with specific details
|
||||
|
||||
### 🛠️ ADVANCED TROUBLESHOOTING:
|
||||
|
||||
#### Enable Debug Logging:
|
||||
Edit the service script to increase logging level:
|
||||
```python
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
```
|
||||
|
||||
#### Manual Service Wrapper Test:
|
||||
```cmd
|
||||
cd C:\QualityPrintService
|
||||
python_embedded\python.exe service_wrapper.py
|
||||
```
|
||||
|
||||
#### Windows Event Viewer:
|
||||
1. Open Event Viewer
|
||||
2. Navigate: Windows Logs → Application
|
||||
3. Filter by Source: Service Control Manager
|
||||
4. Look for QualityPrintService errors
|
||||
|
||||
### 📞 SUPPORT CHECKLIST:
|
||||
|
||||
Before reporting issues, please verify:
|
||||
|
||||
- [ ] ✅ Python embedded is working (`python_embedded\python.exe --version`)
|
||||
- [ ] ✅ Service runs in standalone mode (`test_service.bat`)
|
||||
- [ ] ✅ Port 8765 is available (`netstat -an | findstr :8765`)
|
||||
- [ ] ✅ Installer was run as Administrator
|
||||
- [ ] ✅ Windows is Windows 10/11 or Server 2016+
|
||||
- [ ] ✅ Service logs show specific error messages
|
||||
|
||||
### 🎯 EXPECTED RESULTS:
|
||||
|
||||
After following this guide:
|
||||
|
||||
1. **Service Status**: RUNNING
|
||||
2. **Health Check**: http://localhost:8765/health returns JSON response
|
||||
3. **Chrome Extension**: Detects service and shows "Windows Service" mode
|
||||
4. **Printing**: Silent PDF printing works without dialogs
|
||||
|
||||
---
|
||||
|
||||
**Package Version**: Zero Dependencies Complete
|
||||
**Last Updated**: September 2025
|
||||
**Support**: Check service logs in `%USERPROFILE%\PrintService\logs\`
|
||||
@@ -1,7 +1,10 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Script to create a completely self-contained Windows Print Service package
|
||||
with embedded Python distribution - Zero external dependencies required!
|
||||
with embedded Python distribution and comprehensive Error 1053 fixes
|
||||
- Zero external dependencies required!
|
||||
- Multiple installation methods with automatic fallback
|
||||
- Complete Windows Service Error 1053 resolution
|
||||
"""
|
||||
|
||||
import os
|
||||
@@ -90,11 +93,23 @@ def create_complete_package():
|
||||
print("📁 Adding service files...")
|
||||
service_files = [
|
||||
"print_service_complete.py",
|
||||
"install_service_complete.bat",
|
||||
"service_wrapper.py",
|
||||
"service_installer.py",
|
||||
"install_service_complete.bat",
|
||||
"install_service_ENHANCED.bat",
|
||||
"uninstall_service_complete.bat",
|
||||
"fix_error_1053.bat",
|
||||
"test_service.bat",
|
||||
"build_executable.bat",
|
||||
"build_package.py",
|
||||
"create_portable_package.py",
|
||||
"requirements_complete.txt",
|
||||
"INSTALLATION_COMPLETE.md",
|
||||
"PACKAGE_SUMMARY.md",
|
||||
"README_COMPLETE.md"
|
||||
"README_COMPLETE.md",
|
||||
"TROUBLESHOOTING_1053.md",
|
||||
"ERROR_1053_COMPLETE_FIX.md",
|
||||
"PORTABLE_PYTHON_INSTRUCTIONS.txt"
|
||||
]
|
||||
|
||||
for file_name in service_files:
|
||||
@@ -384,23 +399,26 @@ rmdir /s /q C:\\QualityPrintService
|
||||
zipf.writestr("README_ZERO_DEPENDENCIES.md", readme_content)
|
||||
files_added += 1
|
||||
|
||||
print(f"\n📦 Package created successfully!")
|
||||
print(f"\n📦 Enhanced Package created successfully!")
|
||||
print(f"📄 Total files: {files_added}")
|
||||
print(f"📂 Location: {package_path}")
|
||||
print(f"📏 Size: {package_path.stat().st_size / 1024 / 1024:.1f} MB")
|
||||
print(f"🔧 Features: Error 1053 fixes, multiple installation methods")
|
||||
print(f"🚀 Python: {PYTHON_VERSION} embedded (zero dependencies)")
|
||||
|
||||
return True
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("🚀 Creating Complete Zero-Dependencies Package...")
|
||||
print("=" * 60)
|
||||
print("🚀 Creating Enhanced Package with Error 1053 Fixes...")
|
||||
print("=" * 65)
|
||||
|
||||
if create_complete_package():
|
||||
print("\n✅ SUCCESS: Complete package created!")
|
||||
print("\n✅ SUCCESS: Enhanced package created with Error 1053 fixes!")
|
||||
print("\n📋 Next steps:")
|
||||
print("1. Test the package on a clean Windows system")
|
||||
print("2. Verify zero external dependencies")
|
||||
print("3. Update Flask app to serve this package")
|
||||
print("1. Package includes multiple installation methods")
|
||||
print("2. Error 1053 diagnostic and fix tools included")
|
||||
print("3. Test on Windows system - should resolve all service issues")
|
||||
print("4. Update Flask app to serve this enhanced package")
|
||||
else:
|
||||
print("\n❌ FAILED: Package creation failed")
|
||||
sys.exit(1)
|
||||
454
windows_print_service/fix_error_1053.bat
Normal file
454
windows_print_service/fix_error_1053.bat
Normal file
@@ -0,0 +1,454 @@
|
||||
@echo off
|
||||
REM Windows Service Error 1053 - COMPREHENSIVE DIAGNOSTIC TOOL
|
||||
REM This script diagnoses and fixes the most common causes of Error 1053
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
echo =========================================
|
||||
echo ERROR 1053 DIAGNOSTIC TOOL
|
||||
echo Quality Print Service Troubleshooter
|
||||
echo =========================================
|
||||
echo.
|
||||
echo This tool diagnoses and fixes Windows Service Error 1053:
|
||||
echo "The service did not respond to the start or control request in a timely fashion"
|
||||
echo.
|
||||
|
||||
REM Check for administrator privileges
|
||||
net session >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo ❌ CRITICAL: Administrator privileges required
|
||||
echo Right-click this file and select "Run as administrator"
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo ✅ Administrator privileges confirmed
|
||||
echo.
|
||||
|
||||
REM Set variables
|
||||
set CURRENT_DIR=%~dp0
|
||||
set SERVICE_NAME=QualityPrintService
|
||||
set INSTALL_DIR=C:\QualityPrintService
|
||||
set LOG_DIR=%USERPROFILE%\PrintService\logs
|
||||
|
||||
echo ===========================================
|
||||
echo [STEP 1] SERVICE STATUS DIAGNOSIS
|
||||
echo ===========================================
|
||||
|
||||
REM Check current service status
|
||||
echo Checking service status...
|
||||
sc query "%SERVICE_NAME%" >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo Service exists - checking status:
|
||||
sc query "%SERVICE_NAME%"
|
||||
echo.
|
||||
|
||||
REM Get detailed service info
|
||||
echo Service configuration:
|
||||
sc qc "%SERVICE_NAME%"
|
||||
echo.
|
||||
) else (
|
||||
echo ❌ Service not found - needs installation
|
||||
echo.
|
||||
)
|
||||
|
||||
REM Check Task Scheduler
|
||||
echo Checking Task Scheduler...
|
||||
schtasks /query /tn "%SERVICE_NAME%" >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo ✅ Task Scheduler entry found
|
||||
schtasks /query /tn "%SERVICE_NAME%" /fo LIST
|
||||
echo.
|
||||
) else (
|
||||
echo ❌ Task Scheduler entry not found
|
||||
echo.
|
||||
)
|
||||
|
||||
echo ===========================================
|
||||
echo [STEP 2] PROCESS AND PORT DIAGNOSIS
|
||||
echo ===========================================
|
||||
|
||||
REM Check for running processes
|
||||
echo Checking for existing service processes...
|
||||
tasklist /fi "imagename eq python.exe" | findstr python.exe >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo Python processes found:
|
||||
tasklist /fi "imagename eq python.exe"
|
||||
echo.
|
||||
) else (
|
||||
echo No Python processes running
|
||||
echo.
|
||||
)
|
||||
|
||||
REM Check port 8765
|
||||
echo Checking port 8765...
|
||||
netstat -an | findstr :8765 >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo ⚠️ Port 8765 is in use:
|
||||
netstat -an | findstr :8765
|
||||
echo.
|
||||
|
||||
REM Find process using port
|
||||
for /f "tokens=5" %%a in ('netstat -ano ^| findstr :8765') do (
|
||||
tasklist /fi "pid eq %%a" 2>nul | findstr /v "INFO:"
|
||||
)
|
||||
echo.
|
||||
) else (
|
||||
echo ✅ Port 8765 is available
|
||||
echo.
|
||||
)
|
||||
|
||||
echo ===========================================
|
||||
echo [STEP 3] PYTHON ENVIRONMENT DIAGNOSIS
|
||||
echo ===========================================
|
||||
|
||||
REM Check Python installations
|
||||
echo Checking Python installations...
|
||||
|
||||
REM Check embedded Python
|
||||
if exist "%INSTALL_DIR%\python_embedded\python.exe" (
|
||||
echo ✅ Embedded Python found: %INSTALL_DIR%\python_embedded\python.exe
|
||||
"%INSTALL_DIR%\python_embedded\python.exe" --version 2>nul
|
||||
echo.
|
||||
) else (
|
||||
echo ❌ Embedded Python not found at %INSTALL_DIR%\python_embedded\python.exe
|
||||
)
|
||||
|
||||
if exist "%CURRENT_DIR%python_embedded\python.exe" (
|
||||
echo ✅ Installer embedded Python found: %CURRENT_DIR%python_embedded\python.exe
|
||||
"%CURRENT_DIR%python_embedded\python.exe" --version 2>nul
|
||||
echo.
|
||||
) else (
|
||||
echo ❌ Installer embedded Python not found
|
||||
)
|
||||
|
||||
REM Check system Python
|
||||
python --version >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo ✅ System Python found:
|
||||
python --version
|
||||
where python
|
||||
echo.
|
||||
) else (
|
||||
echo ❌ System Python not found in PATH
|
||||
echo.
|
||||
)
|
||||
|
||||
echo ===========================================
|
||||
echo [STEP 4] FILE SYSTEM DIAGNOSIS
|
||||
echo ===========================================
|
||||
|
||||
REM Check installation files
|
||||
echo Checking installation files...
|
||||
|
||||
if exist "%INSTALL_DIR%" (
|
||||
echo ✅ Installation directory exists: %INSTALL_DIR%
|
||||
echo Contents:
|
||||
dir "%INSTALL_DIR%" /b
|
||||
echo.
|
||||
|
||||
if exist "%INSTALL_DIR%\print_service_complete.py" (
|
||||
echo ✅ Main service script found
|
||||
) else (
|
||||
echo ❌ Main service script missing
|
||||
)
|
||||
|
||||
if exist "%INSTALL_DIR%\enhanced_service_wrapper.bat" (
|
||||
echo ✅ Service wrapper found
|
||||
) else (
|
||||
echo ❌ Service wrapper missing
|
||||
)
|
||||
|
||||
) else (
|
||||
echo ❌ Installation directory not found: %INSTALL_DIR%
|
||||
)
|
||||
|
||||
REM Check log directory
|
||||
if exist "%LOG_DIR%" (
|
||||
echo ✅ Log directory exists: %LOG_DIR%
|
||||
if exist "%LOG_DIR%\service_wrapper.log" (
|
||||
echo Recent log entries:
|
||||
echo ==================
|
||||
powershell -Command "Get-Content '%LOG_DIR%\service_wrapper.log' -Tail 10" 2>nul
|
||||
echo ==================
|
||||
echo.
|
||||
)
|
||||
) else (
|
||||
echo ❌ Log directory not found: %LOG_DIR%
|
||||
mkdir "%LOG_DIR%" >nul 2>&1
|
||||
echo Created log directory
|
||||
)
|
||||
|
||||
echo ===========================================
|
||||
echo [STEP 5] SERVICE TEST
|
||||
echo ===========================================
|
||||
|
||||
REM Determine Python executable
|
||||
set PYTHON_EXE=
|
||||
if exist "%INSTALL_DIR%\python_embedded\python.exe" (
|
||||
set PYTHON_EXE=%INSTALL_DIR%\python_embedded\python.exe
|
||||
) else if exist "%CURRENT_DIR%python_embedded\python.exe" (
|
||||
set PYTHON_EXE=%CURRENT_DIR%python_embedded\python.exe
|
||||
) else (
|
||||
python --version >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
set PYTHON_EXE=python
|
||||
)
|
||||
)
|
||||
|
||||
if "!PYTHON_EXE!"=="" (
|
||||
echo ❌ CRITICAL: No Python executable found
|
||||
echo Cannot perform service test
|
||||
goto :fixes
|
||||
)
|
||||
|
||||
echo Testing service with Python: !PYTHON_EXE!
|
||||
|
||||
REM Test service script
|
||||
if exist "%INSTALL_DIR%\print_service_complete.py" (
|
||||
cd /d "%INSTALL_DIR%"
|
||||
|
||||
echo Testing service script syntax...
|
||||
"!PYTHON_EXE!" -m py_compile print_service_complete.py
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Service script syntax OK
|
||||
) else (
|
||||
echo ❌ Service script syntax error
|
||||
)
|
||||
|
||||
echo Testing service functionality...
|
||||
"!PYTHON_EXE!" print_service_complete.py --test
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Service test passed
|
||||
) else (
|
||||
echo ❌ Service test failed
|
||||
)
|
||||
|
||||
REM Quick standalone test
|
||||
echo Testing standalone mode (15 seconds)...
|
||||
start /min "" "!PYTHON_EXE!" print_service_complete.py --standalone
|
||||
|
||||
timeout /t 5 >nul
|
||||
|
||||
REM Test connection
|
||||
curl -s http://localhost:8765/health >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Service responding in standalone mode
|
||||
|
||||
REM Stop standalone service
|
||||
taskkill /f /im python.exe >nul 2>&1
|
||||
) else (
|
||||
powershell -Command "try { Invoke-WebRequest -Uri 'http://localhost:8765/health' -UseBasicParsing } catch { exit 1 }" >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Service responding in standalone mode
|
||||
taskkill /f /im python.exe >nul 2>&1
|
||||
) else (
|
||||
echo ❌ Service not responding in standalone mode
|
||||
taskkill /f /im python.exe >nul 2>&1
|
||||
)
|
||||
)
|
||||
) else (
|
||||
echo ❌ Service script not found at %INSTALL_DIR%\print_service_complete.py
|
||||
)
|
||||
|
||||
echo.
|
||||
|
||||
:fixes
|
||||
echo ===========================================
|
||||
echo [STEP 6] AUTOMATED FIXES FOR ERROR 1053
|
||||
echo ===========================================
|
||||
|
||||
echo Applying automated fixes...
|
||||
|
||||
REM Fix 1: Stop conflicting services
|
||||
echo [FIX 1] Stopping any conflicting services...
|
||||
net stop "%SERVICE_NAME%" >nul 2>&1
|
||||
schtasks /end /tn "%SERVICE_NAME%" >nul 2>&1
|
||||
taskkill /f /im python.exe >nul 2>&1
|
||||
timeout /t 3 >nul
|
||||
echo ✅ Services stopped
|
||||
|
||||
REM Fix 2: Remove old service entries
|
||||
echo [FIX 2] Cleaning old service entries...
|
||||
sc delete "%SERVICE_NAME%" >nul 2>&1
|
||||
schtasks /delete /tn "%SERVICE_NAME%" /f >nul 2>&1
|
||||
echo ✅ Old entries removed
|
||||
|
||||
REM Fix 3: Create enhanced service wrapper with timeout handling
|
||||
echo [FIX 3] Creating enhanced service wrapper...
|
||||
|
||||
set ENHANCED_WRAPPER=%INSTALL_DIR%\error_1053_fix_wrapper.bat
|
||||
|
||||
mkdir "%INSTALL_DIR%" >nul 2>&1
|
||||
|
||||
echo @echo off > "%ENHANCED_WRAPPER%"
|
||||
echo REM Enhanced Windows Service Wrapper - Error 1053 Fix >> "%ENHANCED_WRAPPER%"
|
||||
echo REM This wrapper includes specific fixes for SCM timeout issues >> "%ENHANCED_WRAPPER%"
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo setlocal >> "%ENHANCED_WRAPPER%"
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo REM Logging >> "%ENHANCED_WRAPPER%"
|
||||
echo set LOG_FILE=%LOG_DIR%\error_1053_fix.log >> "%ENHANCED_WRAPPER%"
|
||||
echo echo %%date%% %%time%% - Service wrapper starting... ^>^> "%%LOG_FILE%%" >> "%ENHANCED_WRAPPER%"
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo REM Change to service directory >> "%ENHANCED_WRAPPER%"
|
||||
echo cd /d "%INSTALL_DIR%" >> "%ENHANCED_WRAPPER%"
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo REM Pre-flight checks >> "%ENHANCED_WRAPPER%"
|
||||
if "!PYTHON_EXE!" neq "" (
|
||||
echo if not exist "!PYTHON_EXE!" ( >> "%ENHANCED_WRAPPER%"
|
||||
echo echo ERROR: Python not found at !PYTHON_EXE! ^>^> "%%LOG_FILE%%" >> "%ENHANCED_WRAPPER%"
|
||||
echo exit /b 1 >> "%ENHANCED_WRAPPER%"
|
||||
echo ^) >> "%ENHANCED_WRAPPER%"
|
||||
)
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo if not exist "print_service_complete.py" ( >> "%ENHANCED_WRAPPER%"
|
||||
echo echo ERROR: Service script not found ^>^> "%%LOG_FILE%%" >> "%ENHANCED_WRAPPER%"
|
||||
echo exit /b 1 >> "%ENHANCED_WRAPPER%"
|
||||
echo ^) >> "%ENHANCED_WRAPPER%"
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo REM Quick response to SCM - Start service immediately in background >> "%ENHANCED_WRAPPER%"
|
||||
echo echo Service responding to SCM... ^>^> "%%LOG_FILE%%" >> "%ENHANCED_WRAPPER%"
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo REM Start the actual service process >> "%ENHANCED_WRAPPER%"
|
||||
if "!PYTHON_EXE!" neq "" (
|
||||
echo start /b "Quality Print Service" "!PYTHON_EXE!" "print_service_complete.py" --service >> "%ENHANCED_WRAPPER%"
|
||||
) else (
|
||||
echo start /b "Quality Print Service" python "print_service_complete.py" --service >> "%ENHANCED_WRAPPER%"
|
||||
)
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo REM Keep wrapper alive briefly to satisfy SCM >> "%ENHANCED_WRAPPER%"
|
||||
echo timeout /t 2 /nobreak ^>nul >> "%ENHANCED_WRAPPER%"
|
||||
echo. >> "%ENHANCED_WRAPPER%"
|
||||
echo echo Service started successfully ^>^> "%%LOG_FILE%%" >> "%ENHANCED_WRAPPER%"
|
||||
echo exit /b 0 >> "%ENHANCED_WRAPPER%"
|
||||
|
||||
echo ✅ Enhanced wrapper created
|
||||
|
||||
REM Fix 4: Install service with proper timeout settings
|
||||
echo [FIX 4] Installing service with Error 1053 fixes...
|
||||
|
||||
REM Create service with extended timeout
|
||||
sc create "%SERVICE_NAME%" binPath= "\"%ENHANCED_WRAPPER%\"" DisplayName= "Quality Print Service (Error 1053 Fixed)" start= auto >nul 2>&1
|
||||
|
||||
if %errorLevel% equ 0 (
|
||||
echo ✅ Service created successfully
|
||||
|
||||
REM Configure service for Error 1053 prevention
|
||||
echo Configuring service recovery...
|
||||
sc failure "%SERVICE_NAME%" reset= 86400 actions= restart/5000/restart/5000/restart/5000 >nul 2>&1
|
||||
|
||||
REM Set service to auto-start with delay
|
||||
sc config "%SERVICE_NAME%" start= delayed-auto >nul 2>&1
|
||||
|
||||
echo ✅ Service configured with Error 1053 fixes
|
||||
) else (
|
||||
echo ❌ Service creation failed
|
||||
)
|
||||
|
||||
echo.
|
||||
|
||||
echo ===========================================
|
||||
echo [STEP 7] SERVICE START TEST
|
||||
echo ===========================================
|
||||
|
||||
echo Testing service start with Error 1053 fixes...
|
||||
|
||||
REM Start service
|
||||
net start "%SERVICE_NAME%" 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo ✅ SERVICE STARTED SUCCESSFULLY!
|
||||
echo Error 1053 has been FIXED! 🎉
|
||||
|
||||
REM Wait and test connection
|
||||
echo Waiting for service to initialize...
|
||||
timeout /t 10 >nul
|
||||
|
||||
echo Testing service connection...
|
||||
curl -s http://localhost:8765/health >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Service is responding properly
|
||||
echo.
|
||||
echo ========================================
|
||||
echo PROBLEM SOLVED! 🎉
|
||||
echo ========================================
|
||||
echo.
|
||||
echo ✅ Windows Service Error 1053 FIXED
|
||||
echo ✅ Service: %SERVICE_NAME%
|
||||
echo ✅ Status: Running and responding
|
||||
echo ✅ URL: http://localhost:8765
|
||||
echo.
|
||||
goto :success
|
||||
) else (
|
||||
powershell -Command "try { Invoke-WebRequest -Uri 'http://localhost:8765/health' -UseBasicParsing } catch { exit 1 }" >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Service is responding properly
|
||||
goto :success
|
||||
) else (
|
||||
echo ⚠️ Service started but not responding
|
||||
echo Check logs: %LOG_DIR%\error_1053_fix.log
|
||||
)
|
||||
)
|
||||
) else (
|
||||
echo ❌ Service start failed - Error 1053 may persist
|
||||
echo.
|
||||
echo ===========================================
|
||||
echo [ALTERNATIVE SOLUTIONS]
|
||||
echo ===========================================
|
||||
echo.
|
||||
echo Since SC Service failed, trying alternative methods...
|
||||
|
||||
REM Alternative: Task Scheduler
|
||||
echo Installing via Task Scheduler...
|
||||
schtasks /create /tn "%SERVICE_NAME%" /tr "\"%ENHANCED_WRAPPER%\"" /sc onstart /ru SYSTEM /rl HIGHEST >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Task Scheduler service created
|
||||
schtasks /run /tn "%SERVICE_NAME%" >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo ✅ Task Scheduler service started
|
||||
echo Alternative solution: Task Scheduler
|
||||
)
|
||||
)
|
||||
|
||||
REM Alternative: Manual startup
|
||||
echo.
|
||||
echo Manual startup option:
|
||||
echo Run this command to start manually:
|
||||
echo "%ENHANCED_WRAPPER%"
|
||||
)
|
||||
|
||||
:success
|
||||
echo.
|
||||
echo ===========================================
|
||||
echo [STEP 8] SUMMARY AND RECOMMENDATIONS
|
||||
echo ===========================================
|
||||
|
||||
echo Diagnostic complete!
|
||||
echo.
|
||||
echo 📋 TROUBLESHOOTING SUMMARY:
|
||||
echo ✅ Administrator privileges: OK
|
||||
echo ✅ Enhanced service wrapper: Created
|
||||
echo ✅ Error 1053 fixes: Applied
|
||||
echo ✅ Service configuration: Updated
|
||||
echo.
|
||||
|
||||
if exist "%LOG_DIR%\error_1053_fix.log" (
|
||||
echo 📊 Recent service logs:
|
||||
echo ========================
|
||||
powershell -Command "Get-Content '%LOG_DIR%\error_1053_fix.log' -Tail 5" 2>nul
|
||||
echo ========================
|
||||
echo.
|
||||
)
|
||||
|
||||
echo 🔧 Service Management Commands:
|
||||
echo - Start: net start %SERVICE_NAME%
|
||||
echo - Stop: net stop %SERVICE_NAME%
|
||||
echo - Status: sc query %SERVICE_NAME%
|
||||
echo.
|
||||
echo 📁 Log files: %LOG_DIR%
|
||||
echo 🌐 Service URL: http://localhost:8765
|
||||
echo 🔍 Health check: http://localhost:8765/health
|
||||
echo.
|
||||
echo Press any key to exit...
|
||||
pause >nul
|
||||
407
windows_print_service/install_service_ENHANCED.bat
Normal file
407
windows_print_service/install_service_ENHANCED.bat
Normal file
@@ -0,0 +1,407 @@
|
||||
@echo off
|
||||
REM Windows Print Service - ENHANCED INSTALLER - Fixes Error 1053
|
||||
REM This installer addresses the most common causes of Windows Service startup failures
|
||||
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
echo =========================================
|
||||
echo Quality Print Service - ENHANCED INSTALLER
|
||||
echo Fixes Windows Service Error 1053
|
||||
echo =========================================
|
||||
echo.
|
||||
echo This installer includes multiple methods to ensure service starts:
|
||||
echo ✅ Windows SC Service (preferred)
|
||||
echo ✅ Task Scheduler Service (fallback)
|
||||
echo ✅ Startup Script (manual fallback)
|
||||
echo ✅ Enhanced error detection and recovery
|
||||
echo.
|
||||
|
||||
REM Check for administrator privileges
|
||||
net session >nul 2>&1
|
||||
if %errorLevel% neq 0 (
|
||||
echo ❌ ERROR: Administrator privileges required
|
||||
echo Please right-click this file and select "Run as administrator"
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [1/8] Administrator privileges confirmed ✅
|
||||
echo.
|
||||
|
||||
REM Set variables
|
||||
set CURRENT_DIR=%~dp0
|
||||
set SERVICE_NAME=QualityPrintService
|
||||
set SERVICE_DISPLAY_NAME=Quality Print Service
|
||||
set INSTALL_DIR=C:\QualityPrintService
|
||||
set LOG_DIR=%USERPROFILE%\PrintService\logs
|
||||
|
||||
REM Detect Python executable
|
||||
echo [2/8] Detecting Python installation...
|
||||
|
||||
set PYTHON_EXE=
|
||||
set PYTHON_SCRIPT=%INSTALL_DIR%\print_service_complete.py
|
||||
|
||||
REM Check for embedded Python first
|
||||
if exist "%INSTALL_DIR%\python_embedded\python.exe" (
|
||||
set PYTHON_EXE=%INSTALL_DIR%\python_embedded\python.exe
|
||||
echo Found embedded Python: !PYTHON_EXE! ✅
|
||||
) else if exist "%CURRENT_DIR%python_embedded\python.exe" (
|
||||
set PYTHON_EXE=%CURRENT_DIR%python_embedded\python.exe
|
||||
echo Found embedded Python in installer: !PYTHON_EXE! ✅
|
||||
) else (
|
||||
REM Check system Python
|
||||
python --version >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
set PYTHON_EXE=python
|
||||
echo Found system Python ✅
|
||||
) else (
|
||||
echo ❌ ERROR: Python not found
|
||||
echo Please ensure Python 3.7+ is installed or use the zero-dependency package
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
)
|
||||
|
||||
echo.
|
||||
|
||||
REM Stop existing service
|
||||
echo [3/8] Stopping existing service (if any)...
|
||||
sc query "%SERVICE_NAME%" >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo Stopping existing service...
|
||||
net stop "%SERVICE_NAME%" >nul 2>&1
|
||||
sc delete "%SERVICE_NAME%" >nul 2>&1
|
||||
timeout /t 3 >nul
|
||||
)
|
||||
|
||||
REM Stop any existing task
|
||||
schtasks /end /tn "%SERVICE_NAME%" >nul 2>&1
|
||||
schtasks /delete /tn "%SERVICE_NAME%" /f >nul 2>&1
|
||||
|
||||
echo Service cleanup completed ✅
|
||||
echo.
|
||||
|
||||
REM Create installation directory
|
||||
echo [4/8] Creating installation directory...
|
||||
if exist "%INSTALL_DIR%" (
|
||||
echo Removing old installation...
|
||||
rmdir /s /q "%INSTALL_DIR%" >nul 2>&1
|
||||
)
|
||||
mkdir "%INSTALL_DIR%" >nul 2>&1
|
||||
|
||||
REM Create log directory
|
||||
mkdir "%LOG_DIR%" >nul 2>&1
|
||||
|
||||
echo Installation directory: %INSTALL_DIR% ✅
|
||||
echo Log directory: %LOG_DIR% ✅
|
||||
echo.
|
||||
|
||||
REM Copy service files
|
||||
echo [5/8] Installing service files...
|
||||
|
||||
REM Copy Python embedded if available
|
||||
if exist "%CURRENT_DIR%python_embedded\" (
|
||||
echo Copying embedded Python distribution...
|
||||
xcopy "%CURRENT_DIR%python_embedded" "%INSTALL_DIR%\python_embedded\" /E /I /Y >nul
|
||||
set PYTHON_EXE=%INSTALL_DIR%\python_embedded\python.exe
|
||||
echo Embedded Python installed ✅
|
||||
)
|
||||
|
||||
REM Copy service scripts
|
||||
copy "%CURRENT_DIR%print_service_complete.py" "%INSTALL_DIR%\" >nul
|
||||
copy "%CURRENT_DIR%service_wrapper.py" "%INSTALL_DIR%\" >nul 2>&1
|
||||
copy "%CURRENT_DIR%service_installer.py" "%INSTALL_DIR%\" >nul 2>&1
|
||||
|
||||
echo Service files installed ✅
|
||||
echo.
|
||||
|
||||
REM Test service before installing
|
||||
echo [6/8] Testing service functionality...
|
||||
cd /d "%INSTALL_DIR%"
|
||||
|
||||
echo Testing Python and service script...
|
||||
"%PYTHON_EXE%" "%PYTHON_SCRIPT%" --test >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo Service test passed ✅
|
||||
) else (
|
||||
echo ⚠️ Service test failed - continuing with installation
|
||||
)
|
||||
|
||||
REM Check port availability
|
||||
echo Testing port 8765 availability...
|
||||
netstat -an | findstr :8765 >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo ⚠️ Port 8765 is in use - service may conflict
|
||||
) else (
|
||||
echo Port 8765 available ✅
|
||||
)
|
||||
echo.
|
||||
|
||||
REM Install service - Multiple methods
|
||||
echo [7/8] Installing Windows service with multiple fallback methods...
|
||||
|
||||
REM Create enhanced service wrapper
|
||||
set WRAPPER_BAT=%INSTALL_DIR%\enhanced_service_wrapper.bat
|
||||
|
||||
echo @echo off > "%WRAPPER_BAT%"
|
||||
echo REM Enhanced Windows Service Wrapper - Error 1053 Fix >> "%WRAPPER_BAT%"
|
||||
echo cd /d "%INSTALL_DIR%" >> "%WRAPPER_BAT%"
|
||||
echo. >> "%WRAPPER_BAT%"
|
||||
echo REM Log service start attempt >> "%WRAPPER_BAT%"
|
||||
echo echo %%date%% %%time%% - Service wrapper starting... ^>^> "%LOG_DIR%\service_wrapper.log" >> "%WRAPPER_BAT%"
|
||||
echo. >> "%WRAPPER_BAT%"
|
||||
echo REM Verify files exist >> "%WRAPPER_BAT%"
|
||||
echo if not exist "%PYTHON_EXE%" ( >> "%WRAPPER_BAT%"
|
||||
echo echo ERROR: Python not found at %PYTHON_EXE% ^>^> "%LOG_DIR%\service_wrapper.log" >> "%WRAPPER_BAT%"
|
||||
echo exit /b 1 >> "%WRAPPER_BAT%"
|
||||
echo ^) >> "%WRAPPER_BAT%"
|
||||
echo. >> "%WRAPPER_BAT%"
|
||||
echo if not exist "%PYTHON_SCRIPT%" ( >> "%WRAPPER_BAT%"
|
||||
echo echo ERROR: Service script not found ^>^> "%LOG_DIR%\service_wrapper.log" >> "%WRAPPER_BAT%"
|
||||
echo exit /b 1 >> "%WRAPPER_BAT%"
|
||||
echo ^) >> "%WRAPPER_BAT%"
|
||||
echo. >> "%WRAPPER_BAT%"
|
||||
echo REM Start service with error handling >> "%WRAPPER_BAT%"
|
||||
echo echo Starting service process... ^>^> "%LOG_DIR%\service_wrapper.log" >> "%WRAPPER_BAT%"
|
||||
echo "%PYTHON_EXE%" "%PYTHON_SCRIPT%" --service >> "%WRAPPER_BAT%"
|
||||
echo. >> "%WRAPPER_BAT%"
|
||||
echo REM Log exit code >> "%WRAPPER_BAT%"
|
||||
echo echo Service exited with code %%errorlevel%% ^>^> "%LOG_DIR%\service_wrapper.log" >> "%WRAPPER_BAT%"
|
||||
|
||||
REM Method 1: Windows SC Service
|
||||
echo Installing as Windows SC Service...
|
||||
sc create "%SERVICE_NAME%" binPath= "\"%WRAPPER_BAT%\"" DisplayName= "%SERVICE_DISPLAY_NAME%" start= auto >nul 2>&1
|
||||
|
||||
if %errorLevel% equ 0 (
|
||||
echo Windows SC Service created ✅
|
||||
|
||||
REM Configure recovery
|
||||
sc failure "%SERVICE_NAME%" reset= 86400 actions= restart/5000/restart/5000/restart/5000 >nul 2>&1
|
||||
|
||||
REM Try to start service
|
||||
echo Starting SC service...
|
||||
net start "%SERVICE_NAME%" >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo SC Service started successfully ✅
|
||||
set SERVICE_METHOD=SC_SERVICE
|
||||
goto :service_installed
|
||||
) else (
|
||||
echo ⚠️ SC Service created but failed to start - trying Task Scheduler...
|
||||
)
|
||||
) else (
|
||||
echo ❌ SC Service creation failed - trying Task Scheduler...
|
||||
)
|
||||
|
||||
REM Method 2: Task Scheduler Service
|
||||
echo Installing as Task Scheduler Service...
|
||||
|
||||
REM Create task XML
|
||||
set TASK_XML=%INSTALL_DIR%\%SERVICE_NAME%_task.xml
|
||||
|
||||
echo ^<?xml version="1.0" encoding="UTF-16"?^> > "%TASK_XML%"
|
||||
echo ^<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"^> >> "%TASK_XML%"
|
||||
echo ^<RegistrationInfo^> >> "%TASK_XML%"
|
||||
echo ^<Description^>Quality Print Service - Automatic Label Printing^</Description^> >> "%TASK_XML%"
|
||||
echo ^</RegistrationInfo^> >> "%TASK_XML%"
|
||||
echo ^<Triggers^> >> "%TASK_XML%"
|
||||
echo ^<BootTrigger^> >> "%TASK_XML%"
|
||||
echo ^<Enabled^>true^</Enabled^> >> "%TASK_XML%"
|
||||
echo ^</BootTrigger^> >> "%TASK_XML%"
|
||||
echo ^</Triggers^> >> "%TASK_XML%"
|
||||
echo ^<Principals^> >> "%TASK_XML%"
|
||||
echo ^<Principal id="Author"^> >> "%TASK_XML%"
|
||||
echo ^<UserId^>S-1-5-18^</UserId^> >> "%TASK_XML%"
|
||||
echo ^<RunLevel^>HighestAvailable^</RunLevel^> >> "%TASK_XML%"
|
||||
echo ^</Principal^> >> "%TASK_XML%"
|
||||
echo ^</Principals^> >> "%TASK_XML%"
|
||||
echo ^<Settings^> >> "%TASK_XML%"
|
||||
echo ^<MultipleInstancesPolicy^>IgnoreNew^</MultipleInstancesPolicy^> >> "%TASK_XML%"
|
||||
echo ^<DisallowStartIfOnBatteries^>false^</DisallowStartIfOnBatteries^> >> "%TASK_XML%"
|
||||
echo ^<StopIfGoingOnBatteries^>false^</StopIfGoingOnBatteries^> >> "%TASK_XML%"
|
||||
echo ^<AllowHardTerminate^>true^</AllowHardTerminate^> >> "%TASK_XML%"
|
||||
echo ^<StartWhenAvailable^>true^</StartWhenAvailable^> >> "%TASK_XML%"
|
||||
echo ^<RunOnlyIfNetworkAvailable^>false^</RunOnlyIfNetworkAvailable^> >> "%TASK_XML%"
|
||||
echo ^<AllowStartOnDemand^>true^</AllowStartOnDemand^> >> "%TASK_XML%"
|
||||
echo ^<Enabled^>true^</Enabled^> >> "%TASK_XML%"
|
||||
echo ^<Hidden^>false^</Hidden^> >> "%TASK_XML%"
|
||||
echo ^<RestartOnFailure^> >> "%TASK_XML%"
|
||||
echo ^<Interval^>PT5M^</Interval^> >> "%TASK_XML%"
|
||||
echo ^<Count^>3^</Count^> >> "%TASK_XML%"
|
||||
echo ^</RestartOnFailure^> >> "%TASK_XML%"
|
||||
echo ^</Settings^> >> "%TASK_XML%"
|
||||
echo ^<Actions Context="Author"^> >> "%TASK_XML%"
|
||||
echo ^<Exec^> >> "%TASK_XML%"
|
||||
echo ^<Command^>"%PYTHON_EXE%"^</Command^> >> "%TASK_XML%"
|
||||
echo ^<Arguments^>"%PYTHON_SCRIPT%" --service^</Arguments^> >> "%TASK_XML%"
|
||||
echo ^<WorkingDirectory^>%INSTALL_DIR%^</WorkingDirectory^> >> "%TASK_XML%"
|
||||
echo ^</Exec^> >> "%TASK_XML%"
|
||||
echo ^</Actions^> >> "%TASK_XML%"
|
||||
echo ^</Task^> >> "%TASK_XML%"
|
||||
|
||||
schtasks /create /tn "%SERVICE_NAME%" /xml "%TASK_XML%" >nul 2>&1
|
||||
if %errorLevel% equ 0 (
|
||||
echo Task Scheduler service created ✅
|
||||
|
||||
REM Start task
|
||||
schtasks /run /tn "%SERVICE_NAME%" >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo Task Scheduler service started ✅
|
||||
set SERVICE_METHOD=TASK_SCHEDULER
|
||||
goto :service_installed
|
||||
) else (
|
||||
echo ⚠️ Task created but failed to start
|
||||
)
|
||||
) else (
|
||||
echo ❌ Task Scheduler creation failed
|
||||
)
|
||||
|
||||
REM Method 3: Startup Script Fallback
|
||||
echo Installing as Startup Script...
|
||||
set STARTUP_DIR=%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
|
||||
set STARTUP_SCRIPT=%STARTUP_DIR%\QualityPrintService.bat
|
||||
|
||||
echo @echo off > "%STARTUP_SCRIPT%"
|
||||
echo REM Quality Print Service - Startup Script >> "%STARTUP_SCRIPT%"
|
||||
echo cd /d "%INSTALL_DIR%" >> "%STARTUP_SCRIPT%"
|
||||
echo start /min "Quality Print Service" "%PYTHON_EXE%" "%PYTHON_SCRIPT%" --service >> "%STARTUP_SCRIPT%"
|
||||
|
||||
if exist "%STARTUP_SCRIPT%" (
|
||||
echo Startup script created ✅
|
||||
|
||||
REM Start immediately
|
||||
start /min "" "%STARTUP_SCRIPT%"
|
||||
echo Service started via startup script ✅
|
||||
set SERVICE_METHOD=STARTUP_SCRIPT
|
||||
goto :service_installed
|
||||
)
|
||||
|
||||
REM If we get here, all methods failed
|
||||
echo ❌ All installation methods failed
|
||||
goto :installation_failed
|
||||
|
||||
:service_installed
|
||||
echo.
|
||||
|
||||
REM Verification
|
||||
echo [8/8] Verifying installation...
|
||||
|
||||
echo Waiting for service to start...
|
||||
timeout /t 5 >nul
|
||||
|
||||
REM Test service connection
|
||||
echo Testing service connection...
|
||||
for /L %%i in (1,1,10) do (
|
||||
curl -s http://localhost:8765/health >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo Service is responding ✅
|
||||
goto :success
|
||||
)
|
||||
|
||||
powershell -Command "try { Invoke-WebRequest -Uri 'http://localhost:8765/health' -UseBasicParsing } catch { exit 1 }" >nul 2>&1
|
||||
if !errorLevel! equ 0 (
|
||||
echo Service is responding ✅
|
||||
goto :success
|
||||
)
|
||||
|
||||
echo Attempt %%i failed, retrying...
|
||||
timeout /t 2 >nul
|
||||
)
|
||||
|
||||
echo ⚠️ Service installed but not responding
|
||||
goto :partial_success
|
||||
|
||||
:success
|
||||
echo.
|
||||
echo ========================================
|
||||
echo INSTALLATION SUCCESSFUL! 🎉
|
||||
echo ========================================
|
||||
echo.
|
||||
echo ✅ Service Method: !SERVICE_METHOD!
|
||||
echo ✅ Service URL: http://localhost:8765
|
||||
echo ✅ Health Check: http://localhost:8765/health
|
||||
echo ✅ Service will start automatically on boot
|
||||
echo.
|
||||
echo 📋 NEXT STEPS:
|
||||
echo 1. Install Chrome extension from 'chrome_extension' folder
|
||||
echo 2. Test printing from the web application
|
||||
echo 3. Configure printer settings if needed
|
||||
echo.
|
||||
echo 📊 Service Management:
|
||||
if "!SERVICE_METHOD!"=="SC_SERVICE" (
|
||||
echo - Start: net start %SERVICE_NAME%
|
||||
echo - Stop: net stop %SERVICE_NAME%
|
||||
echo - Status: sc query %SERVICE_NAME%
|
||||
) else if "!SERVICE_METHOD!"=="TASK_SCHEDULER" (
|
||||
echo - Start: schtasks /run /tn %SERVICE_NAME%
|
||||
echo - Stop: schtasks /end /tn %SERVICE_NAME%
|
||||
echo - Status: schtasks /query /tn %SERVICE_NAME%
|
||||
) else (
|
||||
echo - Start: Run startup script manually
|
||||
echo - Stop: End process in Task Manager
|
||||
)
|
||||
echo.
|
||||
echo 📁 Logs: %LOG_DIR%
|
||||
echo.
|
||||
goto :end
|
||||
|
||||
:partial_success
|
||||
echo.
|
||||
echo ========================================
|
||||
echo INSTALLATION COMPLETED
|
||||
echo ========================================
|
||||
echo.
|
||||
echo ⚠️ Service installed but verification failed
|
||||
echo 📋 Manual verification steps:
|
||||
echo.
|
||||
echo 1. Check if service is running:
|
||||
if "!SERVICE_METHOD!"=="SC_SERVICE" (
|
||||
echo sc query %SERVICE_NAME%
|
||||
) else if "!SERVICE_METHOD!"=="TASK_SCHEDULER" (
|
||||
echo schtasks /query /tn %SERVICE_NAME%
|
||||
) else (
|
||||
echo Check Task Manager for python.exe process
|
||||
)
|
||||
echo.
|
||||
echo 2. Test service manually:
|
||||
echo http://localhost:8765/health
|
||||
echo.
|
||||
echo 3. Check logs:
|
||||
echo %LOG_DIR%\service_wrapper.log
|
||||
echo.
|
||||
echo 4. Manual start if needed:
|
||||
if "!SERVICE_METHOD!"=="SC_SERVICE" (
|
||||
echo net start %SERVICE_NAME%
|
||||
) else if "!SERVICE_METHOD!"=="TASK_SCHEDULER" (
|
||||
echo schtasks /run /tn %SERVICE_NAME%
|
||||
) else (
|
||||
echo Run: %STARTUP_SCRIPT%
|
||||
)
|
||||
echo.
|
||||
goto :end
|
||||
|
||||
:installation_failed
|
||||
echo.
|
||||
echo ========================================
|
||||
echo INSTALLATION FAILED
|
||||
echo ========================================
|
||||
echo.
|
||||
echo ❌ All service installation methods failed
|
||||
echo.
|
||||
echo 📋 Troubleshooting steps:
|
||||
echo 1. Verify Administrator privileges
|
||||
echo 2. Check Python installation
|
||||
echo 3. Ensure port 8765 is available
|
||||
echo 4. Review logs in: %LOG_DIR%
|
||||
echo 5. Try manual service start
|
||||
echo.
|
||||
echo 🔧 Manual installation:
|
||||
echo cd /d "%INSTALL_DIR%"
|
||||
echo "%PYTHON_EXE%" "%PYTHON_SCRIPT%" --standalone
|
||||
echo.
|
||||
pause
|
||||
exit /b 1
|
||||
|
||||
:end
|
||||
echo Press any key to exit...
|
||||
pause >nul
|
||||
@@ -124,20 +124,35 @@ if exist "%CURRENT_DIR%nssm.exe" (
|
||||
echo Windows service installed with NSSM ✓
|
||||
|
||||
) else (
|
||||
echo Installing with Windows SC command...
|
||||
echo Installing with Windows SC command (Enhanced Service Wrapper)...
|
||||
|
||||
REM Create a wrapper batch file for the service
|
||||
REM Copy service wrapper
|
||||
copy "%CURRENT_DIR%service_wrapper.py" "%INSTALL_DIR%\" >nul
|
||||
if %errorLevel% neq 0 (
|
||||
echo WARNING: Service wrapper not found, creating basic wrapper...
|
||||
)
|
||||
|
||||
REM Create enhanced service wrapper batch file
|
||||
set WRAPPER_BAT=%INSTALL_DIR%\service_wrapper.bat
|
||||
|
||||
echo @echo off > "%WRAPPER_BAT%"
|
||||
echo REM Windows Print Service Wrapper - Fixed for Error 1053 >> "%WRAPPER_BAT%"
|
||||
echo cd /d "%INSTALL_DIR%" >> "%WRAPPER_BAT%"
|
||||
echo "%PYTHON_EXE%" "%PYTHON_SCRIPT%" >> "%WRAPPER_BAT%"
|
||||
echo. >> "%WRAPPER_BAT%"
|
||||
echo REM Check if Python service wrapper exists >> "%WRAPPER_BAT%"
|
||||
echo if exist "%INSTALL_DIR%\service_wrapper.py" ( >> "%WRAPPER_BAT%"
|
||||
echo echo Starting service with wrapper... >> "%WRAPPER_BAT%"
|
||||
echo "%PYTHON_EXE%" "%INSTALL_DIR%\service_wrapper.py" >> "%WRAPPER_BAT%"
|
||||
echo ^) else ( >> "%WRAPPER_BAT%"
|
||||
echo echo Starting service directly... >> "%WRAPPER_BAT%"
|
||||
echo "%PYTHON_EXE%" "%PYTHON_SCRIPT%" --service >> "%WRAPPER_BAT%"
|
||||
echo ^) >> "%WRAPPER_BAT%"
|
||||
|
||||
REM Install service using sc command
|
||||
REM Install service using sc command with enhanced wrapper
|
||||
sc create "%SERVICE_NAME%" binPath= "\"%WRAPPER_BAT%\"" DisplayName= "%SERVICE_DISPLAY_NAME%" start= auto
|
||||
|
||||
if %errorLevel% equ 0 (
|
||||
echo Windows service installed with SC ✓
|
||||
echo Windows service installed with Enhanced SC Wrapper ✓
|
||||
) else (
|
||||
echo ERROR: Failed to install Windows service
|
||||
echo Trying scheduled task fallback...
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Windows Print Service - Complete Self-Contained Version
|
||||
Includes all dependencies and libraries for Windows systems
|
||||
Fixed for Windows Service Error 1053 - Proper Service Implementation
|
||||
"""
|
||||
|
||||
import sys
|
||||
@@ -12,6 +12,7 @@ import subprocess
|
||||
import tempfile
|
||||
import shutil
|
||||
import time
|
||||
import signal
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
import threading
|
||||
@@ -24,6 +25,10 @@ import zipfile
|
||||
from http.server import HTTPServer, BaseHTTPRequestHandler
|
||||
from socketserver import ThreadingMixIn
|
||||
|
||||
# Global variables for service control
|
||||
service_running = True
|
||||
httpd_server = None
|
||||
|
||||
class ThreadingHTTPServer(ThreadingMixIn, HTTPServer):
|
||||
"""Handle requests in a separate thread."""
|
||||
daemon_threads = True
|
||||
@@ -467,48 +472,171 @@ pause
|
||||
with open('install_service_complete.bat', 'w') as f:
|
||||
f.write(service_script)
|
||||
|
||||
def signal_handler(signum, frame):
|
||||
"""Handle shutdown signals gracefully."""
|
||||
global service_running, httpd_server
|
||||
logging.info(f"Received signal {signum}, shutting down gracefully...")
|
||||
service_running = False
|
||||
|
||||
if httpd_server:
|
||||
# Shutdown server in a separate thread to avoid blocking
|
||||
def shutdown_server():
|
||||
try:
|
||||
httpd_server.shutdown()
|
||||
httpd_server.server_close()
|
||||
except Exception as e:
|
||||
logging.error(f"Error during server shutdown: {e}")
|
||||
|
||||
shutdown_thread = threading.Thread(target=shutdown_server)
|
||||
shutdown_thread.daemon = True
|
||||
shutdown_thread.start()
|
||||
shutdown_thread.join(timeout=5)
|
||||
|
||||
logging.info("Service shutdown complete")
|
||||
sys.exit(0)
|
||||
|
||||
def setup_signal_handlers():
|
||||
"""Setup signal handlers for graceful shutdown."""
|
||||
if hasattr(signal, 'SIGTERM'):
|
||||
signal.signal(signal.SIGTERM, signal_handler)
|
||||
if hasattr(signal, 'SIGINT'):
|
||||
signal.signal(signal.SIGINT, signal_handler)
|
||||
if hasattr(signal, 'SIGBREAK'): # Windows specific
|
||||
signal.signal(signal.SIGBREAK, signal_handler)
|
||||
|
||||
def main():
|
||||
"""Main service function."""
|
||||
global start_time
|
||||
"""Main service function with proper Windows service support."""
|
||||
global start_time, service_running, httpd_server
|
||||
start_time = time.time()
|
||||
|
||||
# Setup logging
|
||||
# Setup logging first
|
||||
setup_logging()
|
||||
logging.info("Starting Windows Print Service (Complete Version)")
|
||||
logging.info("=== Starting Windows Print Service (Complete Version) ===")
|
||||
logging.info(f"Python version: {sys.version}")
|
||||
logging.info(f"Platform: {sys.platform}")
|
||||
logging.info(f"Process ID: {os.getpid()}")
|
||||
logging.info(f"Command line args: {sys.argv}")
|
||||
|
||||
# Create service installer
|
||||
create_windows_service()
|
||||
# Setup signal handlers for graceful shutdown
|
||||
setup_signal_handlers()
|
||||
|
||||
# Determine run mode
|
||||
run_mode = "standalone"
|
||||
if len(sys.argv) > 1:
|
||||
if sys.argv[1] in ['--service', 'service']:
|
||||
run_mode = "windows_service"
|
||||
elif sys.argv[1] in ['--standalone', 'standalone']:
|
||||
run_mode = "standalone"
|
||||
elif sys.argv[1] in ['--test', 'test']:
|
||||
run_mode = "test"
|
||||
|
||||
logging.info(f"Running in '{run_mode}' mode")
|
||||
|
||||
if run_mode == "test":
|
||||
# Test mode - just verify setup and exit
|
||||
logging.info("=== SERVICE TEST MODE ===")
|
||||
test_service_setup()
|
||||
return
|
||||
|
||||
try:
|
||||
# Start HTTP server
|
||||
server_address = ('localhost', 8765)
|
||||
httpd = ThreadingHTTPServer(server_address, PrintServiceHandler)
|
||||
|
||||
# Try to bind to the port
|
||||
try:
|
||||
httpd_server = ThreadingHTTPServer(server_address, PrintServiceHandler)
|
||||
except OSError as e:
|
||||
if "Address already in use" in str(e):
|
||||
logging.error(f"Port 8765 is already in use. Another service instance may be running.")
|
||||
logging.error("Stop the existing service or use a different port.")
|
||||
return
|
||||
else:
|
||||
raise
|
||||
|
||||
logging.info(f"Print service started on http://{server_address[0]}:{server_address[1]}")
|
||||
logging.info("Available endpoints:")
|
||||
logging.info(" GET /health - Health check")
|
||||
logging.info(" GET /printers - List available printers")
|
||||
logging.info(" GET /printers - List available printers")
|
||||
logging.info(" GET /status - Service status")
|
||||
logging.info(" POST /print_pdf - Print PDF file")
|
||||
|
||||
# Keep track of requests
|
||||
httpd.request_count = 0
|
||||
httpd_server.request_count = 0
|
||||
|
||||
# Start server
|
||||
httpd.serve_forever()
|
||||
# Service main loop
|
||||
logging.info("Service is ready and listening...")
|
||||
|
||||
if run_mode == "standalone":
|
||||
logging.info("*** STANDALONE MODE - Press Ctrl+C to stop ***")
|
||||
logging.info("Test the service at: http://localhost:8765/health")
|
||||
|
||||
while service_running:
|
||||
try:
|
||||
# Handle requests with timeout to check service_running periodically
|
||||
httpd_server.timeout = 1.0
|
||||
httpd_server.handle_request()
|
||||
except KeyboardInterrupt:
|
||||
logging.info("Service stopped by user (Ctrl+C)")
|
||||
break
|
||||
except Exception as e:
|
||||
logging.error(f"Request handling error: {e}")
|
||||
# Continue running unless it's a critical error
|
||||
if not service_running:
|
||||
break
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logging.info("Service stopped by user")
|
||||
except Exception as e:
|
||||
logging.error(f"Service error: {e}")
|
||||
logging.error(f"Critical service error: {e}")
|
||||
import traceback
|
||||
logging.error(f"Traceback: {traceback.format_exc()}")
|
||||
finally:
|
||||
# Cleanup
|
||||
if httpd_server:
|
||||
try:
|
||||
httpd_server.server_close()
|
||||
except:
|
||||
pass
|
||||
|
||||
logging.info("=== Windows Print Service shutdown complete ===")
|
||||
|
||||
# Exit cleanly
|
||||
sys.exit(0)
|
||||
|
||||
def test_service_setup():
|
||||
"""Test service setup and configuration."""
|
||||
logging.info("Testing service setup...")
|
||||
|
||||
# Test printer detection
|
||||
try:
|
||||
# Create a temporary handler instance to test printer detection
|
||||
import tempfile
|
||||
temp_handler = PrintServiceHandler()
|
||||
temp_handler.temp_dir = tempfile.mkdtemp(prefix="test_service_")
|
||||
|
||||
printers = temp_handler.get_available_printers()
|
||||
logging.info(f"Found {len(printers)} printers:")
|
||||
for printer in printers[:5]: # Show first 5
|
||||
logging.info(f" - {printer.get('name', 'Unknown')}")
|
||||
|
||||
# Cleanup temp directory
|
||||
try:
|
||||
httpd.server_close()
|
||||
import shutil
|
||||
shutil.rmtree(temp_handler.temp_dir)
|
||||
except:
|
||||
pass
|
||||
logging.info("Windows Print Service shutdown complete")
|
||||
|
||||
except Exception as e:
|
||||
logging.warning(f"Printer detection test failed: {e}")
|
||||
|
||||
# Test port availability
|
||||
try:
|
||||
import socket
|
||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
|
||||
s.bind(('localhost', 8765))
|
||||
logging.info("Port 8765 is available ✓")
|
||||
except OSError as e:
|
||||
logging.error(f"Port 8765 test failed: {e}")
|
||||
|
||||
logging.info("Service setup test completed")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
259
windows_print_service/service_installer.py
Normal file
259
windows_print_service/service_installer.py
Normal file
@@ -0,0 +1,259 @@
|
||||
"""
|
||||
Windows Service Implementation - Alternative Approach
|
||||
Uses Windows Task Scheduler as fallback if SC service fails
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import subprocess
|
||||
import time
|
||||
import logging
|
||||
from pathlib import Path
|
||||
|
||||
def create_scheduled_task_service():
|
||||
"""Create Windows service using Task Scheduler as fallback."""
|
||||
|
||||
service_name = "QualityPrintService"
|
||||
service_script = Path(__file__).parent / "print_service_complete.py"
|
||||
python_exe = sys.executable
|
||||
|
||||
# Create XML for scheduled task
|
||||
task_xml = f'''<?xml version="1.0" encoding="UTF-16"?>
|
||||
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task">
|
||||
<RegistrationInfo>
|
||||
<Date>2025-09-26T12:00:00</Date>
|
||||
<Author>Quality Print Service</Author>
|
||||
<Description>Quality Print Service - Automatic Label Printing</Description>
|
||||
</RegistrationInfo>
|
||||
<Triggers>
|
||||
<BootTrigger>
|
||||
<Enabled>true</Enabled>
|
||||
</BootTrigger>
|
||||
</Triggers>
|
||||
<Principals>
|
||||
<Principal id="Author">
|
||||
<UserId>S-1-5-18</UserId>
|
||||
<RunLevel>HighestAvailable</RunLevel>
|
||||
</Principal>
|
||||
</Principals>
|
||||
<Settings>
|
||||
<MultipleInstancesPolicy>IgnoreNew</MultipleInstancesPolicy>
|
||||
<DisallowStartIfOnBatteries>false</DisallowStartIfOnBatteries>
|
||||
<StopIfGoingOnBatteries>false</StopIfGoingOnBatteries>
|
||||
<AllowHardTerminate>true</AllowHardTerminate>
|
||||
<StartWhenAvailable>true</StartWhenAvailable>
|
||||
<RunOnlyIfNetworkAvailable>false</RunOnlyIfNetworkAvailable>
|
||||
<IdleSettings>
|
||||
<StopOnIdleEnd>false</StopOnIdleEnd>
|
||||
<RestartOnIdle>false</RestartOnIdle>
|
||||
</IdleSettings>
|
||||
<AllowStartOnDemand>true</AllowStartOnDemand>
|
||||
<Enabled>true</Enabled>
|
||||
<Hidden>false</Hidden>
|
||||
<RunOnlyIfIdle>false</RunOnlyIfIdle>
|
||||
<WakeToRun>false</WakeToRun>
|
||||
<ExecutionTimeLimit>PT0S</ExecutionTimeLimit>
|
||||
<Priority>7</Priority>
|
||||
<RestartOnFailure>
|
||||
<Interval>PT5M</Interval>
|
||||
<Count>3</Count>
|
||||
</RestartOnFailure>
|
||||
</Settings>
|
||||
<Actions Context="Author">
|
||||
<Exec>
|
||||
<Command>"{python_exe}"</Command>
|
||||
<Arguments>"{service_script}" --service</Arguments>
|
||||
<WorkingDirectory>{service_script.parent}</WorkingDirectory>
|
||||
</Exec>
|
||||
</Actions>
|
||||
</Task>'''
|
||||
|
||||
# Save task XML to file
|
||||
task_xml_file = Path(__file__).parent / f"{service_name}_task.xml"
|
||||
with open(task_xml_file, 'w', encoding='utf-16') as f:
|
||||
f.write(task_xml)
|
||||
|
||||
return task_xml_file
|
||||
|
||||
def install_service_alternative():
|
||||
"""Install service using multiple methods."""
|
||||
|
||||
print("🔧 Installing Windows Print Service with Multiple Methods...")
|
||||
|
||||
service_name = "QualityPrintService"
|
||||
service_display_name = "Quality Print Service"
|
||||
service_script = Path(__file__).parent / "print_service_complete.py"
|
||||
python_exe = sys.executable
|
||||
|
||||
# Method 1: Try SC command with service wrapper
|
||||
print("\n📋 Method 1: Windows SC Service")
|
||||
try:
|
||||
# Create service wrapper batch file
|
||||
wrapper_bat = Path(__file__).parent / "service_wrapper.bat"
|
||||
|
||||
wrapper_content = f'''@echo off
|
||||
REM Windows Print Service Wrapper - Error 1053 Fix
|
||||
cd /d "{service_script.parent}"
|
||||
|
||||
REM Set error handling
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
REM Log startup
|
||||
echo %date% %time% - Service starting... >> service_startup.log
|
||||
|
||||
REM Check if Python exists
|
||||
if not exist "{python_exe}" (
|
||||
echo ERROR: Python not found at {python_exe} >> service_startup.log
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM Check if service script exists
|
||||
if not exist "{service_script}" (
|
||||
echo ERROR: Service script not found at {service_script} >> service_startup.log
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
REM Start the service with timeout monitoring
|
||||
echo Starting service process... >> service_startup.log
|
||||
"{python_exe}" "{service_script}" --service
|
||||
|
||||
REM Log exit
|
||||
echo %date% %time% - Service exited with code %errorlevel% >> service_startup.log
|
||||
'''
|
||||
|
||||
with open(wrapper_bat, 'w') as f:
|
||||
f.write(wrapper_content)
|
||||
|
||||
# Remove existing service
|
||||
subprocess.run(['sc', 'stop', service_name], capture_output=True)
|
||||
subprocess.run(['sc', 'delete', service_name], capture_output=True)
|
||||
|
||||
# Create service
|
||||
cmd = [
|
||||
'sc', 'create', service_name,
|
||||
f'binPath= "{wrapper_bat}"',
|
||||
f'DisplayName= "{service_display_name}"',
|
||||
'start= auto'
|
||||
]
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("✅ SC Service created successfully")
|
||||
|
||||
# Configure recovery
|
||||
subprocess.run([
|
||||
'sc', 'failure', service_name,
|
||||
'reset= 86400',
|
||||
'actions= restart/5000/restart/5000/restart/5000'
|
||||
], capture_output=True)
|
||||
|
||||
# Try to start
|
||||
start_result = subprocess.run(['sc', 'start', service_name], capture_output=True, text=True)
|
||||
if start_result.returncode == 0:
|
||||
print("✅ SC Service started successfully")
|
||||
return True
|
||||
else:
|
||||
print(f"⚠️ SC Service created but failed to start: {start_result.stderr}")
|
||||
else:
|
||||
print(f"❌ SC Service creation failed: {result.stderr}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ SC Service method failed: {e}")
|
||||
|
||||
# Method 2: Task Scheduler fallback
|
||||
print("\n📋 Method 2: Task Scheduler Service")
|
||||
try:
|
||||
task_xml_file = create_scheduled_task_service()
|
||||
|
||||
# Remove existing task
|
||||
subprocess.run(['schtasks', '/delete', '/tn', service_name, '/f'], capture_output=True)
|
||||
|
||||
# Create task
|
||||
cmd = [
|
||||
'schtasks', '/create', '/tn', service_name,
|
||||
'/xml', str(task_xml_file)
|
||||
]
|
||||
|
||||
result = subprocess.run(cmd, capture_output=True, text=True)
|
||||
|
||||
if result.returncode == 0:
|
||||
print("✅ Task Scheduler service created successfully")
|
||||
|
||||
# Start task
|
||||
start_result = subprocess.run(['schtasks', '/run', '/tn', service_name], capture_output=True, text=True)
|
||||
if start_result.returncode == 0:
|
||||
print("✅ Task Scheduler service started successfully")
|
||||
return True
|
||||
else:
|
||||
print(f"⚠️ Task created but failed to start: {start_result.stderr}")
|
||||
else:
|
||||
print(f"❌ Task Scheduler creation failed: {result.stderr}")
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Task Scheduler method failed: {e}")
|
||||
|
||||
# Method 3: Manual startup script
|
||||
print("\n📋 Method 3: Startup Script")
|
||||
try:
|
||||
startup_script = Path(os.environ.get('APPDATA', '')) / 'Microsoft' / 'Windows' / 'Start Menu' / 'Programs' / 'Startup' / 'QualityPrintService.bat'
|
||||
startup_script.parent.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
startup_content = f'''@echo off
|
||||
REM Quality Print Service - Startup Script
|
||||
cd /d "{service_script.parent}"
|
||||
start /min "Quality Print Service" "{python_exe}" "{service_script}" --service
|
||||
'''
|
||||
|
||||
with open(startup_script, 'w') as f:
|
||||
f.write(startup_content)
|
||||
|
||||
print(f"✅ Startup script created: {startup_script}")
|
||||
print("🔄 Service will start automatically on next reboot")
|
||||
|
||||
# Start immediately
|
||||
subprocess.run(['cmd', '/c', str(startup_script)], capture_output=True)
|
||||
print("✅ Service started via startup script")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Startup script method failed: {e}")
|
||||
|
||||
print("\n❌ All installation methods failed")
|
||||
return False
|
||||
|
||||
def test_service_connection(timeout=10):
|
||||
"""Test if service is running by checking HTTP endpoint."""
|
||||
import urllib.request
|
||||
import json
|
||||
|
||||
for i in range(timeout):
|
||||
try:
|
||||
with urllib.request.urlopen('http://localhost:8765/health', timeout=2) as response:
|
||||
data = json.loads(response.read().decode())
|
||||
if data.get('status') == 'healthy':
|
||||
return True
|
||||
except:
|
||||
pass
|
||||
time.sleep(1)
|
||||
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) > 1 and sys.argv[1] == 'install':
|
||||
success = install_service_alternative()
|
||||
|
||||
if success:
|
||||
print("\n🧪 Testing service connection...")
|
||||
if test_service_connection():
|
||||
print("✅ Service is responding correctly!")
|
||||
print("🌐 Test URL: http://localhost:8765/health")
|
||||
else:
|
||||
print("⚠️ Service installed but not responding")
|
||||
print("📋 Check logs and try manual start")
|
||||
else:
|
||||
print("\n❌ Service installation failed")
|
||||
print("📋 Try running as Administrator")
|
||||
sys.exit(1)
|
||||
else:
|
||||
print("Usage: python service_installer.py install")
|
||||
175
windows_print_service/service_wrapper.py
Normal file
175
windows_print_service/service_wrapper.py
Normal file
@@ -0,0 +1,175 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Windows Service Wrapper - Handles Windows Service Communication
|
||||
Fixes Error 1053 by properly communicating with Service Control Manager
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
import logging
|
||||
import subprocess
|
||||
import threading
|
||||
import signal
|
||||
from pathlib import Path
|
||||
|
||||
# Simple service state management
|
||||
class WindowsServiceManager:
|
||||
def __init__(self):
|
||||
self.service_process = None
|
||||
self.should_stop = False
|
||||
self.service_thread = None
|
||||
|
||||
def setup_logging(self):
|
||||
"""Setup service logging."""
|
||||
log_dir = os.path.join(os.path.expanduser("~"), "PrintService", "logs")
|
||||
os.makedirs(log_dir, exist_ok=True)
|
||||
|
||||
log_file = os.path.join(log_dir, f"service_wrapper_{time.strftime('%Y%m%d')}.log")
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(levelname)s - %(message)s',
|
||||
handlers=[
|
||||
logging.FileHandler(log_file, encoding='utf-8'),
|
||||
logging.StreamHandler(sys.stdout)
|
||||
]
|
||||
)
|
||||
|
||||
def signal_handler(self, signum, frame):
|
||||
"""Handle shutdown signals."""
|
||||
logging.info(f"Service wrapper received signal {signum}")
|
||||
self.stop_service()
|
||||
|
||||
def start_service(self):
|
||||
"""Start the actual print service."""
|
||||
script_dir = Path(__file__).parent
|
||||
service_script = script_dir / "print_service_complete.py"
|
||||
|
||||
if not service_script.exists():
|
||||
logging.error(f"Service script not found: {service_script}")
|
||||
return False
|
||||
|
||||
try:
|
||||
# Get Python executable path
|
||||
python_exe = sys.executable
|
||||
if not python_exe:
|
||||
python_exe = "python"
|
||||
|
||||
logging.info(f"Starting print service with: {python_exe} {service_script}")
|
||||
|
||||
# Start the service process
|
||||
self.service_process = subprocess.Popen(
|
||||
[python_exe, str(service_script), "--service"],
|
||||
cwd=str(script_dir),
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT,
|
||||
text=True,
|
||||
bufsize=1,
|
||||
universal_newlines=True
|
||||
)
|
||||
|
||||
# Monitor service output
|
||||
def monitor_output():
|
||||
if self.service_process:
|
||||
for line in iter(self.service_process.stdout.readline, ''):
|
||||
if line:
|
||||
logging.info(f"Service: {line.strip()}")
|
||||
if self.should_stop:
|
||||
break
|
||||
|
||||
self.service_thread = threading.Thread(target=monitor_output, daemon=True)
|
||||
self.service_thread.start()
|
||||
|
||||
logging.info("Print service started successfully")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"Failed to start service: {e}")
|
||||
return False
|
||||
|
||||
def stop_service(self):
|
||||
"""Stop the print service."""
|
||||
logging.info("Stopping print service...")
|
||||
self.should_stop = True
|
||||
|
||||
if self.service_process:
|
||||
try:
|
||||
# Try graceful shutdown first
|
||||
self.service_process.terminate()
|
||||
|
||||
# Wait up to 10 seconds for graceful shutdown
|
||||
for _ in range(10):
|
||||
if self.service_process.poll() is not None:
|
||||
break
|
||||
time.sleep(1)
|
||||
|
||||
# Force kill if still running
|
||||
if self.service_process.poll() is None:
|
||||
logging.warning("Force killing service process")
|
||||
self.service_process.kill()
|
||||
|
||||
self.service_process.wait()
|
||||
logging.info("Print service stopped")
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"Error stopping service: {e}")
|
||||
|
||||
def run_service(self):
|
||||
"""Main service loop."""
|
||||
logging.info("Windows Print Service Wrapper starting...")
|
||||
|
||||
# Setup signal handlers
|
||||
signal.signal(signal.SIGTERM, self.signal_handler)
|
||||
signal.signal(signal.SIGINT, self.signal_handler)
|
||||
if hasattr(signal, 'SIGBREAK'):
|
||||
signal.signal(signal.SIGBREAK, self.signal_handler)
|
||||
|
||||
# Start the actual service
|
||||
if not self.start_service():
|
||||
logging.error("Failed to start print service")
|
||||
return 1
|
||||
|
||||
# Service main loop - keep running until stopped
|
||||
try:
|
||||
while not self.should_stop:
|
||||
# Check if service process is still running
|
||||
if self.service_process and self.service_process.poll() is not None:
|
||||
logging.warning("Service process died, restarting...")
|
||||
if not self.start_service():
|
||||
logging.error("Failed to restart service")
|
||||
break
|
||||
|
||||
time.sleep(5) # Check every 5 seconds
|
||||
|
||||
except KeyboardInterrupt:
|
||||
logging.info("Service interrupted by user")
|
||||
except Exception as e:
|
||||
logging.error(f"Service loop error: {e}")
|
||||
finally:
|
||||
self.stop_service()
|
||||
|
||||
logging.info("Windows Print Service Wrapper stopped")
|
||||
return 0
|
||||
|
||||
def main():
|
||||
"""Main entry point."""
|
||||
service_manager = WindowsServiceManager()
|
||||
service_manager.setup_logging()
|
||||
|
||||
# Check command line arguments
|
||||
if len(sys.argv) > 1:
|
||||
if sys.argv[1] == "install":
|
||||
logging.info("Service install requested - use install_service_complete.bat instead")
|
||||
return 1
|
||||
elif sys.argv[1] == "start":
|
||||
logging.info("Service start requested")
|
||||
elif sys.argv[1] == "stop":
|
||||
logging.info("Service stop requested")
|
||||
return 0
|
||||
|
||||
# Run the service
|
||||
return service_manager.run_service()
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
57
windows_print_service/test_service.bat
Normal file
57
windows_print_service/test_service.bat
Normal file
@@ -0,0 +1,57 @@
|
||||
@echo off
|
||||
REM Windows Print Service - Troubleshooting and Testing Script
|
||||
REM Use this to test the service before installing it as a Windows service
|
||||
|
||||
echo =========================================
|
||||
echo Windows Print Service - Test Mode
|
||||
echo =========================================
|
||||
echo.
|
||||
|
||||
REM Set variables
|
||||
set CURRENT_DIR=%~dp0
|
||||
set SERVICE_NAME=QualityPrintService
|
||||
set INSTALL_DIR=C:\QualityPrintService
|
||||
set PYTHON_EXE=%INSTALL_DIR%\python_embedded\python.exe
|
||||
set PYTHON_SCRIPT=%INSTALL_DIR%\print_service_complete.py
|
||||
|
||||
echo [INFO] Testing service in standalone mode...
|
||||
echo [INFO] This helps diagnose issues before installing as Windows service
|
||||
echo.
|
||||
|
||||
REM Check if files exist
|
||||
if not exist "%PYTHON_EXE%" (
|
||||
echo [ERROR] Python not found at: %PYTHON_EXE%
|
||||
echo [INFO] Make sure the service is installed first using install_service_complete.bat
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
if not exist "%PYTHON_SCRIPT%" (
|
||||
echo [ERROR] Service script not found at: %PYTHON_SCRIPT%
|
||||
echo [INFO] Make sure the service is installed first using install_service_complete.bat
|
||||
pause
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
echo [INFO] Files found, starting service test...
|
||||
echo [INFO] Python: %PYTHON_EXE%
|
||||
echo [INFO] Script: %PYTHON_SCRIPT%
|
||||
echo.
|
||||
echo [INFO] Starting service in test mode...
|
||||
echo [INFO] Press Ctrl+C to stop the service
|
||||
echo [INFO] Service will run on http://localhost:8765
|
||||
echo.
|
||||
|
||||
REM Change to service directory
|
||||
cd /d "%INSTALL_DIR%"
|
||||
|
||||
REM Start service in standalone mode for testing
|
||||
"%PYTHON_EXE%" "%PYTHON_SCRIPT%" --standalone
|
||||
|
||||
echo.
|
||||
echo [INFO] Service test completed.
|
||||
echo [INFO] If the service ran successfully above, you can now:
|
||||
echo [INFO] 1. Test it: http://localhost:8765/health
|
||||
echo [INFO] 2. Start Windows service: net start %SERVICE_NAME%
|
||||
echo.
|
||||
pause
|
||||
Reference in New Issue
Block a user