diff --git a/.gitignore b/.gitignore index 997839b..98c4cdd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ bin/ obj/ publish/ +*.zip # Skripte aus publish/ im Root behalten !install-service.ps1 diff --git a/Directory.Build.props b/Directory.Build.props new file mode 100644 index 0000000..e19a91c --- /dev/null +++ b/Directory.Build.props @@ -0,0 +1,22 @@ + + + true + win-x64 + + $([System.String]::Copy('1.0.0')) + + + + + + + + + $(GitTagRaw.TrimStart('v').Trim()) + $(GitTagClean) + $(GitTagClean).0 + $(GitTagClean).0 + + + + diff --git a/MailPrint/MailPrint.csproj b/MailPrint/MailPrint.csproj index 0406fa1..bf4ea0a 100644 --- a/MailPrint/MailPrint.csproj +++ b/MailPrint/MailPrint.csproj @@ -8,9 +8,10 @@ MailPrint MailPrint Exe - 1.0.0 - 1.0.0.0 - 1.0.0.0 + true + win-x64 + true + $(NoWarn);1591 diff --git a/MailPrint/Program.cs b/MailPrint/Program.cs index 3e3c5a8..50c158b 100644 --- a/MailPrint/Program.cs +++ b/MailPrint/Program.cs @@ -51,7 +51,34 @@ try builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => - c.SwaggerDoc("v1", new() { Title = "MailPrint API", Version = "v1" })); + { + c.SwaggerDoc("v1", new() { Title = "MailPrint API", Version = "v1" }); + + // XML-Doku aus /// Kommentaren in OpenAPI uebernehmen + var xmlPath = Path.Combine(AppContext.BaseDirectory, "MailPrint.xml"); + if (File.Exists(xmlPath)) + c.IncludeXmlComments(xmlPath); + + // API-Key-Security im Schema dokumentieren -> generierte Clients + // setzen den Header automatisch, Swagger UI hat Authorize-Button + var scheme = new Microsoft.OpenApi.Models.OpenApiSecurityScheme + { + Name = "X-Api-Key", + Type = Microsoft.OpenApi.Models.SecuritySchemeType.ApiKey, + In = Microsoft.OpenApi.Models.ParameterLocation.Header, + Description = "API-Key fuer alle /api/* Endpunkte. Konfiguriert in MailPrintConfig.", + Reference = new Microsoft.OpenApi.Models.OpenApiReference + { + Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme, + Id = "ApiKey" + } + }; + c.AddSecurityDefinition("ApiKey", scheme); + c.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement + { + [scheme] = Array.Empty() + }); + }); var app = builder.Build(); app.UseSwagger(); diff --git a/MailPrintConfig/MailPrintConfig.csproj b/MailPrintConfig/MailPrintConfig.csproj index f78cb16..4d09e5e 100644 --- a/MailPrintConfig/MailPrintConfig.csproj +++ b/MailPrintConfig/MailPrintConfig.csproj @@ -8,13 +8,14 @@ true MailPrintConfig MailPrintConfig - 1.0.0 - 1.0.0.0 - 1.0.0.0 + true + win-x64 + app.manifest + diff --git a/MailPrintConfig/MainForm.cs b/MailPrintConfig/MainForm.cs index aa4d363..5d98a89 100644 --- a/MailPrintConfig/MainForm.cs +++ b/MailPrintConfig/MainForm.cs @@ -491,6 +491,17 @@ public class MainForm : Form ?? Path.Combine(AppContext.BaseDirectory, "appsettings.json"); } + private static bool IsServiceRunning() + { + try + { + var svc = System.ServiceProcess.ServiceController.GetServices() + .FirstOrDefault(s => s.ServiceName == ServiceName); + return svc?.Status == System.ServiceProcess.ServiceControllerStatus.Running; + } + catch { return false; } + } + private void BrowseFolder(int rowIndex) { string? result = null; @@ -714,6 +725,23 @@ public class MainForm : Form Directory.CreateDirectory(Path.GetDirectoryName(path)!); File.WriteAllText(path, root.ToString(Formatting.Indented)); SetStatus($"Gespeichert: {path}", Color.DarkGreen); + + // Dienst-Neustart anbieten wenn Dienst läuft + if (IsServiceRunning()) + { + if (MessageBox.Show( + "Konfiguration gespeichert.\n\nDienst jetzt neu starten um Änderungen zu übernehmen?", + "Dienst neu starten?", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question) == DialogResult.Yes) + { + _ = ServiceActionAsync("stop").ContinueWith(async _ => + { + await Task.Delay(1500); + await ServiceActionAsync("start"); + }); + } + } } catch (Exception ex) { SetStatus($"Fehler: {ex.Message}", Color.Red); } } @@ -785,10 +813,10 @@ public class MainForm : Form private async Task ServiceActionAsync(string action) { - var publishDir = Path.GetDirectoryName(txtConfigPath.Text) ?? AppContext.BaseDirectory; - var exePath = Path.Combine(publishDir, "MailPrint.exe"); - var installPs = Path.Combine(publishDir, "..", "install-service.ps1"); - var uninstallPs= Path.Combine(publishDir, "..", "uninstall-service.ps1"); + var publishDir = Path.GetDirectoryName(txtConfigPath.Text) ?? AppContext.BaseDirectory; + var exePath = Path.Combine(publishDir, "MailPrint.exe"); + var installPs = Path.Combine(publishDir, "install-service.ps1"); + var uninstallPs = Path.Combine(publishDir, "uninstall-service.ps1"); // Bestätigung nur bei Install/Deinstall if (action is "install" or "uninstall") @@ -818,12 +846,13 @@ public class MainForm : Form { FileName = "powershell", Arguments = $"-NoProfile -NonInteractive {cmd}", - UseShellExecute = true, - Verb = "runas", - WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardError = true }; using var p = System.Diagnostics.Process.Start(psi)!; + string err = await p.StandardError.ReadToEndAsync(); await p.WaitForExitAsync(); if (p.ExitCode == 0) @@ -840,7 +869,7 @@ public class MainForm : Form MessageBox.Show(successMsg, "Erfolgreich", MessageBoxButtons.OK, MessageBoxIcon.Information); } else - SetStatus($"'{action}' fehlgeschlagen (Code {p.ExitCode})", Color.Red); + SetStatus($"'{action}' fehlgeschlagen (Code {p.ExitCode}): {err.Trim()}", Color.Red); } catch (Exception ex) { SetStatus($"Fehler: {ex.Message}", Color.Red); } finally { DisableServiceButtons(false); RefreshStartStop(); } diff --git a/MailPrintConfig/Program.cs b/MailPrintConfig/Program.cs index eec6102..68c48fd 100644 --- a/MailPrintConfig/Program.cs +++ b/MailPrintConfig/Program.cs @@ -1,5 +1,12 @@ using MailPrintConfig; -Application.EnableVisualStyles(); -Application.SetCompatibleTextRenderingDefault(false); -Application.Run(new MainForm()); +class Program +{ + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new MainForm()); + } +} diff --git a/MailPrintConfig/app.manifest b/MailPrintConfig/app.manifest new file mode 100644 index 0000000..07e6554 --- /dev/null +++ b/MailPrintConfig/app.manifest @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/build.bat b/build.bat deleted file mode 100644 index df03f5f..0000000 --- a/build.bat +++ /dev/null @@ -1,17 +0,0 @@ -@echo off -setlocal -set PROJ=C:\Users\janwu\OneDrive - dimedtec GmbH\Programmierung\MailPrint\MailPrint\MailPrint.csproj -dotnet restore "%PROJ%" -if errorlevel 1 goto :err -dotnet build "%PROJ%" -c Release -if errorlevel 1 goto :err -dotnet publish "%PROJ%" -c Release -r win-x64 --self-contained false -o "C:\Users\janwu\OneDrive - dimedtec GmbH\Programmierung\MailPrint\publish" -if errorlevel 1 goto :err -echo. -echo === BUILD ERFOLGREICH === -goto :end -:err -echo. -echo === BUILD FEHLGESCHLAGEN === -exit /b 1 -:end