1 /* SmoothWall setup program.
3 * This program is distributed under the terms of the GNU General Public
4 * Licence. See the file COPYING for details.
6 * (c) Lawrence Manning, 2001
7 * Stuff for setting up the DHCP server from the setup prog.
15 #define START_ADDRESS 0
18 #define SECONDARY_DNS 3
19 #define DEFAULT_LEASE_TIME 4
20 #define MAX_LEASE_TIME 5
21 #define DOMAIN_NAME_SUFFIX 6
31 newtComponent dhcpform
;
32 newtComponent entries
[MAX_BOXES
];
33 newtComponent enabledcheckbox
;
35 void dhcpdialogcallbackdhcp(newtComponent cm
, void *data
);
39 char *results
[MAX_BOXES
];
42 struct newtExitStruct es
;
44 newtComponent labels
[MAX_BOXES
];
45 newtComponent ok
, cancel
;
47 char *labeltexts
[MAX_BOXES
] = { ctr
[TR_START_ADDRESS
], ctr
[TR_END_ADDRESS
],
48 ctr
[TR_PRIMARY_DNS
], ctr
[TR_SECONDARY_DNS
], ctr
[TR_DEFAULT_LEASE
],
49 ctr
[TR_MAX_LEASE
], ctr
[TR_DOMAIN_NAME_SUFFIX
] };
50 char *varnames
[MAX_BOXES
] = { "START_ADDR_GREEN", "END_ADDR_GREEN",
51 "DNS1_GREEN", "DNS2_GREEN",
52 "DEFAULT_LEASE_TIME_GREEN", "MAX_LEASE_TIME_GREEN",
54 char defaults
[MAX_BOXES
][STRING_SIZE
];
57 char temp
[STRING_SIZE
];
58 struct keyvalue
*mainkv
= initkeyvalues();
59 struct keyvalue
*dhcpkv
= initkeyvalues();
60 struct keyvalue
*ethernetkv
= initkeyvalues();
63 char greenaddress
[STRING_SIZE
];
64 char greennetaddress
[STRING_SIZE
];
65 char greennetmask
[STRING_SIZE
];
67 memset(defaults
, 0, sizeof(char) * STRING_SIZE
* MAX_BOXES
);
69 if (!(readkeyvalues(dhcpkv
, CONFIG_ROOT
"/dhcp/settings")))
71 freekeyvalues(dhcpkv
);
72 freekeyvalues(ethernetkv
);
73 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
76 if (!(readkeyvalues(ethernetkv
, CONFIG_ROOT
"/ethernet/settings")))
78 freekeyvalues(dhcpkv
);
79 freekeyvalues(ethernetkv
);
80 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
83 if (!(readkeyvalues(mainkv
, CONFIG_ROOT
"/main/settings")))
85 freekeyvalues(dhcpkv
);
86 freekeyvalues(ethernetkv
);
87 freekeyvalues(mainkv
);
88 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
92 /* Set default values. */
93 findkey(ethernetkv
, "GREEN_ADDRESS", defaults
[PRIMARY_DNS
]);
94 findkey(mainkv
, "DOMAINNAME", defaults
[DOMAIN_NAME_SUFFIX
]);
95 strcpy(defaults
[DEFAULT_LEASE_TIME
], "60");
96 strcpy(defaults
[MAX_LEASE_TIME
], "120");
98 sprintf(message
, ctr
[TR_DHCP_SERVER_CONFIGURATION
]);
99 newtCenteredWindow(55, 18, message
);
101 dhcpform
= newtForm(NULL
, NULL
, 0);
103 sprintf(message
, ctr
[TR_CONFIGURE_DHCP
]);
104 header
= newtTextboxReflowed(1, 1, message
, 52, 0, 0, 0);
105 newtFormAddComponent(dhcpform
, header
);
107 strcpy(temp
, ""); findkey(dhcpkv
, "ENABLE_GREEN", temp
);
108 if (strcmp(temp
, "on") == 0)
112 enabledcheckbox
= newtCheckbox(2, TOP
+ 0, ctr
[TR_ENABLED
], startenabled
, " *", &enabledresult
);
113 newtFormAddComponent(dhcpform
, enabledcheckbox
);
114 newtComponentAddCallback(enabledcheckbox
, dhcpdialogcallbackdhcp
, NULL
);
116 for (c
= 0; c
< MAX_BOXES
; c
++)
118 labels
[c
] = newtTextbox(2, TOP
+ 2 + c
, 33, 1, 0);
119 newtTextboxSetText(labels
[c
], labeltexts
[c
]);
120 newtFormAddComponent(dhcpform
, labels
[c
]);
121 strcpy(temp
, defaults
[c
]); findkey(dhcpkv
, varnames
[c
], temp
);
122 entries
[c
] = newtEntry(34, TOP
+ 2 + c
, temp
, 18, &results
[c
], 0);
123 newtFormAddComponent(dhcpform
, entries
[c
]);
124 if (startenabled
== ' ')
125 newtEntrySetFlags(entries
[c
], NEWT_FLAG_DISABLED
, NEWT_FLAGS_SET
);
129 ok
= newtButton(10, c
+ 7, ctr
[TR_OK
]);
130 cancel
= newtButton(34, c
+ 7, ctr
[TR_CANCEL
]);
132 newtFormAddComponents(dhcpform
, ok
, cancel
, NULL
);
137 newtFormRun(dhcpform
, &es
);
141 /* OK was pressed; verify the contents of each entry. */
142 if (enabledresult
== '*')
144 strcpy(message
, ctr
[TR_INVALID_FIELDS
]);
145 if (inet_addr(results
[START_ADDRESS
]) == INADDR_NONE
)
147 strcat(message
, ctr
[TR_START_ADDRESS_CR
]);
150 if (inet_addr(results
[END_ADDRESS
]) == INADDR_NONE
)
152 strcat(message
, ctr
[TR_END_ADDRESS_CR
]);
155 if (strlen(results
[SECONDARY_DNS
]))
157 if (inet_addr(results
[PRIMARY_DNS
]) == INADDR_NONE
)
159 strcat(message
, ctr
[TR_PRIMARY_DNS_CR
]);
163 if (strlen(results
[SECONDARY_DNS
]))
165 if (inet_addr(results
[SECONDARY_DNS
]) == INADDR_NONE
)
167 strcat(message
, ctr
[TR_SECONDARY_DNS_CR
]);
171 if (!(atol(results
[DEFAULT_LEASE_TIME
])))
173 strcat(message
, ctr
[TR_DEFAULT_LEASE_CR
]);
176 if (!(atol(results
[MAX_LEASE_TIME
])))
178 strcat(message
, ctr
[TR_MAX_LEASE_CR
]);
187 for (c
= 0; c
< MAX_BOXES
; c
++)
188 replacekeyvalue(dhcpkv
, varnames
[c
], results
[c
]);
189 if (enabledresult
== '*')
191 replacekeyvalue(dhcpkv
, "ENABLE_GREEN", "on");
192 fclose(fopen(CONFIG_ROOT
"/dhcp/enable_green", "w"));
193 chown(CONFIG_ROOT
"/dhcp/enable_green", 99, 99);
194 mysystem("/usr/local/bin/dhcpctrl enable");
198 replacekeyvalue(dhcpkv
, "ENABLE_GREEN", "off");
199 unlink(CONFIG_ROOT
"/dhcp/enable_green");
200 mysystem("/usr/local/bin/dhcpctrl disable");
202 replacekeyvalue(dhcpkv
, "VALID", "yes");
203 writekeyvalues(dhcpkv
, CONFIG_ROOT
"/dhcp/settings");
205 findkey(ethernetkv
, "GREEN_ADDRESS", greenaddress
);
206 findkey(ethernetkv
, "GREEN_NETADDRESS", greennetaddress
);
207 findkey(ethernetkv
, "GREEN_NETMASK", greennetmask
);
209 file
= fopen(CONFIG_ROOT
"/dhcp/dhcpd.conf", "w");
210 fprintf(file
, "ddns-update-style none;\n");
211 fprintf(file
, "subnet %s netmask %s\n", greennetaddress
, greennetmask
);
212 fprintf(file
, "{\n");
213 fprintf(file
, "\toption subnet-mask %s;\n", greennetmask
);
214 fprintf(file
, "\toption domain-name \"%s\";\n", results
[DOMAIN_NAME_SUFFIX
]);
215 fprintf(file
, "\toption routers %s;\n", greenaddress
);
216 if (strlen(results
[PRIMARY_DNS
]))
218 fprintf(file
, "\toption domain-name-servers ");
219 fprintf(file
, "%s", results
[PRIMARY_DNS
]);
220 if (strlen(results
[SECONDARY_DNS
]))
221 fprintf(file
, ", %s", results
[SECONDARY_DNS
]);
222 fprintf(file
, ";\n");
225 fprintf(file
, "\trange %s %s;\n", results
[START_ADDRESS
], results
[END_ADDRESS
]);
226 fprintf(file
, "\tdefault-lease-time %d;\n", (int) atol(results
[DEFAULT_LEASE_TIME
]) * 60);
227 fprintf(file
, "\tmax-lease-time %d;\n", (int) atol(results
[MAX_LEASE_TIME
]) * 60);
228 fprintf(file
, "}\n");
230 chown(CONFIG_ROOT
"/dhcp/dhcpd.conf", 99, 99);
232 mysystem("/usr/local/bin/dhcpctrl enable");
241 newtFormDestroy(dhcpform
);
244 freekeyvalues(dhcpkv
);
245 freekeyvalues(ethernetkv
);
246 freekeyvalues(mainkv
);
251 /* Called when enabled flag is toggled. Toggle disabled state of other 3
253 void dhcpdialogcallbackdhcp(newtComponent cm
, void *data
)
257 for (c
= 0; c
< MAX_BOXES
; c
++)
258 newtEntrySetFlags(entries
[c
], NEWT_FLAG_DISABLED
, NEWT_FLAGS_TOGGLE
);
261 newtDrawForm(dhcpform
);