Files
LuckFox-RV1103-1106/project/app/ipcweb/ipcweb-backend/src/storage_api.cpp
T
luckfox-eng29 8f34c2760d project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between
the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door
for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more
usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp:
Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for
compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem.
sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device
tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately.
sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick
boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades.
sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for
fastboot.

Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
2024-10-14 09:47:04 +08:00

893 lines
34 KiB
C++

// Copyright 2019 Fuzhou Rockchip Electronics Co., Ltd. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "storage_api.h"
#include "common.h"
#include <time.h>
#include <unistd.h>
namespace rockchip {
namespace cgi {
#ifdef USE_RKIPC
nlohmann::json get_snap_plan_0() {
nlohmann::json param;
char *tmp = new char[256];
int value = 0;
param.emplace("id", 0);
param.emplace("iShotNumber", 1);
param.emplace("sImageType", "JPEG");
rk_video_get_enable_cycle_snapshot(&value);
param.emplace("iEnabled", value);
rk_video_get_image_quality(&value);
param.emplace("iImageQuality", value);
rk_video_get_snapshot_interval_ms(&value);
param.emplace("iShotInterval", value);
rk_video_get_jpeg_resolution(&tmp);
param.emplace("sResolution", tmp);
delete[] tmp;
return param;
}
int set_snap_plan_0(nlohmann::json param) {
int value_int;
std::string value;
if (param.dump().find("iEnabled") != param.dump().npos) {
value_int = atoi(param.at("iEnabled").dump().c_str());
rk_video_set_enable_cycle_snapshot(value_int);
}
if (param.dump().find("iImageQuality") != param.dump().npos) {
value_int = atoi(param.at("iImageQuality").dump().c_str());
rk_video_set_image_quality(value_int);
}
if (param.dump().find("iShotInterval") != param.dump().npos) {
value_int = atoi(param.at("iShotInterval").dump().c_str());
rk_video_set_snapshot_interval_ms(value_int);
}
if (param.dump().find("sResolution") != param.dump().npos) {
value = param.at("sResolution").dump();
value.erase(0, 1).erase(value.end() - 1, value.end()); // erase \"
rk_video_set_jpeg_resolution(value.c_str());
}
return 0;
}
void StorageApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
int hdd_id = 3;
std::string path_api_resource;
std::string path_specific_resource;
std::string path_hdd_id;
nlohmann::json content;
#ifdef ENABLE_JWT
int user_level = Req.UserLevel;
#endif
/* Get Path Information */
int pos_first = Req.PathInfo.find_first_of("/");
path_api_resource = Req.PathInfo.substr(pos_first + 1, Req.PathInfo.size());
pos_first = path_api_resource.find_first_of("/");
if (pos_first != -1) {
path_specific_resource =
path_api_resource.substr(pos_first + 1, path_api_resource.size());
pos_first = path_specific_resource.find_first_of("/");
if (pos_first != -1)
path_hdd_id = path_specific_resource.substr(
pos_first + 1, path_specific_resource.size() + 1);
}
if (Req.Method == "GET") {
if (path_specific_resource.find("hdd-list") != std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/hdd-list */
content = R"(
[{
"iFormatProg": 0,
"iFormatStatus": 0,
"iFreeSize": 0,
"iMediaSize": 0,
"iTotalSize": 0,
"id": 1,
"sDev": "",
"sFormatErr": "",
"sMountPath": "/mnt/sdcard",
"sName": "SD Card",
"sStatus": "unmounted",
"sType": ""
}, {
"iFormatProg": 0,
"iFormatStatus": 0,
"iFreeSize": 12.0438613891602,
"iMediaSize": 60972,
"iTotalSize": 12.1327171325684,
"id": 3,
"sAttributes": "rw",
"sDev": "/dev/block/by-name/media",
"sFormatErr": "",
"sMountPath": "/userdata/media",
"sName": "Emmc",
"sStatus": "mounted",
"sType": "ext2"
}, {
"iFormatProg": 0,
"iFormatStatus": 0,
"iFreeSize": 0,
"iMediaSize": 0,
"iTotalSize": 0,
"id": 2,
"sDev": "",
"sFormatErr": "",
"sMountPath": "/media/usb0",
"sName": "U Disk",
"sStatus": "unmounted",
"sType": ""
}]
)"_json;
} else { /* path example is storage/hdd-list/1 */
// hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
// nlohmann::json hdd_list = storage_hdd_list_get();
// content = hdd_list.at(hdd_id - 1);
}
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("quota") != std::string::npos) {
// if (path_hdd_id.empty()) { /* path is storage/quota */
// // Can only get current storage device quota, here only for test
// for (int i = 0; i < storage_hdd_list_get().size(); i++) {
// content.push_back(storage_quota_get(i + 1));
// }
// } else { /* path example is storage/quota/1 */
// hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
// content = storage_quota_get(hdd_id);
// }
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("snap-plan") != std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/snap-plan */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
if (hdd_id == 0) { /* path is storage/snap-plan/0 */
content = get_snap_plan_0();
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (hdd_id == 1) { /* path is storage/snap-plan/1 */
content = R"(
{
"iEnabled": 0,
"iImageQuality": 90,
"iShotInterval": 1000,
"iShotNumber": 4,
"id": 1,
"sImageType": "JPEG",
"sResolution": "1920*1080"
}
)"_json;
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else if (!path_specific_resource.compare("current-path")) {
// /* path is storage/current-path */
// char *str = storage_manager_get_media_path();
// std::string path = nlohmann::json::parse(str).at("sMountPath");
// content.emplace("sMountPath", path);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("advance-para") !=
std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/advance-para */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id =
atoi((char *)path_hdd_id.substr(0, path_hdd_id.size()).c_str());
// char *str = dbserver_storage_get((char *)TABLE_STORAGE_ADVANCE_PARA);
if (!hdd_id) {
content = R"(
{
"iEnabled": 0,
"id": 0
}
)"_json;
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
int video_quota_ratio;
int picture_quota_ratio;
int camera_id = 0;
nlohmann::json diff;
nlohmann::json cfg_old;
nlohmann::json storage_config = Req.PostObject; /* must be json::object */
if (path_specific_resource.find("quota") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (path_hdd_id.empty()) { /* path is storage/quota */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else { /* path example is storage/quota/1 */
// nlohmann::json hdd_list = storage_hdd_list_get();
// hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
// std::string path_name = get_hdd_name_by_id(hdd_list, hdd_id);
// minilog_debug("quota path_name is %s\n", (char *)path_name.c_str());
// /* Set */
// if (!path_name.empty())
// dbserver_update_storage_config_mountpath((char
// *)path_name.c_str());
// else if (hdd_id == 1)
// dbserver_update_storage_config_mountpath((char *)"/mnt/sdcard");
// else if (hdd_id == 2)
// dbserver_update_storage_config_mountpath((char *)"/media/usb0");
// else if (hdd_id == 3)
// dbserver_update_storage_config_mountpath((char
// *)"/userdata/media");
// if (!storage_config.empty()) {
// video_quota_ratio =
// atoi(storage_config.at("iVideoQuotaRatio").dump().c_str());
// picture_quota_ratio =
// atoi(storage_config.at("iPictureQuotaRatio").dump().c_str());
// dbserver_update_storage_media_folder_duty(camera_id, 0,
// video_quota_ratio, -1);
// dbserver_update_storage_media_folder_duty(camera_id, 1,
// picture_quota_ratio, -1);
// }
// /* Get new info */
// content = storage_quota_get(hdd_id);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
}
} else if (path_specific_resource.find("format") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (path_hdd_id.empty()) { /* path is storage/format */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else { /* path is storage/format/1 */
// hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
// std::string path_name = get_hdd_name_by_id(NULL, hdd_id);
// minilog_debug("format path_name is %s\n", (char *)path_name.c_str());
// /* Set */
// if (!path_name.empty())
// storage_manager_diskformat((char *)path_name.c_str(), (char
// *)"fat32");
// else if (hdd_id == 1)
// storage_manager_diskformat((char *)"/mnt/sdcard", (char *)"fat32");
// else if (hdd_id == 2)
// storage_manager_diskformat((char *)"/media/usb0", (char *)"fat32");
// else if (hdd_id == 3)
// storage_manager_diskformat((char *)"/userdata/media", (char
// *)"fat32");
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
}
} else if (!path_specific_resource.compare("search")) {
// if (!storage_config.empty())
// content = search_file_list_get(storage_config);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("snap-plan") != std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/snap-plan */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
if (hdd_id == 0) { /* path is storage/snap-plan/0 */
/* Erase unchanged data */
cfg_old = get_snap_plan_0();
diff = nlohmann::json::diff(cfg_old, storage_config);
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
if (diff.dump().find(x.key()) == diff.dump().npos)
storage_config.erase(x.key());
}
/* Set */
if (!storage_config.empty())
set_snap_plan_0(storage_config);
/* Get new info */
content = get_snap_plan_0();
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (hdd_id == 1) { /* path is storage/snap-plan/1 */
// /* Erase unchanged data */
// cfg_old = storage_plan_get(1);
// diff = nlohmann::json::diff(cfg_old, storage_config);
// for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
// if (diff.dump().find(x.key()) == diff.dump().npos)
// storage_config.erase(x.key());
// }
// /* Set */
// if (!storage_config.empty())
// dbserver_set_storage_plan_snap(
// (char *)storage_config.dump().c_str(), 1);
// /* Get new info */
// content = storage_plan_get(1);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else if (path_specific_resource.find("advance-para") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (path_hdd_id.empty()) { /* path is storage/advance-para */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
if (!hdd_id) {
// char *str = dbserver_storage_get((char
// *)TABLE_STORAGE_ADVANCE_PARA);
// nlohmann::json old_config =
// nlohmann::json::parse(str).at("jData").at(hdd_id);
// nlohmann::json diff =
// nlohmann::json::diff(old_config, storage_config);
// for (auto &x : nlohmann::json::iterator_wrapper(old_config)) {
// if (diff.dump().find(x.key()) == diff.dump().npos)
// storage_config.erase(x.key());
// }
// if (!storage_config.empty()) {
// dbserver_storage_set((char *)TABLE_STORAGE_ADVANCE_PARA,
// (char *)storage_config.dump().c_str(),
// hdd_id);
// mediaserver_sync_schedules();
// }
// str = dbserver_storage_get((char *)TABLE_STORAGE_ADVANCE_PARA);
// content = nlohmann::json::parse(str).at("jData").at(hdd_id);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else if (path_specific_resource.find("delete") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
// nlohmann::json file_list = storage_config.at("name");
// std::string delete_type = storage_config.at("type");
// int rst = 1;
// if (!file_list.empty()) {
// rst = media_file_delete(delete_type, file_list);
// }
// content.emplace("rst", rst);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
#else // #ifdef USE_RKIPC
std::string file_address_get(std::string path, std::string name) {
std::string address;
std::string ipv4_address = ipv4_address_get();
address = "http://" + ipv4_address + path + "/" + name;
return address;
}
int file_path_get(std::string search_type) {
int path_id = -1;
if (!search_type.compare("video0"))
path_id = 0;
else if (!search_type.compare("photo0"))
path_id = 1;
else if (!search_type.compare("video1"))
path_id = 2;
else if (!search_type.compare("photo1"))
path_id = 3;
else if (!search_type.compare("black_list"))
path_id = 4;
else if (!search_type.compare("snapshot"))
path_id = 5;
else if (!search_type.compare("control"))
path_id = 5;
else if (!search_type.compare("white_list"))
path_id = 6;
return path_id;
}
nlohmann::json search_file_list_get(nlohmann::json search_config) {
int order = search_config.at("order");
int search_result_position = search_config.at("searchResultPosition");
int max_results = search_config.at("maxResults");
std::string limit = std::to_string(search_result_position) + "," +
std::to_string(max_results);
std::string search_type = search_config.at("searchType");
std::string start_time_s = search_config.at("startTime");
std::string end_time_s = search_config.at("endTime");
int start_time = standard_to_timestamp(start_time_s);
int end_time = standard_to_timestamp(end_time_s);
nlohmann::json file_list;
nlohmann::json search_result;
char *str = storage_manager_get_media_path();
nlohmann::json scan_path = nlohmann::json::parse(str).at("sScanPath");
int num_of_matches;
std::string path;
int path_id = file_path_get(search_type);
if (path_id < 0) {
search_result.emplace("matchList", NULL);
search_result.emplace("numOfMatches", 0);
return search_result;
}
path = scan_path.at(path_id).at("sMediaPath");
minilog_debug("path is %s", (char *)path.c_str());
str = storage_manager_get_filelist_path((char *)path.c_str(), &start_time,
&end_time, order, 0);
num_of_matches = nlohmann::json::parse(str).at("FILES").size();
str = storage_manager_get_filelist_path((char *)path.c_str(), &start_time,
&end_time, order,
(char *)limit.c_str());
nlohmann::json files = nlohmann::json::parse(str).at("FILES");
for (auto &x : nlohmann::json::iterator_wrapper(files)) {
nlohmann::json file;
std::string file_name = x.value().at("sNAME");
std::string file_address = file_address_get(path, file_name);
std::string file_size_s = x.value().at("sSIZE");
float file_size = stoi(file_size_s) / 1024.0 / 1024.0; // Byet to MByte
// Stamp time to standard time.
const long int stamp_time = x.value().at("iTIME");
char file_time[30];
struct tm *time_info = localtime(&stamp_time);
strftime(file_time, 30, "%FT%T", time_info);
file.emplace("fileId", stoi(x.key()));
file.emplace("fileName", file_name);
file.emplace("fileAddress", file_address);
file.emplace("fileSize", file_size);
file.emplace("fileTime", file_time);
file_list.push_back(file);
}
search_result.emplace("matchList", file_list);
search_result.emplace("numOfMatches", num_of_matches);
return search_result;
}
nlohmann::json storage_hdd_list_get(void) {
char *disks_status = storage_manager_get_disks_status((char *)"");
nlohmann::json disks_info = nlohmann::json::parse(disks_status);
nlohmann::json hdd_list;
float value;
for (auto &x : nlohmann::json::iterator_wrapper(disks_info)) {
int hdd_id = atoi(x.key().c_str());
std::string attributes = disks_info.at(hdd_id).at("sAttributes");
std::string type = disks_info.at(hdd_id).at("sType");
if (disks_info.at(hdd_id).at("iStatus") == 1) {
disks_info.at(hdd_id).emplace("sStatus", "mounted");
} else {
disks_info.at(hdd_id).emplace("sStatus", "unmounted");
}
disks_info.at(hdd_id).erase("iStatus");
// Filter information except read, such as relaxtime, etc.
disks_info.at(hdd_id).erase("sAttributes");
if (attributes.find("rw") != std::string::npos)
disks_info.at(hdd_id).emplace("sAttributes", "rw");
else if (attributes.find("ro") != std::string::npos)
disks_info.at(hdd_id).emplace("sAttributes", "ro");
else if (attributes.find("wo") != std::string::npos)
disks_info.at(hdd_id).emplace("sAttributes", "wo");
// convent Byte to Giga Byte
value = atoi(disks_info.at(hdd_id).at("iFreeSize").dump().c_str());
value /= 1024 * 1024;
disks_info.at(hdd_id).erase("iFreeSize");
disks_info.at(hdd_id).emplace("iFreeSize", value);
value = atoi(disks_info.at(hdd_id).at("iTotalSize").dump().c_str());
value /= 1024 * 1024;
disks_info.at(hdd_id).erase("iTotalSize");
disks_info.at(hdd_id).emplace("iTotalSize", value);
// disks_info.at(hdd_id).erase("sType");
// if (type.find("nfts") != std::string::npos)
// disks_info.at(hdd_id).emplace("sType", "network");
// else
// disks_info.at(hdd_id).emplace("sType", "local");
}
for (int i = 0; i < disks_info.size(); i++) {
hdd_list.push_back(disks_info.at(i));
}
return hdd_list;
}
nlohmann::json storage_quota_get(int hdd_id) {
char *media_info = storage_manager_get_media_path();
nlohmann::json hdd_list = storage_hdd_list_get();
nlohmann::json quota_info = nlohmann::json::object();
nlohmann::json hdd_info = hdd_list.at(hdd_id - 1);
nlohmann::json scan_path = nlohmann::json::parse(media_info).at("sScanPath");
// Temporarily default all disks to camera 0
nlohmann::json video_info = scan_path.at(0);
nlohmann::json photo_info = scan_path.at(1);
float total_volume = atof(hdd_info.at("iTotalSize").dump().c_str());
float free_volume = atof(hdd_info.at("iFreeSize").dump().c_str());
int picture_quota_ratio = atoi(photo_info.at("iDuty").dump().c_str());
float picture_total_volume = total_volume * picture_quota_ratio / 100;
float picture_use_volume =
atof(photo_info.at("iUseSize").dump().c_str()) / 1024 / 1024;
float picture_free_quota = picture_total_volume - picture_use_volume;
int video_quota_ratio = atoi(video_info.at("iDuty").dump().c_str());
float video_total_volume = total_volume * video_quota_ratio / 100;
float video_use_volume =
atof(video_info.at("iUseSize").dump().c_str()) / 1024 / 1024;
;
float video_free_quota = video_total_volume - video_use_volume;
// Avoid negative free space on unmounted disks
if (!picture_total_volume)
picture_free_quota = 0;
if (!video_total_volume)
video_free_quota = 0;
quota_info.emplace("id", hdd_id);
quota_info.emplace("iTotalPictureVolume", picture_total_volume);
quota_info.emplace("iFreePictureQuota", picture_free_quota);
quota_info.emplace("iPictureQuotaRatio", picture_quota_ratio);
quota_info.emplace("iTotalVideoVolume", video_total_volume);
quota_info.emplace("iFreeVideoQuota", video_free_quota);
quota_info.emplace("iVideoQuotaRatio", video_quota_ratio);
// quota_info = nlohmann::json::parse(media_info);
return quota_info;
}
nlohmann::json storage_plan_get(int id) {
char *str = dbserver_get_storage_plan_snap(id);
nlohmann::json rst = nlohmann::json::parse(str).at("jData").at(0);
rst.erase("id");
return rst;
}
int media_file_delete(std::string delete_type, nlohmann::json file_list) {
int path_id = file_path_get(delete_type);
if (path_id < 0) {
return 0;
}
char *str = storage_manager_get_media_path();
nlohmann::json scan_path = nlohmann::json::parse(str).at("sScanPath");
std::string path = scan_path.at(path_id).at("sMediaPath");
for (auto &x : nlohmann::json::iterator_wrapper(file_list)) {
std::string delete_name = x.value();
if (delete_name.find("/") == std::string::npos) {
std::string delete_path = path + "/" + delete_name;
int rst = unlink((char *)delete_path.c_str());
} else {
minilog_debug("media_file_delete: unlaw name is %s",
(char *)delete_name.c_str());
}
}
return 1;
}
std::string get_hdd_name_by_id(nlohmann::json hdd_list, int id) {
if (NULL == hdd_list) {
hdd_list = storage_hdd_list_get();
}
for (auto &x : nlohmann::json::iterator_wrapper(hdd_list)) {
nlohmann::json pat = x.value();
int hdd_id = pat.at("id");
if (hdd_id == id) {
std::string mount_path = pat.at("sMountPath");
return mount_path;
}
}
return "";
}
void StorageApiHandler::handler(const HttpRequest &Req, HttpResponse &Resp) {
int hdd_id = 3;
std::string path_api_resource;
std::string path_specific_resource;
std::string path_hdd_id;
nlohmann::json content;
#ifdef ENABLE_JWT
int user_level = Req.UserLevel;
#endif
/* Get Path Information */
int pos_first = Req.PathInfo.find_first_of("/");
path_api_resource = Req.PathInfo.substr(pos_first + 1, Req.PathInfo.size());
pos_first = path_api_resource.find_first_of("/");
if (pos_first != -1) {
path_specific_resource =
path_api_resource.substr(pos_first + 1, path_api_resource.size());
pos_first = path_specific_resource.find_first_of("/");
if (pos_first != -1)
path_hdd_id = path_specific_resource.substr(
pos_first + 1, path_specific_resource.size() + 1);
}
if (Req.Method == "GET") {
if (path_specific_resource.find("hdd-list") != std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/hdd-list */
content = storage_hdd_list_get();
} else { /* path example is storage/hdd-list/1 */
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
nlohmann::json hdd_list = storage_hdd_list_get();
content = hdd_list.at(hdd_id - 1);
}
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("quota") != std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/quota */
// Can only get current storage device quota, here only for test
for (int i = 0; i < storage_hdd_list_get().size(); i++) {
content.push_back(storage_quota_get(i + 1));
}
} else { /* path example is storage/quota/1 */
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
content = storage_quota_get(hdd_id);
}
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("snap-plan") != std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/snap-plan */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
if (hdd_id == 0) { /* path is storage/snap-plan/0 */
content = storage_plan_get(hdd_id);
content.erase("iShotNumber");
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (hdd_id == 1) { /* path is storage/snap-plan/1 */
content = storage_plan_get(hdd_id);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else if (!path_specific_resource.compare("current-path")) {
/* path is storage/current-path */
char *str = storage_manager_get_media_path();
std::string path = nlohmann::json::parse(str).at("sMountPath");
content.emplace("sMountPath", path);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("advance-para") !=
std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/advance-para */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id =
atoi((char *)path_hdd_id.substr(0, path_hdd_id.size()).c_str());
char *str = dbserver_storage_get((char *)TABLE_STORAGE_ADVANCE_PARA);
if (!hdd_id) {
content = nlohmann::json::parse(str).at("jData").at(hdd_id);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else if ((Req.Method == "POST") || (Req.Method == "PUT")) {
int video_quota_ratio;
int picture_quota_ratio;
int camera_id = 0;
nlohmann::json diff;
nlohmann::json cfg_old;
nlohmann::json storage_config = Req.PostObject; /* must be json::object */
if (path_specific_resource.find("quota") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (path_hdd_id.empty()) { /* path is storage/quota */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else { /* path example is storage/quota/1 */
nlohmann::json hdd_list = storage_hdd_list_get();
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
std::string path_name = get_hdd_name_by_id(hdd_list, hdd_id);
minilog_debug("quota path_name is %s\n", (char *)path_name.c_str());
/* Set */
if (!path_name.empty())
dbserver_update_storage_config_mountpath((char *)path_name.c_str());
else if (hdd_id == 1)
dbserver_update_storage_config_mountpath((char *)"/mnt/sdcard");
else if (hdd_id == 2)
dbserver_update_storage_config_mountpath((char *)"/media/usb0");
else if (hdd_id == 3)
dbserver_update_storage_config_mountpath((char *)"/userdata/media");
if (!storage_config.empty()) {
video_quota_ratio =
atoi(storage_config.at("iVideoQuotaRatio").dump().c_str());
picture_quota_ratio =
atoi(storage_config.at("iPictureQuotaRatio").dump().c_str());
dbserver_update_storage_media_folder_duty(camera_id, 0,
video_quota_ratio, -1);
dbserver_update_storage_media_folder_duty(camera_id, 1,
picture_quota_ratio, -1);
}
/* Get new info */
content = storage_quota_get(hdd_id);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
}
} else if (path_specific_resource.find("format") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (path_hdd_id.empty()) { /* path is storage/format */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else { /* path is storage/format/1 */
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
std::string path_name = get_hdd_name_by_id(NULL, hdd_id);
minilog_debug("format path_name is %s\n", (char *)path_name.c_str());
/* Set */
if (!path_name.empty())
storage_manager_diskformat((char *)path_name.c_str(),
(char *)"fat32");
else if (hdd_id == 1)
storage_manager_diskformat((char *)"/mnt/sdcard", (char *)"fat32");
else if (hdd_id == 2)
storage_manager_diskformat((char *)"/media/usb0", (char *)"fat32");
else if (hdd_id == 3)
storage_manager_diskformat((char *)"/userdata/media",
(char *)"fat32");
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
}
} else if (!path_specific_resource.compare("search")) {
if (!storage_config.empty())
content = search_file_list_get(storage_config);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (path_specific_resource.find("snap-plan") != std::string::npos) {
if (path_hdd_id.empty()) { /* path is storage/snap-plan */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
if (hdd_id == 0) { /* path is storage/snap-plan/0 */
/* Erase unchanged data */
cfg_old = storage_plan_get(0);
cfg_old.erase("iShotNumber");
diff = nlohmann::json::diff(cfg_old, storage_config);
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
if (diff.dump().find(x.key()) == diff.dump().npos)
storage_config.erase(x.key());
}
/* Set */
if (!storage_config.empty()) {
dbserver_set_storage_plan_snap(
(char *)storage_config.dump().c_str(), 0);
mediaserver_sync_schedules();
}
/* Get new info */
content = storage_plan_get(0);
content.erase("iShotNumber");
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else if (hdd_id == 1) { /* path is storage/snap-plan/1 */
/* Erase unchanged data */
cfg_old = storage_plan_get(1);
diff = nlohmann::json::diff(cfg_old, storage_config);
for (auto &x : nlohmann::json::iterator_wrapper(cfg_old)) {
if (diff.dump().find(x.key()) == diff.dump().npos)
storage_config.erase(x.key());
}
/* Set */
if (!storage_config.empty())
dbserver_set_storage_plan_snap(
(char *)storage_config.dump().c_str(), 1);
/* Get new info */
content = storage_plan_get(1);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else if (path_specific_resource.find("advance-para") !=
std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
if (path_hdd_id.empty()) { /* path is storage/advance-para */
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
} else {
hdd_id = atoi(path_hdd_id.substr(0, path_hdd_id.size()).c_str());
if (!hdd_id) {
char *str = dbserver_storage_get((char *)TABLE_STORAGE_ADVANCE_PARA);
nlohmann::json old_config =
nlohmann::json::parse(str).at("jData").at(hdd_id);
nlohmann::json diff =
nlohmann::json::diff(old_config, storage_config);
for (auto &x : nlohmann::json::iterator_wrapper(old_config)) {
if (diff.dump().find(x.key()) == diff.dump().npos)
storage_config.erase(x.key());
}
if (!storage_config.empty()) {
dbserver_storage_set((char *)TABLE_STORAGE_ADVANCE_PARA,
(char *)storage_config.dump().c_str(), hdd_id);
mediaserver_sync_schedules();
}
str = dbserver_storage_get((char *)TABLE_STORAGE_ADVANCE_PARA);
content = nlohmann::json::parse(str).at("jData").at(hdd_id);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
} else if (path_specific_resource.find("delete") != std::string::npos) {
#ifdef ENABLE_JWT
if (user_level > 1) {
Resp.setErrorResponse(HttpStatus::kUnauthorized, "Unauthorized");
return;
}
#endif
nlohmann::json file_list = storage_config.at("name");
std::string delete_type = storage_config.at("type");
int rst = 1;
if (!file_list.empty()) {
rst = media_file_delete(delete_type, file_list);
}
content.emplace("rst", rst);
Resp.setHeader(HttpStatus::kOk, "OK");
Resp.setApiData(content);
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
} else {
Resp.setErrorResponse(HttpStatus::kNotImplemented, "Not Implemented");
}
}
#endif
} // namespace cgi
} // namespace rockchip