Module Name:    src
Committed By:   nia
Date:           Mon Jan 10 12:17:48 UTC 2022

Modified Files:
        src/usr.sbin/sysinst: msg.mi.de msg.mi.en msg.mi.es msg.mi.fr msg.mi.pl
            net.c

Log Message:
sysinst(8): Add initial support for connecting to Wi-Fi networks
by spawning wpa_supplicant.

Reviewed by martin.


To generate a diff of this commit:
cvs rdiff -u -r1.34 -r1.35 src/usr.sbin/sysinst/msg.mi.de
cvs rdiff -u -r1.36 -r1.37 src/usr.sbin/sysinst/msg.mi.en \
    src/usr.sbin/sysinst/msg.mi.pl src/usr.sbin/sysinst/net.c
cvs rdiff -u -r1.30 -r1.31 src/usr.sbin/sysinst/msg.mi.es
cvs rdiff -u -r1.35 -r1.36 src/usr.sbin/sysinst/msg.mi.fr

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/sysinst/msg.mi.de
diff -u src/usr.sbin/sysinst/msg.mi.de:1.34 src/usr.sbin/sysinst/msg.mi.de:1.35
--- src/usr.sbin/sysinst/msg.mi.de:1.34	Sat Sep 25 08:54:31 2021
+++ src/usr.sbin/sysinst/msg.mi.de	Mon Jan 10 12:17:48 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.de,v 1.34 2021/09/25 08:54:31 maya Exp $	*/
+/*	$NetBSD: msg.mi.de,v 1.35 2022/01/10 12:17:48 nia Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -641,6 +641,12 @@ message net_defroute
 message net_media
 {Art der Netzwerkverbindung}
 
+message net_ssid
+{WLAN-SSID?}
+
+message net_passphrase
+{WLAN-Passwort?}
+
 message netok
 {Nachfolgend sehen Sie die aktuellen Netzwerkeinstellungen.
 

Index: src/usr.sbin/sysinst/msg.mi.en
diff -u src/usr.sbin/sysinst/msg.mi.en:1.36 src/usr.sbin/sysinst/msg.mi.en:1.37
--- src/usr.sbin/sysinst/msg.mi.en:1.36	Sat Sep 25 08:54:31 2021
+++ src/usr.sbin/sysinst/msg.mi.en	Mon Jan 10 12:17:48 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.en,v 1.36 2021/09/25 08:54:31 maya Exp $	*/
+/*	$NetBSD: msg.mi.en,v 1.37 2022/01/10 12:17:48 nia Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -616,6 +616,12 @@ message net_defroute
 message net_media
 {Network media type}
 
+message net_ssid
+{Wi-Fi SSID?}
+
+message net_passphrase
+{Wi-Fi passphrase?}
+
 message netok
 {The following are the values you entered.
 
Index: src/usr.sbin/sysinst/msg.mi.pl
diff -u src/usr.sbin/sysinst/msg.mi.pl:1.36 src/usr.sbin/sysinst/msg.mi.pl:1.37
--- src/usr.sbin/sysinst/msg.mi.pl:1.36	Sat Sep 25 08:54:31 2021
+++ src/usr.sbin/sysinst/msg.mi.pl	Mon Jan 10 12:17:48 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.pl,v 1.36 2021/09/25 08:54:31 maya Exp $	*/
+/*	$NetBSD: msg.mi.pl,v 1.37 2022/01/10 12:17:48 nia Exp $	*/
 /*	Based on english version: */
 /*	NetBSD: msg.mi.pl,v 1.36 2004/04/17 18:55:35 atatat Exp       */
 
@@ -611,6 +611,12 @@ message net_defroute
 message net_media
 {Typ interfejsu sieciowego}
 
+message net_ssid
+{Wi-Fi SSID?}
+
+message net_passphrase
+{Wi-Fi passphrase?}
+
 message netok
 {Ponizej sa wartosci, ktore wprowadziles.
 
Index: src/usr.sbin/sysinst/net.c
diff -u src/usr.sbin/sysinst/net.c:1.36 src/usr.sbin/sysinst/net.c:1.37
--- src/usr.sbin/sysinst/net.c:1.36	Sun Jan 31 22:45:46 2021
+++ src/usr.sbin/sysinst/net.c	Mon Jan 10 12:17:48 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: net.c,v 1.36 2021/01/31 22:45:46 rillig Exp $	*/
+/*	$NetBSD: net.c,v 1.37 2022/01/10 12:17:48 nia Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -79,6 +79,8 @@ static char net_mask[SSTRSIZE];
 char net_namesvr[STRSIZE];
 static char net_defroute[STRSIZE];
 static char net_media[STRSIZE];
+static char net_ssid[STRSIZE];
+static char net_passphrase[STRSIZE];
 static char sl_flags[STRSIZE];
 static int net_dhcpconf;
 #define DHCPCONF_IPADDR         0x01
@@ -100,8 +102,11 @@ static char *url_encode (char *dst, cons
 static void write_etc_hosts(FILE *f);
 
 #define DHCPCD "/sbin/dhcpcd"
+#define WPA_SUPPLICANT "/usr/sbin/wpa_supplicant"
 #include <signal.h>
+static int config_eth_medium(char *);
 static int config_dhcp(char *);
+static int config_wlan(char *);
 
 #ifdef INET6
 static int is_v6kernel (void);
@@ -562,45 +567,8 @@ again:
 		/* domain and host */
 		msg_display(MSG_netinfo);
 
-		/* ethernet medium */
-		for (;;) {
-			msg_prompt_add(MSG_net_media, net_media, net_media,
-					sizeof net_media);
-
-			/*
-			 * ifconfig does not allow media specifiers on
-			 * IFM_MANUAL interfaces.  Our UI gives no way
-			 * to set an option back
-			 * to null-string if it gets accidentally set.
-			 * Check for plausible alternatives.
-			 */
-			if (strcmp(net_media, "<default>") == 0 ||
-			    strcmp(net_media, "default") == 0 ||
-			    strcmp(net_media, "<manual>") == 0 ||
-			    strcmp(net_media, "manual") == 0 ||
-			    strcmp(net_media, "<none>") == 0 ||
-			    strcmp(net_media, "none") == 0 ||
-			    strcmp(net_media, " ") == 0) {
-				*net_media = '\0';
-			}
-
-			if (*net_media == '\0')
-				break;
-			/*
-			 * We must set the media type here - to give dhcp
-			 * a chance
-			 */
-			if (run_program(0, "/sbin/ifconfig %s media %s",
-				    net_dev, net_media) == 0)
-				break;
-			/* Failed to set - output the supported values */
-			if (collect(T_OUTPUT, &textbuf, "/sbin/ifconfig -m %s |"
-				    "while IFS=; read line;"
-				    " do [ \"$line\" = \"${line#*media}\" ] || "
-				    "echo $line;"
-				    " done", net_dev ) > 0)
-				msg_display(textbuf);
-			free(textbuf);
+		if (!config_wlan(net_dev)) {
+			config_eth_medium(net_dev);
 		}
 
 		net_dhcpconf = 0;
@@ -1092,6 +1060,10 @@ mnt_net_config(void)
 	if (net_namesvr[0] != '\0')
 		dup_file_into_target("/etc/resolv.conf");
 
+	/* Copy wpa_supplicant.conf to target. */
+	if (net_ssid[0] != '\0')
+		dup_file_into_target("/etc/wpa_supplicant.conf");
+
 	/*
 	 * bring the interface up, it will be necessary for IPv6, and
 	 * it won't make trouble with IPv4 case either
@@ -1149,6 +1121,11 @@ mnt_net_config(void)
 		add_rc_conf("dhcpcd_flags=\"-qM %s\"\n", net_dev);
         }
 
+	if (net_ssid[0] != '\0') {
+		add_rc_conf("wpa_supplicant=YES\n");
+		add_rc_conf("wpa_supplicant_flags=\"-B -s -i %s -D bsd -c /etc/wpa_supplicant.conf\"\n", net_dev);
+	}
+
 	if (ifconf)
 		fclose(ifconf);
 
@@ -1156,6 +1133,62 @@ mnt_net_config(void)
 }
 
 int
+config_wlan(char *inter)
+{
+	FILE *wpa_conf = NULL;
+	char wpa_cmd[256];
+
+	if (!file_mode_match(WPA_SUPPLICANT, S_IFREG))
+		return 0;
+
+	msg_prompt_add(MSG_net_ssid, net_ssid, net_ssid,
+			sizeof net_ssid);
+	if (net_ssid[0] == '\0')
+		return 0;
+
+	msg_prompt_noecho(MSG_net_passphrase, net_passphrase, net_passphrase,
+			sizeof net_passphrase);
+
+	wpa_conf = fopen("/etc/wpa_supplicant.conf", "a");
+	if (wpa_conf == NULL)
+		return 0;
+
+	scripting_fprintf(NULL,
+	    "cat <<EOF >>%s/etc/wpa_supplicant.conf\n",
+	    target_prefix());
+	scripting_fprintf(wpa_conf, "\n#\n");
+	scripting_fprintf(wpa_conf, "# Added by NetBSD sysinst\n");
+	scripting_fprintf(wpa_conf, "#\n");
+	scripting_fprintf(wpa_conf, "network={\n");
+	scripting_fprintf(wpa_conf,
+	    "\tssid=\"%s\"\n", net_ssid);
+	if (net_passphrase[0] != '\0') {
+		scripting_fprintf(wpa_conf, "\tpsk=\"%s\"\n",
+		    net_passphrase);
+	} else {
+		scripting_fprintf(wpa_conf, "\tkey_mgmt=NONE\n");
+	}
+	scripting_fprintf(wpa_conf, "}\n");
+	(void)fclose(wpa_conf);
+	scripting_fprintf(NULL, "EOF\n");
+
+	if (run_program(RUN_DISPLAY | RUN_PROGRESS,
+	    "/sbin/ifconfig %s up", inter) != 0)
+		return 0;
+
+	/*
+	 * have to use system() here to avoid the server process dying
+	 */
+	if (snprintf(wpa_cmd, sizeof(wpa_cmd),
+	    WPA_SUPPLICANT
+	    " -B -s -i %s -D bsd -c /etc/wpa_supplicant.conf", inter) < 0)
+		return 0;
+	(void)do_system(wpa_cmd);
+
+	return 1;
+}
+
+int
 config_dhcp(char *inter)
 {
 	int dhcpautoconf;
@@ -1176,3 +1209,51 @@ config_dhcp(char *inter)
 	}
 	return 0;
 }
+
+
+int
+config_eth_medium(char *inter)
+{
+	char *textbuf = NULL;
+
+	for (;;) {
+		msg_prompt_add(MSG_net_media, net_media, net_media,
+				sizeof net_media);
+
+		/*
+		 * ifconfig does not allow media specifiers on
+		 * IFM_MANUAL interfaces.  Our UI gives no way
+		 * to set an option back
+		 * to null-string if it gets accidentally set.
+		 * Check for plausible alternatives.
+		 */
+		if (strcmp(net_media, "<default>") == 0 ||
+		    strcmp(net_media, "default") == 0 ||
+		    strcmp(net_media, "<manual>") == 0 ||
+		    strcmp(net_media, "manual") == 0 ||
+		    strcmp(net_media, "<none>") == 0 ||
+		    strcmp(net_media, "none") == 0 ||
+		    strcmp(net_media, " ") == 0) {
+			*net_media = '\0';
+		}
+
+		if (*net_media == '\0')
+			break;
+		/*
+		 * We must set the media type here - to give dhcp
+		 * a chance
+		 */
+		if (run_program(0, "/sbin/ifconfig %s media %s",
+			    net_dev, net_media) == 0)
+			break;
+		/* Failed to set - output the supported values */
+		if (collect(T_OUTPUT, &textbuf, "/sbin/ifconfig -m %s |"
+			    "while IFS=; read line;"
+			    " do [ \"$line\" = \"${line#*media}\" ] || "
+			    "echo $line;"
+			    " done", net_dev ) > 0)
+			msg_display(textbuf);
+		free(textbuf);
+	}
+	return 0;
+}

Index: src/usr.sbin/sysinst/msg.mi.es
diff -u src/usr.sbin/sysinst/msg.mi.es:1.30 src/usr.sbin/sysinst/msg.mi.es:1.31
--- src/usr.sbin/sysinst/msg.mi.es:1.30	Sat Sep 25 08:54:31 2021
+++ src/usr.sbin/sysinst/msg.mi.es	Mon Jan 10 12:17:48 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.es,v 1.30 2021/09/25 08:54:31 maya Exp $	*/
+/*	$NetBSD: msg.mi.es,v 1.31 2022/01/10 12:17:48 nia Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -632,6 +632,12 @@ message net_defroute
 message net_media
 {Tipo de medio de la red}
 
+message net_ssid
+{Wi-Fi SSID?}
+
+message net_passphrase
+{Wi-Fi passphrase?}
+
 message netok
 {Ha introducido los siguientes valores.
 

Index: src/usr.sbin/sysinst/msg.mi.fr
diff -u src/usr.sbin/sysinst/msg.mi.fr:1.35 src/usr.sbin/sysinst/msg.mi.fr:1.36
--- src/usr.sbin/sysinst/msg.mi.fr:1.35	Sat Sep 25 08:54:31 2021
+++ src/usr.sbin/sysinst/msg.mi.fr	Mon Jan 10 12:17:48 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: msg.mi.fr,v 1.35 2021/09/25 08:54:31 maya Exp $	*/
+/*	$NetBSD: msg.mi.fr,v 1.36 2022/01/10 12:17:48 nia Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -626,6 +626,12 @@ message net_defroute
 message net_media
 {Type de réseau (média)}
 
+message net_ssid
+{Wi-Fi SSID?}
+
+message net_passphrase
+{Wi-Fi passphrase?}
+
 message netok
 {Vous avez spécifié les valeurs suivantes :
 

Reply via email to