using System; using System.Collections.Generic; using System.Text.Json.Serialization; namespace Deploymentcenter.Client.Models { /// /// Beschreibt, was eine Anwendung zum Laufen braucht - als Datei /// setup.json im Wurzelverzeichnis des Pakets, neben der /// manifest.json. /// /// Bewusst im Paket und nicht zentral im Deploymentcenter: so ist die /// Beschreibung mit der Anwendung versioniert. Braucht Version 2.0 ein /// Feld mehr als 1.9, stimmt es automatisch - eine zweite Pflegestelle /// wuerde frueher oder spaeter auseinanderlaufen. /// /// Fehlt die Datei, laesst sich die Anwendung trotzdem installieren; der /// Installer entpackt sie dann nur und fragt nichts ab. /// public class SetupDefinition { /// Format-Version dieser Datei. [JsonPropertyName("schema")] public int Schema { get; set; } = 1; /// Anzeigename, sonst wird der Projekt-Slug verwendet. [JsonPropertyName("displayName")] public string DisplayName { get; set; } = string.Empty; /// Kurzer Hinweistext, der vor der Abfrage angezeigt wird. [JsonPropertyName("description")] public string Description { get; set; } = string.Empty; /// Wohin die ermittelten Werte geschrieben werden. [JsonPropertyName("targets")] public List Targets { get; set; } = new List(); /// Die benoetigten Werte. [JsonPropertyName("fields")] public List Fields { get; set; } = new List(); } /// Eine Datei, in die Werte geschrieben werden. public class SetupTarget { /// /// Pfad, bezogen auf . Umgebungsvariablen sind /// in beiden Schreibweisen erlaubt: ${XDG_CONFIG_HOME} und /// %APPDATA%. Ein absoluter Pfad wird unveraendert benutzt. /// [JsonPropertyName("file")] public string File { get; set; } = string.Empty; /// /// Abweichender Pfad unter Windows. /// /// Konfigurationsordner heissen plattformabhaengig unterschiedlich: /// unter Windows ist "%APPDATA%\MeineAnwendung" ueblich, unter Linux /// "$XDG_CONFIG_HOME/meineanwendung" klein. Meist genuegt es, die /// kleingeschriebene Form anzugeben - NTFS unterscheidet nicht nach /// Gross- und Kleinschreibung, umgekehrt entstuende unter Linux ein /// zweites, leeres Verzeichnis neben dem, aus dem die Anwendung liest. /// /// Das traegt aber nur, solange das Dateisystem tatsaechlich /// unempfindlich ist - auf APFS mit Beachtung der Schreibweise oder /// einem per fsutil umgestellten NTFS-Ordner nicht mehr. Und es hilft /// gar nicht, wenn sich die Namen um mehr als die Schreibweise /// unterscheiden. Fuer diese Faelle sind die folgenden Felder da; ohne /// Angabe gilt . /// [JsonPropertyName("fileWindows")] public string FileWindows { get; set; } = string.Empty; /// Abweichender Pfad unter Linux. [JsonPropertyName("fileLinux")] public string FileLinux { get; set; } = string.Empty; /// Abweichender Pfad unter macOS. [JsonPropertyName("fileMacOS")] public string FileMacOS { get; set; } = string.Empty; /// /// Wo die Datei liegt: /// /// install (Vorgabe) - im Installationsverzeichnis /// config - %APPDATA% bzw. $XDG_CONFIG_HOME (~/.config) /// data - %LOCALAPPDATA% bzw. $XDG_DATA_HOME /// home - Benutzerverzeichnis /// /// Anwendungen, die sich unter Linux richtig verhalten, legen ihre /// Konfiguration nicht neben das Programm - /opt/<app> ist fuer den /// Dienstbenutzer meist nicht schreibbar. Ohne diese Angabe schriebe /// der Installer dorthin, wo die Anwendung nie nachsieht. /// [JsonPropertyName("location")] public string Location { get; set; } = "install"; /// "json" oder "env". [JsonPropertyName("format")] public string Format { get; set; } = "json"; /// /// Kennung, ueber die Felder dieser Datei zugeordnet werden. Ohne /// Angabe schreiben alle Felder in das erste Ziel. /// [JsonPropertyName("id")] public string Id { get; set; } = string.Empty; } /// Ein einzelner Konfigurationswert. public class SetupField { /// /// Schluessel im Ziel. Bei JSON trennt ein Doppelpunkt die Ebenen /// ("ConnectionStrings:Main"), passend zur Schreibweise von /// Microsoft.Extensions.Configuration. /// [JsonPropertyName("key")] public string Key { get; set; } = string.Empty; /// Beschriftung fuer die Abfrage. [JsonPropertyName("label")] public string Label { get; set; } = string.Empty; /// Erlaeuterung, die unter der Frage steht. [JsonPropertyName("help")] public string Help { get; set; } = string.Empty; /// string | secret | url | int | bool | enum [JsonPropertyName("type")] public string Type { get; set; } = "string"; /// Muss ein Wert vorliegen? [JsonPropertyName("required")] public bool Required { get; set; } = true; /// Vorbelegung. [JsonPropertyName("default")] public string Default { get; set; } = string.Empty; /// /// Woher der Wert kommt, wenn nicht gefragt werden soll: /// detect:hostname | detect:platform | detect:installdir | detect:username /// provision - Token beim Deploymentcenter anfordern /// ask - Vorgabe: nachfragen /// [JsonPropertyName("source")] public string Source { get; set; } = "ask"; /// Rechte fuer source = provision. [JsonPropertyName("scopes")] public List Scopes { get; set; } = new List(); /// Auswahlmoeglichkeiten fuer type = enum. [JsonPropertyName("options")] public List Options { get; set; } = new List(); /// Regulaerer Ausdruck, gegen den der Wert geprueft wird. [JsonPropertyName("validate")] public string Validate { get; set; } = string.Empty; /// Meldung, wenn die Pruefung fehlschlaegt. [JsonPropertyName("validationMessage")] public string ValidationMessage { get; set; } = string.Empty; /// Kennung des Ziels aus . [JsonPropertyName("target")] public string Target { get; set; } = string.Empty; /// Wird der Wert verdeckt eingegeben und nicht angezeigt? [JsonIgnore] public bool IsSecret => string.Equals(Type, "secret", StringComparison.OrdinalIgnoreCase) || string.Equals(Source, "provision", StringComparison.OrdinalIgnoreCase); } }