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.
13 #define _(x) dgettext("setup", x)
19 #define START_ADDRESS 0
22 #define SECONDARY_DNS 3
23 #define DEFAULT_LEASE_TIME 4
24 #define MAX_LEASE_TIME 5
25 #define DOMAIN_NAME_SUFFIX 6
33 newtComponent dhcpform
;
34 newtComponent entries
[MAX_BOXES
];
35 newtComponent enabledcheckbox
;
37 void dhcpdialogcallbackdhcp(newtComponent cm
, void *data
);
41 char *results
[MAX_BOXES
];
44 struct newtExitStruct es
;
46 newtComponent labels
[MAX_BOXES
];
47 newtComponent ok
, cancel
;
49 char *labeltexts
[MAX_BOXES
] = {
54 _("Default lease (mins):"),
55 _("Max lease (mins):"),
56 _("Domain name suffix:")
58 char *varnames
[MAX_BOXES
] = {
63 "DEFAULT_LEASE_TIME_GREEN",
64 "MAX_LEASE_TIME_GREEN",
67 char defaults
[MAX_BOXES
][STRING_SIZE
];
70 char temp
[STRING_SIZE
];
71 struct keyvalue
*mainkv
= initkeyvalues();
72 struct keyvalue
*dhcpkv
= initkeyvalues();
73 struct keyvalue
*ethernetkv
= initkeyvalues();
76 char greenaddress
[STRING_SIZE
];
77 char greennetaddress
[STRING_SIZE
];
78 char greennetmask
[STRING_SIZE
];
80 memset(defaults
, 0, sizeof(char) * STRING_SIZE
* MAX_BOXES
);
82 if (!(readkeyvalues(dhcpkv
, CONFIG_ROOT
"/dhcp/settings")))
84 freekeyvalues(dhcpkv
);
85 freekeyvalues(ethernetkv
);
86 errorbox(_("Unable to open settings file"));
89 if (!(readkeyvalues(ethernetkv
, CONFIG_ROOT
"/ethernet/settings")))
91 freekeyvalues(dhcpkv
);
92 freekeyvalues(ethernetkv
);
93 errorbox(_("Unable to open settings file"));
96 if (!(readkeyvalues(mainkv
, CONFIG_ROOT
"/main/settings")))
98 freekeyvalues(dhcpkv
);
99 freekeyvalues(ethernetkv
);
100 freekeyvalues(mainkv
);
101 errorbox(_("Unable to open settings file"));
105 /* Set default values. */
106 findkey(ethernetkv
, "GREEN_ADDRESS", defaults
[PRIMARY_DNS
]);
107 findkey(mainkv
, "DOMAINNAME", defaults
[DOMAIN_NAME_SUFFIX
]);
108 strcpy(defaults
[DEFAULT_LEASE_TIME
], "60");
109 strcpy(defaults
[MAX_LEASE_TIME
], "120");
111 newtCenteredWindow(55, 18, _("DHCP server configuration"));
113 dhcpform
= newtForm(NULL
, NULL
, 0);
115 header
= newtTextboxReflowed(1, 1,
116 _("Configure the DHCP server by entering the settings information."),
118 newtFormAddComponent(dhcpform
, header
);
120 strcpy(temp
, ""); findkey(dhcpkv
, "ENABLE_GREEN", temp
);
121 if (strcmp(temp
, "on") == 0)
125 enabledcheckbox
= newtCheckbox(2, TOP
+ 0, _("Enabled"), startenabled
, " *", &enabledresult
);
126 newtFormAddComponent(dhcpform
, enabledcheckbox
);
127 newtComponentAddCallback(enabledcheckbox
, dhcpdialogcallbackdhcp
, NULL
);
129 for (c
= 0; c
< MAX_BOXES
; c
++)
131 labels
[c
] = newtTextbox(2, TOP
+ 2 + c
, 33, 1, 0);
132 newtTextboxSetText(labels
[c
], labeltexts
[c
]);
133 newtFormAddComponent(dhcpform
, labels
[c
]);
134 strcpy(temp
, defaults
[c
]); findkey(dhcpkv
, varnames
[c
], temp
);
135 entries
[c
] = newtEntry(34, TOP
+ 2 + c
, temp
, 18, &results
[c
], 0);
136 newtFormAddComponent(dhcpform
, entries
[c
]);
137 if (startenabled
== ' ')
138 newtEntrySetFlags(entries
[c
], NEWT_FLAG_DISABLED
, NEWT_FLAGS_SET
);
142 ok
= newtButton(10, c
+ 7, _("OK"));
143 cancel
= newtButton(34, c
+ 7, _("Cancel"));
145 newtFormAddComponents(dhcpform
, ok
, cancel
, NULL
);
149 newtFormRun(dhcpform
, &es
);
153 /* OK was pressed; verify the contents of each entry. */
154 if (enabledresult
== '*')
156 strcpy(message
, _("The following fields are invalid:\n\n"));
157 if (inet_addr(results
[START_ADDRESS
]) == INADDR_NONE
)
159 strcat(message
, _("Start address"));
160 strcat(message
, "\n");
163 if (inet_addr(results
[END_ADDRESS
]) == INADDR_NONE
)
165 strcat(message
, _("End address"));
166 strcat(message
, "\n");
169 if (strlen(results
[SECONDARY_DNS
]))
171 if (inet_addr(results
[PRIMARY_DNS
]) == INADDR_NONE
)
173 strcat(message
, _("Primary DNS"));
174 strcat(message
, "\n");
178 if (strlen(results
[SECONDARY_DNS
]))
180 if (inet_addr(results
[SECONDARY_DNS
]) == INADDR_NONE
)
182 strcat(message
, _("Secondary DNS"));
183 strcat(message
, "\n");
187 if (!(atol(results
[DEFAULT_LEASE_TIME
])))
189 strcat(message
, _("Default lease time"));
190 strcat(message
, "\n");
193 if (!(atol(results
[MAX_LEASE_TIME
])))
195 strcat(message
, _("Max. lease time"));
196 strcat(message
, "\n");
205 for (c
= 0; c
< MAX_BOXES
; c
++)
206 replacekeyvalue(dhcpkv
, varnames
[c
], results
[c
]);
207 if (enabledresult
== '*')
209 replacekeyvalue(dhcpkv
, "ENABLE_GREEN", "on");
210 fclose(fopen(CONFIG_ROOT
"/dhcp/enable_green", "w"));
211 chown(CONFIG_ROOT
"/dhcp/enable_green", 99, 99);
212 mysystem(NULL
, "/usr/local/bin/dhcpctrl enable");
216 replacekeyvalue(dhcpkv
, "ENABLE_GREEN", "off");
217 unlink(CONFIG_ROOT
"/dhcp/enable_green");
218 mysystem(NULL
, "/usr/local/bin/dhcpctrl disable");
220 replacekeyvalue(dhcpkv
, "VALID", "yes");
221 writekeyvalues(dhcpkv
, CONFIG_ROOT
"/dhcp/settings");
223 findkey(ethernetkv
, "GREEN_ADDRESS", greenaddress
);
224 findkey(ethernetkv
, "GREEN_NETADDRESS", greennetaddress
);
225 findkey(ethernetkv
, "GREEN_NETMASK", greennetmask
);
227 file
= fopen(CONFIG_ROOT
"/dhcp/dhcpd.conf", "w");
228 fprintf(file
, "ddns-update-style none;\n");
229 fprintf(file
, "authoritative;\n");
230 fprintf(file
, "subnet %s netmask %s\n", greennetaddress
, greennetmask
);
231 fprintf(file
, "{\n");
232 fprintf(file
, "\toption subnet-mask %s;\n", greennetmask
);
233 fprintf(file
, "\toption domain-name \"%s\";\n", results
[DOMAIN_NAME_SUFFIX
]);
234 fprintf(file
, "\toption routers %s;\n", greenaddress
);
235 if (strlen(results
[PRIMARY_DNS
]))
237 fprintf(file
, "\toption domain-name-servers ");
238 fprintf(file
, "%s", results
[PRIMARY_DNS
]);
239 if (strlen(results
[SECONDARY_DNS
]))
240 fprintf(file
, ", %s", results
[SECONDARY_DNS
]);
241 fprintf(file
, ";\n");
244 fprintf(file
, "\trange %s %s;\n", results
[START_ADDRESS
], results
[END_ADDRESS
]);
245 fprintf(file
, "\tdefault-lease-time %d;\n", (int) atol(results
[DEFAULT_LEASE_TIME
]) * 60);
246 fprintf(file
, "\tmax-lease-time %d;\n", (int) atol(results
[MAX_LEASE_TIME
]) * 60);
247 fprintf(file
, "}\n");
249 chown(CONFIG_ROOT
"/dhcp/dhcpd.conf", 99, 99);
251 mysystem(NULL
, "/usr/local/bin/dhcpctrl enable");
259 newtFormDestroy(dhcpform
);
262 freekeyvalues(dhcpkv
);
263 freekeyvalues(ethernetkv
);
264 freekeyvalues(mainkv
);
269 /* Called when enabled flag is toggled. Toggle disabled state of other 3
271 void dhcpdialogcallbackdhcp(newtComponent cm
, void *data
)
275 for (c
= 0; c
< MAX_BOXES
; c
++)
276 newtEntrySetFlags(entries
[c
], NEWT_FLAG_DISABLED
, NEWT_FLAGS_TOGGLE
);
279 newtDrawForm(dhcpform
);