home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / usr / share / YaST2 / clients / umount_finish.ycp < prev    next >
Text File  |  2006-11-29  |  4KB  |  149 lines

  1. /**
  2.  * File:
  3.  *  umount_finish.ycp
  4.  *
  5.  * Module:
  6.  *  Step of base installation finish
  7.  *
  8.  * Authors:
  9.  *  Jiri Srain <jsrain@suse.cz>
  10.  *
  11.  * $Id: umount_finish.ycp 32853 2006-09-13 12:16:36Z locilka $
  12.  *
  13.  */
  14.  
  15. {
  16.  
  17. textdomain "installation";
  18.  
  19. import "Installation";
  20. import "Storage";
  21. import "Hotplug";
  22. import "Vendor";
  23.  
  24. any ret = nil;
  25. string func = "";
  26. map param = $[];
  27.  
  28. /* Check arguments */
  29. if(size(WFM::Args()) > 0 && is(WFM::Args(0), string)) {
  30.     func = (string)WFM::Args(0);
  31.     if(size(WFM::Args()) > 1 && is(WFM::Args(1), map))
  32.     param = (map)WFM::Args(1);
  33. }
  34.  
  35. y2milestone ("starting umount_finish");
  36. y2debug("func=%1", func);
  37. y2debug("param=%1", param);
  38.  
  39. if (func == "Info")
  40. {
  41.     return (any)$[
  42.     "steps" : 1,
  43.     // progress step title
  44.     "title" : _("Unmounting all mounted devices..."),
  45.     "when" : [ `installation, `update, `autoinst ],
  46.     ];
  47. }
  48. else if (func == "Write")
  49. {
  50.     // loop over all filesystems
  51.     map<string,list> mountPoints = (map<string,list>)Storage::GetMountPoints();
  52.     list<string> umountList = [];
  53.  
  54.     // go through mountPoints collecting paths in umountList
  55.     // *** umountList is lexically ordered !
  56.  
  57.     foreach (string mountpoint, list mountval, mountPoints, {
  58.     if (mountpoint != "swap")        // dont umount / on target
  59.     {
  60.         umountList = add (umountList, mountpoint);
  61.     }
  62.     });
  63.  
  64.     // now unmount all mountpoints in reverse order !
  65.  
  66.     // remove [Installation::destdir]/etc/mtab which was faked for %post
  67.     // scripts in inst_rpmcopy
  68.     SCR::Execute(.target.remove, "/etc/mtab");
  69.  
  70.     // Stop SCR on target
  71.     WFM::SCRClose (Installation::scr_handle);
  72.  
  73.     // first, umount everthing mounted *in* the target.
  74.     // /proc/bus/usb
  75.     // /proc
  76.  
  77.     if (Hotplug::haveUSB)
  78.     {
  79.         WFM::Execute(.local.umount, Installation::destdir + "/proc/bus/usb");
  80.     }
  81.     // inst_prepdisk mounts them unconditionally, they keep destdir busy
  82.     WFM::Execute(.local.umount, Installation::destdir + "/proc");
  83.     WFM::Execute(.local.umount, Installation::destdir + "/sys");
  84.     WFM::Execute(.local.umount, Installation::destdir + "/dev");
  85.  
  86.     map<string,map> targetMap = Storage::GetTargetMap();
  87.  
  88.     // first umount all file based crypto fs since they potentially
  89.     // could mess up umounting of normale filesystems if the crypt
  90.     // file is not on the root fs
  91.     y2milestone( "umount list %1", umountList );
  92.     foreach( map e,  targetMap["/dev/loop","partitions"]:[],
  93.             {
  94.             if( size(e["mount"]:"")>0 )
  95.             {
  96.         Storage::Umount( e["device"]:"" );
  97.             umountList = filter (string m, umountList, ``(m!=e["mount"]:""));
  98.             y2milestone( "loop umount %1 new list %2", e["mount"]:"",
  99.                 umountList );
  100.             }
  101.             });
  102.  
  103.     // *** umountList is lexically ordered !
  104.     // now umount in reverse order (guarantees "/" as last umount)
  105.  
  106.     integer umountLength = size (umountList);
  107.     while (umountLength > 0)
  108.     {
  109.         umountLength = umountLength - 1;
  110.         string tmp = Installation::destdir + (string) (umountList[umountLength]:"");
  111.         y2milestone("umount target: %1", tmp);
  112.         WFM::Execute(.local.umount, tmp);
  113.     }
  114.  
  115.     // must call .local.bash_output !
  116.     integer max_loop_dev = Storage::NumLoopDevices();
  117.  
  118.     // disable loop device of crypto fs
  119.     boolean unload_crypto = false;
  120.  
  121.     while (max_loop_dev > 0)
  122.     {
  123.         unload_crypto   = true;
  124.         string exec_str = sformat( "/sbin/losetup -d /dev/loop%1", max_loop_dev-1 );
  125.         y2milestone( "loopdev: %1", exec_str);
  126.         WFM::Execute(.local.bash, exec_str);
  127.         max_loop_dev = max_loop_dev -1;
  128.     }
  129.  
  130.     if( size(filter(string k, map v, targetMap, ``(v["type"]:`CT_UNKNOWN==`CT_LVM))) >0 )
  131.     {
  132.         y2milestone( "shutting down LVM" );
  133.         WFM::Execute(.local.bash, "/sbin/vgchange -a n" );
  134.     }
  135.  
  136. }
  137. else
  138. {
  139.     y2error ("unknown function: %1", func);
  140.     ret = nil;
  141. }
  142.  
  143. y2debug("ret=%1", ret);
  144. y2milestone("umount_finish finished");
  145. return ret;
  146.  
  147.  
  148. } /* EOF */
  149.