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