pmbootstrap-meow/pmb/install/install.py
Oliver Smith 32ad868cdc
apk.installed(): Retuns all packages and versions now
pmb.chroot.apk.installed() used to return only the explicitly installed
packages. This is not good enough for the initfs check functions (and
especially for the "lazy reproducible builds", from which branch this
commit was cherry picked).

This commit introduces more noise for the logfile - if this becomes
a problem, raise your voice in the issues tracker and we'll do something
about it.

(This commit also changes minor code styling in other files, I did
not run autopep8 last time, because flake8 didn't complain...)
2017-06-09 18:01:39 +02:00

124 lines
4.4 KiB
Python

"""
Copyright 2017 Oliver Smith
This file is part of pmbootstrap.
pmbootstrap is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
pmbootstrap is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with pmbootstrap. If not, see <http://www.gnu.org/licenses/>.
"""
import logging
import os
import glob
import pmb.chroot
import pmb.chroot.apk
import pmb.config
import pmb.helpers.run
import pmb.install.blockdevice
import pmb.install
def copy_files(args):
# Mount the device rootfs
logging.info("(native) copy rootfs_" + args.device + " to" +
" /mnt/install/")
mountpoint = "/mnt/rootfs_" + args.device
pmb.helpers.mount.bind(args, args.work + "/chroot_rootfs_" + args.device,
args.work + "/chroot_native" + mountpoint)
# Get all folders inside the device rootfs
folders = []
for path in glob.glob(args.work + "/chroot_native" + mountpoint + "/*"):
folders += [os.path.basename(path)]
# Run the copy command
pmb.chroot.root(args, ["cp", "-a"] + folders + ["/mnt/install/"],
working_dir=mountpoint)
# copy over keys and delete unneded mount folders
def fix_mount_folders(args):
# copy over keys
rootfs = args.work + "/chroot_native/mnt/install/"
for key in glob.glob(args.work + "/config_apk_keys/*.pub"):
pmb.helpers.run.root(args, ["cp", key, rootfs + "/etc/apk/keys/"])
# delete everything (-> empty mount folders) in /home/user
pmb.helpers.run.root(args, ["rm", "-r", rootfs + "/home/user"])
pmb.helpers.run.root(args, ["mkdir", rootfs + "/home/user"])
pmb.helpers.run.root(args, ["chown", pmb.config.chroot_uid_user,
rootfs + "/home/user"])
def set_user_password(args):
"""
Loop until the passwords for user and root have been changed successfully.
"""
suffix = "rootfs_" + args.device
while True:
try:
pmb.chroot.root(args, ["passwd", "user"], suffix, log=False)
break
except RuntimeError:
logging.info("WARNING: Failed to set the password. Try it"
" one more time.")
pass
def install(args, show_flash_msg=True):
# Install required programs in native chroot
logging.info("*** (1/5) PREPARE NATIVE CHROOT ***")
pmb.chroot.apk.install(args, pmb.config.install_native_packages,
build=False)
# List all packages to be installed (including the ones specified by --add)
# and upgrade the installed packages/apkindexes
logging.info("*** (2/5) CREATE DEVICE ROOTFS (" + args.device + ") ***")
install_packages = (pmb.config.install_device_packages +
["device-" + args.device])
suffix = "rootfs_" + args.device
pmb.chroot.apk.upgrade(args, suffix)
# Explicitly call build on the install packages, to re-build them or any
# dependency, in case the version increased
if args.add:
install_packages += args.add.split(",")
for pkgname in install_packages:
pmb.build.package(args, pkgname, args.deviceinfo["arch"])
# Install all packages to device rootfs chroot
pmb.chroot.apk.install(args, install_packages, suffix)
set_user_password(args)
# Partition and fill image/sdcard
logging.info("*** (3/5) PREPARE INSTALL BLOCKDEVICE ***")
pmb.chroot.shutdown(args, True)
pmb.install.blockdevice.create(args)
pmb.install.partition(args)
pmb.install.format(args)
# Just copy all the files
logging.info("*** (4/5) FILL INSTALL BLOCKDEVICE ***")
copy_files(args)
fix_mount_folders(args)
pmb.chroot.shutdown(args, True)
# Flash to target device
logging.info("*** (5/5) FLASHING TO DEVICE ***")
if show_flash_msg:
logging.info("Run the following to flash your installation to the"
" target device:")
logging.info("* pmbootstrap flasher flash_kernel")
if not args.sdcard:
logging.info("* pmbootstrap flasher flash_system")