summaryrefslogtreecommitdiff
path: root/reconfigure/items/squid.py
diff options
context:
space:
mode:
Diffstat (limited to 'reconfigure/items/squid.py')
-rw-r--r--reconfigure/items/squid.py95
1 files changed, 95 insertions, 0 deletions
diff --git a/reconfigure/items/squid.py b/reconfigure/items/squid.py
new file mode 100644
index 0000000..2504b55
--- /dev/null
+++ b/reconfigure/items/squid.py
@@ -0,0 +1,95 @@
+from reconfigure.nodes import Node, PropertyNode
+from reconfigure.items.bound import BoundData
+
+
+class SquidData (BoundData):
+ pass
+
+
+class ACLData (BoundData):
+ def template(self, name, *args):
+ children = [PropertyNode('1', name)]
+ index = 2
+ for arg in args:
+ children += [PropertyNode(str(index), arg)]
+ index += 1
+ return Node(
+ 'line',
+ PropertyNode('name', 'acl'),
+ Node(
+ 'arguments',
+ *children
+ )
+ )
+
+ def describe(self):
+ return ' '.join(x.value for x in self.options)
+
+
+class HTTPAccessData (BoundData):
+ def template(self):
+ return Node(
+ 'line',
+ PropertyNode('name', 'http_access'),
+ Node('arguments', PropertyNode('1', ''))
+ )
+
+
+class HTTPPortData (BoundData):
+ def template(self):
+ return Node(
+ 'line',
+ PropertyNode('name', 'http_port'),
+ Node('arguments', PropertyNode('1', '3128'))
+ )
+
+
+class HTTPSPortData (BoundData):
+ def template(self):
+ return Node(
+ 'line',
+ PropertyNode('name', 'https_port'),
+ Node('arguments', PropertyNode('1', '3128'))
+ )
+
+
+class ArgumentData (BoundData):
+ def template(self, *args):
+ return PropertyNode(*args)
+
+
+def __bind_by_name(cls, prop, name, itemcls):
+ cls.bind_collection(
+ prop,
+ selector=lambda x: x.get('name').value == name,
+ item_class=itemcls
+ )
+
+__bind_by_name(SquidData, 'acl', 'acl', ACLData)
+__bind_by_name(SquidData, 'http_access', 'http_access', HTTPAccessData)
+__bind_by_name(SquidData, 'http_port', 'http_port', HTTPPortData)
+__bind_by_name(SquidData, 'https_port', 'https_port', HTTPSPortData)
+
+
+def __bind_first_arg(cls, prop):
+ cls.bind_attribute('value', prop, path=lambda x: x.get('arguments').children[0])
+
+
+def __bind_other_args(cls, prop, itemcls):
+ cls.bind_collection(
+ prop, path=lambda x: x.get('arguments'),
+ selector=lambda x: x.parent.children.index(x) > 0, item_class=itemcls
+ )
+
+__bind_first_arg(ACLData, 'name')
+__bind_other_args(ACLData, 'options', ArgumentData)
+
+__bind_first_arg(HTTPAccessData, 'mode')
+__bind_other_args(HTTPAccessData, 'options', ArgumentData)
+
+__bind_first_arg(HTTPPortData, 'port')
+__bind_other_args(HTTPPortData, 'options', ArgumentData)
+__bind_first_arg(HTTPSPortData, 'port')
+__bind_other_args(HTTPSPortData, 'options', ArgumentData)
+
+ArgumentData.bind_attribute('value', 'value')