|
|
1.1 root 1: /*
2: * install.c
3: *
4: * Last hacked 07/26/92, COH 386
5: *
6: * Install COHERENT disks on a system.
7: * This is the back end of the initial COHERENT installation procedure;
8: * the first part is in build.c.
9: * Without the -b option, it installs an update to an existing COH system.
10: * Uses common routines in build0.o: cc install.c build0.c
11: * Usage: install [ -bdv ] id device ndisks
12: * Options:
13: * -b Build: special processing for build, part 2.
14: * -d Debug, echo commands without executing
15: * -u Update: special processing for build, part 2.
16: * -v Verbose
17: */
18:
19: #include <stdio.h>
20: #include "build0.h"
21:
22: #define VERSION "2.5"
23: #define USAGE "Usage: /etc/install [ -bduv ] id device ndisks\n"
24:
25: /* Forward. */
26: void config();
27: void done();
28: void install();
29: int newdisk();
30: void newusr();
31: void setbaud();
32:
33: /* Globals. */
34: int bflag; /* build flag */
35: char *device; /* special device name */
36: char *id; /* disk id */
37: int ndisks; /* number of disks */
38: int update; /* perform update install */
39:
40: /*
41: * Baud rate table for serial port initialization.
42: * The index in the table gives the baud rate value from <sgtty.h>.
43: */
44: #if !_I386
45: #define MAXBAUD 17
46: int baudrate[MAXBAUD+1] = {
47: 0, 50, 75, 110, 134, 150, 200, 300, 600, 1200, 1800, 2000,
48: 2400, 3600, 4800, 7200, 9600, 19200
49: };
50: #endif
51:
52: main(argc, argv) int argc; char *argv[];
53: {
54: register char *s;
55: register int i;
56:
57: argv0 = argv[0];
58: abortmsg = 1;
59: usagemsg = USAGE;
60: if (argc > 1 && argv[1][0] == '-') {
61: for (s = &argv[1][1]; *s; ++s) {
62: switch(*s) {
63: case 'b': ++bflag; break;
64: case 'd': ++dflag; break;
65: case 'u': ++update; break;
66: case 'v': ++vflag; break;
67: case 'V':
68: fprintf(stderr, "%s: V%s\n", argv0, VERSION);
69: break;
70: default: usage(); break;
71: }
72: }
73: --argc;
74: ++argv;
75: }
76: if (argc != 4)
77: usage();
78: id = argv[1];
79: device = argv[2];
80: ndisks = atoi(argv[3]);
81:
82: /* Add line to /etc/install.log. */
83: sprintf(cmd, "/bin/echo /etc/install: %s %s %s >>/etc/install.log",
84: argv[1], argv[2], argv[3]);
85: sys(cmd, S_NONFATAL);
86: sys("/bin/date >>/etc/install.log", S_NONFATAL);
87:
88: /* Remove old ids and postfile if present. */
89: if (bflag || update) /* Leave disk 1 marker on /. */
90: sprintf(cmd, "/bin/rm -f /%s.[023456789]* /conf/%s.post", id, id);
91: else
92: sprintf(cmd, "/bin/rm -f /%s.* /conf/%s.post", id, id);
93: sys(cmd, S_IGNORE);
94: if (bflag || update)
95: sys("/etc/mount.all", S_NONFATAL);
96: cls(0);
97:
98: #if 0
99: /* Execute prefile. Not required for the moment. */
100: sprintf(cmd, "/conf/%s.pre", id);
101: if (exists(cmd)) {
102: cls(0);
103: sys(cmd, S_NONFATAL);
104: }
105: #endif
106:
107: /*
108: * Install disks.
109: * Disk numbers are 2 to ndisks for build, 1 to ndisks otherwise.
110: */
111: for (i = ((bflag || update) ? 2 : 1); i <= ndisks; ++i)
112: install(i);
113: if (bflag)
114: newusr();
115: if (bflag || update) {
116: config();
117: done();
118: }
119:
120: /* Delete ids and execute postfile if present. */
121: sprintf(cmd, "/bin/rm -f /%s.*", id);
122: sys(cmd, S_NONFATAL);
123: sprintf(cmd, "/conf/%s.post", id);
124: if (exists(cmd)) {
125: cls(0);
126: if (update)
127: strcat(cmd, " -u");
128: sys(cmd, S_NONFATAL);
129: }
130: sys("/bin/echo /etc/install: success >>/etc/install.log", S_NONFATAL);
131: sys("/bin/date >>/etc/install.log", S_NONFATAL);
132: sys("/bin/echo >>/etc/install.log", S_NONFATAL);
133: if (bflag || update)
134: sys("/etc/umount.all", S_NONFATAL);
135: cls(0);
136: printf("You have completed the %s procedure successfully.\n",
137: (update) ? "update" : "installation");
138: printf("Don't forget to remove the last diskette from the disk drive.\n");
139: sync();
140: exit(0);
141: }
142:
143: /*
144: * System-specific configuration. A lot of grunge.
145: */
146: void
147: config()
148: {
149: register int port, i, polled, parallel;
150: char device[6+1]; /* e.g. "com1pr" */
151: char rdevice[7+1];
152:
153: cls(1);
154:
155: if (bflag) {
156: /*
157: * graft customer's serial number into /usr/lib/uucp/L.sys to
158: * reduce tech calls.
159: */
160: sprintf(cmd, "/bin/sed -e s/SERIALNUM/`cat /etc/serialno`/g "
161: "</usr/lib/uucp/L.sys >/tmp/L.sys ; "
162: "/bin/cp /tmp/L.sys /usr/lib/uucp/L.sys ; /bin/rm /tmp/L.sys");
163: sys(cmd, S_NONFATAL);
164: }
165:
166: if (yes_no("Does your computer system have a modem")) {
167: printf(
168: "You must specify which asychronous serial line your modem will use.\n"
169: "See the article \"%s\" in the COHERENT documentation for details.\n",
170: #if _I386
171: "asy");
172: #else
173: "com");
174: #endif
175: port = get_int(1, 4, "Enter 1 to 4 for COM1 through COM4:");
176: i = (port > 2) ? port - 2 : port; /* 1 or 2 */
177: printf(
178: "If your computer system uses both ports COM%d and COM%d,\n"
179: "one must be run in polled mode rather than interrupt-driven.\n",
180: i, i+2);
181: polled = yes_no("Do you want to run COM%d in polled mode", port);
182: sprintf(cmd, "/bin/ln -f /dev/com%d%sl /dev/modem",
183: port, (polled) ? "p" : "");
184: if (sys(cmd, S_NONFATAL) == 0)
185: printf("/dev/modem is now linked to /dev/com%d%sl.\n",
186: port, (polled) ? "p" : "");
187: printf("\n");
188: }
189: if (bflag && yes_no("Does your computer system have a printer")) {
190: printf(
191: "Your printer is connected to your computer system either through a\n"
192: "parallel port or through a serial port; most printers are connected\n"
193: "through parallel port LPT1.\n"
194: );
195: again:
196: parallel = yes_no("Is your printer connected through a parallel port");
197: if (parallel) {
198: port = get_int(1, 3, "Enter 1, 2 or 3 for port LPT1, LPT2 or LPT3:");
199: sprintf(device, "lpt%d", port);
200: } else {
201: port = get_int(1, 4, "Enter 1 to 4 for COM1 through COM4:");
202: i = (port > 2) ? port - 2 : port;
203: printf(
204: "If your computer system uses both ports COM%d and COM%d,\n"
205: "one must be run in polled mode rather than interrupt-driven.\n",
206: i, i+2);
207: polled = yes_no("Do you want to run COM%d in polled mode", port);
208: sprintf(device, "com%d%sl", port, (polled) ? "p" : "");
209: printf("By default, COM%d runs at 9600 baud.\n", port);
210: #if _I386
211: printf(
212: "If you need a different speed, refer to lexicon article \"asy\" after\n"
213: "the installation procedure completes.\n");
214: #else
215: if (yes_no("Does your device use a different baud rate"))
216: setbaud(port);
217: #endif
218: }
219: printf(
220: "Even if you know which port your printer uses under your existing operating\n"
221: "system, under COHERENT the port name may be different. For this reason,\n"
222: "we strongly recommend that you test your printer configuration.\n"
223: "If you test your printer configuration and see no output on your printer,\n"
224: "you can try a different configuration until you find the one which works.\n"
225: );
226: if (yes_no("Do you want to test whether your printer configuration is correct")) {
227: /* The command below is backgrounded in case it hangs. */
228: if (yes_no("Is your printer a PostScript language printer"))
229: sprintf(cmd,
230: "/bin/echo 'PostScript\ndevice\n/dev/%s.' | prps -p10 >/dev/%s&",
231: device, device);
232: else /* non-PS printer */
233: sprintf(cmd,
234: "/bin/echo -n 'This is printing on device /dev/%s.\r\n\014' >/dev/%s&",
235: device, device); /* 014 is formfeed */
236: printf("Testing /dev/%s: process ", device);
237: fflush(stdout);
238: sys(cmd, S_IGNORE);
239: if (!yes_no("\nDid output appear on your printer")) {
240: printf(
241: "Now try again, specifying a different port for your printer.\n"
242: );
243: goto again;
244: }
245: }
246: sprintf(cmd, "/bin/ln -f /dev/%s /dev/lp", device);
247: if (sys(cmd, S_NONFATAL) == 0)
248: printf("/dev/lp is now linked to /dev/%s.\n", device);
249: if (yes_no("Is your printer an HP LaserJet compatible laser printer")) {
250: sprintf(cmd, "/bin/ln -f /dev/%s /dev/hp", device);
251: if (sys(cmd, S_NONFATAL) == 0)
252: printf("/dev/hp is now linked to /dev/%s.\n", device);
253: sprintf(rdevice, "%s%s", (parallel) ? "r" : "", device);
254: sprintf(cmd, "/bin/ln -f /dev/%s /dev/rhp", rdevice);
255: if (sys(cmd, S_NONFATAL) == 0)
256: printf("/dev/rhp is now linked to /dev/%s.\n", rdevice);
257: }
258: printf("\n");
259: }
260: }
261:
262: /*
263: * Finish up.
264: */
265: void
266: done()
267: {
268: cls(1);
269:
270: /* Replace the install version of /etc/brc with the normal one. */
271: sys("/bin/rm /etc/brc", S_NONFATAL);
272: sys("/bin/ln -f /etc/brc.coh /etc/brc", S_NONFATAL);
273: }
274:
275: /*
276: * Install disk n.
277: */
278: void
279: install(n) int n;
280: {
281: register int i;
282:
283: again:
284: get_line("Insert a disk from the installation kit into the drive and hit <Enter>.",
285: n);
286: sprintf(cmd, "/etc/mount %s /mnt -r", device);
287: if (sys(cmd, S_NONFATAL))
288: goto again;
289: if ((i = newdisk()) == 0) {
290: sprintf(cmd, "/etc/umount %s", device);
291: sys(cmd, S_NONFATAL);
292: goto again;
293: }
294: printf("Copying disk %d. This will take a few minutes...\n", i);
295: sprintf(cmd, "/bin/cpdir -ad%s -smnt %s /mnt /",
296: (vflag) ? "v" : "", (update) ? "`cat /conf/upd_suppress`" : "");
297: sys(cmd, S_FATAL);
298: sprintf(cmd, "/etc/umount %s", device);
299: sys(cmd, S_NONFATAL);
300: sprintf(cmd, "/bin/echo /etc/install: disk %d installed >>/etc/install.log",
301: i);
302: sys(cmd, S_NONFATAL);
303: }
304:
305: /*
306: * Check for an appropriate id on the disk on /mnt.
307: * Return 0 if not found, disk number otherwise.
308: */
309: int
310: newdisk()
311: {
312: register int i;
313: static int n;
314:
315: if (dflag)
316: return (n >= ndisks) ? 0 : ++n;
317: for (i = 1; i <= ndisks; i++) {
318: sprintf(buf, "/mnt/%s.%d", id, i);
319: if (!exists(buf))
320: continue; /* not disk i */
321: sprintf(buf, "/%s.%d", id, i);
322: if (exists(buf)) { /* exists on root */
323: printf(
324: "The disk you inserted is disk %d of the kit;\n"
325: "it has already been copied to the hard disk.\n"
326: "Please try again.\n",
327: i);
328: return 0; /* wrong disk */
329: }
330: return i; /* ok */
331: }
332: printf(
333: "The disk you inserted is not part of the kit.\n"
334: "Please try again.\n"
335: );
336: return 0; /* no id found */
337: }
338:
339: /*
340: * Install new users.
341: */
342: void
343: newusr()
344: {
345: static int flag = 0;
346: register int n, status, passwd;
347: register char *s;
348: char homeparent[80], user[80];
349:
350: cls(0);
351: printf(
352: "Your COHERENT system initially allows logins by users \"root\" (superuser)\n"
353: "and \"bin\" (system administrator). In addition, the password file contains\n"
354: "special entries for \"remacc\" (to control remote access, e.g. via modem),\n"
355: "\"daemon\" (the spooler), \"sys\" (to access system information), and\n"
356: "\"uucp\" (for communication with other COHERENT systems).\n"
357: "\n"
358: "If your system has multiple users or allows remote logins, you should assign\n"
359: "a password to each user.\n"
360: "\n"
361: );
362: passwd = yes_no("Do you want to assign passwords to users");
363: if (passwd) {
364: printf("You must enter each password twice.\n");
365: if (yes_no("Do you want to assign a password for user \"root\""))
366: sys("passwd root", S_NONFATAL);
367: if (yes_no("Do you want to assign a remote access password"))
368: sys("passwd remacc", S_NONFATAL);
369: if (yes_no("Do you want to assign a password for user \"bin\""))
370: sys("passwd bin", S_NONFATAL);
371: if (yes_no("Do you want to assign a password for user \"uucp\""))
372: sys("passwd uucp", S_NONFATAL);
373: }
374: printf(
375: "\nYou should create a login for each additional user of your system.\n"
376: );
377: for (n = 0; ;) {
378: if (!yes_no("Do you want to create another login"))
379: break;
380: if (++n == 1) {
381: printf(
382: "You must specify a login name, a full name and a shell for each user.\n"
383: "Joe Smith might have login name \"joe\" and full name \"Joseph H. Smith.\"\n"
384: "His home directory would be in \"/usr\" by default, namely \"/usr/joe\".\n"
385: "Do not type quotation marks around the names you enter.\n"
386: );
387: if (yes_no("Do you want home directories in \"/usr\""))
388: strcpy(homeparent, "/usr");
389: else {
390: again:
391: s = get_line("Where do you want home directories?");
392: if (*s != '/') {
393: printf(
394: "Please enter a name beginning with '/', such as \"/u\".\n"
395: );
396: goto again;
397: } else
398: strcpy(homeparent, s);
399: }
400: if ((status = is_dir(homeparent)) == -1) {
401: printf("%s is not a directory, try again.\n",
402: homeparent);
403: goto again;
404: } else if (status == 0) {
405: sprintf(cmd, "/bin/mkdir -r %s", homeparent);
406: if (sys(cmd, S_NONFATAL) != 0)
407: goto again;
408: }
409: }
410: s = get_line("Login name:");
411: strcpy(user, s);
412: sprintf(cmd, "/etc/newusr %s ", s);
413: s = get_line("Full name:");
414: sprintf(&cmd[strlen(cmd)], "\"%s\" %s", s, homeparent);
415: if (flag == 0) {
416: ++flag; /* print only first time through */
417: printf(
418: "COHERENT includes two different command line interpreters, or shells.\n"
419: "A command line interpreter is a program which reads and executes each\n"
420: "command which the user types. The available command line interpreters\n"
421: "are the Bourne shell (/bin/sh) and the Korn shell (/usr/bin/ksh).\n"
422: "Use the Bourne shell if you are not sure which shell to use.\n"
423: "After you have finished installing COHERENT, you can change the shell\n"
424: "for any user by editing the password file /etc/passwd.\n"
425: );
426: }
427: for (s = NULL; s == NULL; ) {
428: if (yes_no("Do you want to user %s to use the Bourne shell (/bin/sh)",
429: user))
430: s = "/bin/sh";
431: else if (yes_no("Do you want to user %s to use the Korn shell (/usr/bin/ksh)",
432: user))
433: s = "/usr/bin/ksh";
434: else
435: printf("You must specify either the Bourne or Korn shell.\n");
436: }
437: sprintf(&cmd[strlen(cmd)], " %s", s);
438: sys(cmd, S_NONFATAL);
439: if (passwd && yes_no("Do you want to assign a password for user \"%s\"", user)) {
440: sprintf(cmd, "passwd %s", user);
441: sys(cmd, S_NONFATAL);
442: }
443: }
444: printf("\n");
445: }
446:
447: #if !_I386
448: /*
449: * Set a serial port baud rate.
450: * Patch the running COHERENT image and /coherent accordingly.
451: */
452: void
453: setbaud(port) int port;
454: {
455: register int i, baud;
456:
457: again:
458: printf(
459: "The COHERENT serial port driver supports the following baud rates:\n"
460: " 50, 75, 110, 134, 150, 200, 300, 600, 1200,\n"
461: " 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200\n"
462: "Enter the baud rate of your device (or 0 if your baud rate"
463: );
464: baud = get_int(0, 19200, "is not listed):");
465: if (baud == 0)
466: return;
467: for (i = 1; i <= MAXBAUD; i++)
468: if (baudrate[i] == baud)
469: break;
470: if (i > MAXBAUD) {
471: printf("COHERENT does not support baud rate %d.\n", baud);
472: goto again;
473: }
474:
475: /* Patch the running COHERENT for possible subsequent test. */
476: sprintf(cmd, "/conf/patch -K /coherent C%dBAUD_=%d", port, i);
477: sys(cmd, S_NONFATAL);
478:
479: /* Patch /coherent for specified baudrate. */
480: sprintf(cmd, "/conf/patch /coherent C%dBAUD_=%d", port, i);
481: sys(cmd, S_NONFATAL);
482: }
483: #endif /* !_I386 */
484: /* end of install.c */
485:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.