33#include "cmdhandler.h"
40#include "clientpipe.h"
41#include "longgetopt.h"
48static const char *module_str =
"backup_hsmkeys_cmd";
68 ods_log_error(
"[%s] database error", module_str);
76 ods_log_error(
"[%s] database error", module_str);
92 int keys_marked = hsmkeys_from_to_state(dbconn, clause_list,
94 if (keys_marked < 0) {
97 client_printf(sockfd,
"info: keys flagged for backup: %d\n", keys_marked);
104 int keys_marked = hsmkeys_from_to_state(dbconn, clause_list,
106 if (keys_marked < 0) {
109 client_printf(sockfd,
"info: keys marked backup done: %d\n", keys_marked);
116 int keys_marked = hsmkeys_from_to_state(dbconn, clause_list,
118 if (keys_marked < 0) {
121 client_printf(sockfd,
"info: keys unflagged for backup: %d\n", keys_marked);
130 char const *fmt =
"%-32s %-16s %-16s\n";
134 ods_log_error(
"[%s] database error", module_str);
138 client_printf_err(sockfd, fmt,
"Locator:",
"Repository:",
"Backup state:");
151 client_printf(sockfd,
152 "backup [list|prepare|commit|rollback]\n"
153 " --repository <repository> aka -r\n");
159 client_printf(sockfd,
160 "If the <RequireBackup/> option is given for a <Repository> in "
161 "conf.xml, OpenDNSSEC will not publish records using key material "
162 "not marked as backed up. Backing up key material is "
163 "be done repository wide and is a 2-step process. First the "
164 "operator issues a 'prepare' and after backing up a 'commit'. "
165 "This avoids race conditions where the operator and the enforcer "
166 "disagree on which keys are actually backed up.\n\n"
168 "NOTICE: OpenDNSSEC does not backup key material it self. It is "
169 "the operators responsibility to do this. This merely keeps track "
170 "of the state and acts as a safety net.\n\n"
172 "backup list:\t Print backup status of keys.\n"
173 "backup prepare:\t Flag the keys as 'to be backed up'.\n"
174 "backup commit:\t Mark flagged keys as backed up.\n"
175 "backup rollback: Cancel a 'backup prepare' action.\n"
177 "-r <repository>:\t Limit operations to this repository only.\n\n");
181handles(
const char *cmd)
183 if (ods_check_command(cmd,
"backup"))
return 1;
184 if (ods_check_command(cmd,
"backup prepare"))
return 1;
185 if (ods_check_command(cmd,
"backup commit"))
return 1;
186 if (ods_check_command(cmd,
"backup rollback"))
return 1;
187 if (ods_check_command(cmd,
"backup list"))
return 1;
192run(cmdhandler_ctx_type* context,
int argc,
char* argv[])
194 int sockfd = context->sockfd;
195 struct longgetopt optctx;
196 int long_index = 0, opt = 0;
197 const char *repository = NULL;
202 static struct option long_options[] = {
203 {
"repository", required_argument, 0,
'r'},
207 for(opt = longgetopt(argc, argv,
"r:", long_options, &long_index, &optctx); opt != -1;
208 opt = longgetopt(argc, argv, NULL, long_options, &long_index, &optctx)) {
211 repository = optctx.optarg;
214 client_printf_err(sockfd,
"unknown arguments\n");
215 ods_log_error(
"[%s] unknown arguments for backup command", module_str);
222 ods_log_error(
"[%s] database error", module_str);
227 ods_log_error(
"[%s] Could not get key list", module_str);
232 if (ods_check_command(argv[1],
"prepare"))
233 status = prepare(sockfd, dbconn, clause_list);
234 else if (ods_check_command(argv[1],
"commit"))
235 status = commit(sockfd, dbconn, clause_list);
236 else if (ods_check_command(argv[1],
"rollback"))
237 status = rollback(sockfd, dbconn, clause_list);
238 else if (ods_check_command(argv[1],
"list"))
239 status = list(sockfd, dbconn, clause_list);
248 "backup", &usage, &help, &handles, NULL, &run, NULL
struct cmd_func_block backup_funcblock
db_clause_list_t * db_clause_list_new(void)
void db_clause_list_free(db_clause_list_t *clause_list)
db_connection_t * getconnectioncontext(cmdhandler_ctx_type *context)
void hsm_key_free(hsm_key_t *hsm_key)
const char * hsm_key_repository(const hsm_key_t *hsm_key)
const char * hsm_key_locator(const hsm_key_t *hsm_key)
const hsm_key_t * hsm_key_list_next(hsm_key_list_t *hsm_key_list)
int hsm_key_update(hsm_key_t *hsm_key)
void hsm_key_list_free(hsm_key_list_t *hsm_key_list)
db_clause_t * hsm_key_backup_clause(db_clause_list_t *clause_list, hsm_key_backup_t backup)
int hsm_key_set_backup(hsm_key_t *hsm_key, hsm_key_backup_t backup)
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)
hsm_key_list_t * hsm_key_list_new_get_by_clauses(const db_connection_t *connection, const db_clause_list_t *clause_list)
enum hsm_key_backup hsm_key_backup_t
@ HSM_KEY_BACKUP_BACKUP_REQUESTED
@ HSM_KEY_BACKUP_BACKUP_DONE
@ HSM_KEY_BACKUP_BACKUP_REQUIRED
char const * hsm_key_to_backup_state(hsm_key_t const *hsm_key)