ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/FreeBSDAdmin/Gateway/dhclient-exit-hooks.py
Revision: 1411
Committed: 2011-02-05T23:14:56-08:00 (14 years, 4 months ago) by douglas
Content type: text/x-python
File size: 2754 byte(s)
Log Message:
dhclient-exit-hooks installation!

File Contents

# User Rev Content
1 douglas 1411 #!/usr/bin/env python
2     # DHCP Client Exit Hooks Installer
3     #
4     # Douglas Thrift
5     #
6     # $Id$
7    
8     import optparse
9     import os
10     import re
11     import sys
12     import tempfile
13    
14     HOOKS = 'dhclient-exit-hooks'
15     VARIABLES = {
16     'tunnelbroker': {
17     'pass': None,
18     'user_id': None,
19     'tunnel_id': None,
20     },
21     'dns': {
22     'key': None,
23     'secret': None,
24     },
25     }
26    
27     def parse(hooks, callback):
28     functions = re.compile(r'^(%s)\(\)$' % '|'.join(VARIABLES.iterkeys()))
29     function = None
30    
31     with open(hooks, 'rb') as hooks:
32     for line in hooks:
33     if line == '}\n':
34     function = None
35     else:
36     match = functions.match(line)
37    
38     if match is not None:
39     function = match.group(1)
40    
41     callback(line, function, VARIABLES.get(function))
42    
43     if __name__ == '__main__':
44     import readline
45    
46     parser = optparse.OptionParser(usage = '%prog [options] [DIRECTORY]')
47    
48     def variables(option, opt, value, parser, *args, **kwargs):
49     variables = VARIABLES.get(value[0])
50    
51     if variables is None:
52     raise optparse.OptionValueError, '%s unknown function "%s"' % (opt, value[0])
53    
54     if value[1] not in variables:
55     raise optparse.OptionValueError, '%s unknown variable "%s"' % (opt, value[1])
56    
57     parser.values.ensure_value(option.dest, set()).add(value)
58    
59     parser.add_option('-f', '--force', action = 'callback', type = 'string', dest = 'force', default = set(), nargs = 2, callback = variables, metavar = 'FUNCTION VARIABLE')
60    
61     options, args = parser.parse_args()
62    
63     if len(args) != 1:
64     parser.error('no directory specified')
65    
66     os.umask(077)
67    
68     hooks = os.path.join(args[0], HOOKS)
69    
70     if os.path.exists(hooks):
71     def read(line, function, variables):
72     if function is not None:
73     match = re.match(r"^\tlocal (%s)='(.*)'$" % '|'.join(variables.iterkeys()), line)
74    
75     if match is not None:
76     variable, value = match.group(1, 2)
77    
78     if (function, variable) not in options.force:
79     variables[variable] = value
80    
81     parse(hooks, read)
82    
83     with tempfile.NamedTemporaryFile('wb', prefix = HOOKS + '.', dir = args[0]) as temp:
84     def write(line, function, variables):
85     if function is not None:
86     match = re.match(r'''^\t(?:read -p '{0} ({1}): ' -r \1|local ({1})=`python -c "(import .+); print (.*'{0} \2: '.*)"`)$'''.format(function, '|'.join(variables.iterkeys())), line)
87    
88     if match is not None:
89     variable = match.group(1)
90    
91     if variable is None:
92     variable, imports, python = match.group(2, 3, 4)
93     else:
94     imports, python = None, None
95    
96     value = variables[variable]
97    
98     if value is None:
99     if python is not None:
100     exec imports
101    
102     value = eval(python)
103     else:
104     value = raw_input('%s %s: ' % (function, variable))
105    
106     line = "\tlocal %s='%s'\n" % (variable, value)
107    
108     temp.write(line)
109    
110     parse(HOOKS, write)
111    
112     temp.delete = False
113    
114     os.rename(temp.name, hooks)

Properties

Name Value
svn:executable *
svn:keywords Id