From 36b776d6d1fbaecad8d88250d90ec132e851dd98 Mon Sep 17 00:00:00 2001 From: code liturgy Date: Mon, 14 Nov 2022 18:49:29 +0000 Subject: [PATCH] Typed tree to retrieve configuration tree --- Sharp.Augeas.Test/AugeasTests.cs | 19 +-- Sharp.Augeas/Augeas/Augeas.cs | 80 ++++-------- Sharp.Augeas/Platform/Linux/libclAugeas.so | Bin 209256 -> 0 bytes Sharp.Augeas/Sharp.Augeas.csproj | 2 +- Sharp.Augeas/Tree/Argument.cs | 25 ++++ Sharp.Augeas/Tree/Directive.cs | 74 +++++++++++ Sharp.Augeas/Tree/Node.cs | 28 +++++ Sharp.Augeas/Tree/SuperNode.cs | 56 +++++++++ Sharp.Augeas/Tree/TreeExtensions.cs | 119 ++++++++++++++++++ .../VirtualHost/ApacheConfigExtensions.cs | 6 - Sharp.Augeas/VirtualHost/Argument.cs | 20 --- Sharp.Augeas/VirtualHost/Directive.cs | 7 -- Sharp.Augeas/VirtualHost/Node.cs | 50 -------- Sharp.Augeas/VirtualHost/Proxy.cs | 8 -- Sharp.Augeas/VirtualHost/VirtualHost.cs | 9 -- Sharp.Augeas/VirtualHostTreeGenerator.cs | 38 ------ 16 files changed, 333 insertions(+), 208 deletions(-) create mode 100644 Sharp.Augeas/Tree/Argument.cs create mode 100644 Sharp.Augeas/Tree/Directive.cs create mode 100644 Sharp.Augeas/Tree/Node.cs create mode 100644 Sharp.Augeas/Tree/SuperNode.cs create mode 100644 Sharp.Augeas/Tree/TreeExtensions.cs delete mode 100644 Sharp.Augeas/VirtualHost/ApacheConfigExtensions.cs delete mode 100644 Sharp.Augeas/VirtualHost/Argument.cs delete mode 100644 Sharp.Augeas/VirtualHost/Directive.cs delete mode 100644 Sharp.Augeas/VirtualHost/Node.cs delete mode 100644 Sharp.Augeas/VirtualHost/Proxy.cs delete mode 100644 Sharp.Augeas/VirtualHost/VirtualHost.cs delete mode 100644 Sharp.Augeas/VirtualHostTreeGenerator.cs diff --git a/Sharp.Augeas.Test/AugeasTests.cs b/Sharp.Augeas.Test/AugeasTests.cs index 3a82049..be8776f 100644 --- a/Sharp.Augeas.Test/AugeasTests.cs +++ b/Sharp.Augeas.Test/AugeasTests.cs @@ -1,4 +1,5 @@ using System.Text; +using System.Text.RegularExpressions; namespace Sharp.Augeas.Test; @@ -29,11 +30,10 @@ public class AugeasTests } [Test] - public void NoExceptionThrownWhenPrintingVirtualhostTree() + public void GetTreeHasDirectivesAndArguments() { - var virtualHostConfig = EXAMPLE_CONF_1; - _augeas.PrintVirtualHostTree(virtualHostConfig); - Assert.Pass(); + var tree = _augeas.GetTree("VirtualHost", $"/files{EXAMPLE_CONF_1}/VirtualHost/*"); + Assert.That(tree.Arguments.Count > 0 && tree.Directives.Count > 0); } [Test] @@ -75,6 +75,7 @@ public class AugeasTests { Assert.Fail("Unable to write changes to disk."); } + var retrieveVal = _augeas.GetNode(nodePath); Assert.That(retrieveVal == newValue); } @@ -99,7 +100,6 @@ public class AugeasTests } - [Test] public void MatchCanReturnMultipleDirectives() { @@ -108,13 +108,4 @@ public class AugeasTests Assert.That(sites.Length > 0); } - - [Test] - public void GetTreeVirtualHostReturnsDictionaryWithKeys() - { - var path = EXAMPLE_CONF_1; - var tree = _augeas.GetVirtualHostTree(path); - Assert.That(tree.Count > 0); - } - } \ No newline at end of file diff --git a/Sharp.Augeas/Augeas/Augeas.cs b/Sharp.Augeas/Augeas/Augeas.cs index eb76c89..fe691ef 100644 --- a/Sharp.Augeas/Augeas/Augeas.cs +++ b/Sharp.Augeas/Augeas/Augeas.cs @@ -1,4 +1,6 @@ -using System.Runtime.InteropServices;using Sharp.Augeas.Test; +using System.Runtime.InteropServices; +using System.Text; +using Sharp.Augeas.Test; using static Sharp.Augeas.AugeasExtern; namespace Sharp.Augeas @@ -8,12 +10,13 @@ namespace Sharp.Augeas /// public sealed unsafe class Augeas { - #region Flags + /// /// /// public static int NONE = 0; + public static int SAVE_BACKUP = (1 << 0); public static int SAVE_NEWFILE = (1 << 1); public static int TYPE_CHECK = (1 << 2); @@ -23,22 +26,23 @@ namespace Sharp.Augeas public static int NO_MODL_AUTOLOAD = (1 << 6); public static int AUG_ENABLE_SPAN = (1 << 7); + #endregion Flags - + private readonly IntPtr _augeas; private HashSet _loadedFiles = new(); #region Constructor / Destructor - + /// /// Augeas Core Destructor /// ~Augeas() - { + { close_aug(_augeas); } - + /// /// Augeas Core constructor /// @@ -60,7 +64,7 @@ namespace Sharp.Augeas public Augeas(string root) { var lensPath = Environment.GetEnvironmentVariable("AUG_LENS_PATH"); - + if (string.IsNullOrEmpty(lensPath)) { throw new InvalidOperationException( @@ -68,21 +72,19 @@ namespace Sharp.Augeas } var augSettings = new AugSettings(root, lensPath); - + _augeas = init_aug(augSettings, NO_STDINC | NO_LOAD); - + if (_augeas == IntPtr.Zero) { throw new InvalidOperationException("Augeas is not a valid instance."); } } - #endregion #region Augeas Internal Api - /// /// Prints a preview of the desired segment in /// @@ -114,7 +116,7 @@ namespace Sharp.Augeas { return true; } - + bool success = load_file(_augeas, configurationFilePath); _loadedFiles.Add(configurationFilePath); @@ -145,9 +147,9 @@ namespace Sharp.Augeas /// /// Configuration path. /// Dictionary with the Tree - private Dictionary GetTree(string matchPath) + public Dictionary GetDictionaryTree(string matchPath) { - var result = new Dictionary(); + var result = new Dictionary(); var raw = get_tree(_augeas, matchPath); string sb = Marshal.PtrToStringAnsi(raw); var lines = sb.Split(";ENDL;"); @@ -159,6 +161,7 @@ namespace Sharp.Augeas result.Add(pair[0].Remove(0, 3), pair[1]); } } + FreeString(raw); return result; } @@ -188,7 +191,7 @@ namespace Sharp.Augeas public int InsertNode(string matchPath, string label, int before = 0) { - return insert_node(_augeas, matchPath, label, before); + return insert_node(_augeas, matchPath, label, before); } @@ -219,16 +222,16 @@ namespace Sharp.Augeas FreeString(raw); return sb; } - - #endregion - - + + #endregion + + /// /// Matches of the path expression PATH in AUG. /// /// Augeas path. /// - public string[] Match (string matchPath) + public string[] Match(string matchPath) { sbyte** result = null; var count = match(_augeas, matchPath, &result); @@ -248,42 +251,9 @@ namespace Sharp.Augeas result[i] = Marshal.PtrToStringUTF8((IntPtr)list[i]); Marshal.FreeCoTaskMem((IntPtr)list[i]); } - + return result; } - - - - /// - /// Given a , prints the Virtual Host tree. - /// - /// Apache configuration file. - public void PrintVirtualHostTree(string apacheSitePath) - { - LoadFile(apacheSitePath); - string virtualHostTree = $"/files{apacheSitePath}/VirtualHost/*"; - PrintTree(virtualHostTree); - } - - /// - /// Given a , gets a virtual host tree. - /// - /// Apache configuration file. - /// - public Dictionary GetVirtualHostTree(string apacheSitePath) - { - LoadFile(apacheSitePath); - string virtualHostTree = $"/files{apacheSitePath}/VirtualHost/*"; - return GetTree(virtualHostTree); - } - - void PrintVirtualHostProxyTree(string apacheSitePath) - { - LoadFile(apacheSitePath); - string virtualHostProxyMatchPath = $"/files{apacheSitePath}/VirtualHost/Proxy/*"; - PrintTree(virtualHostProxyMatchPath); - } - } -} +} \ No newline at end of file diff --git a/Sharp.Augeas/Platform/Linux/libclAugeas.so b/Sharp.Augeas/Platform/Linux/libclAugeas.so index 6903728a71a84b450f82cc63c3e38c903c029f67..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 209256 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%0D{Q{3mB){&g`Wfc?9 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 diff --git a/Sharp.Augeas/Sharp.Augeas.csproj b/Sharp.Augeas/Sharp.Augeas.csproj index ddd724c..56cc1ed 100644 --- a/Sharp.Augeas/Sharp.Augeas.csproj +++ b/Sharp.Augeas/Sharp.Augeas.csproj @@ -15,7 +15,7 @@ root\%(RecursiveDir)\%(Filename)%(Extension) - + PreserveNewest diff --git a/Sharp.Augeas/Tree/Argument.cs b/Sharp.Augeas/Tree/Argument.cs new file mode 100644 index 0000000..e0eadea --- /dev/null +++ b/Sharp.Augeas/Tree/Argument.cs @@ -0,0 +1,25 @@ +namespace Sharp.Augeas; + +public class Argument : Node +{ + + public string Value; + + public bool SetValue(string newValue) + { + Value = newValue; + return _augeas.SetNode(Path, newValue); + } + + public Argument(Augeas augeas, string id, string path, string value) : base(augeas, path) + { + Id = id; + Path = path; + Value = value; + } + + public override string ToString() + { + return Value; + } +} \ No newline at end of file diff --git a/Sharp.Augeas/Tree/Directive.cs b/Sharp.Augeas/Tree/Directive.cs new file mode 100644 index 0000000..3cb6f42 --- /dev/null +++ b/Sharp.Augeas/Tree/Directive.cs @@ -0,0 +1,74 @@ +using System.Text; + +namespace Sharp.Augeas; + +public class Directive : Node +{ + public string Value; + public List Arguments; + public bool HasArguments => Arguments.Count != 0; + + ///

+ /// Sets a new value for the directive using string literals + /// The values are separated by spaces, the first value is the directive value, + /// the other values are values corresponding to the arguments. + /// + /// + public void Set(string newValue) + { + var splitted = newValue.Split(" "); + + if (splitted.Length > 0) + { + SetValue(splitted[0]); + } + + for (int i = 1; i < splitted.Length; i++) + { + var argumentIndex = i - 1; + Arguments[argumentIndex].SetValue(splitted[i]); + } + } + + /// + /// Set the value of this directive. + /// Note: This doesn't write any changes to disk. + /// + /// New value. + /// + public bool SetValue(string newValue) + { + Value = newValue; + return _augeas.SetNode(Path, newValue); + } + + public Directive(Augeas augeas, string id, string path, string value) : base(augeas, path) + { + Value = value; + Id = id; + Path = path; + Arguments = new List(); + } + + /// + /// Add a argument to this node. + /// + /// + public void AddArgument(Argument argument) + { + argument.Parent = this; + Arguments.Add(argument); + } + + public override string ToString() + { + var sb = new StringBuilder($"{Value} "); + + foreach (var arg in Arguments) + { + sb.Append($"{arg} "); + } + + return sb.ToString().TrimEnd(); + } +} \ No newline at end of file diff --git a/Sharp.Augeas/Tree/Node.cs b/Sharp.Augeas/Tree/Node.cs new file mode 100644 index 0000000..090115f --- /dev/null +++ b/Sharp.Augeas/Tree/Node.cs @@ -0,0 +1,28 @@ +namespace Sharp.Augeas; + +public class Node +{ + public string Id; + public Node Parent; + public string Path; + protected readonly Augeas _augeas; + + public Node(Augeas augeas, string path) + { + _augeas = augeas; + Parent = null; + Path = path; + } + public Node(Augeas augeas, Node parent, string path) + { + _augeas = augeas; + Parent = parent; + Path = path; + } + + public bool Save() + { + return _augeas.Save(); + } + +} \ No newline at end of file diff --git a/Sharp.Augeas/Tree/SuperNode.cs b/Sharp.Augeas/Tree/SuperNode.cs new file mode 100644 index 0000000..fec60f4 --- /dev/null +++ b/Sharp.Augeas/Tree/SuperNode.cs @@ -0,0 +1,56 @@ +using System.Text; + +namespace Sharp.Augeas +{ + public class SuperNode : Node + { + public List Directives; + public List Arguments; + public List SuperNodes; + + public SuperNode(Augeas augeas, string path, string id) : base(augeas, path) + { + Path = path; + Id = id; + Directives = new List(); + Arguments = new List(); + SuperNodes = new List(); + } + + public Directive GetDirective(string value) + { + return Directives.FirstOrDefault(d => d.Value == value, null); + } + + public void AddArgument(Argument argument) + { + argument.Parent = this; + Arguments.Add(argument); + } + + public void AddDirective(Directive directive) + { + directive.Parent = this; + Directives.Add(directive); + } + + public void AddSuperNode(SuperNode superNode) + { + superNode.Parent = this; + SuperNodes.Add(superNode); + } + + public override string ToString() + { + var sb = new StringBuilder($"{Id} "); + + foreach (var arg in Arguments) + { + sb.Append($"{arg} "); + } + + return sb.ToString().TrimEnd();; + } + } +} + diff --git a/Sharp.Augeas/Tree/TreeExtensions.cs b/Sharp.Augeas/Tree/TreeExtensions.cs new file mode 100644 index 0000000..6748d45 --- /dev/null +++ b/Sharp.Augeas/Tree/TreeExtensions.cs @@ -0,0 +1,119 @@ +using System.Text; + +namespace Sharp.Augeas; + +public static class TreeExtensions +{ + /// + /// Builds a typed tree with the + /// + /// + /// Super node name. + /// Augeas path. + /// + public static SuperNode GetTree(this Augeas augeas, string superNodeName, string augeasPath) + { + var basePath = augeasPath.Replace("*", ""); + var tree = augeas.GetDictionaryTree(augeasPath); + Dictionary addedDirectives = new Dictionary(); + Dictionary addedSuperNodes = new Dictionary(); + addedSuperNodes.Add(superNodeName, new SuperNode(augeas, augeasPath, superNodeName)); + + foreach (var treeKey in tree.Keys) + { + var hierarchy = treeKey.Split('/'); + var firstElement = hierarchy[0]; + // Parent + if (hierarchy.Length <= 1) + { + var rFullPath = $"{basePath}{firstElement}"; + if (firstElement.StartsWith("directive")) + { + Directive directive = new Directive(augeas, firstElement, rFullPath, tree[firstElement]); + directive.Parent = addedSuperNodes[superNodeName]; + addedSuperNodes[superNodeName].AddDirective(directive); + addedDirectives.Add(treeKey, directive); + continue; + } + // If is argument + if (firstElement.StartsWith("arg")) + { + Argument argument = new Argument(augeas, firstElement, rFullPath, tree[firstElement]); + argument.Parent = addedSuperNodes[superNodeName]; + addedSuperNodes[superNodeName].AddArgument(argument); + continue; + } + if (IsSuperNodeCandidate(firstElement) && !addedSuperNodes.ContainsKey(firstElement)) + { + var superNode = new SuperNode(augeas, rFullPath, firstElement); + superNode.Parent = addedSuperNodes[superNodeName]; + addedSuperNodes.Add(firstElement, superNode); + } + continue; + } + // handle children + for (var i = 1; i < hierarchy.Length; i++) + { + var childKey = hierarchy[i]; + var parentPathBuilder = new StringBuilder(); + + for (int j = 0; j < i; j++) parentPathBuilder.Append($"{hierarchy[j]}/"); + + var parentPath = parentPathBuilder.ToString(); + parentPath = parentPath.Trim('/'); + var fullPath = $"{parentPath}/{childKey}"; + var rFullPath = $"{basePath}{fullPath}"; + var childValue = tree[fullPath]; + + if (IsSuperNodeCandidate(firstElement) && !addedSuperNodes.ContainsKey(firstElement)) + { + var superNode = new SuperNode(augeas, rFullPath, firstElement); + superNode.Parent = addedSuperNodes[superNodeName]; + addedSuperNodes.Add(firstElement, superNode); + } + if (childKey.StartsWith("directive")) + { + Directive directive = new Directive(augeas, childKey, rFullPath, childValue); + if (addedDirectives.ContainsKey(fullPath)) continue; + addedDirectives.Add(fullPath, directive); + if (addedSuperNodes.ContainsKey(parentPath)) + addedSuperNodes[parentPath].AddDirective(directive); + + continue; + } + if (childKey.StartsWith("arg")) + { + Argument argument = new Argument(augeas, childKey, rFullPath, childValue); + + if (addedDirectives.ContainsKey(parentPath)) + { + addedDirectives[parentPath].AddArgument(argument); + continue; + } + + if (addedSuperNodes.ContainsKey(parentPath)) + addedSuperNodes[parentPath].AddArgument(argument); + } + } + } + + var superNodes = addedSuperNodes.Keys; + + foreach (var key in superNodes) + { + if (key != superNodeName) + { + addedSuperNodes[superNodeName].AddSuperNode(addedSuperNodes[key]); + } + } + + return addedSuperNodes[superNodeName]; + } + + + private static bool IsSuperNodeCandidate(string key) + { + return !key.StartsWith("arg") && !key.StartsWith("directive"); + } + +} \ No newline at end of file diff --git a/Sharp.Augeas/VirtualHost/ApacheConfigExtensions.cs b/Sharp.Augeas/VirtualHost/ApacheConfigExtensions.cs deleted file mode 100644 index 76e6819..0000000 --- a/Sharp.Augeas/VirtualHost/ApacheConfigExtensions.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Sharp.Augeas; - -public static class ApacheConfigExtensions -{ - -} \ No newline at end of file diff --git a/Sharp.Augeas/VirtualHost/Argument.cs b/Sharp.Augeas/VirtualHost/Argument.cs deleted file mode 100644 index 05af516..0000000 --- a/Sharp.Augeas/VirtualHost/Argument.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Sharp.Augeas; - -public class Argument : Node where T: Node -{ - public new T Parent; - - public string Value; - - public Argument(T parent, string value) - { - Parent = parent; - Children = null; - Value = value; - } - - public Argument() - { - - } -} \ No newline at end of file diff --git a/Sharp.Augeas/VirtualHost/Directive.cs b/Sharp.Augeas/VirtualHost/Directive.cs deleted file mode 100644 index c97f8e7..0000000 --- a/Sharp.Augeas/VirtualHost/Directive.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Sharp.Augeas; - -public class Directive : Node -{ - public string Value; - public List Arguments; -} \ No newline at end of file diff --git a/Sharp.Augeas/VirtualHost/Node.cs b/Sharp.Augeas/VirtualHost/Node.cs deleted file mode 100644 index 3babfe9..0000000 --- a/Sharp.Augeas/VirtualHost/Node.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace Sharp.Augeas; - -public class Node -{ - public Node Parent; - public List Children; - - - public Node() - { - Parent = null; - Children = new List(); - } - public Node(Node parent) - { - Parent = parent; - Children = new List(); - } - - public T[] GetChildren() - { - return Children - .OfType() - .ToArray(); - } - - public Node(Node parent, List children) - { - Parent = parent; - Children = children; - } - - public void AddChild(Node node) - { - Children.Add(node); - } - - public void RemoveChild(Node child) - { - if (Children.Contains(child)) - { - Children.Remove(child); - } - } - - public void RemoveAllChildren() - { - Children = new List(); - } -} \ No newline at end of file diff --git a/Sharp.Augeas/VirtualHost/Proxy.cs b/Sharp.Augeas/VirtualHost/Proxy.cs deleted file mode 100644 index 7d8f0aa..0000000 --- a/Sharp.Augeas/VirtualHost/Proxy.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Sharp.Augeas; - -public class Proxy : Node -{ - public new VirtualHost Parent; - public List> Directives; - public List> Arguments; -} \ No newline at end of file diff --git a/Sharp.Augeas/VirtualHost/VirtualHost.cs b/Sharp.Augeas/VirtualHost/VirtualHost.cs deleted file mode 100644 index 538cf63..0000000 --- a/Sharp.Augeas/VirtualHost/VirtualHost.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Sharp.Augeas -{ - public class VirtualHost : Node - { - public List> Directives; - public List> Arguments; - } -} - diff --git a/Sharp.Augeas/VirtualHostTreeGenerator.cs b/Sharp.Augeas/VirtualHostTreeGenerator.cs deleted file mode 100644 index 073129a..0000000 --- a/Sharp.Augeas/VirtualHostTreeGenerator.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace Sharp.Augeas; - -public static class VirtualHostTreeGenerator -{ - public static VirtualHost Generate(Dictionary dic) - { - var keys = dic.Keys; - var virtualHost = new VirtualHost(); - foreach (var key in keys) - { - - } - - return virtualHost; - } - - private static bool IsProxy(string key) - { - return key.Contains("f/VirtualHost/Proxy/"); - } - private static bool IsVirtualHostArg(string key) - { - return key.Contains("f/VirtualHost/arg;"); - } - private static bool IsProxyDirective(string key) - { - return key.Contains("f/VirtualHost/Proxy/directive"); - } - private static bool IsVirtualHostDirective(string key) - { - return key.Contains("f/VirtualHost/directive"); - } - private static bool IsDirectiveArg(string key) - { - return key.Contains("f/VirtualHost/directive"); - } - -} \ No newline at end of file