]>
Commit | Line | Data |
---|---|---|
cd1a2927 MT |
1 | /* SmoothWall setup program.\r |
2 | *\r | |
3 | * This program is distributed under the terms of the GNU General Public\r | |
4 | * Licence. See the file COPYING for details.\r | |
5 | *\r | |
6 | * (c) Lawrence Manning, 2001\r | |
7 | * Stuff for setting up the DHCP server from the setup prog.\r | |
8 | * \r | |
9 | * $Id: dhcp.c,v 1.9.2.3 2004/12/03 06:46:50 eoberlander Exp $\r | |
10 | * \r | |
11 | */\r | |
12 | \r | |
13 | #include "setup.h"\r | |
14 | \r | |
15 | #define TOP 4\r | |
16 | \r | |
17 | #define START_ADDRESS 0\r | |
18 | #define END_ADDRESS 1\r | |
19 | #define PRIMARY_DNS 2\r | |
20 | #define SECONDARY_DNS 3\r | |
21 | #define DEFAULT_LEASE_TIME 4\r | |
22 | #define MAX_LEASE_TIME 5\r | |
23 | #define DOMAIN_NAME_SUFFIX 6\r | |
24 | #define MAX_BOXES 7\r | |
25 | \r | |
26 | extern FILE *flog;\r | |
27 | extern char *mylog;\r | |
28 | \r | |
29 | extern char **ctr;\r | |
30 | \r | |
31 | extern int automode;\r | |
32 | \r | |
33 | newtComponent dhcpform;\r | |
34 | newtComponent entries[MAX_BOXES];\r | |
35 | newtComponent enabledcheckbox;\r | |
36 | \r | |
37 | void dhcpdialogcallbackdhcp(newtComponent cm, void *data);\r | |
38 | \r | |
39 | int handledhcp(void)\r | |
40 | {\r | |
41 | char *results[MAX_BOXES];\r | |
42 | char enabledresult;\r | |
43 | char startenabled;\r | |
44 | struct newtExitStruct es;\r | |
45 | newtComponent header;\r | |
46 | newtComponent labels[MAX_BOXES];\r | |
47 | newtComponent ok, cancel; \r | |
48 | char message[1000];\r | |
49 | char *labeltexts[MAX_BOXES] = { ctr[TR_START_ADDRESS], ctr[TR_END_ADDRESS],\r | |
50 | ctr[TR_PRIMARY_DNS], ctr[TR_SECONDARY_DNS], ctr[TR_DEFAULT_LEASE],\r | |
51 | ctr[TR_MAX_LEASE], ctr[TR_DOMAIN_NAME_SUFFIX] };\r | |
52 | char *varnames[MAX_BOXES] = { "START_ADDR_GREEN", "END_ADDR_GREEN", \r | |
53 | "DNS1_GREEN", "DNS2_GREEN",\r | |
54 | "DEFAULT_LEASE_TIME_GREEN", "MAX_LEASE_TIME_GREEN", \r | |
55 | "DOMAIN_NAME_GREEN"};\r | |
56 | char defaults[MAX_BOXES][STRING_SIZE]; \r | |
57 | int result;\r | |
58 | int c;\r | |
59 | char temp[STRING_SIZE];\r | |
60 | struct keyvalue *mainkv = initkeyvalues();\r | |
61 | struct keyvalue *dhcpkv = initkeyvalues();\r | |
62 | struct keyvalue *ethernetkv = initkeyvalues();\r | |
63 | int error;\r | |
64 | FILE *file;\r | |
65 | char greenaddress[STRING_SIZE]; \r | |
66 | char greennetaddress[STRING_SIZE];\r | |
67 | char greennetmask[STRING_SIZE];\r | |
68 | \r | |
69 | memset(defaults, 0, sizeof(char) * STRING_SIZE * MAX_BOXES);\r | |
70 | \r | |
71 | if (!(readkeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings")))\r | |
72 | {\r | |
73 | freekeyvalues(dhcpkv);\r | |
74 | freekeyvalues(ethernetkv);\r | |
75 | errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r | |
76 | return 0;\r | |
77 | }\r | |
78 | if (!(readkeyvalues(ethernetkv, CONFIG_ROOT "/ethernet/settings")))\r | |
79 | {\r | |
80 | freekeyvalues(dhcpkv);\r | |
81 | freekeyvalues(ethernetkv);\r | |
82 | errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r | |
83 | return 0;\r | |
84 | }\r | |
85 | if (!(readkeyvalues(mainkv, CONFIG_ROOT "/main/settings")))\r | |
86 | {\r | |
87 | freekeyvalues(dhcpkv);\r | |
88 | freekeyvalues(ethernetkv);\r | |
89 | freekeyvalues(mainkv);\r | |
90 | errorbox(ctr[TR_UNABLE_TO_OPEN_SETTINGS_FILE]);\r | |
91 | return 0;\r | |
92 | }\r | |
93 | \r | |
94 | /* Set default values. */ \r | |
95 | findkey(ethernetkv, "GREEN_ADDRESS", defaults[PRIMARY_DNS]);\r | |
96 | findkey(mainkv, "DOMAINNAME", defaults[DOMAIN_NAME_SUFFIX]);\r | |
97 | strcpy(defaults[DEFAULT_LEASE_TIME], "60");\r | |
98 | strcpy(defaults[MAX_LEASE_TIME], "120");\r | |
99 | \r | |
100 | sprintf(message, ctr[TR_DHCP_SERVER_CONFIGURATION]);\r | |
101 | newtCenteredWindow(55, 18, message);\r | |
102 | \r | |
103 | dhcpform = newtForm(NULL, NULL, 0);\r | |
104 | \r | |
105 | sprintf(message, ctr[TR_CONFIGURE_DHCP]);\r | |
106 | header = newtTextboxReflowed(1, 1, message, 52, 0, 0, 0);\r | |
107 | newtFormAddComponent(dhcpform, header);\r | |
108 | \r | |
109 | strcpy(temp, ""); findkey(dhcpkv, "ENABLE_GREEN", temp);\r | |
110 | if (strcmp(temp, "on") == 0)\r | |
111 | startenabled = '*';\r | |
112 | else\r | |
113 | startenabled = ' ';\r | |
114 | enabledcheckbox = newtCheckbox(2, TOP + 0, ctr[TR_ENABLED], startenabled, " *", &enabledresult);\r | |
115 | newtFormAddComponent(dhcpform, enabledcheckbox);\r | |
116 | newtComponentAddCallback(enabledcheckbox, dhcpdialogcallbackdhcp, NULL); \r | |
117 | \r | |
118 | for (c = 0; c < MAX_BOXES; c++)\r | |
119 | {\r | |
120 | labels[c] = newtTextbox(2, TOP + 2 + c, 33, 1, 0);\r | |
121 | newtTextboxSetText(labels[c], labeltexts[c]);\r | |
122 | newtFormAddComponent(dhcpform, labels[c]); \r | |
123 | strcpy(temp, defaults[c]); findkey(dhcpkv, varnames[c], temp);\r | |
124 | entries[c] = newtEntry(34, TOP + 2 + c, temp, 18, &results[c], 0);\r | |
125 | newtFormAddComponent(dhcpform, entries[c]); \r | |
126 | if (startenabled == ' ')\r | |
127 | newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_SET); \r | |
128 | \r | |
129 | }\r | |
130 | \r | |
131 | ok = newtButton(10, c + 7, ctr[TR_OK]);\r | |
132 | cancel = newtButton(34, c + 7, ctr[TR_CANCEL]);\r | |
133 | \r | |
134 | newtFormAddComponents(dhcpform, ok, cancel, NULL);\r | |
135 | \r | |
136 | do\r | |
137 | {\r | |
138 | error = 0;\r | |
139 | newtFormRun(dhcpform, &es);\r | |
140 | \r | |
141 | if (es.u.co == ok)\r | |
142 | {\r | |
143 | /* OK was pressed; verify the contents of each entry. */ \r | |
144 | if (enabledresult == '*')\r | |
145 | {\r | |
146 | strcpy(message, ctr[TR_INVALID_FIELDS]); \r | |
147 | if (inet_addr(results[START_ADDRESS]) == INADDR_NONE)\r | |
148 | {\r | |
149 | strcat(message, ctr[TR_START_ADDRESS_CR]);\r | |
150 | error = 1;\r | |
151 | }\r | |
152 | if (inet_addr(results[END_ADDRESS]) == INADDR_NONE)\r | |
153 | {\r | |
154 | strcat(message, ctr[TR_END_ADDRESS_CR]);\r | |
155 | error = 1;\r | |
156 | }\r | |
157 | if (strlen(results[SECONDARY_DNS]))\r | |
158 | {\r | |
159 | if (inet_addr(results[PRIMARY_DNS]) == INADDR_NONE)\r | |
160 | {\r | |
161 | strcat(message, ctr[TR_PRIMARY_DNS_CR]);\r | |
162 | error = 1;\r | |
163 | }\r | |
164 | }\r | |
165 | if (strlen(results[SECONDARY_DNS]))\r | |
166 | {\r | |
167 | if (inet_addr(results[SECONDARY_DNS]) == INADDR_NONE)\r | |
168 | {\r | |
169 | strcat(message, ctr[TR_SECONDARY_DNS_CR]);\r | |
170 | error = 1;\r | |
171 | }\r | |
172 | }\r | |
173 | if (!(atol(results[DEFAULT_LEASE_TIME])))\r | |
174 | {\r | |
175 | strcat(message, ctr[TR_DEFAULT_LEASE_CR]);\r | |
176 | error = 1;\r | |
177 | }\r | |
178 | if (!(atol(results[MAX_LEASE_TIME])))\r | |
179 | {\r | |
180 | strcat(message, ctr[TR_MAX_LEASE_CR]);\r | |
181 | error = 1;\r | |
182 | }\r | |
183 | } \r | |
184 | \r | |
185 | if (error)\r | |
186 | errorbox(message);\r | |
187 | else\r | |
188 | {\r | |
189 | for (c = 0; c < MAX_BOXES; c++)\r | |
190 | replacekeyvalue(dhcpkv, varnames[c], results[c]);\r | |
191 | if (enabledresult == '*')\r | |
192 | {\r | |
193 | replacekeyvalue(dhcpkv, "ENABLE_GREEN", "on");\r | |
194 | fclose(fopen(CONFIG_ROOT "/dhcp/enable_green", "w"));\r | |
195 | chown(CONFIG_ROOT "/dhcp/enable_green", 99, 99);\r | |
196 | }\r | |
197 | else\r | |
198 | {\r | |
199 | replacekeyvalue(dhcpkv, "ENABLE_GREEN", "off");\r | |
200 | unlink(CONFIG_ROOT "/dhcp/enable_green");\r | |
201 | }\r | |
202 | replacekeyvalue(dhcpkv, "VALID", "yes");\r | |
203 | writekeyvalues(dhcpkv, CONFIG_ROOT "/dhcp/settings");\r | |
204 | \r | |
205 | findkey(ethernetkv, "GREEN_ADDRESS", greenaddress); \r | |
206 | findkey(ethernetkv, "GREEN_NETADDRESS", greennetaddress);\r | |
207 | findkey(ethernetkv, "GREEN_NETMASK", greennetmask);\r | |
208 | \r | |
209 | file = fopen(CONFIG_ROOT "/dhcp/dhcpd.conf", "w");\r | |
210 | fprintf(file, "ddns-update-style none;\n");\r | |
211 | fprintf(file, "subnet %s netmask %s\n", greennetaddress, greennetmask);\r | |
212 | fprintf(file, "{\n");\r | |
213 | fprintf(file, "\toption subnet-mask %s;\n", greennetmask);\r | |
214 | fprintf(file, "\toption domain-name \"%s\";\n", results[DOMAIN_NAME_SUFFIX]); \r | |
215 | fprintf(file, "\toption routers %s;\n", greenaddress);\r | |
216 | if (strlen(results[PRIMARY_DNS]))\r | |
217 | {\r | |
218 | fprintf(file, "\toption domain-name-servers ");\r | |
219 | fprintf(file, "%s", results[PRIMARY_DNS]);\r | |
220 | if (strlen(results[SECONDARY_DNS]))\r | |
221 | fprintf(file, ", %s", results[SECONDARY_DNS]);\r | |
222 | fprintf(file, ";\n");\r | |
223 | }\r | |
224 | \r | |
225 | fprintf(file, "\trange %s %s;\n", results[START_ADDRESS], results[END_ADDRESS]);\r | |
226 | fprintf(file, "\tdefault-lease-time %d;\n", (int) atol(results[DEFAULT_LEASE_TIME]) * 60);\r | |
227 | fprintf(file, "\tmax-lease-time %d;\n", (int) atol(results[MAX_LEASE_TIME]) * 60);\r | |
228 | fprintf(file, "}\n");\r | |
229 | fclose(file);\r | |
230 | chown(CONFIG_ROOT "/dhcp/dhcpd.conf", 99, 99);\r | |
231 | if (automode == 0)\r | |
232 | mysystem("/usr/local/bin/restartdhcp");\r | |
233 | }\r | |
234 | result = 1;\r | |
235 | }\r | |
236 | else\r | |
237 | result = 0;\r | |
238 | } \r | |
239 | while (error);\r | |
240 | \r | |
241 | newtFormDestroy(dhcpform);\r | |
242 | newtPopWindow();\r | |
243 | \r | |
244 | freekeyvalues(dhcpkv);\r | |
245 | freekeyvalues(ethernetkv);\r | |
246 | freekeyvalues(mainkv);\r | |
247 | \r | |
248 | return result;\r | |
249 | }\r | |
250 | \r | |
251 | /* Called when enabled flag is toggled. Toggle disabled state of other 3\r | |
252 | * controls. */\r | |
253 | void dhcpdialogcallbackdhcp(newtComponent cm, void *data)\r | |
254 | {\r | |
255 | int c;\r | |
256 | \r | |
257 | for (c = 0; c < MAX_BOXES; c++)\r | |
258 | newtEntrySetFlags(entries[c], NEWT_FLAG_DISABLED, NEWT_FLAGS_TOGGLE);\r | |
259 | \r | |
260 | newtRefresh();\r | |
261 | newtDrawForm(dhcpform); \r | |
262 | }\r |