Blob Blame History Raw
From e236dc20fbda54d040960615a93565be9c4bdae7 Mon Sep 17 00:00:00 2001
From: Vitaly Kuznetsov <vkuznets@redhat.com>
Date: Fri, 22 Apr 2022 16:16:19 +0200
Subject: [PATCH] Rudimentary Fedora OS implementation
Content-Type: text/plain

Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
---
 azurelinuxagent/common/osutil/factory.py |  4 ++
 azurelinuxagent/common/osutil/fedora.py  | 75 ++++++++++++++++++++++++
 setup.py                                 |  6 ++
 3 files changed, 85 insertions(+)
 create mode 100644 azurelinuxagent/common/osutil/fedora.py

diff --git a/azurelinuxagent/common/osutil/factory.py b/azurelinuxagent/common/osutil/factory.py
index b8f4291b3ea4..625978569880 100644
--- a/azurelinuxagent/common/osutil/factory.py
+++ b/azurelinuxagent/common/osutil/factory.py
@@ -39,6 +39,7 @@ from .suse import SUSEOSUtil, SUSE11OSUtil
 from .photonos import PhotonOSUtil
 from .ubuntu import UbuntuOSUtil, Ubuntu12OSUtil, Ubuntu14OSUtil, \
     UbuntuSnappyOSUtil, Ubuntu16OSUtil, Ubuntu18OSUtil
+from .fedora import FedoraOSUtil
 
 
 def get_osutil(distro_name=DISTRO_NAME,
@@ -138,5 +139,8 @@ def _get_osutil(distro_name, distro_code_name, distro_version, distro_full_name)
     if distro_name == "openwrt":
         return OpenWRTOSUtil()
 
+    if distro_name == "fedora":
+        return FedoraOSUtil()
+
     logger.warn("Unable to load distro implementation for {0}. Using default distro implementation instead.", distro_name)
     return DefaultOSUtil()
diff --git a/azurelinuxagent/common/osutil/fedora.py b/azurelinuxagent/common/osutil/fedora.py
new file mode 100644
index 000000000000..480f139a87ed
--- /dev/null
+++ b/azurelinuxagent/common/osutil/fedora.py
@@ -0,0 +1,75 @@
+#
+# Copyright 2022 Red Hat Inc.
+#
+# 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.6+ and Openssl 1.0+
+#
+
+import azurelinuxagent.common.utils.shellutil as shellutil
+from azurelinuxagent.common.osutil.default import DefaultOSUtil
+
+
+class FedoraOSUtil(DefaultOSUtil):
+
+    def __init__(self):
+        super(FedoraOSUtil, self).__init__()
+        self.agent_conf_file_path = '/etc/waagent.conf'
+
+    @staticmethod
+    def get_systemd_unit_file_install_path():
+        return '/usr/lib/systemd/system'
+
+    @staticmethod
+    def get_agent_bin_path():
+        return '/usr/sbin'
+
+    def is_dhcp_enabled(self):
+        return True
+
+    def start_network(self):
+        pass
+
+    def restart_if(self, ifname=None, retries=None, wait=None):
+        retry_limit = retries+1
+        for attempt in range(1, retry_limit):
+            return_code = shellutil.run("ip link set {0} down && ip link set {0} up".format(ifname))
+            if return_code == 0:
+                return
+            logger.warn("failed to restart {0}: return code {1}".format(ifname, return_code))
+            if attempt < retry_limit:
+                logger.info("retrying in {0} seconds".format(wait))
+                time.sleep(wait)
+            else:
+                logger.warn("exceeded restart retries")
+
+    def restart_ssh_service(self):
+        shellutil.run('systemctl restart sshd')
+
+    def stop_dhcp_service(self):
+        pass
+
+    def start_dhcp_service(self):
+        pass
+
+    def start_agent_service(self):
+        return shellutil.run('systemctl start waagent', chk_err=False)
+
+    def stop_agent_service(self):
+        return shellutil.run('systemctl stop waagent', chk_err=False)
+
+    def get_dhcp_pid(self):
+        return self._get_dhcp_pid(["pidof", "dhclient"])
+
+    def conf_sshd(self, disable_password):
+        pass
diff --git a/setup.py b/setup.py
index 12c9e1d61979..b0acead305b5 100755
--- a/setup.py
+++ b/setup.py
@@ -238,6 +238,12 @@ def get_data_files(name, version, fullname):  # pylint: disable=R0912
         set_conf_files(data_files, src=["config/photonos/waagent.conf"])
         set_systemd_files(data_files, dest=systemd_dir_path,
                           src=["init/photonos/waagent.service"])
+    elif name == 'fedora':
+        set_bin_files(data_files, dest=agent_bin_path)
+        set_conf_files(data_files)
+        set_logrotate_files(data_files)
+        set_udev_files(data_files)
+        set_systemd_files(data_files, dest=systemd_dir_path)
     else:
         # Use default setting
         set_bin_files(data_files, dest=agent_bin_path)
-- 
2.35.1