Add new iptables handle task
[rahunas] / src / rh-server.c
1 /**
2  * RahuNAS server
3  * Author: Neutron Soutmun <neo.neutron@gmail.com>
4  * Date:   2009-03-24
5  */
6 #include <stdio.h>
7 #include "rahunasd.h"
8 #include "rh-server.h"
9 #include "rh-utils.h"
10
11 int vserver_exists(GList *vserver_list, int vserver_id, 
12                    const char *vserver_name)
13 {
14   GList *runner = g_list_first(vserver_list);
15   struct vserver *lvserver = NULL;
16
17   while (runner != NULL) {
18     lvserver = (struct vserver *)runner->data;
19    
20     if (lvserver->vserver_config->vserver_id == vserver_id)
21       return 1; 
22
23     if (strcmp(lvserver->vserver_config->vserver_name, vserver_name) == 0)
24       return 2;
25
26     runner = g_list_next(runner); 
27   } 
28   return 0;
29 }
30
31 struct vserver *vserver_get_by_id(struct main_server *ms, int search_id)
32 {
33   GList *runner = g_list_first(ms->vserver_list);
34   struct vserver *lvserver = NULL;
35
36   while (runner != NULL) {
37     lvserver = (struct vserver *)runner->data;
38    
39     if (lvserver->vserver_config->vserver_id == search_id) {
40       return lvserver;
41     }
42
43     runner = g_list_next(runner); 
44   } 
45   return NULL;
46 }
47
48 int vserver_cleanup(struct vserver *vs)
49 {
50   if (vs == NULL)
51     return 0;
52
53   if (vs->vserver_config != NULL)
54     cleanup_vserver_config(vs->vserver_config);  
55
56   if (vs->v_map != NULL)
57     // TODO: cleanup map
58
59   if (vs->v_set != NULL)
60     // TODO: cleanup set
61
62   return 0;
63 }
64
65 int mainserver_cleanup(struct main_server *ms)
66 {
67   if (ms == NULL)
68     return 0;
69
70   if (ms->main_config != NULL)
71     cleanup_mainserver_config(ms->main_config);  
72
73   return 0;
74 }
75
76 int register_vserver(struct main_server *ms, const char *vserver_cfg_file)
77 {
78   GList *vserver_list = ms->vserver_list;
79   GList *chk = NULL;
80   GList *node = NULL;
81   FILE  *cfg_file = NULL;
82   
83   union rahunas_config *cfg_get = NULL;
84   struct rahunas_vserver_config *vserver_config = NULL;
85   struct vserver *new_vserver = NULL;
86
87   union rahunas_config config = {
88     .rh_vserver.vserver_name = NULL,
89     .rh_vserver.vserver_id = VSERVER_ID,
90     .rh_vserver.dev_external = NULL,
91     .rh_vserver.dev_internal = NULL,
92     .rh_vserver.vlan = NULL,
93     .rh_vserver.vlan_raw_dev_external = NULL,
94     .rh_vserver.vlan_raw_dev_internal = NULL,
95     .rh_vserver.bridge = NULL,
96     .rh_vserver.masquerade = NULL,
97     .rh_vserver.ignore_mac = NULL,
98     .rh_vserver.vserver_ip = NULL, 
99     .rh_vserver.vserver_fqdn = NULL,
100     .rh_vserver.vserver_ports_allow = NULL,
101     .rh_vserver.vserver_ports_intercept = NULL,
102     .rh_vserver.clients = NULL,
103     .rh_vserver.excluded = NULL,
104     .rh_vserver.idle_timeout = IDLE_TIMEOUT,
105     .rh_vserver.dns = NULL,
106     .rh_vserver.ssh = NULL,
107     .rh_vserver.proxy = NULL,
108     .rh_vserver.proxy_host = NULL,
109     .rh_vserver.proxy_port = NULL,
110     .rh_vserver.bittorrent = NULL,
111     .rh_vserver.bittorrent_allow = NULL,
112     .rh_vserver.radius_host = NULL,
113     .rh_vserver.radius_secret = NULL,
114     .rh_vserver.radius_encrypt = NULL,
115     .rh_vserver.radius_auth_port = NULL,
116     .rh_vserver.radius_account_port = NULL,
117     .rh_vserver.nas_identifier = NULL,
118     .rh_vserver.nas_port = NULL,
119     .rh_vserver.nas_login_title = NULL,
120     .rh_vserver.nas_default_redirect = NULL,
121     .rh_vserver.nas_default_language = NULL,
122     .rh_vserver.nas_weblogin_template = NULL,
123   };
124
125   cfg_file = fopen(vserver_cfg_file, "r");
126   if (cfg_file == NULL)
127     return -1;
128
129   vserver_config = (struct rahunas_vserver_config *) rh_malloc(sizeof(struct rahunas_vserver_config));
130
131   if (vserver_config == NULL)
132     return -1;
133
134   memset(vserver_config, 0, sizeof(struct rahunas_vserver_config));
135
136   if (get_config(vserver_cfg_file, &config) != 0) {
137     rh_free(&config.rh_vserver.vserver_ip);
138     return -1;
139   }
140
141   memcpy(vserver_config, &config, sizeof(struct rahunas_vserver_config));
142
143   if (vserver_exists(vserver_list, vserver_config->vserver_id, 
144                      vserver_config->vserver_name)) {
145     return 1;
146   }
147
148   new_vserver = (struct vserver *) rh_malloc(sizeof(struct vserver));
149
150   if (new_vserver == NULL)
151     return -1;
152
153   memset(new_vserver, 0, sizeof(struct vserver));
154
155   new_vserver->vserver_config = vserver_config;
156
157   ms->vserver_list = g_list_append(ms->vserver_list, new_vserver);
158   return 0; 
159 }
160
161 int unregister_vserver(struct main_server *ms, int vserver_id)
162 {
163 }
164
165 int unregister_vserver_all(struct main_server *ms)
166 {
167   GList *vserver_list = ms->vserver_list;
168   GList *runner = g_list_first(vserver_list);
169   struct vserver *lvserver = NULL;
170
171   while (runner != NULL) {
172     lvserver = (struct vserver *)runner->data;
173     vserver_cleanup(lvserver);
174     runner = g_list_delete_link(runner, runner);
175   }
176   
177   return 0;
178 }
179
180 int walk_through_vserver(int (*callback)(void *, void *), struct main_server *ms)
181 {
182   GList *vserver_list = ms->vserver_list;
183   GList *runner = g_list_first(vserver_list);
184   struct vserver *vs = NULL;
185
186   while (runner != NULL) {
187     vs = (struct vserver *)runner->data;
188
189     (*callback)(ms, vs);
190
191     runner = g_list_next(runner); 
192   } 
193
194   return 0;
195 }