source: ubiquity/trunk/fuentes/d-i/source/netcfg/netcfg.c @ 3069

Last change on this file since 3069 was 3069, checked in by kbut, 3 years ago

Update from upstream

File size: 13.3 KB
Line 
1/*
2   netcfg.c - Configure a network via DHCP or manual configuration
3   for debian-installer
4
5   Copyright (C) 2000-2002  David Kimdon <dwhedon@debian.org>
6                            and others (see debian/copyright)
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software
20   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
21
22*/
23
24#include "netcfg.h"
25#include "nm-conf.h"
26#include <string.h>
27#include <stdlib.h>
28#include <stdio.h>
29#include <unistd.h>
30#include <sys/types.h>
31#include <cdebconf/debconfclient.h>
32#include <debian-installer.h>
33#ifdef WIRELESS
34#include <iwlib.h>
35#endif
36
37static method_t netcfg_method = DHCP;
38
39response_t netcfg_get_method(struct debconfclient *client)
40{
41    int iret;
42
43#ifdef __s390__
44    iret = debconf_input(client, "high", "netcfg/use_autoconfig");
45#else
46    iret = debconf_input(client, "medium", "netcfg/use_autoconfig");
47#endif
48
49    if (debconf_go(client) == CMD_GOBACK)
50        return GO_BACK;
51
52    debconf_get(client, "netcfg/use_autoconfig");
53
54    if (strcmp(client->value, "true") == 0)
55        netcfg_method = DHCP;
56    else
57        netcfg_method = STATIC;
58
59    if (iret == CMD_INPUTINVISIBLE)
60        return NOT_ASKED;
61
62    return 0;
63}
64
65int main(int argc, char *argv[])
66{
67    int num_interfaces = 0;
68    enum { BACKUP,
69           GET_INTERFACE,
70           GET_HOSTNAME_ONLY,
71           GET_METHOD,
72           GET_DHCP,
73           GET_STATIC,
74           GET_VLAN,
75           WCONFIG,
76           WCONFIG_ESSID,
77           WCONFIG_SECURITY_TYPE,
78           WCONFIG_WEP,
79           WCONFIG_WPA,
80           START_WPA,
81           QUIT } state = GET_INTERFACE;
82
83    static struct debconfclient *client;
84    static int requested_wireless_tools = 0;
85    char **ifaces;
86    char *defiface = NULL, *defwireless = NULL;
87    response_t res;
88    int num_ifaces;
89    char buf[256];
90    int rv = 0;
91    struct netcfg_interface interface;
92#ifdef NM
93    struct nm_config_info nmconf;
94#endif
95
96    /* initialize libd-i */
97    di_system_init("netcfg");
98    netcfg_interface_init(&interface);
99
100    if (strcmp(basename(argv[0]), "ptom") != 0)
101        di_info("Starting netcfg v.%s", NETCFG_VERSION);
102
103    parse_args (argc, argv);
104    reap_old_files ();
105    open_sockets();
106
107    /* initialize debconf */
108    client = debconfclient_new();
109    debconf_capb(client, "backup");
110
111    /* Check to see if netcfg should be run at all */
112    debconf_get(client, "netcfg/enable");
113    if (!strcmp(client->value, "false")) {
114        netcfg_get_hostname(client, "netcfg/get_hostname", hostname, 0);
115        netcfg_write_common("", hostname, NULL);
116        return 0;
117    }
118
119    /* always always always default back to autoconfig, unless you've specified
120     * disable_autoconfig on the command line. */
121    debconf_get(client, "netcfg/disable_autoconfig");
122
123    if (!strcmp(client->value, "true"))
124        debconf_set(client, "netcfg/use_autoconfig", "false");
125    else
126        debconf_set(client, "netcfg/use_autoconfig", "true");
127
128    /* Don't ask use_autoconfig question on s390x when
129     * disable_autoconfig was preseeded */
130    debconf_fget(client, "netcfg/disable_autoconfig", "seen");
131    if (!strcmp(client->value, "true"))
132        debconf_fset(client, "netcfg/use_autoconfig", "seen", "true");     
133   
134    /* also support disable_dhcp for compatibility */
135    debconf_get(client, "netcfg/disable_dhcp");
136
137    if (!strcmp(client->value, "true")) {
138        debconf_set(client, "netcfg/use_autoconfig", "false");
139        debconf_fset(client, "netcfg/use_autoconfig", "seen", "true");
140    }
141
142    for (;;) {
143        switch(state) {
144        case BACKUP:
145            return RETURN_TO_MAIN;
146        case GET_INTERFACE:
147            /* If we have returned from outside of netcfg and want to
148             * reconfigure networking, check to see if wpasupplicant is
149             * running, and kill it if it is. If left running when
150             * the interfaces are taken up and down, it appears to
151             * leave it in an inconsistant state */
152            kill_wpa_supplicant();
153
154            /* Reset all interfaces first */
155            num_ifaces = get_all_ifs(1, &ifaces);
156            if (num_ifaces > 0) {
157                while (*ifaces) {
158                    di_debug("Flushing addresses and routes on interface: %s\n", *ifaces);
159
160                    /* Flush all IPv4 addresses */
161                    snprintf(buf, sizeof(buf), "ip -f inet addr flush dev %s", *ifaces);
162                    rv |= di_exec_shell_log(buf);
163
164                    /* Flush all IPv6 addresses */
165                    snprintf(buf, sizeof(buf), "ip -f inet6 addr flush dev %s", *ifaces);
166                    rv |= di_exec_shell_log(buf);
167
168                    /* Flush all IPv4 routes */
169                    snprintf(buf, sizeof(buf), "ip -f inet route flush dev %s", *ifaces);
170                    rv |= di_exec_shell_log(buf);
171
172                    /* Flush all IPv6 routes */
173                    snprintf(buf, sizeof(buf), "ip -f inet6 route flush dev %s", *ifaces);
174                    rv |= di_exec_shell_log(buf);
175
176                    ifaces++;
177                }
178            }
179
180            /* Choose a default by looking for link */
181            if (num_ifaces > 1) {
182                while (*ifaces) {
183                    struct netcfg_interface link_interface;
184
185                    if (check_kill_switch(*ifaces)) {
186                        debconf_subst(client, "netcfg/kill_switch_enabled", "iface", *ifaces);
187                        debconf_input(client, "high", "netcfg/kill_switch_enabled");
188                        if (debconf_go(client) == CMD_GOBACK) {
189                            state = BACKUP;
190                            break;
191                        }
192                        /* Is it still enabled? */
193                        if (check_kill_switch(*ifaces)) {
194                            ifaces++;
195                            continue;
196                        }
197                    }
198
199                    interface_up(*ifaces);
200
201                    netcfg_interface_init(&link_interface);
202                    link_interface.name = strdup(*ifaces);
203                    if (netcfg_detect_link (client, &link_interface) == 1) /* CONNECTED */ {
204                        /* CONNECTED */
205                        di_info("found link on interface %s, making it the default.", *ifaces);
206                        defiface = strdup(*ifaces);
207                        free(link_interface.name);
208                        break;
209                    } else {
210#ifdef WIRELESS
211                        struct wireless_config wc;
212#endif /* WIRELESS */
213                        di_info("found no link on interface %s.", *ifaces);
214#ifdef WIRELESS
215                        if (iw_get_basic_config(wfd, *ifaces, &wc) == 0) {
216                            wc.essid[0] = '\0';
217                            wc.essid_on = 0;
218
219                            iw_set_basic_config(wfd, *ifaces, &wc);
220
221                            sleep(1);
222
223                            iw_get_basic_config(wfd, *ifaces, &wc);
224
225                            if (!empty_str(wc.essid)) {
226                                di_info("%s is associated with %s. Selecting as default", *ifaces, wc.essid);
227                                defiface = strdup(*ifaces);
228                                interface_down(*ifaces);
229                                break;
230                            } else {
231                                di_info("%s is not associated. Relegating to defwireless", *ifaces);
232                                if (defwireless != NULL)
233                                    free (defwireless);
234                                defwireless = strdup(*ifaces);
235                            }
236                        }
237                        else
238                            di_info("%s is not a wireless interface. Continuing.", *ifaces);
239
240                        interface_down(*ifaces);
241#endif
242                    }
243
244                    free(link_interface.name);
245                    interface_down(*ifaces);
246
247                    ifaces++;
248                }
249            }
250
251            if (state == BACKUP)
252                break;
253
254            if (!defiface && defwireless)
255                defiface = defwireless;
256
257            if(netcfg_get_interface(client, &(interface.name), &num_interfaces, defiface))
258                state = BACKUP;
259            else if (! interface.name || ! num_interfaces)
260                state = GET_HOSTNAME_ONLY;
261            else if (is_wireless_iface (interface.name))
262                state = WCONFIG;
263            else
264                state = GET_VLAN;
265            break;
266
267        case GET_VLAN:
268            if (netcfg_set_vlan(client, &interface) == GO_BACK)
269                state = BACKUP;
270            else
271                state = GET_METHOD;
272            break;
273
274        case GET_HOSTNAME_ONLY:
275            if(netcfg_get_hostname(client, "netcfg/get_hostname", hostname, 0))
276                state = BACKUP;
277            else {
278                netcfg_write_common("", hostname, NULL);
279                state = QUIT;
280            }
281            break;
282
283        case GET_METHOD:
284            if ((res = netcfg_get_method(client)) == GO_BACK)
285                state = (num_interfaces == 1) ? BACKUP : GET_INTERFACE;
286            else {
287                if (netcfg_method == DHCP)
288                    state = GET_DHCP;
289                else
290                    state = GET_STATIC;
291            }
292            break;
293
294        case GET_DHCP:
295            switch (netcfg_activate_dhcp(client, &interface)) {
296            case 0:
297                state = QUIT;
298                break;
299            case RETURN_TO_MAIN:
300                /*
301                 * It doesn't make sense to go back to GET_METHOD because
302                 * the user has already been asked whether they want to
303                 * try an alternate method.
304                 */
305                state = (num_interfaces == 1) ? BACKUP : GET_INTERFACE;
306                break;
307            case CONFIGURE_MANUALLY:
308                state = GET_STATIC;
309                break;
310            default:
311                return 1;
312            }
313            break;
314
315        case GET_STATIC:
316            {
317                int ret;
318                /* Misnomer - this should actually take care of activation */
319                if ((ret = netcfg_get_static(client, &interface)) == RETURN_TO_MAIN)
320                    state = GET_INTERFACE;
321                else if (ret)
322                    state = GET_METHOD;
323                else
324                    state = QUIT;
325                break;
326            }
327
328        case WCONFIG:
329            if (requested_wireless_tools == 0) {
330                di_exec_shell_log("apt-install iw wireless-tools");
331                requested_wireless_tools = 1;
332            }
333            state = WCONFIG_ESSID;
334            break;
335
336        case WCONFIG_ESSID:
337            if (netcfg_wireless_set_essid(client, &interface) == GO_BACK)
338                state = BACKUP;
339            else {
340                init_wpa_supplicant_support(&interface);
341                if (interface.wpa_supplicant_status == WPA_UNAVAIL)
342                    state = WCONFIG_WEP;
343                else
344                    state = WCONFIG_SECURITY_TYPE;
345            }
346            break;
347
348        case WCONFIG_SECURITY_TYPE:
349            {
350                int ret;
351                ret = wireless_security_type(client, interface.name);
352                if (ret == GO_BACK)
353                    state = WCONFIG_ESSID;
354                else if (ret == REPLY_WPA) {
355                    state = WCONFIG_WPA;
356                    interface.wifi_security = REPLY_WPA;
357                }
358                else {
359                    state = WCONFIG_WEP;
360                    interface.wifi_security = REPLY_WEP;
361                }
362                break;
363            }
364
365        case WCONFIG_WEP:
366            if (netcfg_wireless_set_wep(client, &interface) == GO_BACK) 
367                if (interface.wpa_supplicant_status == WPA_UNAVAIL)
368                    state = WCONFIG_ESSID;
369                else
370                    state = WCONFIG_SECURITY_TYPE;
371            else
372                state = GET_METHOD;
373            break;
374
375        case WCONFIG_WPA:
376            if (interface.wpa_supplicant_status == WPA_OK) {
377                di_exec_shell_log("apt-install wpasupplicant");
378                interface.wpa_supplicant_status = WPA_QUEUED;
379            }
380
381            if (netcfg_set_passphrase(client, &interface) == GO_BACK)
382                state = WCONFIG_SECURITY_TYPE;
383            else
384                state = START_WPA;
385            break;
386
387        case START_WPA:
388            if (wpa_supplicant_start(client, &interface) == GO_BACK)
389                state = WCONFIG_ESSID;
390            else
391                state = GET_METHOD;
392            break;
393
394        case QUIT:
395#ifdef NM
396            if (num_interfaces > 0) {
397                nm_get_configuration(&interface, &nmconf);
398                nm_write_configuration(nmconf);
399            }
400#endif
401
402            netcfg_update_entropy();
403            return 0;
404        }
405    }
406}
Note: See TracBrowser for help on using the repository browser.