v1.2.0 + v1.3.0: Localization, About dialog, TOTP/2FA, stability improvements

v1.2.0:
- GUI localization (EN/RU/ZH) with language switcher and persistent selection
- About dialog (ⓘ) with app info, features, quick start guide
- core/i18n.py — internationalization module with t() function
- All GUI components translated via t() keys

v1.3.0:
- TOTP/2FA tab — Google Authenticator compatible codes with live 30s countdown,
  one-click copy, per-server secret management
- core/totp.py — TOTP module (pyotp, RFC 6238)
- core/logger.py — rotating file logger (5MB, 3 backups)
- Stronger Fernet encryption key with automatic migration from old key
- Thread-safe server store with locks, atomic writes, auto-restore on corruption
- Parallel status checks via ThreadPoolExecutor (up to 10 concurrent)
- SSH client: explicit channel cleanup, Unix key permissions
- Server dialog: port validation (1-65535), TOTP secret field
- Language change preserves active tab and server selection
- pyotp dependency added

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
chrome-storm-c442
2026-02-23 11:07:51 -05:00
parent f86d6a7214
commit bf39fd7b67
26 changed files with 2029 additions and 246 deletions

125
README.md
View File

@@ -23,6 +23,12 @@
- **SSH Keys** — generate ed25519, install on server, copy to clipboard
- **Status Monitor** — background check every 60 sec (online/offline badges)
- **Claude Code Integration** — one-click setup, shared config with `/ssh` skill
- **TOTP / 2FA** — Google Authenticator compatible codes with live countdown, one-click copy
- **Encryption** — servers.json encrypted with Fernet (passwords never stored in plaintext)
- **Backups** — manual and automatic backups with one-click restore
- **Configurable Config Path** — change servers.json location via GUI
- **Localization** — GUI in English, Russian, Chinese with language switcher
- **About Dialog** — app info, features, quick start guide
- **Dark Theme** — modern CustomTkinter interface
### Installation
@@ -47,7 +53,7 @@ pip install pyinstaller
python build.py
```
Output goes to `releases/ServerManager-v1.0.0-{platform}.exe`
Output goes to `releases/ServerManager-v1.3.0-{platform}.exe`
### Usage
@@ -82,31 +88,25 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
The Setup tab installs:
- `ssh.py``~/.server-connections/` (SSH utility)
- `encryption.py``~/.server-connections/` (encryption module for CLI)
- `/ssh` skill → `~/.claude/commands/ssh.md` (Claude Code skill)
- SSH key (ed25519) — if not exists
- Checks for duplicates — safe to run multiple times
### Configuration
Shared config location: `~/.server-connections/servers.json`
Shared config location: `~/.server-connections/servers.json` (encrypted with Fernet).
Add servers via GUI or edit the JSON directly:
The config path can be changed via Setup tab → Configuration → "Change Path".
```json
{
"servers": [
{
"alias": "my-server",
"ip": "1.2.3.4",
"port": 22,
"user": "root",
"password": "secret",
"type": "ssh",
"notes": "Production"
}
]
}
```
Settings are stored in `~/.server-connections/settings.json`.
**Backups:**
- Automatic backups every 10 minutes (on save)
- Manual backup via Setup tab → "Backup Now"
- Restore from any backup via dropdown + "Restore"
- Backups stored in `~/.server-connections/backups/`
- Pre-encryption backup created automatically on first migration
### Auto-sudo
@@ -126,11 +126,13 @@ App executes: sudo -S -p '' bash -c 'systemctl restart nginx'
### Security
- `servers.json` is **encrypted** (Fernet symmetric encryption) — passwords not readable in plaintext
- `servers.json` is in `.gitignore` — never committed
- Passwords stored locally only, **never sent to any AI/API**
- SSH keys (ed25519) — recommended auth method
- sudo password sent via stdin (not visible in process list)
- When used with Claude Code: only alias + command are passed through the AI API, passwords stay in the local JSON file
- When used with Claude Code: only alias + command are passed through the AI API, passwords stay in the local encrypted file
- Automatic pre-encryption backup on first migration
### Project Structure
@@ -140,10 +142,13 @@ ServerManager/
├── version.py # Version info
├── build.py # PyInstaller build script
├── core/ # Business logic
│ ├── server_store.py # CRUD + JSON + observer (shared config)
│ ├── server_store.py # CRUD + encrypted JSON + observer + backups
│ ├── encryption.py # Fernet encryption module
│ ├── ssh_client.py # Paramiko SSH/SFTP wrapper
│ ├── claude_setup.py # Claude Code integration installer
│ ├── status_checker.py # Background monitoring
│ ├── totp.py # TOTP/2FA module (pyotp)
│ ├── logger.py # Rotating file logger
│ └── connection_factory.py
├── gui/ # CustomTkinter UI
│ ├── app.py # Main window
@@ -188,6 +193,12 @@ python main.py
- **SSH-ключи** — генерация ed25519, установка на сервер, копирование
- **Мониторинг** — фоновая проверка каждые 60 сек (бейджи online/offline)
- **Интеграция с Claude Code** — установка в один клик, общий конфиг со скиллом `/ssh`
- **TOTP / 2FA** — коды Google Authenticator с обратным отсчётом, копирование в один клик
- **Шифрование** — servers.json зашифрован Fernet (пароли не хранятся в открытом виде)
- **Бэкапы** — ручные и автоматические с восстановлением в один клик
- **Настраиваемый путь конфига** — смена расположения servers.json через GUI
- **Локализация** — интерфейс на английском, русском, китайском с переключателем
- **О программе** — информация о приложении, возможности, быстрый старт
- **Тёмная тема** — современный интерфейс CustomTkinter
### Установка
@@ -212,7 +223,7 @@ pip install pyinstaller
python build.py
```
Результат в `releases/ServerManager-v1.0.0-{платформа}.exe`
Результат в `releases/ServerManager-v1.3.0-{платформа}.exe`
### Использование
@@ -247,31 +258,25 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
Вкладка Setup устанавливает:
- `ssh.py``~/.server-connections/` (SSH-утилита)
- `encryption.py``~/.server-connections/` (модуль шифрования для CLI)
- скилл `/ssh``~/.claude/commands/ssh.md` (скилл Claude Code)
- SSH-ключ (ed25519) — если ещё не создан
- Проверяет дубли — безопасно запускать повторно
### Конфигурация
Общий конфиг: `~/.server-connections/servers.json`
Общий конфиг: `~/.server-connections/servers.json` (зашифрован Fernet).
Добавляйте серверы через GUI или редактируйте JSON:
Путь к конфигу можно изменить: вкладка Setup → Configuration → "Change Path".
```json
{
"servers": [
{
"alias": "my-server",
"ip": "1.2.3.4",
"port": 22,
"user": "root",
"password": "secret",
"type": "ssh",
"notes": "Production"
}
]
}
```
Настройки хранятся в `~/.server-connections/settings.json`.
**Бэкапы:**
- Автоматические бэкапы каждые 10 минут (при сохранении)
- Ручной бэкап: вкладка Setup → "Backup Now"
- Восстановление из любого бэкапа через dropdown + "Restore"
- Бэкапы хранятся в `~/.server-connections/backups/`
- Пред-шифровальный бэкап создаётся автоматически при первой миграции
### Авто-sudo
@@ -291,11 +296,13 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
### Безопасность
- `servers.json` **зашифрован** (Fernet симметричное шифрование) — пароли не читаемы в открытом виде
- `servers.json` в `.gitignore` — никогда не коммитится
- Пароли хранятся только локально, **никогда не передаются в AI/API**
- SSH-ключи (ed25519) — рекомендуемый метод аутентификации
- sudo-пароль передаётся через stdin (не виден в списке процессов)
- При использовании с Claude Code: через API нейронки проходят только alias + команда, пароли остаются в локальном JSON-файле
- При использовании с Claude Code: через API нейронки проходят только alias + команда, пароли остаются в зашифрованном локальном файле
- Автоматический пред-шифровальный бэкап при первой миграции
### Развёртывание на новой машине
@@ -326,6 +333,12 @@ python main.py
- **SSH密钥** — 生成ed25519、安装到服务器、复制到剪贴板
- **状态监控** — 每60秒后台检查在线/离线徽标)
- **Claude Code集成** — 一键设置,与`/ssh`技能共享配置
- **TOTP / 2FA** — 兼容Google Authenticator的验证码实时倒计时一键复制
- **加密** — servers.json使用Fernet加密密码不再以明文存储
- **备份** — 手动和自动备份,一键恢复
- **可配置路径** — 通过GUI更改servers.json位置
- **多语言** — 支持英语、俄语、中文界面切换
- **关于对话框** — 应用信息、功能特点、快速入门
- **深色主题** — 现代CustomTkinter界面
### 安装
@@ -350,7 +363,7 @@ pip install pyinstaller
python build.py
```
输出至 `releases/ServerManager-v1.0.0-{平台}.exe`
输出至 `releases/ServerManager-v1.3.0-{平台}.exe`
### 使用方法
@@ -385,31 +398,25 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
Setup标签安装
- `ssh.py``~/.server-connections/`SSH工具
- `encryption.py``~/.server-connections/`CLI加密模块
- `/ssh` 技能 → `~/.claude/commands/ssh.md`Claude Code技能
- SSH密钥ed25519— 如果不存在
- 检查重复 — 可安全重复运行
### 配置
共享配置位置:`~/.server-connections/servers.json`
共享配置位置:`~/.server-connections/servers.json`Fernet加密
通过GUI添加服务器或直接编辑JSON
通过 Setup标签 → Configuration → "Change Path" 更改配置路径。
```json
{
"servers": [
{
"alias": "my-server",
"ip": "1.2.3.4",
"port": 22,
"user": "root",
"password": "secret",
"type": "ssh",
"notes": "Production"
}
]
}
```
设置存储在 `~/.server-connections/settings.json`
**备份:**
- 每10分钟自动备份保存时
- 手动备份Setup标签 → "Backup Now"
- 从任何备份恢复:下拉菜单 + "Restore"
- 备份存储在 `~/.server-connections/backups/`
- 首次迁移时自动创建加密前备份
### 自动sudo
@@ -429,11 +436,13 @@ Setup标签安装
### 安全性
- `servers.json` **已加密**Fernet对称加密— 密码无法以明文读取
- `servers.json``.gitignore` 中 — 永不提交
- 密码仅存储在本地,**绝不发送到任何AI/API**
- SSH密钥ed25519— 推荐的认证方式
- sudo密码通过stdin传递在进程列表中不可见
- 与Claude Code配合使用时只有别名和命令通过AI API传递密码保留在本地JSON文件中
- 与Claude Code配合使用时只有别名和命令通过AI API传递密码保留在本地加密文件中
- 首次迁移时自动创建加密前备份
### 在新机器上部署