Mercurial > hg > gcmultimerge
annotate multimerge.py @ 6:ee6bf617f839
Implement configuration file reading.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Mon, 04 Jul 2016 12:53:11 +0300 |
parents | 9d4152f32223 |
children | f2ecfb3e04ee |
rev | line source |
---|---|
1 | 1 #!/usr/bin/python |
3 | 2 # coding=utf-8 |
2 | 3 ### |
4 ### Google Calendar MultiMerge v0.000001 | |
5 ### (C) 2016 Matti 'ccr' Hamalainen <ccr@tnsp.org> | |
6 ### | |
7 ### Python 2.7 <= x < 3 required! Please refer to | |
8 ### README.txt for information on other depencies. | |
9 ### | |
1 | 10 import os |
11 import sys | |
12 import signal | |
13 import re | |
14 import time | |
15 import datetime | |
16 import httplib2 | |
17 import ConfigParser | |
18 import oauth2client | |
19 from oauth2client import client | |
20 from oauth2client import tools | |
4 | 21 from oauth2client import file |
1 | 22 from googleapiclient import discovery |
23 | |
24 | |
25 ### | |
26 ### Misc. helper functions | |
27 ### | |
28 | |
29 ## Wrapper for print() that does not break when redirecting stdin/out | |
30 ## because of piped output not having a defined encoding. We default | |
31 ## to UTF-8 encoding in output here. | |
32 def gcm_print(smsg): | |
33 gcm_msgbuf.append(smsg.encode("UTF-8")) | |
34 if sys.stdout.encoding != None: | |
35 print(smsg.encode(sys.stdout.encoding)) | |
36 else: | |
37 print(smsg.encode("UTF-8")) | |
38 | |
39 | |
40 ## Fatal errors | |
41 def gcm_fatal(smsg): | |
42 gcm_print(u"ERROR: "+ smsg) | |
43 sys.exit(1) | |
44 | |
45 | |
46 ## Debug messages | |
47 def gcm_debug(smsg): | |
48 if cfg.debug: | |
49 gcm_print(u"DBG: "+ smsg) | |
50 else: | |
51 gcm_msgbuf.append(u"DBG: "+ smsg.encode("UTF-8")) | |
52 | |
53 | |
54 ## Handle SIGINT signals here | |
55 def gcm_signal_handler(signal, frame): | |
56 gcm_print("\nQuitting due to SIGINT / Ctrl+C!") | |
57 sys.exit(0) | |
58 | |
59 | |
60 def gcm_get_credentials(mcfg): | |
61 store = oauth2client.file.Storage(mcfg.credential_file) | |
62 credentials = store.get() | |
63 if not credentials or credentials.invalid: | |
64 flow = client.flow_from_clientsecrets(mcfg.secret_file, mcfg.scope) | |
65 flow.user_agent = mcfg.app_name | |
66 credentials = tools.run_flow(flow, store, mcfg) | |
67 if not credentials or credentials.invalid: | |
68 gcm_fatal("Failed to authenticate / invalid credentials.") | |
69 return credentials | |
70 | |
71 | |
72 def gcm_dump_events(events): | |
73 for event in events: | |
74 ev_start = event["start"].get("dateTime", event["start"].get("date")) | |
75 ev_end = event["end"].get("dateTime", event["end"].get("date")) | |
76 gcm_print(u"{0:25} - {1:25} : {2}".format(ev_start, ev_end, event["summary"])) | |
77 | |
78 | |
5
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
79 def gcm_is_str(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
80 return isinstance(mstr, basestring) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
81 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
82 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
83 def gcm_is_string(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
84 return mstr == None or gcm_is_str(mstr) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
85 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
86 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
87 def gcm_is_log_level(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
88 if not gcm_is_str(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
89 return False |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
90 else: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
91 return mstr.upper() in ["CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"] |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
92 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
93 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
94 def gcm_trans_log_level(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
95 return mstr.upper() |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
96 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
97 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
98 def gcm_is_filename(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
99 if not gcm_is_str(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
100 return False |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
101 else: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
102 return re.match("^[a-z0-9][a-z0-9\.\_\-]+$", mstr, flags=re.IGNORECASE) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
103 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
104 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
105 def gcm_trans_bool(mbool): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
106 if gcm_is_str(mbool): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
107 if re.match("^\s*(true|1|on|yes)\s*$", mbool, re.IGNORECASE): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
108 mbool = True |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
109 elif re.match("^\s*(false|0|off|no)\s*$", mbool, re.IGNORECASE): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
110 mbool = False |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
111 else: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
112 return None |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
113 return mbool |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
114 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
115 def gcm_is_bool(mbool): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
116 mval = gcm_trans_bool(mbool) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
117 if not isinstance(mval, bool): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
118 gcm_fatal("gcm_is_bool(): Invalid boolean value '{0}', should be true|false|1|0|on|off|yes|no.".format(mbool)) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
119 else: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
120 return True |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
121 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
122 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
123 def gcm_trans_list(mlist): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
124 morig = mlist |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
125 if gcm_is_str(mlist): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
126 mlist = re.split("\s*,\s*", mlist, flags=re.IGNORECASE) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
127 if not isinstance(mlist, list): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
128 gcm_fatal("gcm_trans_list(): Could not parse list '{0}'.".format(mlist)) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
129 elif not isinstance(mlist, list): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
130 gcm_fatal("gcm_trans_list(): Invalid value '{0}'.".format(mlist)) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
131 return mlist |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
132 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
133 def gcm_is_list(mlist): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
134 return gcm_trans_list(mlist) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
135 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
136 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
137 def gcm_is_email(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
138 if not gcm_is_string(mstr): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
139 return False |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
140 else: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
141 return re.match("^.*?\s+<[a-z0-9]+[a-z0-9\.\+\-]*\@[a-z0-9]+[a-z0-9\.\-]+>\s*$|[a-z0-9]+[a-z0-9\.\+\-]*\@[a-z0-9]+[a-z0-9\.\-]+", mstr, flags=re.IGNORECASE) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
142 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
143 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
144 def gcm_trans_email_list(mlist): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
145 if mlist == None: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
146 return mlist |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
147 else: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
148 return gcm_trans_list(mlist.strip()) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
149 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
150 def gcm_is_email_list(mlist): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
151 mlist = gcm_trans_email_list(mlist) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
152 if mlist != None: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
153 for email in mlist: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
154 if not gcm_is_email(email): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
155 gcm_fatal("Invalid e-mail address '{0}' in list {1}.".format(email, ", ".join(mlist))) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
156 return True |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
157 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
158 |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
159 |
1 | 160 class GCMSettings(dict): |
161 def __init__(self): | |
162 self.m_data = {} | |
163 self.m_saveable = {} | |
5
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
164 self.m_validate = {} |
1 | 165 self.m_translate = {} |
166 | |
167 def __getattr__(self, name): | |
168 if name in self.m_data: | |
169 return self.m_data[name] | |
170 else: | |
171 gcm_fatal("GCMSettings.__getattr__(): No such attribute '"+ name +"'.") | |
172 | |
5
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
173 def mvalidate(self, name, value): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
174 if name in self.m_validate and self.m_validate[name]: |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
175 if not self.m_validate[name](value): |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
176 gcm_fatal("GCMSettings.mvalidate(): Invalid value for attribute '{0}': {1}".format(name, value)) |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
177 |
1 | 178 def mtranslate(self, name, value): |
179 if name in self.m_translate and self.m_translate[name]: | |
180 return self.m_translate[name](value) | |
181 else: | |
182 return value | |
183 | |
184 def mdef(self, name, saveable, validate, translate, value): | |
5
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
185 self.mvalidate(name, value) |
1 | 186 self.m_saveable[name] = saveable |
5
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
187 self.m_validate[name] = validate |
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
188 self.m_translate[name] = translate |
1 | 189 self.m_data[name] = self.mtranslate(name, value) |
190 | |
191 def mset(self, name, value): | |
5
9d4152f32223
Add some code for settings validation.
Matti Hamalainen <ccr@tnsp.org>
parents:
4
diff
changeset
|
192 self.mvalidate(name, value) |
1 | 193 if name in self.m_data: |
194 self.m_data[name] = self.mtranslate(name, value) | |
195 else: | |
196 gcm_fatal("GCMSettings.mset(): No such attribute '"+ name +"'.") | |
197 | |
198 def mget(self, name): | |
199 if name in self.m_data: | |
200 return self.m_data[name] | |
201 else: | |
202 return None | |
203 | |
6
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
204 def mread(self, cfgparser, sect): |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
205 for name in self.m_saveable: |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
206 if cfgparser.has_option(sect, name): |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
207 value = cfgparser.get(sect, name) |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
208 self.mset(name, value) |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
209 gcm_debug("{0} -> '{1}' == {2}".format(name, value, self.mget(name))) |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
210 |
1 | 211 |
212 ### | |
213 ### Main program starts | |
214 ### | |
215 gcm_msgbuf = [] | |
216 signal.signal(signal.SIGINT, gcm_signal_handler) | |
217 | |
218 | |
219 ## Settings | |
220 cfg = GCMSettings() | |
221 | |
222 cfg.mdef("debug", True, gcm_is_bool, gcm_trans_bool, False) | |
223 | |
224 cfg.mdef("source_regex", True, gcm_is_string, None, "^R:\s*(.*?)\s*\(\s*(.+?)\s*\)\s*$") | |
225 cfg.mdef("source_regmap", False, gcm_is_list, gcm_trans_list, [1, 2]) | |
226 cfg.mdef("source_regmap_len", False, None, None, len(cfg.source_regmap)) | |
227 | |
228 cfg.mdef("dest_name", True, gcm_is_string, None, u"Raahen kansainvälisyystoiminta") | |
229 cfg.mdef("dest_id", True, gcm_is_string, None, None) | |
230 | |
231 cfg.mdef("noauth_local_webserver", False, None, None, True) | |
232 #cfg.mdef("auth_host_name", False, None, None, "localhost") | |
233 #cfg.mdef("auth_host_port", False, None, None, [8080, 8090]) | |
234 cfg.mdef("logging_level", True, gcm_is_log_level, gcm_trans_log_level, "ERROR") | |
235 | |
236 # No need to touch these | |
237 cfg.mdef("app_name", False, None, None, "Google Calendar MultiMerge") | |
238 cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar") | |
239 #cfg.mdef("scope", False, None, None, "https://www.googleapis.com/auth/calendar.readonly") | |
240 cfg.mdef("secret_file", True, gcm_is_filename, None, "client_secret.json") | |
241 cfg.mdef("credential_file", True, gcm_is_filename, None, "client_credentials.json") | |
242 | |
6
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
243 |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
244 ## Read, parse and validate configuration file |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
245 if len(sys.argv) > 1: |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
246 gcm_debug("Reading configuration from '{0}'.".format(sys.argv[1])) |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
247 try: |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
248 cfgparser = ConfigParser.RawConfigParser() |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
249 cfgparser.read(sys.argv[1]) |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
250 except Exception as e: |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
251 gcm_fatal("Failed to read configuration file '{0}': {1}".format(sys.argv[1], str(e))) |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
252 |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
253 # Parse the settings and validate |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
254 cfg.mread(cfgparser, section) |
ee6bf617f839
Implement configuration file reading.
Matti Hamalainen <ccr@tnsp.org>
parents:
5
diff
changeset
|
255 |
1 | 256 ## Initialize and authorize API connection |
257 credentials = gcm_get_credentials(cfg) | |
258 http = credentials.authorize(httplib2.Http()) | |
259 service = discovery.build("calendar", "v3", http=http) | |
260 | |
261 | |
262 ## Fetch complete calendar list | |
263 gcm_debug("Fetching available calendars ..") | |
264 calendars = [] | |
265 calPageToken = None | |
266 while True: | |
267 # We want everything except deleted and hidden calendars | |
268 calResult = service.calendarList().list( | |
269 showHidden=False, | |
270 showDeleted=False, | |
271 pageToken=calPageToken | |
272 ).execute() | |
273 | |
274 calendars.extend(calResult.get("items", [])) | |
275 calPageToken = calResult.get("nextPageToken") | |
276 if not calPageToken: | |
277 break | |
278 | |
279 if len(calendars) == 0: | |
280 gcm_fatal("No calendars found?") | |
281 | |
282 |