Ejemplo n.º 1
0
    def post(self):
        """Add new domain (zone) with additional default record.

        note:
        SOA, NS, and CNAME records are added automatically when adding new domain
        """
        parser = reqparse.RequestParser()
        parser.add_argument("zone", type=str, required=True)
        parser.add_argument("user_id", type=int, required=True)
        args = parser.parse_args()
        zone = args["zone"]
        user_id = args["user_id"]

        # Validation
        if not model.is_unique(table="zone", field="zone", value=f"{zone}"):
            return response(409, message="Duplicate Zone")

        user = model.get_one(table="user", field="id", value=user_id)
        if not user:
            return response(404, message="User Not Found")

        try:
            validator.validate("ZONE", zone)
        except Exception as e:
            return response(422, message=f"{e}")

        try:
            zone_id = insert_zone(zone, user_id)

            # create zone config
            command.set_config(zone, zone_id, "conf-set")

            # create default records
            soa_record_id = insert_soa_default(zone_id)
            ns_record_ids = insert_ns_default(zone_id)
            cname_record_id = insert_cname_default(zone_id, zone)
            record_ids = [soa_record_id, *ns_record_ids, cname_record_id]
            command.set_default_zone(record_ids)

            command.delegate(zone, zone_id, "conf-set", "master")
            command.delegate(zone, zone_id, "conf-set", "slave")

            data_ = {"id": zone_id, "zone": zone}
            return response(201, data=data_)
        except Exception as e:
            current_app.logger.error(f"{e}")
            return response(500)
Ejemplo n.º 2
0
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument("ttl", type=str, required=True)
        args = parser.parse_args()
        ttl = args["ttl"]

        data = {"ttl": ttl}
        if not ttl:
            return response(422)

        try:
            inserted_id = model.insert(table="ttl", data=data)
            data_ = {"id": inserted_id, **data}

            return response(201, data=data_)
        except Exception as e:
            return response(500, message=f"{e}")
Ejemplo n.º 3
0
    def decorated_function(*args, **kwargs):
        user_key = request.headers.get("X-API-Key", None)
        app_key = os.environ.get("RESTKNOT_API_KEY")

        if user_key != app_key:
            return response(400, message="Access denied")

        return f(*args, **kwargs)
Ejemplo n.º 4
0
    def put(self, ttl_id):
        parser = reqparse.RequestParser()
        parser.add_argument("ttl", type=str, required=True)
        args = parser.parse_args()
        ttl = args["ttl"]

        if not ttl:
            return response(422)

        try:
            data = {"where": {"id": ttl_id}, "data": {"ttl": ttl}}
            row_count = model.update("ttl", data=data)
            if not row_count:
                return response(404)

            return response(200, data=data.get("data"))
        except Exception as e:
            return response(500, message=f"{e}")
Ejemplo n.º 5
0
    def get(self):
        user_id = request.args.get("id")
        email = request.args.get("email")
        try:
            if not any((user_id, email)):
                return response(422, "Problems parsing parameters")

            if user_id:
                user = model.get_one(table="user", field="id", value=user_id)
            if email:
                user = model.get_one(table="user", field="email", value=email)
            if not user:
                return response(404)

            return response(200, data=user)
        except Exception as e:
            current_app.logger.error(f"{e}")
            return response(500)
Ejemplo n.º 6
0
    def put(self, type_id):
        parser = reqparse.RequestParser()
        parser.add_argument("type", type=str, required=True)
        args = parser.parse_args()
        type_ = args["type"]

        if not type_:
            return response(422)

        try:
            data = {"where": {"id": type_id}, "data": {"type": type_}}
            row_count = model.update("type", data=data)
            if not row_count:
                return response(404)

            return response(200, data=data.get("data"))
        except Exception:
            return response(500)
Ejemplo n.º 7
0
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument("type", type=str, required=True)
        args = parser.parse_args()
        type_ = args["type"]

        data = {"type": type_}

        if not type_:
            return response(422)

        try:
            inserted_id = model.insert(table="type", data=data)

            data_ = {"id": inserted_id, **data}
            return response(201, data=data_)
        except Exception:
            return response(500)
Ejemplo n.º 8
0
    def post(self):
        parser = reqparse.RequestParser()
        parser.add_argument("email", type=str, required=True)
        args = parser.parse_args()
        email = args["email"]

        if not model.is_unique(table="user", field="email", value=f"{email}"):
            return response(409, message="Duplicate Email")

        try:
            validator.validate("EMAIL", email)
        except Exception as e:
            return response(422, message=f"{e}")

        try:
            data = {"email": email, "created_at": helpers.get_datetime()}

            inserted_id = model.insert(table="user", data=data)
            data_ = {"id": inserted_id, **data}
            return response(201, data=data_)
        except Exception as e:
            current_app.logger.error(f"{e}")
            return response(500)
Ejemplo n.º 9
0
    def get(self):
        zone_id = request.args.get("id")
        zone_name = request.args.get("name")

        if not any((zone_id, zone_name)):
            return response(422, "Problems parsing parameters")

        try:
            if zone_id:
                zone = model.get_one(table="zone", field="id", value=zone_id)

            if zone_name:
                zone = model.get_one(table="zone",
                                     field="zone",
                                     value=zone_name)

            if not zone:
                return response(404)

            data = domain_model.get_other_data(zone)
            return response(200, data=data)
        except Exception as e:
            current_app.logger.error(f"{e}")
            return response(500)
Ejemplo n.º 10
0
    def post(self):
        """Add new record.

        note:
        Adding any record with other record is allowed. IETF best practice
        is not handled automatically.  Knot didn't handle this too, and let the
        user know the standards themselves.
        See https://tools.ietf.org/html/rfc1912
        """
        parser = reqparse.RequestParser()
        parser.add_argument("zone", type=str, required=True)
        parser.add_argument("owner", type=str, required=True)
        parser.add_argument("rtype", type=str, required=True)
        parser.add_argument("rdata", type=str, required=True)
        parser.add_argument("ttl", type=str, required=True)
        args = parser.parse_args()
        owner = args["owner"].lower()
        rtype = args["rtype"].lower()
        rdata = args["rdata"]
        zone = args["zone"]
        ttl = args["ttl"]

        try:
            ttl_id = ttl_model.get_ttlid_by_ttl(ttl)

            type_id = type_model.get_typeid_by_rtype(rtype)
            zone_id = zone_model.get_zone_id(zone)
        except Exception as e:
            return response(404, message=f"{e}")

        try:
            rules.check_add(rtype, zone_id, type_id, owner, rdata, ttl_id)
        except Exception as e:
            return response(409, message=f"{e}")

        try:
            # rtype no need to be validated & no need to check its length
            # `get_typeid` will raise error for non existing rtype
            validator.validate(rtype, rdata)
            validator.validate("owner", owner)
        except Exception as e:
            return response(422, message=f"{e}")

        try:
            serial_resource = get_serial_resource(zone)
            check_serial_limit(serial_resource)
        except Exception as e:
            return response(429, message=f"{e}")

        try:
            data = {
                "owner": owner,
                "zone_id": zone_id,
                "type_id": type_id,
                "ttl_id": ttl_id,
            }
            record_id = model.insert(table="record", data=data)

            content_data = {"rdata": rdata, "record_id": record_id}
            model.insert(table="rdata", data=content_data)

            command.set_zone(record_id, "zone-set")

            # increment serial after adding new record
            rtype = type_model.get_type_by_recordid(record_id)
            if rtype != "SOA":
                update_serial(serial_resource)

            record = model.get_one(table="record", field="id", value=record_id)
            data = record_model.get_other_data(record)
            return response(201, data=data)
        except Exception as e:
            current_app.logger.error(f"{e}")
            return response(500)
Ejemplo n.º 11
0
    def put(self, record_id):
        parser = reqparse.RequestParser()
        parser.add_argument("zone", type=str, required=True)
        parser.add_argument("owner", type=str, required=True)
        parser.add_argument("rtype", type=str, required=True)
        parser.add_argument("rdata", type=str, required=True)
        parser.add_argument("ttl", type=str, required=True)
        args = parser.parse_args()
        owner = args["owner"].lower()
        rtype = args["rtype"].lower()
        rdata = args["rdata"]
        zone = args["zone"]
        ttl = args["ttl"]

        try:
            ttl_id = ttl_model.get_ttlid_by_ttl(ttl)
            record_model.is_exists(record_id)

            type_id = type_model.get_typeid_by_rtype(rtype)
            zone_id = zone_model.get_zone_id(zone)
        except Exception as e:
            return response(404, message=f"{e}")

        try:
            rules.check_edit(rtype, zone_id, type_id, owner, rdata, ttl_id, record_id)
        except Exception as e:
            return response(409, message=f"{e}")

        try:
            validator.validate(rtype, rdata)
            validator.validate("owner", owner)
        except Exception as e:
            return response(422, message=f"{e}")

        try:
            serial_resource = get_serial_resource(zone)
            check_serial_limit(serial_resource)
        except Exception as e:
            return response(429, message=f"{e}")

        try:
            data = {
                "where": {"id": record_id},
                "data": {
                    "owner": owner,
                    "zone_id": zone_id,
                    "type_id": type_id,
                    "ttl_id": ttl_id,
                },
            }
            content_data = {
                "where": {"record_id": record_id},
                "data": {"rdata": rdata, "record_id": record_id},
            }

            command.set_zone(record_id, "zone-unset")

            model.update("rdata", data=content_data)
            model.update("record", data=data)

            command.set_zone(record_id, "zone-set")

            # increment serial after adding new record
            rtype = type_model.get_type_by_recordid(record_id)
            if rtype != "SOA":
                update_serial(serial_resource, "02")

            record = model.get_one(table="record", field="id", value=record_id)
            data_ = record_model.get_other_data(record)
            return response(200, data=data_)
        except Exception as e:
            current_app.logger.error(f"{e}")
            return response(500)
Ejemplo n.º 12
0
 def get(self):
     data = {
         "status": "running",
     }
     return response(200, data=data, message="OK")
Ejemplo n.º 13
0
 def get(self):
     data = {"check": "100"}
     return response(200, data=data, message="OK")
Ejemplo n.º 14
0
    def get(self):
        build = helpers.read_version("requirements.txt", "build-version.txt")

        data = {"build": build}
        return response(200, data=data, message="OK")