Cherry-picks the code from 0.1.x branch
[rahunas] / src / rh-task-ipset.c
1 /**
2  * RahuNAS task memset implementation 
3  * Author: Neutron Soutmun <neo.neutron@gmail.com>
4  *         Suriya Soutmun <darksolar@gmail.com>
5  * Date:   2008-09-07
6  */
7
8 #include <string.h>
9 #include <syslog.h>
10
11 #include "rahunasd.h"
12 #include "rh-ipset.h"
13 #include "rh-task.h"
14 #include "rh-xmlrpc-cmd.h"
15
16 static int
17 set_cleanup(void *data)
18 {
19   struct processing_set *process = (struct processing_set *) data;
20   struct ip_set_list *setlist = (struct ip_set_list *) process->list;
21   size_t offset;
22   struct ip_set_rahu *table = NULL;
23   struct task_req req;
24   unsigned int id;
25   char *ip = NULL;
26   int res  = 0;
27   GList *runner = g_list_first(process->vs->v_map->members);
28   struct rahunas_member *member = NULL;
29
30   if (process == NULL)
31     return (-1);
32
33   offset = sizeof(struct ip_set_list) + setlist->header_size;
34   table = (struct ip_set_rahunas *)(process->list + offset);
35
36   while (runner != NULL) {
37     member = (struct rahunas_member *) runner->data;
38     runner = g_list_next(runner);
39
40     id = member->id;
41
42     DP("Found IP: %s in set, try logout", idtoip(process->vs->v_map, id));
43     req.id = id;
44     memcpy(req.mac_address, table[id].ethernet, ETH_ALEN);
45     req.req_opt = RH_RADIUS_TERM_NAS_REBOOT;
46     send_xmlrpc_stopacct(process->vs, id, RH_RADIUS_TERM_NAS_REBOOT);
47     rh_task_stopsess(process->vs, &req);
48   }
49 }
50
51 /* Start service task */
52 static int startservice ()
53 {
54   return 0;
55 }
56
57 /* Stop service task */
58 static int stopservice  ()
59 {
60   return 0;
61 }
62
63 /* Initialize */
64 static void init (RHVServer *vs)
65 {
66   if (vs->vserver_config->init_flag == VS_RELOAD)
67     return;
68
69   vs->v_set = set_adt_get(vs->vserver_config->vserver_name);
70
71   logmsg(RH_LOG_NORMAL, "[%s] Task IPSET initialize..",
72          vs->vserver_config->vserver_name);  
73
74   DP("getsetname: %s", vs->v_set->name);
75   DP("getsetid: %d", vs->v_set->id);
76   DP("getsetindex: %d", vs->v_set->index);
77
78   /* Ensure the set is empty */
79   set_flush(vs->vserver_config->vserver_name);
80 }
81
82 /* Cleanup */
83 static void cleanup (RHVServer *vs)
84 {
85   if (vs->vserver_config->init_flag == VS_RELOAD)
86     return;
87
88   logmsg(RH_LOG_NORMAL, "[%s] Task IPSET cleanup..",
89          vs->vserver_config->vserver_name);  
90
91   walk_through_set(&set_cleanup, vs);
92
93   set_flush(vs->vserver_config->vserver_name);
94   rh_free((void **) &vs->v_set);
95 }
96
97 /* Start session task */
98 static int startsess (RHVServer *vs, struct task_req *req)
99 {
100   int res = 0;
101   ip_set_ip_t ip;
102   parse_ip(idtoip(vs->v_map, req->id), &ip);
103
104   res = set_adtip_nb(vs->v_set, &ip, req->mac_address, IP_SET_OP_ADD_IP);
105
106   return res;
107 }
108
109 /* Stop session task */
110 static int stopsess  (RHVServer *vs, struct task_req *req)
111 {
112   int res = 0;
113   ip_set_ip_t ip;
114   parse_ip(idtoip(vs->v_map, req->id), &ip);
115
116   res = set_adtip_nb(vs->v_set, &ip, req->mac_address, IP_SET_OP_DEL_IP);
117
118   return res;
119 }
120
121 /* Commit start session task */
122 static int commitstartsess (RHVServer *vs, struct task_req *req)
123 {
124   /* Do nothing or need to implement */
125 }
126
127 /* Commit stop session task */
128 static int commitstopsess  (RHVServer *vs, struct task_req *req)
129 {
130   /* Do nothing or need to implement */
131 }
132
133 /* Rollback start session task */
134 static int rollbackstartsess (RHVServer *vs, struct task_req *req)
135 {
136   /* Do nothing or need to implement */
137 }
138
139 /* Rollback stop session task */
140 static int rollbackstopsess  (RHVServer *vs, struct task_req *req)
141 {
142   /* Do nothing or need to implement */
143 }
144
145 static struct task task_ipset = {
146   .taskname = "IPSET",
147   .taskprio = 30,
148   .init = &init,
149   .cleanup = &cleanup,
150   .startservice = &startservice,
151   .stopservice = &stopservice,
152   .startsess = &startsess,
153   .stopsess = &stopsess,
154   .commitstartsess = &commitstartsess,
155   .commitstopsess = &commitstopsess,
156   .rollbackstartsess = &rollbackstartsess,
157   .rollbackstopsess = &rollbackstopsess,
158 };
159
160 void rh_task_ipset_reg(RHMainServer *ms) {
161   task_register(ms, &task_ipset);
162 }