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)
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}")
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)
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}")
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)
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)
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)
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)
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)
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)
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)
def get(self): data = { "status": "running", } return response(200, data=data, message="OK")
def get(self): data = {"check": "100"} return response(200, data=data, message="OK")
def get(self): build = helpers.read_version("requirements.txt", "build-version.txt") data = {"build": build} return response(200, data=data, message="OK")