mirror of
https://github.com/clearlinux/WALinuxAgent.git
synced 2026-09-02 20:01:33 +00:00
* Add initial support for the OpenBSD operating system There are some differences between FreeBSD, OpenBSD, and Linux. Notes: - OpenBSD ships LibreSSL, but WALinuxAgent needs OpenSSL for CMS, so use the openssl port and the "eopenssl" binary instead. - Don't run the custom DHCP client but parse /var/db/dhclient.leases.hvn0. OpenBSD's lease file uses a modified syntax. - OpenBSD does not have /proc. WALinuxAgent should never assume that the /proc filesystem is available. - OpenBSD does not have sudo, but its replacement doas. The OpenBSD class implements support for modifying the doas.conf file. - Unlike FreeBSD, OpenBSD supports and mounts UDF DVDs just fine. - Create a swap partition instead of a swap file on the resource disk. - Many other minor changes for OpenBSD TODO: - The /proc checks needs to be replaced with pgrep/ps etc. checks for OpenBSD. For now it just checks if /proc is available or returns without error. Make sure to install waagent with --register-service as setuptools will not set the permissions of /etc/rc.d/waagent correctly (the file has to be executable to be used by OpenBSD's rc system). * Remove debug statement that was use to fix mount_dvd on OpenBSD. * I accidentally replaced the FreeBSD resource disk handler. The OpenBSD disk handler is an addition, not a replacement. Found by jonathangray * pylint pylint found one bug in setting the password; other changes are just for the style. * strip newline from generated password hash. Issue reported by Lili Deng. * Keep AutoUpdate enabled, it was disabled for initial porting. Pointed out by @hglkrijger * Use a wildcard and delete all DHCP lease files on *BSD. Requested by @hglkrijger
114 lines
4.8 KiB
Python
114 lines
4.8 KiB
Python
# Microsoft Azure Linux Agent
|
|
#
|
|
# Copyright 2014 Microsoft Corporation
|
|
# Copyright 2017 Reyk Floeter <reyk@openbsd.org>
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
# Requires Python 2.4+ and OpenSSL 1.0+
|
|
#
|
|
import azurelinuxagent.common.logger as logger
|
|
import azurelinuxagent.common.utils.fileutil as fileutil
|
|
import azurelinuxagent.common.utils.shellutil as shellutil
|
|
import azurelinuxagent.common.conf as conf
|
|
from azurelinuxagent.common.exception import ResourceDiskError
|
|
from azurelinuxagent.daemon.resourcedisk.default import ResourceDiskHandler
|
|
|
|
class OpenBSDResourceDiskHandler(ResourceDiskHandler):
|
|
def __init__(self):
|
|
super(OpenBSDResourceDiskHandler, self).__init__()
|
|
# Fase File System (FFS) is UFS
|
|
if self.fs == 'ufs' or self.fs == 'ufs2':
|
|
self.fs = 'ffs'
|
|
|
|
def create_swap_space(self, mount_point, size_mb):
|
|
pass
|
|
|
|
def enable_swap(self, mount_point):
|
|
size_mb = conf.get_resourcedisk_swap_size_mb()
|
|
if size_mb:
|
|
logger.info("Enable swap")
|
|
device = self.osutil.device_for_ide_port(1)
|
|
err, output = shellutil.run_get_output("swapctl -a /dev/"
|
|
"{0}b".format(device),
|
|
chk_err=False)
|
|
if err:
|
|
logger.error("Failed to enable swap, error {0}", output)
|
|
|
|
def mount_resource_disk(self, mount_point):
|
|
fs = self.fs
|
|
if fs != 'ffs':
|
|
raise ResourceDiskError("Unsupported filesystem type: {0}, only "
|
|
"ufs/ffs is supported.".format(fs))
|
|
|
|
# 1. Get device
|
|
device = self.osutil.device_for_ide_port(1)
|
|
|
|
if not device:
|
|
raise ResourceDiskError("Unable to detect resource disk device.")
|
|
logger.info('Resource disk device {0} found.', device)
|
|
|
|
# 2. Get partition
|
|
partition = "/dev/{0}a".format(device)
|
|
|
|
# 3. Mount partition
|
|
mount_list = shellutil.run_get_output("mount")[1]
|
|
existing = self.osutil.get_mount_point(mount_list, partition)
|
|
|
|
if existing:
|
|
logger.info("Resource disk {0} is already mounted", partition)
|
|
return existing
|
|
|
|
fileutil.mkdir(mount_point, mode=0o755)
|
|
mount_cmd = 'mount -t {0} {1} {2}'.format(self.fs,
|
|
partition, mount_point)
|
|
err = shellutil.run(mount_cmd, chk_err=False)
|
|
if err:
|
|
logger.info('Creating {0} filesystem on {1}'.format(fs, device))
|
|
|
|
fdisk_cmd = "/sbin/fdisk -yi {0}".format(device)
|
|
err, output = shellutil.run_get_output(fdisk_cmd, chk_err=False)
|
|
if err:
|
|
raise ResourceDiskError("Failed to create new MBR on {0}, "
|
|
"error: {1}".format(device, output))
|
|
|
|
size_mb = conf.get_resourcedisk_swap_size_mb()
|
|
if size_mb:
|
|
if size_mb > 512 * 1024:
|
|
size_mb = 512 * 1024
|
|
disklabel_cmd = ("echo -e '{0} 1G-* 50%\nswap 1-{1}M 50%' "
|
|
"| disklabel -w -A -T /dev/stdin "
|
|
"{2}").format(mount_point, size_mb, device)
|
|
ret, output = shellutil.run_get_output(
|
|
disklabel_cmd, chk_err=False)
|
|
if ret:
|
|
raise ResourceDiskError("Failed to create new disklabel "
|
|
"on {0}, error "
|
|
"{1}".format(device, output))
|
|
|
|
err, output = shellutil.run_get_output("newfs -O2 {0}a"
|
|
"".format(device))
|
|
if err:
|
|
raise ResourceDiskError("Failed to create new filesystem on "
|
|
"partition {0}, error "
|
|
"{1}".format(partition, output))
|
|
|
|
err, output = shellutil.run_get_output(mount_cmd, chk_err=False)
|
|
if err:
|
|
raise ResourceDiskError("Failed to mount partition {0}, "
|
|
"error {1}".format(partition, output))
|
|
|
|
logger.info("Resource disk partition {0} is mounted at {1} with fstype "
|
|
"{2}", partition, mount_point, fs)
|
|
return mount_point
|