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 / include / autoinstall / io.ycp < prev    next >
Text File  |  2006-11-29  |  9KB  |  302 lines

  1. /**
  2.  * File:    include/autoinstall/io.ycp
  3.  * Package:    Autoinstallation Configuration System
  4.  * Summary:    I/O
  5.  * Authors:    Anas Nashif<nashif@suse.de>
  6.  *
  7.  * $Id: io.ycp 32858 2006-09-13 12:52:17Z ug $
  8.  */
  9. {
  10.     textdomain "autoinst";
  11.     import "URL";
  12.     import "FTP";
  13.     import "Installation";
  14.     import "HTTP";
  15.     import "StorageDevices";
  16.     import "TFTP";
  17.  
  18.     string GET_error = "";
  19.  
  20.     /**
  21.      * Basename
  22.      * @param string path
  23.      * @return string  basename
  24.      */
  25.     define string basename (string filePath)
  26.     ``{
  27.     list pathComponents = splitstring(filePath, "/");
  28.     string ret = pathComponents[size(pathComponents) -1 ]: "";
  29.     return ( ret );
  30.     }
  31.  
  32.  
  33.     /**
  34.      * Get directory name
  35.      * @param string path
  36.      * @return  string dirname
  37.      */
  38.     define string dirname (string filePath)
  39.     ``{
  40.        list pathComponents = splitstring(filePath, "/");
  41.        string last = pathComponents[size(pathComponents) -1]:"";
  42.        string ret = substring(filePath, 0 , size(filePath) - size(last));
  43.        return (ret);
  44.     }
  45.  
  46.  
  47.     /**
  48.      * Get control files from different sources
  49.      * @return boolean true on success
  50.      */
  51.     define boolean Get(string Scheme,
  52.                   string Host,
  53.                   string Path,
  54.                   string Localfile)
  55.     ``{
  56.         GET_error = "";
  57.     boolean ok = false;
  58.     map res = $[];
  59.     map toks =  AutoinstConfig::urltok;
  60.     toks["scheme"] = Scheme;
  61.     toks["host"]   = Host;
  62.         if (regexpsub(Path, "(.*)//(.*)", "\\1\/\\2")!= nil)
  63.         {
  64.             Path = regexpsub(Path, "(.*)//(.*)", "\\1\/\\2");
  65.         }
  66.     toks["path"]   = Path;
  67.         string full_url = URL::Build(toks);
  68.  
  69.         string tmp_dir = (string)WFM::Read(.local.tmpdir, []);
  70.         string mount_point = tmp_dir + "/tmp_mount";
  71.         WFM::Execute(.local.mkdir, mount_point );
  72.  
  73.     if ( Scheme == "http" || Scheme == "https" )
  74.     {
  75.         HTTP::easySSL( true );
  76.         res = HTTP::Get(full_url, Localfile);
  77.         if (res["code"]:0 == 200)
  78.         {
  79.                 GET_error = "";
  80.         return (true);
  81.         }
  82.         else
  83.         {
  84.         y2error("Can't find URL: %1", full_url);
  85.                 // autoyast tried to read a file but had no success.
  86.                 GET_error = sformat(_("Cannot find URL '%1' via protocol HTTP(S). Server returned code %2."),full_url,res["code"]:0);
  87.         return (false);
  88.         }
  89.     }
  90.     if ( Scheme == "ftp" )
  91.     {
  92.         res = FTP::Get(full_url, Localfile);
  93.         if ( ( res["code"]:-1 >= 200 && res["code"]:-1 < 300 ) && SCR::Read(.target.size, Localfile) > 0 )
  94.         {
  95.                 GET_error = "";
  96.         return (true);
  97.         }
  98.         else
  99.         {
  100.         y2error("Can't find URL: %1", full_url);
  101.                 // autoyast tried to read a file but had no success.
  102.                 GET_error = sformat(_("Cannot find URL '%1' via protocol FTP. Server returned code %2."),full_url,res["code"]:0);
  103.         return (false);
  104.         }
  105.     }
  106.     else if (Scheme == "file")
  107.     {
  108.         string file = sformat("%1/%2", Installation::sourcedir, Path);
  109.         if (SCR::Read(.target.size, file) > 0 )
  110.         {
  111.         string cpcmd = sformat("cp %1 %2", file, Localfile);
  112.         y2milestone("Copy profile: %1", cpcmd);
  113.         SCR::Execute(.target.bash, cpcmd);
  114.         }
  115.         else
  116.         {
  117.                 GET_error = GET_error + sformat(_("Reading file on %1/%2 failed.\n"), Installation::sourcedir, Path);
  118.         string cpcmd = sformat("cp %1 %2", Path , Localfile);
  119.         y2milestone("Copy profile: %1", cpcmd);
  120.         SCR::Execute(.target.bash, cpcmd);
  121.         }
  122.  
  123.         if (SCR::Read(.target.size, Localfile) > 0 )
  124.         {
  125.                 GET_error = "";
  126.         ok = true;
  127.         }
  128.         else
  129.         {
  130.                 GET_error = GET_error + sformat(_("Reading file on %1 failed.\n"), Path);
  131.         y2milestone("Trying to find file on installation media: %1", Installation::boot ());
  132.         if (Installation::boot () == "cd")
  133.         {
  134.             string cdrom = (string)SCR::Read (.etc.install_inf.Cdrom);
  135.             if (!(boolean)WFM::Execute(.local.mount, ["/dev/" + cdrom,
  136.                                 mount_point, Installation::mountlog] ))
  137.             {
  138.                         // autoyast tried to mount the CD but had no success.
  139.                         GET_error = GET_error + sformat(_("Mounting %1 failed."), cdrom );
  140.             y2warning("Mount failed");
  141.             }
  142.             else
  143.             {
  144.             string cpcmd = sformat("cp " + mount_point + "/%1 %2", Path , Localfile);
  145.             y2milestone("Copy profile: %1", cpcmd);
  146.             SCR::Execute(.target.bash, cpcmd);
  147.             }
  148.             WFM::Execute(.local.umount, mount_point);
  149.             if (SCR::Read(.target.size, Localfile) > 0 )
  150.             {
  151.                         GET_error = "";
  152.             return (true);
  153.             }
  154.         }
  155.                 // autoyast tried to read a file but had no success.
  156.                 GET_error = GET_error + sformat(_("Reading a file on CD failed. Path: %1/%2."),mount_point,Path);
  157.         ok = false;
  158.         }
  159.     }
  160.     else if (Scheme == "nfs")  // NFS
  161.     {
  162.         if (Installation::boot () != "nfs")
  163.         {
  164.         y2milestone("Starting portmap: %1", SCR::Execute (.target.bash, "/sbin/portmap") );
  165.         }
  166.  
  167.         if (!(boolean)WFM::Execute(.local.mount,
  168.                         [ Host + ":" + dirname(Path),
  169.                         mount_point,
  170.                         Installation::mountlog ]))
  171.         {
  172.         y2warning("Mount failed");
  173.                 // autoyast tried to mount a NFS directory which failed
  174.                 GET_error = sformat(_("Mounting %1 failed."), Host + ":" + dirname(Path) );
  175.         return (false);
  176.         }
  177.  
  178.             string copyCmd = "/bin/cp " + mount_point + "/" + basename(Path) +
  179.                 " " + Localfile;
  180.             y2milestone("Copy Command: %1", copyCmd);
  181.         if (WFM::Execute (.local.bash, copyCmd ) == 0)
  182.         {
  183.                 GET_error = "";
  184.         ok = true;
  185.         }
  186.         else
  187.         {
  188.                 // autoyast tried to copy a file via NFS which failed
  189.                 GET_error = sformat(_("Remote file %1 cannot be retrieved"),  mount_point + "/"+ basename(Path) );
  190.         y2error("remote file %1 can't be retrieved",  mount_point + "/"
  191.                         + basename(Path));
  192.  
  193.         }
  194.  
  195.         WFM::Execute(.local.umount, mount_point);
  196.  
  197.     }
  198.     else if (Scheme == "floppy")
  199.     {
  200.         if (StorageDevices::FloppyReady())
  201.         {
  202.         WFM::Execute(.local.mount, [StorageDevices::FloppyDevice, mount_point]);
  203.  
  204.         if (WFM::Execute (.local.bash, "/bin/cp " + mount_point + "/" + Path + " " + Localfile) != 0)
  205.         {
  206.             y2error("file  %1 can't be retrieved", mount_point + "/" + Path );
  207.         }
  208.         else
  209.         {
  210.                     GET_error = "";
  211.             ok = true;
  212.         }
  213.         SCR::Execute(.target.umount, mount_point);
  214.         }
  215.     }
  216.     else if (Scheme == "device") // Device
  217.     {
  218.         if ( Host != "" && Path != "")
  219.         {
  220.                 /*
  221.                   sometimes we have devices like /dev/cciss/c1d0p5
  222.                   those "nested" devices will be catched here
  223.                   as long as we find a directory where we expect a device,
  224.                   we cut down the Path and enhance the Host (device name)
  225.                 */
  226.                 while( SCR::Read( .target.dir, "/dev/"+Host ) != nil ) {
  227.                         y2milestone("nested device found");
  228.                         list<string> l = splitstring( Path, "/" );
  229.                         Host = Host + "/" + l[0]:"";
  230.                         l = remove(l,0);
  231.                         Path = mergestring(l,"/");
  232.                         y2milestone("Host=%1 Path=%2",Host,Path);
  233.                 }
  234.                 // catching nested devices done
  235.  
  236.         string mounts = (string)(SCR::Read (.target.string, "/etc/mtab"));
  237.         list<string> mount_list = splitstring( mounts, "\n" );
  238.         boolean already_mounted = false;
  239.         foreach( string m, mount_list, ``{
  240.             list<string>  entries = splitstring( m, " " );
  241.             if( entries[0]:"" == "/dev/"+Host ) {
  242.                 already_mounted = true;
  243.                 mount_point = entries[1]:"";
  244.                 break;
  245.             }
  246.         });
  247.         y2milestone("already mounted=%1 mountpoint=%2",already_mounted,mount_point);
  248.         if( ! already_mounted )
  249.              WFM::Execute(.local.mount, [sformat("/dev/%1", Host) ,
  250.                             mount_point]);
  251.  
  252.         if (WFM::Execute (.local.bash, "/bin/cp " + mount_point +  Path + " " + Localfile) != 0 )
  253.         {
  254.                     // autoyast tried to copy a file but that file can't be found
  255.                     GET_error = sformat(_("File %1 cannot be found"),mount_point + Path);
  256.             y2error("file %1 can't be found",  mount_point + Path);
  257.         }
  258.         else
  259.         {
  260.                     GET_error = "";
  261.             ok = true;
  262.         }
  263.         if( ! already_mounted )
  264.             WFM::Execute(.local.umount, mount_point);
  265.         }
  266.     }
  267.     else if (Scheme == "tftp") // Device
  268.     {
  269.         if (TFTP::Get( Host,  Path, Localfile ))
  270.         {
  271.                 GET_error = "";
  272.         ok = true;
  273.         }
  274.         else
  275.         {
  276.                 GET_error = sformat(_("Cannot find URL '%1' via protocol TFTP."),Host+":"+Path);
  277.         y2error("file %1 can't be found", Path );
  278.         }
  279.     }
  280.     else
  281.     {
  282.             // the user wanted autoyast to fetch it's profile via an unknown protocol
  283.             GET_error = sformat(_("Unknown protocol %1."),Scheme);
  284.         y2error("Protocol not supported");
  285.         ok = false;
  286.     }
  287.     return ( ok );
  288.     }
  289.  
  290.  
  291.     /**
  292.      * Get a file froma  given URL
  293.      */
  294.     boolean GetURL(string url, string target)
  295.     {
  296.         AutoinstConfig::urltok=URL::Parse(url);
  297.         map toks = AutoinstConfig::urltok;
  298.         return Get(toks["scheme"]:"", toks["host"]:"", toks["path"]:"", target);
  299.     }
  300.  
  301. }
  302.