90f0c4426c37428d67445ea9bc955d2cb24650a9
[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->serviceclass)
59       rh_task_serviceclass_reg(ms);
60
61     if (ms->main_config->bandwidth_shape)
62       rh_task_bandwidth_reg(ms);
63
64     rh_task_dbset_reg(ms);
65     task_registered = 1;
66   }
67 }
68
69 void rh_task_unregister(struct main_server *ms) {
70   g_list_free(ms->task_list);
71 }
72
73 int  rh_task_startservice(struct main_server *ms)
74 {
75   GList *runner = g_list_first(ms->task_list);
76   struct task *ltask = NULL;
77
78   DP("Start service");
79
80   while (runner != NULL) {
81     ltask = (struct task *)runner->data;
82     (*ltask->startservice)();
83     runner = g_list_next(runner);
84   }
85
86   logmsg(RH_LOG_NORMAL, "Service started");
87   return 0;
88 }
89
90 int rh_task_stopservice(struct main_server *ms)
91 {  
92   GList *runner = g_list_last(ms->task_list);
93   struct task *ltask = NULL;
94
95   DP("Stop service");
96
97   while (runner != NULL) {
98     ltask = (struct task *)runner->data;
99     (*ltask->stopservice)();
100     runner = g_list_previous(runner);
101   }
102
103   logmsg(RH_LOG_NORMAL, "Service stopped");
104   return 0;
105 }
106
107 void rh_task_init (struct main_server *ms, struct vserver *vs)
108 {
109   GList *runner = g_list_first(ms->task_list);
110   struct task *ltask = NULL;
111
112   DP("Initialize...");
113
114   while (runner != NULL) {
115     ltask = (struct task *)runner->data;
116     (*ltask->init)(vs);
117     runner = g_list_next(runner);
118   }
119 }
120
121 void rh_task_cleanup(struct main_server *ms, struct vserver *vs)
122 {
123   GList *runner = g_list_last(ms->task_list);
124   struct task *ltask = NULL;
125
126   DP("Task Cleanup");
127
128   while (runner != NULL) {
129     ltask = (struct task *)runner->data;
130     (*ltask->cleanup)(vs);
131     runner = g_list_previous(runner);
132   }  
133 }
134
135 int  rh_task_startsess(struct vserver *vs, struct task_req *req)
136 {
137   struct main_server *ms = &rh_main_server_instance;
138   GList *runner = g_list_first(ms->task_list);
139   struct task *ltask = NULL;
140
141   DP("Start session called");
142
143   while (runner != NULL) {
144     ltask = (struct task *)runner->data;
145     (*ltask->startsess)(vs, req);
146     runner = g_list_next(runner);
147   }  
148
149   return 0;
150 }
151
152 int  rh_task_stopsess(struct vserver *vs, struct task_req *req)
153 {
154   struct main_server *ms = &rh_main_server_instance;
155   GList *runner = g_list_last(ms->task_list);
156   struct task *ltask = NULL;
157
158   DP("Stop session called");
159  
160   while (runner != NULL) {
161     ltask = (struct task *)runner->data;
162     (*ltask->stopsess)(vs, req);
163     runner = g_list_previous(runner);
164   }  
165
166   return 0;
167 }
168
169 int  rh_task_commitstartsess(struct vserver *vs, struct task_req *req)
170 {
171 }
172
173 int  rh_task_commitstopsess(struct vserver *vs, struct task_req *req)
174 {
175 }
176
177 int  rh_task_rollbackstartsess(struct vserver *vs, struct task_req *req)
178 {
179 }
180
181 int  rh_task_rollbackstopsess(struct vserver *vs, struct task_req *req)
182 {
183 }