annotate silvermirror/config.py @ 20:5c5edfb827b7

more the things
author Jeff Hammel <k0scist@gmail.com>
date Thu, 16 Jan 2014 04:29:39 -0800
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
1 #!/usr/bin/env python
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
2
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
3 import optparse
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
4 import os
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
5 import sys
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
6
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
7 from .utils import home
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
8 from martini.config import ConfigMunger
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
9
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
10 class SilvermirrorConfiguration(object):
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
11 """
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
12 SilverMirror configuration class
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
13
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
14 The current form is an .ini file
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
15 [TODO: use `install_requires='configuration'`]:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
16
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
17 [::SilverMirror::]
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
18 ...
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
19 """
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
21 main_section = '::SilverMirror::'
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
22
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
23 def __init__(self, filename=None):
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
24 if filename is not None:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
25 self.read_config(filename)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
26 def read_config(self, filename):
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
27
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
28 # read file
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
29 config = ConfigMunger(filename).dict()
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
30
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
31 # main configuration
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
32 main = config.pop(, {})
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
33 main.setdefault('basedir', home())
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
34 main['ignore'] = main.get('ignore', '').split() # patterns to ignore -
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
35 main['hosts'] = main.get('hosts', '').split()
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
36 main['timeout'] = float(main.get('timeout', '10.'))
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
37
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
38 # password prompt
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
39 truth = dict([(str(i).lower(), i) for i in (True, False)])
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
40 password = main.get('password', 'true')
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
41 try:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
42 main['password'] = truth[password.lower()]
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
43 except KeyError:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
44 raise KeyError("password must be True or False (You gave: '%s')" % password)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
45
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
46 # resources
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
47 for resource in config:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
48
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
49 # directory of resource
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
50 directory = config[resource].get('directory', resource)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
51 if os.path.isabs(directory):
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
52 raise NotImplementedError("absolute directories will not work for now so....don't do this!")
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
53
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
54 else:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
55 directory = os.path.join(main['basedir'], directory)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
56 config[resource]['directory'] = directory.rstrip(os.path.sep)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
57
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
58 # per-resource files to ignore
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
59 # XXX regexps for now (see `man unison`)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
60 # - this is bad as whitespace patterns cannot be ignored
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
61 config[resource]['ignore'] = main['ignore'][:] + config[resource].get('ignore', '').split()
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
62
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
63 # set + return ditionary of config
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
64 self.main = main
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
65 self.resources = config
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
66 config = (main, config)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
67
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
68 def main(args=sys.argv[1:]):
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
69
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
70 usage = '%prog [options]'
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
71 parser = optparse.OptionParser(usage=usage, description=__doc__)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
72 options, args = parser.parse_args(args)
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
73
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
74 if __name__ == '__main__':
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
75 main()