Exemple #1
0
def host_groups_add():
    name = request.form.get("name")
    description = request.form.get("description")
    hosts = request.form.getlist("hosts[]")
    host_groups = request.form.getlist("host-groups[]")

    if not name:
        return error_response("You must supply a name for this group")

    groups = HostGroup.query.filter(HostGroup.name == name).count()
    if groups:
        return error_response("A group with that name already exists")

    host_group = HostGroup(name=name, description=description)
    session.add(host_group)
    session.flush()

    for host in hosts:
        a = HostGroupAssignment(host_group_id=host_group.id,
            member_host_id=host)
        session.add(a)

    for group in host_groups:
        a = HostGroupAssignment(host_group_id=host_group.id,
            member_host_group_id=group)
        session.add(a)

    session.commit()

    return jsonify(success=True, message="Host Group added successfully")
Exemple #2
0
def scheduling_add():
    name = request.form.get("name")
    description = request.form.get("description")
    interval_starts = request.form.getlist("interval-start[]")
    interval_values = request.form.getlist("interval-value[]")
    interval_units = request.form.getlist("interval-unit[]")
    checks = request.form.getlist("checks[]")

    if not name:
        return error_response("You must supply a name for this schedule")

    s = Schedule(name=name, description=description)
    session.add(s)
    session.flush()

    for check_id in checks:
        sc = ScheduleCheck(check_id=check_id, schedule_id=s.id)
        session.add(sc)

    for interval in zip(interval_starts, interval_values, interval_units):
        try:
            start_timestamp = datetime.strptime(interval[0], "%Y-%m-%d %H:%M:%S")
        except ValueError:
            return error_response("Start timestamp for interval was not " "understood")
        si = ScheduleInterval(schedule_id=s.id, start_timestamp=start_timestamp)
        try:
            si.set_interval(int(interval[1]), interval[2])
        except ValueError:
            return error_response("Interval must be an integer")
        session.add(si)

    session.commit()

    return jsonify(success=True, message="Schedule has been added successfully")
def checks_add():
    name = request.form.get("name")
    description = request.form.get("description")
    host_groups = request.form.getlist("host-groups[]")
    hosts = request.form.getlist("hosts[]")
    plugins = request.form.getlist("plugins[]")

    if not name:
        return error_response("You must supply a name for this check")

    c = Check(name=name, description=description)
    session.add(c)
    session.flush()

    for host_id in hosts:
        ca = CheckAssignment(host_id=host_id, check_id=c.id)
        session.add(ca)

    for host_group_id in host_groups:
        ca = CheckAssignment(host_group_id=host_group_id, check_id=c.id)
        session.add(ca)

    for plugin_id in plugins:
        cp = CheckPlugin(plugin_id=plugin_id, check_id=c.id)
        session.add(cp)

    session.commit()

    return jsonify(success=True, message="Check has been added successfully!")
Exemple #4
0
def checks_add():
    name = request.form.get("name")
    description = request.form.get("description")
    host_groups = request.form.getlist("host-groups[]")
    hosts = request.form.getlist("hosts[]")
    plugins = request.form.getlist("plugins[]")

    if not name:
        return error_response("You must supply a name for this check")

    c = Check(name=name, description=description)
    session.add(c)
    session.flush()

    for host_id in hosts:
        ca = CheckAssignment(host_id=host_id, check_id=c.id)
        session.add(ca)

    for host_group_id in host_groups:
        ca = CheckAssignment(host_group_id=host_group_id, check_id=c.id)
        session.add(ca)

    for plugin_id in plugins:
        cp = CheckPlugin(plugin_id=plugin_id, check_id=c.id)
        session.add(cp)

    session.commit()

    return jsonify(success=True, message="Check has been added successfully!")
def host_groups_add():
    name = request.form.get("name")
    description = request.form.get("description")
    hosts = request.form.getlist("hosts[]")
    host_groups = request.form.getlist("host-groups[]")

    if not name:
        return error_response("You must supply a name for this group")

    groups = HostGroup.query.filter(HostGroup.name == name).count()
    if groups:
        return error_response("A group with that name already exists")

    host_group = HostGroup(name=name, description=description)
    session.add(host_group)
    session.flush()

    for host in hosts:
        a = HostGroupAssignment(host_group_id=host_group.id,
            member_host_id=host)
        session.add(a)

    for group in host_groups:
        a = HostGroupAssignment(host_group_id=host_group.id,
            member_host_group_id=group)
        session.add(a)

    session.commit()

    return jsonify(success=True, message="Host Group added successfully")
Exemple #6
0
def alerts_add():
    name = request.form.get("name")
    entity_selection = request.form.get("entity-selection")
    host_groups = request.form.getlist("host-groups[]")
    hosts = request.form.getlist("hosts[]")
    checks = request.form.getlist("checks[]")
    services = request.form.getlist("services[]")
    plugins = request.form.getlist("plugins[]")
    from_states = request.form.getlist("from-states[]")
    to_states = request.form.getlist("to-states[]")
    module_selection = request.form.get("module-selection")

    if not name:
        return error_response("You must specify a name for this alert")

    if not from_states or not to_states:
        return error_response("You must specify at least one from state and at " "least one to state")

    if not module_selection:
        return error_response("You must select a module to use for this alert")

    alert = Alert(name=name, entity_selection_type=entity_selection, module=module_selection)
    session.add(alert)
    session.flush()
    for state in to_states:
        session.add(AlertTransitionTo(alert_id=alert.id, state=state))

    for state in from_states:
        session.add(AlertTransitionFrom(alert_id=alert.id, state=state))

    if entity_selection == "custom":
        added_entity = False
        for host_id in hosts:
            session.add(AlertCheckEntity(alert_id=alert.id, host_id=host_id))
            added_entity = True
        for host_group_id in host_groups:
            session.add(AlertCheckEntity(alert_id=alert.id, host_group_id=host_group_id))
            added_entity = True
        for service_id in services:
            session.add(AlertCheckEntity(alert_id=alert.id, service_id=service_id))
            added_entity = True

        if not added_entity:
            session.rollback()
            return error_response("You must select at least one entity to alert" " for state changes in")

    for check_id in checks:
        session.add(AlertRestrictToEntity(alert_id=alert.id, check_id=check_id))
    for plugin_id in plugins:
        session.add(AlertRestrictToEntity(alert_id=alert.id, plugin_id=plugin_id))

    for key in request.form.keys():
        if key.startswith("module-option-"):
            option_key = key.replace("module-option-", "", 1)
            option_value = request.form.get(key)
            session.add(AlertModuleOption(alert_id=alert.id, key=option_key, value=option_value))

    session.commit()
    return jsonify(success=True, message="Alert has been added successfully")
Exemple #7
0
def services_edit():
    name = request.form.get("name")
    description = request.form.get("description")
    service_id = request.form.get("service-id")
    try:
        dependencies = json.loads(request.form.get("dependencies"))
    except ValueError:
        return error_response("Could not understand format of request sent")

    if not name.strip():
        return error_response("You must specify a name")

    try:
        service = Service.query.get(service_id)
        if not service:
            return error_response("Service could not be found")
        service.name = name
        service.description = description

        gs = RedundancyGroup.query.filter(RedundancyGroup.service_id == service.id)
        for g in gs:
            session.delete(g)

        ds = ServiceDependency.query.filter(ServiceDependency.service_id == service.id)
        for d in ds:
            session.delete(d)

        for dependency in dependencies["dependencies"]:
            if dependency["type"] == "host":
                sd = ServiceDependency(service_id=service.id, host_id=dependency["id"])
            else:
                sd = ServiceDependency(service_id=service.id, host_group_id=dependency["id"])
            session.add(sd)

        for redundancy_group in dependencies["redundancyGroups"]:
            rg = RedundancyGroup(service_id=service.id)
            session.add(rg)
            session.flush()
            sd = ServiceDependency(service_id=service.id, redundancy_group_id=rg.id)
            session.add(sd)
            for item in redundancy_group["items"]:
                if item["type"] == "host":
                    rgc = RedundancyGroupComponent(redundancy_group_id=rg.id, host_id=item["id"])
                else:
                    rgc = RedundancyGroupComponent(redundancy_group_id=rg.id, host_group_id=item["id"])
                session.add(rgc)

        session.commit()
    except ValueError:
        session.rollback()
        return error_response(
            "The data sent to the server could not be " "understood.  Please refresh the page and try again."
        )

    return jsonify(success=True, message="Service has been saved successfully")
    def setUp(self):
        create_all()
        # Insert all plugins
        for letter in ["A", "B", "C", "D"]:
            p = Plugin(id=letter, name=letter)
            session.add(p)

        g = HostGroup(name="G")
        session.add(g)
        g2 = HostGroup(name="G2")
        session.add(g2)

        # Insert all hosts
        for number in range(1, 8):
            h = Host(name=number)
            session.add(h)
            session.flush()
            if number in [3, 4]:
                hga = HostGroupAssignment(member_host_id=h.id,
                                          host_group_id=g.id)
                session.add(hga)
            if number == 7:
                hga = HostGroupAssignment(member_host_id=h.id,
                                          host_group_id=g2.id)
                session.add(hga)
        hga = HostGroupAssignment(member_host_group_id=g.id,
                                  host_group_id=g2.id)
        session.add(hga)

        # Insert all checks and do assignments
        for number in range(1, 6):
            c = Check(name=number)
            session.add(c)

        session.add(CheckAssignment(check_id=1, host_id=1))
        session.add(CheckAssignment(check_id=1, host_id=2))
        session.add(CheckAssignment(check_id=1, host_id=4))
        session.add(CheckAssignment(check_id=2, host_id=3))
        session.add(CheckAssignment(check_id=4, host_id=5))
        session.add(CheckAssignment(check_id=3, host_group_id=1))
        session.add(CheckAssignment(check_id=5, host_group_id=2))

        session.add(CheckPlugin(check_id=1, plugin_id=2))
        session.add(CheckPlugin(check_id=1, plugin_id=3))
        session.add(CheckPlugin(check_id=2, plugin_id=2))
        session.add(CheckPlugin(check_id=3, plugin_id=1))
        session.add(CheckPlugin(check_id=4, plugin_id=1))
        session.add(CheckPlugin(check_id=4, plugin_id=2))
        session.add(CheckPlugin(check_id=4, plugin_id=3))
        session.add(CheckPlugin(check_id=5, plugin_id=4))
        session.commit()
Exemple #9
0
def services_add():
    name = request.form.get("name")
    description = request.form.get("description")
    try:
        dependencies = json.loads(request.form.get("dependencies"))
    except ValueError:
        return error_response("Could not understand format of request sent")

    if not name.strip():
        return error_response("You must specify a name")

    try:
        service = Service(name=name, description=description)
        session.add(service)
        session.flush()

        for dependency in dependencies["dependencies"]:
            if dependency["type"] == "host":
                sd = ServiceDependency(service_id=service.id,
                    host_id=dependency["id"])
            else:
                sd = ServiceDependency(service_id=service.id,
                    host_group_id=dependency["id"])
            session.add(sd)

        for redundancy_group in dependencies["redundancyGroups"]:
            rg = RedundancyGroup(service_id=service.id)
            session.add(rg)
            session.flush()
            sd = ServiceDependency(service_id=service.id,
                redundancy_group_id=rg.id)
            session.add(sd)
            for item in redundancy_group["items"]:
                if item["type"] == "host":
                    rgc = RedundancyGroupComponent(redundancy_group_id=rg.id,
                        host_id=item["id"])
                else:
                    rgc = RedundancyGroupComponent(redundancy_group_id=rg.id,
                        host_group_id=item["id"])
                session.add(rgc)

        session.commit()
    except ValueError:
        session.rollback()
        return error_response("The data sent to the server could not be "
            "understood.  Please refresh the page and try again.")

    return jsonify(success=True, message="Service has been added successfully")
Exemple #10
0
    def setUp(self):
        create_all()
        # Insert all plugins
        for letter in ["A", "B", "C", "D"]:
            p = Plugin(id=letter, name=letter)
            session.add(p)

        g = HostGroup(name="G")
        session.add(g)
        g2 = HostGroup(name="G2")
        session.add(g2)

        # Insert all hosts
        for number in range(1, 8):
            h = Host(name=number)
            session.add(h)
            session.flush()
            if number in [3, 4]:
                hga = HostGroupAssignment(member_host_id=h.id, host_group_id=g.id)
                session.add(hga)
            if number == 7:
                hga = HostGroupAssignment(member_host_id=h.id, host_group_id=g2.id)
                session.add(hga)
        hga = HostGroupAssignment(member_host_group_id=g.id, host_group_id=g2.id)
        session.add(hga)

        # Insert all checks and do assignments
        for number in range(1, 6):
            c = Check(name=number)
            session.add(c)

        session.add(CheckAssignment(check_id=1, host_id=1))
        session.add(CheckAssignment(check_id=1, host_id=2))
        session.add(CheckAssignment(check_id=1, host_id=4))
        session.add(CheckAssignment(check_id=2, host_id=3))
        session.add(CheckAssignment(check_id=4, host_id=5))
        session.add(CheckAssignment(check_id=3, host_group_id=1))
        session.add(CheckAssignment(check_id=5, host_group_id=2))

        session.add(CheckPlugin(check_id=1, plugin_id=2))
        session.add(CheckPlugin(check_id=1, plugin_id=3))
        session.add(CheckPlugin(check_id=2, plugin_id=2))
        session.add(CheckPlugin(check_id=3, plugin_id=1))
        session.add(CheckPlugin(check_id=4, plugin_id=1))
        session.add(CheckPlugin(check_id=4, plugin_id=2))
        session.add(CheckPlugin(check_id=4, plugin_id=3))
        session.add(CheckPlugin(check_id=5, plugin_id=4))
        session.commit()
    def setUp(self):
        session.commit()
        drop_all()
        create_all()

        # Add Hosts
        for i in range(1,5):
            session.add(Host(id=i, name="Host {}".format(i)))

        # Add Groups
        for i in range(1,9):
            session.add(HostGroup(id=i, name="Group {}".format(i)))

        session.flush()

        # Assign hosts to groups
        session.add(HostGroupAssignment(member_host_id=1, host_group_id=1))
        session.add(HostGroupAssignment(member_host_id=1, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=2, host_group_id=1))
        session.add(HostGroupAssignment(member_host_id=2, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=2, host_group_id=3))
        session.add(HostGroupAssignment(member_host_id=3, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=3, host_group_id=3))
        session.add(HostGroupAssignment(member_host_id=3, host_group_id=5))
        session.add(HostGroupAssignment(member_host_id=4, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=4, host_group_id=6))
        session.add(HostGroupAssignment(member_host_id=4, host_group_id=5))

        # Assign groups to groups
        session.add(HostGroupAssignment(member_host_group_id=4,
            host_group_id=5))
        session.add(HostGroupAssignment(member_host_group_id=3,
            host_group_id=4))
        session.add(HostGroupAssignment(member_host_group_id=6,
            host_group_id=7))
        session.add(HostGroupAssignment(member_host_group_id=7,
            host_group_id=8))
        session.add(HostGroupAssignment(member_host_group_id=8,
            host_group_id=6))

        session.commit()
    def setUp(self):
        session.commit()
        drop_all()
        create_all()

        # Add Hosts
        for i in range(1, 5):
            session.add(Host(id=i, name="Host {}".format(i)))

        # Add Groups
        for i in range(1, 9):
            session.add(HostGroup(id=i, name="Group {}".format(i)))

        session.flush()

        # Assign hosts to groups
        session.add(HostGroupAssignment(member_host_id=1, host_group_id=1))
        session.add(HostGroupAssignment(member_host_id=1, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=2, host_group_id=1))
        session.add(HostGroupAssignment(member_host_id=2, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=2, host_group_id=3))
        session.add(HostGroupAssignment(member_host_id=3, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=3, host_group_id=3))
        session.add(HostGroupAssignment(member_host_id=3, host_group_id=5))
        session.add(HostGroupAssignment(member_host_id=4, host_group_id=2))
        session.add(HostGroupAssignment(member_host_id=4, host_group_id=6))
        session.add(HostGroupAssignment(member_host_id=4, host_group_id=5))

        # Assign groups to groups
        session.add(
            HostGroupAssignment(member_host_group_id=4, host_group_id=5))
        session.add(
            HostGroupAssignment(member_host_group_id=3, host_group_id=4))
        session.add(
            HostGroupAssignment(member_host_group_id=6, host_group_id=7))
        session.add(
            HostGroupAssignment(member_host_group_id=7, host_group_id=8))
        session.add(
            HostGroupAssignment(member_host_group_id=8, host_group_id=6))

        session.commit()
Exemple #13
0
def checks_edit():
    name = request.form.get("name")
    description = request.form.get("description")
    host_groups = request.form.getlist("host-groups[]")
    hosts = request.form.getlist("hosts[]")
    plugins = request.form.getlist("plugins[]")
    check_id = request.form.get("check-id")

    if not name:
        return error_response("You must supply a name for this check")

    c = Check.query.get(check_id)

    if not c:
        return error_response("Check could not be found!")

    c.name = name
    c.description = description

    session.flush()

    CheckAssignment.query.filter(CheckAssignment.check_id == check_id).delete()
    CheckPlugin.query.filter(CheckPlugin.check_id == check_id).delete()
    for host_id in hosts:
        ca = CheckAssignment(host_id=host_id, check_id=c.id)
        session.add(ca)

    for host_group_id in host_groups:
        ca = CheckAssignment(host_group_id=host_group_id, check_id=c.id)
        session.add(ca)

    for plugin_id in plugins:
        cp = CheckPlugin(plugin_id=plugin_id, check_id=c.id)
        session.add(cp)

    session.commit()

    return jsonify(success=True, message="Check has been saved successfully!")
def checks_edit():
    name = request.form.get("name")
    description = request.form.get("description")
    host_groups = request.form.getlist("host-groups[]")
    hosts = request.form.getlist("hosts[]")
    plugins = request.form.getlist("plugins[]")
    check_id = request.form.get("check-id")

    if not name:
        return error_response("You must supply a name for this check")

    c = Check.query.get(check_id)

    if not c:
        return error_response("Check could not be found!")

    c.name = name
    c.description = description

    session.flush()

    CheckAssignment.query.filter(CheckAssignment.check_id == check_id).delete()
    CheckPlugin.query.filter(CheckPlugin.check_id == check_id).delete()
    for host_id in hosts:
        ca = CheckAssignment(host_id=host_id, check_id=c.id)
        session.add(ca)

    for host_group_id in host_groups:
        ca = CheckAssignment(host_group_id=host_group_id, check_id=c.id)
        session.add(ca)

    for plugin_id in plugins:
        cp = CheckPlugin(plugin_id=plugin_id, check_id=c.id)
        session.add(cp)

    session.commit()

    return jsonify(success=True, message="Check has been saved successfully!")
Exemple #15
0
def scheduling_add():
    name = request.form.get("name")
    description = request.form.get("description")
    interval_starts = request.form.getlist("interval-start[]")
    interval_values = request.form.getlist("interval-value[]")
    interval_units = request.form.getlist("interval-unit[]")
    checks = request.form.getlist("checks[]")

    if not name:
        return error_response("You must supply a name for this schedule")

    s = Schedule(name=name, description=description)
    session.add(s)
    session.flush()

    for check_id in checks:
        sc = ScheduleCheck(check_id=check_id, schedule_id=s.id)
        session.add(sc)

    for interval in zip(interval_starts, interval_values, interval_units):
        try:
            start_timestamp = datetime.strptime(interval[0], "%Y-%m-%d %H:%M:%S")
        except ValueError:
            return error_response("Start timestamp for interval was not "
                "understood")
        si = ScheduleInterval(schedule_id=s.id,
            start_timestamp=start_timestamp)
        try:
            si.set_interval(int(interval[1]), interval[2])
        except ValueError:
            return error_response("Interval must be an integer")
        session.add(si)

    session.commit()

    return jsonify(success=True,
        message="Schedule has been added successfully")
Exemple #16
0
def alerts_add():
    name = request.form.get("name")
    entity_selection = request.form.get("entity-selection")
    host_groups = request.form.getlist("host-groups[]")
    hosts = request.form.getlist("hosts[]")
    checks = request.form.getlist("checks[]")
    services = request.form.getlist("services[]")
    plugins = request.form.getlist("plugins[]")
    from_states = request.form.getlist("from-states[]")
    to_states = request.form.getlist("to-states[]")
    module_selection = request.form.get("module-selection")

    if not name:
        return error_response("You must specify a name for this alert")

    if not from_states or not to_states:
        return error_response("You must specify at least one from state and at "
            "least one to state")

    if not module_selection:
        return error_response("You must select a module to use for this alert")

    alert = Alert(name=name, entity_selection_type=entity_selection,
        module=module_selection)
    session.add(alert)
    session.flush()
    for state in to_states:
        session.add(AlertTransitionTo(alert_id=alert.id, state=state))

    for state in from_states:
        session.add(AlertTransitionFrom(alert_id=alert.id, state=state))

    if entity_selection == "custom":
        added_entity = False
        for host_id in hosts:
            session.add(AlertCheckEntity(alert_id=alert.id, host_id=host_id))
            added_entity = True
        for host_group_id in host_groups:
            session.add(AlertCheckEntity(alert_id=alert.id,
                host_group_id=host_group_id))
            added_entity = True
        for service_id in services:
            session.add(AlertCheckEntity(alert_id=alert.id,
                service_id=service_id))
            added_entity = True

        if not added_entity:
            session.rollback()
            return error_response("You must select at least one entity to alert"
                " for state changes in")

    for check_id in checks:
        session.add(AlertRestrictToEntity(alert_id=alert.id, check_id=check_id))
    for plugin_id in plugins:
        session.add(AlertRestrictToEntity(alert_id=alert.id,
            plugin_id=plugin_id))

    for key in request.form.keys():
        if key.startswith("module-option-"):
            option_key = key.replace("module-option-", "", 1)
            option_value = request.form.get(key)
            session.add(AlertModuleOption(alert_id=alert.id, key=option_key,
                value=option_value))

    session.commit()
    return jsonify(success=True, message="Alert has been added successfully")
Exemple #17
0
def plugins_install():
    plugin_file = request.files.get("plugin")
    if not plugin_file:
        return error_response("File not specified")
    signature_file = request.files.get("signature")

    allow_overwrite = request.args.get("allow-overwrite")

    temp_dir_path = get_config_value(config, "temp_dir")
    plugin_repo = get_config_value(config, "plugin_repo")
    filename = str(uuid.uuid4())
    try:
        plugin_file.save(os.path.join(temp_dir_path,
            filename + ".tar.gz"))
    except Exception as e:
        return error_response("Failed to create temporary file: {0}".format(
            str(e)))

    try:
        plugin_archive = tarfile.open(os.path.join(temp_dir_path,
            filename + ".tar.gz"))
        os.mkdir(os.path.join(temp_dir_path, filename))

        plugin_archive.extractall(os.path.join(temp_dir_path, filename))
    except Exception as e:
        return error_response("Failed to extract plugin: {0}".format(
            str(e)))

    plugin_temp_path = os.path.join(temp_dir_path, filename)

    try:
        directory = os.listdir(plugin_temp_path)[0]
        with open(os.path.join(plugin_temp_path, directory,
            "manifest.json")) as f:
            manifest = json.load(f)
    except (KeyError, FileNotFoundError):
        return error_response("Manifest could not be found within the "
            "plugin archive")

    try:
        p = Plugin.query.get(manifest["id"])
    except KeyError:
        return error_response("ID could not be found in plugin manifest "
            "file")

    if not allow_overwrite and p:
        return jsonify(success=True, result="plugin_exists")

    if signature_file:
        try:
            signature_file.save(os.path.join(plugin_repo,
                filename + ".tar.gz.sig"))
        except Exception as e:
            return error_response("Failed to save signature file: {}".format(
                str(e)))

    oldfile = None
    if p:
        oldfile = p.archive_file
        oldsig = p.signature_file
    else:
        p = Plugin()

    try:
        p.id = manifest["id"]
        p.name = manifest["name"]
        p.description = manifest["description"]
        p.version = manifest["version"]
        p.view = manifest["view"]
        if (p.view == "custom"):
            try:
                with open(os.path.join(plugin_temp_path, directory,
                    manifest["view_source"])) as f:
                    p.view_source = f.read()
            except FileNotFoundError:
                return error_response("View source file could not be found")
        p.archive_file = filename + ".tar.gz"
        if signature_file:
            p.signature_file = filename + ".tar.gz.sig"
        else:
            p.signature_file = None
    except KeyError:
        return error_response("Manifest file is missing some requied keys")

    if oldfile:
        try:
            os.remove(os.path.join(plugin_repo, oldfile))
            if oldsig:
                os.remove(os.path.join(plugin_repo, oldsig))
        except FileNotFoundError:
            # We don't care if the file doesn't exist as we are deleting it
            pass
    else:
        session.add(p)
        session.flush()

    # If there is a default classifier in the manifest file, add it
    # Only do this if this is a new installation, i.e. don't overwrite existing
    # classifiers
    if not oldfile and "default_classifier" in manifest \
        and "default_n_historical" in manifest:
        try:
            default_n_historical = int(manifest["default_n_historical"])
        except ValueError:
            return error_response("Value for default_n_historical in manifest "
                "must be an integer")

        try:
            with open(os.path.join(plugin_temp_path, directory,
                manifest["default_classifier"]), "r") as f:
                classification_code = f.read()
        except FileNotFoundError:
            return error_response("Default classifier file could not be found")

        pt = PluginThreshold(plugin_id=p.id, default=True,
            n_historical=manifest["default_n_historical"],
            classification_code=classification_code)
        session.add(pt)

    shutil.move(os.path.join(temp_dir_path, p.archive_file),
        plugin_repo)
    session.commit()

    if oldfile:
        return jsonify(success=True, result="plugin_updated")
    else:
        return jsonify(success=True, result="plugin_installed")
def plugins_install():
    plugin_file = request.files.get("plugin")
    if not plugin_file:
        return error_response("File not specified")
    signature_file = request.files.get("signature")

    allow_overwrite = request.args.get("allow-overwrite")

    temp_dir_path = get_config_value(config, "temp_dir")
    plugin_repo = get_config_value(config, "plugin_repo")
    filename = str(uuid.uuid4())
    try:
        plugin_file.save(os.path.join(temp_dir_path,
            filename + ".tar.gz"))
    except Exception as e:
        return error_response("Failed to create temporary file: {0}".format(
            str(e)))

    try:
        plugin_archive = tarfile.open(os.path.join(temp_dir_path,
            filename + ".tar.gz"))
        os.mkdir(os.path.join(temp_dir_path, filename))

        plugin_archive.extractall(os.path.join(temp_dir_path, filename))
    except Exception as e:
        return error_response("Failed to extract plugin: {0}".format(
            str(e)))

    plugin_temp_path = os.path.join(temp_dir_path, filename)

    try:
        directory = os.listdir(plugin_temp_path)[0]
        with open(os.path.join(plugin_temp_path, directory,
            "manifest.json")) as f:
            manifest = json.load(f)
    except (KeyError, FileNotFoundError):
        return error_response("Manifest could not be found within the "
            "plugin archive")

    try:
        p = Plugin.query.get(manifest["id"])
    except KeyError:
        return error_response("ID could not be found in plugin manifest "
            "file")

    if not allow_overwrite and p:
        return jsonify(success=True, result="plugin_exists")

    if signature_file:
        try:
            signature_file.save(os.path.join(plugin_repo,
                filename + ".tar.gz.sig"))
        except Exception as e:
            return error_response("Failed to save signature file: {}".format(
                str(e)))

    oldfile = None
    if p:
        oldfile = p.archive_file
        oldsig = p.signature_file
    else:
        p = Plugin()

    try:
        p.id = manifest["id"]
        p.name = manifest["name"]
        p.description = manifest["description"]
        p.version = manifest["version"]
        p.view = manifest["view"]
        if (p.view == "custom"):
            try:
                with open(os.path.join(plugin_temp_path, directory,
                    manifest["view_source"])) as f:
                    p.view_source = f.read()
            except FileNotFoundError:
                return error_response("View source file could not be found")
        p.archive_file = filename + ".tar.gz"
        if signature_file:
            p.signature_file = filename + ".tar.gz.sig"
        else:
            p.signature_file = None
    except KeyError:
        return error_response("Manifest file is missing some requied keys")

    if oldfile:
        try:
            os.remove(os.path.join(plugin_repo, oldfile))
            if oldsig:
                os.remove(os.path.join(plugin_repo, oldsig))
        except FileNotFoundError:
            # We don't care if the file doesn't exist as we are deleting it
            pass
    else:
        session.add(p)
        session.flush()

    # If there is a default classifier in the manifest file, add it
    # Only do this if this is a new installation, i.e. don't overwrite existing
    # classifiers
    if not oldfile and "default_classifier" in manifest \
        and "default_n_historical" in manifest:
        try:
            default_n_historical = int(manifest["default_n_historical"])
        except ValueError:
            return error_response("Value for default_n_historical in manifest "
                "must be an integer")

        try:
            with open(os.path.join(plugin_temp_path, directory,
                manifest["default_classifier"]), "r") as f:
                classification_code = f.read()
        except FileNotFoundError:
            return error_response("Default classifier file could not be found")

        pt = PluginThreshold(plugin_id=p.id, default=True,
            n_historical=manifest["default_n_historical"],
            classification_code=classification_code)
        session.add(pt)

    shutil.move(os.path.join(temp_dir_path, p.archive_file),
        plugin_repo)
    session.commit()

    if oldfile:
        return jsonify(success=True, result="plugin_updated")
    else:
        return jsonify(success=True, result="plugin_installed")