Hello community, here is the log from the commit of package vm-install checked in at Sat Sep 1 13:15:34 CEST 2007. -------- --- vm-install/vm-install.changes 2007-08-30 01:07:52.000000000 +0200 +++ /mounts/work_src_done/STABLE/vm-install/vm-install.changes 2007-09-01 01:22:08.232630000 +0200 @@ -1,0 +2,15 @@ +Fri Aug 31 11:23:33 MDT 2007 - ccoffing@novell.com + +- #305747: Fix bootstrapping of paravirtual SLES 9 SP4 +- #306764: Better error message if NIC model is mistyped +- #296928: MAC was not set when creating VM from existing disk + +------------------------------------------------------------------- +Thu Aug 30 12:31:01 MDT 2007 - ccoffing@novell.com + +- #306469: Fix error paths to ensure disks are always unmounted +- #306383: Set TERM=linux, which works well for both xencons and pvfb +- Do not attempt to connect to VNC port if graphics=none +- Write out stdvga setting based on cirrus vs vesa + +------------------------------------------------------------------- @@ -13,0 +29,5 @@ +Fri Aug 17 09:13:51 MDT 2007 - ccoffing@novell.com + +- Update translations + +------------------------------------------------------------------- ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ vm-install.spec ++++++ --- /var/tmp/diff_new_pack.M24849/_old 2007-09-01 13:15:23.000000000 +0200 +++ /var/tmp/diff_new_pack.M24849/_new 2007-09-01 13:15:23.000000000 +0200 @@ -19,7 +19,7 @@ Group: System/Emulators/PC Autoreqprov: yes Version: 0.2.1 -Release: 33 +Release: 34 Summary: Tool to Define a Virtual Machine and Install Its Operating System Source0: %{name}-0.2.1.tar.bz2 BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -80,12 +80,23 @@ %{_datadir}/applications/YaST2/vm-install.desktop %changelog +* Fri Aug 31 2007 - ccoffing@novell.com +- #305747: Fix bootstrapping of paravirtual SLES 9 SP4 +- #306764: Better error message if NIC model is mistyped +- #296928: MAC was not set when creating VM from existing disk +* Thu Aug 30 2007 - ccoffing@novell.com +- #306469: Fix error paths to ensure disks are always unmounted +- #306383: Set TERM=linux, which works well for both xencons and pvfb +- Do not attempt to connect to VNC port if graphics=none +- Write out stdvga setting based on cirrus vs vesa * Wed Aug 29 2007 - ccoffing@novell.com - Update translations * Tue Aug 21 2007 - ccoffing@novell.com - #278190: adjust max memory to always be >= initial memory - #296758: call update() before getting spinbox value - Fix some errors in libvirt-style XML file written out +* Fri Aug 17 2007 - ccoffing@novell.com +- Update translations * Thu Aug 16 2007 - ccoffing@novell.com - #300757: Option for Windows XP/2003 (x64) was not displayed - #296083: If vncviewer is not found, prompt user but don't fail ++++++ vm-install-0.2.1.tar.bz2 ++++++ diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/ChangeLog new/vm-install-0.2.1/ChangeLog --- old/vm-install-0.2.1/ChangeLog 2007-08-30 00:49:41.000000000 +0200 +++ new/vm-install-0.2.1/ChangeLog 2007-08-31 23:11:20.000000000 +0200 @@ -1,5 +1,12 @@ 0.2.1-pre --------- +#305747: Fix bootstrapping of paravirtual SLES 9 SP4 +#296928: MAC was not set when creating VM from existing disk +#306764: Better error message if NIC model is mistyped +#306469: Fix error paths to ensure disks are always unmounted +#306383: Set TERM=linux, which works well for both xencons and pvfb +Do not attempt to connect to VNC if graphics=none +Write out stdvga setting based on cirrus vs vesa Updated translations Fix command-line backwards compatibility: default to sparse disks Support escaping on vm-install's command line, to support iSCSI LUNs diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/man/vm-install.8 new/vm-install-0.2.1/man/vm-install.8 --- old/vm-install-0.2.1/man/vm-install.8 2007-08-21 19:26:52.000000000 +0200 +++ new/vm-install-0.2.1/man/vm-install.8 2007-08-30 20:14:14.000000000 +0200 @@ -79,9 +79,8 @@ \fBvesa\fR (Standard VGA with VESA extensions; only for fully virtualized). .TP .B --graphics-viewer -Defines how the graphics are viewed. May be one of \fBsdl\fR, \fBtext\fR, -or \fBvnc\fR. Defaults to vnc if the VM has graphics support or text if -the VM does not have graphics support. +Defines how the graphics (if any) are viewed. May be \fBsdl\fR or \fBvnc\fR. +Defaults to vnc. .TP .B -m\fR \fIN\fR, \fB--memory\fR \fIN\fR Initial megabytes of RAM to allocate to the VM. diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/job.py new/vm-install-0.2.1/src/vminstall/job.py --- old/vm-install-0.2.1/src/vminstall/job.py 2007-08-16 23:45:44.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/job.py 2007-08-31 21:41:06.000000000 +0200 @@ -152,7 +152,10 @@ if self._options.noautoconsole: log.info('Not starting a console due to --no-autoconsole') domid = console.get_domid_from_uuid(self._options.uuid) - self._vncport = console.get_vnc_port_from_domid(domid, timeout=10.0) + if self._options.graphics == 'none': + self._vncport = None + else: + self._vncport = console.get_vnc_port_from_domid(domid, timeout=10.0) log.debug('VNC port is %s' % self._vncport) if self._vncport is not None: self._update_job_file() @@ -165,18 +168,21 @@ log.info('Starting a console, and will wait for it to finish') child = None try_text = False - if self._options.graphics_viewer == 'sdl': - # xm automatically created a viewer, so just wait. - log.debug('Viewer is sdl') - elif self._options.graphics_viewer == 'vnc': - log.debug('Viewer is vnc') - try: - child = console.vnc_console(self.guest, detach=detached) - except NotImplementedError: - try_text = True - except RuntimeError, e: - self._ErrorCB(self, str(e)) - if try_text or self._options.graphics_viewer == 'none': + if self._options.graphics == 'none': + try_text = True + else: + if self._options.graphics_viewer == 'sdl': + # xm automatically created a viewer, so just wait. + log.debug('Viewer is sdl') + elif self._options.graphics_viewer == 'vnc': + log.debug('Viewer is vnc') + try: + child = console.vnc_console(self.guest, detach=detached) + except NotImplementedError: + try_text = True + except RuntimeError, e: + self._ErrorCB(self, str(e)) + if try_text: log.debug('Viewer is text') try: child = console.text_console(self.guest, detach=detached) @@ -203,10 +209,17 @@ self._GetSettingsCB = GetSettingsCB self._ConsoleCB = ConsoleCB self._ErrorCB = ErrorCB - self._ProgressCB = ProgressCB self._cancel = False - progress = util.filtered_progress(lambda f:self._ProgressCB(self, f)) + def _ProgressCB(self, f): + try: + ProgressCB(self, f) + except: + # Do not trust user's progress function to not raise. I can + # do nothing about such an exception, and in fact lower code + # relies on a no-throw guarantee. + pass + progress = util.filtered_progress(lambda f:_ProgressCB(self, f)) try: try: @@ -288,6 +301,10 @@ self._guest = FullVirtGuest(self._options) else: self._guest = ParaVirtGuest(self._options) + + for nic in self._options.nics: + nic.setup() + progress(1.0) def _state_prep_install(self, progress): diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/mount.py new/vm-install-0.2.1/src/vminstall/mount.py --- old/vm-install-0.2.1/src/vminstall/mount.py 2007-06-07 20:31:53.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/mount.py 2007-08-30 22:00:08.000000000 +0200 @@ -47,15 +47,15 @@ args = ['/bin/umount', self.mountpoint] log.debug("Unmounting a disk: %s" % str(args)) run(args) - try: - os.rmdir(self.mountpoint) - except: - log.debug("Failed to rmdir mountpoint %s" % (self.mountpoint,)) + os.rmdir(self.mountpoint) self.mountpoint = None def __del__(self): if self.mountpoint: - self.unmount() + try: + self.unmount() + except: + pass class TemporaryNFSMount(TemporaryMount): def __init__(self, server, path): diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/nics.py new/vm-install-0.2.1/src/vminstall/nics.py --- old/vm-install-0.2.1/src/vminstall/nics.py 2007-05-29 21:59:26.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/nics.py 2007-08-31 21:29:43.000000000 +0200 @@ -101,7 +101,8 @@ return 'para' return self._model def set_model(self, model): - assert(model is None or model in XenNic.models.keys()) + if model is not None and model not in XenNic.models.keys(): + raise ParamError(err=ParamError.E_INVALID, details='model') self._model = model model = property(get_model, set_model) @@ -125,3 +126,11 @@ else: s += self.mac return s + + def __repr__(self): + r = '' + if self.number is not None: + r += '%d:' % self.number + mac = self.mac or '' + r += '%s,%s,%s,%d' % (self.mac or '', self.bridge or '', self.model or '', self.full_virt) + return r diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/options.py new/vm-install-0.2.1/src/vminstall/options.py --- old/vm-install-0.2.1/src/vminstall/options.py 2007-08-21 21:27:28.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/options.py 2007-09-01 00:21:45.000000000 +0200 @@ -32,8 +32,8 @@ 'disks', # Disk class 'extra_args', # User's install or boot args 'full_virt', - 'graphics', - 'graphics_viewer', # 'sdl', 'vnc' + 'graphics', # 'cirrus', 'none', 'para', 'vesa' + 'graphics_viewer', # 'text', 'sdl', 'vnc' 'initrd', '_install_args', # install-time args calculated by OS 'install', @@ -442,7 +442,7 @@ defaults._runtime_args = vmdefaults.actions().getRuntimeArgs(defaults) if options._runtime_args: defaults._runtime_args += ' %s' % options._runtime_args - + # Now give the OS a chance to voice its opinion: vmdefaults.actions().preprocessOptions(defaults) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/ParaVirtGuest.py new/vm-install-0.2.1/src/vminstall/ParaVirtGuest.py --- old/vm-install-0.2.1/src/vminstall/ParaVirtGuest.py 2007-07-07 00:30:31.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/ParaVirtGuest.py 2007-08-30 21:44:04.000000000 +0200 @@ -136,8 +136,10 @@ mountpoint = mounted_disk.mount() except Exception, e: raise InstSrcError(InstSrcError.E_BAD, details=e.args[0]) - (kfn, ifn) = actions.getInstallImagesFromPath(mountpoint, progress) - mounted_disk.unmount() + try: + (kfn, ifn) = actions.getInstallImagesFromPath(mountpoint, progress) + finally: + mounted_disk.unmount() else: (_, kfn, ifn) = self._get_paravirt_images(vdev, partitions, copy=True, progress=progress) finally: diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/VMLinux.py new/vm-install-0.2.1/src/vminstall/VMLinux.py --- old/vm-install-0.2.1/src/vminstall/VMLinux.py 2007-05-24 17:10:23.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/VMLinux.py 2007-09-01 00:33:10.000000000 +0200 @@ -54,11 +54,8 @@ return self.getRuntimeArgs(options) def getRuntimeArgs(self, options): - args = '' - if options.full_virt: - return args - # Only want to set TERM=xterm if PVFB is not supported - #args = 'TERM=xterm' - if options.graphics == 'none': - args += ' xencons=tty' - return args + args = [] + if not options.full_virt: + if options.graphics == 'none': + args.append('xencons=tty') + return ' '.join(args) diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/VMNetWare.py new/vm-install-0.2.1/src/vminstall/VMNetWare.py --- old/vm-install-0.2.1/src/vminstall/VMNetWare.py 2007-08-28 00:14:09.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/VMNetWare.py 2007-08-30 21:53:37.000000000 +0200 @@ -32,7 +32,11 @@ Retrieves a Xen-enabled NetWare kernel from the base path, and copies it to a temporary file. Returns the (kernel, None) tuple of filenames.""" - kfn = util.copy_to_temp(open(self._kernel(path), 'r'), prefix='netware.', progress=progress) + kfd = open(self._kernel(path), 'r') + try: + kfn = util.copy_to_temp(kfd, prefix='netware.', progress=progress) + finally: + kfd.close() return (kfn, None) def getRuntimeImagesFromPath(self, root): diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/VMRedHat.py new/vm-install-0.2.1/src/vminstall/VMRedHat.py --- old/vm-install-0.2.1/src/vminstall/VMRedHat.py 2007-07-20 19:41:30.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/VMRedHat.py 2007-08-30 21:31:01.000000000 +0200 @@ -34,31 +34,49 @@ """Retrieves a Xen-enabled RedHat kernel and initrd from the URL, and copies them to temporary files. Returns the (kernel, initrd) tuple of filenames.""" + kfd = ifd = None try: - if url.startswith('http://') or url.startswith('ftp://'): - kfd = grabber.urlopen(self._kernel(url)) - ifd = grabber.urlopen(self._initrd(url)) - elif url.startswith('nfs:'): - mnt = mount.TemporaryMount(url[4:]) - mountpoint = mnt.mount(mnt) - kfd = open(self._kernel(mountpoint), 'r') - ifd = open(self._initrd(mountpoint), 'r') - else: - raise InstSrcError(err=InstSrcError.E_UNSUPPORTED, details=url) - except IOError, e: - raise RuntimeError(msg.invalid_url + ': ' + str(e)) - kfn = util.copy_to_temp(kfd, prefix='vmlinuz.', progress=lambda f:progress(f*0.5)) - ifn = util.copy_to_temp(ifd, prefix='initrd.', progress=lambda f:progress(0.5+f*0.5)) + try: + if url.startswith('http://') or url.startswith('ftp://'): + kfd = grabber.urlopen(self._kernel(url)) + ifd = grabber.urlopen(self._initrd(url)) + elif url.startswith('nfs:'): + mnt = mount.TemporaryMount(url[4:]) + mountpoint = mnt.mount(mnt) + kfd = open(self._kernel(mountpoint), 'r') + ifd = open(self._initrd(mountpoint), 'r') + else: + raise InstSrcError(err=InstSrcError.E_UNSUPPORTED, details=url) + kfn = util.copy_to_temp(kfd, prefix='vmlinuz.', progress=lambda f:progress(f*0.5)) + try: + ifn = util.copy_to_temp(ifd, prefix='initrd.', progress=lambda f:progress(0.5+f*0.5)) + except: + os.unlink(kfn) + raise + except IOError, e: + raise RuntimeError(msg.invalid_url + ': ' + str(e)) + finally: + if kfd: kfd.close() + if ifd: ifd.close() return (kfn, ifn) def getInstallImagesFromPath(self, path, progress=lambda f:None): """Retrieves a Xen-enabled RedHat kernel and initrd from the base path, and copies them to temporary files. Returns the (kernel, initrd) tuple of filenames.""" - kfd = open(self._kernel(path), 'r') - ifd = open(self._initrd(path), 'r') - kfn = util.copy_to_temp(kfd, prefix='vmlinuz.', progress=lambda f:progress(f*0.5)) - ifn = util.copy_to_temp(ifd, prefix='initrd.', progress=lambda f:progress(0.5+f*0.5)) + kfd = ifd = None + try: + kfd = open(self._kernel(path), 'r') + ifd = open(self._initrd(path), 'r') + kfn = util.copy_to_temp(kfd, prefix='vmlinuz.', progress=lambda f:progress(f*0.5)) + try: + ifn = util.copy_to_temp(ifd, prefix='initrd.', progress=lambda f:progress(0.5+f*0.5)) + except: + os.unlink(kfn) + raise + finally: + if kfd: kfd.close() + if ifd: ifd.close() return (kfn, ifn) def getInstallArgs(self, options): diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/VMSUSE.py new/vm-install-0.2.1/src/vminstall/VMSUSE.py --- old/vm-install-0.2.1/src/vminstall/VMSUSE.py 2007-08-28 00:14:25.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/VMSUSE.py 2007-09-01 00:30:46.000000000 +0200 @@ -132,36 +132,52 @@ progress(1.0) return kfn + def _getMediaRoots(self, root, _open=open): + """Network install sources may be composed of multiple CDs. YaST lists + their location and ordering in ./yast/instorder. Potentially any of + these CDs may contain a PV kernel. + """ + roots = ['.'] + try: + fd = _open('%s/yast/instorder' % root) + try: + roots = fd.readlines() + roots = map(lambda s: s.strip(), roots) + finally: + fd.close() + finally: + log.debug("Media roots: %s" % str(roots)) + return roots + def getInstallImagesFromPath(self, root, progress=lambda f:None): """Retrieves a Xen-enabled SUSE kernel and initrd from the base path, and copies them to temporary files. Returns the (kernel, initrd) tuple of filenames.""" searched = [] arches = caps.compatible_arches() - for a in arches: - k = '/boot/%s/vmlinuz-%s' % (a[0], a[1]) - searched.append(k) - kfn = '%s%s' % (root, k) - ifn = '%s/boot/%s/initrd-%s' % (root, a[0], a[1]) - if os.path.exists(kfn) and os.path.exists(ifn): - log.debug("Unpacked kernel/initrd found: %s %s" % (kfn, ifn)) - kfd = open(kfn, 'r') - try: - ifd = open(ifn, 'r') - except: - kfd.close() - raise - try: - self.kfn = util.copy_to_temp(kfd, prefix='kernel.', progress=lambda f:progress(f*0.5)) + for mediaroot in self._getMediaRoots(root): + for a in arches: + k = '/boot/%s/vmlinuz-%s' % (a[0], a[1]) + searched.append(k) + kfn = '%s/%s%s' % (root, mediaroot, k) + ifn = '%s/%s/boot/%s/initrd-%s' % (root, mediaroot, a[0], a[1]) + log.debug("Checking for %s..." % kfn) + if os.path.exists(kfn) and os.path.exists(ifn): + log.debug("Unpacked kernel/initrd found: %s %s" % (kfn, ifn)) + kfd = ifd = None try: - self.ifn = util.copy_to_temp(ifd, prefix='install-initrd.', progress=lambda f:progress(0.5+f*0.5)) - except: - os.unlink(self.kfn) - raise - finally: - kfd.close() - ifd.close() - return (self.kfn, self.ifn) + kfd = open(kfn, 'r') + ifd = open(ifn, 'r') + self.kfn = util.copy_to_temp(kfd, prefix='kernel.', progress=lambda f:progress(f*0.5)) + try: + self.ifn = util.copy_to_temp(ifd, prefix='install-initrd.', progress=lambda f:progress(0.5+f*0.5)) + except: + os.unlink(self.kfn) + raise + finally: + if kfd: kfd.close() + if ifd: ifd.close() + return (self.kfn, self.ifn) log.debug("No unpacked kernel/initrd found") index_path = root + '/INDEX.gz' searched.append('/INDEX.gz') @@ -216,22 +232,24 @@ progress(0.1) arches = caps.compatible_arches() - for a in arches: - try: - kfn = '/boot/%s/vmlinuz-%s' % (a[0], a[1]) - ifn = '/boot/%s/initrd-%s' % (a[0], a[1]) - kfd = urlopen(base + kfn) - self.kfn = util.copy_to_temp(kfd, prefix='kernel.', progress=lambda f:progress(0.1+f*0.45)) - kfd.close() - die_zero(self.kfn) - ifd = urlopen(base + ifn) - self.ifn = util.copy_to_temp(ifd, prefix='install-initrd.', progress=lambda f:progress(0.55+f*0.45)) - ifd.close() - die_zero(self.kfn) - log.debug("Unpacked kernel/initrd found: %s %s" % (kfn, ifn)) - return (self.kfn, self.ifn) - except: - continue + for mediaroot in self._getMediaRoots(base, urlopen): + for a in arches: + try: + kfn = '/%s/boot/%s/vmlinuz-%s' % (mediaroot, a[0], a[1]) + ifn = '/%s/boot/%s/initrd-%s' % (mediaroot, a[0], a[1]) + log.debug("Checking for %s..." % (base+kfn,)) + kfd = urlopen(base + kfn) + self.kfn = util.copy_to_temp(kfd, prefix='kernel.', progress=lambda f:progress(0.1+f*0.45)) + kfd.close() + die_zero(self.kfn) + ifd = urlopen(base + ifn) + self.ifn = util.copy_to_temp(ifd, prefix='install-initrd.', progress=lambda f:progress(0.55+f*0.45)) + ifd.close() + die_zero(self.kfn) + log.debug("Unpacked kernel/initrd found: %s %s" % (kfn, ifn)) + return (self.kfn, self.ifn) + except: + continue log.debug("No unpacked kernel/initrd found") try: url = base + '/INDEX.gz' @@ -320,7 +338,7 @@ options.os_settings = arg[9:] else: extra_args += arg + ' ' - options.extra_args = extra_args + options.extra_args = extra_args.strip() def setupOsSettings(self, guest, progress=lambda f:None): """Creates a temporary disk image, in which to pass the autoyast diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/src/vminstall/XenGuest.py new/vm-install-0.2.1/src/vminstall/XenGuest.py --- old/vm-install-0.2.1/src/vminstall/XenGuest.py 2007-07-20 18:29:06.000000000 +0200 +++ new/vm-install-0.2.1/src/vminstall/XenGuest.py 2007-08-31 21:41:33.000000000 +0200 @@ -204,6 +204,10 @@ options = map(lambda s: "".join(s.split("'")), options) lines.append('vfb=[\'type=%s,%s\']' % (viewer, ','.join(options))) else: + stdvga = 0 + if self.options.graphics == 'vesa': + stdvga=1 + lines.append('stdvga=%d' % stdvga) lines.append('%s=1' % viewer) lines += options @@ -306,9 +310,6 @@ for i in range(len(disks)): disks[i].setup(lambda f: progress(cum_times[i]/cum_times[-1] + f*cum_times[i+1]/cum_times[-1])) - for nic in self.options.nics: - nic.setup() - def FailedInstall(self): log.info("Installation failed, so destroying VM") self.Stop() diff -urN --exclude=CVS --exclude=.cvsignore --exclude=.svn --exclude=.svnignore old/vm-install-0.2.1/TODO new/vm-install-0.2.1/TODO --- old/vm-install-0.2.1/TODO 2007-08-25 01:04:19.000000000 +0200 +++ new/vm-install-0.2.1/TODO 2007-08-30 19:05:33.000000000 +0200 @@ -1,3 +1,6 @@ + - If [PV &&] nographics, do not try to attach vnc + - yast/instorder for sles 9 + - tap:aio should be non-sparse - auto-start on boot option - keymap ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@Hilbert.suse.de