Пример #1
0
    def note(self, message, params=None, **kwargs):
        """Create a note for the current incident (ex: .note <message>)."""
        number = self.get_incident_number()
        if number is None:
            msg = "Could not get incident number for current incident."
            message.dispatch(msg)
            return

        url = "%s/api/v1/incidents/%s/notes" % (self.subdomain, number)
        user = self.find_user_like(message.source)
        if user is None:
            message.dispatch("Could not find PagerDuty user matching: %s" %
                             message.source)
            return

        data = {
            "note": {
                "content": params
            },
            "requester_id": user["id"]
        }

        req = request.post(url, headers=self.api_headers, json=data)

        if request.ok(req):
            message.dispatch("Noted.")
        else:
            message.dispatch("Unable to create note: %d" % req.status_code)
            message.dispatch(req.text)
Пример #2
0
    def resolve_incident(self, message):
        """Close the current PagerDuty incident."""
        incident_id = self.get_incident_id()
        if incident_id is None:
            message.dispatch("Could not find ID for current incident.")
            return

        url = "%s/api/v1/incidents/%s/resolve" % (self.subdomain, incident_id)
        user = self.find_user_like(message.source)
        if user is None:
            message.dispatch("Could not find PagerDuty user: %s" %
                             message.source)
            return

        data = {"requester_id": user["id"]}

        req = request.put(url, headers=self.api_headers, json=data)

        if request.ok(req):
            self.reset_current_incident()
            message.dispatch("Resolved incident successfully.")
        else:
            message.dispatch("Could not resolve incident: %d" %
                             req.status_code)
            message.dispatch(req.text)
Пример #3
0
Файл: ops.py Проект: jk0/pyhole
    def _find_users(self, name):
        """Find PagerDuty user accounts."""
        url = "%s/users?query=%s&include[]=contact_methods" % (self.endpoint,
                                                               name)
        req = request.get(url, headers=self.api_headers)

        if request.ok(req):
            return req.json()
Пример #4
0
 def get_users(self):
     """Get PagerDuty users and fill the cache."""
     url = "%s/api/v1/users" % self.subdomain
     req = request.get(url, headers=self.api_headers)
     if request.ok(req):
         response_json = req.json()
         return response_json["users"]
     else:
         return None
Пример #5
0
 def find_incident_id(self):
     """Finds incident id from the current incident number."""
     number = self.get_incident_number()
     if number is not None:
         url = "%s/api/v1/incidents/%s" % (self.subdomain, number)
         req = request.get(url, headers=self.api_headers)
         if request.ok(req):
             response_json = req.json()
             return response_json["id"]
     return None
Пример #6
0
Файл: api.py Проект: jk0/pyhole
def get_incidents(service_id):
    """Fetch and return PagerDuty incidents."""
    url = "%s/incidents?service_ids[]=%s" % (api_endpoint, service_id)
    req = request.get(url, headers=api_headers)

    if not request.ok(req):
        flask.abort(req.status_code)

    return flask.render_template(
        "pagerduty_incidents.html",
        incidents=req.json()["incidents"],
        version=version.version_string())
Пример #7
0
Файл: api.py Проект: jk0/pyhole
def get_notes(incident_id):
    """Fetch and return PagerDuty notes."""
    url = "%s/incidents/%s/notes" % (api_endpoint, incident_id)
    req = request.get(url, headers=api_headers)

    if not request.ok(req):
        flask.abort(req.status_code)

    return flask.render_template(
        "pagerduty_notes.html",
        notes=req.json()["notes"],
        version=version.version_string())
Пример #8
0
Файл: api.py Проект: jk0/pyhole
def get_services():
    """Fetch and return PagerDuty services."""
    url = "%s/services?limit=100" % api_endpoint
    req = request.get(url, headers=api_headers)

    if not request.ok(req):
        flask.abort(req.status_code)

    return flask.render_template(
        "pagerduty_services.html",
        services=req.json()["services"],
        version=version.version_string())
Пример #9
0
Файл: ops.py Проект: jk0/pyhole
    def query(self, message, params=None, **kwargs):
        """Query an incident (ex: .query <ID>)."""
        url = "%s/incidents/%s" % (self.endpoint, params)
        req = request.get(url, headers=self.api_headers)

        if request.ok(req):
            incident = req.json()["incident"]
            summary = incident["summary"]
            status = incident["status"]
            link = incident["html_url"]

            message.dispatch("%s [%s]: %s" % (summary, status, link))
        else:
            message.dispatch("Unable to query incident: %d" % req.status_code)
            message.dispatch(req.text)
Пример #10
0
    def find_incident_number(self):
        """Finds incident number from the current incident key."""
        key = self.get_incident_key()
        if key is not None:
            url = "%s/api/v1/incidents" % self.subdomain
            params = {"incident_key": key, "sort_by": "created_on:desc"}
            req = request.get(url, headers=self.api_headers, params=params)

            if request.ok(req):
                response_json = req.json()
                incidents = response_json["incidents"]
                if len(incidents) > 0:
                    number = incidents[0]["incident_number"]
                    return number
        return None
Пример #11
0
Файл: ops.py Проект: jk0/pyhole
    def oncall(self, message, params=None, **kwargs):
        """Show who is on call (ex: .oncall)."""
        url = "%s/oncalls" % self.endpoint
        req = request.get(url, headers=self.api_headers)

        if request.ok(req):
            on_calls = []

            for policy in req.json()["oncalls"]:
                if policy["schedule"]:
                    on_calls.append("%s (%s)" % (policy["schedule"]["summary"],
                                                 policy["user"]["summary"]))
            message.dispatch(", ".join(on_calls))
        else:
            message.dispatch("Unable to fetch list: %d" % req.status_code)
            message.dispatch(req.text)
Пример #12
0
Файл: ops.py Проект: jk0/pyhole
    def notes(self, message, params=None, **kwargs):
        """List all notes an incident (ex: .note <ID>)."""
        url = "%s/incidents/%s/notes" % (self.endpoint, params)
        req = request.get(url, headers=self.api_headers)

        if request.ok(req):
            notes = req.json()["notes"]
            message.dispatch("There are %d notes." % len(notes))

            for note in notes:
                message.dispatch("%s %s - %s" % (note["created_at"],
                                                 note["user"]["summary"],
                                                 note["content"]))
        else:
            message.dispatch("Unable to fetch notes: %d" % req.status_code)
            message.dispatch(req.text)
Пример #13
0
Файл: ops.py Проект: jk0/pyhole
    def services(self, message, params=None, **kwargs):
        """List PagerDuty services (ex: .services)."""
        url = "%s/services?&include[]=integrations&limit=100" % self.endpoint
        req = request.get(url, headers=self.api_headers)

        if request.ok(req):
            for service in req.json()["services"]:
                try:
                    integration = service["integrations"][0]
                    integration_key = integration["integration_key"]
                    message.dispatch("%s (%s)" % (service["summary"],
                                                  integration_key))
                except KeyError:
                    continue
        else:
            message.dispatch("Unable to fetch services: %d" % req.status_code)
            message.dispatch(req.text)
Пример #14
0
    def oncall(self, message, params=None, **kwargs):
        """Show who is on call (ex: .oncall [<group>])."""
        url = "%s/api/v1/escalation_policies/on_call" % self.subdomain
        req = request.get(url, headers=self.api_headers,
                          params={"query": params})

        if request.ok(req):
            response_json = req.json()
            for policy in response_json["escalation_policies"]:
                message.dispatch(policy["name"])

                for level in policy["on_call"]:
                    message.dispatch("- Level %s: %s <%s>" % (
                                     level["level"],
                                     level["user"]["name"],
                                     level["user"]["email"]))
        else:
            message.dispatch("Unable to fetch list: %d" % req.status_code)
Пример #15
0
Файл: ops.py Проект: jk0/pyhole
    def note(self, message, params=None, **kwargs):
        """Create a note for an incident (ex: .note <ID> <message>)."""
        params = params.split(" ")
        incident_id = params.pop(0)

        self.api_headers["From"] = self._find_user(message.source)
        data = {
            "note": {
                "content": " ".join(params)
            }
        }

        url = "%s/incidents/%s/notes" % (self.endpoint, incident_id)
        req = request.post(url, headers=self.api_headers, json=data)

        if request.ok(req):
            message.dispatch("Noted.")
        else:
            message.dispatch("Unable to create note: %d" % req.status_code)
            message.dispatch(req.text)
Пример #16
0
Файл: ops.py Проект: jk0/pyhole
    def resolve(self, message, params=None, **kwargs):
        """Resolve an incident (ex: .snooze <ID>)."""
        self.api_headers["From"] = self._find_user(message.source)

        data = {
            "incidents": [{
                "id": params,
                "type": "incident",
                "status": "resolved"
            }]
        }

        url = "%s/incidents" % self.endpoint
        req = request.put(url, headers=self.api_headers, json=data)

        if request.ok(req):
            message.dispatch("Resolved.")
        else:
            message.dispatch("Unable to resolve: %d" % req.status_code)
            message.dispatch(req.text)
Пример #17
0
    def create_incident(self, message, description):
        """Create a PagerDuty incident with specified description."""
        # would have been called url, but flake8 complains that line is 81 long
        u = "https://events.pagerduty.com/generic/2010-04-15/create_event.json"
        data = {
            "service_key": self.integration_key,
            "event_type": "trigger",
            "description": description,
            "incident_key": utils.datetime_now_string(),
            "details": {"triggered by": message.source}
        }

        req = request.post(u, json=data)
        response_json = req.json()
        if request.ok(req):
            self.set_incident_key(response_json["incident_key"])
            message.dispatch("Created incident with incident_key: %s" %
                             self.get_incident_key())
        else:
            message.dispatch("Error creating incident: %d" % req.status_code)
            message.dispatch(response_json["message"])
Пример #18
0
    def notes(self, message, params=None, **kwargs):
        """List all notes in current incident."""
        number = self.get_incident_number()
        if number is None:
            msg = "Could not get incident number for current incident."
            message.dispatch(msg)
            return

        url = "%s/api/v1/incidents/%s/notes" % (self.subdomain, number)
        req = request.get(url, headers=self.api_headers)
        if request.ok(req):
            response_json = req.json()
            notes = response_json["notes"]
            message.dispatch("There are %d notes." % len(notes))

            for note in notes:
                message.dispatch("%s %s - %s" % (note["created_at"],
                                                 note["user"]["name"],
                                                 note["content"]))
        else:
            message.dispatch("Unable to fetch notes: %d" % req.status_code)
Пример #19
0
Файл: ops.py Проект: jk0/pyhole
    def alert(self, message, params=None, **kwargs):
        """Trigger a custom alert (ex: .alert <service_key> <description>."""
        params = params.split(" ")
        service_key = params.pop(0)
        description = " ".join(params)

        data = {
            "service_key": service_key,
            "event_type": "trigger",
            "description": description,
            "details": description,
            "client": "pyhole %s" % version.version(),
            "client_url": "https://github.com/jk0/pyhole"
        }

        events_host = "https://events.pagerduty.com/"
        url = "%s/generic/2010-04-15/create_event.json" % events_host
        req = request.post(url, headers=self.api_headers, json=data)

        if request.ok(req):
            message.dispatch("Triggered.")
        else:
            message.dispatch("Unable to trigger alert: %d" % req.status_code)
            message.dispatch(req.text)