diff --git a/0001-update-array.tostring-and-json.loads-without-encodin.patch b/0001-update-array.tostring-and-json.loads-without-encodin.patch new file mode 100644 index 0000000..d88c41c --- /dev/null +++ b/0001-update-array.tostring-and-json.loads-without-encodin.patch @@ -0,0 +1,72 @@ +From cc9b7996e542640bb19365822344298a04b18e44 Mon Sep 17 00:00:00 2001 +From: Paula Gombar +Date: Wed, 18 Nov 2020 12:24:33 -0800 +Subject: [PATCH 1/3] update array.tostring() and json.loads without encoding + for py3.9 + +--- + azurelinuxagent/common/osutil/bigip.py | 7 ++++++- + azurelinuxagent/common/osutil/default.py | 6 +++++- + tests/protocol/test_imds.py | 4 ++-- + 3 files changed, 13 insertions(+), 4 deletions(-) + +diff --git a/azurelinuxagent/common/osutil/bigip.py b/azurelinuxagent/common/osutil/bigip.py +index 61d3c695f911..ceadf8ca2066 100644 +--- a/azurelinuxagent/common/osutil/bigip.py ++++ b/azurelinuxagent/common/osutil/bigip.py +@@ -280,7 +280,12 @@ class BigIpOSUtil(DefaultOSUtil): + if retsize == (expected * struct_size): + logger.warn(('SIOCGIFCONF returned more than {0} up ' + 'network interfaces.'), expected) +- sock = buff.tostring() ++ try: ++ # Python 3.9 removed the tostring() method on arrays, tobytes() is the new alias ++ sock = buff.tostring() ++ except AttributeError: ++ sock = buff.tobytes() ++ + for i in range(0, struct_size * expected, struct_size): + iface = self._format_single_interface_name(sock, i) + +diff --git a/azurelinuxagent/common/osutil/default.py b/azurelinuxagent/common/osutil/default.py +index 521776818e64..6179061756e3 100644 +--- a/azurelinuxagent/common/osutil/default.py ++++ b/azurelinuxagent/common/osutil/default.py +@@ -758,7 +758,11 @@ class DefaultOSUtil(object): + logger.warn(('SIOCGIFCONF returned more than {0} up ' + 'network interfaces.'), expected) + +- ifconf_buff = buff.tostring() ++ try: ++ # Python 3.9 removed the tostring() method on arrays, tobytes() is the new alias ++ ifconf_buff = buff.tostring() ++ except AttributeError: ++ ifconf_buff = buff.tobytes() + + ifaces = {} + for i in range(0, array_size, struct_size): +diff --git a/tests/protocol/test_imds.py b/tests/protocol/test_imds.py +index a730ded03525..47462fd25ac3 100644 +--- a/tests/protocol/test_imds.py ++++ b/tests/protocol/test_imds.py +@@ -109,7 +109,7 @@ class TestImds(AgentTestCase): + "zone": "In" + }''' + +- data = json.loads(s, encoding='utf-8') ++ data = json.loads(s) + + compute_info = imds.ComputeInfo() + set_properties("compute", compute_info, data) +@@ -258,7 +258,7 @@ class TestImds(AgentTestCase): + "version": "{3}" + }}'''.format(publisher, offer, sku, version) + +- data = json.loads(s, encoding='utf-8') ++ data = json.loads(s) + compute_info = imds.ComputeInfo() + set_properties("compute", compute_info, data) + +-- +2.26.2 + diff --git a/0002-handle-py3.9-check-in-future.py.patch b/0002-handle-py3.9-check-in-future.py.patch new file mode 100644 index 0000000..d7c563a --- /dev/null +++ b/0002-handle-py3.9-check-in-future.py.patch @@ -0,0 +1,90 @@ +From 66f600ed3d9f22c2aa6790002507d0c821a7fd0c Mon Sep 17 00:00:00 2001 +From: Paula Gombar +Date: Tue, 8 Dec 2020 18:38:33 -0800 +Subject: [PATCH 2/3] handle py3.9 check in future.py + +--- + azurelinuxagent/common/future.py | 13 ++++++++++++- + azurelinuxagent/common/osutil/bigip.py | 8 +++----- + azurelinuxagent/common/osutil/default.py | 9 ++------- + 3 files changed, 17 insertions(+), 13 deletions(-) + +diff --git a/azurelinuxagent/common/future.py b/azurelinuxagent/common/future.py +index 577fb12e186e..0f76aceba786 100644 +--- a/azurelinuxagent/common/future.py ++++ b/azurelinuxagent/common/future.py +@@ -103,4 +103,15 @@ def get_openwrt_platform(): + elif product_matches: + if product_matches.group(1) == "OpenWrt": + result[0] = "openwrt" +- return result +\ No newline at end of file ++ return result ++ ++ ++def array_to_string_or_bytes(buffer): ++ # Python 3.9 removed the tostring() method on arrays, the new alias is tobytes() ++ if sys.version_info[0] == 2: ++ return buffer.tostring() ++ ++ if sys.version_info[0] == 3 and sys.version_info[1] <= 8: ++ return buffer.tostring() ++ ++ return buffer.tobytes() +diff --git a/azurelinuxagent/common/osutil/bigip.py b/azurelinuxagent/common/osutil/bigip.py +index ceadf8ca2066..cc1b64143c12 100644 +--- a/azurelinuxagent/common/osutil/bigip.py ++++ b/azurelinuxagent/common/osutil/bigip.py +@@ -24,6 +24,8 @@ import socket + import struct + import time + ++from azurelinuxagent.common.future import array_to_string_or_bytes ++ + try: + # WAAgent > 2.1.3 + import azurelinuxagent.common.logger as logger +@@ -280,12 +282,8 @@ class BigIpOSUtil(DefaultOSUtil): + if retsize == (expected * struct_size): + logger.warn(('SIOCGIFCONF returned more than {0} up ' + 'network interfaces.'), expected) +- try: +- # Python 3.9 removed the tostring() method on arrays, tobytes() is the new alias +- sock = buff.tostring() +- except AttributeError: +- sock = buff.tobytes() + ++ sock = array_to_string_or_bytes(buff) + for i in range(0, struct_size * expected, struct_size): + iface = self._format_single_interface_name(sock, i) + +diff --git a/azurelinuxagent/common/osutil/default.py b/azurelinuxagent/common/osutil/default.py +index 6179061756e3..c1ca15cf64ef 100644 +--- a/azurelinuxagent/common/osutil/default.py ++++ b/azurelinuxagent/common/osutil/default.py +@@ -41,7 +41,7 @@ import azurelinuxagent.common.utils.fileutil as fileutil + import azurelinuxagent.common.utils.shellutil as shellutil + import azurelinuxagent.common.utils.textutil as textutil + from azurelinuxagent.common.exception import OSUtilError +-from azurelinuxagent.common.future import ustr ++from azurelinuxagent.common.future import ustr, array_to_string_or_bytes + from azurelinuxagent.common.utils.cryptutil import CryptUtil + from azurelinuxagent.common.utils.flexible_version import FlexibleVersion + from azurelinuxagent.common.utils.networkutil import RouteEntry, NetworkInterfaceCard +@@ -758,12 +758,7 @@ class DefaultOSUtil(object): + logger.warn(('SIOCGIFCONF returned more than {0} up ' + 'network interfaces.'), expected) + +- try: +- # Python 3.9 removed the tostring() method on arrays, tobytes() is the new alias +- ifconf_buff = buff.tostring() +- except AttributeError: +- ifconf_buff = buff.tobytes() +- ++ ifconf_buff = array_to_string_or_bytes(buff) + ifaces = {} + for i in range(0, array_size, struct_size): + iface = ifconf_buff[i:i+IFNAMSIZ].split(b'\0', 1)[0] +-- +2.26.2 + diff --git a/0003-fix-pylint.patch b/0003-fix-pylint.patch new file mode 100644 index 0000000..03b887c --- /dev/null +++ b/0003-fix-pylint.patch @@ -0,0 +1,33 @@ +From 90f1a4862cf63df4a96ad912effcfb54192ad4d7 Mon Sep 17 00:00:00 2001 +From: Paula Gombar +Date: Tue, 8 Dec 2020 18:53:57 -0800 +Subject: [PATCH 3/3] fix pylint + +--- + azurelinuxagent/common/future.py | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/azurelinuxagent/common/future.py b/azurelinuxagent/common/future.py +index 0f76aceba786..a6796f19fec2 100644 +--- a/azurelinuxagent/common/future.py ++++ b/azurelinuxagent/common/future.py +@@ -106,12 +106,12 @@ def get_openwrt_platform(): + return result + + +-def array_to_string_or_bytes(buffer): ++def array_to_string_or_bytes(buff): + # Python 3.9 removed the tostring() method on arrays, the new alias is tobytes() + if sys.version_info[0] == 2: +- return buffer.tostring() ++ return buff.tostring() + + if sys.version_info[0] == 3 and sys.version_info[1] <= 8: +- return buffer.tostring() ++ return buff.tostring() + +- return buffer.tobytes() ++ return buff.tobytes() +-- +2.26.2 + diff --git a/0004-Fix-distro-resolution-for-RedHat-2083.patch b/0004-Fix-distro-resolution-for-RedHat-2083.patch new file mode 100644 index 0000000..e0ce7b2 --- /dev/null +++ b/0004-Fix-distro-resolution-for-RedHat-2083.patch @@ -0,0 +1,64 @@ +From 3420fef144cf9a5be62cfae16f64c298ca397a17 Mon Sep 17 00:00:00 2001 +From: Paula Gombar +Date: Wed, 2 Dec 2020 21:36:41 -0800 +Subject: [PATCH] Fix distro resolution for RedHat (#2083) + +vkuznets: cherry-picking the primary change of the commit (adding 'rhel') +only, pylint changes require additional commits. + +Signed-off-by: Vitaly Kuznetsov +--- + azurelinuxagent/common/osutil/factory.py | 4 +--- + tests/common/osutil/test_factory.py | 14 ++++++++++++++ + 2 files changed, 15 insertions(+), 3 deletions(-) + +diff --git a/azurelinuxagent/common/osutil/factory.py b/azurelinuxagent/common/osutil/factory.py +index 69f8430052d5..caecaa0887e2 100644 +--- a/azurelinuxagent/common/osutil/factory.py ++++ b/azurelinuxagent/common/osutil/factory.py +@@ -97,9 +97,7 @@ def _get_osutil(distro_name, distro_code_name, distro_version, distro_full_name) + else: + return DebianOSBaseUtil() + +- if distro_name == "redhat" \ +- or distro_name == "centos" \ +- or distro_name == "oracle": ++ if distro_name in ("redhat", "rhel", "centos", "oracle"): + if Version(distro_version) < Version("7"): + return Redhat6xOSUtil() + else: +diff --git a/tests/common/osutil/test_factory.py b/tests/common/osutil/test_factory.py +index aa7daebcf25f..2ac0849f75c9 100644 +--- a/tests/common/osutil/test_factory.py ++++ b/tests/common/osutil/test_factory.py +@@ -188,6 +188,13 @@ class TestOsUtilFactory(AgentTestCase): + self.assertTrue(type(ret) == Redhat6xOSUtil) + self.assertEquals(ret.get_service_name(), "waagent") + ++ ret = _get_osutil(distro_name="rhel", ++ distro_code_name="", ++ distro_full_name="", ++ distro_version="6") ++ self.assertTrue(type(ret) == Redhat6xOSUtil) ++ self.assertEquals(ret.get_service_name(), "waagent") ++ + ret = _get_osutil(distro_name="centos", + distro_code_name="", + distro_full_name="", +@@ -209,6 +216,13 @@ class TestOsUtilFactory(AgentTestCase): + self.assertTrue(type(ret) == RedhatOSUtil) + self.assertEquals(ret.get_service_name(), "waagent") + ++ ret = _get_osutil(distro_name="rhel", ++ distro_code_name="", ++ distro_full_name="", ++ distro_version="7") ++ self.assertTrue(type(ret) == RedhatOSUtil) ++ self.assertEquals(ret.get_service_name(), "waagent") ++ + ret = _get_osutil(distro_name="centos", + distro_code_name="", + distro_full_name="", +-- +2.29.2 + diff --git a/WALinuxAgent.spec b/WALinuxAgent.spec new file mode 100644 index 0000000..9afc38e --- /dev/null +++ b/WALinuxAgent.spec @@ -0,0 +1,126 @@ +%global with_legacy 0 +%global dracut_modname 97walinuxagent + +Name: WALinuxAgent +Version: 2.2.52 +Release: 1 +Summary: The Microsoft Azure Linux Agent + +License: ASL 2.0 +URL: https://github.com/Azure/%{name} +Source0: https://github.com/Azure/%{name}/archive/v%{version}.tar.gz +Source1: module-setup.sh + +# Python3.9 fixes +Patch0: 0001-update-array.tostring-and-json.loads-without-encodin.patch +Patch1: 0002-handle-py3.9-check-in-future.py.patch +Patch2: 0003-fix-pylint.patch +Patch3: 0004-Fix-distro-resolution-for-RedHat-2083.patch + +BuildArch: noarch +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-distro +Requires: %name-udev = %version-%release +Requires: openssh +Requires: openssh-server +Requires: openssl +Requires: parted +Requires: python3-pyasn1 +BuildRequires: systemd +Requires(post): systemd +Requires(preun): systemd +Requires(postun): systemd + +%description +The Microsoft Azure Linux Agent supports the provisioning and running of Linux +VMs in the Microsoft Azure cloud. This package should be installed on Linux disk +images that are built to run in the Microsoft Azure environment. + +%if 0%{?with_legacy} +%package legacy +Summary: The Microsoft Azure Linux Agent (legacy) +Requires: %name = %version-%release +Requires: python2 +Requires: net-tools + +%description legacy +The Microsoft Azure Linux Agent supporting old version of extensions. +%endif + +%package udev +Summary: Udev rules for Microsoft Azure + +%description udev +Udev rules specific to Microsoft Azure Virtual Machines. + +%prep +%setup -q +%patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 + +%build +%py3_build + +%install +%{__python3} setup.py install -O1 --skip-build --root %{buildroot} --lnx-distro redhat + +mkdir -p -m 0700 %{buildroot}%{_sharedstatedir}/waagent +mkdir -p %{buildroot}%{_localstatedir}/log +touch %{buildroot}%{_localstatedir}/log/waagent.log + +mkdir -p %{buildroot}%{_udevrulesdir} +mv %{buildroot}%{_sysconfdir}/udev/rules.d/*.rules %{buildroot}%{_udevrulesdir}/ + +rm -rf %{buildroot}/%{python3_sitelib}/tests +rm -rf %{buildroot}/%{python3_sitelib}/__main__.py +rm -rf %{buildroot}/%{python3_sitelib}/__pycache__/__main__*.py* + +sed -i 's,#!/usr/bin/env python,#!/usr/bin/python3,' %{buildroot}%{_sbindir}/waagent +%if 0%{?with_legacy} +sed -i 's,#!/usr/bin/env python,#!/usr/bin/python2,' %{buildroot}%{_sbindir}/waagent2.0 +%else +rm -f %{buildroot}%{_sbindir}/waagent2.0 +%endif +sed -i 's,/usr/bin/python ,/usr/bin/python3 ,' %{buildroot}%{_unitdir}/waagent.service + +mv %{buildroot}%{_sysconfdir}/logrotate.d/waagent.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name} +mv %{buildroot}%{_sysconfdir}/logrotate.d/waagent-extn.logrotate %{buildroot}%{_sysconfdir}/logrotate.d/%{name}-extn + +install -m0755 -D -t %{buildroot}%{_prefix}/lib/dracut/modules.d/%{dracut_modname}/ %{SOURCE1} + +%post +%systemd_post waagent.service + +%preun +%systemd_preun waagent.service + +%postun +%systemd_postun_with_restart waagent.service + +%files +%doc Changelog LICENSE.txt NOTICE README.md +%ghost %{_localstatedir}/log/waagent.log +%dir %attr(0700, root, root) %{_sharedstatedir}/waagent +%config(noreplace) %{_sysconfdir}/logrotate.d/%{name} +%config(noreplace) %{_sysconfdir}/logrotate.d/%{name}-extn +%{_sbindir}/waagent +%config(noreplace) %{_sysconfdir}/waagent.conf +%{_unitdir}/waagent.service +%{python3_sitelib}/azurelinuxagent +%{python3_sitelib}/*.egg-info + +%files udev +%{_udevrulesdir}/*.rules +%{_prefix}/lib/dracut/modules.d/%{dracut_modname}/*.sh + +%if 0%{?with_legacy} +%files legacy +%{_sbindir}/waagent2.0 +%endif + +%changelog +* Thu Feb 17 2022 fushanqing - 2.2.52-1 +- Initial package \ No newline at end of file diff --git a/module-setup.sh b/module-setup.sh new file mode 100644 index 0000000..00d0eb7 --- /dev/null +++ b/module-setup.sh @@ -0,0 +1,16 @@ +#!/usr/bin/bash + +# called by dracut +check() { + return 0 +} + +# called by dracut +depends() { + return 0 +} + +# called by dracut +install() { + inst_rules 66-azure-storage.rules 99-azure-product-uuid.rules +} diff --git a/v2.2.52.tar.gz b/v2.2.52.tar.gz new file mode 100644 index 0000000..ca2db2d Binary files /dev/null and b/v2.2.52.tar.gz differ