e82af366bccedafa2e7707aa9d27474fccfb39fe
[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 nas_stopservice(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_rahunas *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 /* Initialize */
50 static void init (struct vserver *vs)
51 {
52   vs->v_set = set_adt_get(vs->vserver_config->vserver_name);
53   logmsg(RH_LOG_NORMAL, "[%s] Task IPSET init..",
54          vs->vserver_config->vserver_name);  
55
56   DP("getsetname: %s", vs->v_set->name);
57   DP("getsetid: %d", vs->v_set->id);
58   DP("getsetindex: %d", vs->v_set->index);
59 }
60
61 /* Cleanup */
62 static void cleanup (struct vserver *vs)
63 {
64   logmsg(RH_LOG_NORMAL, "[%s] Task IPSET cleanup..",
65          vs->vserver_config->vserver_name);  
66   set_flush(vs->vserver_config->vserver_name);
67
68   rh_free(&(vs->v_set));
69 }
70
71 /* Start service task */
72 static int startservice (struct vserver *vs)
73 {
74   /* Ensure the set is empty */
75   set_flush(vs->vserver_config->vserver_name);
76 }
77
78 /* Stop service task */
79 static int stopservice  (struct vserver *vs)
80 {
81   logmsg(RH_LOG_NORMAL, "[%s] Task IPSET stop..",
82          vs->vserver_config->vserver_name);  
83   walk_through_set(&nas_stopservice, vs);
84
85   return 0;
86 }
87
88 /* Start session task */
89 static int startsess (struct vserver *vs, struct task_req *req)
90 {
91   int res = 0;
92   ip_set_ip_t ip;
93   parse_ip(idtoip(vs->v_map, req->id), &ip);
94
95   res = set_adtip_nb(vs->v_set, &ip, req->mac_address, IP_SET_OP_ADD_IP);
96
97   return res;
98 }
99
100 /* Stop session task */
101 static int stopsess  (struct vserver *vs, struct task_req *req)
102 {
103   int res = 0;
104   ip_set_ip_t ip;
105   parse_ip(idtoip(vs->v_map, req->id), &ip);
106
107   res = set_adtip_nb(vs->v_set, &ip, req->mac_address, IP_SET_OP_DEL_IP);
108
109   return res;
110 }
111
112 /* Commit start session task */
113 static int commitstartsess (struct vserver *vs, struct task_req *req)
114 {
115   /* Do nothing or need to implement */
116 }
117
118 /* Commit stop session task */
119 static int commitstopsess  (struct vserver *vs, struct task_req *req)
120 {
121   /* Do nothing or need to implement */
122 }
123
124 /* Rollback start session task */
125 static int rollbackstartsess (struct vserver *vs, struct task_req *req)
126 {
127   /* Do nothing or need to implement */
128 }
129
130 /* Rollback stop session task */
131 static int rollbackstopsess  (struct vserver *vs, struct task_req *req)
132 {
133   /* Do nothing or need to implement */
134 }
135
136 static struct task task_ipset = {
137   .taskname = "IPSET",
138   .taskprio = 30,
139   .init = &init,
140   .cleanup = &cleanup,
141   .startservice = &startservice,
142   .stopservice = &stopservice,
143   .startsess = &startsess,
144   .stopsess = &stopsess,
145   .commitstartsess = &commitstartsess,
146   .commitstopsess = &commitstopsess,
147   .rollbackstartsess = &rollbackstartsess,
148   .rollbackstopsess = &rollbackstopsess,
149 };
150
151 void rh_task_ipset_reg(struct main_server *ms) {
152   task_register(ms, &task_ipset);
153 }