[augeas-devel] [PATCH] Add services.aug and associated test

Raphael Pinson raphink at gmail.com
Mon Feb 9 16:06:16 UTC 2009


From: Raphael Pinson <rpinson at lab64.echo-net.net>

---
 lenses/services.aug            |   87 ++++++++++++++++++++++++++++++++++++++++
 lenses/tests/test_services.aug |   35 ++++++++++++++++
 2 files changed, 122 insertions(+), 0 deletions(-)

diff --git a/lenses/services.aug b/lenses/services.aug
new file mode 100644
index 0000000..773e4d5
--- /dev/null
+++ b/lenses/services.aug
@@ -0,0 +1,87 @@
+(*
+Module: Services
+ Parses /etc/services
+
+Author: Raphael Pinson <raphink at gmail.com>
+
+About: Reference
+ This lens tries to keep as close as possible to `man services` where possible.
+
+The definitions from `man services` are put as commentaries for reference
+throughout the file. More information can be found in the manual.
+
+About: License
+  This file is licensed under the GPL.
+
+About: Lens Usage
+  Sample usage of this lens in augtool
+
+    * Get the name of the service running on port 22 with protocol tcp
+      > match "/files/etc/services/service-name[port = '22'][protocol = 'tcp']"
+    * Remove the tcp entry for "domain" service
+      > rm "/files/etc/services/service-name[. = 'domain'][protocol = 'tcp']"
+    * Add a tcp service named "myservice" on port 55234
+      > ins service-name after /files/etc/services/service-name[last()]
+      > set /files/etc/services/service-name[last()] "myservice"
+      > set "/files/etc/services/service-name[. = 'myservice']/port" "55234"
+      > set "/files/etc/services/service-name[. = 'myservice']/protocol" "tcp"
+
+About: Configuration files
+  This lens applies to /etc/services. See <filter>.
+*)
+
+module Services =
+  autoload xfm
+
+
+(************************************************************************
+ * Group:                 USEFUL PRIMITIVES
+ *************************************************************************)
+
+(* Group: Generic primitives *)
+
+(* Variable: eol *)
+let eol         = Util.eol
+let indent      = Util.indent
+let comment     = Util.comment
+let empty       = Util.empty
+let protocol_re = /[a-zA-Z]+/
+let word_re     = /[a-zA-Z0-9_-]+/
+let num_re      = /[0-9]+/
+
+(* Group: Separators *)
+let sep_spc = Util.del_ws_spc
+
+
+(************************************************************************
+ * Group:                 LENSES
+ *************************************************************************)
+
+(* View: port *)
+let port = [ label "port" . store num_re ]
+
+(* View: protocol *)
+let protocol = [ label "protocol" . store protocol_re ]
+
+(* View: alias *)
+let alias = [ label "alias" . store word_re ]
+
+(*
+ * View: record
+ *   A standard /etc/services record
+ *   TODO: make sure a space is added before a comment on new nodes
+ *)
+let record = [ label "service-name" . store word_re . sep_spc . port
+                 . del "/" "/" . protocol . ( sep_spc . alias )*
+                 . (comment|eol) ]
+
+(* View: lns *)
+let lns = ( empty | comment | record )*
+
+
+(* Variable: filter *)
+let filter = (incl "/etc/services")
+
+let xfm = transform lns filter
+
+
diff --git a/lenses/tests/test_services.aug b/lenses/tests/test_services.aug
new file mode 100644
index 0000000..5895bba
--- /dev/null
+++ b/lenses/tests/test_services.aug
@@ -0,0 +1,35 @@
+(* Tests for the Services module *)
+
+module Test_services =
+
+  let example = "# a comment
+
+tcpmux          1/tcp                           # TCP port service multiplexer
+echo            7/udp
+discard         9/tcp           sink null
+systat          11/tcp          users
+# another comment
+"
+
+  test Services.lns get example = 
+    { "#comment" = "a comment" }
+    { }
+    { "service-name" = "tcpmux"
+       { "port"     = "1" }
+       { "protocol" = "tcp" }
+       { "#comment" = "TCP port service multiplexer" } }
+    { "service-name" = "echo"
+       { "port"     = "7" }
+       { "protocol" = "udp" } }
+    { "service-name" = "discard"
+       { "port"     = "9" }
+       { "protocol" = "tcp" }
+       { "alias"    = "sink" }
+       { "alias"    = "null" } }
+    { "service-name" = "systat"
+       { "port"     = "11" }
+       { "protocol" = "tcp" }
+       { "alias"    = "users" } }
+    { "#comment" = "another comment" } 
+
+
-- 
1.4.4.4




More information about the augeas-devel mailing list