summaryrefslogtreecommitdiffstats
path: root/src/main.lib/Plugins/ValidationPlugins/Dns/Script/Script.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.lib/Plugins/ValidationPlugins/Dns/Script/Script.cs')
-rw-r--r--src/main.lib/Plugins/ValidationPlugins/Dns/Script/Script.cs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main.lib/Plugins/ValidationPlugins/Dns/Script/Script.cs b/src/main.lib/Plugins/ValidationPlugins/Dns/Script/Script.cs
new file mode 100644
index 0000000..7bd9e4d
--- /dev/null
+++ b/src/main.lib/Plugins/ValidationPlugins/Dns/Script/Script.cs
@@ -0,0 +1,78 @@
+using PKISharp.WACS.Clients;
+using PKISharp.WACS.Clients.DNS;
+using PKISharp.WACS.DomainObjects;
+using PKISharp.WACS.Services;
+
+namespace PKISharp.WACS.Plugins.ValidationPlugins.Dns
+{
+ internal class Script : DnsValidation<ScriptOptions, Script>
+ {
+ private readonly ScriptClient _scriptClient;
+
+ internal const string DefaultCreateArguments = "create {Identifier} {RecordName} {Token}";
+ internal const string DefaultDeleteArguments = "delete {Identifier} {RecordName} {Token}";
+
+ public Script(
+ ScriptOptions options,
+ LookupClientProvider dnsClient,
+ ILogService log,
+ string identifier) :
+ base(dnsClient, log, options, identifier)
+ {
+ _scriptClient = new ScriptClient(log);
+ }
+
+ public override void CreateRecord(string recordName, string token)
+ {
+ var script = _options.Script ?? _options.CreateScript;
+ if (!string.IsNullOrWhiteSpace(script))
+ {
+ var args = DefaultCreateArguments;
+ if (!string.IsNullOrWhiteSpace(_options.CreateScriptArguments))
+ {
+ args = _options.CreateScriptArguments;
+ }
+ _scriptClient.RunScript(script, ProcessArguments(recordName, token, args, script.EndsWith(".ps1")));
+ }
+ else
+ {
+ _log.Error("No create script configured");
+ }
+ }
+
+ public override void DeleteRecord(string recordName, string token)
+ {
+ var script = _options.Script ?? _options.DeleteScript;
+ if (!string.IsNullOrWhiteSpace(script))
+ {
+ var args = DefaultDeleteArguments;
+ if (!string.IsNullOrWhiteSpace(_options.DeleteScriptArguments))
+ {
+ args = _options.DeleteScriptArguments;
+ }
+ _scriptClient.RunScript(script, ProcessArguments(recordName, token, args, script.EndsWith(".ps1")));
+ }
+ else
+ {
+ _log.Warning("No delete script configured, validation record remains");
+ }
+ }
+
+ private string ProcessArguments(string recordName, string token, string args, bool escapeToken)
+ {
+ var ret = args;
+ ret = ret.Replace("{Identifier}", _identifier);
+ ret = ret.Replace("{RecordName}", recordName);
+ // Some tokens start with - which confuses Powershell. We did not want to
+ // make a breaking change for .bat or .exe files, so instead escape the
+ // token with double quotes, as Powershell discards the quotes anyway and
+ // thus it's functionally equivalant.
+ if (escapeToken && (ret.Contains(" {Token} ") || ret.EndsWith(" {Token}")))
+ {
+ ret.Replace("{Token}", "\"{Token}\"");
+ }
+ ret = ret.Replace("{Token}", token);
+ return ret;
+ }
+ }
+}