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 / modules / CheckMedia.ycp < prev    next >
Text File  |  2006-11-29  |  5KB  |  203 lines

  1. /**
  2.  * File:
  3.  *   modules/CheckMedia.ycp
  4.  *
  5.  * Summary:
  6.  *   Module for checking media intergrity
  7.  *
  8.  * Authors:
  9.  *   Ladislav Slezak <lslezak@suse.cz>
  10.  *
  11.  * $Id: CheckMedia.ycp 33383 2006-10-13 09:12:02Z lslezak $
  12.  *
  13.  * Input and output routines.
  14.  *
  15.  */
  16.  
  17. {
  18.     // Set the name of the module
  19.     module "CheckMedia";
  20.     import "Linuxrc";
  21.     import "Report";
  22.  
  23.     textdomain "packager";
  24.  
  25.     string checkmedia = "/usr/bin/checkmedia";
  26.  
  27.     list<string> output = [];
  28.     integer progress = 0;
  29.     boolean inprogress = false;
  30.  
  31.     global string preferred_drive = "";
  32.  
  33.     // true if module start was forced - check=1 was found in the application area,
  34.     // effects UI a little
  35.     global boolean forced_start = false;
  36.  
  37.     // cache .probe.cdrom value
  38.     // avoid reprobind during installation
  39.     list<map> cd_cache = nil;
  40.  
  41.     global define list<map> DetectedCDDevices()
  42.     {
  43.     if (cd_cache == nil)
  44.     {
  45.         // the cache is not initialied, do it now
  46.         list<map> cds = (list<map>)SCR::Read(.probe.cdrom);
  47.  
  48.         if (cds == nil)
  49.         {
  50.         // initialize to empty list
  51.         cds = [];
  52.         }
  53.  
  54.         cd_cache = cds;
  55.     }
  56.  
  57.     return cd_cache;
  58.     }
  59.  
  60.     global define boolean Start(string device) {
  61.     // reset values
  62.     output = [];
  63.     progress = 0;
  64.     inprogress = false;
  65.  
  66.     boolean ret = (boolean)SCR::Execute(.background.run_output, checkmedia + " " + device);
  67.     return ret;
  68.     }
  69.  
  70.     global define boolean Stop() {
  71.     boolean ret = (boolean)SCR::Execute(.background.kill);
  72.  
  73.     return ret;
  74.     }
  75.  
  76.     global define void Process() {
  77.     if (inprogress)
  78.     {
  79.         // try to read whole lines
  80.         list<string> out = (list<string>)SCR::Read(.background.newout);
  81.  
  82.         if (out != nil && size(out) > 0)
  83.         {
  84.         // remove the first part of the output
  85. //        out = remove(out, 0);
  86.         output = (list<string>)merge(output, out);
  87.  
  88.         // finished
  89.         progress = 100;
  90.         inprogress = false;
  91.         }
  92.         else
  93.         {
  94.         // read progress status
  95.         string buffer = (string)SCR::Read(.background.buffer_out);
  96.  
  97.         if (buffer != "")
  98.         {
  99.             y2debug("buffer: %1", buffer);
  100.  
  101.             string percent = regexpsub(buffer, "([0-9]*)%.*$", "\\1");
  102.  
  103.             if (percent != nil)
  104.             {
  105.             progress = tointeger(percent);
  106.             y2milestone("progress: %1%%", progress);
  107.             }
  108.         }
  109.         }
  110.     }
  111.     else
  112.     {
  113.         list<string> out = (list<string>)SCR::Read(.background.newout);
  114.  
  115.         if (out != nil && size(out) > 0)
  116.         {
  117.         output = (list<string>)merge(output, out);
  118.  
  119.         // check whether we need to switch to progress mode
  120.         string last = out[size(out) - 1]:"";
  121.         if (regexpmatch(last, "^ *pad: "))
  122.         {
  123.             inprogress = true;
  124.             y2milestone("Switching into progress mode");
  125.         }
  126.         }
  127.     }
  128.  
  129.     return;
  130.     }
  131.  
  132.     global define boolean Running() {
  133.     boolean ret = (boolean)SCR::Read(.background.output_open);
  134.     return ret;
  135.     }
  136.  
  137.     /**
  138.      * Return information printed by checkmedia utility
  139.      * @ret list<string> checkmedia output
  140.      */
  141.     global define list<string> Info() {
  142.     list<string> ret = output;
  143.     output = [];
  144.     return ret;
  145.     }
  146.  
  147.     global define integer Progress() {
  148.     return progress;
  149.     }
  150.  
  151.     /* Return list of ready CD devices for installation. It works properly only
  152.      * in the first installation stage - it reads content of /etc/install.inf
  153.      * file. It returns the installation (boot) CD device if it's known or it
  154.      * probes for all CD devices and returns ready devices (the devices which
  155.      * contain a medium). If installation source is not CD/DVD it returns
  156.      * empty list.
  157.      *
  158.      * @return list<string> List of CD/DVD device names
  159.      */
  160.     global define list<string> GetReadyCDs() {
  161.     // check whether we are using CD installation source
  162.     string instmode = Linuxrc::InstallInf ("InstMode");
  163.     y2milestone("Installation mode: %1", instmode);
  164.  
  165.     list<string> readycddrives = [];
  166.  
  167.     if (instmode == "cd" || instmode == "dvd")
  168.     {
  169.         // get CD device name
  170.         string bootcd = Linuxrc::InstallInf ("Cdrom");
  171.  
  172.         if (bootcd != nil && bootcd != "")
  173.         {
  174.         readycddrives = [ sformat("/dev/%1", bootcd) ];
  175.         }
  176.         else
  177.         {
  178.         y2milestone("CD device device is not known, probing...");
  179.         // booted from another location (network), test all CD drives
  180.         list<map> cds = DetectedCDDevices();
  181.  
  182.         if (cds != nil)
  183.         {
  184.             foreach(map cd, cds, {
  185.                 string devname = cd["dev_name"]:"";
  186.  
  187.                 // check whether the CD is ready
  188.                 if (cd["notready"]:false == false && devname != nil && devname != "")
  189.                 {
  190.                 readycddrives = add(readycddrives, devname);
  191.                 }
  192.             }
  193.             );
  194.         }
  195.         }
  196.  
  197.         y2milestone("Ready CD drives: %1", readycddrives);
  198.     }
  199.  
  200.     return readycddrives;
  201.     }
  202. }
  203.