Add new iptables handle task
[rahunas] / src / rh-task.c
1 /**
2  * RahuNAS task implementation
3  * Author: Neutron Soutmun <neo.neutron@gmail.com>
4  * Date:   2008-09-07
5  */
6
7 #include <syslog.h>
8 #include "rh-task.h"
9 #include "rh-task-iptables.h"
10 #include "rh-task-memset.h"
11 #include "rh-task-ipset.h"
12 #include "rh-task-dbset.h"
13 #include "rh-task-bandwidth.h"
14
15 void task_register(struct main_server *ms, struct task *task)
16 {
17   GList *chk  = NULL;
18   GList *node = NULL;
19   struct task *ltask = NULL;
20
21   if (task == NULL)
22      return;
23
24   DP("Registering Task: %s", task->taskname);
25
26   chk = g_list_find(ms->task_list, task);
27
28   /* Already register */
29   if (chk != NULL) {
30     DP("Already registered");
31     return;
32   }
33
34   if (ms->task_list == NULL) {
35     ms->task_list = g_list_append(ms->task_list, task);
36     return;
37   }
38
39   for (node = g_list_first(ms->task_list); node != NULL; node = g_list_next(node)) {
40     ltask = (struct task *)node->data;
41     if (task->taskprio >= ltask->taskprio)
42       break;  
43   }
44   
45   ms->task_list = g_list_insert_before(ms->task_list, node, task);
46 }
47
48 void rh_task_register(struct main_server *ms)
49 {
50   static int task_registered = 0;
51
52   if (task_registered == 0) {
53     /* Register all tasks */
54     rh_task_iptables_reg(ms);
55     rh_task_memset_reg(ms);
56     rh_task_ipset_reg(ms);
57
58     if (ms->main_config->bandwidth_shape)
59       rh_task_bandwidth_reg(ms);
60
61     rh_task_dbset_reg(ms);
62     task_registered = 1;
63   }
64 }
65
66 void rh_task_unregister(struct main_server *ms) {
67   g_list_free(ms->task_list);
68 }
69
70 int  rh_task_startservice(struct main_server *ms)
71 {
72   GList *runner = g_list_first(ms->task_list);
73   struct task *ltask = NULL;
74
75   DP("Start service");
76
77   while (runner != NULL) {
78     ltask = (struct task *)runner->data;
79     (*ltask->startservice)();
80     runner = g_list_next(runner);
81   }
82
83   logmsg(RH_LOG_NORMAL, "Service started");
84   return 0;
85 }
86
87 int rh_task_stopservice(struct main_server *ms)
88 {  
89   GList *runner = g_list_last(ms->task_list);
90   struct task *ltask = NULL;
91
92   DP("Stop service");
93
94   while (runner != NULL) {
95     ltask = (struct task *)runner->data;
96     (*ltask->stopservice)();
97     runner = g_list_previous(runner);
98   }
99
100   logmsg(RH_LOG_NORMAL, "Service stopped");
101   return 0;
102 }
103
104 void rh_task_init (struct main_server *ms, struct vserver *vs)
105 {
106   GList *runner = g_list_first(ms->task_list);
107   struct task *ltask = NULL;
108
109   DP("Initialize...");
110
111   while (runner != NULL) {
112     ltask = (struct task *)runner->data;
113     (*ltask->init)(vs);
114     runner = g_list_next(runner);
115   }
116 }
117
118 void rh_task_cleanup(struct main_server *ms, struct vserver *vs)
119 {
120   GList *runner = g_list_last(ms->task_list);
121   struct task *ltask = NULL;
122
123   DP("Task Cleanup");
124
125   while (runner != NULL) {
126     ltask = (struct task *)runner->data;
127     (*ltask->cleanup)(vs);
128     runner = g_list_previous(runner);
129   }  
130 }
131
132 int  rh_task_startsess(struct vserver *vs, struct task_req *req)
133 {
134   struct main_server *ms = &rh_main_server_instance;
135   GList *runner = g_list_first(ms->task_list);
136   struct task *ltask = NULL;
137
138   DP("Start session called");
139
140   while (runner != NULL) {
141     ltask = (struct task *)runner->data;
142     (*ltask->startsess)(vs, req);
143     runner = g_list_next(runner);
144   }  
145
146   return 0;
147 }
148
149 int  rh_task_stopsess(struct vserver *vs, struct task_req *req)
150 {
151   struct main_server *ms = &rh_main_server_instance;
152   GList *runner = g_list_last(ms->task_list);
153   struct task *ltask = NULL;
154
155   DP("Stop session called");
156  
157   while (runner != NULL) {
158     ltask = (struct task *)runner->data;
159     (*ltask->stopsess)(vs, req);
160     runner = g_list_previous(runner);
161   }  
162
163   return 0;
164 }
165
166 int  rh_task_commitstartsess(struct vserver *vs, struct task_req *req)
167 {
168 }
169
170 int  rh_task_commitstopsess(struct vserver *vs, struct task_req *req)
171 {
172 }
173
174 int  rh_task_rollbackstartsess(struct vserver *vs, struct task_req *req)
175 {
176 }
177
178 int  rh_task_rollbackstopsess(struct vserver *vs, struct task_req *req)
179 {
180 }