OpenDNSSEC-enforcer  2.0.4
policy_purge_cmd.c
Go to the documentation of this file.
1 #include "daemon/engine.h"
2 #include "daemon/cmdhandler.h"
3 #include "log.h"
4 #include "str.h"
5 #include "clientpipe.h"
7 #include "db/policy.h"
8 
10 
11 static const char *module_str = "policy_purge_cmd";
12 
13 static void
14 usage(int sockfd)
15 {
16  client_printf(sockfd,
17  "policy purge\n"
18  );
19 }
20 
21 static void
22 help(int sockfd)
23 {
24  client_printf(sockfd,
25  "This command will remove any policies from the database which have no\n"
26  "associated zones. Use with caution.\n\n"
27  );
28 }
29 
30 static int
31 handles(const char *cmd, ssize_t n)
32 {
33  return ods_check_command(cmd, n, policy_purge_funcblock()->cmdname) ? 1 : 0;
34 }
35 
42 static int
43 purge_policies(int sockfd, db_connection_t *dbconn)
44 {
47  zone_list_t* zonelist;
48  const char* name;
49  size_t listsize;
50  int result = 0;
51 
52  client_printf(sockfd, "Purging policies\n");
53 
54  policy_list = policy_list_new_get(dbconn);
55  if (!policy_list) return 1;
56 
57  while ((policy = policy_list_get_next(policy_list))) {
58  name = policy_name(policy);
59  /*fetch zonelist from db, owned by policy*/
60  if (policy_retrieve_zone_list(policy)) {
61  result = 1;
62  client_printf(sockfd, "Error fetching zones\n");
63  break;
64  }
65  zonelist = policy_zone_list(policy);
66  listsize = zone_list_size(zonelist);
67  if (listsize == 0) {
68  ods_log_info("[%s] No zones on policy %s; purging...", module_str, name);
69  client_printf(sockfd, "No zones on policy %s; purging...\n", name);
70  if (policy_delete(policy)) {
71  ods_log_crit("[%s] Error while purging policy from database", module_str);
72  client_printf(sockfd, "Error while updating database\n", name);
73  result++;
74  }
75  }
76  policy_free(policy);
77  }
78  policy_list_free(policy_list);
79  return result;
80 }
81 
82 static int
83 run(int sockfd, engine_type* engine, const char *cmd, ssize_t n,
84  db_connection_t *dbconn)
85 {
86  (void)cmd; (void)n; (void)engine;
87 
88  ods_log_debug("[%s] %s command", module_str, policy_purge_funcblock()->cmdname);
89  if (!dbconn) return 1;
90  return purge_policies(sockfd, dbconn);
91 }
92 
93 static struct cmd_func_block funcblock = {
94  "policy purge", &usage, &help, &handles, &run
95 };
96 
97 struct cmd_func_block*
99 {
100  return &funcblock;
101 }
102 
zone_list_t * policy_zone_list(policy_t *policy)
Definition: policy.c:1093
void(* help)(int sockfd)
Definition: cmdhandler.h:64
void policy_list_free(policy_list_t *policy_list)
Definition: policy.c:2664
void ods_log_debug(const char *format,...)
Definition: log.c:41
const char * policy_name(const policy_t *policy)
Definition: policy.c:813
int policy_delete(policy_t *policy)
Definition: policy.c:2571
void ods_log_info(const char *format,...)
Definition: log.c:55
int(* run)(int sockfd, struct engine_struct *engine, const char *cmd, ssize_t n, db_connection_t *dbconn)
Definition: cmdhandler.h:79
const char * cmdname
Definition: cmdhandler.h:59
void(* usage)(int sockfd)
Definition: cmdhandler.h:61
void ods_log_crit(const char *format,...)
Definition: log.c:80
policy_t * policy_list_get_next(policy_list_t *policy_list)
Definition: policy.c:3277
void policy_free(policy_t *policy)
Definition: policy.c:518
int policy_retrieve_zone_list(policy_t *policy)
Definition: policy.c:1111
size_t zone_list_size(zone_list_t *zone_list)
Definition: zone.c:2702
policy_list_t * policy_list_new_get(const db_connection_t *connection)
Definition: policy.c:3076
struct cmd_func_block * policy_purge_funcblock(void)
Definition: policy.h:60
int(* handles)(const char *cmd, ssize_t n)
Definition: cmdhandler.h:67