Esempio n. 1
0
async def delete_area(area_id: str, reboot_processor: Optional[bool] = True):
    """
    Deletes the configuration related to the area <area_id>
    """
    if area_id.upper() == ALL_AREAS:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST,
                            detail=bad_request_serializer(
                                "Area with ID: 'ALL' cannot be deleted.",
                                error_type="Invalid ID"))
    config_dict = extract_config()
    areas_name = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in areas_name]
    areas_ids = [area["id"] for area in areas]
    try:
        index = areas_ids.index(area_id)
    except ValueError:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
                            detail=f"The area: {area_id} does not exist")

    config_dict.pop(f"Area_{index}")
    config_dict = reestructure_areas((config_dict))

    success = update_config(config_dict, reboot_processor)

    area_directory = os.path.join(os.getenv("AreaLogDirectory"), area_id)
    shutil.rmtree(area_directory)

    return handle_response(None, success, status.HTTP_204_NO_CONTENT)
Esempio n. 2
0
async def delete_area(area_id: str, reboot_processor: Optional[bool] = True):
    """
    Deletes the configuration related to the area <area_id>
    """
    if area_id.upper() == ALL_AREAS:
        delete_area_occupancy_rules(ALL_AREAS)
        raise HTTPException(
            status_code=status.HTTP_202_ACCEPTED,
            detail="Area with ID: 'ALL' cannot be deleted. However, its occupancy rules were deleted."
        )
    config_dict = extract_config()
    areas_name = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in areas_name]
    areas_ids = [area["id"] for area in areas]
    try:
        index = areas_ids.index(area_id)
    except ValueError:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The area: {area_id} does not exist")

    config_dict.pop(f"Area_{index}")
    config_dict = reestructure_areas(config_dict)

    success = update_config(config_dict, reboot_processor)

    delete_area_occupancy_rules(area_id)

    area_directory = os.path.join(os.getenv("AreaLogDirectory"), area_id)
    shutil.rmtree(area_directory)
    area_config_directory = os.path.join(os.getenv("AreaConfigDirectory"), area_id)
    shutil.rmtree(area_config_directory)

    return handle_response(None, success, status.HTTP_204_NO_CONTENT)
Esempio n. 3
0
async def create_area(new_area: AreaConfigDTO,
                      reboot_processor: Optional[bool] = True):
    """
    Adds a new area to the processor.
    """
    config_dict = extract_config()
    areas_name = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in areas_name]
    if new_area.id in [area["id"] for area in areas]:
        raise HTTPException(status_code=400, detail="Area already exists")

    cameras = [x for x in config_dict.keys() if x.startswith("Source_")]
    cameras = [map_camera(x, config_dict, []) for x in cameras]
    camera_ids = [camera["id"] for camera in cameras]
    if not all(x in camera_ids for x in new_area.cameras.split(",")):
        non_existent_cameras = set(
            new_area.cameras.split(",")) - set(camera_ids)
        raise HTTPException(
            status_code=404,
            detail=f"The cameras: {non_existent_cameras} do not exist")
    area_dict = map_to_config_file_format(new_area)
    config_dict[f"Area_{len(areas)}"] = area_dict

    success = update_config(config_dict, reboot_processor)
    return handle_response(area_dict, success, status.HTTP_201_CREATED)
Esempio n. 4
0
async def create_area(new_area: AreaConfigDTO,
                      reboot_processor: Optional[bool] = True):
    """
    Adds a new area to the processor.
    """
    config_dict = extract_config()
    areas_name = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in areas_name]
    if new_area.id in [area["id"] for area in areas]:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST,
                            detail=bad_request_serializer(
                                "Area already exists",
                                error_type="config duplicated area"))

    cameras = [x for x in config_dict.keys() if x.startswith("Source_")]
    cameras = [map_camera(x, config_dict, []) for x in cameras]
    camera_ids = [camera["id"] for camera in cameras]
    if not all(x in camera_ids for x in new_area.cameras.split(",")):
        non_existent_cameras = set(
            new_area.cameras.split(",")) - set(camera_ids)
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"The cameras: {non_existent_cameras} do not exist")
    area_dict = map_to_config_file_format(new_area)
    config_dict[f"Area_{len(areas)}"] = area_dict
    success = update_config(config_dict, reboot_processor)
    if not success:
        return handle_response(area_dict, success, status.HTTP_201_CREATED)
    return next(
        (area for area in get_areas() if area["id"] == area_dict["Id"]), None)
Esempio n. 5
0
async def edit_area(area_id: str,
                    edited_area: AreaConfigDTO,
                    reboot_processor: Optional[bool] = True):
    """
    Edits the configuration related to the area <area_id>
    """
    edited_area.id = area_id
    config_dict = extract_config()
    area_names = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in area_names]
    areas_ids = [area["id"] for area in areas]
    try:
        index = areas_ids.index(area_id)
    except ValueError:
        raise HTTPException(status_code=404,
                            detail=f"The area: {area_id} does not exist")

    cameras = [x for x in config_dict.keys() if x.startswith("Source_")]
    cameras = [map_camera(x, config_dict, []) for x in cameras]
    camera_ids = [camera["id"] for camera in cameras]
    if not all(x in camera_ids for x in edited_area.cameras.split(",")):
        non_existent_cameras = set(
            edited_area.cameras.split(",")) - set(camera_ids)
        raise HTTPException(
            status_code=404,
            detail=f"The cameras: {non_existent_cameras} do not exist")

    area_dict = map_to_config_file_format(edited_area)
    config_dict[f"Area_{index}"] = area_dict

    success = update_config(config_dict, reboot_processor)
    return handle_response(area_dict, success)
Esempio n. 6
0
def map_camera(camera_name, config, options=[]):
    camera_dict = map_section_from_config(camera_name, config)
    camera = config.get(camera_name)
    camera_id = camera.get("Id")
    image_string = None
    if "withImage" in options:
        image_string = get_camera_default_image_string(camera_id)
    camera_dict["image"] = image_string
    return camera_dict
Esempio n. 7
0
def update_app_config(app: AppDTO, reboot_processor: Optional[bool] = True):
    """
    Updates the app configuration of the processor
    """
    config_dict = extract_config()
    app_dict = map_to_config_file_format(app)
    config_dict["App"] = app_dict
    success = update_config(config_dict, reboot_processor)
    if not success:
        return handle_response(app_dict, success)
    return map_section_from_config("App", extract_config())
Esempio n. 8
0
def update_core_config(core: CoreDTO, reboot_processor: Optional[bool] = True):
    """
    Updates the core configuration of the processor
    """
    config_dict = extract_config()
    core_dict = map_to_config_file_format(core)
    config_dict["CORE"] = core_dict
    success = update_config(config_dict, reboot_processor)
    if not success:
        return handle_response(core_dict, success)
    return map_section_from_config("CORE", extract_config())
def update_detector_config(detector: DetectorDTO, reboot_processor: Optional[bool] = True):
    """
    Updates the detector configuration of the processor
    """
    config_dict = extract_config()
    detector_dict = map_to_config_file_format(detector)
    config_dict["Detector"] = detector_dict
    success = update_config(config_dict, reboot_processor)
    if not success:
        return handle_response(detector_dict, success)
    return map_section_from_config("Detector", extract_config())
def update_classifier_config(classifier: ClassifierDTO, reboot_processor: Optional[bool] = True):
    """
    Updates the classifier configuration of the processor
    """
    config_dict = extract_config()
    classifier_dict = map_to_config_file_format(classifier)
    config_dict["Classifier"] = classifier_dict
    success = update_config(config_dict, reboot_processor)
    if not success:
        return handle_response(classifier_dict, success)
    return map_section_from_config("Classifier", extract_config())
Esempio n. 11
0
def map_camera(camera_name, config, options=[]):
    camera_dict = map_section_from_config(camera_name, config)
    camera = config.get(camera_name)
    camera_id = camera.get("Id")
    image_string = None
    if "withImage" in options:
        image_string = get_camera_default_image_string(camera_id)
    camera_dict["image"] = image_string
    calibration_file_path = get_camera_calibration_path(settings.config, camera_id)
    camera_dict["has_been_calibrated"] = validate_file_exists_and_is_not_empty(calibration_file_path)
    roi_file_path = ObjectsFilteringPostProcessor.get_roi_file_path(camera_id, settings.config)
    camera_dict["has_defined_roi"] = validate_file_exists_and_is_not_empty(roi_file_path)
    in_out_file_path = InOutMetric.get_in_out_file_path(camera_id, settings.config)
    camera_dict["has_in_out_border"] = validate_file_exists_and_is_not_empty(in_out_file_path)
    return camera_dict
Esempio n. 12
0
async def edit_area(area_id: str, edited_area: AreaConfigDTO, reboot_processor: Optional[bool] = True):
    """
    Edits the configuration related to the area <area_id>
    """
    if area_id.upper() == ALL_AREAS:
        area = modify_area_all(edited_area)
        if edited_area.occupancy_rules:
            set_occupancy_rules(ALL_AREAS, edited_area.occupancy_rules)
        else:
            delete_area_occupancy_rules(ALL_AREAS)
        area["occupancy_rules"] = get_area_occupancy_rules(ALL_AREAS)
        return area

    edited_area.id = area_id
    config_dict = extract_config()
    area_names = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in area_names]
    areas_ids = [area["id"] for area in areas]
    try:
        index = areas_ids.index(area_id)
    except ValueError:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The area: {area_id} does not exist")

    cameras = [x for x in config_dict.keys() if x.startswith("Source_")]
    cameras = [map_camera(x, config_dict, []) for x in cameras]
    camera_ids = [camera["id"] for camera in cameras]
    if not all(x in camera_ids for x in edited_area.cameras.split(",")):
        non_existent_cameras = set(edited_area.cameras.split(",")) - set(camera_ids)
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"The cameras: {non_existent_cameras}"
                                                                          f"do not exist")

    occupancy_rules = edited_area.occupancy_rules
    del edited_area.occupancy_rules

    area_dict = map_to_config_file_format(edited_area)
    config_dict[f"Area_{index}"] = area_dict
    success = update_config(config_dict, reboot_processor)

    if occupancy_rules:
        set_occupancy_rules(edited_area.id, occupancy_rules)
    else:
        delete_area_occupancy_rules(area_id)

    if not success:
        return handle_response(area_dict, success)
    area = next((area for area in get_areas() if area["id"] == area_id), None)
    area["occupancy_rules"] = get_area_occupancy_rules(area["id"])
    return area
Esempio n. 13
0
async def delete_area(area_id: str, reboot_processor: Optional[bool] = True):
    """
    Deletes the configuration related to the area <area_id>
    """
    config_dict = extract_config()
    areas_name = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in areas_name]
    areas_ids = [area["id"] for area in areas]
    try:
        index = areas_ids.index(area_id)
    except ValueError:
        raise HTTPException(status_code=404,
                            detail=f"The area: {area_id} does not exist")

    config_dict.pop(f"Area_{index}")
    config_dict = reestructure_areas((config_dict))

    success = update_config(config_dict, reboot_processor)
    return handle_response(None, success, status.HTTP_204_NO_CONTENT)
Esempio n. 14
0
async def edit_area(area_id: str,
                    edited_area: AreaConfigDTO,
                    reboot_processor: Optional[bool] = True):
    """
    Edits the configuration related to the area <area_id>
    """
    if area_id.upper() == ALL_AREAS:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST,
                            detail=bad_request_serializer(
                                "Area with ID: 'ALL' cannot be edited.",
                                error_type="Invalid ID"))
    edited_area.id = area_id
    config_dict = extract_config()
    area_names = [x for x in config_dict.keys() if x.startswith("Area_")]
    areas = [map_section_from_config(x, config_dict) for x in area_names]
    areas_ids = [area["id"] for area in areas]
    try:
        index = areas_ids.index(area_id)
    except ValueError:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
                            detail=f"The area: {area_id} does not exist")

    cameras = [x for x in config_dict.keys() if x.startswith("Source_")]
    cameras = [map_camera(x, config_dict, []) for x in cameras]
    camera_ids = [camera["id"] for camera in cameras]
    if not all(x in camera_ids for x in edited_area.cameras.split(",")):
        non_existent_cameras = set(
            edited_area.cameras.split(",")) - set(camera_ids)
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND,
            detail=f"The cameras: {non_existent_cameras} do not exist")

    area_dict = map_to_config_file_format(edited_area)
    config_dict[f"Area_{index}"] = area_dict
    success = update_config(config_dict, reboot_processor)
    if not success:
        return handle_response(area_dict, success)
    return next((area for area in get_areas() if area["id"] == area_id), None)
def map_config(config, options):
    cameras_name = [x for x in config.keys() if x.startswith("Source_")]
    areas_name = [x for x in config.keys() if x.startswith("Area_")]
    source_post_processor = [
        x for x in config.keys() if x.startswith("SourcePostProcessor_")
    ]
    source_loggers = [
        x for x in config.keys() if x.startswith("SourceLogger_")
    ]
    area_loggers = [x for x in config.keys() if x.startswith("AreaLogger_")]
    periodic_tasks = [
        x for x in config.keys() if x.startswith("PeriodicTask_")
    ]
    return {
        "app":
        map_section_from_config("App", config),
        "api":
        map_section_from_config("API", config),
        "core":
        map_section_from_config("CORE", config),
        "cameras": [map_camera(x, config, options) for x in cameras_name],
        "areas": [map_section_from_config(x, config) for x in areas_name],
        "detector":
        map_section_from_config("Detector", config),
        "classifier":
        map_section_from_config("Classifier", config),
        "tracker":
        map_section_from_config("Tracker", config),
        "sourcePostProcessors":
        [map_section_from_config(x, config) for x in source_post_processor],
        "sourceLoggers":
        [map_section_from_config(x, config) for x in source_loggers],
        "areaLoggers":
        [map_section_from_config(x, config) for x in area_loggers],
        "periodicTasks":
        [map_section_from_config(x, config) for x in periodic_tasks],
    }
def get_classifier_config():
    """
    Returns the classifier configuration of the processor
    """
    return map_section_from_config("Classifier", extract_config())
Esempio n. 17
0
def get_core_config():
    """
    Returns the core configuration of the processor
    """
    return map_section_from_config("CORE", extract_config())
Esempio n. 18
0
def get_source_post_processors():
    config = extract_config(config_type="source_post_processors")
    return [map_section_from_config(x, config) for x in config.keys()]
def get_detector_config():
    """
    Returns the detector configuration of the processor
    """
    return map_section_from_config("Detector", extract_config())
Esempio n. 20
0
def get_areas():
    config = extract_config(config_type="areas")
    return [map_section_from_config(x, config) for x in config.keys()]
Esempio n. 21
0
def get_tracker_config():
    """
    Returns the tracker configuration of the processor
    """
    return map_section_from_config("Tracker", extract_config())
Esempio n. 22
0
def get_periodic_tasks():
    config = extract_config(config_type="periodic_tasks")
    return [map_section_from_config(x, config) for x in config.keys()]
Esempio n. 23
0
def get_app_config():
    """
    Returns the app configuration of the processor
    """
    return map_section_from_config("App", extract_config())