Add --user/--passwd to repo command in KS.
authorHuang Hao <hao.h.huang@intel.com>
Tue, 17 Dec 2013 06:05:17 +0000 (14:05 +0800)
committerHuang Hao <hao.h.huang@intel.com>
Wed, 25 Dec 2013 03:25:52 +0000 (11:25 +0800)
If there are special characters like '@' in repo url, it can be
set by --passwd option in plain text format.

Also refactor MicRepo_data and MicRepo classes to extend from
F14_Repo, so we don't have to add --proxy ourself.

Fix: 1542

Change-Id: Ic9078a7313e14bd0959fd1676994cf5761e04c44

mic/kickstart/__init__.py
mic/kickstart/custom_commands/micrepo.py
mic/utils/misc.py
mic/utils/safeurl.py

index c639e7a..ffb7fe8 100644 (file)
@@ -732,7 +732,7 @@ def get_repos(ks, repo_urls=None):
             baseurl = repo_urls[repo.name]
             mirrorlist = None
 
-        baseurl = SafeURL(baseurl)
+        baseurl = SafeURL(baseurl, repo.user, repo.passwd)
 
         if repos.has_key(repo.name):
             msger.warning("Overriding already specified repo %s" %(repo.name,))
index b31576e..bfbc95d 100644 (file)
@@ -1,4 +1,3 @@
-#!/usr/bin/python -tt
 #
 # Copyright (c) 2008, 2009, 2010 Intel, Inc.
 #
 # with this program; if not, write to the Free Software Foundation, Inc., 59
 # Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
-from pykickstart.base import *
-from pykickstart.errors import *
-from pykickstart.options import *
-from pykickstart.commands.repo import *
+from pykickstart.commands.repo import F14_RepoData, F14_Repo
 
-class Mic_RepoData(F8_RepoData):
 
-    def __init__(self, baseurl="", mirrorlist=None, name="", priority=None,
-                 includepkgs=(), excludepkgs=(), save=False, proxy=None,
-                 proxy_username=None, proxy_password=None, debuginfo=False,
-                 source=False, gpgkey=None, disable=False, ssl_verify="yes",
-                 nocache=False):
-        kw = {}
-        # F8_RepoData keywords
-        if includepkgs:
-            kw['includepkgs'] = includepkgs
-        if excludepkgs:
-            kw['excludepkgs'] = excludepkgs
+class Mic_RepoData(F14_RepoData):
+    "Mic customized repo data"
 
-        #FC6_RepoData keywords
-        if baseurl:
-            kw['baseurl'] = baseurl
-        if mirrorlist:
-            kw['mirrorlist'] = mirrorlist
-        if name:
-            kw['name'] = name
+    def __init__(self, *args, **kw):
+        F14_RepoData.__init__(self, *args, **kw)
+        for field in ('save', 'proxyuser', 'proxypasswd', 'debuginfo',
+                      'disable', 'source', 'gpgkey', 'ssl_verify', 'priority',
+                      'nocache', 'user', 'passwd'):
+            setattr(self, field, kw.get(field))
 
-        F8_RepoData.__init__(self, **kw)
-        self.save = save
-        self.proxy = proxy
-        self.proxy_username = proxy_username
-        self.proxy_password = proxy_password
-        self.debuginfo = debuginfo
-        self.disable = disable
-        self.source = source
-        self.gpgkey = gpgkey
-        self.ssl_verify = ssl_verify.lower()
-        self.priority = priority
-        self.nocache = nocache
+        if hasattr(self, 'proxy') and not self.proxy:
+            # TODO: remove this code, since it only for back-compatible.
+            # Some code behind only accept None but not empty string
+            # for default proxy
+            self.proxy = None
 
     def _getArgsAsStr(self):
-        retval = F8_RepoData._getArgsAsStr(self)
+        retval = F14_RepoData._getArgsAsStr(self)
 
-        if self.save:
-            retval += " --save"
-        if self.proxy:
-            retval += " --proxy=%s" % self.proxy
-        if self.proxy_username:
-            retval += " --proxyuser=%s" % self.proxy_username
-        if self.proxy_password:
-            retval += " --proxypasswd=%s" % self.proxy_password
-        if self.debuginfo:
-            retval += " --debuginfo"
-        if self.source:
-            retval += " --source"
-        if self.gpgkey:
-            retval += " --gpgkey=%s" % self.gpgkey
-        if self.disable:
-            retval += " --disable"
-        if self.ssl_verify:
-            retval += " --ssl_verify=%s" % self.ssl_verify
-        if self.priority:
-            retval += " --priority=%s" % self.priority
-        if self.nocache:
-            retval += " --nocache"
+        for field in ('proxyuser', 'proxypasswd', 'user', 'passwd',
+                      'gpgkey', 'ssl_verify', 'priority',
+                      ):
+            if hasattr(self, field) and getattr(self, field):
+                retval += ' --%s="%s"' % (field, getattr(self, field))
 
-        return retval
+        for field in ('save', 'diable', 'nocache', 'source', 'debuginfo'):
+            if hasattr(self, field) and getattr(self, field):
+                retval += ' --%s' % field
 
-class Mic_Repo(F8_Repo):
-    def __init__(self, writePriority=0, repoList=None):
-        F8_Repo.__init__(self, writePriority, repoList)
+        return retval
 
-    def __str__(self):
-        retval = ""
-        for repo in self.repoList:
-            retval += repo.__str__()
 
-        return retval
+class Mic_Repo(F14_Repo):
+    "Mic customized repo command"
 
     def _getParser(self):
-        def list_cb (option, opt_str, value, parser):
-            for d in value.split(','):
-                parser.values.ensure_value(option.dest, []).append(d)
+        op = F14_Repo._getParser(self)
+        op.add_option('--user')
+        op.add_option('--passwd')
+        op.add_option("--proxyuser")
+        op.add_option("--proxypasswd")
+
+        op.add_option("--save", action="store_true", default=False)
+        op.add_option("--debuginfo", action="store_true", default=False)
+        op.add_option("--source", action="store_true", default=False)
+        op.add_option("--disable", action="store_true", default=False)
+        op.add_option("--nocache", action="store_true", default=False)
 
-        op = F8_Repo._getParser(self)
-        op.add_option("--save", action="store_true", dest="save",
-                      default=False)
-        op.add_option("--proxy", type="string", action="store", dest="proxy",
-                      default=None, nargs=1)
-        op.add_option("--proxyuser", type="string", action="store",
-                      dest="proxy_username", default=None, nargs=1)
-        op.add_option("--proxypasswd", type="string", action="store",
-                      dest="proxy_password", default=None, nargs=1)
-        op.add_option("--debuginfo", action="store_true", dest="debuginfo",
-                      default=False)
-        op.add_option("--source", action="store_true", dest="source",
-                      default=False)
-        op.add_option("--disable", action="store_true", dest="disable",
-                      default=False)
-        op.add_option("--gpgkey", type="string", action="store", dest="gpgkey",
-                      default=None, nargs=1)
-        op.add_option("--ssl_verify", type="string", action="store",
-                      dest="ssl_verify", default="yes")
-        op.add_option("--priority", type="int", action="store", dest="priority",
-                      default=None)
-        op.add_option("--nocache", action="store_true", dest="nocache",
-                      default=False)
+        op.add_option("--gpgkey")
+        op.add_option("--priority", type="int")
+        op.add_option("--ssl_verify", default="yes")
         return op
index 48562e9..9db2eaf 100644 (file)
@@ -561,7 +561,9 @@ def get_repostrs_from_ks(ks):
         if 'name' not in repo:
             repo['name'] = _get_temp_reponame(repodata.baseurl)
         if hasattr(repodata, 'baseurl') and getattr(repodata, 'baseurl'):
-            repo['baseurl'] = SafeURL(getattr(repodata, 'baseurl'))
+            repo['baseurl'] = SafeURL(getattr(repodata, 'baseurl'),
+                                      getattr(repodata, 'user', None),
+                                      getattr(repodata, 'passwd', None))
 
         kickstart_repos.append(repo)
 
index dc0868d..d962298 100644 (file)
@@ -4,22 +4,31 @@ import os
 from zypp import Url
 
 
+def remove_userpass(urlstring):
+    "Remove user and password from url string"
+    url = Url(urlstring)
+    url.setUsername('')
+    url.setPassword('')
+    return str(url)
+
+
 class SafeURL(str):
-    "URL wrapper which won't show password out"
-    def __new__(cls, urlstring):
+    """URL wrapper which won't show password out"""
+    def __new__(cls, urlstring, user=None, password=None):
         # sometimes we get unicode here, but zypp don't accept unicode string
         urlstring = str(urlstring)
-        safe = Url(urlstring)
-        safe.setUsername('')
-        safe.setPassword('')
-
-        safeurlstring = str(safe)
-        if safeurlstring.startswith("file:/"):
+        safe = remove_userpass(urlstring)
+        if safe.startswith("file:/"):
             # zypp.Url converts file:///path/to/file to file:/path/to/file
-            safeurlstring = "file://" + safeurlstring[len("file:"):]
+            safe = "file://" + safe[len("file:"):]
+        instance = super(SafeURL, cls).__new__(cls, safe)
 
-        instance = super(SafeURL, cls).__new__(cls, safeurlstring)
-        instance.url = Url(urlstring)
+        url = Url(urlstring)
+        if user:
+            url.setUsername(user)
+            if password:
+                url.setPassword(password)
+        instance.url = url
         return instance
 
     def join(self, *path):