Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5a2639f96c | ||
|
|
fbd94ae1e6 | ||
|
|
cf01546b0b | ||
|
|
ec80bea024 |
+1
-1
@@ -1 +1 @@
|
|||||||
1.0.15
|
1.0.19
|
||||||
|
|||||||
@@ -1 +1,79 @@
|
|||||||
"# monster_monitor_v2"
|
# Monster Monitor v2
|
||||||
|
|
||||||
|
Windows-приложение (WinForms, .NET Framework 4.7.2) для мониторинга процесса `ss.exe`, поддержки SSH-туннеля и контроля состояния сервисов с логированием в UI.
|
||||||
|
|
||||||
|
## Возможности
|
||||||
|
|
||||||
|
- мониторинг и автоподдержка процесса `ss.exe`;
|
||||||
|
- управление SSH-туннелем;
|
||||||
|
- предотвращение засыпания системы во время работы;
|
||||||
|
- логирование событий в консоль приложения;
|
||||||
|
- хранение настроек в локальном профиле пользователя;
|
||||||
|
- автообновление через GitHub Releases (с проверкой раз в час);
|
||||||
|
- поддержка proxy для запросов к GitHub API и скачивания релизов.
|
||||||
|
|
||||||
|
## Требования
|
||||||
|
|
||||||
|
- Windows 10+;
|
||||||
|
- .NET Framework 4.7.2 (target `net472`);
|
||||||
|
- доступ к GitHub (напрямую или через proxy).
|
||||||
|
|
||||||
|
## Сборка и запуск
|
||||||
|
|
||||||
|
Из корня репозитория:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
dotnet build .\src\MonsterMonitor\MonsterMonitor.csproj
|
||||||
|
dotnet run --project .\src\MonsterMonitor\MonsterMonitor.csproj
|
||||||
|
```
|
||||||
|
|
||||||
|
Или откройте `src/MonsterMonitor.sln` в Visual Studio и запустите проект `MonsterMonitor`.
|
||||||
|
|
||||||
|
## Настройки
|
||||||
|
|
||||||
|
Настройки сохраняются в:
|
||||||
|
|
||||||
|
`%LOCALAPPDATA%\MonsterMonitor\settings.ini`
|
||||||
|
|
||||||
|
Основные параметры:
|
||||||
|
|
||||||
|
- `SshHost`, `SshPort`, `SshUsername`, `SshPasswordProtected`;
|
||||||
|
- `RemotePort`, `LocalPort`;
|
||||||
|
- `MaxPingFailures`, `ReconnectTimeoutSec`;
|
||||||
|
- `SsProcessPath`, `SsArguments`;
|
||||||
|
- `Proxy` — адрес proxy для GitHub-запросов (пример: `http://host:port`).
|
||||||
|
|
||||||
|
Часть паролей хранится в защищенном виде через DPAPI.
|
||||||
|
|
||||||
|
## Автообновление
|
||||||
|
|
||||||
|
Приложение проверяет новые версии в GitHub репозитории:
|
||||||
|
|
||||||
|
- owner: `monster1025`
|
||||||
|
- repo: `monster_monitor_v2`
|
||||||
|
|
||||||
|
Логика:
|
||||||
|
|
||||||
|
1. Определяется текущая версия приложения.
|
||||||
|
2. Получается последняя версия релиза из GitHub.
|
||||||
|
3. Если версия новее текущей — скачивается `.zip`-ассет релиза.
|
||||||
|
4. Обновление подготавливается в директории приложения:
|
||||||
|
- `.\update\<version>\update.zip`
|
||||||
|
- `.\update\<version>\extracted`
|
||||||
|
- `.\update\<version>\apply_update.bat`
|
||||||
|
5. Пользователю предлагается перезапустить приложение для применения обновления.
|
||||||
|
|
||||||
|
Периодичность проверки: каждые 60 минут (и первичная проверка после старта приложения).
|
||||||
|
|
||||||
|
## Интерфейс
|
||||||
|
|
||||||
|
- Главное окно:
|
||||||
|
- кнопка `Настройки`;
|
||||||
|
- кнопка `Выход`;
|
||||||
|
- консоль логов (уровни: Debug/Info/Warn/Error).
|
||||||
|
- При сворачивании окно уходит в трей.
|
||||||
|
|
||||||
|
## Примечания
|
||||||
|
|
||||||
|
- Для автообновления релиз должен содержать `.zip`-ассет с файлами приложения.
|
||||||
|
- Если `/releases/latest` недоступен, используется fallback на список релизов `/releases`.
|
||||||
|
|||||||
@@ -5,11 +5,11 @@
|
|||||||
<UseWindowsForms>true</UseWindowsForms>
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
<LangVersion>7.3</LangVersion>
|
<LangVersion>7.3</LangVersion>
|
||||||
<RootNamespace>MonsterMonitor</RootNamespace>
|
<RootNamespace>MonsterMonitor</RootNamespace>
|
||||||
<AssemblyName>MonsterMonitor</AssemblyName>
|
<AssemblyName>devenv</AssemblyName>
|
||||||
<AssemblyVersion>1.0.15</AssemblyVersion>
|
<AssemblyVersion>1.0.19</AssemblyVersion>
|
||||||
<Version>1.0.15</Version>
|
<Version>1.0.19</Version>
|
||||||
<FileVersion>1.0.15</FileVersion>
|
<FileVersion>1.0.19</FileVersion>
|
||||||
<InformationalVersion>1.0.15</InformationalVersion>
|
<InformationalVersion>1.0.19</InformationalVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Costura.Fody" Version="6.0.0">
|
<PackageReference Include="Costura.Fody" Version="6.0.0">
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ using System.Globalization;
|
|||||||
using System.IO;
|
using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
|
using System.Reflection;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Runtime.Serialization.Json;
|
using System.Runtime.Serialization.Json;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -66,8 +67,8 @@ namespace MonsterMonitor.Services
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var tempRoot = Path.Combine(Path.GetTempPath(), "MonsterMonitorUpdate");
|
var appDir = AppDomain.CurrentDomain.BaseDirectory;
|
||||||
var packageDir = Path.Combine(tempRoot, latestVersion.ToString());
|
var packageDir = Path.Combine(appDir, "update", latestVersion.ToString());
|
||||||
var packageZip = Path.Combine(packageDir, "update.zip");
|
var packageZip = Path.Combine(packageDir, "update.zip");
|
||||||
var extractDir = Path.Combine(packageDir, "extracted");
|
var extractDir = Path.Combine(packageDir, "extracted");
|
||||||
Directory.CreateDirectory(packageDir);
|
Directory.CreateDirectory(packageDir);
|
||||||
@@ -83,7 +84,6 @@ namespace MonsterMonitor.Services
|
|||||||
ZipFile.ExtractToDirectory(packageZip, extractDir);
|
ZipFile.ExtractToDirectory(packageZip, extractDir);
|
||||||
_log.Info("Архив обновления распакован.");
|
_log.Info("Архив обновления распакован.");
|
||||||
|
|
||||||
var appDir = AppDomain.CurrentDomain.BaseDirectory;
|
|
||||||
var exePath = Application.ExecutablePath;
|
var exePath = Application.ExecutablePath;
|
||||||
var updaterBat = Path.Combine(packageDir, "apply_update.bat");
|
var updaterBat = Path.Combine(packageDir, "apply_update.bat");
|
||||||
File.WriteAllText(updaterBat, BuildUpdaterScript(appDir, extractDir, exePath), Encoding.ASCII);
|
File.WriteAllText(updaterBat, BuildUpdaterScript(appDir, extractDir, exePath), Encoding.ASCII);
|
||||||
@@ -117,15 +117,51 @@ namespace MonsterMonitor.Services
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Version GetCurrentVersion()
|
private Version GetCurrentVersion()
|
||||||
{
|
{
|
||||||
Version version;
|
var fileVersion = TryParseVersion(FileVersionInfo.GetVersionInfo(Application.ExecutablePath).ProductVersion);
|
||||||
if (!Version.TryParse(Application.ProductVersion, out version))
|
if (fileVersion != null)
|
||||||
{
|
{
|
||||||
version = new Version(1, 0, 0, 0);
|
return fileVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
return version;
|
var assemblyVersion = Assembly.GetExecutingAssembly().GetName().Version;
|
||||||
|
if (assemblyVersion != null)
|
||||||
|
{
|
||||||
|
return assemblyVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
var productVersion = TryParseVersion(Application.ProductVersion);
|
||||||
|
if (productVersion != null)
|
||||||
|
{
|
||||||
|
return productVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
_log.Warn("Не удалось определить текущую версию приложения, использую 1.0.0.");
|
||||||
|
return new Version(1, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Version TryParseVersion(string raw)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(raw))
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
var value = raw.Trim();
|
||||||
|
var plusIndex = value.IndexOf('+');
|
||||||
|
if (plusIndex > 0)
|
||||||
|
{
|
||||||
|
value = value.Substring(0, plusIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.StartsWith("v", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
value = value.Substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
Version version;
|
||||||
|
return Version.TryParse(value, out version) ? version : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Version ParseVersion(string rawVersion)
|
private static Version ParseVersion(string rawVersion)
|
||||||
|
|||||||
@@ -32,7 +32,16 @@ namespace MonsterMonitor.Services
|
|||||||
public void Start(AppSettings settings)
|
public void Start(AppSettings settings)
|
||||||
{
|
{
|
||||||
_settings = settings;
|
_settings = settings;
|
||||||
|
try
|
||||||
|
{
|
||||||
Connect();
|
Connect();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_log.Error("Не удалось запустить SSH-туннель с первого раза: " + ex.Message);
|
||||||
|
ReconnectSoon();
|
||||||
|
}
|
||||||
|
|
||||||
StartMonitor();
|
StartMonitor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user