debian.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. # Copyright 2016 Cloudbase Solutions Srl
  2. # All Rights Reserved.
  3. import os
  4. from io import StringIO
  5. import yaml
  6. from coriolis import utils
  7. from coriolis.osmorphing import base
  8. LO_NIC_TPL = """
  9. auto lo
  10. iface lo inet loopback
  11. """
  12. INTERFACES_NIC_TPL = """
  13. auto %(device_name)s
  14. iface %(device_name)s inet dhcp
  15. """
  16. class BaseDebianMorphingTools(base.BaseLinuxOSMorphingTools):
  17. def _check_os(self):
  18. lsb_release_path = "etc/lsb-release"
  19. debian_version_path = "etc/debian_version"
  20. if self._test_path(lsb_release_path):
  21. config = self._read_config_file("etc/lsb-release")
  22. dist_id = config.get('DISTRIB_ID')
  23. if dist_id == 'Debian':
  24. release = config.get('DISTRIB_RELEASE')
  25. return (dist_id, release)
  26. elif self._test_path(debian_version_path):
  27. release = self._read_file(
  28. debian_version_path).decode().split('\n')[0]
  29. return ('Debian', release)
  30. def disable_predictable_nic_names(self):
  31. grub_cfg = os.path.join(
  32. self._os_root_dir,
  33. "etc/default/grub")
  34. if self._test_path(grub_cfg) is False:
  35. return
  36. contents = self._read_file(grub_cfg).decode()
  37. cfg = utils.Grub2ConfigEditor(contents)
  38. cfg.append_to_option(
  39. "GRUB_CMDLINE_LINUX_DEFAULT",
  40. {"opt_type": "key_val", "opt_key": "net.ifnames", "opt_val": 0})
  41. cfg.append_to_option(
  42. "GRUB_CMDLINE_LINUX_DEFAULT",
  43. {"opt_type": "key_val", "opt_key": "biosdevname", "opt_val": 0})
  44. cfg.append_to_option(
  45. "GRUB_CMDLINE_LINUX",
  46. {"opt_type": "key_val", "opt_key": "net.ifnames", "opt_val": 0})
  47. cfg.append_to_option(
  48. "GRUB_CMDLINE_LINUX",
  49. {"opt_type": "key_val", "opt_key": "biosdevname", "opt_val": 0})
  50. self._write_file_sudo("etc/default/grub", cfg.dump())
  51. self._exec_cmd_chroot("/usr/sbin/update-grub")
  52. def _compose_interfaces_config(self, nics_info):
  53. fp = StringIO()
  54. fp.write(LO_NIC_TPL)
  55. fp.write("\n\n")
  56. for idx, _ in enumerate(nics_info):
  57. dev_name = "eth%d" % idx
  58. cfg = INTERFACES_NIC_TPL % {
  59. "device_name": dev_name,
  60. }
  61. fp.write(cfg)
  62. fp.write("\n\n")
  63. fp.seek(0)
  64. return fp.read()
  65. def _compose_netplan_cfg(self, nics_info):
  66. cfg = {
  67. "network": {
  68. "version": 2,
  69. "ethernets": {
  70. "lo": {
  71. "match": {
  72. "name": "lo"
  73. },
  74. "addresses": ["127.0.0.1/8"]
  75. }
  76. }
  77. }
  78. }
  79. for idx, _ in enumerate(nics_info):
  80. cfg["network"]["ethernets"]["eth%d" % idx] = {
  81. "dhcp4": True,
  82. "dhcp6": True,
  83. }
  84. return yaml.dump(cfg, default_flow_style=False)
  85. def set_net_config(self, nics_info, dhcp):
  86. if not dhcp:
  87. return
  88. self.disable_predictable_nic_names()
  89. if self._test_path("etc/network"):
  90. ifaces_file = "etc/network/interfaces"
  91. contents = self._compose_interfaces_config(nics_info)
  92. if self._test_path(ifaces_file):
  93. self._exec_cmd_chroot(
  94. "cp %s %s.bak" % (ifaces_file, ifaces_file))
  95. self._write_file_sudo(ifaces_file, contents)
  96. netplan_base = "etc/netplan"
  97. if self._test_path(netplan_base):
  98. curr_files = self._list_dir(netplan_base)
  99. for cnf in curr_files:
  100. if cnf.endswith(".yaml") or cnf.endswith(".yml"):
  101. pth = "%s/%s" % (netplan_base, cnf)
  102. self._exec_cmd_chroot(
  103. "mv %s %s.bak" % (pth, pth)
  104. )
  105. new_cfg = self._compose_netplan_cfg(nics_info)
  106. cfg_name = "%s/coriolis_netplan.yaml" % netplan_base
  107. self._write_file_sudo(cfg_name, new_cfg)
  108. def pre_packages_install(self, package_names):
  109. super(BaseDebianMorphingTools, self).pre_packages_install(
  110. package_names)
  111. if package_names:
  112. self._event_manager.progress_update("Updating packages list")
  113. self._exec_cmd_chroot('apt-get clean')
  114. self._exec_cmd_chroot('apt-get update -y')
  115. def install_packages(self, package_names):
  116. apt_get_cmd = 'apt-get install %s -y' % " ".join(package_names)
  117. self._exec_cmd_chroot(apt_get_cmd)
  118. def uninstall_packages(self, package_names):
  119. for package_name in package_names:
  120. apt_get_cmd = 'apt-get remove %s -y || true' % package_name
  121. self._exec_cmd_chroot(apt_get_cmd)