57 # |
57 # |
58 |
58 |
59 def error(x): |
59 def error(x): |
60 raise AssertionError(x) |
60 raise AssertionError(x) |
61 |
61 |
|
62 def check_field(cfg, field, descr, loc, default, check): |
|
63 if field in cfg: |
|
64 tmp=cfg[field] |
|
65 if not check(tmp): |
|
66 error("%s is of invalid type for %s" % (field, loc)) |
|
67 return tmp |
|
68 else: |
|
69 if default is not None: |
|
70 return default |
|
71 else: |
|
72 error("%s is not configured for %s" % (field, loc)) |
|
73 |
62 def check_bool(cfg, field, descr, loc, default=None): |
74 def check_bool(cfg, field, descr, loc, default=None): |
63 return check_field(cfg, field, descr, loc, default, |
75 return check_field(cfg, field, descr, loc, default, |
64 lambda x: isinstance(x, bool)) |
76 lambda x: isinstance(x, bool)) |
65 |
77 |
66 def check_string(cfg, field, descr, loc, default=None): |
78 def check_string(cfg, field, descr, loc, default=None): |
97 |
109 |
98 def check_nonneg_int(cfg, field, descr, loc, default=None): |
110 def check_nonneg_int(cfg, field, descr, loc, default=None): |
99 return check_field(cfg, field, descr, loc, default, |
111 return check_field(cfg, field, descr, loc, default, |
100 lambda x: isinstance(x, int) and x>=0) |
112 lambda x: isinstance(x, int) and x>=0) |
101 |
113 |
102 def check_field(cfg, field, descr, loc, default, check): |
|
103 if field in cfg: |
|
104 tmp=cfg[field] |
|
105 if not check(tmp): |
|
106 error("%s is of invalid type for %s" % (field, loc)) |
|
107 return tmp |
|
108 else: |
|
109 if default is not None: |
|
110 return default |
|
111 else: |
|
112 error("%s is not configured for %s" % (field, loc)) |
|
113 |
114 |
114 # |
115 # |
115 # Conversion of config into command line |
116 # Borg command line parameter configuration helper routines and classes |
116 # |
117 # |
117 |
118 |
118 def arglistify(args): |
119 class BorgParameters: |
119 flatten=lambda l: [item for sublist in l for item in sublist] |
120 def __init__(self, common, create, prune): |
120 if args is None: |
121 self.common=common or [] |
121 return [] |
122 self.create=create or [] |
122 else: |
123 self.prune=prune or [] |
123 return flatten([['--' + key, str(d[key])] for d in args for key in d]) |
124 |
|
125 def from_config(cfg, loc): |
|
126 common=check_list_of_dicts(cfg, 'common_parameters', |
|
127 'Borg parameters', loc, default=[]) |
|
128 |
|
129 create=check_list_of_dicts(cfg, 'create_parameters', |
|
130 'Create parameters', loc, default=[]) |
|
131 |
|
132 prune=check_list_of_dicts(cfg, 'prune_parameters', |
|
133 'Prune parameters', loc, default=[]) |
|
134 |
|
135 return BorgParameters(common, create, prune) |
|
136 |
|
137 def __add__(self, other): |
|
138 common=self.common+other.common |
|
139 create=self.create+other.create |
|
140 prune=self.prune+other.prune |
|
141 return BorgParameters(common, create, prune) |
124 |
142 |
125 # |
143 # |
126 # Load config on module load |
144 # Load config on module load |
127 # |
145 # |
128 |
146 |
151 # |
169 # |
152 |
170 |
153 def check_and_set(cfg, field, loc, defa, fn): |
171 def check_and_set(cfg, field, loc, defa, fn): |
154 cfg[field]=fn(cfg, field, field, loc, defa[field]) |
172 cfg[field]=fn(cfg, field, field, loc, defa[field]) |
155 |
173 |
156 def check_parameters(cmd): |
|
157 check_and_set(settings['borg'], cmd+'_parameters', |
|
158 'borg', defaults['borg'], |
|
159 check_list_of_dicts) |
|
160 |
|
161 check_and_set(settings, 'backup_interval', 'top-level', defaults, check_nonneg_int) |
174 check_and_set(settings, 'backup_interval', 'top-level', defaults, check_nonneg_int) |
162 check_and_set(settings, 'retry_interval', 'top-level', defaults, check_nonneg_int) |
175 check_and_set(settings, 'retry_interval', 'top-level', defaults, check_nonneg_int) |
163 check_and_set(settings, 'extract_passphrases_at_startup', 'top-level', defaults, check_nonneg_int) |
176 check_and_set(settings, 'extract_passphrases_at_startup', 'top-level', defaults, check_nonneg_int) |
164 check_and_set(settings, 'no_quit_menu_entry', 'top-level', defaults, check_bool) |
177 check_and_set(settings, 'no_quit_menu_entry', 'top-level', defaults, check_bool) |
165 check_and_set(settings, 'borg', 'top-level', defaults, check_dict) |
178 check_and_set(settings, 'borg', 'top-level', defaults, check_dict) |
166 # Check parameters within 'borg' |
179 # Check parameters within 'borg' |
167 if True: |
180 if True: |
168 check_and_set(settings['borg'], 'executable', 'borg', |
181 check_and_set(settings['borg'], 'executable', 'borg', |
169 defaults['borg'], check_string) |
182 defaults['borg'], check_string) |
170 |
183 |
171 check_parameters('common') |
184 borg_parameters=BorgParameters.from_config(settings['borg'], "top-level") |
172 check_parameters('create') |
|
173 check_parameters('prune') |
|
174 |
185 |
175 |
|