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

  1. /**
  2.  * Module:        InstURL.ycp
  3.  *
  4.  * Authors:        Klaus Kaempf (kkaempf@suse.de)
  5.  *
  6.  * Purpose:        Convert /etc/install.inf data to URL
  7.  *
  8.  *
  9.  * $Id: InstURL.ycp 33383 2006-10-13 09:12:02Z lslezak $
  10.  */
  11.  
  12. {
  13.     textdomain "packager";
  14.  
  15.     module "InstURL";
  16.     import "Linuxrc";
  17.     import "URL";
  18.     import "CheckMedia";
  19.  
  20.  
  21.     global boolean is_network = true;
  22.  
  23.     
  24.     /**
  25.      * Hide Password
  26.      * @param url original URL
  27.      * @return string new URL with hidden password
  28.      */
  29.     global string  HidePassword(string url) {
  30.         map t = URL::Parse(url);
  31.         if (size(t["pass"]:"") > 0 )
  32.         {
  33.             t["pass"] = "PASSWORD";
  34.         }
  35.         return URL::Build(t);
  36.     }
  37.  
  38.     /**
  39.      * Get device options for CD/DVD
  40.      * @return string device options (devices=/dev/cdrom)
  41.      */
  42.     string GetDevicesOption() {
  43.         string options = "";
  44.         list<map> devicelist = (list<map>) SCR::Read(.probe.cdrom);
  45.     list<string> devlist = maplist (map d, devicelist, {
  46.         return d["dev_name"]:"";
  47.     });
  48.  
  49.     list<string> ready = [];
  50.     foreach(map d, devicelist, {
  51.         string dname = d["dev_name"]:"";
  52.  
  53.         if (d["notready"]:true == false && dname != nil && dname != "")
  54.         {
  55.             ready = add(ready, dname);
  56.         }
  57.         }
  58.     );
  59.  
  60.  
  61.     if (size (ready) != 0)
  62.         devlist = ready;
  63.     foreach (string d, devlist, {
  64.         if (d != "")
  65.         {
  66.         if (options != "")
  67.             options = options + ",";
  68.         options = options + d;
  69.         }
  70.     });
  71.         if (options != "")
  72.         {
  73.             options = "devices=" + options;
  74.         }
  75.         return options;
  76.     }
  77.  
  78.     /**
  79.      *
  80.      */
  81.     map GetURLOptions (string url) {
  82.         map<string,string> option_map = $[];
  83.         integer pos = findfirstof(url, "?");
  84.         if (pos!=nil)
  85.         {
  86.             string opts = substring(url, pos, size(url));
  87.             list<string> optpairs = splitstring(opts, "?");
  88.             option_map = listmap(string op, optpairs, ``{
  89.                     list<string> tmp = splitstring(op, "=");
  90.                     return($[tmp[0]:"": tmp[1]:""]);
  91.                     });
  92.         }
  93.         return option_map;
  94.     }
  95.  
  96.     /**
  97.      *
  98.      */
  99.     global string  RewriteCDUrl(string url) {
  100.         map tokens = URL::Parse(url);
  101.         string new_url = "";
  102.         if (tokens["scheme"]:"" == "cd" || tokens["scheme"]:"" == "dvd")
  103.         {
  104.             y2milestone("Old options: %1", GetURLOptions(url));
  105.             integer pos = findfirstof(url, "?");
  106.             if (pos != nil)
  107.             {
  108.                 string new_options = GetDevicesOption();
  109.                 new_url = substring(url, 0, pos);
  110.                 if (size(new_options) > 0 )
  111.                     new_url = new_url + "?" + GetDevicesOption();
  112.                 else
  113.                     new_url = url;
  114.             }
  115.         } else {
  116.             new_url = url;
  117.         }
  118.         return new_url;
  119.     }
  120.     
  121.     /**
  122.      * Convert install.inf to a URL useable by the package manager
  123.      * @param extra_dir append path to original URL
  124.      * @return string new Source URL
  125.      */
  126.     global string installInf2Url (string extra_dir) {
  127.     string options = "";
  128.         map url_tokens =  $[];
  129.  
  130.     string instmode = Linuxrc::InstallInf("InstMode");    // mode
  131.     if (instmode == nil)    // defaults to "CD"
  132.     {
  133.         instmode = "cd";
  134.     }
  135.  
  136.     if ((instmode == "cd")                    // CD or DVD
  137.         || (instmode == "dvd"))
  138.     {
  139.         is_network = false;
  140.             options = GetDevicesOption();
  141.     }
  142.     else if (instmode == "hd")                        // Harddisk
  143.     {
  144.         is_network = false;
  145.             string partition = Linuxrc::InstallInf("Partition");
  146.             if (partition != nil )
  147.             options = "device=/dev/" + partition + "&filesystem=auto";
  148.             else
  149.                 y2error("no partition specified");
  150.     }
  151.  
  152.         url_tokens["scheme"] = instmode;
  153.  
  154.     if (is_network)
  155.     {
  156.         string username = Linuxrc::InstallInf("Username");
  157.         if ((username != nil) && (username != ""))
  158.         {
  159.                 url_tokens["user"] = username;
  160.         string password = Linuxrc::InstallInf("Password");
  161.         if ((password != nil) && (password != ""))
  162.         {
  163.                     url_tokens["pass"] = password;
  164.         }
  165.         }
  166.         string servername = Linuxrc::InstallInf("ServerName");
  167.         string server = Linuxrc::InstallInf("Server");
  168.         string serverip = Linuxrc::InstallInf("ServerIP");
  169.  
  170.         if ((servername != nil) && (servername != ""))
  171.         {
  172.                 url_tokens["host"] = servername;
  173.         }
  174.         else if ((server != nil) && (server != ""))
  175.         {
  176.                 url_tokens["host"] = server;
  177.         }
  178.         else if ((serverip != nil) && (serverip != ""))
  179.         {
  180.                 url_tokens["host"] = serverip;
  181.         }
  182.  
  183.     } // is_network
  184.  
  185.     string isoimg = "";
  186.     string serverdir = Linuxrc::InstallInf("Serverdir");
  187.     if (Linuxrc::InstallInf("SourceType") == "file")
  188.     {
  189.       if (serverdir != "" && serverdir != nil)
  190.       {
  191.         list<string> sd_items = splitstring (serverdir, "/");
  192.         sd_items = filter (string i, sd_items, {
  193.         return i != "";
  194.         });
  195.         integer last = size (sd_items) - 1;
  196.         isoimg = sd_items[last]:"";
  197.         sd_items[last] = "";
  198.         serverdir = mergestring (sd_items, "/");
  199.       }
  200.     }
  201.  
  202.         /*
  203.     if (((instmode == "hd") || is_network)                // if serverdir needed
  204.         && ((serverdir != nil) && (serverdir != "")))        // and is valid
  205.     {
  206.         // for smb mounts it is usual to not have a leading slash
  207.         if (substring (serverdir, 0, 1) != "/")
  208.         serverdir = "/" + serverdir;
  209.     } 
  210.         */
  211.         string share = Linuxrc::InstallInf("Share");
  212.  
  213.     if (extra_dir != "")
  214.     {
  215.             if (serverdir != nil)
  216.             {
  217.                 // avoid too many slashes
  218.                 if (findlastof(serverdir, "/") == size(serverdir) - 1)
  219.                 {
  220.                     serverdir = substring(serverdir,  0  , size(serverdir) - 1 );
  221.                 }
  222.  
  223.                 string slash = "";
  224.                 if (substring (extra_dir, 0, 1) != "/")
  225.                     slash = "/";
  226.             serverdir = serverdir + slash + extra_dir;
  227.                 slash = "";
  228.             }
  229.             else
  230.                 serverdir = extra_dir;
  231.     }
  232.  
  233.     if (serverdir != nil && serverdir != "")
  234.         {
  235.             string fs = "";
  236.             if (instmode == "ftp" ) {
  237.                 // ftp://foo/%2fbar is %2fbar on foo  (relative)
  238.                 // ftp://foo/bar is bar on foo (absolute)
  239.                 // ftp://foo//bar is /bar on foo (relative)
  240.         // Note: %2f is added by URL.ycp if the path starts with /
  241.         if (substring (serverdir, 0, 3) == "%2f")
  242.             serverdir = "/" + substring (serverdir, 3);
  243.                 fs = serverdir;
  244.  
  245.             } else if (instmode == "smb" && (share != nil) && (share != "")) {
  246.                 fs = share + "/" +  serverdir;
  247.             } else {
  248.                 fs = serverdir;
  249.             }
  250.             url_tokens["path"] = fs;
  251.  
  252.         }
  253.         else
  254.         {
  255.             // FIXME don't know why it is needed
  256.             // Needed as a seperator between URL and options (!)
  257.             url_tokens["path"] = "/"; 
  258.         }
  259.  
  260.         string port = Linuxrc::InstallInf("Port");
  261.         if ((port != nil) && (port != ""))
  262.         {
  263.             url_tokens["port"]  = port;
  264.         }
  265.  
  266.         string url = URL::Build(url_tokens);
  267.     string option_separator = "?";
  268.  
  269.     if (is_network)
  270.     {
  271.         string proxy = Linuxrc::InstallInf("Proxy");
  272.         if ((proxy != nil) && (proxy != ""))
  273.         {
  274.         url = url + option_separator + "proxy=" + proxy;
  275.         option_separator = "&";
  276.         }
  277.         string proxyport = Linuxrc::InstallInf("ProxyPort");
  278.         if ((proxyport != nil) && (proxyport != ""))
  279.         {
  280.         url = url + option_separator + "proxyport=" + proxyport;
  281.         option_separator = "&";
  282.         }
  283.         string proxyproto = Linuxrc::InstallInf("ProxyProto");
  284.         if ((proxyproto != nil) && (proxyproto != ""))
  285.         {
  286.         url = url + option_separator + "proxyproto=" + proxyproto;
  287.         option_separator = "&";
  288.         }
  289.         string proxyuser = Linuxrc::InstallInf("ProxyUser");
  290.         if ((proxyuser != nil) && (proxyuser != ""))
  291.         {
  292.         url = url + option_separator + "proxyuser=" + proxyuser;
  293.         option_separator = "&";
  294.         }
  295.         string proxypassword = Linuxrc::InstallInf("ProxyPassword");
  296.         if ((proxypassword != nil) && (proxypassword != ""))
  297.         {
  298.         url = url + option_separator + "proxypassword=" + proxypassword;
  299.         option_separator = "&";
  300.         }
  301.         string workgroup = Linuxrc::InstallInf ("WorkDomain");
  302.         if (workgroup != nil && workgroup != "")
  303.         {
  304.         url = url + option_separator + "workgroup=" + workgroup;
  305.         option_separator = "&";
  306.         }
  307.     } // is_network
  308.  
  309.     if (options != "")
  310.     {
  311.         url = url + option_separator + options;
  312.         option_separator = "&";
  313.         y2milestone ("options %1", options);
  314.     }
  315.  
  316.     if (isoimg != "")
  317.     {
  318.         url = sformat ("iso:/?iso=%1&url=%2", isoimg, url);
  319.     }
  320.  
  321.     y2debug ("URL %1", HidePassword(url));
  322.     return url;
  323.     }
  324. }
  325.