8f34c2760d
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>
893 lines
34 KiB
C++
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
|