33 #include "cmdhandler.h" 40 #include "clientpipe.h" 47 static const char *module_str =
"backup_hsmkeys_cmd";
67 ods_log_error(
"[%s] database error", module_str);
75 ods_log_error(
"[%s] database error", module_str);
91 int keys_marked = hsmkeys_from_to_state(dbconn, clause_list,
93 if (keys_marked < 0) {
96 client_printf(sockfd,
"info: keys flagged for backup: %d\n", keys_marked);
103 int keys_marked = hsmkeys_from_to_state(dbconn, clause_list,
105 if (keys_marked < 0) {
108 client_printf(sockfd,
"info: keys marked backup done: %d\n", keys_marked);
115 int keys_marked = hsmkeys_from_to_state(dbconn, clause_list,
117 if (keys_marked < 0) {
120 client_printf(sockfd,
"info: keys unflagged for backup: %d\n", keys_marked);
129 char const *fmt =
"%-32s %-16s %-16s\n";
133 ods_log_error(
"[%s] database error", module_str);
137 client_printf_err(sockfd, fmt,
"Locator:",
"Repository:",
"Backup state:");
150 client_printf(sockfd,
151 "backup [list|prepare|commit|rollback]\n" 152 " --repository <repository> aka -r\n");
158 client_printf(sockfd,
159 "If the <RequireBackup/> option is given for a <Repository> in " 160 "conf.xml, OpenDNSSEC will not publish records using key material " 161 "not marked as backed up. Backing up key material is " 162 "be done repository wide and is a 2-step process. First the " 163 "operator issues a 'prepare' and after backing up a 'commit'. " 164 "This avoids race conditions where the operator and the enforcer " 165 "disagree on which keys are actually backed up.\n\n" 167 "NOTICE: OpenDNSSEC does not backup key material it self. It is " 168 "the operators responsibility to do this. This merely keeps track " 169 "of the state and acts as a safety net.\n\n" 171 "backup list:\t Print backup status of keys.\n" 172 "backup prepare:\t Flag the keys as 'to be backed up'.\n" 173 "backup commit:\t Mark flagged keys as backed up.\n" 174 "backup rollback: Cancel a 'backup prepare' action.\n" 176 "-r <repository>:\t Limit operations to this repository only.\n\n");
180 handles(
const char *cmd)
182 if (ods_check_command(cmd,
"backup"))
return 1;
183 if (ods_check_command(cmd,
"backup prepare"))
return 1;
184 if (ods_check_command(cmd,
"backup commit"))
return 1;
185 if (ods_check_command(cmd,
"backup rollback"))
return 1;
186 if (ods_check_command(cmd,
"backup list"))
return 1;
191 run(
int sockfd, cmdhandler_ctx_type* context,
const char *cmd)
194 const char *argv[
NARGV];
195 int argc = 0, long_index = 0, opt = 0;
196 const char *repository = NULL;
197 char buf[ODS_SE_MAXLINE];
202 static struct option long_options[] = {
203 {
"repository", required_argument, 0,
'r'},
207 strncpy(buf, cmd, ODS_SE_MAXLINE);
208 buf[
sizeof(buf)-1] =
'\0';
210 argc = ods_str_explode(buf,
NARGV, argv);
212 client_printf_err(sockfd,
"too many arguments\n");
213 ods_log_error(
"[%s] too many arguments for %s command",
219 while ((opt = getopt_long(argc, (
char*
const*)argv,
"r:", long_options, &long_index)) != -1) {
225 client_printf_err(sockfd,
"unknown arguments\n");
226 ods_log_error(
"[%s] unknown arguments for %s command",
234 ods_log_error(
"[%s] database error", module_str);
239 ods_log_error(
"[%s] Could not get key list", module_str);
244 if (ods_check_command(cmd,
"backup prepare"))
245 status = prepare(sockfd, dbconn, clause_list);
246 else if (ods_check_command(cmd,
"backup commit"))
247 status = commit(sockfd, dbconn, clause_list);
248 else if (ods_check_command(cmd,
"backup rollback"))
249 status = rollback(sockfd, dbconn, clause_list);
250 else if (ods_check_command(cmd,
"backup list"))
251 status = list(sockfd, dbconn, clause_list);
260 "backup", &usage, &help, &handles, &run
db_clause_list_t * db_clause_list_new(void)
const hsm_key_t * hsm_key_list_next(hsm_key_list_t *hsm_key_list)
int hsm_key_set_backup(hsm_key_t *hsm_key, hsm_key_backup_t backup)
const char * hsm_key_repository(const hsm_key_t *hsm_key)
void db_clause_list_free(db_clause_list_t *clause_list)
db_clause_t * hsm_key_backup_clause(db_clause_list_t *clause_list, hsm_key_backup_t backup)
db_connection_t * getconnectioncontext(cmdhandler_ctx_type *context)
int hsm_key_update(hsm_key_t *hsm_key)
const char * hsm_key_locator(const hsm_key_t *hsm_key)
char const * hsm_key_to_backup_state(hsm_key_t const *hsm_key)
db_clause_t * hsm_key_repository_clause(db_clause_list_t *clause_list, const char *repository_text)
hsm_key_t * hsm_key_list_get_next(hsm_key_list_t *hsm_key_list)
void hsm_key_free(hsm_key_t *hsm_key)
hsm_key_list_t * hsm_key_list_new_get_by_clauses(const db_connection_t *connection, const db_clause_list_t *clause_list)
void hsm_key_list_free(hsm_key_list_t *hsm_key_list)
enum hsm_key_backup hsm_key_backup_t
struct cmd_func_block backup_funcblock