Mercurial > hg > silvermirror
annotate silvermirror/unify.py @ 35:e86d475435ee
use argparse and try to diagnose strange error
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Sun, 04 May 2014 23:14:15 -0700 |
parents | 4f1e45a8656c |
children | d081ca2e8696 |
rev | line source |
---|---|
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
2 |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
3 """ |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
4 unify virtual filesystems |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
5 """ |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
6 |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
7 import argparse |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
8 import getpass |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
9 import os |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
10 import socket |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
11 import subprocess |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
12 import sys |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
13 from martini.config import ConfigMunger |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
14 from pkg_resources import iter_entry_points |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
15 from pprint import pprint |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
16 from utils import home |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
17 from utils import ip_addresses |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
18 |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
19 def make_config(filename): |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
20 # XXX needed? |
23 | 21 raise NotImplementedError('Need to specify a config file, like\n~/.silvermirror') |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
22 |
20 | 23 |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
24 def read_config(filename): |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
25 config = ConfigMunger(filename).dict() |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
26 |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
27 ### main configuration |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
28 main = config.pop('::SilverMirror::', {}) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
29 if not main.get('basedir'): |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
30 main['basedir'] = home() |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
31 main['ignore'] = main.get('ignore', '').split() # patterns to ignore - not used |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
32 main['hosts'] = main.get('hosts', '').split() |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
33 main['timeout'] = float(main.get('timeout', '10.')) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
34 |
15 | 35 # password prompt |
36 truth = dict([(str(i).lower(), i) for i in (True, False)]) | |
37 password = main.get('password', 'true') | |
38 try: | |
39 main['password'] = truth[password.lower()] | |
40 except KeyError: | |
41 raise KeyError("password must be True or False (You gave: '%s')" % password) | |
42 | |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
43 ### resources |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
44 for resource in config: |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
45 |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
46 # directory of resource |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
47 directory = config[resource].get('directory', resource) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
48 if not os.path.isabs(directory): |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
49 # XXX note: absolute directories will not work for now |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
50 # XXX so....don't do this! |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
51 directory = os.path.join(main['basedir'], directory) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
52 config[resource]['directory'] = directory.rstrip(os.path.sep) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
53 |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
54 # per-resource files to ignore |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
55 # XXX regexps for now (see `man unison`) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
56 # - this is bad as whitespace patterns cannot be ignored |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
57 ignore = main['ignore'][:] |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
58 if config[resource].has_key('ignore'): |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
59 ignore += config[resource]['ignore'].split() |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
60 config[resource]['ignore'] = ignore |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
61 |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
62 ### |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
63 config = { 'main': main, 'resources': config } |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
64 return config |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
65 |
20 | 66 def unify(conf, _resources, test=False, verbose=True, notification_prefix='\n*** SilverMirror; '): |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
67 """unify virtual filesystems given configuration""" |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
68 |
20 | 69 # TODO: -> OO |
70 | |
71 # log function | |
72 def log(message): | |
73 if verbose: | |
74 print ("%s%s" % (notification_prefix, message)) | |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
75 |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
76 # passwords |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
77 pw = {} |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
78 |
20 | 79 # determine hosts to sync with |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
80 hosts = conf['hosts'] |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
81 addresses = ip_addresses().values() |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
82 hosts = hosts.difference(addresses) # don't sync with self |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
83 _hosts = [] |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
84 for host in hosts: |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
85 s = socket.socket() |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
86 s.settimeout(conf['main']['timeout']) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
87 if test: |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
88 print ('Resolving %s' % host) |
15 | 89 try: |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
90 s.connect((host, 22)) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
91 s.close() |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
92 except (socket.gaierror, socket.timeout, socket.error): |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
93 continue |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
94 _hosts.append(host) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
95 hosts = _hosts |
20 | 96 log("Hosts:\n%s" % '\n'.join(hosts)) |
97 if not hosts: | |
98 raise AssertionError("No hosts specified") | |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
99 |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
100 if conf['main']['password']: |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
101 for host in hosts: |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
102 pw[host] = getpass.getpass('Enter password for %s: ' % host) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
103 # TODO: ensure that the hosts are resolvable |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
104 # XXX: hosts should actually be manageable on a per-resource basis |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
105 |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
106 ### determine resources to sync |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
107 cwd = os.path.realpath(os.getcwd()) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
108 resources = conf['resources'] |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
109 if 'all' not in _resources: |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
110 if _resources: |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
111 resources = dict([(key, value) for key, value in resources.items() |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
112 if key in _resources]) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
113 else: |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
114 for key, value in resources.items(): |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
115 directory = os.path.realpath(value['directory']) + os.sep |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
116 if (cwd + os.sep).startswith(directory): |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
117 resources = { key: value } |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
118 break |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
119 if test: |
21 | 120 log("Resources:\n") |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
121 pprint(resources) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
122 |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
123 # choose reflector backend |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
124 reflectors = dict([(i.name, i.load()) for i in iter_entry_points('silvermirror.reflectors')]) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
125 reflector = reflectors['unison']() # only one right now |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
126 |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
127 # sync with hosts |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
128 try: |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
129 os.chdir(conf['main']['basedir']) |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
130 for index, resource in enumerate(resources): |
20 | 131 |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
132 # echo resource |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
133 log("syncing:'%s' [%d/%d]" % (resource, index+1, len(resources))) |
20 | 134 |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
135 # loop over hosts |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
136 for host in hosts: |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
137 reflector.sync(host, resource, resources[resource]['ignore'], pw.get('host'), test) |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
138 finally: |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
139 os.chdir(cwd) |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
140 |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
141 def main(args=sys.argv[1:]): |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
142 """CLI""" |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
143 |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
144 # parse command line |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
145 parser = argparse.ArgumentParser(description=__doc__) |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
146 parser.add_argument('-c', '--config') |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
147 parser.add_argument('-H', '--host', dest='hosts', action='append', |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
148 help="hosts to sync with") |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
149 parser.add_argument('--no-password', dest='password', |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
150 action='store_false', default=True) |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
151 parser.add_argument('--test', dest='test', |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
152 action='store_true', default=False) |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
153 parser.add_argument('-v', '--verbose', |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
154 action='store_true', default=False) |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
155 parser.add_argument('resources', nargs='*', |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
156 help="resources to sync, or all if omitted") |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
157 options = parser.parse_args(args) |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
158 |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
159 |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
160 # configuration |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
161 user_conf = os.path.join(home(), '.silvermirror') |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
162 if options.config: |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
163 if not os.path.exists(options.config): |
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
164 parser.error("Configuration file '" + options.config + "' does not exist") |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
165 conf = read_config(options.config) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
166 else: |
35
e86d475435ee
use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents:
23
diff
changeset
|
167 for i in (user_conf, '/etc/silvermirror'): |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
168 if os.path.exists(i): |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
169 conf = read_config(i) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
170 break |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
171 else: |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
172 conf = make_config(user_conf) |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
173 |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
174 # fix up configuration from command line options |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
175 conf['hosts'] = set(options.hosts or conf['main']['hosts']) |
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
176 conf['main']['password'] = options.password and conf['main']['password'] |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
177 |
20 | 178 # mirror all the things |
1
9b139702a8f9
use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents:
0
diff
changeset
|
179 unify(conf, args, options.test) |
0
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
180 |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
181 if __name__ == '__main__': |
abb358e2434c
initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff
changeset
|
182 unify() |