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 / vendor.ycp < prev    next >
Text File  |  2006-11-29  |  7KB  |  282 lines

  1. /**
  2.  * File:    clients/vendor.ycp
  3.  * Package:    yast2
  4.  * Summary:    Load vendor driver CD
  5.  * Authors:    Klaus Kaempf <kkaempf@suse.de>
  6.  *
  7.  * $Id: vendor.ycp 31984 2006-07-26 07:21:09Z jsrain $
  8.  */
  9.  
  10. {
  11.     textdomain "installation";
  12.  
  13.     import "Arch";
  14.     import "Installation";
  15.     import "Label";
  16.     import "Popup";
  17.     import "StorageDevices";
  18.     import "Wizard";
  19.  
  20.     // display message if the CD seems to be wrong
  21.  
  22.     define symbol wrong_cd (string reason, boolean must_umount) ``{
  23.     Popup::Message (reason);
  24.     if (must_umount)
  25.     {
  26.         // free mount point
  27.         SCR::Execute (.target.umount, Installation::sourcedir);
  28.     }
  29.     UI::CloseDialog();
  30.     return `abort;
  31.     };
  32.  
  33.     // run <name>.inst file
  34.     // return 0 on success
  35.  
  36.     define integer run_inst (string fpath, string fname) ``{
  37.  
  38.     y2milestone ("run_inst %1/%2", fpath, fname);
  39.  
  40.     string tmpdir = (string) SCR::Read (.target.tmpdir);
  41.     SCR::Execute (.target.bash, "/bin/cp " + fpath + "/" + fname + " " + tmpdir);
  42.  
  43.     // force it to be readable and executable
  44.     SCR::Execute (.target.bash, "/bin/chmod 774 " + tmpdir + "/" + fname);
  45.  
  46.     integer result = (integer) SCR::Execute (.target.bash, "(cd " + tmpdir + "; ./" + fname + " " + fpath + ")");
  47.     SCR::Execute (.target.remove, tmpdir + "/" + fname);
  48.  
  49.     return result;
  50.     };
  51.  
  52.     string language = UI::GetLanguage(true);
  53.  
  54.     boolean is_mounted = false;
  55.  
  56.     //------------------------------------------------------------
  57.  
  58.     integer arg_n = size(WFM::Args()) - 1;
  59.  
  60.     string default_device = "/dev/cdrom";
  61.     string alternate_device = StorageDevices::FloppyDevice;
  62.  
  63.     while (arg_n >= 0)
  64.     {
  65.     if (substring ((string) WFM::Args (arg_n), 0, 1) == "/")
  66.     {
  67.         default_device = (string) WFM::Args (arg_n);
  68.     }
  69.     arg_n = arg_n - 1;
  70.     }
  71.  
  72.     any result = nil;
  73.  
  74.     Wizard::CreateDialog();
  75.     Wizard::SetDesktopIcon("vendor");
  76.     Wizard::HideAbortButton();
  77.  
  78.     // VENDOR: main screen heading
  79.     string title = _("Vendor Driver CD");
  80.     Wizard::SetContents (title, `Empty(), "", true, true);
  81.  
  82.     // free mount point
  83.     SCR::Execute (.target.umount, Installation::sourcedir);
  84.  
  85.     // try to mount device
  86.  
  87.     while (SCR::Execute (.target.mount, [ default_device, Installation::sourcedir]) == false)
  88.     {
  89.     if ((alternate_device != default_device)
  90.         && (SCR::Execute (.target.mount, [ alternate_device, Installation::sourcedir]) == true))
  91.     {
  92.         break;
  93.     }
  94.     // VENDOR: cant mount /dev/cdrom popup
  95.     if (!Popup::ContinueCancel( _("Please insert the vendor CD-ROM")))
  96.     {
  97.         UI::CloseDialog();
  98.         return `abort;
  99.     }
  100.     }
  101.  
  102.     is_mounted = true;
  103.  
  104.     // CD is mounted. Check contents.
  105.  
  106.     string cdpath = Installation::sourcedir;
  107.  
  108.  
  109.     // get directory on update disk from installation (value from install.inf)
  110.     //
  111.     // if not set, determine directory from installed products
  112.     //
  113.  
  114.     string update_dir =    (string) SCR::Read (.target.string, ["/var/lib/YaST2/vendor_update", ""]);
  115.     if (update_dir != "")
  116.     {
  117.     cdpath = cdpath + update_dir;
  118.     }
  119.     else
  120.     {
  121.     Pkg::TargetInit ("/", false);
  122.     list<map<string,any> > products
  123.         = Pkg::ResolvableProperties ("", `product, "");
  124.     if (products == nil) products = [];
  125.     products = filter (map<string,any> p, products, {
  126.         return p["status"]:nil == `installed;
  127.     });
  128.     list<map<string,any> > base = filter (map<string,any> p, products, {
  129.         return p["category"]:"" == "base";
  130.     });
  131.     if (size (base) == 0)
  132.         base = products;
  133.     map<string,any> product = base[0]:$[];
  134.     string version = product["version"]:"";
  135.     version = splitstring (version, "-")[0]:""; // split off release
  136.  
  137.     y2milestone ("Trying %1", cdpath);
  138.     list dirlist = (list) SCR::Read(.target.dir, cdpath);
  139.  
  140.     if ((size (dirlist) <= 0)
  141.         || (!contains (dirlist, "linux")))
  142.     {
  143.         // VENDOR: vendor cd contains wrong data
  144.         return wrong_cd(_("Could not find driver data on the CD-ROM.
  145. Aborting now."), is_mounted);
  146.     }
  147.  
  148.     cdpath = cdpath + "/linux";
  149.  
  150.     y2milestone ("Trying %1", cdpath);
  151.  
  152.     dirlist = (list) SCR::Read(.target.dir, cdpath);
  153.     if ((size (dirlist) <= 0)
  154.         || (!(contains (dirlist, "suse")
  155.           || contains (dirlist, "unitedlinux"))))
  156.     {
  157.         // VENDOR: vendor cd contains wrong data
  158.         return wrong_cd(_("Could not find driver data on the CD-ROM.
  159. Aborting now."), is_mounted);
  160.     }
  161.  
  162.     string vendordir = "/suse/";
  163.  
  164.     if (SCR::Read(.target.size, "/etc/UnitedLinux-release") > 0)
  165.     {
  166.         vendordir = "/UnitedLinux/";
  167.         version = "ul1";
  168.     }
  169.  
  170.     cdpath = cdpath + vendordir + Arch::architecture () + "-" + version;
  171.  
  172.     }
  173.  
  174.  
  175.     y2milestone ("Trying %1", cdpath);
  176.  
  177.     list<string> dirlist = (list<string>) SCR::Read(.target.dir, cdpath);
  178.     if (size (dirlist) <= 0)
  179.     {
  180.     // VENDOR: vendor cd doesn't contain data for current system and linux version
  181.     return wrong_cd(_("The CD-ROM data does not match the running Linux system.
  182. Aborting now.
  183. "), is_mounted);
  184.     }
  185.  
  186.     y2milestone ("found %1", dirlist);
  187.  
  188.     // filter files ending in .inst (allow .ins for dos :-})
  189.  
  190.     list<string> instlist = [];
  191.     foreach (string fname, dirlist,
  192.          ``{
  193.     list<string> splitted = splitstring (fname, ".");
  194.     if ((size (splitted) == 2)
  195.         && (substring (splitted[1]:"", 0, 3) == "ins"))
  196.     {
  197.         instlist = add (instlist, splitted[0]:"");
  198.     }
  199.     });
  200.  
  201.     y2milestone ("inst %1", instlist);
  202.  
  203.     if (size (dirlist) <= 0)
  204.     {
  205.     // VENDOR: vendor cd contains wrong data
  206.     return wrong_cd(_("Could not find driver data on the CD-ROM.
  207. Aborting now."), is_mounted);
  208.     }
  209.  
  210.     integer inst_count = 0;
  211.  
  212.     string short_lang = "";
  213.     if (size (language) > 2)
  214.     short_lang = substring (language, 0, 2);
  215.  
  216.     // try to load .inst files, try with (xx_XX) ISO language first,
  217.     // then with 2 char language code
  218.     // show data from matching files
  219.  
  220.     foreach (string fname, instlist, ``{
  221.  
  222.     // try full ISO language code first
  223.     string description = (string) SCR::Read(.target.string, cdpath + "/" + fname + "-" + language + ".desc");
  224.  
  225.     // try with 2 char language code
  226.     if (size (description) <= 0)
  227.     {
  228.         description = (string) SCR::Read(.target.string, cdpath + "/" + fname + "-" + short_lang + ".desc");
  229.     }
  230.  
  231.     // try without language code
  232.     if (size (description) <= 0)
  233.     {
  234.         description = (string) SCR::Read(.target.string, cdpath + "/" + fname + ".desc");
  235.     }
  236.  
  237.     // show contents
  238.     if (size (description) > 0)
  239.     {
  240.         if (Popup::YesNo( description ) )
  241.         {
  242.         // VENDOR: dialog heading
  243.         Wizard::SetContents (title, `HVCenter(`Label(_("Installing driver..."))), "", true, true);
  244.         integer inst_result = run_inst (cdpath, fname + ".inst");
  245.         if (inst_result == 0)
  246.         {
  247.             inst_count = inst_count + 1;
  248.         }
  249.         else
  250.         {
  251.             // VENDOR: popup if installation of driver failed
  252.             Popup::Message (_("The installation failed.
  253. Contact the address on the CD-ROM.\n"));
  254.         }
  255.         Wizard::SetContents (title, `Empty(), "", true, true);
  256.         }
  257.     }
  258.     });
  259.  
  260.     string result_message = "";
  261.     if (inst_count > 0)
  262.     {
  263.     // VENDOR: message box with number of drivers installed
  264.     result_message = sformat (_("Installed %1 drivers from CD"), inst_count);
  265.     }
  266.     else
  267.     {
  268.     // VENDOR: message box with error text
  269.     result_message = _("No driver data found on the CD-ROM.\nAborting now.");
  270.     }
  271.  
  272.     Popup::Message (result_message);
  273.  
  274.     // free mount point
  275.     SCR::Execute (.target.umount, Installation::sourcedir);
  276.  
  277.     UI::CloseDialog();
  278.     return `ok;
  279.  
  280. /* EOF */
  281. }
  282.