Salome HOME
Rollback previous modifications
authorvsr <vsr@opencascade.com>
Tue, 24 Jan 2006 12:44:19 +0000 (12:44 +0000)
committervsr <vsr@opencascade.com>
Tue, 24 Jan 2006 12:44:19 +0000 (12:44 +0000)
runInstall

index 4a4796f8ec9d49e96befea1d3991293ccbfef473..d5cf9148407153c8befed7a075e9c8ffe17b5b29 100755 (executable)
@@ -5,66 +5,353 @@ warnings.filterwarnings("ignore", "", DeprecationWarning)
 
 import xmllib
 import sys, os, string, re
-from optparse import OptionParser
 
-opt_parser = None
-root_path  = None
+#==============================================================
+# get_help_info
+#==============================================================
+def get_help_info() :
+    str = "\nSALOME Installation Wizard\n\n"
+    str = str + "\tUsage : \n\tInstall [-g|b] [-f <xml-file>] [-t <target-dir>] [-tmp <tmp-dir>]\n"
+    str = str + "\n"
+    str = str + " -g              Runs the Installation Wizard in the GUI mode.\n"
+    str = str + "                 In this case only <xmlfile> is taken into account \n"
+    str = str + "                 from the parameters list. This key is used by default.\n"
+    str = str + "\n"
+    str = str + " -b              Runs the Installation Wizard in the batch mode.\n"
+    str = str + "                 All the found parameters are taken in to account.\n"
+    str = str + "\n"
+    str = str + " -f <xml-file>   The configuration file to be parsed by the Installation Wizard.\n" 
+    str = str + "                 If this parameter is missed then the script tries to define\n"
+    str = str + "                 the Red Hat version and use the corresponding xml. For example,\n"
+    str = str + "                 for Red Hat 8.0 config_RedHat_8.0.xml file is supposed to be used\n"
+    str = str + "                 by default. If the appropriate xml file is not found, the config.xml\n"
+    str = str + "                 is used by default.\n"
+    str = str + "\n"
+    str = str + " -t <target-dir> The target directory the products to be installed to.\n"
+    str = str + "                 This parameter overloads the target directory described in the\n"
+    str = str + "                 configuration file.\n"
+    str = str + "\n"
+    str = str + " -tmp <tmp-dir>  The directory which should be used for the temporary files.\n"
+    str = str + "                 This parameter overloads the temporary directory described in the\n"
+    str = str + "                 configuration file.\n"
+    str = str + "\n"
+    str = str + " -h              Prints this help information.\n" 
+    return str
+
+#==============================================================
+# message finction
+#==============================================================
+def message(msg):
+    print ">>>", msg
+    
+#==============================================================
+# error_exit
+#==============================================================
+def error_exit (str = ""):
+    import sys
+    if len(str): res = "\n" + str + "\n"
+    else : res = ""
+    print res + \
+          get_help_info() 
+    sys.exit(1);
+
+
+#==============================================================
+# Cheks whether the passed parameter is a key.
+#==============================================================
+def is_key ( val ):
+    import re
+    if val is not None : 
+       return re.match(r'^-[a-zA-Z]', val)
+    return 0
+
+#==============================================================
+# From the list of parameters extracts value following 'key' 
+#==============================================================
+def extract_parameter ( key, args ) :
+    import sys
+    length = len(args);
+    if ( length == 0 ) :  return None
+   
+    found = 0;
+
+    for i in range(0, length-1):
+        if  args[i] == key : 
+            if ( is_key ( args[i+1]) ) :
+               print " No value after key ", key
+                sys.exit(1);
+           
+           value = args[i+1]
+            if ( i < length - 2  and is_key ( args[i+2] ) == 0 ) : #control that only one value follows key 
+                                                              #(not a list). In this case params are correct.
+               print "Too much values after key ", key
+                sys.exit(1);
+           
+           found = 1; break;
+    
+    if (found) : 
+       return  value 
+    
+    return None
+
+
+#===============================================================
+# Extracts list of values following specified 'key' from 'args[]'
+#===============================================================
+def extract_list (key, args) : 
+
+    lenght = len(args)
+    if ( args is None or lenght == 0 ):
+       error_exit()
+
+    list=[]
+    found = 0
+
+    for i in  range(0, length) :
+        if args[i] == key  : 
+            if (is_key ( args[i+1]))  : 
+                error_exit();
+           
+            for i in range (i+1, lenght):
+                if is_key(args[i]) : break
+                list.append(args[i])
+            found =1; break
+     
+    return list; #empty list is returned if no values after key
+
 
-__TAG__SOURCES__    = "install sources"
-__TAG__BINARIES__   = "install binaries"
-__TAG__NATIVE__     = "use native"
-__TAG__PREINSTALL__ = "not install"
+#==============================================================
+# Method find the $key in the list and return 1 if success
+# and 0 otherwise. 
+#==============================================================
+def find_key (key, argv) :
+
+    if (not is_key(key)) : return 0
+
+    for simbol in  argv :
+        if simbol == key:
+            return 1 
+    return 0
+
+#==============================================================
+# Parse the list of parameters
+#==============================================================
+def parse_parameters (args) :
+
+    if find_key('-h', args) :
+        print get_help_info();
+        import sys
+        sys.exit(0)
+        
+    xmlfile = extract_parameter("-f", args)
+    target_dir =  extract_parameter("-t", args)
+    tmp_dir = extract_parameter("-tmp", args)
+    if find_key('-b', args):
+        is_gui = 0
+    else : is_gui = 1
+    return [xmlfile, target_dir,  tmp_dir, is_gui]
+
+
+#=================================================================
+# Checks boolean value: yes/no, true/false, 1/0
+#=================================================================
+def check_bool(val):
+    return str(val).strip() in ["yes","true", "1"]
+
+#=================================================================
+# The first algorithm to create the dependencies list by their level
+#=================================================================
+def get_next_level(list, products):
+    
+    import re
+    result = []
+    expr = "(" + list[0].name
+    for i in range(1, len(list)):
+        expr = expr + "|"+ list[i].name
+    
+    expr = expr + ")$"
+    #expr=re.compile(expr)
+
+    for product in products:
+        deps = re.sub(r'\s+', "", product.dependencies)
+        if re.search(expr,  deps):
+            result.append(product)
+
+    return result
+
+
+def create_levels(prods):
+    import copy
+    
+    products = copy.deepcopy(prods)
+    
+    result = {}
+    import re
+    #1. find the products with empty lists of dependencies
+    list = []
+    for product in products:
+        if len(re.sub(r'\s', "", product.dependencies)) == 0 :
+            list.append(product)
+
+    if len(list) == 0 :
+        raise RuntimeError, "Products that depend on nothing are not found"
+
+    # remove the first level products from the common list of products
+    for product in list :
+        products.remove(product)
+
+    ind = 0; 
+    result[0] = list
+
+    while (len(products)) :
+        res = get_next_level(list, products)
+        if len(res) == 0 :
+            raise RuntimeError, "Empty list of products is found"
+
+        for product in res :
+            products.remove(product)
+
+        ind = ind +1
+        result[ind] =  res
+        list = res
+            
+    str = ""
+    for i in result.keys():
+        for product in  result[i]:
+            str = str + product.name + " "
+
+    return str;
+            
+#=================================================================
+# The second algorithm
+#=================================================================
+def get_dependencies_set(prods) :
+    import copy
+    import re
+
+    products = copy.deepcopy(prods)
+    deps = ""
+    list = []
+
+    while (len(products)) :
+
+        tmplist = []
+        #find the products with empty list of dependencies
+        for product in products:
+            product.dependencies = re.sub(r'\s+$', "", product.dependencies)
+            product.dependencies = re.sub(r'^\s+', "", product.dependencies)
+           
+            if len(product.dependencies) == 0 :
+               tmplist.append(product); 
+               deps = deps + " " + product.name
+
+        list.append(tmplist)
+
+        #remove the products names from other products dependencies
+        for item in tmplist:
+            products.remove(item)
+
+            regexpr1 = "((^|,(\s+)?)"+item.name+"$|^"+item.name+"(\s+)?,(\s+)?)"
+            regexpr2 = ",(\s+)?"+item.name+"(\s+)?,(\s+)?"
+
+            for product in products:
+                product.dependencies = re.sub(r'\s+$', "", product.dependencies)
+                product.dependencies = re.sub(r'^\s+', "", product.dependencies)
+
+                product.dependencies = re.sub(regexpr1, "", product.dependencies)
+                product.dependencies = re.sub(regexpr2, ",", product.dependencies)
+
+    return deps 
+    
+#=================================================================
+# The third algorithm (same as SALOME_InstallWizard.cxx uses)
+#=================================================================
+def get_dependencies(prods) :
+    list = []
+    for product in prods:
+        if check_bool(product.disable): continue
+        
+        deps = product.dependencies.split(",")
+        for dep in deps:
+            if dep and not dep in list:
+                list.append( dep )
+                
+        if product and not product in list:
+            list.append( product.name )
+            
+    return " ".join( list )
+
+#==============================================================
+# Creates dir, returns the part of path that existed early.
+# Access may be defined.
+#==============================================================
+def create_dir (directory, access = 0777):
+    import string, os
+    dirs = string.split(directory, "/")
+    existing = ""; dir = ""
+    root = ""
+    for item in dirs:
+        if len(item) == 0:  continue
+        dir = dir + "/"+item
+        if os.path.exists(dir):
+            existing = dir
+        else:
+            os.mkdir(dir, access )
+            #root= existing + "/"+item
+            if dir == existing + "/"+item :
+                root = dir
+            #else : root = existing
+    
+    return root
 
 #==============================================================
 # class Product 
 #==============================================================
 
 class Product :
-    def __init__(self,
-                 theName,
+    def __init__(self, theName,
                  theVersion            = None,
                  theInstall            = None,
                  theSupportred         = None,
+                 theDisable            = None,
                  theDependencies       = None,
                  theInstalldiskspace   = None,
                  theTemporarydiskspace = None,
                  theScript             = None,
                  thePickUpEnvironment  = None):
-        self.name               = strip(theName)
-        self.version            = strip(theVersion)
-        self.install            = strip(theInstall)
-        self.supported          = strip(theSupportred)
-        self.dependencies       = strip(theDependencies)
-        self.installdiskspace   = strip(theInstalldiskspace)
-        self.temporarydiskspace = strip(theTemporarydiskspace)
-        self.script             = strip(theScript)
-        self.pickupEnv          = strip(thePickUpEnvironment)
+        
+
+        self.name               = theName
+        self.version            = theVersion
+        self.install            = theInstall
+        self.supported          = theSupportred
+        self.disable            = theDisable
+        self.dependencies       = theDependencies
+        self.installdiskspace   = theInstalldiskspace
+        self.temporarydiskspace = theTemporarydiskspace
+        self.script             = theScript
+        self.pickupEnv          = thePickUpEnvironment
 
 #===================================================================
 # class Config
 #===================================================================
 class Config :
-    def __init__(self,
-                 theVersion   = None,
-                 theCaption   = None,
-                 theCopyright = None,
-                 theLicense   = None,
-                 theOS        = None):
-        self.version   = strip(theVersion)
-        self.caption   = strip(theCaption)
-        self.copyright = strip(theCopyright)
-        self.license   = strip(theLicense)
-        self.os        = strip(theOS)
+    def __init__(self, theVersion='', theCaption='', theCopyright='', theLicense='', theOS=''):
+        self.version   = theVersion
+        self.caption   = theCaption
+        self.copyright = theCopyright
+        self.license   = theLicense
+        self.os        = theOS
+
 
 #===================================================================
 # class Path
 #===================================================================
 class Path :
-    def __init__(self,
-                 theTargetdir = None,
-                 theTmpdir    = None):
-        self.targetdir = strip(theTargetdir)
-        self.tmpdir    = strip(theTmpdir)
+    def __init__(self, theTargetdir=".", theTmpdir="."):
+        self.targetdir = theTargetdir
+        self.tmpdir    = theTmpdir
+
         
 #===================================================================
 # class ConfigParser
@@ -81,38 +368,36 @@ class ConfigParser(xmllib.XMLParser):
         self.currentdata.append(data)
         
     def start_product(self, attrs):
-        if not attrs.get('name', '').strip():         return
-        if check_bool(attrs.get('disable', 'false')): return
-        aProduct = Product(attrs.get('name'),
-                           attrs.get('version',            None),
-                           attrs.get('install',            None),
-                           attrs.get('supported',          None),
-                           attrs.get('dependancies',       None),
-                           attrs.get('installdiskspace',   None),
-                           attrs.get('temporarydiskspace', None),
-                           attrs.get('script',             None),
-                           attrs.get('pickupenv',          None))
+        aProduct = Product(attrs['name'],
+                           attrs['version'],
+                           attrs['install'],
+                           attrs['supported'],
+                           attrs['disable'],
+                           attrs['dependancies'],
+                           attrs['installdiskspace'],
+                           attrs['temporarydiskspace'],
+                           attrs['script'])
+
+        if attrs.has_key( 'pickupenv' ):
+            aProduct.pickupEnv = attrs['pickupenv']
+
         self.products.append(aProduct)
-        pass
 
     def end_product(self):
         pass
 
     def start_config(self, attrs):
-        self.config = Config(attrs.get('version',   None),
-                             attrs.get('caption',   None),
-                             attrs.get('copyright', None),
-                             attrs.get('license',   None),
-                             attrs.get('os',        None))
-        pass
-    
+        self.config = Config(attrs['version'],
+                             attrs['caption'],
+                             attrs['copyright'],
+                             attrs['license'],
+                             attrs['os'])
     def end_config(self):
         pass
 
     def start_path (self, attrs):
-        self.path = Path(attrs.get('targetdir', None),
-                         attrs.get('tempdir',   None))
-        pass
+        self.path = Path(attrs['targetdir'],
+                         attrs['tempdir'])
         
     def end_path(self):
         pass
@@ -123,303 +408,84 @@ class ConfigParser(xmllib.XMLParser):
                 return product
         return None
 
-#==============================================================
-# message: prints diagnostic information
-#==============================================================
-def message(msg):
-    if msg.strip():
-        print ">>>", msg
-    pass
-
-#==============================================================
-# warning: prints warning
-#==============================================================
-def warning(msg):
-    if msg.strip():
-        print ""
-        print msg
-        print ""
-    pass
-
-#==============================================================
-# error_exit : prints (optionally) error string, then prints
-#              help information and quits
-#==============================================================
-def error_exit(msg = "", print_help = True):
-    # print error message
-    if len(msg.strip()):
-        print ""
-        print msg
-        print ""
-    # print help information
-    if print_help:
-        global opt_parser
-        if opt_parser:
-            opt_parser.print_help() 
-            print ""
-    # cleaning 
-    clean_all()
-    # quit
-    sys.exit(1);
-    pass
-
-#==============================================================
-# clean_all : performs system cleaning before exiting
-#==============================================================
-def clean_all():
-    global root_path
-    remove_dir(root_path)
-    pass
-
-#==============================================================
-# parse_parameters : parses command line arguments
-#==============================================================
-def parse_parameters():
-    global opt_parser
-    opt_parser = OptionParser(add_help_option=False)
-    help_str  = "Runs the Installation Wizard in the GUI mode [default].\n"
-    help_str += "In this case only -f option is taken into account. "
-    help_str += "Other options are ignored."
-    opt_parser.add_option("-g",
-                          "--gui",
-                          action="store_true",
-                          dest="gui",
-                          default=True,
-                          help=help_str)
-    help_str  = "Runs the Installation Wizard in the TUI mode."
-    opt_parser.add_option("-b",
-                          "--batch",
-                          action="store_false",
-                          dest="gui",
-                          help=help_str)
-    help_str  = "The configuration xml file.\n"
-    help_str += "If this parameter is missing, then the program tries to define the "
-    help_str += "Linux platform and use the corresponding xml file. For example, "
-    help_str += "for Red Hat 8.0 config_RedHat_8.0.xml file is used in this case."
-    help_str += "If program fails to define target Linux platform or the corresponding "
-    help_str += "xml file is not provided with the Installation Wizard, then default "
-    help_str += "config.xml file is used."
-    opt_parser.add_option("-f",
-                          "--file",
-                          action="store",
-                          dest="xmlfile",
-                          metavar="FILE",
-                          help=help_str)
-    help_str  = "The target directory the products to be installed to.\n"
-    help_str += "When used this parameter overrides the default target directory "
-    help_str += "defined in the configuration xml file."
-    opt_parser.add_option("-d",
-                          "--target",
-                          action="store",
-                          dest="target_dir",
-                          metavar="DIR",
-                          help=help_str)
-    help_str  = "The directory used for temporary files.\n"
-    help_str += "When used this parameter overrides the default temporary directory "
-    help_str += "defined in the configuration xml file."
-    opt_parser.add_option("-t",
-                          "--tmp",
-                          action="store",
-                          dest="tmp_dir",
-                          metavar="DIR",
-                          help=help_str)
-    help_str  = "Prints this help and quits."
-    opt_parser.add_option("-v",
-                          "--version",
-                          action="store_true",
-                          help=help_str)
-    help_str  = "Prints version information and quits."
-    opt_parser.add_option("-h",
-                          "--help",
-                          action="store_true",
-                          help=help_str)
-    (options, args) = opt_parser.parse_args()
-    if options.help:
-        # print help info and quit
-        print "\nSALOME Installation Wizard\n"
-        opt_parser.print_help()
-        print ""
-        sys.exit(0)
-    if options.version:
-        # print version info and quit
-        print ""
-        cmd = "./bin/SALOME_InstallWizard --version"
-        os.system(cmd)
-        print ""
-        sys.exit(0)
-    return [options.xmlfile, options.target_dir, options.tmp_dir, options.gui]
-
-#=================================================================
-# strip : removes spaces at the beginning and at eh end of the 
-#         <param> if it is of string type
-#=================================================================
-def strip(param):
-    import types
-    if type(param) == types.StringType:
-        return param.strip()
-    return param
-    
-#=================================================================
-# check_bool : checks boolean value: yes/no, true/false, 1/0
-#=================================================================
-def check_bool(val):
-    if str(val).lower().strip() in ["yes","true", "1"]:
-        return True
-    if str(val).lower().strip() in ["no","false", "0"]:
-        return False
-    try:
-        val = int(val)
-        return val != 0
-    except:
-        pass
-    return False
-
-#=================================================================
-# get_dependencies : extract products dependencies
-#=================================================================
-def get_dependencies(prods):
-    list = []
-    for product in prods:
-        deps = product.dependencies.split(",")
-        for dep in deps:
-            if dep and not dep in list:
-                list.append( dep )
-                
-        if product and not product in list:
-            list.append( product.name )
-            
-    return " ".join( list )
-
-#==============================================================
-# create_dir : creates a directory with (optional) permissions,
-#              returns the part of path that existed before
-#              directory creation; exits with error if access
-#              is denied
-#==============================================================
-def create_dir(directory, access = 0777):
-    import string, os
-    dirs = string.split(directory, "/")
-    existing = "";
-    dir = ""
-    root = ""
-    for subdir in dirs:
-        if len(subdir) == 0:  continue
-        dir = "%s/%s"%(dir, subdir)
-        if os.path.exists(dir):
-            existing = dir
-        else:
-            try:
-                os.mkdir(dir, access)
-            except:
-                error_exit("Can't create directory: %s.\nAccess is denied."%directory)
-            if dir == "%s/%s"%(existing, subdir):
-                root = dir
-    return root
-
-#==============================================================
-# substituteVars : performes environment variables substistution
-#                  the given string; if varibale is not defined
-#                  it is substituted by the empty string
-#==============================================================
-def substituteVars(str):
-    str = os.path.expanduser(str)
-    str = os.path.expandvars(str)
-    return str
-
 #================================================================
-# get_program_path : gets program's directory path
-#                    (and performs 'cd' command there) 
+# get the path using file name
 #================================================================
-def get_program_path():
-    path = os.path.dirname(sys.argv[0])
-    if path:
-        os.chdir(path)
-    return os.getcwd()
+def get_current_path(file_name):
+    path = "."; where = string.rfind(file_name,'/');
+    if (where != -1):
+        path = (file_name)[: where]
+        os.chdir(path);
+    path = os.getcwd() + "/"
+    return path
 
 #================================================================
-# check_dir : checks directory existence
+# checks dir existing 
 #================================================================
 def check_dir(dir):
-    if (os.path.islink(dir)):
-        realpath = os.path.realpath(dir)
-        if not os.path.exists(realpath):
-            msg = "Invalid link %s.\nThe directory %s a link points to does not exist."%(dir,realpath)
-            error_exit(msg, False)
-    else:
+    if (os.path.islink(dir)) :
+        native_dir = os.readlink(dir)
+        if not os.path.exists(native_dir) :
+            print "Invalid link " + dir + ". The directory " + native_dir + " a link points to does not exist."
+            return 0 # problem
+    else :
         if not os.path.exists(dir):
-            msg = "Directory %s does not exist."%dir
-            error_exit(msg, False)
-    pass
+            print "Directory " + dir + " does not exist"
+            return 0
+    return 1
 
 #===============================================================
-# check_disk_space : checks the disk space;
-#                    quits if there is no enough disk space
+# Checks the disk space. Exit from interpreter if there is no
+# enough disk space.
 #===============================================================
-def check_disk_space(products, scripts_dir, target_dir, tmp_dir):
+def check_disk_space(products, script_dir, target_dir, tmp_dir):
+    import re, string, os
     install_space = 0
     temporary_space = 0
-    for product in products:
-        if product.install in [__TAG__NATIVE__, __TAG__PREINSTALL__]:
+    for product in products :
+        product.install = re.sub(r'^\s+', "", product.install)
+        product.install = re.sub(r'\s+$', "", product.install)
+        
+        if check_bool(product.disable) or product.install == "use native" or product.install == "not install":
             continue
-        spaces = string.split(product.installdiskspace, ',')
+        spaces = string.split( product.installdiskspace,',')
         prod_space = spaces[0]
-        if (len(spaces) > 1 ) and (product.install == __TAG__SOURCES__):
+        if (len(spaces) == 2 ) and (product.install == "install binaries") :
             prod_space = spaces[1]
         install_space = install_space + string.atoi(prod_space)
-        if product.install == __TAG__SOURCES__:
-            temporary_space = max(temporary_space, string.atoi(product.temporarydiskspace))
-
-    res = os.system("%s/%s %s %d"%(scripts_dir, "checkSize.sh", target_dir, install_space))
+        temporary_space = temporary_space + string.atoi(product.temporarydiskspace)
+    res = os.system(scripts_dir + "checkSize.sh" + " " + target_dir + " " + str(install_space))
     if res:
-        msg = "There is no enough space to install the products."
-        error_exit(msg, False)
+        print "There is no enough space to install the products."
+        return 0
     
-    res = os.system("%s/%s %s %d"%(scripts_dir, "checkSize.sh", tmp_dir, temporary_space))
+    res = os.system(scripts_dir + "checkSize.sh" + " " + tmp_dir + " " + str(temporary_space))
     if res:
-        msg = "There is no enough space for temporary directory."
-        error_exit(msg, False)
-    pass
+        print "There is no enough space for tmp directory."
+        return 0
+    
+    return 1
  
 #===============================================================
-# remove_dir : removes temporary directory
+# Removes temporary directory
 #===============================================================
-def remove_dir(path):
-    if path and os.path.exists(path):
-        os.system("rm -rf " + path)
+def remove_dir( rem_path = "" ):
+    if len( rem_path ) and os.path.exists( rem_path ):
+        os.system( "rm -rf " + rem_path )
     pass
-
-#==============================================================
-# has_binaries : returns True if some product is installed from
-#                binaries
-#===============================================================
-def has_binaries(products):
-    for product in products:
-        if product.install == __TAG__BINARIES__:
-            return True
-    return False
-
-#==============================================================
-# has_sources : returns True if some product is installed from
-#               sources
-#===============================================================
-def has_sources(products):
-    for product in products:
-        if product.install == __TAG__SOURCES__:
-            return True
-    return False
-
+    
 #================================================================
 # main
 #================================================================
     
 if __name__ == "__main__":
-    # get program dir
-    cur_dir = get_program_path()
-    # parse command line
-    [xml_file, target_dir, tmp_dir, is_gui] = parse_parameters()
+    
+    cur_dir = get_current_path(sys.argv[0])
+   
+    [xml_file, target_dir, tmp_dir, is_gui]  = parse_parameters(sys.argv)
 
-    # define xml file to be used
-    if (xml_file is None):
+    # define xml file -----------------
+    if (xml_file is None) :
         plt_name = ""
         plt_ver  = ""
         xml_file_name = "config.xml"
@@ -438,42 +504,45 @@ if __name__ == "__main__":
             plt_name = "Debian"
             plt_ver = open("/etc/debian_version").readline().strip()
         _xml_file_name = "config_%s_%s.xml"%(plt_name, plt_ver)
-        if plt_name and plt_ver and os.path.exists("%s/%s"%(cur_dir, _xml_file_name)):
+        if plt_name and plt_ver and os.path.exists(cur_dir + _xml_file_name):
             xml_file_name = _xml_file_name
         else:
-            msg  = "Not supported Linux platform!\n"
-            msg += "Trying to use default configuration file!"
-            warning(msg)
+            print ""
+            print "Not supported Linux platform!"
+            print "Trying to use default configuration!"
+            print ""
 
-        xml_file = "%s/%s"%(cur_dir, xml_file_name)
+        xml_file = cur_dir +  xml_file_name
 
     if not xml_file or not os.path.exists(xml_file):
-        msg = "Configuration file %s is not found!"%xml_file
+        msg  = "Configuration file %s is not found!"%xml_file
+        msg += "\nTry to run with -f <xmlfile> option."
         error_exit(msg)
 
     if not os.access(xml_file, os.R_OK):
-        msg = "There is no read access for %s file!"%xml_file
-        error_exit(msg)
+        print "There is no read access for %s file!"%xml_file
+        sys.exit(1)
 
     #---- GUI ----------------
-
     if is_gui : 
         env = os.environ
         if not env.has_key("PATH") :
             env["PATH"] = ""
         if not env.has_key("LD_LIBRARY_PATH") :
-            env["LD_LIBRARY_PATH"] = ""
+            env["LD_LIBRARY_PATH"] ""
 
-        env["LD_LIBRARY_PATH"] =  ".:" + env["LD_LIBRARY_PATH"]
-        env["PATH"] = ".:" + env["PATH"]
+        env["LD_LIBRARY_PATH"] =  ".:" +  env["LD_LIBRARY_PATH"]
+        env["PATH"] = ".:"+ env["PATH"]
 
-        cmd = "./bin/SALOME_InstallWizard %s &"%xml_file
-        sys.exit(os.system(cmd))
+        sys.exit(os.system("cd " + cur_dir + "; ./bin/SALOME_InstallWizard " + xml_file +"&"))
+        
+        
 
     #-----  TUI ---------------------
 
-    # parse XML file -----------
-    message("Parsing XML configuration file: %s"%xml_file)
+    #print xml_file, target_dir, tmp_dir, is_gui
+
+    message("Parsing xml config file: " + xml_file)
     filehandle = open(xml_file)
     data = filehandle.read()
     filehandle.close()
@@ -481,114 +550,103 @@ if __name__ == "__main__":
     parser.feed(data)
     parser.close()
 
-    # actions map
-    what_to_do = { __TAG__SOURCES__    : "install_source",
-                   __TAG__BINARIES__   : "install_binary",
-                   __TAG__NATIVE__     : "try_native",
-                   __TAG__PREINSTALL__ : "try_preinstalled"}
-    # source directory map
-    bin_dir = ""
-    if parser.config.os:
-        bin_dir += "/%s"%parser.config.os
-    subdir = { __TAG__SOURCES__    : "SOURCES",
-               __TAG__BINARIES__   : "BINARIES" + bin_dir,
-               __TAG__NATIVE__     : "",
-               __TAG__PREINSTALL__ : ""}
-
-    # check scripts directory -----------
-    scripts_dir = "%s/%s"%(cur_dir, "config_files")
-    check_dir(scripts_dir)
-
-    # check products archives directories -----------
-    has_bin = has_binaries(parser.products)
-    has_src = has_sources(parser.products)
-    source_dir = "%s/%s"%(cur_dir, "Products")
-
-    if has_src or has_bin:
-        check_dir(source_dir)
-
-    if has_src:
-        check_dir("%s/%s"%(source_dir,subdir[__TAG__SOURCES__]))
-
-    if has_bin:
-        check_dir("%s/%s"%(source_dir,subdir[__TAG__BINARIES__]))
-
-    # check/create target dir -----------
-    if target_dir is None:
-        target_dir = parser.path.targetdir
-    target_dir = substituteVars(target_dir)
-
-    message("Creating target directory: " + target_dir)
-    create_dir(target_dir, 0755)
-
-    if not os.path.exists(target_dir):
-        error_exit("Invalid target directory: " + target_dir)
-
-    if not os.access(target_dir, os.W_OK) :
-        error_exit("There is no write permissions for the directory: " + target_dir)
-
-    # check/create temporary dir -----------
+    # definitions :
+    # map
+    what_to_do = { "install sources"  : "install_source",
+                   "install binaries" : "install_binary",
+                   "use native"       : "try_native",
+                   "not install"      : "try_preinstalled"}
+    # define tmp dir  -----------
     if tmp_dir is None:
         tmp_dir = parser.path.tmpdir
-    if not tmp_dir:
+    if tmp_dir is None or tmp_dir == "":
         tmp_dir = "/tmp"
-    tmp_dir = substituteVars(tmp_dir)
     import random
-    tmp_dir = "%s/INSTALLWORK%d"%(tmp_dir, random.randint(10000,100000))
-
-    message("Creating temporary directory: " + tmp_dir)
-    root_path = create_dir(tmp_dir, 0755)
-   
+    tmp_dir = tmp_dir + "/INSTALLWORK" + str(random.randint(10000,100000))
+    root_path = ""
     if not os.path.exists(tmp_dir):
-        error_exit("Invalid temporary directory: " + tmp_dir)
+        message("Creating temporary directory: " + tmp_dir); root_path = create_dir(tmp_dir, 0755) ; 
+    if not os.path.exists(tmp_dir):
+        error_exit("Invalid temporary directory " + tmp_dir + ". Use -tmp key to set directory or correct xml file\n\n")
 
     if not os.access(tmp_dir, os.W_OK) :
-        error_exit("There is no write permissions for the directory: " + tmp_dir)
+        str = "There is no write permissions for directory " + tmp_dir + ". Use -tmp key to set temporary directory or correct xml file"
+        error_exit(str)
         
-    # check available disk space
-    message("Checking available disk space")
-    check_disk_space(parser.products, scripts_dir, target_dir, tmp_dir)
+    # define target dir  --------
+    if target_dir is None:
+        target_dir = parser.path.targetdir
+
+    if not os.path.exists(target_dir):
+        message("Creating target directory: " + target_dir); create_dir(target_dir, 0755)
+    if not os.path.exists(target_dir):
+        error_exit("Invalid target directory " + target_dir + ". Use -t key to set directory or correct xml file\n\n")
 
-    # change current directory
+    if not os.access(target_dir, os.W_OK) :
+        str = "There is no write permissions for directory " + target_dir + ". Use -t key to set target directory or correct xml file."
+        error_exit(str)
+
+    # define products dir ------------
+    source_dir =  cur_dir + "Products" ; 
+    if not check_dir(source_dir):
+        remove_dir(root_path)
+        sys.exit(1)
+       
+    subdir = {"install sources"  : "SOURCES",
+              "install binaries" : "BINARIES/"+parser.config.os,
+              "use native"       : "",
+              "not install"      : ""}
+
+
+    #  define scripts dir ------------
+    scripts_dir = cur_dir + "config_files/"
+    if not check_dir(scripts_dir):
+        remove_dir(root_path)
+        sys.exit(1)
     os.chdir(scripts_dir)
 
-    # get dependencies list
-    list_of_dep = get_dependencies(parser.products)
+    #list_of_dep =  create_levels(parser.products)
+    #list_of_dep =  get_dependencies_set(parser.products)
+    list_of_dep =  get_dependencies(parser.products)
+
+    message("Checking available disk space")
+    if check_disk_space(parser.products, scripts_dir, target_dir, tmp_dir) :
+
+        message("Starting...")
+        # install products
+        for product in parser.products :
+
+            if check_bool(product.disable): continue
+
+            message("Processing " + product.name + "...")
+            cmd = scripts_dir +  product.script + " " + \
+                  what_to_do[product.install]+ " " + \
+                  tmp_dir + " " + \
+                  source_dir + "/" + subdir[product.install] + " " + \
+                  target_dir + " " + \
+                  '"' + list_of_dep + '"' + " " + \
+                  product.name
 
-    # starting
-    message("Starting ...")
-    
-    # install products
-    for product in parser.products:
-        message("... processing %s ..."%product.name)
-        cmd = '%s/%s %s %s %s/%s %s "%s" %s'%(scripts_dir,
-                                              product.script,
-                                              what_to_do[product.install],
-                                              tmp_dir,
-                                              source_dir,
-                                              subdir[product.install],
-                                              target_dir,
-                                              list_of_dep,
-                                              product.name)
-        res = os.system(cmd)
-
-    # pickup environment
-    message("Creating environment files")
-    for product in parser.products :
-        if check_bool(product.pickupEnv):
-            cmd = '%s/%s pickup_env %s %s/%s %s "%s" %s'%(scripts_dir,
-                                                          product.script,
-                                                          tmp_dir,
-                                                          source_dir,
-                                                          subdir[product.install],
-                                                          target_dir,
-                                                          list_of_dep,
-                                                          product.name)
             res = os.system(cmd)
+            #if res : break; # try_preinstalled can return 1
+
+        # pickup environment
+        message("Creating environment files")
+        for product in parser.products :
+
+            if check_bool(product.disable): continue
+
+            if check_bool(product.pickupEnv):
+                cmd = scripts_dir +  product.script + " " + \
+                      "pickup_env " + \
+                      tmp_dir + " " + \
+                      source_dir + "/" + subdir[product.install] + " " + \
+                      target_dir + " " + \
+                      '"' + list_of_dep + '"' + " " + \
+                      product.name
+                
+                res = os.system(cmd)
 
-    # clean temporary directory
     message("Cleaning temporary directory")
-    clean_all()
-    # finishing
+    remove_dir(root_path)
     message("Finished!")
-    pass