Browse Source

udpkg now creates the directories I'll need (is that kosher?, means


			
			
				master
			
			
		
David Whedon 23 years ago
parent
commit
a99939e3c5
  1. 2
      TODO
  2. 4
      debian/control
  3. 7
      debian/menutest
  4. 2
      debian/rules
  5. 24
      debian/templates
  6. 349
      netcfg.c

2
TODO

@ -9,3 +9,5 @@
* what do we do differently if it is a CD filesystem?
* make sure the gateway (if any) is reachable (i.e. is on the system's network)
* clear any DNS entries the user doesn't enter
* fix the strtok() DNS clumsyness
* decide what numbers you will actually present the user with for confirmation (you have overkill now)

4
debian/control

@ -1,8 +1,8 @@
Source: netcfg
Section: debian-installer
Priority: optional
Priority: standard
Maintainer: David Whedon <dwhedon@gordian.com>
Build-Depends: debhelper
Build-Depends: debhelper (>= 2.1.18), dpkg-dev (>= 1.7.0)
Standards-Version: 3.1.1
Package: netcfg

7
debian/menutest

@ -0,0 +1,7 @@
#!/bin/sh
if [ -z "`/sbin/ifconfig -a`" ] ; then
exit 1
else
exit -1
fi

2
debian/rules

@ -30,7 +30,6 @@ build-stamp:
# Add here commands to compile the package.
$(MAKE)
#/usr/bin/docbook-to-man debian/ddetect.sgml > ddetect.1
touch build-stamp
@ -64,7 +63,6 @@ binary-arch: build install
dh_testroot
dh_installdebconf
# dh_installdocs
# dh_undocumented ddetect.1
# dh_installchangelogs
# dh_link
dh_strip

24
debian/templates

@ -19,7 +19,6 @@ Description: Choose the hostname.
hostname for your new system, you may press <ENTER> to use the default hostname
of "debian".
Template: netcfg/get_domain
Type: string
Description: Choose the domain name.
@ -47,6 +46,12 @@ Description: What is your IP gateway address?
your company wide-area net or the Internet. If there is no gateway in your
subnet just leave this field blank.
Template: netcfg/gateway_unreachable
Type: note
Description: The gateway you entered is unreachable.
You may have made an error entering your ipaddress, netmask and/or gateway.
Template: netcfg/get_domain
Type: string
Description: Choose the Domain name.
@ -67,15 +72,16 @@ Template: netcfg/confirm_static_cfg
Type: boolean
Default: true
Description: Is this configuration correct?
hostname = ${hostname}
domain = ${domain}
ipaddress = ${ipaddress}
netmask = ${netmask}
network = ${network}
gateway = ${gateway}
primary DNS = ${primary_DNS}
hostname = ${hostname}
domain = ${domain}
ipaddress = ${ipaddress}
netmask = ${netmask}
network = ${network}
broadcast = ${broadcast}
gateway = ${gateway}
primary DNS = ${primary_DNS}
secondary DNS = ${secondary_DNS}
tertiary DNS = ${tertiary_DNS}
tertiary DNS = ${tertiary_DNS}
Template: netcfg/get_pcmcia_tranceiver
Type: string

349
netcfg.c

@ -1,8 +1,7 @@
/*
netcfg.c - Configures the network
Author - David Whedon, Karl Hammar, Aspö Data
netcfg.c - Configure the network for the debian-installer
Author - David Whedon
Copyright terms: GPL
*/
@ -16,23 +15,25 @@
static char *hostname = NULL;
static char *domain = NULL;
static char *iface = "eth0";
static u_int32_t ipaddress = 0;
static u_int32_t network_address = 0;
char network_address_str[16];
static u_int32_t network = 0;
static u_int32_t broadcast = 0;
static u_int32_t netmask = 0;
char netmask_str[16];
static u_int32_t gateway = 0;
char gateway_str[16];
static u_int32_t nameservers[4]={0};
char nameservers_str[16];
static char address_buf[16];
static u_int32_t nameservers[4] = { 0 };
static struct debconfclient *client;
#define INTERFACES_FILE "/etc/network/interfaces"
#define HOSTS_FILE "/etc/hosts"
#define NETWORKS_FILE "/etc/networks"
#define RESOLV_FILE "/etc/resolv.conf"
#define MAXLINE 128
static char cmd_buf[MAXLINE];
#define INTERFACES_FILE "etc/network/interfaces"
#define HOSTS_FILE "etc/hosts"
#define NETWORKS_FILE "etc/networks"
#define RESOLV_FILE "etc/resolv.conf"
/**
@ -70,146 +71,140 @@ dot2num (u_int32_t * num, char *dot)
}
void
num2dot (u_int32_t num, char *dot)
static char num2dot_buf[16];
char *
num2dot (u_int32_t num)
{
/* dot MUST point to an char arr[16] or longer area */
int byte[4];
int ix;
char *dot = num2dot_buf;
if (!dot)
return;
for (ix = 3; ix >= 0; ix--)
{
byte[ix] = num & 0xff;
num >>= 8;
}
sprintf (dot, "%d.%d.%d.%d", byte[0], byte[1], byte[2], byte[3]);
return dot;
}
char *
debconf_input (char *priority, char *template)
{
client->command (client, "input", priority, template, NULL);
client->command (client, "go", NULL);
client->command (client, "get", template, NULL);
return client->value;
}
void
debconf_subst (char *template, char *key, char *string){
client->command (client, "subst", "netcfg/confirm_static_cfg",
key, string, NULL);
}
void
debconf_unseen(char *template){
client->command (client, "fset", template, "seen",
"false", NULL);
}
void
get_static_cfg (void)
{
int finished = 0;
char *ptr ,*ns1, *ns2, *ns3;
char *ptr, *ns1, *ns2, *ns3;
do
{
hostname = strdup (debconf_input ("high", "netcfg/get_hostname"));
debconf_subst("netcfg/confirm_static_cfg", "hostname", hostname);
client->command (client, "input", "high", "netcfg/get_hostname",
NULL);
client->command (client, "go", NULL);
client->command (client, "get", "netcfg/get_hostname", NULL);
hostname = strdup(client->value);
client->command (client, "subst", "netcfg/confirm_static_cfg",
"hostname", hostname, NULL);
client->command (client, "input", "critical", "netcfg/get_domain",
NULL);
client->command (client, "go", NULL);
client->command (client, "get", "netcfg/get_domain", NULL);
if ( (ptr = client->value) )
{
domain = strdup(ptr);
client->command (client, "subst", "netcfg/confirm_static_cfg", "domain",
domain, NULL);
}
if ((ptr = debconf_input ("high", "netcfg/get_domain")))
{
domain = strdup (ptr);
debconf_subst("netcfg/confirm_static_cfg", "domain", domain);
}
client->command (client, "input", "critical", "netcfg/get_ipaddress",
NULL);
client->command (client, "go", NULL);
client->command (client, "get", "netcfg/get_ipaddress", NULL);
if ( (ptr = client->value) ) {
if ((ptr = debconf_input ("high", "netcfg/get_ipaddress")))
{
dot2num (&ipaddress, ptr);
client->command (client, "subst", "netcfg/confirm_static_cfg",
"ipaddress", ptr, NULL);
}
debconf_subst("netcfg/confirm_static_cfg", "ipaddress", ptr);
}
client->command (client, "input", "critical", "netcfg/get_netmask",
NULL);
client->command (client, "go", NULL);
client->command (client, "get", "netcfg/get_netmask", NULL);
if ( (ptr = client->value) )
{
if ((ptr = debconf_input ("high", "netcfg/get_netmask")))
{
dot2num (&netmask, ptr);
client->command (client, "subst", "netcfg/confirm_static_cfg",
"netmask", ptr, NULL);
}
network_address = ipaddress & netmask;
num2dot(network_address, address_buf);
client->command (client, "subst", "netcfg/confirm_static_cfg",
"network", address_buf, NULL);
client->command (client, "input", "critical", "netcfg/get_gateway",
NULL);
client->command (client, "go", NULL);
client->command (client, "get", "netcfg/get_gateway", NULL);
if ( (ptr = client->value) ) {
dot2num (&ipaddress, ptr);
client->command (client, "subst", "netcfg/confirm_static_cfg",
"gateway", ptr, NULL);
}
debconf_subst("netcfg/confirm_static_cfg", "netmask", ptr);
}
network = ipaddress & netmask;
debconf_subst ("netcfg/confirm_static_cfg", "network", num2dot (network));
client->command (client, "input", "critical", "netcfg/get_nameservers",
NULL);
client->command (client, "go", NULL);
client->command (client, "get", "netcfg/get_nameservers", NULL);
if (( ptr = debconf_input ("high", "netcfg/get_gateway")))
{
dot2num (&gateway, ptr);
debconf_subst("netcfg/confirm_static_cfg", "gateway", ptr);
}
if ((gateway & netmask) != (ipaddress & netmask))
{
client->command (client, "input", "high", "netcfg/gateway_unreachable", NULL);
client->command (client, "go", NULL);
}
if ( (ptr = client->value) ) {
broadcast = (network | ~netmask);
debconf_subst("netcfg/confirm_static_cfg", "broadcast", num2dot(broadcast));
ptr = debconf_input ("high", "netcfg/get_nameservers");
if (ptr)
{
ptr = strdup(ptr);
ns1 = strtok(ptr, " ");
ns2 = strtok(NULL, " ");
ns3 = strtok(NULL, " ");
ptr = strdup (ptr);
ns1 = strtok (ptr, " ");
ns2 = strtok (NULL, " ");
ns3 = strtok (NULL, " ");
if (ns1 != NULL)
debconf_subst("netcfg/confirm_static_cfg", "primary_DNS", ns1);
else
debconf_subst("netcfg/confirm_static_cfg", "primary_DNS", "none");
if (ns1!=NULL)
client->command (client, "subst", "netcfg/confirm_static_cfg",
"primary_DNS", ns1, NULL);
if (ns2!=NULL)
client->command (client, "subst", "netcfg/confirm_static_cfg",
"secondary_DNS", ns2, NULL);
if (ns3!=NULL)
client->command (client, "subst", "netcfg/confirm_static_cfg",
"tertiary_DNS", ns3, NULL);
if (ns2 != NULL)
debconf_subst("netcfg/confirm_static_cfg", "secondary_DNS", ns1);
else
debconf_subst("netcfg/confirm_static_cfg", "secondary_DNS", "none");
if (ns3 != NULL)
debconf_subst("netcfg/confirm_static_cfg", "tertiary_DNS", ns1);
else
debconf_subst("netcfg/confirm_static_cfg", "tertiary_DNS", "none");
free (ptr);
}
client->command (client, "input", "high", "netcfg/confirm_static_cfg",
NULL);
client->command (client, "go", NULL);
client->command (client, "get", "netcfg/confirm_static_cfg", NULL);
ptr = client->value;
}
ptr = debconf_input ("high", "netcfg/confirm_static_cfg");
if (strstr (ptr, "true"))
finished = 1;
else
{
client->command (client, "fset", "netcfg/get_hostname", "seen",
"false", NULL);
client->command (client, "fset", "netcfg/get_domain", "seen",
"false", NULL);
client->command (client, "fset", "netcfg/get_ipaddress", "seen",
"false", NULL);
client->command (client, "fset", "netcfg/get_netmask", "seen",
"false", NULL);
client->command (client, "fset", "netcfg/get_gateway", "seen",
"false", NULL);
client->command (client, "fset", "netcfg/get_nameservers", "seen",
"false", NULL);
client->command (client, "fset", "netcfg/confirm_static_cfg",
"seen", "false", NULL);
free(hostname);
free(domain);
debconf_unseen ("netcfg/get_hostname");
debconf_unseen ("netcfg/get_ipaddress");
debconf_unseen ("netcfg/get_netmask");
debconf_unseen ("netcfg/get_gateway");
debconf_unseen ("netcfg/get_nameservers");
debconf_unseen ("netcfg/get_confirm_static_cfg");
free (hostname);
free (domain);
hostname = domain = NULL;
ipaddress = network = broadcast = netmask = gateway = nameservers[0] = 0 ;
}
}
@ -217,6 +212,18 @@ get_static_cfg (void)
}
FILE *
file_open(char *path){
FILE *fp;
if (( fp = fopen(path, "w")))
return fp;
else
{
perror("fopen");
return NULL;
}
}
@ -225,78 +232,69 @@ write_static_cfg (void)
{
FILE *fp;
/* /etc/hosts */
if ((fp = fopen (HOSTS_FILE, "w")))
{
fprintf(fp, "127.0.0.1\tlocalhost\n");
num2dot (ipaddress, address_buf);
if (domain) {
fprintf(fp, "%s\t%s.%s\t%s\n", address_buf,
hostname, domain, hostname);
} else {
num2dot (ipaddress, address_buf);
fprintf(fp, "%s\t%s\n", address_buf, hostname);
}
if ((fp = file_open (HOSTS_FILE)))
{
fprintf (fp, "127.0.0.1\tlocalhost\n");
if (domain)
{
fprintf (fp, "%s\t%s.%s\t%s\n", num2dot (ipaddress),
hostname, domain, hostname);
}
else
{
fprintf (fp, "%s\t%s\n", num2dot (ipaddress), hostname);
}
fclose(fp);
}
else
fclose (fp);
}
if ((fp = file_open (NETWORKS_FILE)))
{
perror ("fopen");
fprintf (fp, "localnet %s\n", num2dot (network));
fclose (fp);
}
/* /etc/networks */
if ((fp = fopen(NETWORKS_FILE, "w"))) {
num2dot (network_address, address_buf);
fprintf(fp, "localnet %s\n", address_buf);
fclose(fp);
} else {
perror("fopen");
}
/* /etc/resolv.conf */
if ((fp = fopen(RESOLV_FILE, "w"))) {
int i=0;
if (domain) fprintf(fp, "search %s\n", domain);
while(nameservers[i]){
num2dot (nameservers[i++], address_buf);
fprintf(fp, "nameserver %s\n", address_buf);
}
fclose(fp);
} else {
perror("fopen");
}
if ((fp = file_open (RESOLV_FILE)))
{
int i = 0;
if (domain)
fprintf (fp, "search %s\n", domain);
while (nameservers[i])
{
fprintf (fp, "nameserver %s\n", num2dot (nameservers[i++]));
}
fclose (fp);
}
/* /etc/network/interfaces */
if ((fp = fopen (INTERFACES_FILE, "w")))
if ((fp = file_open (INTERFACES_FILE)))
{
fprintf (fp,
"\n# The first network card - this entry was created during the Debian installation\n");
fprintf (fp, "# (network, broadcast and gateway are optional)\n");
fprintf (fp, "iface eth0 inet static\n");
fprintf (fp, "\taddress %s\n", num2dot (ipaddress));
fprintf (fp, "\tnetmask %s\n", num2dot (netmask));
fprintf (fp, "\tnetwork %s\n", num2dot (network));
fprintf (fp, "\tbroadcast %s\n", num2dot (broadcast));
fprintf (fp, "\tgateway %s\n", num2dot (gateway));
fclose (fp);
}
num2dot (ipaddress, address_buf);
fprintf (fp, "\taddress %s\n", address_buf);
}
num2dot (netmask, address_buf);
fprintf (fp, "\tnetmask %s\n", address_buf);
num2dot (ipaddress, address_buf);
fprintf (fp, "\tnetwork %s\n", address_buf);
int
activate_static_net ()
{
num2dot (ipaddress, address_buf);
fprintf (fp, "\tbroadcast %s\n", address_buf);
num2dot (ipaddress, address_buf);
fprintf (fp, "\tgateway %s\n", address_buf);
system ("/sbin/ifconfig lo 127.0.0.1");
fclose (fp);
}
else
{
perror ("fopen");
}
snprintf (cmd_buf, sizeof (cmd_buf),
"/sbin/ifconfig %s %s netmask %s broadcast %s", iface,
num2dot (ipaddress), num2dot (netmask), num2dot (broadcast));
system ("cmd_buf");
return 0;
}
@ -305,15 +303,12 @@ write_static_cfg (void)
int
main (int argc, char *argv[])
{
int i;
dot2num(&i,"192.168.0.1");
fprintf(stderr, "%x\n", i);
client = debconfclient_new ();
client->command (client, "title", "Network Configuration", NULL);
get_static_cfg ();
write_static_cfg ();

Loading…
Cancel
Save