From 94838def772349387e16cc642b3642020e22deda Mon Sep 17 00:00:00 2001 From: Gonéri Le Bouder Date: Thu, 12 Mar 2020 14:37:08 -0400 Subject: Add Netbsd support (#62) Add support for the NetBSD Operating System. Features in this branch: * Add BSD distro parent class from which NetBSD and FreeBSD can specialize * Add *bsd util functions to cloudinit.net and cloudinit.net.bsd_utils * subclass cloudinit.distro.freebsd.Distro from bsd.Distro * Add new cloudinit.distro.netbsd and cloudinit.net.renderer for netbsd * Add lru_cached util.is_NetBSD functions * Add NetBSD detection for ConfigDrive and NoCloud datasources This branch has been tested with: - NoCloud and OpenStack (with and without config-drive) - NetBSD 8.1. and 9.0 - FreeBSD 11.2 and 12.1 - Python 3.7 only, because of the dependency oncrypt.METHOD_BLOWFISH. This version is available in NetBSD 7, 8 and 9 anyway --- cloudinit/sources/DataSourceNoCloud.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'cloudinit/sources/DataSourceNoCloud.py') diff --git a/cloudinit/sources/DataSourceNoCloud.py b/cloudinit/sources/DataSourceNoCloud.py index ee748b41..2a44128d 100644 --- a/cloudinit/sources/DataSourceNoCloud.py +++ b/cloudinit/sources/DataSourceNoCloud.py @@ -40,6 +40,14 @@ class DataSourceNoCloud(sources.DataSource): devlist = [ p for p in ['/dev/msdosfs/' + label, '/dev/iso9660/' + label] if os.path.exists(p)] + elif util.is_NetBSD(): + out, _err = util.subp(['sysctl', '-n', 'hw.disknames'], rcs=[0]) + devlist = [] + for dev in out.split(): + mscdlabel_out, _ = util.subp(['mscdlabel', dev], rcs=[0, 1]) + if ('label "%s"' % label) in mscdlabel_out: + devlist.append('/dev/' + dev) + devlist.append('/dev/' + dev + 'a') # NetBSD 7 else: # Query optical drive to get it in blkid cache for 2.6 kernels util.find_devs_with(path="/dev/sr0") -- cgit v1.2.3 From e4499963d663b52ca4b66423c0445909d710cfbd Mon Sep 17 00:00:00 2001 From: Gonéri Le Bouder Date: Fri, 24 Apr 2020 12:06:59 -0400 Subject: nocloud: drop work around for Linux 2.6 (#324) These two lines were a requirement for RHEL6, and they have been added 7 years ago: - https://github.com/canonical/cloud-init/commit/984c72e522c585c6d3f6b3d3aec39fb21dd84028 - https://github.com/canonical/cloud-init/commit/48a3b4ca0ba55699825d6eabe75d843286c23545 RHEL6 comes with Python 2.6, since Python3 is now a strong requirement, I think it's safe to remove. --- cloudinit/sources/DataSourceNoCloud.py | 4 ---- 1 file changed, 4 deletions(-) (limited to 'cloudinit/sources/DataSourceNoCloud.py') diff --git a/cloudinit/sources/DataSourceNoCloud.py b/cloudinit/sources/DataSourceNoCloud.py index 2a44128d..71d5fc2e 100644 --- a/cloudinit/sources/DataSourceNoCloud.py +++ b/cloudinit/sources/DataSourceNoCloud.py @@ -49,10 +49,6 @@ class DataSourceNoCloud(sources.DataSource): devlist.append('/dev/' + dev) devlist.append('/dev/' + dev + 'a') # NetBSD 7 else: - # Query optical drive to get it in blkid cache for 2.6 kernels - util.find_devs_with(path="/dev/sr0") - util.find_devs_with(path="/dev/sr1") - fslist = util.find_devs_with("TYPE=vfat") fslist.extend(util.find_devs_with("TYPE=iso9660")) -- cgit v1.2.3 From 72f6eb0339f7fcf7b8b02be2e86e5f7477cf731c Mon Sep 17 00:00:00 2001 From: Gonéri Le Bouder Date: Fri, 24 Apr 2020 15:42:36 -0400 Subject: BSD: find_devs_with_ refactoring (#298) Refactoring of the `find_devs_with_*bsd()` methods: - centralize everything in `util.py` - add test coverage --- cloudinit/sources/DataSourceNoCloud.py | 25 ++------- cloudinit/util.py | 52 +++++++++++++---- tests/unittests/test_datasource/test_nocloud.py | 17 +++++- tests/unittests/test_util.py | 74 +++++++++++++++++++++++++ 4 files changed, 136 insertions(+), 32 deletions(-) (limited to 'cloudinit/sources/DataSourceNoCloud.py') diff --git a/cloudinit/sources/DataSourceNoCloud.py b/cloudinit/sources/DataSourceNoCloud.py index 71d5fc2e..72d86c41 100644 --- a/cloudinit/sources/DataSourceNoCloud.py +++ b/cloudinit/sources/DataSourceNoCloud.py @@ -36,27 +36,14 @@ class DataSourceNoCloud(sources.DataSource): return "%s [seed=%s][dsmode=%s]" % (root, self.seed, self.dsmode) def _get_devices(self, label): - if util.is_FreeBSD(): - devlist = [ - p for p in ['/dev/msdosfs/' + label, '/dev/iso9660/' + label] - if os.path.exists(p)] - elif util.is_NetBSD(): - out, _err = util.subp(['sysctl', '-n', 'hw.disknames'], rcs=[0]) - devlist = [] - for dev in out.split(): - mscdlabel_out, _ = util.subp(['mscdlabel', dev], rcs=[0, 1]) - if ('label "%s"' % label) in mscdlabel_out: - devlist.append('/dev/' + dev) - devlist.append('/dev/' + dev + 'a') # NetBSD 7 - else: - fslist = util.find_devs_with("TYPE=vfat") - fslist.extend(util.find_devs_with("TYPE=iso9660")) + fslist = util.find_devs_with("TYPE=vfat") + fslist.extend(util.find_devs_with("TYPE=iso9660")) - label_list = util.find_devs_with("LABEL=%s" % label.upper()) - label_list.extend(util.find_devs_with("LABEL=%s" % label.lower())) + label_list = util.find_devs_with("LABEL=%s" % label.upper()) + label_list.extend(util.find_devs_with("LABEL=%s" % label.lower())) - devlist = list(set(fslist) & set(label_list)) - devlist.sort(reverse=True) + devlist = list(set(fslist) & set(label_list)) + devlist.sort(reverse=True) return devlist def _get_data(self): diff --git a/cloudinit/util.py b/cloudinit/util.py index 818904b1..4cae7ec8 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -1245,19 +1245,44 @@ def close_stdin(): os.dup2(fp.fileno(), sys.stdin.fileno()) +def find_devs_with_freebsd(criteria=None, oformat='device', + tag=None, no_cache=False, path=None): + if not criteria: + return glob.glob("/dev/msdosfs/*") + glob.glob("/dev/iso9660/*") + if criteria.startswith("LABEL="): + label = criteria.lstrip("LABEL=") + devlist = [ + p for p in ['/dev/msdosfs/' + label, '/dev/iso9660/' + label] + if os.path.exists(p)] + elif criteria == "TYPE=vfat": + devlist = glob.glob("/dev/msdosfs/*") + elif criteria == "TYPE=iso9660": + devlist = glob.glob("/dev/iso9660/*") + return devlist + + def find_devs_with_netbsd(criteria=None, oformat='device', tag=None, no_cache=False, path=None): - if not path: - path = "/dev/cd0" - cmd = ["mscdlabel", path] - out, _ = subp(cmd, capture=True, decode="replace", rcs=[0, 1]) - result = out.split() - if result and len(result) > 2: - if criteria == "TYPE=iso9660" and "ISO" in result: - return [path] - if criteria == "LABEL=CONFIG-2" and '"config-2"' in result: - return [path] - return [] + devlist = [] + label = None + _type = None + if criteria: + if criteria.startswith("LABEL="): + label = criteria.lstrip("LABEL=") + if criteria.startswith("TYPE="): + _type = criteria.lstrip("TYPE=") + out, _err = subp(['sysctl', '-n', 'hw.disknames'], rcs=[0]) + for dev in out.split(): + if label or _type: + mscdlabel_out, _ = subp(['mscdlabel', dev], rcs=[0, 1]) + if label and not ('label "%s"' % label) in mscdlabel_out: + continue + if _type == "iso9660" and "ISO filesystem" not in mscdlabel_out: + continue + if _type == "vfat" and "ISO filesystem" in mscdlabel_out: + continue + devlist.append('/dev/' + dev) + return devlist def find_devs_with_openbsd(criteria=None, oformat='device', @@ -1290,7 +1315,10 @@ def find_devs_with(criteria=None, oformat='device', LABEL=