home *** CD-ROM | disk | FTP | other *** search
/ Caldera Network Desktop 1.0 / caldera-network-desktop-1.0.bin / images / ramdisk2.img / usr / lib / perl / fstab < prev    next >
Text File  |  1995-09-06  |  9KB  |  471 lines

  1. ## -*-perl-*-
  2.  
  3. # Routines to set up the filesystem hierarchy
  4.  
  5. # This is where we mount the new Linux filesystem
  6. $fsmount = "/mnt";
  7.  
  8. # %fsformat{device} is used to determine file system types
  9. # if a device is not listed there, we ask the user for the type
  10.  
  11. %fs_pars = ();
  12. %fs_types = ();
  13. %fs_sizes = ();
  14. %fs_mountpoints = ();
  15.  
  16. # Indicates that the installation filesystem is mounted
  17. $fs_mounted = 0;
  18.  
  19. $root_dev = "";
  20.  
  21. sub fstab_reset {
  22.  
  23.     %fs_pars = ();
  24.     %fs_types = ();
  25.     %fs_sizes = ();
  26.     %fs_mountpoints = ();
  27.     %fsformat = ();
  28.     $root_dev = "";
  29. }
  30.  
  31. sub mountpoint_sort {
  32.     $fs_mountpoints{$a} cmp $fs_mountpoints{$b};
  33. }
  34.  
  35. sub init_filesystems {
  36.     local ( %fsinfolist, $dev, $size );
  37.     local ( $p, $r );
  38.     
  39.     if ($fs_mounted) {
  40.     if (! &rhs_menu("Warning",
  41. <<EOM
  42. >
  43. The installation filesystems are already mounted.  DO NOT
  44. make changes to the filesystem mountpoints unless you first
  45. unmount the filesystems and erase them.
  46. >
  47. What do you want to do?
  48. >
  49. EOM
  50.                , 70, 3,
  51.                "Unmount the filesystems", "",
  52.                "Unmount and erase the filesystems", "",
  53.                "Forget it -- do not change the filesystems", "")) {
  54.         return 1;
  55.     }
  56.     if ($dialog_result eq "Forget it -- do not change the filesystems") {
  57.         return 1;
  58.     } elsif ($dialog_result eq "Unmount the filesystems") {
  59.         return 0 if (! &unmount_filesystems);
  60.     } elsif ($dialog_result eq "Unmount and erase the filesystems") {
  61.         return 0 if (! &unmount_filesystems);
  62.         return 0 if (! &erase_filesystems);
  63.     }
  64.     }
  65.  
  66.     ## Find all disk partitions
  67.  
  68.     &rhs_infobox ("Filesystems",
  69. <<EOM
  70. >
  71. Looking for Linux partitions...
  72. >
  73. EOM
  74.           , 60);
  75.  
  76.     %fsinfolist = ();
  77.     open(SAVEERR, ">&STDERR");
  78.     open(STDERR, ">/dev/null");
  79.     open(PROC, "fdisk -l |") || &newdie("Can't call fdisk!");
  80.     while (<PROC>) {
  81.         if (/^(.{10}).{5}(.{31}).*Linux native$/) {
  82.         $p = $1; $r = $2;
  83.         $p =~ s/\s$//;
  84.             $fsinfolist{$p} = "$r";
  85.         }
  86.     }
  87.     close PROC;
  88.     open(STDERR, ">&SAVEERR");
  89.  
  90.     if (keys(%fsinfolist) == 0) {
  91.         &rhs_msgbox ( "Filesystems",
  92. <<EOM
  93. >
  94. You don\'t appear to have any Linux partitions on your system.
  95. You must create at least one before continuing.
  96. >
  97. EOM
  98.                      , 60);
  99.         return 0;
  100.     }
  101.  
  102.     ## Select paritions and mount points
  103.     ## First the special case where there is only one partition
  104.     if (keys(%fsinfolist) == 1) {
  105.     ($dev) = keys(%fsinfolist);
  106.     $fsinfolist{$dev} =~ /^.*(.{9})$/;
  107.     $size = $1;
  108.     chop($size);
  109.  
  110.     $root_dev = $dev;
  111.     $fs_pars{$dev} = $dev;
  112.     $fs_types{$dev} = $fstype;
  113.     $fs_sizes{$dev} = $size;
  114.     $fs_mountpoints{$dev} = "/";
  115.  
  116.     return 1;
  117.     }
  118.  
  119.   SELNEWPAR:
  120.     while(1) {
  121.         $msg =
  122. <<EOM
  123. Your Linux filesystem is set up thusly:
  124. >   Device  Type  Blocks  Location
  125. EOM
  126.     ;
  127.         foreach $ent (sort mountpoint_sort (keys(%fs_mountpoints))) {
  128.             $msg .= sprintf(">%-9s %5s%7s  %s\n", $ent, $fs_types{$ent},
  129.                             $fs_sizes{$ent}, $fs_mountpoints{$ent});
  130.         }
  131.     $msg .= ">";
  132.     if (! &rhs_menu("Filesystems", $msg, 60, 4,
  133.             "Add", "Add a new partition",
  134.             "Remove", "Remove a partition",
  135.             "Edit", "Change the location of a partition",
  136.             "Done", "Continue with install")) {
  137.         %fs_pars = ();
  138.         %fs_types = ();
  139.         %fs_sizes = ();
  140.         %fs_mountpoints = ();
  141.         return 0;
  142.     }
  143.     
  144.     if ($dialog_result eq "Add") {
  145.         &fs_add_filesystem(%fsinfolist);
  146.     } elsif ($dialog_result eq "Remove") {
  147.         &fs_remove_filesystem;
  148.     } elsif ($dialog_result eq "Edit") {
  149.         &fs_edit_filesystem;
  150.     } elsif ($dialog_result eq "Done") {
  151.         if (&fs_verify_fstab) {
  152.         return 1;
  153.         }
  154.     }
  155.     } # while(1)
  156.     
  157.     # should never get here
  158. }
  159.  
  160. sub fs_verify_fstab {
  161.     local ( $ent, $oent );
  162.  
  163.     ## Check for duplicate mount points
  164.     foreach $ent (values (%fs_mountpoints)) {
  165.     if ($ent eq $oent) {
  166.         &rhs_msgbox("Error",
  167. <<EOM
  168. >
  169. The following mount point is used twice!  Only one
  170. partition can be mounted at any one mount point.
  171. >
  172. $ent
  173. >
  174. EOM
  175.             , 60);
  176.         return 0;
  177.     }
  178.     $oent = $ent;
  179.     }
  180.  
  181.     ## Check for a "/" filesystem
  182.  
  183.     $root_dev = "";
  184.     foreach $ent (keys (%fs_mountpoints)) {
  185.     if ($fs_mountpoints{$ent} eq "/") {
  186.         $root_dev = $ent;
  187.         last;
  188.     }
  189.     }
  190.     if ( $root_dev eq "" ) {
  191.     &rhs_msgbox("Error",
  192. <<EOM
  193. >
  194. You have not specified a root parition!
  195. >
  196. You must have a single parition mounted at \"/\".
  197. >
  198. EOM
  199.             , 60);
  200.     return 0;
  201.     }
  202.  
  203.     return 1;
  204. }
  205.  
  206. sub fs_remove_filesystem {
  207.     local ( %fstmp, $ent, $dev );
  208.  
  209.     $fstmp = ();
  210.     foreach $ent (sort mountpoint_sort (keys(%fs_mountpoints))) {
  211.     $fstmp{$ent} = sprintf("%5s%7s  %-12.12s\n", $fs_types{$ent},
  212.                    $fs_sizes{$ent}, $fs_mountpoints{$ent});
  213.     }
  214.  
  215.     if (! &rhs_menua("Filesystems",
  216. <<EOM
  217. >
  218. Which partition do you want to remove?
  219. >
  220. EOM
  221.              , 45, %fstmp)) {
  222.     return 0;
  223.     }
  224.     $dev = $dialog_result;
  225.     delete $fs_pars{$dev};
  226.     delete $fs_sizes{$dev};
  227.     delete $fs_types{$dev};
  228.     delete $fs_mountpoints{$dev};
  229.  
  230.     return 1;
  231. }
  232.  
  233. sub fs_edit_filesystem {
  234.     local ( %fstmp, $ent, $dev );
  235.  
  236.     $fstmp = ();
  237.     foreach $ent (sort mountpoint_sort (keys(%fs_mountpoints))) {
  238.     $fstmp{$ent} = sprintf("%5s%7s  %-12.12s\n", $fs_types{$ent},
  239.                    $fs_sizes{$ent}, $fs_mountpoints{$ent});
  240.     }
  241.  
  242.     if (! &rhs_menua("Filesystems",
  243. <<EOM
  244. >
  245. Which partition do you want to edit?
  246. >
  247. EOM
  248.              , 45, %fstmp)) {
  249.     return 0;
  250.     }
  251.     $dev = $dialog_result;
  252.  
  253.     if (! &rhs_inputbox("Filesystems",
  254. <<EOM
  255. >
  256. Where do you want to mount $dev?
  257. >
  258. EOM
  259.             , 70, $fs_mountpoints{$dev})) {
  260.     return 0;
  261.     }
  262.     $fs_mountpoints{$dev} = $dialog_result;
  263.  
  264.     return 1;
  265. }
  266.  
  267. sub fs_add_filesystem {
  268.     local ( %fsinfolist ) = @_;
  269.     local ( %fstmp, $ent, $entb, $dev, $size );
  270.  
  271.     %fstmp = ();
  272.   ADDNEWPARB:
  273.     foreach $ent (sort keys (%fsinfolist)) {
  274.     foreach $entb (sort keys (%fs_pars)) {
  275.         next ADDNEWPARB if ($ent eq $entb);
  276.     }
  277.     $fstmp{$ent} = $fsinfolist{$ent};
  278.     }
  279.  
  280.     if (! &rhs_menua("Filesystems",
  281. <<EOM
  282. >
  283. Which partition do you want to add?
  284. >
  285. >      Device   Begin   Start     End  Blocks
  286. EOM
  287.              , 54, %fstmp)) {
  288.     return 0;
  289.     }
  290.  
  291.     $dev = $dialog_result;
  292.     $fstmp{$dev} =~ /^.*(.{9})$/;
  293.     $size = $1;
  294.     chop($size);
  295.     return &fs_add($dev, $size);
  296. }
  297.  
  298. sub fs_add {
  299.     local ( $dev, $size ) = @_;
  300.     local ( $mountpoint );
  301.  
  302.     if (! &rhs_inputbox("Filesystems",
  303. <<EOM
  304. >
  305. Where do you want to mount $dev?
  306. >
  307. EOM
  308.             , 70, "")) {
  309.     return 0;
  310.     }
  311.     $mountpoint = $dialog_result;
  312.  
  313.     if ($fsformat{$dev}) {
  314.     $type = $fsformat{$dev};
  315.     } else {
  316.     if (! &rhs_menu("Filesystems",
  317. <<EOM
  318. >
  319. What type of filesystem is on this partition?
  320. >
  321. EOM
  322.             , 50, 3,
  323.             "ext2", "Second Extended FS",
  324.             "minix", "Minix FS",
  325.             "msdos", "MS-DOS FS")) {
  326.         return 0;
  327.     }
  328.     $type = $dialog_result;
  329.     }
  330.  
  331.     $fs_pars{$dev} = $dev;
  332.     $fs_types{$dev} = $type;
  333.     $fs_sizes{$dev} = $size;
  334.     $fs_mountpoints{$dev} = $mountpoint;
  335.  
  336.     return 1;
  337. }
  338.  
  339. sub mount_filesystems {
  340.  
  341.     local ( $ent, $ret );
  342.  
  343.     if ($fs_mounted) {
  344.     &rhs_msgbox("Notice",
  345. <<EOM
  346. >
  347. Your Linux filesystem is already mounted.
  348. >
  349. EOM
  350.             , 60);
  351.     return 1;
  352.     }
  353.  
  354.     $ret = 0;
  355.     foreach $ent (sort mountpoint_sort (keys(%fs_mountpoints))) {
  356.     if ($fs_mountpoints{$ent} ne "/") {
  357.         &invoke("mkdir -p $fsmount$fs_mountpoints{$ent}");
  358.     }
  359.     $ret += &invoke("mount -t $fs_types{$ent} $ent $fsmount$fs_mountpoints{$ent}");
  360.     }
  361.  
  362.     if ($ret) {
  363.     &rhs_msgbox("Error",
  364. <<EOM
  365. >
  366. An error occurred while mounting the filesystem.
  367. >
  368. You need to repeat the Fstab step and reorganize your filesystem.
  369. You should then Unmount your filesystem, and Mount it again.
  370. >
  371. EOM
  372.             , 60);
  373.     $fs_mounted = 0;
  374.     return 0;
  375.     } else {
  376.     if (! $express_install) {
  377.         &rhs_msgbox("Success",
  378. <<EOM
  379. >
  380. Your Linux filesystem was mounted successfully.
  381. >
  382. EOM
  383.             , 60);
  384.     }
  385.     $fs_mounted = 1;
  386.     return 1;
  387.     }
  388. }
  389.  
  390. sub unmount_filesystems {
  391.  
  392.     local ( $ent );
  393.  
  394.     if (! $fs_mounted) {
  395.     if (! &rhs_yesno("Notice",
  396. <<EOM
  397. >
  398. Your Linux filesystem does not appear to be mounted.
  399. >
  400. Go ahead and unmount it anyway?
  401. >
  402. EOM
  403.              , 60)) {
  404.         return 1;
  405.     }
  406.     }
  407.  
  408.     foreach $ent (reverse sort mountpoint_sort (keys(%fs_mountpoints))) {
  409.     &invoke("umount $ent");
  410.     }
  411.     
  412.     
  413.     $fs_mounted = 0;
  414.     return 1;
  415. }
  416.  
  417. sub erase_filesystems {
  418.  
  419.     &rhs_msgbox("Notice",
  420. <<EOM
  421. >
  422. Erasing filesystems is not supported at this time.
  423. To get the same effect, unmount, re-format, and
  424. remount your filesystem.
  425. >
  426. EOM
  427.         , 60);
  428.  
  429.     return 0;
  430. }
  431.  
  432. sub finish_fstab {
  433.  
  434.     local ( $ent );
  435.  
  436.     open(FD, ">$fsmount/etc/fstab");
  437.  
  438.     print FD
  439. <<EOM
  440. #
  441. # /etc/fstab
  442. #
  443. # You should be using fstool (in the control-panel) to edit this!
  444. #
  445.  
  446. EOM
  447.     ;
  448.  
  449.     foreach $ent (sort mountpoint_sort (keys(%fs_mountpoints))) {
  450.     printf(FD "%-30s %-15s %-6s %s 1 %d\n", $ent, $fs_mountpoints{$ent},
  451.            $fs_types{$ent}, "defaults", ($ent eq $root_dev) ? 1 : 2);
  452.     }
  453.  
  454. print FD
  455. <<EOM
  456.  
  457. #
  458. # proc filesystem
  459. #
  460.  
  461. EOM
  462.     ;
  463.     printf(FD "%-30s %-15s %-6s %s\n", "/proc", "/proc", "proc", "defaults");
  464.     printf(FD "%-30s %-15s %-6s %s 0 0\n", "/dev/fd0", "/mnt/floppy", "ext2", "defaults,noauto");
  465.  
  466.     close FD;
  467. }
  468.  
  469. #######################################
  470. 1;
  471.