installer/ostreeinstaller.py
4d53ba03
 #!/usr/bin/python2
 #
 #    Copyright (C) 2015 vmware inc.
 #
 #    Author: Touseef Liaqat <tliaqat@vmware.com>
 
 import os
 import glob
 import modules.commons
 from installer import Installer
8a85a8a1
 from actionresult import ActionResult
4d53ba03
 
 class OstreeInstaller(Installer):
 
     def __init__(self, install_config, maxy = 0, maxx = 0, iso_installer = False, rpm_path = "../stage/RPMS", log_path = "../stage/LOGS", ks_config = None):
         Installer.__init__(self, install_config, maxy, maxx, iso_installer, rpm_path, log_path, ks_config)
3f7fcace
         self.repo_config = {}
         self.repo_read_conf()
4d53ba03
 
f04583fc
     def get_ostree_repo_url(self):
3c4cf0da
         self.default_repo = 'default_repo' in self.install_config and self.install_config['default_repo'];
3f7fcace
         if not self.default_repo:
             self.ostree_repo_url = self.install_config['ostree_repo_url']
             self.ostree_ref = self.install_config['ostree_repo_ref']
 
     def repo_read_conf(self):
         with open("ostree-release-repo.conf") as repo_conf:
             for line in repo_conf:
                 name, value = line.partition("=")[::2]
                 self.repo_config[name] = value.strip(' \n\t\r')
 
     def pull_repo(self, repo_url, repo_ref):
         if self.default_repo:
             self.run("ostree remote add --repo={}/ostree/repo --set=gpg-verify=false photon {}".format(self.photon_root, repo_url), "Adding OSTree remote")
4bc58d36
             self.run("ostree pull-local --repo={}/ostree/repo {}".format(self.photon_root, self.local_repo_path), "Pulling OSTree repo")
3f7fcace
             self.run("mv {}/ostree/repo/refs/heads {}/ostree/repo/refs/remotes/photon".format(self.photon_root, self.photon_root))
             self.run("mkdir -p {}/ostree/repo/refs/heads".format(self.photon_root, self.photon_root))
         else:
             self.run("ostree remote add --repo={}/ostree/repo --set=gpg-verify=false photon {}".format(self.photon_root, repo_url), "Adding OSTree remote")
             self.run("ostree pull --repo={}/ostree/repo photon {}".format(self.photon_root, repo_ref), "Pulling OSTree remote repo")
f04583fc
 
4d53ba03
     def deploy_ostree(self, repo_url, repo_ref):
         self.run("ostree admin --sysroot={} init-fs {}".format(self.photon_root, self.photon_root), "Initializing OSTree filesystem")
3f7fcace
         self.pull_repo(repo_url, repo_ref)
4d53ba03
         self.run("ostree admin --sysroot={} os-init photon ".format(self.photon_root), "OSTree OS Initializing")
3dd32127
         self.run("ostree admin --sysroot={} deploy --os=photon photon:{}".format(self.photon_root, repo_ref), "Deploying")
4d53ba03
 
     def do_systemd_tmpfiles_commands(self, commit_number):
         prefixes = ["/var/home",
             "/var/roothome",
             "/var/lib/rpm",
             "/var/opt",
             "/var/srv",
             "/var/userlocal",
             "/var/mnt",
             "/var/spool/mail"]
 
         for prefix in prefixes:
             command = "systemd-tmpfiles --create --boot --root={}/ostree/deploy/photon/deploy/{}.0 --prefix={}".format(self.photon_root, commit_number, prefix)
             self.run(command)
 
     def mount_devices_in_deployment(self, commit_number):
         for command in ["mount -t bind -o bind,defaults /dev  {}/ostree/deploy/photon/deploy/{}.0/dev",
             "mount -t devpts -o gid=5,mode=620 devpts  {}/ostree/deploy/photon/deploy/{}.0/dev/pts",
             "mount -t tmpfs -o defaults tmpfs  {}/ostree/deploy/photon/deploy/{}.0/dev/shm",
             "mount -t proc -o defaults proc  {}/ostree/deploy/photon/deploy/{}.0/proc",
             "mount -t bind -o bind,defaults /run  {}/ostree/deploy/photon/deploy/{}.0/run",
             "mount -t sysfs -o defaults sysfs  {}/ostree/deploy/photon/deploy/{}.0/sys" ]:
             self.run(command.format(self.photon_root, commit_number))
 
     def get_commit_number(self, ref):
         fileName = os.path.join(self.photon_root, "ostree/repo/refs/remotes/photon/{}".format(ref))
         commit_number = None
         with open (fileName, "r") as file:
             commit_number = file.read().replace('\n', '')
         return commit_number
 
     def unsafe_install(self, params):
         self.org_photon_root = self.photon_root
         sysroot_ostree = os.path.join(self.photon_root, "ostree")
         sysroot_boot = os.path.join(self.photon_root, "boot")
         loader0 = os.path.join(sysroot_boot, "loader.0")
         loader1 = os.path.join(sysroot_boot, "loader.1")
 
         boot0 = os.path.join(sysroot_ostree, "boot.0")
         boot1 = os.path.join(sysroot_ostree, "boot.1")
 
         boot01 = os.path.join(sysroot_ostree, "boot.0.1")
         boot11 = os.path.join(sysroot_ostree, "boot.1.1")
 
         self.get_ostree_repo_url()
 
         self.window.show_window()
         self.progress_bar.initialize("Initializing installation...")
         self.progress_bar.show()
3f7fcace
         
4d53ba03
         self.execute_modules(modules.commons.PRE_INSTALL)
 
         disk = self.install_config['disk']['disk']
dcc0e545
         self.run("sgdisk -d 1 -d 2 -n 1::+2M -n 2::+300M -n 3: -p {}".format(disk), "Updating partition table for OSTree")
         self.run("sgdisk -t1:ef02 {}".format(disk))
4d53ba03
         self.run("mkfs -t ext4 {}2".format(disk))
         self.run("mkfs -t ext4 {}3".format(disk))
         self.run("mount {}3 {}".format(disk, self.photon_root))
         self.run("mkdir -p {} ".format(sysroot_boot))
         self.run("mount {}2 {}".format(disk, sysroot_boot))
 
adde0296
         #Setup the disk
         self.run("dd if=/dev/zero of={}/swapfile bs=1M count=64".format(self.photon_root))
d99e1c67
         self.run("chmod 600 {}/swapfile".format(self.photon_root))
adde0296
         self.run("mkswap -v1 {}/swapfile".format(self.photon_root))
         self.run("swapon {}/swapfile".format(self.photon_root))
 
         if self.default_repo:
             self.run("rm -rf /installer/boot")
             self.run("mkdir -p {}/repo".format(self.photon_root))
d99e1c67
             self.progress_bar.show_loading("Unpacking local OSTree repo")
adde0296
             self.run("tar --warning=none -xf /mnt/cdrom/ostree-repo.tar.gz -C {}/repo".format(self.photon_root))
             self.local_repo_path = "{}/repo".format(self.photon_root)
             self.ostree_repo_url = self.repo_config['OSTREEREPOURL']
             self.ostree_ref = self.repo_config['OSTREEREFS']
d99e1c67
             self.progress_bar.update_loading_message("Unpacking done")
adde0296
 
 
4d53ba03
         self.deploy_ostree(self.ostree_repo_url, self.ostree_ref)
 
adde0296
         self.run("swapoff -a")
         self.run("rm {}/swapfile".format(self.photon_root))
 
4d53ba03
         commit_number = self.get_commit_number(self.ostree_ref)
         self.do_systemd_tmpfiles_commands(commit_number)
 
         self.mount_devices_in_deployment(commit_number)
         deployment = os.path.join(self.photon_root, "ostree/deploy/photon/deploy/" + commit_number + ".0/")
 
         deployment_boot = os.path.join(deployment, "boot")
         deployment_sysroot = os.path.join(deployment, "sysroot")
 
         self.run("mv {} {}".format(loader1, loader0))
         self.run("mv {} {}".format(boot1, boot0))
         self.run("mv {} {}".format(boot11, boot01))
         self.run("mount --bind {} {}".format(sysroot_boot, deployment_boot))
         self.run("mount --bind {} {}".format(self.photon_root, deployment_sysroot))
         self.run("chroot {} bash -c \"grub2-install /dev/sda\"".format(deployment))
         self.run("chroot {} bash -c \"grub2-mkconfig -o /boot/grub2/grub.cfg\"".format(deployment))
         self.run("mv {} {}".format(loader0, loader1))
         self.run("mv {} {}".format(boot0, boot1))
         self.run("mv {} {}".format(boot01, boot11))
         self.run("chroot {} bash -c \"ostree admin instutil set-kargs root=/dev/sda3 \"".format(deployment))
         sysroot_grub2_grub_cfg = os.path.join(self.photon_root, "boot/grub2/grub.cfg")
         self.run("ln -sf ../loader/grub.cfg {}".format(sysroot_grub2_grub_cfg))
         self.run("mv {} {}".format(loader1, loader0))
         self.run("mv {} {}".format(boot1, boot0))
         self.run("mv {} {}".format(boot11, boot01))
 
 
         deployment_fstab = os.path.join(deployment, "etc/fstab")
c3257e6f
         self.run("echo \"/dev/sda3    /        ext4   defaults   1 1  \" >> {} ".format(deployment_fstab), "Adding / mount point in fstab")
4d53ba03
         self.run("echo \"/dev/sda2    /boot    ext4   defaults   1 2  \" >> {} ".format(deployment_fstab), "Adding /boot mount point in fstab")
         self.run("mount --bind {} {}".format(deployment, self.photon_root))
8a85a8a1
         self.progress_bar.update_loading_message("Starting post install modules")
4d53ba03
         self.execute_modules(modules.commons.POST_INSTALL)
8a85a8a1
         self.progress_bar.update_loading_message("Unmounting disks")
4d53ba03
         self.run("{} {} {}".format(self.unmount_disk_command, '-w', self.photon_root))
8a85a8a1
         self.progress_bar.update_loading_message("Ready to restart")
b0d5288b
         self.progress_bar.hide()
4bc58d36
         self.window.addstr(0, 0, 'Congratulations, Photon RPM-OSTree Host has been installed in {0} secs.\n\nPress any key to continue to boot...'.format(self.progress_bar.time_elapsed))
8a85a8a1
         if self.ks_config == None:
             self.window.content_window().getch()
4d53ba03
         return ActionResult(True, None)