annotate silvermirror/unify.py @ 40:d081ca2e8696

py35
author Jeff Hammel <k0scist@gmail.com>
date Mon, 20 Feb 2017 15:02:50 -0800
parents e86d475435ee
children 7d28efc8dfa1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
40
Jeff Hammel <k0scist@gmail.com>
parents: 35
diff changeset
16 from .utils import home
Jeff Hammel <k0scist@gmail.com>
parents: 35
diff changeset
17 from .utils import ip_addresses
Jeff Hammel <k0scist@gmail.com>
parents: 35
diff changeset
18
0
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
19
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
20 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
21 # XXX needed?
23
4f1e45a8656c correct
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
22 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
23
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
24
0
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
25 def read_config(filename):
40
Jeff Hammel <k0scist@gmail.com>
parents: 35
diff changeset
26 """read configuration `filename`"""
Jeff Hammel <k0scist@gmail.com>
parents: 35
diff changeset
27
0
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
28 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
29
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
30 ### main configuration
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
31 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
32 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
33 main['basedir'] = home()
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
34 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
35 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
36 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
37
15
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
38 # password prompt
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
39 truth = dict([(str(i).lower(), i) for i in (True, False)])
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
40 password = main.get('password', 'true')
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
41 try:
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
42 main['password'] = truth[password.lower()]
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
43 except KeyError:
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
44 raise KeyError("password must be True or False (You gave: '%s')" % password)
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
45
0
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
46 ### resources
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
47 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
48
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
49 # directory of resource
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
50 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
51 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
52 # 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
53 # 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
54 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
55 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
56
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
57 # 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
58 # 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
59 # - 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
60 ignore = main['ignore'][:]
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
61 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
62 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
63 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
64
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
65 ###
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
66 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
67 return config
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
68
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
69 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
70 """unify virtual filesystems given configuration"""
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
71
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
72 # TODO: -> OO
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
73
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
74 # log function
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
75 def log(message):
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
76 if verbose:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
77 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
78
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
79 # passwords
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
80 pw = {}
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
81
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
82 # 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
83 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
84 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
85 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
86 _hosts = []
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
87 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
88 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
89 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
90 if test:
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
91 print ('Resolving %s' % host)
15
743c920bc041 fix password prompt
Jeff Hammel <jhammel@mozilla.com>
parents: 1
diff changeset
92 try:
1
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
93 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
94 s.close()
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
95 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
96 continue
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
97 _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
98 hosts = _hosts
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
99 log("Hosts:\n%s" % '\n'.join(hosts))
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
100 if not hosts:
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
101 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
102
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
103 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
104 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
105 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
106 # 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
107 # 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
108
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
109 ### 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
110 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
111 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
112 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
113 if _resources:
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
114 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
115 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
116 else:
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
117 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
118 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
119 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
120 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
121 break
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
122 if test:
21
Jeff Hammel <k0scist@gmail.com>
parents: 20
diff changeset
123 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
124 pprint(resources)
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
125
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
126 # 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
127 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
128 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
129
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
130 # sync with hosts
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
131 try:
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
132 os.chdir(conf['main']['basedir'])
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
133 for index, resource in enumerate(resources):
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
134
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
135 # echo resource
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
136 log("syncing:'%s' [%d/%d]" % (resource, index+1, len(resources)))
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
137
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
138 # loop over hosts
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
139 for host in hosts:
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
140 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
141 finally:
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
142 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
143
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
144 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
145 """CLI"""
1
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
146
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
147 # parse command line
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
148 parser = argparse.ArgumentParser(description=__doc__)
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
149 parser.add_argument('-c', '--config')
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
150 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
151 help="hosts to sync with")
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
152 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
153 action='store_false', default=True)
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
154 parser.add_argument('--test', dest='test',
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
155 action='store_true', default=False)
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
156 parser.add_argument('-v', '--verbose',
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
157 action='store_true', default=False)
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
158 parser.add_argument('resources', nargs='*',
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
159 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
160 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
161
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
162
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
163 # configuration
0
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
164 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
165 if options.config:
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
166 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
167 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
168 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
169 else:
35
e86d475435ee use argparse and try to diagnose strange error
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
170 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
171 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
172 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
173 break
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
174 else:
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
175 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
176
1
9b139702a8f9 use a real backend architecture with an inteface and vastly simplify unify.py
k0s <k0scist@gmail.com>
parents: 0
diff changeset
177 # 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
178 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
179 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
180
20
5c5edfb827b7 more the things
Jeff Hammel <k0scist@gmail.com>
parents: 15
diff changeset
181 # 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
182 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
183
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
184 if __name__ == '__main__':
abb358e2434c initial commit of silvermirror, from http://my-svn.assembla.com/svn/arbez/silvermirror
k0s <k0scist@gmail.com>
parents:
diff changeset
185 unify()