Пример #1
0
 def _extract(self, raw: str, station: str = None) -> "str|[str]":
     """
     Extracts the raw_report element from XML response
     """
     resp = parsexml(raw)
     try:
         data = resp["response"]["data"]
         if data["@num_results"] == "0":
             return ""
         reports = data[self._targets[self.rtype]]
     except KeyError:
         raise self._make_err(raw)
     # Only one report exists
     if isinstance(reports, dict):
         ret = reports["raw_text"]
         if self.rtype in self._coallate:
             ret = [ret]
     # Multiple reports exist
     elif isinstance(reports, list) and reports:
         if self.rtype in self._coallate:
             ret = [r["raw_text"] for r in reports]
         else:
             ret = reports[0]["raw_text"]
     # Something went wrong
     else:
         raise self._make_err(raw, '"raw_text"')
     return ret
Пример #2
0
    def get_metar_info(self):
        """Queries the NOAA METAR service."""
        metars = {}

        # NOAA can only handle so much at once, so split into chunks.
        # Even though we can issue larger chunk sizes, sometimes data is missing from the returned
        # results. Smaller chunks seem to help...
        for chunk in chunks(self.airport_codes, 250):
            self.url = self.URL.format(airport_codes=','.join(chunk),
                                       subdomain=self.subdomain)
            response = self._query()
            try:
                response = parsexml(response.text)['response']['data']['METAR']
                if not isinstance(response, list):
                    response = [response]
            except:  # noqa
                log.exception('Metar response is invalid.')
                raise
            finally:
                # ...but with more requests, we should be nice and wait a bit before the next
                time.sleep(1.0)

            for m in response:
                metars[m['station_id'].upper()] = m

        return metars
Пример #3
0
 def _extract(self, raw: str, station: str = None) -> 'str|[str]':
     """
     Extracts the raw_report element from XML response
     """
     resp = parsexml(raw)
     try:
         data = resp['response']['data']
         if data['@num_results'] == '0':
             return ''
         reports = data[self._targets[self.rtype]]
     except KeyError:
         raise self.make_err(raw)
     # Only one report exists
     if isinstance(reports, dict):
         ret = self._report_strip(reports['raw_text'])
         if self.rtype in self._coallate:
             ret = [ret]
     # Multiple reports exist
     elif isinstance(reports, list) and reports:
         if self.rtype in self._coallate:
             ret = [self._report_strip(r['raw_text']) for r in reports]
         else:
             ret = self._report_strip(reports[0]['raw_text'])
     # Something went wrong
     else:
         raise self.make_err(raw, '"raw_text"')
     return ret
Пример #4
0
 def _extract(self, raw: str, station: str = None) -> str:
     """
     Extracts the raw_report element from XML response
     """
     LOGGER.debug('%s: %s: extracting report from XML data',
                  self.__class__.__name__, station)
     resp = parsexml(raw)
     LOGGER.debug('%s: %s: extraction successful', self.__class__.__name__,
                  station)
     try:
         report = resp['response']['data'][self.rtype.upper()]
     except KeyError:
         raise self.make_err(raw)
     # Find report string
     if isinstance(report, dict):
         LOGGER.debug('%s: %s: received a single report',
                      self.__class__.__name__, station)
         report = report['raw_text']
     elif isinstance(report, list) and report:
         LOGGER.debug('%s: %s: received %s reports, using first one',
                      self.__class__.__name__, station, len(report))
         report = report[0]['raw_text']
     else:
         raise self.make_err(raw, '"raw_text"')
     # Remove excess leading and trailing data
     LOGGER.debug('%s: %s: stripping extra data', self.__class__.__name__,
                  station)
     for item in (self.rtype.upper(), 'SPECI'):
         if report.startswith(item + ' '):
             report = report[len(item) + 1:]
     LOGGER.debug('%s: %s: returning report: %s', self.__class__.__name__,
                  station, report)
     return report
Пример #5
0
 def _extract(self, raw: str, station: str = None) -> 'str|[str]':
     """
     Extracts the raw_report element from XML response
     """
     resp = parsexml(raw)
     try:
         data = resp['response']['data']
         if data['@num_results'] == '0':
             return ''
         reports = data[self._targets[self.rtype]]
     except KeyError:
         raise self.make_err(raw)
     # Only one report exists
     if isinstance(reports, dict):
         ret = self._report_strip(reports['raw_text'])
         if self.rtype in self._coallate:
             ret = [ret]
     # Multiple reports exist
     elif isinstance(reports, list) and reports:
         if self.rtype in self._coallate:
             ret = [self._report_strip(r['raw_text']) for r in reports]
         else:
             ret = self._report_strip(reports[0]['raw_text'])
     # Something went wrong
     else:
         raise self.make_err(raw, '"raw_text"')
     return ret
Пример #6
0
 def _extract(self, report_type: str, text: str) -> list[str]:
     """Extracts the raw_report element from XML response"""
     resp = parsexml(text)
     try:
         data = resp["response"]["data"]
         if data["@num_results"] == "0":
             return ""
         reports = data[self._targets[report_type]]
     except KeyError as key_error:
         raise InvalidRequest(
             "Could not find report path in response") from key_error
     target = "station_id" if report_type == "station" else "raw_text"
     return list({r[target] for r in reports})
Пример #7
0
 def _extract(self, raw: str) -> str:
     """
     Extracts the raw_report element from XML response
     """
     resp = parsexml(raw)
     try:
         report = resp['response']['data'][self.rtype.upper()]
     except:
         raise self.make_err(raw)
     if isinstance(report, dict):
         return report['raw_text']
     elif isinstance(report, list) and report:
         return report[0]['raw_text']
     else:
         raise self.make_err(raw, '"raw_text"')
Пример #8
0
def fetch_info(stream):
    url = build_url(stream.ingest_host, reverse("stream-info"))
    r = requests.get(url, headers=build_headers())
    r.raise_for_status()
    info = parsexml(r.text)
    for app in info["rtmp"]["server"]["application"]:
        if app["name"] == "app" and "live" in app and "stream" in app["live"]:
            if hasattr(app["live"]["stream"], "items"):
                streams = [app["live"]["stream"]]
            else:
                streams = app["live"]["stream"]

            for s in streams:
                if s["name"] == str(stream.uuid):
                    return s
Пример #9
0
 def _extract(self, raw: str) -> str:
     """
     Extracts the report message from XML response
     """
     resp = parsexml(raw)
     try:
         report = resp['response']['body']['items']['item'][self.rtype.lower() + 'Msg']
     except:
         raise self.make_err(raw)
     # Replace line breaks
     report = report.replace('\n', '')
     # Remove excess leading and trailing data
     report = report.lstrip(self.rtype.upper()).rstrip('=')
     # Make every element single-spaced and stripped
     return ' '.join(report.split())
Пример #10
0
 def _extract(self, raw: str, station: str = None) -> str:
     """
     Extracts the report message from XML response
     """
     resp = parsexml(raw)
     try:
         report = resp['response']['body']['items']['item'][self.rtype.lower() + 'Msg']
     except KeyError:
         raise self.make_err(raw)
     # Replace line breaks
     report = report.replace('\n', '')
     # Remove excess leading and trailing data
     for item in (self.rtype.upper(), 'SPECI'):
         if report.startswith(item + ' '):
             report = report[len(item)+1:]
     report = report.rstrip('=')
     # Make every element single-spaced and stripped
     return ' '.join(report.split())
Пример #11
0
 def _extract(self, raw: str, station: str = None) -> str:
     """
     Extracts the report message from XML response
     """
     resp = parsexml(raw)
     try:
         report = resp['response']['body']['items']['item'][self.rtype.lower() + 'Msg']
     except KeyError:
         raise self.make_err(raw)
     # Replace line breaks
     report = report.replace('\n', '')
     # Remove excess leading and trailing data
     for item in (self.rtype.upper(), 'SPECI'):
         if report.startswith(item + ' '):
             report = report[len(item)+1:]
     report = report.rstrip('=')
     # Make every element single-spaced and stripped
     return ' '.join(report.split())
Пример #12
0
def _run_cmd(command, args=[]):
    """
    Helper function to help calling and decoding ipset output

    :param command: command to run
    :param args: list of additional arguments
    :return: tuple (bool, dict, str), representing command success, parsed output, and raw error output
    """
    result = run(["ipset", command, "-output", "xml"] + args,
                 stdout=PIPE,
                 stderr=PIPE,
                 timeout=2)
    success = result.returncode == 0
    out = result.stdout.decode("UTF-8")
    err = result.stderr.decode("UTF-8")
    if out:
        return (success, parsexml(out), err or None)
    else:
        return (success, None, err or None)
Пример #13
0
 def _extract(self, raw: str, station: str = None) -> str:
     """Extracts the report message from XML response"""
     resp = parsexml(raw)
     try:
         report = resp["response"]["body"]["items"]["item"][
             self.report_type.lower() + "Msg"]
     except KeyError as key_error:
         raise self._make_err(raw) from key_error
     if not report:
         raise self._make_err("The station might not exist")
     # Replace line breaks
     report = report.replace("\n", "")
     # Remove excess leading and trailing data
     for item in (self.report_type.upper(), "SPECI"):
         if report.startswith(item + " "):
             report = report[len(item) + 1:]
     report = report.rstrip("=")
     # Make every element single-spaced and stripped
     return " ".join(report.split())
Пример #14
0
 def _extract(self, raw: str, station: str = None) -> str:
     """
     Extracts the raw_report element from XML response
     """
     resp = parsexml(raw)
     try:
         report = resp['response']['data'][self.rtype.upper()]
     except KeyError:
         raise self.make_err(raw)
     # Find report string
     if isinstance(report, dict):
         report = report['raw_text']
     elif isinstance(report, list) and report:
         report = report[0]['raw_text']
     else:
         raise self.make_err(raw, '"raw_text"')
     # Remove excess leading and trailing data
     for item in (self.rtype.upper(), 'SPECI'):
         if report.startswith(item + ' '):
             report = report[len(item)+1:]
     return report