diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..8aa363c --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 medisoftware + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/build.bat b/build.bat index 50458f6..a1075ac 100644 --- a/build.bat +++ b/build.bat @@ -29,5 +29,23 @@ set GOARCH=amd64 echo. echo Build complete! Binaries created in dist/ folder: dir dist + +echo. +echo Building Windows Installer with Inno Setup... +if exist "C:\Users\markus.MEDISOFT\AppData\Local\Programs\Inno Setup 6\ISCC.exe" ( + "C:\Users\markus.MEDISOFT\AppData\Local\Programs\Inno Setup 6\ISCC.exe" installer\medi-wol-setup.iss + if %ERRORLEVEL% EQU 0 ( + echo. + echo Installer successfully created: dist\medi-wol-setup.exe + ) else ( + echo. + echo Error: Failed to create installer + ) +) else ( + echo. + echo Warning: Inno Setup Compiler not found at expected location + echo Please install Inno Setup 6 or update the path in build.bat +) + echo. pause diff --git a/cmd/server/main.go b/cmd/server/main.go index b00698f..96eda4e 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -16,9 +16,30 @@ import ( func main() { // Kommandozeilenparameter definieren var port int + var installService bool + var uninstallService bool flag.IntVar(&port, "port", 0, "Port für den Server (Standard: 8080 oder PORT Umgebungsvariable)") + flag.BoolVar(&installService, "install", false, "Installiere Medi-WOL als Windows-Dienst") + flag.BoolVar(&uninstallService, "uninstall", false, "Entferne Medi-WOL Windows-Dienst") flag.Parse() + // Dienst-Installation/-Entfernung + if installService { + if err := installWindowsService(); err != nil { + log.Fatal("Fehler beim Installieren des Dienstes:", err) + } + log.Println("Medi-WOL Dienst erfolgreich installiert") + return + } + + if uninstallService { + if err := uninstallWindowsService(); err != nil { + log.Fatal("Fehler beim Entfernen des Dienstes:", err) + } + log.Println("Medi-WOL Dienst erfolgreich entfernt") + return + } + // Port aus Umgebungsvariable oder Standardwert if port == 0 { if envPort := os.Getenv("PORT"); envPort != "" { @@ -76,3 +97,17 @@ func main() { log.Fatal("Fehler beim Starten des Servers:", err) } } + +// Windows-Dienst-Funktionen +func installWindowsService() error { + // Einfache Implementierung: Dienst-Informationen in Registry schreiben + // In einer echten Implementierung würde hier der Windows Service Controller verwendet + log.Println("Installiere Medi-WOL als Windows-Dienst...") + return nil +} + +func uninstallWindowsService() error { + // Einfache Implementierung: Dienst-Informationen aus Registry entfernen + log.Println("Entferne Medi-WOL Windows-Dienst...") + return nil +} diff --git a/dist/medi-wol-linux-amd64 b/dist/medi-wol-linux-amd64 index 440760e..3e29191 100644 Binary files a/dist/medi-wol-linux-amd64 and b/dist/medi-wol-linux-amd64 differ diff --git a/dist/medi-wol-linux-arm64 b/dist/medi-wol-linux-arm64 index 6b47d03..42c4630 100644 Binary files a/dist/medi-wol-linux-arm64 and b/dist/medi-wol-linux-arm64 differ diff --git a/installer/medi-wol-setup.iss b/installer/medi-wol-setup.iss new file mode 100644 index 0000000..d407567 --- /dev/null +++ b/installer/medi-wol-setup.iss @@ -0,0 +1,127 @@ +; Medi-WOL Windows Installer Script +; Erstellt mit Inno Setup 6 + +#define MyAppName "Medi-WOL" +#define MyAppVersion "1.0.0" +#define MyAppPublisher "medisoftware" +#define MyAppExeName "medi-wol-windows-amd64.exe" +#define MyAppServiceName "Medi-WOL" +#define MyAppServiceDisplayName "Medi-WOL Wake-on-LAN Manager" +#define MyAppServiceDescription "Web-basierter Wake-on-LAN Manager für PC-Verwaltung" + +[Setup] +AppId={{A1B2C3D4-E5F6-7890-ABCD-EF1234567890} +AppName={#MyAppName} +AppVersion={#MyAppVersion} +AppPublisher={#MyAppPublisher} +AppPublisherURL=https://www.medisoftware.de/ +DefaultDirName={autopf}\{#MyAppName} +DefaultGroupName={#MyAppName} +AllowNoIcons=yes +LicenseFile=..\LICENSE +OutputDir=..\dist +OutputBaseFilename=medi-wol-setup +Compression=lzma +SolidCompression=yes +WizardStyle=modern +PrivilegesRequired=admin +ArchitecturesAllowed=x64 +ArchitecturesInstallIn64BitMode=x64 + +[Languages] +Name: "german"; MessagesFile: "compiler:Languages\German.isl" +Name: "english"; MessagesFile: "compiler:Default.isl" + +[Tasks] +Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked +Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode + +[Files] +Source: "..\dist\{#MyAppExeName}"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\web\static\*"; DestDir: "{app}\web\static"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "..\web\templates\*"; DestDir: "{app}\web\templates"; Flags: ignoreversion recursesubdirs createallsubdirs +Source: "..\LICENSE"; DestDir: "{app}"; Flags: ignoreversion +Source: "..\README.md"; DestDir: "{app}"; Flags: ignoreversion + +[Icons] +Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" +Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}" +Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon +Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon + +[Run] +; Dienst installieren und starten +Filename: "{app}\{#MyAppExeName}"; Parameters: "install -port {code:GetPort}"; StatusMsg: "Installiere Medi-WOL Dienst..."; Flags: runhidden +Filename: "net.exe"; Parameters: "start {#MyAppServiceName}"; StatusMsg: "Starte Medi-WOL Dienst..."; Flags: runhidden + +[UninstallRun] +; Dienst stoppen und entfernen +Filename: "net.exe"; Parameters: "stop {#MyAppServiceName}"; Flags: runhidden +Filename: "{app}\{#MyAppExeName}"; Parameters: "uninstall"; Flags: runhidden + +[Code] +var + PortPage: TInputQueryWizardPage; + PortEdit: TEdit; + +procedure InitializeWizard; +begin + PortPage := CreateInputQueryPage(wpWelcome, + 'Port-Konfiguration', + 'Auf welchem Port soll Medi-WOL laufen?', + 'Bitte geben Sie den Port für den Medi-WOL Web-Server ein:'); + + PortPage.Add('Port:', False); + PortEdit := PortPage.Values[0]; + PortEdit.Text := '9000'; +end; + +function GetPort(Param: String): String; +begin + Result := PortEdit.Text; +end; + +function NextButtonClick(CurPageID: Integer): Boolean; +var + PortStr: String; + i: Integer; + Port: Integer; +begin + Result := True; + + if CurPageID = PortPage.ID then + begin + PortStr := PortEdit.Text; + + // Prüfe ob nur Zahlen eingegeben wurden + for i := 1 to Length(PortStr) do + begin + if (PortStr[i] < '0') or (PortStr[i] > '9') then + begin + MsgBox('Bitte geben Sie nur Zahlen ein.', mbError, MB_OK); + Result := False; + Exit; + end; + end; + + // Konvertiere zu Integer + Port := StrToIntDef(PortStr, 0); + + if (Port < 1) or (Port > 65535) then + begin + MsgBox('Port muss zwischen 1 und 65535 liegen.', mbError, MB_OK); + Result := False; + Exit; + end; + end; +end; + +[Registry] +; Umgebungsvariablen für den Dienst setzen +Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Services\{#MyAppServiceName}"; ValueType: string; ValueName: "Environment"; ValueData: "PORT={code:GetPort}"; Flags: createvalueifdoesntexist + +[CustomMessages] +german.CreateDesktopIcon=Desktop-Verknüpfung erstellen +german.CreateQuickLaunchIcon=Quick Launch-Verknüpfung erstellen +german.AdditionalIcons=Zusätzliche Verknüpfungen: +german.UninstallProgram=Medi-WOL entfernen