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