fwtool: allow multiple nodes per rule
authorClinton Ebadi <clinton@unknownlamer.org>
Thu, 19 Apr 2018 05:23:58 +0000 (01:23 -0400)
committerClinton Ebadi <clinton@unknownlamer.org>
Thu, 19 Apr 2018 05:23:58 +0000 (01:23 -0400)
src/plugins/firewall.sml

index 92b1942..e6f92b2 100644 (file)
@@ -43,19 +43,25 @@ fun parseRules () =
        fun parsePorts ports =
            List.mapPartial Int.fromString (String.fields (fn ch => ch = #",") ports)
            (* Just drop bad ports for now *)
-                      
+
+       fun parseNodes nodes = String.fields (fn ch => ch = #",") nodes
+
        fun loop parsedRules =
            case TextIO.inputLine inf of
                NONE => parsedRules
              | SOME line =>
                case String.tokens Char.isSpace line of
-                   node :: uname :: rest =>
-                   (case rest of
-                       "Client" :: ports :: hosts => loop ((User uname, FirewallNode node, Client (parsePorts ports, hosts)) :: parsedRules)
-                     | "Server" :: ports :: hosts => loop ((User uname, FirewallNode node, Server (parsePorts ports, hosts)) :: parsedRules)
-                     | ["ProxiedServer", ports] => loop ((User uname, FirewallNode node, ProxiedServer (parsePorts ports)) :: parsedRules)
-                     | ["LocalServer", ports] => loop ((User uname, FirewallNode node, LocalServer (parsePorts ports)) :: parsedRules)
-                     | _ => (print "Invalid config line\n"; loop parsedRules))
+                   nodes :: uname :: rest =>
+                   let
+                       val nodes = parseNodes nodes
+                   in
+                       case rest of
+                           "Client" :: ports :: hosts => loop (map (fn node => (User uname, FirewallNode node, Client (parsePorts ports, hosts))) nodes) @ parsedRules
+                         | "Server" :: ports :: hosts => loop (map (fn node => (User uname, FirewallNode node, Server (parsePorts ports, hosts))) nodes) @ parsedRules
+                         | ["ProxiedServer", ports]   => loop (map (fn node => (User uname, FirewallNode node, ProxiedServer (parsePorts ports))) nodes) @ parsedRules
+                         | ["LocalServer", ports]     => loop (map (fn node => (User uname, FirewallNode node, LocalServer (parsePorts ports))) nodes)   @ parsedRules
+                         | _ => (print "Invalid config line\n"; loop parsedRules)
+                   end
                  | _ => loop parsedRules
     in
        loop []