File virtman-show-suse-install-repos.patch of Package virt-manager.10841

Enhancement that gets installation repos from zypper.
These locations are then presented as potential installation
sources when creating a VM.
Index: virt-manager-1.5.1/virtManager/create.py
===================================================================
--- virt-manager-1.5.1.orig/virtManager/create.py
+++ virt-manager-1.5.1/virtManager/create.py
@@ -424,7 +424,13 @@ class vmmCreate(vmmGObjectUI):
         self.widget("install-url-entry").set_text("")
         self.widget("install-url-options").set_expanded(False)
         urlmodel = self.widget("install-url-combo").get_model()
-        _populate_media_model(urlmodel, self.config.get_media_urls())
+        urllist = self.config.get_media_urls()
+        (index, inst_repos) = util.getInstallRepos()
+        for u in urllist:
+            if u in inst_repos:
+                inst_repos.remove(u)
+        media_urllist = urllist + inst_repos
+        _populate_media_model(urlmodel, media_urllist)
         self._set_distro_labels("-", "-")
 
         # Install import
Index: virt-manager-1.5.1/virtinst/util.py
===================================================================
--- virt-manager-1.5.1.orig/virtinst/util.py
+++ virt-manager-1.5.1/virtinst/util.py
@@ -23,9 +23,12 @@ import os
 import random
 import re
 import sys
+import subprocess
+from subprocess import Popen, PIPE
 
 import libvirt
 
+_host_repo_url = None
 
 def listify(l):
     if l is None:
@@ -312,3 +315,57 @@ def make_meter(quiet):
     if quiet:
         return progress.BaseMeter()
     return progress.TextMeter(fo=sys.stdout)
+
+def getHostInstallSource():
+    global _host_repo_url
+    if _host_repo_url is not None:
+        return _host_repo_url
+    if os.geteuid() != 0:
+        return None
+
+    (_,zypper_output) = lookupZypperRepos()
+    if len(zypper_output):
+        _host_repo_url = zypper_output[0]
+        return _host_repo_url
+    return None
+
+def lookupZypperRepos(dom0_inst_source=None):
+    try:
+        env = os.environ.copy()
+        env['LC_ALL'] = 'C'
+        cmd = ['/usr/bin/zypper', 'lr', '-u', '-P', '-E']
+        p = subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE, env=env)
+        stdout, stderr = p.communicate()
+        zypper_output = stdout.decode()
+        zypper_list = zypper_output.split("\n")
+        zypper_header = [x.strip(' ') for x in zypper_list[0].split("|")]
+        uri_index = zypper_header.index("URI")
+    except:
+        inst_source = []
+        if dom0_inst_source:
+            inst_source = [dom0_inst_source]
+        return (0, inst_source)
+
+    index_dom0 = -1
+    number_of_sources = 0
+    zypper_output = []
+    for repo in zypper_list:
+        repo = [x.strip(' ') for x in repo.split("|")]
+        if len(repo) >= uri_index:
+            str = repo[uri_index]
+            if str.startswith('ftp://') or str.startswith('http://') or str.startswith('nfs://') or str.startswith('smb://'):
+                zypper_output.append(str)
+                if dom0_inst_source is not None and str == dom0_inst_source:
+                    index_dom0 = number_of_sources
+                number_of_sources += 1
+
+    if index_dom0 == -1 and dom0_inst_source:
+        index_dom0 = 0
+        zypper_output.insert(0, dom0_inst_source)
+    return (index_dom0, zypper_output)
+
+def getInstallRepos():
+    if os.geteuid() != 0:
+        return (0, [])
+    return lookupZypperRepos(getHostInstallSource())
+
openSUSE Build Service is sponsored by