425 Zeilen
16 KiB
Python
425 Zeilen
16 KiB
Python
"""
|
|
VPS Connection Module
|
|
Handles SSH connection to VPS server
|
|
"""
|
|
|
|
import os
|
|
import tempfile
|
|
import subprocess
|
|
from utils.logger import logger
|
|
|
|
class VPSConnection:
|
|
def __init__(self):
|
|
self.server = "91.99.192.14"
|
|
self.username = "claude-dev"
|
|
self.password = "z0E1Al}q2H?Yqd!O"
|
|
logger.info("VPSConnection initialized")
|
|
|
|
def create_ssh_script(self) -> str:
|
|
"""Create a script for SSH connection with automatic password and Claude start"""
|
|
import tempfile
|
|
import os
|
|
logger.info(f"Creating SSH script for VPS connection to {self.server}")
|
|
|
|
# Create a simple bash script for SSH connection
|
|
bash_script = f'''#!/bin/bash
|
|
echo "================================================================================"
|
|
echo " Claude VPS Server Connection"
|
|
echo "================================================================================"
|
|
echo ""
|
|
echo "Server: {self.server}"
|
|
echo "Username: {self.username}"
|
|
echo ""
|
|
|
|
# Try to use sshpass if available
|
|
if command -v sshpass >/dev/null 2>&1; then
|
|
echo "Connecting to VPS server and starting Claude automatically..."
|
|
echo ""
|
|
sshpass -p "{self.password}" ssh -o StrictHostKeyChecking=no -t {self.username}@{self.server} "claude || bash"
|
|
else
|
|
# Try to install sshpass
|
|
echo "Installing sshpass for automatic login..."
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
sudo apt-get update -qq 2>/dev/null
|
|
sudo apt-get install -y sshpass -qq 2>/dev/null
|
|
fi
|
|
|
|
# Check again if sshpass is now available
|
|
if command -v sshpass >/dev/null 2>&1; then
|
|
echo "sshpass installed successfully!"
|
|
echo "Connecting to VPS server and starting Claude automatically..."
|
|
echo ""
|
|
sshpass -p "{self.password}" ssh -o StrictHostKeyChecking=no -t {self.username}@{self.server} "claude || bash"
|
|
else
|
|
echo "Manual password entry required."
|
|
echo ""
|
|
echo "Password: {self.password}"
|
|
echo "(Right-click to paste)"
|
|
echo ""
|
|
echo "After login, type: claude"
|
|
echo ""
|
|
ssh -o StrictHostKeyChecking=no {self.username}@{self.server}
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "Connection closed."
|
|
echo "Press Enter to exit..."
|
|
read
|
|
'''
|
|
|
|
# Save bash script with Unix line endings
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.sh', delete=False, newline='\n') as f:
|
|
f.write(bash_script)
|
|
bash_path = f.name
|
|
|
|
# Convert to WSL path
|
|
bash_wsl_path = bash_path.replace('\\', '/').replace('C:', '/mnt/c')
|
|
|
|
script_content = f"""@echo off
|
|
cls
|
|
REM Convert line endings and launch WSL with the bash script
|
|
wsl dos2unix {bash_wsl_path} 2>nul || wsl sed -i 's/\r$//' {bash_wsl_path}
|
|
wsl chmod +x {bash_wsl_path}
|
|
wsl bash {bash_wsl_path}
|
|
|
|
REM Clean up temp file
|
|
del "{bash_path}" 2>nul
|
|
"""
|
|
return script_content
|
|
|
|
def create_readme_content(self) -> str:
|
|
"""Generate README content for VPS project"""
|
|
from datetime import datetime
|
|
|
|
content = f"""# Claude VPS Server
|
|
|
|
*This README was automatically generated by Claude Project Manager*
|
|
|
|
## Server Information
|
|
|
|
- **Server IP**: {self.server}
|
|
- **Username**: {self.username}
|
|
- **Connection**: SSH (Port 22)
|
|
|
|
## How to Connect
|
|
|
|
### Using Claude Project Manager
|
|
1. Click on the VPS Server tile
|
|
2. Terminal will open with connection instructions
|
|
3. Enter the password when prompted
|
|
4. Type `claude` after successful login
|
|
|
|
### Manual Connection
|
|
```bash
|
|
ssh {self.username}@{self.server}
|
|
```
|
|
|
|
## Available Commands
|
|
|
|
After connecting to the VPS:
|
|
- `claude` - Start Claude CLI
|
|
- `ls` - List files
|
|
- `cd <directory>` - Change directory
|
|
- `exit` - Close SSH connection
|
|
|
|
## Security Notes
|
|
|
|
- Keep your password secure
|
|
- Don't share SSH credentials
|
|
- Always logout when finished (`exit` command)
|
|
|
|
## Features
|
|
|
|
This VPS server provides:
|
|
- Remote access to Claude
|
|
- Persistent environment
|
|
- Isolated workspace
|
|
- Full Linux environment
|
|
|
|
## Troubleshooting
|
|
|
|
### Connection Issues
|
|
1. Check internet connection
|
|
2. Verify server is online
|
|
3. Ensure SSH port (22) is not blocked
|
|
4. Try manual SSH command
|
|
|
|
### Authentication Failed
|
|
- Verify password is correct
|
|
- Check username spelling
|
|
- Ensure caps lock is off
|
|
|
|
---
|
|
|
|
## Connection Log
|
|
|
|
- README generated on {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
|
|
"""
|
|
return content
|
|
|
|
def generate_vps_readme(self, readme_path: str):
|
|
"""Generate and save VPS README"""
|
|
logger.info(f"Generating VPS README at: {readme_path}")
|
|
content = self.create_readme_content()
|
|
|
|
# Create directory if needed
|
|
os.makedirs(os.path.dirname(readme_path), exist_ok=True)
|
|
|
|
# Write README
|
|
with open(readme_path, 'w', encoding='utf-8') as f:
|
|
f.write(content)
|
|
|
|
return readme_path
|
|
|
|
def create_admin_panel_script(self) -> str:
|
|
"""Create a script for SSH connection to Admin Panel with directory change"""
|
|
import tempfile
|
|
import os
|
|
logger.info("Creating Admin Panel SSH script")
|
|
|
|
# Create a simple bash script for SSH connection
|
|
bash_script = f'''#!/bin/bash
|
|
echo "================================================================================"
|
|
echo " Claude Admin Panel Connection"
|
|
echo "================================================================================"
|
|
echo ""
|
|
echo "Server: {self.server}"
|
|
echo "Username: {self.username}"
|
|
echo "Target Directory: /opt/v2-Docker"
|
|
echo ""
|
|
|
|
# Try to use sshpass if available
|
|
if command -v sshpass >/dev/null 2>&1; then
|
|
echo "Connecting to VPS server and starting Claude in Admin Panel..."
|
|
echo ""
|
|
sshpass -p "{self.password}" ssh -o StrictHostKeyChecking=no -t {self.username}@{self.server} "cd /opt/v2-Docker && echo 'Changed to /opt/v2-Docker' && claude || bash"
|
|
else
|
|
# Try to install sshpass
|
|
echo "Installing sshpass for automatic login..."
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
sudo apt-get update -qq 2>/dev/null
|
|
sudo apt-get install -y sshpass -qq 2>/dev/null
|
|
fi
|
|
|
|
# Check again if sshpass is now available
|
|
if command -v sshpass >/dev/null 2>&1; then
|
|
echo "sshpass installed successfully!"
|
|
echo "Connecting to VPS server and starting Claude in Admin Panel..."
|
|
echo ""
|
|
sshpass -p "{self.password}" ssh -o StrictHostKeyChecking=no -t {self.username}@{self.server} "cd /opt/v2-Docker && echo 'Changed to /opt/v2-Docker' && claude || bash"
|
|
else
|
|
echo "Manual password entry required."
|
|
echo ""
|
|
echo "Password: {self.password}"
|
|
echo "(Right-click to paste)"
|
|
echo ""
|
|
echo "After login:"
|
|
echo "1. Type: cd /opt/v2-Docker"
|
|
echo "2. Type: claude"
|
|
echo ""
|
|
ssh -o StrictHostKeyChecking=no {self.username}@{self.server}
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "Connection closed."
|
|
echo "Press Enter to exit..."
|
|
read
|
|
'''
|
|
|
|
# Save bash script with Unix line endings
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.sh', delete=False, newline='\n') as f:
|
|
f.write(bash_script)
|
|
bash_path = f.name
|
|
|
|
# Convert to WSL path
|
|
bash_wsl_path = bash_path.replace('\\', '/').replace('C:', '/mnt/c')
|
|
|
|
script_content = f"""@echo off
|
|
cls
|
|
REM Convert line endings and launch WSL with the bash script
|
|
wsl dos2unix {bash_wsl_path} 2>nul || wsl sed -i 's/\r$//' {bash_wsl_path}
|
|
wsl chmod +x {bash_wsl_path}
|
|
wsl bash {bash_wsl_path}
|
|
|
|
REM Clean up temp file
|
|
del "{bash_path}" 2>nul
|
|
"""
|
|
return script_content
|
|
|
|
def create_vps_docker_script(self) -> str:
|
|
"""Create a script for SSH connection to VPS Docker with docker compose commands"""
|
|
import tempfile
|
|
import os
|
|
logger.info("Creating VPS Docker restart script")
|
|
|
|
# Create a bash script for SSH connection with docker commands
|
|
bash_script = f'''#!/bin/bash
|
|
echo "================================================================================"
|
|
echo " VPS Docker Admin Panel Restart"
|
|
echo "================================================================================"
|
|
echo ""
|
|
echo "Server: {self.server}"
|
|
echo "Username: {self.username}"
|
|
echo "Target Directory: /opt/v2-Docker/v2"
|
|
echo ""
|
|
|
|
# Try to use sshpass if available
|
|
if command -v sshpass >/dev/null 2>&1; then
|
|
echo "Connecting to VPS server and restarting Admin Panel..."
|
|
echo ""
|
|
sshpass -p "{self.password}" ssh -o StrictHostKeyChecking=no -t {self.username}@{self.server} "cd /opt/v2-Docker/v2 && echo -e '\\n[Restarting Admin Panel Docker containers...]\\n' && docker compose down && echo -e '\\n[Building containers with no cache...]\\n' && docker compose build --no-cache && echo -e '\\n[Starting containers in detached mode...]\\n' && docker compose up -d && echo -e '\\n[SUCCESS] Admin Panel restart completed successfully!\\n' || echo -e '\\n[ERROR] Error during restart process!\\n'"
|
|
else
|
|
# Try to install sshpass
|
|
echo "Installing sshpass for automatic login..."
|
|
if command -v apt-get >/dev/null 2>&1; then
|
|
sudo apt-get update -qq 2>/dev/null
|
|
sudo apt-get install -y sshpass -qq 2>/dev/null
|
|
fi
|
|
|
|
# Check again if sshpass is now available
|
|
if command -v sshpass >/dev/null 2>&1; then
|
|
echo "sshpass installed successfully!"
|
|
echo "Connecting to VPS server and restarting Admin Panel..."
|
|
echo ""
|
|
sshpass -p "{self.password}" ssh -o StrictHostKeyChecking=no -t {self.username}@{self.server} "cd /opt/v2-Docker/v2 && echo -e '\\n[Restarting Admin Panel Docker containers...]\\n' && docker compose down && echo -e '\\n[Building containers with no cache...]\\n' && docker compose build --no-cache && echo -e '\\n[Starting containers in detached mode...]\\n' && docker compose up -d && echo -e '\\n[SUCCESS] Admin Panel restart completed successfully!\\n' || echo -e '\\n[ERROR] Error during restart process!\\n'"
|
|
else
|
|
echo "Manual password entry required."
|
|
echo ""
|
|
echo "Password: {self.password}"
|
|
echo "(Right-click to paste)"
|
|
echo ""
|
|
echo "After login, the following commands will be executed:"
|
|
echo "1. cd /opt/v2-Docker/v2"
|
|
echo "2. docker compose down"
|
|
echo "3. docker compose build --no-cache"
|
|
echo "4. docker compose up -d"
|
|
echo ""
|
|
ssh -o StrictHostKeyChecking=no {self.username}@{self.server}
|
|
fi
|
|
fi
|
|
|
|
echo ""
|
|
echo "Press Enter to close..."
|
|
read
|
|
'''
|
|
|
|
# Save bash script with Unix line endings
|
|
with tempfile.NamedTemporaryFile(mode='w', suffix='.sh', delete=False, newline='\n') as f:
|
|
f.write(bash_script)
|
|
bash_path = f.name
|
|
|
|
# Convert to WSL path
|
|
bash_wsl_path = bash_path.replace('\\', '/').replace('C:', '/mnt/c')
|
|
|
|
script_content = f"""@echo off
|
|
cls
|
|
REM Convert line endings and launch WSL with the bash script
|
|
wsl dos2unix {bash_wsl_path} 2>nul || wsl sed -i 's/\r$//' {bash_wsl_path}
|
|
wsl chmod +x {bash_wsl_path}
|
|
wsl bash {bash_wsl_path}
|
|
|
|
REM Clean up temp file
|
|
del "{bash_path}" 2>nul
|
|
"""
|
|
return script_content
|
|
|
|
def create_activity_server_script(self) -> str:
|
|
"""Create a script for SSH connection to Activity Server"""
|
|
import tempfile
|
|
import os
|
|
logger.info("Creating Activity Server connection script")
|
|
|
|
# Create a robust script with multiple approaches
|
|
script_content = f"""@echo off
|
|
cls
|
|
echo ================================================================================
|
|
echo CPM Activity Server Connection
|
|
echo ================================================================================
|
|
echo.
|
|
echo Server: {self.server}
|
|
echo Username: {self.username}
|
|
echo Target Directory: /home/claude-dev/cpm-activity-server
|
|
echo.
|
|
|
|
REM Check if PowerShell is available and use it for better plink integration
|
|
where powershell >nul 2>&1
|
|
if %ERRORLEVEL% EQU 0 (
|
|
echo Using PowerShell for enhanced connection...
|
|
powershell -NoProfile -ExecutionPolicy Bypass -Command "& {{$plinkPath = Get-Command plink -ErrorAction SilentlyContinue; if ($plinkPath) {{ Write-Host 'Connecting via plink...' -ForegroundColor Green; Write-Host ''; $process = Start-Process -FilePath 'plink' -ArgumentList '-ssh', '-l', '{self.username}', '-pw', '{self.password}', '-t', '{self.server}', 'cd /home/claude-dev/cpm-activity-server && echo \"Successfully changed to Activity Server directory\" && echo && bash -l' -PassThru -NoNewWindow -Wait; if ($process.ExitCode -ne 0) {{ Write-Host ''; Write-Host 'Automatic directory change failed. Starting interactive session...' -ForegroundColor Yellow; Write-Host ''; Write-Host 'IMPORTANT: After login, run these commands:' -ForegroundColor Red; Write-Host ' cd /home/claude-dev/cpm-activity-server' -ForegroundColor White; Write-Host ' claude' -ForegroundColor White; Write-Host ''; & plink -ssh -l {self.username} -pw '{self.password}' -t {self.server} }} }} else {{ Write-Host 'Plink not found, trying standard SSH...' -ForegroundColor Yellow; Write-Host 'Password: {self.password}'; Write-Host 'After login, run: cd /home/claude-dev/cpm-activity-server && claude'; & ssh {self.username}@{self.server} }} }}"
|
|
goto end
|
|
)
|
|
|
|
REM First, try the plink approach with RemoteCommand
|
|
where plink >nul 2>&1
|
|
if %ERRORLEVEL% EQU 0 (
|
|
echo Using PuTTY plink for connection...
|
|
echo.
|
|
|
|
REM Try plink with direct command execution
|
|
echo Attempting automatic directory change...
|
|
plink -batch -ssh -l {self.username} -pw "{self.password}" {self.server} "cd /home/claude-dev/cpm-activity-server && exec bash -l"
|
|
|
|
REM If that didn't work, try interactive mode
|
|
if %ERRORLEVEL% NEQ 0 (
|
|
echo.
|
|
echo Direct command execution failed. Starting interactive session...
|
|
echo.
|
|
echo ================================================================================
|
|
echo IMPORTANT: After login, please run these commands:
|
|
echo.
|
|
echo cd /home/claude-dev/cpm-activity-server
|
|
echo claude
|
|
echo.
|
|
echo ================================================================================
|
|
echo.
|
|
plink -ssh -l {self.username} -pw "{self.password}" -t {self.server}
|
|
)
|
|
goto end
|
|
)
|
|
|
|
REM Check if we have WSL available
|
|
where wsl >nul 2>&1
|
|
if %ERRORLEVEL% EQU 0 (
|
|
echo Using WSL for connection...
|
|
echo.
|
|
|
|
REM Create inline bash command for WSL
|
|
wsl bash -c "echo 'Connecting to Activity Server...' && if command -v sshpass >/dev/null 2>&1; then sshpass -p '{self.password}' ssh -o StrictHostKeyChecking=no -t {self.username}@{self.server} 'cd /home/claude-dev/cpm-activity-server && echo \"Successfully changed to Activity Server directory\" && echo && claude || bash -l'; else echo 'Manual password entry required.' && echo 'Password: {self.password}' && echo && echo 'After login, run: cd /home/claude-dev/cpm-activity-server && claude' && echo && ssh -o StrictHostKeyChecking=no {self.username}@{self.server}; fi"
|
|
goto end
|
|
)
|
|
|
|
REM Fallback to standard SSH
|
|
echo No automated tools found. Using standard SSH...
|
|
echo.
|
|
echo ================================================================================
|
|
echo Connection Instructions:
|
|
echo.
|
|
echo 1. Enter this password when prompted: {self.password}
|
|
echo (You can right-click to paste in most terminals)
|
|
echo.
|
|
echo 2. After successful login, run these commands:
|
|
echo cd /home/claude-dev/cpm-activity-server
|
|
echo claude
|
|
echo.
|
|
echo ================================================================================
|
|
echo.
|
|
pause
|
|
ssh {self.username}@{self.server}
|
|
|
|
:end
|
|
echo.
|
|
echo Connection closed.
|
|
pause
|
|
"""
|
|
return script_content
|
|
|
|
# Test module
|
|
if __name__ == "__main__":
|
|
vps = VPSConnection()
|
|
print("VPS Connection Module")
|
|
print(f"Server: {vps.server}")
|
|
print(f"Username: {vps.username}")
|
|
print("\nSSH Script Preview:")
|
|
print(vps.create_ssh_script()[:300] + "...") |