def install_bootloader(self): pinfo("Setting up bootloader") try: subprocess.call(["sync"]) subprocess.call( [ "/opt/openwide/vmc-grub-ubuntu1604/sbin/grub2-bios-setup", "-d", self.new_root + "/boot/grub", "-b", "i386-pc/boot.img", "-c", "i386-pc/core.img", "-f", self.disk_loop_dev, ] ) subprocess.call(["chmod", "644", self.new_root + "/boot/grub/grub.cfg"]) subprocess.call( [ "sed", "-i", "s/OWO_ROOTFSUUID/" + fs_uuid(self.partition["root"]) + "/g", self.new_root + "/boot/grub/grub.cfg", ] ) subprocess.call(["chmod", "444", self.new_root + "/boot/grub/grub.cfg"]) except: pass
def create_disk(self): volume_size = self.root_size + self.swap_size + self.data_size if volume_size < 1: die("Volume size is too small") if self.do_lvm: pinfo("Create virtual machine logical volume") lvcreate_cmd = ["lvcreate", "-y", self.lvm_vg, "-L", str(volume_size) + "G", "-n", self.lvm_lv ] if not self.lvm_physical_disk == None: lvcreate_cmd.append(self.lvm_physical_disk) if vmc.utils.lvm.locking_type() == 4: vmc.utils.lvm.unlock() subprocess.call(lvcreate_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) vmc.utils.lvm.lock(4) vmc.utils.lvm.lv_activate(self.disk_path, self.cluster_nodes) # CLVM locking or single host else: subprocess.call(lvcreate_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) else: pinfo("Create virtual machine disk image") subprocess.call(["qemu-img", "create", "-f", "raw", \ self.disk_path, \ str(volume_size) + "G"], \ stdout=subprocess.PIPE, \ stderr=subprocess.PIPE)
def install(self): if re.search("^centos4", self.template_name): d = centos4(self) elif re.search("^centos5", self.template_name): self.os = centos5(self) self.os.install() elif re.search("^centos6", self.template_name): self.os = centos6(self) self.os.install() elif re.search("^centos7", self.template_name): self.os = centos7(self) self.os.install() elif re.search("^rhel6", self.template_name): d = rhel6(self) elif re.search("^debian5", self.template_name): self.os = debian5(self) self.os.install() elif re.search("^debian6", self.template_name): self.os = debian6(self) self.os.install() elif re.search("^debian7", self.template_name): self.os = debian7(self) self.os.install() elif re.search("^debian8", self.template_name): self.os = debian8(self) self.os.install() elif self.template_name == "dummy": self.os = dummy(self) self.os.install() pinfo("Install dummy template (only create disk and VM definition file)") elif re.search("^ubuntu1604", self.template_name): self.os = ubuntu1604(self) self.os.install() else: die(self.template_name + " is unsupported")
def mkpart(self): pinfo("Create " + self.vm.disk_path + " partitions") subprocess.call(["parted", self.disk_loop_dev, "--script", "--", "mklabel msdos"]) subprocess.call(["parted", self.disk_loop_dev, "--script", "--", "mkpart primary 1 %uG" % self.vm.root_size]) subprocess.call(["parted", self.disk_loop_dev, "--script", "--", "set 1 boot on"]) begin_npart = self.vm.root_size subprocess.call(["parted", self.disk_loop_dev, "--script", "--", "mkpart primary linux-swap %uG %uG" % (begin_npart, begin_npart+self.vm.swap_size)]) begin_npart += self.vm.swap_size subprocess.call(["parted", self.disk_loop_dev, "--script", "--", "mkpart primary %uG -1" % begin_npart])
def deploy_cluster_config(bridge_id, do_vlan=True, phydev="bond0"): script_path = os.path.realpath(sys.argv[0]) for node in vmcConfig().cluster_nodes: print("") pinfo("Create on %s" % node) if do_vlan: call(["ssh", "-l", "root", node, "%s -b %d -i %s -c" % (script_path, bridge_id, phydev)]) else: call(["ssh", "-l", "root", node, "%s -b %d" % (script_path, bridge_id)])
def install_bootloader(self): pinfo("Setting up bootloader") try: subprocess.call(["sync"]) subprocess.call(["/opt/openwide/vmc-grub-debian6/sbin/grub2-setup", "-d", self.new_root + "/boot/grub", "-r", "(%s,msdos3)" % self.disk_loop_dev, self.disk_loop_dev]) subprocess.call(["chmod", "644", self.new_root + "/boot/grub/grub.cfg"]) subprocess.call(["sed", "-i", "s/OWO_ROOTFSUUID/" + fs_uuid(self.partition['root']) + "/g", self.new_root + "/boot/grub/grub.cfg"]) subprocess.call(["chmod", "444", self.new_root + "/boot/grub/grub.cfg"]) except: pass
def set_hostname(self): pinfo("Setting up the hostname \"" + self.vm.name + "\"") f = open(self.new_root + "/etc/sysconfig/network", "a+") f.write("HOSTNAME=" + self.vm.name + "\n") f.close() f = open(self.new_root + "/etc/hosts", "a") f.write("\n127.0.0.1 " + self.vm.name + "." + self.vm.domain + " " + self.vm.name + "\n::1\t " + \ self.vm.name + "." + self.vm.domain + " " + self.vm.name + "\n") f.close()
def mkfs(device, fstype, label, opts=None): pinfo("Format %s device %s" % (fstype, device)) mkfs_cmd = ["mkfs", "-t", fstype, "-L", label, device] if not opts == None: mkfs_cmd.append(opts) subprocess.call(mkfs_cmd, \ stdout=subprocess.PIPE, \ stderr=subprocess.PIPE)
def set_hostname(self): pinfo("Setting up the hostname \"" + self.vm.name + "\"") f = open(self.new_root + "/etc/hostname", "w") f.write(self.vm.name + "\n") f.close() f = open(self.new_root + "/etc/hosts", "a") f.write("\n127.0.0.1 " + self.vm.name + "." + self.vm.domain + " " + self.vm.name + "\n::1\t " + \ self.vm.name + "." + self.vm.domain + " " + self.vm.name + "\n") f.close()
def remove_local_config(bridge_id, delete_vlan=True, phydev="bond0"): vnets = attached_to_br(bridge_id) if len(vnets) > 0: dom = [] for vnet in vnets: dom.append(attached_domain_from_vnet(vnet)) perror("Bridge br%d is used\n- " % bridge_id + "\n- ".join(dom)) sys.exit(2) pinfo("Stop bridge interface br%d" % bridge_id) call(["ifdown", "br%d" % bridge_id]) pinfo("Remove bridge configuration file") bridge_cfg_file = "/etc/sysconfig/network-scripts/ifcfg-br%d" % bridge_id if os.path.exists(bridge_cfg_file): os.unlink(bridge_cfg_file) else: perror("%s does not exist" % bridge_cfg_file) if delete_vlan: pinfo("Stop VLAN interface %s.%d" % (phydev, bridge_id)) call(["ifdown", "%s.%d" % (phydev, bridge_id)]) pinfo("Remove VLAN configuration file") vlan_cfg_file = "/etc/sysconfig/network-scripts/ifcfg-%s.%d" % (phydev, bridge_id) if os.path.exists(vlan_cfg_file): os.unlink(vlan_cfg_file) else: perror("%s does not exist" % vlan_cfg_file)
def chpasswd(root='/'): randomsalt = "" pinfo("Please enter root password (apg -a 1 -n 1 -m 16 -x 16 -M LN -E 'azqwm')") password = getpass.getpass() choices = string.ascii_uppercase + string.digits + string.ascii_lowercase for _ in range(0,8): randomsalt += random.choice(choices) pwhash = crypt.crypt(password, '$6$%s$' % randomsalt) shadowentry = 'root:' + pwhash + ':' + str(int(time.time() / 86400)) + ':0:99999:7:::' try: subprocess.call(["sed", "-i", "s#^root.*#" + shadowentry + "#1", root + "/etc/shadow"]) except: perror("Failed to setup root password") pass
def install_bootloader(self): pinfo("Setting up bootloader") try: link_vda = self.new_root + "/tmp/vda" link_vda1 = self.new_root + "/tmp/vda1" os.symlink(self.disk_loop_dev, link_vda) os.symlink(self.partition['root'], link_vda1) subprocess.call(["sync"]) subprocess.call("""/opt/openwide/vmc-grub-debian5/sbin/grub --batch --device-map=/dev/null << EOF >/dev/null 2>&1 device (hd0) %s root (hd0,0) setup (hd0) EOF""" % link_vda, shell=True) os.unlink(link_vda1) os.unlink(link_vda) except: pass
def set_network_config(self, interface='eth0'): pinfo("Setting up network configuration") while True: self.ip = input("[1;34m[[1;32m * [1;34m][0;m Enter IPv4 addess (x.x.x.x) or \"dhcp\" :\n") if self.ip == "dhcp": break if ipv4(self.ip): while True: self.netmask = input("[1;34m[[1;32m * [1;34m][0;m Enter netmask (255.255.255.0) :\n") if ipv4(self.netmask): break while True: self.gateway = input("[1;34m[[1;32m * [1;34m][0;m Enter the default gateway or \"none\" :\n") if self.gateway == "none": self.gateway = None break if ipv4(self.gateway): break break f = open(self.new_root + '/etc/network/interfaces', "w") if self.ip == "dhcp": f.write("""auto lo iface lo inet loopback auto %s iface %s inet dhcp""" % (interface, interface)) else: netconf = """auto lo iface lo inet loopback auto %s iface %s inet static address %s netmask %s""" % (interface, interface, self.ip, self.netmask) if not self.gateway == None: f.write(netconf + "\n gateway %s" % self.gateway) else: f.write(netconf) f.close()
def set_network_config(self, interface='eth0'): pinfo("Setting up network configuration") while True: self.ip = input("[1;34m[[1;32m * [1;34m][0;m Enter IPv4 addess (x.x.x.x) or \"dhcp\" :\n") if self.ip == "dhcp": break if ipv4(self.ip): while True: self.netmask = input("[1;34m[[1;32m * [1;34m][0;m Enter netmask (255.255.255.0) :\n") if ipv4(self.netmask): break while True: self.gateway = input("[1;34m[[1;32m * [1;34m][0;m Enter the default gateway or \"none\" :\n") if self.gateway == "none": self.gateway = None break if ipv4(self.gateway): break break f = open(self.new_root + '/etc/sysconfig/network-scripts/ifcfg-' + interface, "w") if self.ip == "dhcp": f.write("""DEVICE=%s BOOTPROTO=dhcp NM_CONTROLLED=\"no\" ONBOOT=\"yes\"\n""" % interface) else: netconf = """DEVICE=%s BOOTPROTO=static NM_CONTROLLED=\"no\" ONBOOT=\"yes\" IPADDR=%s NETMASK=%s\n""" % (interface, self.ip, self.netmask) if not self.gateway == None: f.write(netconf + "GATEWAY=%s\n" % self.gateway) else: f.write(netconf) f.close()
def create_local_config(bridge_id, do_vlan=False, phydev="bond0"): pinfo("Create bridge config file") bridge_cfg_file = "/etc/sysconfig/network-scripts/ifcfg-br%d" % bridge_id if not os.path.exists(bridge_cfg_file): with open(bridge_cfg_file, "w") as f: f.write(netbridge_file(bridge_id)) else: die("\"br%d\" bridge already exists, exiting..." % bridge_id) pinfo("Activating bridge") call(["ifup", "br%d" % bridge_id]) if do_vlan: pinfo("Create VLAN config file") vlan_cfg_file = "/etc/sysconfig/network-scripts/ifcfg-%s.%d" % (phydev, bridge_id) if not os.path.exists(vlan_cfg_file): with open(vlan_cfg_file, "w") as f: f.write(netvlan_file(phydev, bridge_id, bridge_id)) else: die("\"%d\" bridge already exists, exiting...") pinfo("Activating VLAN") call(["ifup", "%s.%d" % (phydev, bridge_id)])
def extract_template(self): self.new_root = tempfile.mktemp(prefix="/tmp/owo.", dir=True) try: pinfo("Create temporary mount point " + self.new_root) os.mkdir(self.new_root) except: die("Unable to create temporary mount point") subprocess.call(["sync"]) subprocess.call(["mount", "-o", "noload", self.partition['root'], self.new_root]) pinfo("Extract " + self.vm.template_name + " template") subprocess.call(["tar", "--numeric-owner", "-xf", self.vm.template_path, \ "-C", self.new_root + "/"]) pinfo("Setting up the fstab") f = open(self.new_root + "/etc/fstab", "r") fstab_array = [] for line in f.readlines(): if not re.search (r"swap|data|label=/", line, re.IGNORECASE): fstab_array.append(line) f.close() fstab_array.append("LABEL=ROOT\t/\text3\trw,errors=remount-ro,noatime,nodiratime\t1 1\n") fstab_array.append("LABEL=DATA\t/data\text3\trw,errors=remount-ro,noatime,nodiratime\t1 2\n") fstab_array.append("LABEL=SWAP\tnone\tswap\tsw\t0 0\n") f = open(self.new_root + "/etc/fstab", "w") f.write("".join(fstab_array)) f.close() # FIXME: Open Wide specific os.mkdir(self.new_root + "/data") subprocess.call(["mount", "-o", "noload", self.partition['data'], self.new_root + "/data"]) for dir in ["/data/log", "/data/services"]: os.mkdir(self.new_root + dir) subprocess.call(["umount", self.new_root + "/data"])
for h in conf.cluster_nodes: conn = libvirt.open("qemu+ssh://" + h + "/system") try: dom = conn.lookupByName(todelete) except: perror("\"%s\" domain isn't defined on %s" % (todelete, h)) dom = None pass if not dom == None: if dom.isActive(): perror("\"%s\" domain is running on %s, shutdown the domain and retry" % (todelete, h)) conn.close() sys.exit(1) else: pinfo("Undefine \"%s\" on %s" % (todelete, h)) dom.undefine() conn.close() else: conn = libvirt.open(None) try: dom = conn.LookupByName(todelete) except: perror("%s domain isn't defined here" % todelete) conn.close() sys.exit(1) if dom.isActive(): perror("Can't delete %s because it running here" % todelete)
for h in conf.cluster_nodes: conn = libvirt.open("qemu+ssh://" + h + "/system") try: dom = conn.lookupByName(toundefine) except: perror("\"%s\" domain isn't defined on %s" % (toundefine, h)) dom = None pass if not dom == None: if dom.isActive(): perror("\"%s\" domain is running on %s, shutdown the domain and retry" % (toundefine, h)) conn.close() sys.exit(1) else: pinfo("Undefine \"%s\" on %s" % (toundefine, h)) dom.undefine() conn.close() else: conn = libvirt.open(None) try: dom = conn.LookupByName(toundefine) except: perror("%s domain isn't defined here" % toundefine) conn.close() sys.exit(1) if dom.isActive(): perror("Can't delete %s because it running here" % toundefine)
if todefine == "--help" or todefine == "-h": usage() except: usage() sys.exit(1) conf = vmcConfig() xml_file_path = conf.libvirt_domain_dir + "/" + todefine + ".xml" if not os.path.exists(xml_file_path): die(xml_file_path + " : doesn't exists") try: with open(xml_file_path, "r") as f: xmldom = f.read() except: pass die("Unable to read %s file" % xml_file_path,) if conf.do_cluster: for h in conf.cluster_nodes: pinfo("Define %s on %s" % (xml_file_path, h)) conn = libvirt.open("qemu+ssh://" + h + "/system") conn.defineXML(xmldom) conn.close() else: conn = libvirt.open(None) conn.defineXML(xmldom) conn.close()
) try: dest = sys.argv[1] if dest == "--help" or dest == "-h": usage() except: usage() sys.exit(1) try: conn = libvirt.open(None) dconn = libvirt.open("qemu+ssh://" + dest + "/system") except: perror("Unable to connect to the libvirt daemon") sys.exit(1) for domain in conn.listAllDomains(): if domain.isActive(): try: pinfo("Migrate %s on %s" % (domain.name(), dest)) domain.migrate(dconn, libvirt.VIR_MIGRATE_LIVE) except: die("Something goes wrong during the migration") dconn.close() conn.close() sys.exit(0)
-h, --help Display help information """ % os.path.basename(sys.argv[0]) ) try: domain = sys.argv[1] if domain == "--help" or domain == "-h": usage() except: usage() sys.exit(1) conf = vmcConfig() if not conf.do_lvm: die("VM storage is not set to LVM") xml_file_path = conf.libvirt_domain_dir + "/" + domain + ".xml" if not os.path.exists(xml_file_path): die(xml_file_path + " : doesn't exists") xml_dom = parse(xml_file_path) for disk in xml_dom.getElementsByTagName("disk"): if disk.attributes["device"].value == "disk": d = disk.getElementsByTagName("source")[0].attributes["dev"].value pinfo("Activate LV %s on: %s" % (d, ", ".join(conf.cluster_nodes))) lv_activate(d, conf.cluster_nodes)
def mkswap(device, label): pinfo("Format swap device " + device) subprocess.call(["mkswap", "-L", label, device], \ stdout=subprocess.PIPE, \ stderr=subprocess.PIPE)
try: domain = sys.argv[1] if domain == "--help" or domain == "-h": usage() except: usage() sys.exit(1) conf = vmcConfig() if not conf.do_lvm: die("VM storage is not set to LVM") xml_file_path = conf.libvirt_domain_dir + "/" + domain + ".xml" if not os.path.exists(xml_file_path): die(xml_file_path + " : doesn't exists") xml_dom = parse(xml_file_path) for disk in xml_dom.getElementsByTagName('disk'): if disk.attributes['device'].value == 'disk': d = disk.getElementsByTagName('source')[0].attributes['dev'].value if conf.do_cluster: pinfo("Deactivate LV %s on: %s" % (d, ', '.join(conf.cluster_nodes))) lv_deactivate(d, conf.cluster_nodes) else: pinfo("Deactivate LV %s " + d) lv_deactivate(d)
def init_disk(self): # It's a small hack to help grub install pinfo("Initalize " + self.vm.disk_path + " disk") with open(self.disk_loop_dev, "wb") as f: f.write("\x00" * 10485760) subprocess.call(["sync"])
def set_puppet_config(self): pinfo("Setting up Puppet configuration") fqdn = self.vm.name + "." + self.vm.domain try: f = open(self.new_root + "/etc/puppet/puppet.conf", "w") if self.ip == "dhcp": f.write("""[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet #factpath=$vardir/lib/facter templatedir=$confdir/templates pluginsync=true [agent] ssldir = /etc/puppet/ssl server=puppetmaster.accelance.net certname=%s fqdn=%s listen=true client=false #bindaddress= report=true environment=production\n""" % (fqdn, fqdn)) else: f.write("""[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet #factpath=$vardir/lib/facter templatedir=$confdir/templates pluginsync=true [agent] ssldir = /etc/puppet/ssl server=puppetmaster.accelance.net certname=%s fqdn=%s listen=true client=false bindaddress=%s report=true environment=production\n""" % (fqdn, fqdn, self.ip)) f.close() open(self.new_root + "/etc/puppet/namespaceauth.conf", "a").close() except: perror("Failed to configure Puppet") pass f = open(self.new_root + "/etc/default/puppet", "w") f.write( """# Defaults for puppet - sourced by /etc/init.d/puppet # Start puppet on boot? START=yes # Startup options DAEMON_OPTS=\"-w 5\"\n""") f.close() f = open(self.new_root + "/etc/puppet/auth.conf", "w") f.write("""path /run method save allow puppetmaster.accelance.net\n""") f.close()
import libvirt from vmc.common import pinfo, perror, die from vmc.utils.openwide import vmc_unlock, vmc_lock import vmc.utils.lvm def usage(): print ("""Usage : %s Unlock LVM metadata -h, --help Display help information """ % os.path.basename(sys.argv[0])) try: dest = sys.argv[1] if dest == "--help" or dest == "-h": usage() except: pass conf = vmcConfig() if vmc.utils.lvm.locking_type() == 0: die("LVM metadata are already unlocked") vmc_lock(conf.lockfile, os.path.basename(sys.argv[0])) vmc.utils.lvm.unlock() pinfo("Don't forget to re-lock LVM metadata after operation") sys.exit(0)
import libvirt from vmc.common import pinfo, perror, die from vmc.utils.openwide import vmc_unlock, vmc_lock import vmc.utils.lvm def usage(): print ("""Usage : %s Lock LVM metadata -h, --help Display help information """ % os.path.basename(sys.argv[0])) try: dest = sys.argv[1] if dest == "--help" or dest == "-h": usage() except: pass conf = vmcConfig() if vmc.utils.lvm.locking_type() == 4: die("LVM metadata are already locked") vmc.utils.lvm.lock() vmc_unlock(conf.lockfile) pinfo("LVM metadata are now locked") sys.exit(0)
def set_puppet_config(self): pinfo("Setting up Puppet configuration") fqdn = self.vm.name + "." + self.vm.domain try: f = open(self.new_root + "/etc/puppet/puppet.conf", "w") if self.ip == "dhcp": f.write("""[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet #factpath=$vardir/lib/facter templatedir=$confdir/templates pluginsync=true [agent] ssldir = /etc/puppet/ssl server=puppetmaster.accelance.net certname=%s fqdn=%s listen=true client=false #bindaddress= report=true environment=production\n""" % (fqdn, fqdn)) else: f.write("""[main] logdir=/var/log/puppet vardir=/var/lib/puppet ssldir=/var/lib/puppet/ssl rundir=/var/run/puppet #factpath=$vardir/lib/facter templatedir=$confdir/templates pluginsync=true [agent] ssldir = /etc/puppet/ssl server=puppetmaster.accelance.net certname=%s fqdn=%s listen=true client=false bindaddress=%s report=true environment=production\n""" % (fqdn, fqdn, self.ip)) f.close() open(self.new_root + "/etc/puppet/namespaceauth.conf", "a").close() except: perror("Failed to configure Puppet") pass f = open(self.new_root + "/etc/sysconfig/puppet", "w") f.write( """# The puppetmaster server #PUPPET_SERVER=puppet # If you wish to specify the port to connect to do so here #PUPPET_PORT=8140 # Where to log to. Specify syslog to send log messages to the system log. #PUPPET_LOG=/var/log/puppet/puppet.log # You may specify other parameters to the puppet client here PUPPET_EXTRA_OPTS=\"-w 5\"\n""") f.close() f = open(self.new_root + "/etc/puppet/auth.conf", "w") f.write("""path /run method save allow puppetmaster.accelance.net\n""") f.close()