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 * The big one: networking.
15 #define DEFAULT_GATEWAY 2
16 #define DNSGATEWAY_TOTAL 3
26 #define HAS_RED (configtype == 1 || configtype == 2 || configtype == 3 || configtype == 4)
27 #define HAS_ORANGE (configtype == 2 || configtype == 4)
28 #define HAS_BLUE (configtype == 3 || configtype == 4)
29 #define RED_IS_NOT_ETH (configtype == 0)
31 extern struct nic nics
[];
32 extern struct knic knics
[];
34 char *configtypenames
[] = {
36 "GREEN + RED + ORANGE",
38 "GREEN + RED + ORANGE + BLUE",
40 int configtypecards
[] = {
42 3, // "GREEN + RED + ORANGE",
43 3, // "GREEN + RED + BLUE",
44 4 // "GREEN + RED + ORANGE + BLUE",
50 int oktoleave(char *errormessage
);
52 int configtypemenu(void);
54 int changedrivers(void);
55 int greenaddressmenu(void);
56 int addressesmenu(void);
57 int dnsgatewaymenu(void);
59 int handlenetworking(void)
64 char errormessage
[STRING_SIZE
];
68 found
= scan_network_cards();
95 if (oktoleave(errormessage
))
98 errorbox(errormessage
);
108 /* Restart networking! */
109 if (netaddresschange
)
111 runcommandwithstatus("/etc/rc.d/init.d/network stop",
112 ctr
[TR_PUSHING_NETWORK_DOWN
]);
116 runcommandwithstatus("/etc/rc.d/init.d/network start",
117 ctr
[TR_PULLING_NETWORK_UP
]);
124 int oktoleave(char *errormessage
)
126 struct keyvalue
*kv
= initkeyvalues();
127 char temp
[STRING_SIZE
];
130 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
133 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
137 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
); configtype
= atol(temp
);
138 if (configtype
< 1 || configtype
> 4) configtype
= 0;
142 strcpy(temp
, ""); findkey(kv
, "GREEN_DEV", temp
);
145 strcpy(errormessage
, ctr
[TR_NO_GREEN_INTERFACE
]);
148 if (!(interfacecheck(kv
, "GREEN")))
150 strcpy(errormessage
, "(TR) GRÜNE IP nicht konfiguriert.\n"); //ctr[TR_MISSING_GREEN_IP]);
156 strcpy(temp
, ""); findkey(kv
, "RED_DEV", temp
);
159 strcpy(errormessage
, ctr
[TR_NO_RED_INTERFACE
]);
162 if (!(interfacecheck(kv
, "RED")))
164 strcpy(errormessage
, ctr
[TR_MISSING_RED_IP
]);
170 strcpy(temp
, ""); findkey(kv
, "ORANGE_DEV", temp
);
173 strcpy(errormessage
, ctr
[TR_NO_ORANGE_INTERFACE
]);
176 if (!(interfacecheck(kv
, "ORANGE")))
178 strcpy(errormessage
, ctr
[TR_MISSING_ORANGE_IP
]);
184 strcpy(temp
, ""); findkey(kv
, "BLUE_DEV", temp
);
187 strcpy(errormessage
, ctr
[TR_NO_BLUE_INTERFACE
]);
190 if (!(interfacecheck(kv
, "BLUE")))
192 strcpy(errormessage
, ctr
[TR_MISSING_BLUE_IP
]);
198 strcpy(temp
, ""); findkey(kv
, "DNS1", temp
);
201 strcpy(errormessage
, "(TR) Kein DNS eingetragen\n");
204 strcpy(temp
, ""); findkey(kv
, "DEFAULT_GATEWAY", temp
);
207 strcpy(errormessage
, "(TR) Kein default Gateway eingetragen.\n");
211 strcpy(errormessage
, "");
215 if (strlen(errormessage
))
222 /* Shows the main menu and a summary of the current settings. */
225 char *sections
[] = { ctr
[TR_NETWORK_CONFIGURATION_TYPE
],
226 ctr
[TR_DRIVERS_AND_CARD_ASSIGNMENTS
],
227 ctr
[TR_ADDRESS_SETTINGS
],
228 ctr
[TR_DNS_AND_GATEWAY_SETTINGS
], NULL
};
230 static int choice
= 0;
231 struct keyvalue
*kv
= initkeyvalues();
233 char temp
[STRING_SIZE
];
236 char networkrestart
[STRING_SIZE
] = "";
238 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
241 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
245 if (netaddresschange
)
246 strcpy(networkrestart
, ctr
[TR_RESTART_REQUIRED
]);
248 strcpy(temp
, ""); findkey(kv
, "CONFIG_TYPE", temp
); x
= atol(temp
);
249 if (x
< 1 || x
> 4) x
= 0;
250 /* Format heading bit. */
251 snprintf(message
, 1000, ctr
[TR_CURRENT_CONFIG
], configtypenames
[x
],
253 rc
= newtWinMenu(ctr
[TR_NETWORK_CONFIGURATION_MENU
], message
, 50, 5, 5, 6,
254 sections
, &choice
, ctr
[TR_OK
], ctr
[TR_DONE
], NULL
);
256 if (rc
== 0 || rc
== 1)
264 /* Here they choose general network config, number of nics etc. */
265 int configtypemenu(void)
267 struct keyvalue
*kv
= initkeyvalues();
268 char temp
[STRING_SIZE
] = "0";
273 fprintf(flog
,"Enter ConfigMenu\n");
275 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
278 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
282 found
= scan_network_cards();
284 findkey(kv
, "CONFIG_TYPE", temp
); choise
= atol(temp
);
288 sprintf(message
, ctr
[TR_NETWORK_CONFIGURATION_TYPE_LONG
], NAME
);
289 rc
= newtWinMenu(ctr
[TR_NETWORK_CONFIGURATION_TYPE
], message
, 50, 5, 5,
290 6, configtypenames
, &choise
, ctr
[TR_OK
], ctr
[TR_CANCEL
], NULL
);
291 if ( configtypecards
[choise
] > found
) {
292 sprintf(message
, "(TR) Nicht genuegend Netzwerkkarten fuer diese Auswahl gefunden.\n\nBenoetigt: %d\nGefunden: %d\n", configtypecards
[choise
], found
);
296 while ( configtypecards
[choise
] > found
);
298 if (rc
== 0 || rc
== 1)
301 sprintf(temp
, "%d", choise
);
302 replacekeyvalue(kv
, "CONFIG_TYPE", temp
);
303 clear_card_entry(_RED_CARD_
);
304 clear_card_entry(_ORANGE_CARD_
);
305 clear_card_entry(_BLUE_CARD_
);
307 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
308 netaddresschange
= 1;
317 /* Driver menu. Choose drivers.. */
320 struct keyvalue
*kv
= initkeyvalues();
321 char message
[STRING_SIZE
];
322 char temp
[STRING_SIZE
];
325 int i
, rc
, kcount
= 0, neednics
; //i = 0, count = 0,
327 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
330 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
334 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
335 configtype
= atol(temp
);
337 strcpy(message
, ctr
[TR_CONFIGURE_NETWORK_DRIVERS
]);
339 kcount
= 0; // counter to find knowing nics.
340 neednics
= 0; // counter to use needing nics.
342 sprintf(temp
, "GREEN: %s\n", knics
[_GREEN_CARD_
].description
);
343 strcat(message
, temp
);
344 if (strlen(knics
[_GREEN_CARD_
].macaddr
) ) {
345 sprintf(temp
, "GREEN: (%s) %s green0\n", knics
[_GREEN_CARD_
].macaddr
, ctr
[TR_AS
]);
346 strcat(message
, temp
);
351 sprintf(temp
, "RED: %s\n", knics
[_RED_CARD_
].description
);
352 strcat(message
, temp
);
353 if (strlen(knics
[_RED_CARD_
].macaddr
) ) {
354 sprintf(temp
, "RED: (%s) %s red0\n", knics
[_RED_CARD_
].macaddr
, ctr
[TR_AS
]);
355 strcat(message
, temp
);
360 sprintf(temp
, "ORANGE: %s\n", knics
[_ORANGE_CARD_
].description
);
361 strcat(message
, temp
);
362 if ( strlen(knics
[_ORANGE_CARD_
].macaddr
) ) {
363 sprintf(temp
, "ORANGE: (%s) %s orange0\n", knics
[_ORANGE_CARD_
].macaddr
, ctr
[TR_AS
]);
364 strcat(message
, temp
);
369 sprintf(temp
, "BLUE: %s\n", knics
[_BLUE_CARD_
].description
);
370 strcat(message
, temp
);
371 if (strlen(knics
[_BLUE_CARD_
].macaddr
)) {
372 sprintf(temp
, "BLUE: (%s) %s blue0\n", knics
[_BLUE_CARD_
].macaddr
, ctr
[TR_AS
]);
373 strcat(message
, temp
);
378 for ( i
=0 ; i
<4;i
++) if (strcmp(knics
[i
].macaddr
, "")) kcount
++;
380 if (neednics
= kcount
)
382 strcat(message
, ctr
[TR_DO_YOU_WISH_TO_CHANGE_THESE_SETTINGS
]);
383 rc
= newtWinChoice(ctr
[TR_DRIVERS_AND_CARD_ASSIGNMENTS
], ctr
[TR_OK
],
384 ctr
[TR_CANCEL
], message
);
385 if (rc
== 0 || rc
== 1)
387 /* Shit, got to do something.. */
391 /* Shit, got to do something.. */
399 int set_menu_entry_for(int *nr
, int *card
)
404 int changedrivers(void)
406 struct keyvalue
*kv
= initkeyvalues();
407 char temp
[STRING_SIZE
], message
[STRING_SIZE
];
409 int green
= 0, red
= 0, blue
= 0, orange
= 0;
410 char MenuInhalt
[10][180];
411 char *pMenuInhalt
[10];
412 int count
= 0, choise
= 0, rc
;
415 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
418 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
421 runcommandwithstatus("/etc/rc.d/init.d/network stop red blue orange",
422 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
424 findkey(kv
, "CONFIG_TYPE", temp
); configtype
= atol(temp
);
426 { green
= 1; red
= 1; }
427 else if (configtype
== 2)
428 { green
= 1; red
= 1; orange
= 1; }
429 else if (configtype
== 3)
430 { green
= 1; red
= 1; blue
= 1; }
431 else if (configtype
== 4)
432 { green
= 1; red
=1; orange
=1; blue
= 1; }
437 strcpy(message
, "(TR) Bitte wählen Sie das Interface aus das geaendert werden soll.\n\n");
440 strcpy(MenuInhalt
[count
], "GREEN");
441 pMenuInhalt
[count
] = MenuInhalt
[count
];
442 NicEntry
[_GREEN_CARD_
] = count
;
443 sprintf(temp
, "GREEN: %s\n", knics
[_GREEN_CARD_
].description
);
444 strcat(message
, temp
);
445 if ( strlen(knics
[_GREEN_CARD_
].macaddr
) ) {
446 sprintf(temp
, "GREEN: (%s) %s green0\n", knics
[_GREEN_CARD_
].macaddr
, ctr
[TR_AS
]);
447 strcat(message
, temp
);
453 strcpy(MenuInhalt
[count
], "RED");
454 pMenuInhalt
[count
] = MenuInhalt
[count
];
455 NicEntry
[_RED_CARD_
] = count
;
456 sprintf(temp
, "RED: %s\n", knics
[_RED_CARD_
].description
);
457 strcat(message
, temp
);
458 if ( strlen(knics
[_RED_CARD_
].macaddr
) ) {
459 sprintf(temp
, "RED: (%s) %s red0\n", knics
[_RED_CARD_
].macaddr
, ctr
[TR_AS
]);
460 strcat(message
, temp
);
466 strcpy(MenuInhalt
[count
], "ORANGE");
467 pMenuInhalt
[count
] = MenuInhalt
[count
];
468 NicEntry
[_ORANGE_CARD_
] = count
;
469 sprintf(temp
, "ORANGE: %s\n", knics
[_ORANGE_CARD_
].description
);
470 strcat(message
, temp
);
471 if ( strlen(knics
[_ORANGE_CARD_
].macaddr
) ) {
472 sprintf(temp
, "ORANGE: (%s) %s orange0\n", knics
[_ORANGE_CARD_
].macaddr
, ctr
[TR_AS
]);
473 strcat(message
, temp
);
479 strcpy(MenuInhalt
[count
], "BLUE");
480 pMenuInhalt
[count
] = MenuInhalt
[count
];
481 NicEntry
[_BLUE_CARD_
] = count
;
482 sprintf(temp
, "BLUE: %s\n", knics
[_BLUE_CARD_
].description
);
483 strcat(message
, temp
);
484 if ( strlen(knics
[_BLUE_CARD_
].macaddr
) ) {
485 sprintf(temp
, "BLUE: (%s) %s blue0\n", knics
[_BLUE_CARD_
].macaddr
, ctr
[TR_AS
]);
486 strcat(message
, temp
);
490 pMenuInhalt
[count
] = NULL
;
492 rc
= newtWinMenu("(TR) Netcard Farbe", message
, 70, 5, 5, 6, pMenuInhalt
, &choise
, ctr
[TR_SELECT
], "(TR) Entfernen" , ctr
[TR_DONE
], NULL
);
494 if ( rc
== 0 || rc
== 1) {
495 if ((green
) && ( choise
== NicEntry
[0])) nicmenu(_GREEN_CARD_
);
496 if ((red
) && ( choise
== NicEntry
[1])) nicmenu(_RED_CARD_
);
497 if ((orange
) && ( choise
== NicEntry
[2])) nicmenu(_ORANGE_CARD_
);
498 if ((blue
) && ( choise
== NicEntry
[3])) nicmenu(_BLUE_CARD_
);
499 netaddresschange
= 1;
500 } else if (rc
== 2) {
501 if ((green
) && ( choise
== NicEntry
[0])) ask_clear_card_entry(_GREEN_CARD_
);
502 if ((red
) && ( choise
== NicEntry
[1])) ask_clear_card_entry(_RED_CARD_
);
503 if ((orange
) && ( choise
== NicEntry
[2])) ask_clear_card_entry(_ORANGE_CARD_
);
504 if ((blue
) && ( choise
== NicEntry
[3])) ask_clear_card_entry(_BLUE_CARD_
);
505 netaddresschange
= 1;
514 // Let user change GREEN address.
515 int greenaddressmenu(void)
517 struct keyvalue
*kv
= initkeyvalues();
521 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
524 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
528 sprintf(message
, ctr
[TR_WARNING_LONG
], NAME
);
529 rc
= newtWinChoice(ctr
[TR_WARNING
], ctr
[TR_OK
], ctr
[TR_CANCEL
], message
);
531 if (rc
== 0 || rc
== 1)
533 if (changeaddress(kv
, "GREEN", 0, ""))
535 netaddresschange
= 1;
536 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
546 // They can change BLUE, ORANGE and GREEN too :)
547 int addressesmenu(void)
549 struct keyvalue
*kv
= initkeyvalues();
550 struct keyvalue
*mainkv
= initkeyvalues();
553 char *green
= "GREEN";
554 char *orange
= "ORANGE";
558 char greenaddress
[STRING_SIZE
];
559 char oldgreenaddress
[STRING_SIZE
];
560 char temp
[STRING_SIZE
];
561 char temp2
[STRING_SIZE
];
566 char hostname
[STRING_SIZE
];
568 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
571 freekeyvalues(mainkv
);
572 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
575 if (!(readkeyvalues(mainkv
, CONFIG_ROOT
"/main/settings")))
578 freekeyvalues(mainkv
);
579 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
583 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
584 configtype
= atol(temp
);
595 sections
[c
] = orange
;
609 rc
= newtWinMenu(ctr
[TR_ADDRESS_SETTINGS
],
610 ctr
[TR_SELECT_THE_INTERFACE_YOU_WISH_TO_RECONFIGURE
], 50, 5,
611 5, 6, sections
, &choice
, ctr
[TR_OK
], ctr
[TR_DONE
], NULL
);
613 if (rc
== 0 || rc
== 1)
615 if (strcmp(sections
[choice
], "GREEN") == 0)
617 findkey(kv
, "GREEN_ADDRESS", oldgreenaddress
);
618 sprintf(message
, ctr
[TR_WARNING_LONG
], NAME
);
619 rc
= newtWinChoice(ctr
[TR_WARNING
], ctr
[TR_OK
], ctr
[TR_CANCEL
],
621 if (rc
== 0 || rc
== 1)
623 if (changeaddress(kv
, "GREEN", 0, ""))
625 netaddresschange
= 1;
626 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
628 findkey(kv
, "GREEN_ADDRESS", greenaddress
);
629 snprintf(temp
, STRING_SIZE
-1, "option routers %s", oldgreenaddress
);
630 snprintf(temp2
, STRING_SIZE
-1, "option routers %s", greenaddress
);
631 replace (CONFIG_ROOT
"/dhcp/dhcpd.conf", temp
, temp2
);
632 chown (CONFIG_ROOT
"/dhcp/dhcpd.conf", 99, 99);
636 if (strcmp(sections
[choice
], "BLUE") == 0)
638 if (changeaddress(kv
, "BLUE", 0, ""))
639 netaddresschange
= 1;
641 if (strcmp(sections
[choice
], "ORANGE") == 0)
643 if (changeaddress(kv
, "ORANGE", 0, ""))
644 netaddresschange
= 1;
646 if (strcmp(sections
[choice
], "RED") == 0)
648 strcpy(hostname
, "");
649 findkey(mainkv
, "HOSTNAME", hostname
);
650 if (changeaddress(kv
, "RED", 1, hostname
))
651 netaddresschange
= 1;
658 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
660 freekeyvalues(mainkv
);
665 /* DNS and default gateway.... */
666 int dnsgatewaymenu(void)
668 struct keyvalue
*kv
= initkeyvalues();
670 char temp
[STRING_SIZE
] = "0";
671 struct newtWinEntry entries
[DNSGATEWAY_TOTAL
+1];
672 char *values
[DNSGATEWAY_TOTAL
]; /* pointers for the values. */
677 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
680 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
684 entries
[DNS1
].text
= ctr
[TR_PRIMARY_DNS
];
685 strcpy(temp
, ""); findkey(kv
, "DNS1", temp
);
686 values
[DNS1
] = strdup(temp
);
687 entries
[DNS1
].value
= &values
[DNS1
];
688 entries
[DNS1
].flags
= 0;
690 entries
[DNS2
].text
= ctr
[TR_SECONDARY_DNS
];
691 strcpy(temp
, ""); findkey(kv
, "DNS2", temp
);
692 values
[DNS2
] = strdup(temp
);
693 entries
[DNS2
].value
= &values
[DNS2
];
694 entries
[DNS2
].flags
= 0;
696 entries
[DEFAULT_GATEWAY
].text
= ctr
[TR_DEFAULT_GATEWAY
];
697 strcpy(temp
, ""); findkey(kv
, "DEFAULT_GATEWAY", temp
);
698 values
[DEFAULT_GATEWAY
] = strdup(temp
);
699 entries
[DEFAULT_GATEWAY
].value
= &values
[DEFAULT_GATEWAY
];
700 entries
[DEFAULT_GATEWAY
].flags
= 0;
702 entries
[DNSGATEWAY_TOTAL
].text
= NULL
;
703 entries
[DNSGATEWAY_TOTAL
].value
= NULL
;
704 entries
[DNSGATEWAY_TOTAL
].flags
= 0;
710 rc
= newtWinEntries(ctr
[TR_DNS_AND_GATEWAY_SETTINGS
],
711 ctr
[TR_DNS_AND_GATEWAY_SETTINGS_LONG
], 50, 5, 5, 18, entries
,
712 ctr
[TR_OK
], ctr
[TR_CANCEL
], NULL
);
713 if (rc
== 0 || rc
== 1)
715 strcpy(message
, ctr
[TR_INVALID_FIELDS
]);
716 if (strlen(values
[DNS1
]))
718 if (inet_addr(values
[DNS1
]) == INADDR_NONE
)
720 strcat(message
, ctr
[TR_PRIMARY_DNS_CR
]);
724 if (strlen(values
[DNS2
]))
726 if (inet_addr(values
[DNS2
]) == INADDR_NONE
)
728 strcat(message
, ctr
[TR_SECONDARY_DNS_CR
]);
732 if (strlen(values
[DEFAULT_GATEWAY
]))
734 if (inet_addr(values
[DEFAULT_GATEWAY
]) == INADDR_NONE
)
736 strcat(message
, ctr
[TR_DEFAULT_GATEWAY_CR
]);
740 if (!strlen(values
[DNS1
]) && strlen(values
[DNS2
]))
742 strcpy(message
, ctr
[TR_SECONDARY_WITHOUT_PRIMARY_DNS
]);
750 replacekeyvalue(kv
, "DNS1", values
[DNS1
]);
751 replacekeyvalue(kv
, "DNS2", values
[DNS2
]);
752 replacekeyvalue(kv
, "DEFAULT_GATEWAY", values
[DEFAULT_GATEWAY
]);
753 netaddresschange
= 1;
756 free(values
[DEFAULT_GATEWAY
]);
757 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");