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