[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