35 import xml.sax.handler
46 non_id_char = re.compile(
'[^_0-9a-zA-Z]')
48 def _name_mangle(name):
49 return non_id_char.sub(
'_', name)
61 def add_attr(data, name, value):
62 if name
in data.keys():
65 if not isinstance(children, list):
68 children.append(value)
72 class TreeBuilder(xml.sax.handler.ContentHandler):
76 self.current = self.root
79 def startElement(self, name, attrs):
80 self.stack.append((self.current, self.text_parts))
84 for k, v
in attrs.items():
85 add_attr(self.current, _name_mangle(k), v)
87 def endElement(self, name):
88 text =
''.join(self.text_parts).strip()
90 self.current[
'text'] = text
96 self.current, self.text_parts = self.stack.pop()
97 add_attr(self.current, _name_mangle(name), obj)
99 def characters(self, content):
100 self.text_parts.append(content)
102 builder = TreeBuilder()
103 if isinstance(src, basestring):
104 xml.sax.parseString(src, builder)
106 xml.sax.parse(src, builder)
116 ip.append(str((ip_int & 0xFF000000L) >> 24))
117 ip.append(str((ip_int & 0x00FF0000L) >> 16))
118 ip.append(str((ip_int & 0x0000FF00L) >> 8))
119 ip.append(str(ip_int & 0x000000FFL))
131 return long(bins[0]) << 24 | int(bins[1]) << 16 | int(bins[2]) << 8 | int(bins[3])
141 return '02:00:%02x:%02x:%02x:%02x' % tuple([int(x)
for x
in ip.split(
'.')])
157 def password_gen(length, chars=['letters', 'digits', 'special'], extra_chars=None):
159 if 'letters' in chars:
160 pool += string.ascii_letters
161 if 'digits' in chars:
162 pool += string.digits
163 if 'special' in chars:
164 pool += string.punctuation
169 pool = [x
for x
in pool
if x
not in seen
and not seen.add(x)]
171 random.seed = (os.urandom(1024))
172 return ''.join(random.choice(pool)
for i
in range(length))
181 DATE_FORMAT =
"%d.%m.%Y"
182 TIME_FORMAT =
"%H:%M:%S"
184 if type(o) == datetime.date:
185 return o.strftime(DATE_FORMAT)
186 elif type(o) == datetime.time:
187 return o.strftime(TIME_FORMAT)
188 elif type(o) == datetime.datetime:
189 return o.strftime(
"%s, %s" % (DATE_FORMAT, TIME_FORMAT))
199 logger = logging.getLogger(
'request')
200 data = json.dumps(data, default=json_convert)
202 logger.info(
"called %s/%s body: %s" % (self.
server_address, url, data))
204 response = requests.post(
"%s/%s" % (self.
server_address, url), data=data)
207 logger.error(
"HTTP ERROR: code: %s data: %s" % (response.status_code, response.text[:100]))
208 raise Exception(
"Status %s failed to call function" % response.status_code)
209 response = json.loads(response.text)
211 logger.info(
"response from %s/%s is:\n%s" % (self.
server_address, url, json.dumps(response, indent=4)))
212 if not isinstance(response, dict):
213 logger.error(
"Returned object is %s expected dict. Data: %s" % (type(response), response))
214 raise Exception(
"Returned object is %s expected dict" % type(response))
215 if 'status' not in response
or 'data' not in response:
216 logger.error(
"Returned object is malformatted: %s" % response)
217 raise Exception(
"Returned object is malformatted: %s" % response)
221 def subcall(command, log=None, err_log=None, std_log=None, err_msg=None, err_exit=True):
222 if not (std_log
or err_log):
225 r = subprocess.call(command, shell=
True, stdout=std_log, stderr=err_log)
228 START_MSG =
'\033[91m' if err_exit
else '\033[93m'
230 print "%s%s%s" % (START_MSG, err_msg, END_MSG)