def calculate(self, event, expression): bc = Popen([self.bc, '-l'], stdin=PIPE, stdout=PIPE, stderr=PIPE) start_time = time() bc.stdin.write(expression.encode('utf-8') + '\n') bc.stdin.close() while bc.poll() is None and time() - start_time < self.bc_timeout: sleep(0.1) if bc.poll() is None: kill(bc.pid, SIGTERM) event.addresponse(u'Sorry, that took too long. I stopped waiting') return output = bc.stdout.read() error = bc.stderr.read() code = bc.wait() if code == 0: if output: output = unicode_output(output.strip()) output = output.replace('\\\n', '') event.addresponse(output) else: error = unicode_output(error.strip()) error = error.split(":", 1)[1].strip() error = error[0].lower() + error[1:].split('\n')[0] event.addresponse(u"I'm sorry, I couldn't deal with the %s", error) else: event.addresponse(u"Error running bc") error = unicode_output(error.strip()) raise Exception("BC Error: %s" % error)
def calculate(self, event, expression): bc = Popen([self.bc, "-l"], stdin=PIPE, stdout=PIPE, stderr=PIPE) start_time = time() bc.stdin.write(expression.encode("utf-8") + "\n") bc.stdin.close() while bc.poll() is None and time() - start_time < self.bc_timeout: sleep(0.1) if bc.poll() is None: kill(bc.pid, SIGTERM) event.addresponse(u"Sorry, that took too long. I stopped waiting") return output = bc.stdout.read() error = bc.stderr.read() code = bc.wait() if code == 0: if output: output = unicode_output(output.strip()) output = output.replace("\\\n", "") event.addresponse(output) else: error = unicode_output(error.strip()) error = error.split(":", 1)[1].strip() error = error[0].lower() + error[1:].split("\n")[0] event.addresponse(u"I'm sorry, I couldn't deal with the %s", error) else: event.addresponse(u"Error running bc") error = unicode_output(error.strip()) raise Exception("BC Error: %s" % error)
def handle_tracepath(self, event, host): tracepath = Popen([self.tracepath, host], stdout=PIPE, stderr=PIPE) output, error = tracepath.communicate() code = tracepath.wait() if code == 0: output = unicode_output(output) event.addresponse(output, conflate=False) else: error = unicode_output(error.strip()) event.addresponse(u'Error: %s', error.replace(u'\n', u' '))
def handle_tracepath(self, event, host): tracepath = Popen([self.tracepath, host], stdout=PIPE, stderr=PIPE) output, error = tracepath.communicate() code = tracepath.wait() if code == 0: output = unicode_output(output) event.addresponse(output, conflate=False) else: error = unicode_output(error.strip()) event.addresponse(u"Error: %s", error.replace(u"\n", u" "))
def handle_ping(self, event, host): if host.strip().startswith("-"): event.addresponse(False) return ping = Popen([self.ping, "-q", "-c5", host], stdout=PIPE, stderr=PIPE) output, error = ping.communicate() ping.wait() if not error: output = unicode_output(output) output = u" ".join(output.splitlines()[-2:]) event.addresponse(output) else: error = unicode_output(error).replace(u"\n", u" ").replace(u"ping:", u"", 1).strip() event.addresponse(u"Error: %s", error)
def ipcalc_netmask(self, event, address, netmask): address = address if netmask: address += u"/" + netmask code, output, error = self.call_ipcalc([address]) if code == 0: if output.startswith(u"INVALID ADDRESS"): event.addresponse(u"That's an invalid address. " u"Try something like 192.168.1.0/24") else: response = {} for line in output.splitlines(): if ":" in line: name, value = [x.strip() for x in line.split(u":", 1)] name = name.lower() if name == "netmask": value, response["cidr"] = value.split(" = ") elif name == "hosts/net": value, response["class"] = value.split(None, 1) response[name] = value event.addresponse( u"Host: %(address)s/%(netmask)s (/%(cidr)s) " u"Wildcard: %(wildcard)s | " u"Network: %(network)s (%(hostmin)s - %(hostmax)s) " u"Broadcast: %(broadcast)s Hosts: %(hosts/net)s %(class)s", response, ) else: error = unicode_output(error.strip()) event.addresponse(error.replace(u"\n", u" "))
def call_ipcalc(self, parameters): ipcalc = Popen([self.ipcalc, "-n", "-b"] + parameters, stdout=PIPE, stderr=PIPE) output, error = ipcalc.communicate() code = ipcalc.wait() output = unicode_output(output) return (code, output, error)
def ipcalc_netmask(self, event, address, netmask): address = address if netmask: address += u'/' + netmask code, output, error = self.call_ipcalc([address]) if code == 0: if output.startswith(u'INVALID ADDRESS'): event.addresponse(u"That's an invalid address. " u"Try something like 192.168.1.0/24") else: response = {} for line in output.splitlines(): if ":" in line: name, value = [x.strip() for x in line.split(u':', 1)] name = name.lower() if name == "netmask": value, response['cidr'] = value.split(' = ') elif name == "hosts/net": value, response['class'] = value.split(None, 1) response[name] = value event.addresponse(u'Host: %(address)s/%(netmask)s (/%(cidr)s) ' u'Wildcard: %(wildcard)s | ' u'Network: %(network)s (%(hostmin)s - %(hostmax)s) ' u'Broadcast: %(broadcast)s Hosts: %(hosts/net)s %(class)s', response) else: error = unicode_output(error.strip()) event.addresponse(error.replace(u'\n', u' '))
def handle_man(self, event, section, page): command = [self.man, page] if section: command.insert(1, section) if page.strip().startswith("-"): event.addresponse(False) return env = os.environ.copy() env["COLUMNS"] = "500" man = Popen(command, stdout=PIPE, stderr=PIPE, env=env) output, error = man.communicate() code = man.wait() if code != 0: event.addresponse(u'Manpage not found') else: output = unicode_output(output.strip(), errors="replace") output = output.splitlines() index = output.index('NAME') if index: event.addresponse(output[index+1].strip()) index = output.index('SYNOPSIS') if index: event.addresponse(output[index+1].strip())
def handle_ping(self, event, host): if host.strip().startswith("-"): event.addresponse(False) return ping = Popen([self.ping, '-q', '-c5', host], stdout=PIPE, stderr=PIPE) output, error = ping.communicate() ping.wait() if not error: output = unicode_output(output) output = u' '.join(output.splitlines()[-2:]) event.addresponse(output) else: error = unicode_output(error).replace(u'\n', u' ') \ .replace(u'ping:', u'', 1).strip() event.addresponse(u'Error: %s', error)
def call_ipcalc(self, parameters): ipcalc = Popen([self.ipcalc, '-n', '-b'] + parameters, stdout=PIPE, stderr=PIPE) output, error = ipcalc.communicate() code = ipcalc.wait() output = unicode_output(output) return (code, output, error)
def remote_fortune(self): fortune = Popen(self.fortune, stdout=PIPE, stderr=PIPE) output, error = fortune.communicate() code = fortune.wait() output = unicode_output(output.strip(), 'replace') if code == 0: return output else: return None
def ipcalc_deggregate(self, event, frm, to): code, output, error = self.call_ipcalc([frm, "-", to]) if code == 0: if output.startswith(u"INVALID ADDRESS"): event.addresponse(u"That's an invalid address. " u"Try something like 192.168.1.0") else: event.addresponse(u"Deaggregates to: %s", human_join(output.splitlines()[1:])) else: error = unicode_output(error.strip()) event.addresponse(error.replace(u"\n", u" "))
def show(self, event, term): if not self._check_terms(event, term): return apt = Popen([self.aptitude, 'show', term], stdout=PIPE, stderr=PIPE) output, error = apt.communicate() code = apt.wait() if code == 0: description = None provided = None output = unicode_output(output) real = True for line in output.splitlines(): if not description: if line.startswith(u'Description:'): description = u'%s:' % line.split(None, 1)[1] elif line.startswith(u'Provided by:'): provided = line.split(None, 2)[2] elif line == u'State: not a real package': real = False elif line != "": description += u' ' + line.strip() else: # More than one package listed break if provided: event.addresponse(u'Virtual package provided by %s', provided) elif description: event.addresponse(description) elif not real: event.addresponse(u'Virtual package, not provided by anything') else: raise Exception("We couldn't successfully parse aptitude's output") else: error = unicode_output(error.strip()) if error.startswith(u"E: "): error = error[3:] event.addresponse(u"Couldn't find package: %s", error)
def ipcalc_deggregate(self, event, frm, to): code, output, error = self.call_ipcalc([frm, '-', to]) if code == 0: if output.startswith(u'INVALID ADDRESS'): event.addresponse(u"That's an invalid address. " u"Try something like 192.168.1.0") else: event.addresponse(u'Deaggregates to: %s', human_join(output.splitlines()[1:])) else: error = unicode_output(error.strip()) event.addresponse(error.replace(u'\n', u' '))
def search(self, event, term): apt = Popen([self.aptfile, 'search', term], stdout=PIPE, stderr=PIPE) output, error = apt.communicate() code = apt.wait() if code == 0: if output: output = unicode_output(output.strip()) output = [line.split(u':')[0] for line in output.splitlines()] packages = sorted(set(output)) event.addresponse(u'Found %(num)i packages: %(names)s', { 'num': len(packages), 'names': human_join(packages), }) else: event.addresponse(u'No packages found') else: error = unicode_output(error.strip()) if u"The cache directory is empty." in error: event.addresponse(u'Search error: apt-file cache empty') else: event.addresponse(u'Search error') raise Exception("apt-file: %s" % error)
def search(self, event, term): if not self._check_terms(event, term): return apt = Popen([self.aptitude, 'search', '-F', '%p', term], stdout=PIPE, stderr=PIPE) output, error = apt.communicate() code = apt.wait() if code == 0: if output: output = unicode_output(output.strip()) output = [line.strip() for line in output.splitlines()] event.addresponse(u'Found %(num)i packages: %(names)s', { 'num': len(output), 'names': human_join(output), }) else: event.addresponse(u'No packages found') else: error = unicode_output(error.strip()) if error.startswith(u"E: "): error = error[3:] event.addresponse(u"Couldn't search: %s", error)
def processMessage(self, event, message): if event["processed"]: return client = wolframalpha.Client(self.wa_api_key) results = list(client.query(message.strip()).pods) lines = [] for pod in results: if pod.text: lines.append(unicode_output(pod.text.encode('ascii', 'ignore'))) if not lines: event.addresponse(u'No results.', {}, address=False, processed=True) else: for line in lines: event.addresponse(line, {}, address=False, processed=True) return
def convert(self, event, value, frm, to): # We have to special-case temperatures because GNU units uses function notation # for direct temperature conversions if self.format_temperature(frm) in self.temp_function_names \ and self.format_temperature(to) in self.temp_function_names: frm = self.format_temperature(frm) to = self.format_temperature(to) if value is not None: if frm in self.temp_function_names: frm = "%s(%s)" % (frm, value) else: frm = '%s %s' % (value, frm) units = Popen([self.units, '--verbose', '--', frm, to], stdout=PIPE, stderr=PIPE) output, error = units.communicate() code = units.wait() output = unicode_output(output) result = output.splitlines()[0].strip() if code == 0: event.addresponse(result) elif code == 1: if result == "conformability error": event.addresponse( u"I don't think %(from)s can be converted to %(to)s", { 'from': frm, 'to': to, }) elif result.startswith("conformability error"): event.addresponse( u"I don't think %(from)s can be converted to %(to)s: %(error)s", { 'from': frm, 'to': to, 'error': result.split(":", 1)[1], }) else: event.addresponse(u"I can't do that: %s", result)
def convert(self, event, value, frm, to): # We have to special-case temperatures because GNU units uses function notation # for direct temperature conversions if self.format_temperature(frm) in self.temp_function_names \ and self.format_temperature(to) in self.temp_function_names: frm = self.format_temperature(frm) to = self.format_temperature(to) if value is not None: if frm in self.temp_function_names: frm = "%s(%s)" % (frm, value) else: frm = '%s %s' % (value, frm) units = Popen([self.units, '--verbose', '--', frm, to], stdout=PIPE, stderr=PIPE) output, error = units.communicate() code = units.wait() output = unicode_output(output) result = output.splitlines()[0].strip() if code == 0: event.addresponse(result) elif code == 1: if result == "conformability error": event.addresponse(u"I don't think %(from)s can be converted to %(to)s", { 'from': frm, 'to': to, }) elif result.startswith("conformability error"): event.addresponse(u"I don't think %(from)s can be converted to %(to)s: %(error)s", { 'from': frm, 'to': to, 'error': result.split(":", 1)[1], }) else: event.addresponse(u"I can't do that: %s", result)