in src/shell/commands/cold_backup.cpp [208:313]
bool modify_backup_policy(command_executor *e, shell_context *sc, arguments args)
{
static struct option long_options[] = {{"policy_name", required_argument, 0, 'p'},
{"add_app", required_argument, 0, 'a'},
{"remove_app", required_argument, 0, 'r'},
{"backup_interval_seconds", required_argument, 0, 'i'},
{"backup_history_count", required_argument, 0, 'c'},
{"start_time", required_argument, 0, 's'},
{0, 0, 0, 0}};
std::string policy_name;
std::vector<int32_t> add_appids;
std::vector<int32_t> remove_appids;
int64_t backup_interval_seconds = 0;
int32_t backup_history_count = 0;
std::string start_time;
std::vector<std::string> app_id_strs;
optind = 0;
while (true) {
int option_index = 0;
int c;
c = getopt_long(args.argc, args.argv, "p:a:r:i:c:s:", long_options, &option_index);
if (c == -1)
break;
switch (c) {
case 'p':
policy_name = optarg;
break;
case 'a':
app_id_strs.clear();
::dsn::utils::split_args(optarg, app_id_strs, ',');
for (const auto &s_appid : app_id_strs) {
int32_t appid = boost::lexical_cast<int32_t>(s_appid);
if (appid <= 0) {
fprintf(stderr, "add invalid app_id(%d) to policy\n", appid);
return false;
} else {
add_appids.emplace_back(boost::lexical_cast<int32_t>(s_appid));
}
}
break;
case 'r':
app_id_strs.clear();
::dsn::utils::split_args(optarg, app_id_strs, ',');
for (const auto &s_appid : app_id_strs) {
int32_t appid = boost::lexical_cast<int32_t>(s_appid);
if (appid <= 0) {
fprintf(stderr, "remove invalid app_id(%d) from policy\n", appid);
return false;
} else {
remove_appids.emplace_back(boost::lexical_cast<int32_t>(s_appid));
}
}
break;
case 'i':
backup_interval_seconds = boost::lexical_cast<int64_t>(optarg);
if (backup_interval_seconds < 0) {
fprintf(stderr,
"invalid backup_interval_seconds(%" PRId64 ")\n",
backup_interval_seconds);
return false;
}
break;
case 'c':
backup_history_count = boost::lexical_cast<int32_t>(optarg);
if (backup_history_count < 0) {
fprintf(stderr, "invalid backup_history_count(%d)\n", backup_history_count);
return false;
}
break;
case 's':
start_time = optarg;
break;
default:
return false;
}
}
if (policy_name.empty()) {
fprintf(stderr, "empty policy name\n");
return false;
}
if (!start_time.empty()) {
int32_t hour = 0, min = 0;
if (sscanf(start_time.c_str(), "%d:%d", &hour, &min) != 2 || hour > 24 || hour < 0 ||
min >= 60 || min < 0 || (hour == 24 && min > 0)) {
fprintf(stderr,
"invalid start time: %s, should like this hour:minute\n",
start_time.c_str());
return false;
}
}
dsn::error_code ret = sc->ddl_client->update_backup_policy(policy_name,
add_appids,
remove_appids,
backup_interval_seconds,
backup_history_count,
start_time);
if (ret != dsn::ERR_OK) {
fprintf(stderr, "modify backup policy failed, with err = %s\n", ret.to_string());
}
return true;
}