OpenDNSSEC-enforcer  2.1.4
policy_purge_cmd.c
Go to the documentation of this file.
1 #include "daemon/engine.h"
2 #include "cmdhandler.h"
4 #include "log.h"
5 #include "str.h"
6 #include "clientpipe.h"
8 #include "db/policy.h"
9 
11 
12 static const char *module_str = "policy_purge_cmd";
13 
14 static void
15 usage(int sockfd)
16 {
17  client_printf(sockfd,
18  "policy purge\n"
19  );
20 }
21 
22 static void
23 help(int sockfd)
24 {
25  client_printf(sockfd,
26  "This command will remove any policies from the database which have no\n"
27  "associated zones. Use with caution.\n\n"
28  );
29 }
30 
37 static int
38 purge_policies(int sockfd, db_connection_t *dbconn)
39 {
42  zone_list_db_t* zonelist;
43  const char* name;
44  size_t listsize;
45  int result = 0;
46 
47  client_printf(sockfd, "Purging policies\n");
48 
49  policy_list = policy_list_new_get(dbconn);
50  if (!policy_list) return 1;
51 
52  while ((policy = policy_list_get_next(policy_list))) {
53  name = policy_name(policy);
54  /*fetch zonelist from db, owned by policy*/
55  if (policy_retrieve_zone_list(policy)) {
56  result = 1;
57  client_printf(sockfd, "Error fetching zones\n");
58  break;
59  }
60  zonelist = policy_zone_list(policy);
61  listsize = zone_list_db_size(zonelist);
62  if (listsize == 0) {
63  ods_log_info("[%s] No zones on policy %s; purging...", module_str, name);
64  client_printf(sockfd, "No zones on policy %s; purging...\n", name);
65  if (policy_delete(policy)) {
66  ods_log_crit("[%s] Error while purging policy from database", module_str);
67  client_printf(sockfd, "Error while updating database\n", name);
68  result++;
69  }
70  }
71  policy_free(policy);
72  }
73  policy_list_free(policy_list);
74  return result;
75 }
76 
77 static int
78 run(int sockfd, cmdhandler_ctx_type* context, const char *cmd)
79 {
80  db_connection_t* dbconn = getconnectioncontext(context);;
81  engine_type* engine = getglobalcontext(context);
82  (void) cmd;
83 
84  ods_log_debug("[%s] %s command", module_str, policy_purge_funcblock.cmdname);
85  return purge_policies(sockfd, dbconn);
86 }
87 
88 struct cmd_func_block policy_purge_funcblock = {
89  "policy purge", &usage, &help, NULL, &run
90 };
void policy_list_free(policy_list_t *policy_list)
Definition: policy.c:2664
const char * policy_name(const policy_t *policy)
Definition: policy.c:813
int policy_delete(policy_t *policy)
Definition: policy.c:2571
engine_type * getglobalcontext(cmdhandler_ctx_type *context)
struct cmd_func_block policy_purge_funcblock
db_connection_t * getconnectioncontext(cmdhandler_ctx_type *context)
policy_t * policy_list_get_next(policy_list_t *policy_list)
Definition: policy.c:3280
void policy_free(policy_t *policy)
Definition: policy.c:518
int policy_retrieve_zone_list(policy_t *policy)
Definition: policy.c:1111
policy_list_t * policy_list_new_get(const db_connection_t *connection)
Definition: policy.c:3079
zone_list_db_t * policy_zone_list(policy_t *policy)
Definition: policy.c:1093
Definition: policy.h:60
size_t zone_list_db_size(zone_list_db_t *zone_list)
Definition: zone_db.c:2705