From b4dd7a89d2f1324e6b22a209030dfb107abb5505 Mon Sep 17 00:00:00 2001 From: Pablo Castellano Date: Thu, 12 Oct 2017 22:08:10 +0200 Subject: [PATCH] Close #709: Improve user creation (#725) * Allow to specify a custom username in "pmbootstrap init" * Build chroots have "pmos" instead of "user" as username now * Installation user UID is 1000 now (as in all other Linux distributions) * Adjust autologins * postmarketos-base: enable wheel group for sudo, removed previous sudoers file * Implement safe upgrade path: We save the version of the work folder format now, in $WORK/version. When this file does not exist, it defaults to 0. In case it does not match the currently required version (pmb.config.work_version), then ask the user if it should automatically be upgraded. --- aports/main/postmarketos-base/APKBUILD | 8 +-- .../postmarketos-base.post-install | 6 ++- aports/main/postmarketos-base/sudoers | 2 - aports/main/postmarketos-ui-hildon/APKBUILD | 6 +-- .../postmarketos-ui-hildon.post-install | 2 +- .../postmarketos-ui-hildon/start_hildon.sh | 2 +- aports/main/postmarketos-ui-weston/APKBUILD | 6 +-- .../postmarketos-ui-weston.post-install | 5 +- .../postmarketos-ui-weston/start_weston.sh | 2 +- aports/main/postmarketos-ui-xfce4/APKBUILD | 6 +-- .../postmarketos-ui-xfce4.post-install | 2 +- .../main/postmarketos-ui-xfce4/start_xfce4.sh | 2 +- pmb/__init__.py | 4 ++ pmb/build/buildinfo.py | 4 +- pmb/build/checksum.py | 4 +- pmb/build/init.py | 6 +-- pmb/build/menuconfig.py | 8 +-- pmb/build/other.py | 16 +++--- pmb/build/package.py | 4 +- pmb/chroot/__init__.py | 1 + pmb/chroot/apk.py | 2 +- pmb/chroot/distccd.py | 8 +-- pmb/chroot/init.py | 19 ++++--- pmb/chroot/shutdown.py | 2 +- pmb/chroot/user.py | 14 ++++- pmb/config/__init__.py | 23 ++++++-- pmb/config/init.py | 13 ++++- pmb/export/frontend.py | 2 +- pmb/export/odin.py | 10 ++-- pmb/export/symlinks.py | 2 +- pmb/flasher/frontend.py | 4 +- pmb/flasher/variables.py | 2 +- pmb/helpers/frontend.py | 2 +- pmb/helpers/git.py | 2 +- pmb/helpers/logging.py | 18 ++++--- pmb/helpers/other.py | 54 +++++++++++++++++++ pmb/helpers/repo.py | 2 +- pmb/install/blockdevice.py | 4 +- pmb/install/install.py | 38 ++++++++----- pmb/install/partition.py | 2 +- pmb/install/recovery.py | 4 +- pmb/qemu/run.py | 4 +- test/test_aport_in_sync_with_git.py | 2 +- test/test_challenge_build.py | 2 +- test/test_mount.py | 4 +- 45 files changed, 229 insertions(+), 106 deletions(-) delete mode 100644 aports/main/postmarketos-base/sudoers diff --git a/aports/main/postmarketos-base/APKBUILD b/aports/main/postmarketos-base/APKBUILD index 31301902..1270ffb3 100644 --- a/aports/main/postmarketos-base/APKBUILD +++ b/aports/main/postmarketos-base/APKBUILD @@ -24,7 +24,6 @@ makedepends="" install="$pkgname.post-install" subpackages="$pkgname-x11" source=" - sudoers firmwareload.sh 50-firmware.rules swapfile/swapfile @@ -34,8 +33,6 @@ source=" options="!check" package() { - install -D -m644 "$srcdir"/sudoers \ - "$pkgdir"/etc/sudoers.d/postmarketos install -D -m644 "$srcdir"/50-firmware.rules \ "$pkgdir"/etc/udev/rules.d/50-firmware.rules install -D -m755 "$srcdir"/firmwareload.sh \ @@ -65,10 +62,9 @@ x11() { mkdir "$subpkgdir" } -sha512sums="c6de3b44bc45b9f9c641a7e34c69a481ee39b99ac0251cd28f2b3aae49c1a8d1ca448f4936b7942b1a8b8f7c18a5415c938098765ed8cf08456543800160e64b sudoers -38dc75c0ed32b76dccd3d8e7e8173e8b7d91847cf2b07123f376b95af46b4f89798b24f45302a0726fdc1cf253aecaac140f431735ac5c6511553f790badd0af firmwareload.sh +sha512sums="38dc75c0ed32b76dccd3d8e7e8173e8b7d91847cf2b07123f376b95af46b4f89798b24f45302a0726fdc1cf253aecaac140f431735ac5c6511553f790badd0af firmwareload.sh 0b098828080055d3646ea54891cb0e1b578cbc30f5e16f7284f2814c08192f18079a38fb686d192715ae6a3d2cd6625d9e3cf99f234a6f0d94088bb0cb2ce43d 50-firmware.rules 3ceeee37f558e7c95ad973692b6a437f997e6b46c3d1c2257ddfb1529a5633477373aa123c7f08164e818daae50acb203d151379f27ca11bd458809e6a0d4de7 swapfile f5cc0f1265955d2646e5f099dd4b5d4c287945bfc18c16044db57670d456f55c678fc11cc59e6dab3fa340832ce869d516302a3a35c13518539ed0cedca51819 swapfile.init e0d2d48b82a03239a4c0a00acaf83e00d397c23a8d7c71053d4e2a383357c22dcedef9e81b0e12a1d7514e1fdbe0bb3eb82613d18b29034a7ce5447f13c84a53 swapfile.conf -8b022c5b45d02cbce64137e085838e7d7748b2f3c563faa1a1b02f91472cef96ad254f3f5ee35d80c982d80bd5959ceab0f8127534f7742134ca07a3d595be34 postmarketos-base.post-install" +4f00ad8ce8533fb884b083c094adada26ef845718a229e3ae94986997997297d9bec073babbe8829c29d28aaf31a01ebf28c041395ae7d8631be574b88059e34 postmarketos-base.post-install" diff --git a/aports/main/postmarketos-base/postmarketos-base.post-install b/aports/main/postmarketos-base/postmarketos-base.post-install index 05edfc97..2bb7fadb 100644 --- a/aports/main/postmarketos-base/postmarketos-base.post-install +++ b/aports/main/postmarketos-base/postmarketos-base.post-install @@ -70,5 +70,9 @@ if ! grep -q Dwext /etc/conf.d/wpa_supplicant; then fi touch /etc/wpa_supplicant/wpa_supplicant.conf +# Enable the 'wheel' group +sed -i 's/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers + # Add user to video group for proper framebuffer permissions -usermod -a -G video user +username="$(getent passwd 1000 | cut -d ":" -f 1)" +usermod -a -G video "$username" diff --git a/aports/main/postmarketos-base/sudoers b/aports/main/postmarketos-base/sudoers deleted file mode 100644 index 7124d548..00000000 --- a/aports/main/postmarketos-base/sudoers +++ /dev/null @@ -1,2 +0,0 @@ -# Allow running all commands as root, when the user password is known -user ALL=(ALL) ALL diff --git a/aports/main/postmarketos-ui-hildon/APKBUILD b/aports/main/postmarketos-ui-hildon/APKBUILD index 62530a87..5299d24a 100644 --- a/aports/main/postmarketos-ui-hildon/APKBUILD +++ b/aports/main/postmarketos-ui-hildon/APKBUILD @@ -1,6 +1,6 @@ pkgname=postmarketos-ui-hildon pkgver=1 -pkgrel=0 +pkgrel=1 pkgdesc="Lightweight desktop, optimized for single-touch touchscreen devices" url="https://github.com/postmarketOS" arch="noarch" @@ -29,6 +29,6 @@ package() { install -D -m644 "$srcdir"/xinitrc_hildon.sh \ "$pkgdir"/etc/postmarketos-ui/xinitrc_hildon.sh } -sha512sums="e50c2bd90ef7915278eb5071d3f3ce26794e620617a6d9b2c49a7a1df1da2809437e6d20387bbb61f2ae471c5610ad1e1a30db0d5272f081980764a7c06c221f start_hildon.sh +sha512sums="c75466e0a279da1aec11605b422c0a0d91a6fc38c27cdd819fb277badc84e220bbd8b87b217123b3801411aae0b93f98c6c0b449a5a33fc725bd6279a39d9741 start_hildon.sh 5ef5710bee7bde99e1f240eb8873239c452b55c6dc943930e181d091835824094cf56bf29ae1b34d792ba0ce27f76e30ea69f3c125dda3bf286eaaaba8c8e6ae xinitrc_hildon.sh -a091157afccf19d25dd86d52edf819435da01bb8933f45f5a207e4085b044b80e1790b5e2bb02dbd8f479fdf9d54b06d388a1a1a2995adf9da7d3000449a7f7f postmarketos-ui-hildon.post-install" +64007cebcfbb9d8cdc4db7f889722509e1090af0712802300611fb805e00e1de474e4e6b538d0d99be05ca25f983e94aab57e04b4cc8282ba0ae44609d1a7366 postmarketos-ui-hildon.post-install" diff --git a/aports/main/postmarketos-ui-hildon/postmarketos-ui-hildon.post-install b/aports/main/postmarketos-ui-hildon/postmarketos-ui-hildon.post-install index 5b1ebb7f..c87b4e9b 100644 --- a/aports/main/postmarketos-ui-hildon/postmarketos-ui-hildon.post-install +++ b/aports/main/postmarketos-ui-hildon/postmarketos-ui-hildon.post-install @@ -1,7 +1,7 @@ #!/bin/sh # Autologin on tty1, let busybox autoconfigure 2-6 -autologin="user" +autologin="$(getent passwd 1000 | cut -d ":" -f 1)" for i in 1 2 3 4 5 6; do old="^tty$i::respawn:/sbin/getty 38400 tty$i" new="# tty$i::respawn:/sbin/getty 38400 tty$i" diff --git a/aports/main/postmarketos-ui-hildon/start_hildon.sh b/aports/main/postmarketos-ui-hildon/start_hildon.sh index 1c23af3f..34e608c7 100644 --- a/aports/main/postmarketos-ui-hildon/start_hildon.sh +++ b/aports/main/postmarketos-ui-hildon/start_hildon.sh @@ -4,7 +4,7 @@ # /etc/inittab by postmarketos-base post-install.hook). # This is a temporary solution, we'll need something like a # display manager in the long run (#656). -if [ "$(id -u)" = "12345" ] && [ "$(tty)" = "/dev/tty1" ]; then +if [ "$(id -u)" = "1000" ] && [ "$(tty)" = "/dev/tty1" ]; then # Start X11 with Hildon startx /etc/postmarketos-ui/xinitrc_hildon.sh > ~/x11.log 2>&1 diff --git a/aports/main/postmarketos-ui-weston/APKBUILD b/aports/main/postmarketos-ui-weston/APKBUILD index 51c370f4..78af5dca 100644 --- a/aports/main/postmarketos-ui-weston/APKBUILD +++ b/aports/main/postmarketos-ui-weston/APKBUILD @@ -1,6 +1,6 @@ pkgname=postmarketos-ui-weston pkgver=3 -pkgrel=0 +pkgrel=1 pkgdesc="Meta package for weston" url="https://github.com/postmarketOS" arch="noarch" @@ -18,5 +18,5 @@ package() { install -D -m644 "$srcdir"/start_weston.sh \ "$pkgdir"/etc/profile.d/start_weston.sh } -sha512sums="1fb3dff37e7db7277f713958eeb9b9b8eae730aec2fe02d2c87d036d23b7f3a79779288f5ddf9a3b05465beea5410133fb4b0268b0544a07c08b9d53cdce4745 start_weston.sh -066071c0fa1b35079c28dc18ce66ac56575d49df06f1a217e308ea0b4587436e76432817091737eb9a17e7eecfc855d4d488e5850c77ccbaa3ee4e6a3949dbb8 postmarketos-ui-weston.post-install" +sha512sums="9281ec20d0367d11e8219cc248ebab94194c703fe87e3e4fcbd128d54a67f77d17781b006721a04e5bd3fd4a95616f22a79e88cbdc6d5cc29f86fcfb4fc07755 start_weston.sh +23958764613a14a49b300d7f4c6044fce75d8bdf23c2c5a6e9ffe7228a8fa2d0b2c8188dc0021f56f5c1bc6599d3691ede4e5a5c2a228a09bd7a804ae935bf29 postmarketos-ui-weston.post-install" diff --git a/aports/main/postmarketos-ui-weston/postmarketos-ui-weston.post-install b/aports/main/postmarketos-ui-weston/postmarketos-ui-weston.post-install index a42fd818..d9f16af2 100644 --- a/aports/main/postmarketos-ui-weston/postmarketos-ui-weston.post-install +++ b/aports/main/postmarketos-ui-weston/postmarketos-ui-weston.post-install @@ -39,7 +39,7 @@ if [ ! -f $weston_config ]; then fi # Autologin on tty1, let busybox autoconfigure 2-6 -autologin="user" +autologin="$(getent passwd 1000 | cut -d ":" -f 1)" for i in 1 2 3 4 5 6; do old="^tty$i::respawn:/sbin/getty 38400 tty$i" new="# tty$i::respawn:/sbin/getty 38400 tty$i" @@ -49,4 +49,5 @@ done # Create weston-launch group and add user to it [ $(getent group weston-launch) ] || groupadd weston-launch -usermod -a -G weston-launch user +username="$(getent passwd 1000 | cut -d ":" -f 1)" +usermod -a -G weston-launch "$username" diff --git a/aports/main/postmarketos-ui-weston/start_weston.sh b/aports/main/postmarketos-ui-weston/start_weston.sh index 178c122a..a14260ee 100644 --- a/aports/main/postmarketos-ui-weston/start_weston.sh +++ b/aports/main/postmarketos-ui-weston/start_weston.sh @@ -12,7 +12,7 @@ if test -z "${XDG_RUNTIME_DIR}"; then # Weston autostart on tty1 (Autologin on tty1 is enabled in # /etc/inittab by postmarketos-base post-install.hook) - if [ "$(id -u)" = "12345" ] && [ $(tty) = "/dev/tty1" ]; then + if [ "$(id -u)" = "1000" ] && [ $(tty) = "/dev/tty1" ]; then if test -n "${deviceinfo_weston_pixman_type}"; then WESTON_OPTS=" --pixman-type=${deviceinfo_weston_pixman_type}" fi diff --git a/aports/main/postmarketos-ui-xfce4/APKBUILD b/aports/main/postmarketos-ui-xfce4/APKBUILD index 820a935b..361fa7fe 100644 --- a/aports/main/postmarketos-ui-xfce4/APKBUILD +++ b/aports/main/postmarketos-ui-xfce4/APKBUILD @@ -1,6 +1,6 @@ pkgname=postmarketos-ui-xfce4 pkgver=0.0 -pkgrel=1 +pkgrel=2 pkgdesc="Meta package for xfce4" url="https://github.com/postmarketOS/xfce4-phone" arch="noarch" @@ -18,6 +18,6 @@ package() { install -d -m755 "$pkgdir"/etc/skel cp -a "${srcdir}/xfce4-phone-${pkgver}"/config "$pkgdir"/etc/skel/.config } -sha512sums="6aa496acf16a5348050ed7aca07203f20f4663b37acd63255c31561e0931f90886050aa3c221db2224e3dc357fe5329dc703ec06f5938e7cea8606ad6b741ee6 start_xfce4.sh -86b0d3d83da393aafc5d17552457030d9dfae071a35dbe93125e101361962f1752575f17c7dd4140d2a5c6cd4e09367bb2226b532a0194c26c5a77899e80842f postmarketos-ui-xfce4.post-install +sha512sums="f51d88e1a4f8cd9156e62601c1b2ca40d3c6d7079480888471f21359f417398224722c42677cb28336efc8245d9b6b0851a2d1dc16b9f6c79d48ef284944b8b2 start_xfce4.sh +916f80ebd1ab86c17bb09158ca470bbc53c1fac53771a38e2422672c29cb07fd35906804a5b00eb852e6f1d08abaf31a6db13452765d1cceefc06c57479d3984 postmarketos-ui-xfce4.post-install 758562d2820a11b2c96e1805e00450f78203e6fd224115c373825f041b344985490a84b74d2880b423d5606140d5ffb41e79b0a8eb3e5b9a0ce7874c4ccfb666 postmarketos-ui-xfce4-0.0.tar.gz" diff --git a/aports/main/postmarketos-ui-xfce4/postmarketos-ui-xfce4.post-install b/aports/main/postmarketos-ui-xfce4/postmarketos-ui-xfce4.post-install index f2b48202..ffb794ce 100644 --- a/aports/main/postmarketos-ui-xfce4/postmarketos-ui-xfce4.post-install +++ b/aports/main/postmarketos-ui-xfce4/postmarketos-ui-xfce4.post-install @@ -3,7 +3,7 @@ . /etc/deviceinfo # Autologin on tty1, let busybox autoconfigure 2-6 -autologin="user" +autologin="$(getent passwd 1000 | cut -d ":" -f 1)" for i in 1 2 3 4 5 6; do old="^tty$i::respawn:/sbin/getty 38400 tty$i" new="# tty$i::respawn:/sbin/getty 38400 tty$i" diff --git a/aports/main/postmarketos-ui-xfce4/start_xfce4.sh b/aports/main/postmarketos-ui-xfce4/start_xfce4.sh index 0ce187ef..b935eab9 100644 --- a/aports/main/postmarketos-ui-xfce4/start_xfce4.sh +++ b/aports/main/postmarketos-ui-xfce4/start_xfce4.sh @@ -1,5 +1,5 @@ -if [ "$(id -u)" = "12345" ] && [ "$(tty)" = "/dev/tty1" ]; then +if [ "$(id -u)" = "1000" ] && [ "$(tty)" = "/dev/tty1" ]; then startxfce4 > ~/x11.log 2>&1 # In case of failure, restart after 1s diff --git a/pmb/__init__.py b/pmb/__init__.py index 0a277685..5f47b1a8 100644 --- a/pmb/__init__.py +++ b/pmb/__init__.py @@ -48,6 +48,10 @@ def main(): " 'pmbootstrap init' to generate one.") return 1 + # Migrate work folder if necessary + if args.action not in ["shutdown", "zap", "log"]: + other.migrate_work_folder(args) + # Run the function with the action's name (in pmb/helpers/frontend.py) if args.action: getattr(frontend, args.action)(args) diff --git a/pmb/build/buildinfo.py b/pmb/build/buildinfo.py index 02314673..6f8cf500 100644 --- a/pmb/build/buildinfo.py +++ b/pmb/build/buildinfo.py @@ -69,6 +69,6 @@ def write(args, apk_path, arch, suffix, apkbuild): handle.write(json.dumps(buildinfo, indent=4, sort_keys=True) + "\n") # Move to packages - pmb.chroot.root(args, ["chown", "user:user", "/tmp/buildinfo"]) - pmb.chroot.user(args, ["mv", "/tmp/buildinfo", "/home/user/packages/user/" + + pmb.chroot.root(args, ["chown", "pmos:pmos", "/tmp/buildinfo"]) + pmb.chroot.user(args, ["mv", "/tmp/buildinfo", "/home/pmos/packages/pmos/" + apk_path + ".buildinfo.json"]) diff --git a/pmb/build/checksum.py b/pmb/build/checksum.py index 0708af36..7307eeef 100644 --- a/pmb/build/checksum.py +++ b/pmb/build/checksum.py @@ -29,9 +29,9 @@ def checksum(args, pkgname): pmb.build.copy_to_buildpath(args, pkgname) logging.info("(native) generate checksums for " + pkgname) pmb.chroot.user(args, ["abuild", "checksum"], - working_dir="/home/user/build") + working_dir="/home/pmos/build") # Copy modified APKBUILD back - source = args.work + "/chroot_native/home/user/build/APKBUILD" + source = args.work + "/chroot_native/home/pmos/build/APKBUILD" target = pmb.build.other.find_aport(args, pkgname) + "/" pmb.helpers.run.user(args, ["cp", source, target]) diff --git a/pmb/build/init.py b/pmb/build/init.py index cefa3b61..b3e58084 100644 --- a/pmb/build/init.py +++ b/pmb/build/init.py @@ -42,13 +42,13 @@ def init(args, suffix="native"): # Generate package signing keys chroot = args.work + "/chroot_" + suffix - if not os.path.exists(chroot + "/home/user/.abuild/abuild.conf"): + if not os.path.exists(args.work + "/config_abuild/abuild.conf"): logging.info("(" + suffix + ") generate abuild keys") pmb.chroot.user(args, ["abuild-keygen", "-n", "-q", "-a"], suffix) # Copy package signing key to /etc/apk/keys - for key in glob.glob(chroot + "/home/user/.abuild/*.pub"): + for key in glob.glob(chroot + "/home/pmos/.abuild/*.pub"): key = key[len(chroot):] pmb.chroot.root(args, ["cp", key, "/etc/apk/keys/"], suffix) @@ -75,7 +75,7 @@ def init(args, suffix="native"): pmb.chroot.root(args, ["chmod", "+x", "/usr/local/bin/gzip"], suffix) # Add user to group abuild - pmb.chroot.root(args, ["adduser", "user", "abuild"], suffix) + pmb.chroot.root(args, ["adduser", "pmos", "abuild"], suffix) # abuild.conf: Don't clean the build folder after building, so we can # inspect it afterwards for debugging diff --git a/pmb/build/menuconfig.py b/pmb/build/menuconfig.py index 20568baa..984b8d16 100644 --- a/pmb/build/menuconfig.py +++ b/pmb/build/menuconfig.py @@ -49,10 +49,10 @@ def menuconfig(args, pkgname, arch): # Patch and extract sources pmb.build.copy_to_buildpath(args, pkgname) logging.info("(native) extract kernel source") - pmb.chroot.user(args, ["abuild", "unpack"], "native", "/home/user/build") + pmb.chroot.user(args, ["abuild", "unpack"], "native", "/home/pmos/build") logging.info("(native) apply patches") pmb.chroot.user(args, ["CARCH=" + arch, "abuild", "prepare"], "native", - "/home/user/build", log=False) + "/home/pmos/build", log=False) # Run abuild menuconfig cmd = [] @@ -61,12 +61,12 @@ def menuconfig(args, pkgname, arch): cmd += [key + "=" + value] cmd += ["abuild", "-d", "menuconfig"] logging.info("(native) run menuconfig") - pmb.chroot.user(args, cmd, "native", "/home/user/build", log=False) + pmb.chroot.user(args, cmd, "native", "/home/pmos/build", log=False) # Update config + checksums config = "config-" + apkbuild["_flavor"] + "." + arch logging.info("Copy kernel config back to aport-folder") - source = args.work + "/chroot_native/home/user/build/" + config + source = args.work + "/chroot_native/home/pmos/build/" + config if not os.path.exists(source): raise RuntimeError("No kernel config generated!") target = aport + "/" + config diff --git a/pmb/build/other.py b/pmb/build/other.py index b21df7b3..3b622d4f 100644 --- a/pmb/build/other.py +++ b/pmb/build/other.py @@ -77,15 +77,15 @@ def copy_to_buildpath(args, package, suffix="native"): aport) # Clean up folder - build = args.work + "/chroot_" + suffix + "/home/user/build" + build = args.work + "/chroot_" + suffix + "/home/pmos/build" if os.path.exists(build): - pmb.chroot.root(args, ["rm", "-rf", "/home/user/build"], + pmb.chroot.root(args, ["rm", "-rf", "/home/pmos/build"], suffix=suffix) # Copy aport contents pmb.helpers.run.root(args, ["cp", "-r", aport + "/", build]) - pmb.chroot.root(args, ["chown", "-R", "user:user", - "/home/user/build"], suffix=suffix) + pmb.chroot.root(args, ["chown", "-R", "pmos:pmos", + "/home/pmos/build"], suffix=suffix) def aports_files_out_of_sync_with_git(args, package=None): @@ -247,7 +247,7 @@ def index_repo(args, arch=None): for path in paths: path_arch = os.path.basename(path) - path_repo_chroot = "/home/user/packages/user/" + path_arch + path_repo_chroot = "/home/pmos/packages/pmos/" + path_arch logging.debug("(native) index " + path_arch + " repository") commands = [ ["apk", "-q", "index", "--output", "APKINDEX.tar.gz_", @@ -270,7 +270,7 @@ def symlink_noarch_packages(args): architectures = pmb.config.build_device_architectures logging.debug("Symlink noarch-packages to " + ", ".join(architectures)) for arch in architectures: - arch_folder = "/home/user/packages/user/" + arch + arch_folder = "/mnt/pmbootstrap-packages/" + arch arch_folder_outside = args.work + "/packages/" + arch if not os.path.exists(arch_folder_outside): pmb.chroot.user(args, ["mkdir", "-p", arch_folder]) @@ -280,7 +280,7 @@ def symlink_noarch_packages(args): index = "/tmp/APKINDEX_without_replaced_archs" index_outside = args.work + "/chroot_native" + index pmb.chroot.user(args, ["apk", "-q", "index", "--output", index, "*.apk"], - working_dir="/home/user/packages/user/" + args.arch_native) + working_dir="/mnt/pmbootstrap-packages/" + args.arch_native) # Iterate over noarch packages for package, data in pmb.parse.apkindex.parse(args, index_outside).items(): @@ -292,7 +292,7 @@ def symlink_noarch_packages(args): for arch in architectures: if os.path.exists(args.work + "/packages/" + arch + "/" + apk_file): continue - arch_folder = "/home/user/packages/user/" + arch + arch_folder = "/mnt/pmbootstrap-packages/" + arch source = "../" + args.arch_native + "/" + apk_file pmb.chroot.user(args, ["ln", "-sf", source, "."], working_dir=arch_folder) diff --git a/pmb/build/package.py b/pmb/build/package.py index c6171cb2..6b9be512 100644 --- a/pmb/build/package.py +++ b/pmb/build/package.py @@ -111,7 +111,7 @@ def package(args, pkgname, carch, force=False, buildinfo=False, strict=False): cmd += ["-d"] # do not install depends with abuild if force: cmd += ["-f"] - pmb.chroot.user(args, cmd, suffix, "/home/user/build") + pmb.chroot.user(args, cmd, suffix, "/home/pmos/build") # Verify output file path = args.work + "/packages/" + output @@ -133,6 +133,6 @@ def package(args, pkgname, carch, force=False, buildinfo=False, strict=False): carch_buildenv + "/APKINDEX.tar.gz") if strict: logging.info("(" + suffix + ") uninstall makedepends") - pmb.chroot.user(args, ["abuild", "undeps"], suffix, "/home/user/build") + pmb.chroot.user(args, ["abuild", "undeps"], suffix, "/home/pmos/build") return output diff --git a/pmb/chroot/__init__.py b/pmb/chroot/__init__.py index ba4e740c..4cf3dfcc 100644 --- a/pmb/chroot/__init__.py +++ b/pmb/chroot/__init__.py @@ -20,5 +20,6 @@ from pmb.chroot.init import init from pmb.chroot.mount import mount from pmb.chroot.root import root from pmb.chroot.user import user +from pmb.chroot.user import exists as user_exists from pmb.chroot.shutdown import shutdown from pmb.chroot.zap import zap diff --git a/pmb/chroot/apk.py b/pmb/chroot/apk.py index dd8c870d..a9060702 100644 --- a/pmb/chroot/apk.py +++ b/pmb/chroot/apk.py @@ -171,7 +171,7 @@ def replace_aports_packages_with_path(args, packages, suffix, arch): aport = pmb.build.find_aport(args, package, False) if aport: apkbuild = pmb.parse.apkbuild(args, aport + "/APKBUILD") - apk_path = ("/home/user/packages/user/" + arch + "/" + + apk_path = ("/home/pmos/packages/pmos/" + arch + "/" + package + "-" + apkbuild["pkgver"] + "-r" + apkbuild["pkgrel"] + ".apk") if os.path.exists(args.work + "/chroot_" + suffix + apk_path): diff --git a/pmb/chroot/distccd.py b/pmb/chroot/distccd.py index 33fb8124..a3e38126 100644 --- a/pmb/chroot/distccd.py +++ b/pmb/chroot/distccd.py @@ -29,7 +29,7 @@ def get_running_pid(args): """ :returns: the running distccd's pid as integer or None """ - pidfile = args.work + "/chroot_native/home/user/distccd.pid" + pidfile = args.work + "/chroot_native/home/pmos/distccd.pid" if not os.path.exists(pidfile): return None with open(pidfile, "r") as handle: @@ -74,7 +74,7 @@ def is_running(args): os.kill(pid, 0) except OSError as err: if err.errno == errno.ESRCH: # no such process - pmb.chroot.root(args, ["rm", "/home/user/distccd.pid"]) + pmb.chroot.root(args, ["rm", "/home/pmos/distccd.pid"]) return False elif err.errno == errno.EPERM: # access denied return get_running_info(args) @@ -88,11 +88,11 @@ def generate_cmdline(args, arch): path = "/usr/lib/gcc-cross-wrappers/" + arch + "/bin:" + pmb.config.chroot_path ret = ["PATH=" + path, "distccd", - "--pid-file", "/home/user/distccd.pid", + "--pid-file", "/home/pmos/distccd.pid", "--listen", "127.0.0.1", "--allow", "127.0.0.1", "--port", args.port_distccd, - "--log-file", "/home/user/distccd.log", + "--log-file", "/home/pmos/distccd.log", "--jobs", args.jobs, "--nice", "19", "--job-lifetime", "60", diff --git a/pmb/chroot/init.py b/pmb/chroot/init.py index 7a9ca076..3b7ac84d 100644 --- a/pmb/chroot/init.py +++ b/pmb/chroot/init.py @@ -113,9 +113,16 @@ def init(args, suffix="native"): pmb.chroot.root(args, ["apk", "fix"], suffix, auto_init=False) - # Add user (-D: don't assign password) - logging.debug("Add user") - pmb.chroot.root(args, ["adduser", "-D", "user", "-u", pmb.config.chroot_uid_user], - suffix, auto_init=False) - pmb.chroot.root(args, ["chown", "-R", "user:user", "/home/user"], - suffix) + # Building chroots: create "pmos" user, add symlinks to /home/pmos + if not suffix.startswith("rootfs_"): + pmb.chroot.root(args, ["adduser", "-D", "pmos", "-u", + pmb.config.chroot_uid_user], suffix, auto_init=False) + + # Create the links (with subfolders if necessary) + for target, link_name in pmb.config.chroot_home_symlinks.items(): + link_dir = os.path.dirname(link_name) + if not os.path.exists(chroot + link_dir): + pmb.chroot.user(args, ["mkdir", "-p", link_dir], suffix) + pmb.chroot.user(args, ["ln", "-s", target, link_name], suffix) + pmb.chroot.root(args, ["chown", "pmos:pmos", target], + suffix) diff --git a/pmb/chroot/shutdown.py b/pmb/chroot/shutdown.py index 194edc37..9e7a147a 100644 --- a/pmb/chroot/shutdown.py +++ b/pmb/chroot/shutdown.py @@ -78,7 +78,7 @@ def shutdown(args, only_install_related=False): # Umount all losetup mounted images chroot = args.work + "/chroot_native" if pmb.helpers.mount.ismount(chroot + "/dev/loop-control"): - pattern = chroot + "/home/user/rootfs/*.img" + pattern = chroot + "/home/pmos/rootfs/*.img" for path_outside in glob.glob(pattern): path = path_outside[len(chroot):] pmb.install.losetup.umount(args, path) diff --git a/pmb/chroot/user.py b/pmb/chroot/user.py index edf8d907..6682d409 100644 --- a/pmb/chroot/user.py +++ b/pmb/chroot/user.py @@ -27,6 +27,18 @@ def user(args, cmd, suffix="native", working_dir="/", log=True, :param log: When set to true, redirect all output to the logfile :param auto_init: Automatically initialize the chroot """ - cmd = ["su", "user", "-c", " ".join(cmd)] + cmd = ["su", "pmos", "-c", " ".join(cmd)] return pmb.chroot.root(args, cmd, suffix, working_dir, log, auto_init, return_stdout, check) + + +def exists(args, username, suffix="native"): + """ + Checks if username exists in the system + + :param username: User name + :returns: bool + """ + output = pmb.chroot.root(args, ["getent", "passwd", username], + suffix, return_stdout=True, check=False) + return (output is not None) diff --git a/pmb/config/__init__.py b/pmb/config/__init__.py index 50a4a35f..ed5d5d88 100644 --- a/pmb/config/__init__.py +++ b/pmb/config/__init__.py @@ -39,6 +39,11 @@ apk_keys_path = pmb_src + "/keys" # exploit the system!) apk_tools_static_min_version = "2.7.2-r0" +# Version of the work folder (as asked during 'pmbootstrap init'). Increase +# this number, whenever migration is required and provide the migration code, +# see migrate_work_folder()). +work_version = "1" + # Config file/commandline default values # $WORK gets replaced with the actual value for args.work (which may be # overriden on the commandline) @@ -56,6 +61,7 @@ defaults = { "work": os.path.expanduser("~") + "/.local/var/pmbootstrap", "port_distccd": "33632", "ui": "weston", + "user": "user", "keymap": "", # aes-xts-plain64 would be better, but this is not supported on LineageOS @@ -97,12 +103,21 @@ chroot_host_path = os.environ["PATH"] + ":/usr/sbin/" chroot_mount_bind = { "/proc": "/proc", "$WORK/cache_apk_$ARCH": "/var/cache/apk", - "$WORK/cache_ccache_$ARCH": "/home/user/.ccache", + "$WORK/cache_ccache_$ARCH": "/mnt/pmbootstrap-ccache", "$WORK/cache_distfiles": "/var/cache/distfiles", - "$WORK/cache_git": "/home/user/git", - "$WORK/config_abuild": "/home/user/.abuild", + "$WORK/cache_git": "/mnt/pmbootstrap-git", + "$WORK/config_abuild": "/mnt/pmbootstrap-abuild-config", "$WORK/config_apk_keys": "/etc/apk/keys", - "$WORK/packages": "/home/user/packages/user", + "$WORK/packages": "/mnt/pmbootstrap-packages", +} + +# Building chroots (all chroots, except for the rootfs_ chroot) get symlinks in +# the "pmos" user's home folder pointing to mountfolders from above. +chroot_home_symlinks = { + "/mnt/pmbootstrap-abuild-config": "/home/pmos/.abuild", + "/mnt/pmbootstrap-ccache": "/home/pmos/.ccache", + "/mnt/pmbootstrap-git": "/home/pmos/git", + "/mnt/pmbootstrap-packages": "/home/pmos/packages/pmos", } # The package alpine-base only creates some device nodes. Specify here, which diff --git a/pmb/config/init.py b/pmb/config/init.py index 9ca5bd30..e72e1eca 100644 --- a/pmb/config/init.py +++ b/pmb/config/init.py @@ -41,7 +41,14 @@ def ask_for_work_path(args): try: ret = os.path.expanduser(pmb.helpers.cli.ask( args, "Work path", None, args.work, False)) - os.makedirs(ret, 0o700, True) + + # Create the folder with a version file + if not os.path.exists(ret): + os.makedirs(ret, 0o700, True) + with open(ret + "/version", "w") as handle: + handle.write(pmb.config.work_version + "\n") + + # Make sure, that we can write into it os.makedirs(ret + "/cache_http", 0o700, True) return ret except OSError: @@ -97,6 +104,10 @@ def init(args): if device_exists: cfg["pmbootstrap"]["keymap"] = ask_for_keymaps(args, device=cfg["pmbootstrap"]["device"]) + # Username + cfg["pmbootstrap"]["user"] = pmb.helpers.cli.ask(args, "Username", None, + args.user, False, + "[a-z_][a-z0-9_-]*") # UI and work folder cfg["pmbootstrap"]["ui"] = ask_for_ui(args) cfg["pmbootstrap"]["work"] = ask_for_work_path(args) diff --git a/pmb/export/frontend.py b/pmb/export/frontend.py index 7150d6b6..48aa89a3 100644 --- a/pmb/export/frontend.py +++ b/pmb/export/frontend.py @@ -14,7 +14,7 @@ def frontend(args): pmb.helpers.run.user(args, ["mkdir", "-p", target]) # System image note - img_path = "/home/user/rootfs/" + args.device + ".img" + img_path = "/home/pmos/rootfs/" + args.device + ".img" if not os.path.exists(args.work + "/chroot_native" + img_path): logging.info("NOTE: To export the system image, run 'pmbootstrap" " install' first (without the 'sdcard' parameter).") diff --git a/pmb/export/odin.py b/pmb/export/odin.py index 216ca27c..0210be60 100644 --- a/pmb/export/odin.py +++ b/pmb/export/odin.py @@ -87,15 +87,15 @@ def odin(args, flavor, folder): pmb.chroot.root(args, command, suffix) # Move Odin flashable tar to native chroot and cleanup temp folder - pmb.chroot.user(args, ["mkdir", "-p", "/home/user/rootfs"]) + pmb.chroot.user(args, ["mkdir", "-p", "/home/pmos/rootfs"]) pmb.chroot.root(args, ["mv", "/mnt/rootfs_" + args.device + temp_folder + - "/" + odin_device_tar_md5, "/home/user/rootfs/"]), - pmb.chroot.root(args, ["chown", "user:user", - "/home/user/rootfs/" + odin_device_tar_md5]) + "/" + odin_device_tar_md5, "/home/pmos/rootfs/"]), + pmb.chroot.root(args, ["chown", "pmos:pmos", + "/home/pmos/rootfs/" + odin_device_tar_md5]) pmb.chroot.root(args, ["rmdir", temp_folder], suffix) # Create the symlink - file = args.work + "/chroot_native/home/user/rootfs/" + odin_device_tar_md5 + file = args.work + "/chroot_native/home/pmos/rootfs/" + odin_device_tar_md5 link = folder + "/" + odin_device_tar_md5 pmb.helpers.file.symlink(args, file, link) diff --git a/pmb/export/symlinks.py b/pmb/export/symlinks.py index 609af82c..433e93b8 100644 --- a/pmb/export/symlinks.py +++ b/pmb/export/symlinks.py @@ -49,7 +49,7 @@ def symlinks(args, flavor, folder): path_boot = args.work + "/chroot_rootfs_" + args.device + "/boot" path_buildroot = args.work + "/chroot_buildroot_" + args.deviceinfo["arch"] patterns = [path_boot + "/*-" + flavor, - path_native + "/home/user/rootfs/" + args.device + ".img", + path_native + "/home/pmos/rootfs/" + args.device + ".img", path_buildroot + "/var/lib/postmarketos-android-recovery-installer/pmos-" + args.device + ".zip"] diff --git a/pmb/flasher/frontend.py b/pmb/flasher/frontend.py index 88518267..f2da22a8 100644 --- a/pmb/flasher/frontend.py +++ b/pmb/flasher/frontend.py @@ -52,7 +52,7 @@ def kernel(args): " encryption is disabled):") logging.info("telnet " + pmb.config.default_ip) logging.info("Then you can connect to your device using ssh:") - logging.info("ssh user@" + pmb.config.default_ip) + logging.info("ssh " + args.user + "@" + pmb.config.default_ip) def list_flavors(args): @@ -64,7 +64,7 @@ def list_flavors(args): def system(args): # Generate system image, install flasher - img_path = "/home/user/rootfs/" + args.device + ".img" + img_path = "/home/pmos/rootfs/" + args.device + ".img" if not os.path.exists(args.work + "/chroot_native" + img_path): raise RuntimeError("The system image has not been generated yet," " please run 'pmbootstrap install' first.") diff --git a/pmb/flasher/variables.py b/pmb/flasher/variables.py index 0312cb12..e3505389 100644 --- a/pmb/flasher/variables.py +++ b/pmb/flasher/variables.py @@ -33,7 +33,7 @@ def variables(args, flavor, method): vars = { "$BOOT": "/mnt/rootfs_" + args.device + "/boot", "$FLAVOR": flavor if flavor is not None else "", - "$IMAGE": "/home/user/rootfs/" + args.device + ".img", + "$IMAGE": "/home/pmos/rootfs/" + args.device + ".img", "$KERNEL_CMDLINE": _cmdline, "$PARTITION_KERNEL": args.deviceinfo["flash_heimdall_partition_kernel"] or "KERNEL", "$PARTITION_INITFS": args.deviceinfo["flash_heimdall_partition_initfs"] or "RECOVERY", diff --git a/pmb/helpers/frontend.py b/pmb/helpers/frontend.py index f51259e2..6c154e87 100644 --- a/pmb/helpers/frontend.py +++ b/pmb/helpers/frontend.py @@ -209,7 +209,7 @@ def log(args): def log_distccd(args): - logpath = "/home/user/distccd.log" + logpath = "/home/pmos/distccd.log" if args.clear_log: pmb.chroot.user(args, ["truncate", "-s", "0", logpath], log=False) pmb.chroot.user(args, ["tail", "-f", logpath, "-n", args.lines], log=False) diff --git a/pmb/helpers/git.py b/pmb/helpers/git.py index a14cb044..3f2516bc 100644 --- a/pmb/helpers/git.py +++ b/pmb/helpers/git.py @@ -33,7 +33,7 @@ def clone(args, repo_name): pmb.chroot.apk.install(args, ["git"]) logging.info("(native) git clone " + pmb.config.git_repos[repo_name]) pmb.chroot.user(args, ["git", "clone", "--depth=1", - pmb.config.git_repos[repo_name], repo_name], working_dir="/home/user/git/") + pmb.config.git_repos[repo_name], repo_name], working_dir="/home/pmos/git/") def rev_parse(args, revision="HEAD"): diff --git a/pmb/helpers/logging.py b/pmb/helpers/logging.py index d92172b8..a90255fd 100644 --- a/pmb/helpers/logging.py +++ b/pmb/helpers/logging.py @@ -74,15 +74,21 @@ def init(args): Set log format and add the log file descriptor to args.logfd, add the verbose log level. """ - # Create work folder (because usually the log file is in there) - if not os.path.exists(args.work): - os.makedirs(args.work) - - # Open logfile + # Set log file descriptor (logfd) if args.details_to_stdout: setattr(args, "logfd", sys.stdout) else: - setattr(args, "logfd", open(args.log, "a+")) + # Require containing directory to exist (so we don't create the work + # folder and break the folder migration logic, which needs to set the + # version upon creation) + dir = os.path.dirname(args.log) + if os.path.exists(dir): + setattr(args, "logfd", open(args.log, "a+")) + else: + setattr(args, "logfd", open(os.devnull, "a+")) + if args.action != "init": + print("WARNING: Can't create log file in '" + dir + "', path" + " does not exist!") # Set log format root_logger = logging.getLogger() diff --git a/pmb/helpers/other.py b/pmb/helpers/other.py index a922c184..9eee8bb8 100644 --- a/pmb/helpers/other.py +++ b/pmb/helpers/other.py @@ -17,6 +17,9 @@ You should have received a copy of the GNU General Public License along with pmbootstrap. If not, see . """ import os +import logging +import pmb.chroot +import pmb.config import pmb.helpers.run @@ -53,3 +56,54 @@ def check_grsec(args): " Alternatively, it would be awesome if you want to add" " support for hardened/grsec kernels, please see this for" " more details: <" + link + ">") + + +def migrate_success(args): + logging.info("Migration done") + with open(args.work + "/version", "w") as handle: + handle.write(pmb.config.work_version + "\n") + + +def migrate_work_folder(args): + # Read current version + current = "0" + path = args.work + "/version" + if os.path.exists(path): + with open(path, "r") as f: + current = f.read().rstrip() + + # Compare version, print warning or do nothing + required = pmb.config.work_version + if current == required: + return + logging.info("WARNING: Your work folder version needs to be migrated" + " (from version " + current + " to " + required + ")!") + + # 0 => 1 + if current == "0" and required == "1": + # Ask for confirmation + logging.info("Changelog:") + logging.info("* Building chroots have a different username: " + "") + logging.info("Migration will do the following:") + logging.info("* Zap your chroots") + logging.info("* Adjust '" + args.work + "/config_abuild/abuild.conf'") + if not pmb.helpers.cli.confirm(args): + raise RuntimeError("Aborted.") + + # Zap and update abuild.conf + pmb.chroot.zap(args, False) + conf = args.work + "/config_abuild/abuild.conf" + if os.path.exists(conf): + pmb.helpers.run.root(args, ["sed", "-i", + "s./home/user/./home/pmos/.g", conf]) + # Update version file + migrate_success(args) + return + + # Can't migrate, user must delete it + raise RuntimeError("Sorry, we can't migrate that automatically. Please run" + " 'pmbootstrap shutdown', then delete your current work" + " folder manually ('sudo rm -rf " + args.work + + "') and start over with 'pmbootstrap init'. All your" + " binary packages will be lost.") diff --git a/pmb/helpers/repo.py b/pmb/helpers/repo.py index 0d4ad0b5..5df984e4 100644 --- a/pmb/helpers/repo.py +++ b/pmb/helpers/repo.py @@ -101,7 +101,7 @@ def urls(args, user_repository=True, postmarketos_mirror=True): ret = [] # Local user repository (for packages compiled with pmbootstrap) if user_repository: - ret.append("/home/user/packages/user") + ret.append("/mnt/pmbootstrap-packages") # Upstream postmarketOS binary repository if postmarketos_mirror and args.mirror_postmarketos: diff --git a/pmb/install/blockdevice.py b/pmb/install/blockdevice.py index dc60ebe7..3c11ecee 100644 --- a/pmb/install/blockdevice.py +++ b/pmb/install/blockdevice.py @@ -54,7 +54,7 @@ def create_and_mount_image(args, size): """ # Short variables for paths chroot = args.work + "/chroot_native" - img_path = "/home/user/rootfs/" + args.device + ".img" + img_path = "/home/pmos/rootfs/" + args.device + ".img" img_path_outside = chroot + img_path # Umount and delete existing image @@ -76,7 +76,7 @@ def create_and_mount_image(args, size): raise RuntimeError("Aborted.") # Create empty image file - pmb.chroot.user(args, ["mkdir", "-p", "/home/user/rootfs"]) + pmb.chroot.user(args, ["mkdir", "-p", "/home/pmos/rootfs"]) pmb.chroot.root(args, ["truncate", "-s", mb, img_path]) # Mount to /dev/install diff --git a/pmb/install/install.py b/pmb/install/install.py index 812fb9bd..682b2216 100644 --- a/pmb/install/install.py +++ b/pmb/install/install.py @@ -92,29 +92,40 @@ def copy_files_from_chroot(args): def copy_files_other(args): """ - Copy over keys, create /home/user. + Copy over keys, create /home/{user}. """ # 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/"]) - # Create /home/user + # Create /home/{user} + homedir = rootfs + "/home/" + args.user pmb.helpers.run.root(args, ["mkdir", rootfs + "/home"]) - pmb.helpers.run.root(args, ["cp", "-a", rootfs + "/etc/skel", rootfs + "/home/user"]) - pmb.helpers.run.root(args, ["chown", "-R", pmb.config.chroot_uid_user, - rootfs + "/home/user"]) + pmb.helpers.run.root(args, ["cp", "-a", rootfs + "/etc/skel", homedir]) + pmb.helpers.run.root(args, ["chown", "-R", "1000", homedir]) + + +def set_user(args): + """ + Create user with UID 1000 if it doesn't exist + """ + suffix = "rootfs_" + args.device + if not pmb.chroot.user_exists(args, args.user, suffix): + pmb.chroot.root(args, ["adduser", "-D", "-u", "1000", args.user], + suffix) + pmb.chroot.root(args, ["addgroup", args.user, "wheel"], suffix) def set_user_password(args): """ Loop until the passwords for user and root have been changed successfully. """ - logging.info(" *** SET LOGIN PASSWORD FOR: 'user' ***") + logging.info(" *** SET LOGIN PASSWORD FOR: '" + args.user + "' ***") suffix = "rootfs_" + args.device while True: try: - pmb.chroot.root(args, ["passwd", "user"], suffix, log=False) + pmb.chroot.root(args, ["passwd", args.user], suffix, log=False) break except RuntimeError: logging.info("WARNING: Failed to set the password. Try it" @@ -147,12 +158,12 @@ def copy_ssh_key(args): outfile.write("%s" % key) outfile.close() - target = args.work + "/chroot_native/mnt/install/home/user/.ssh" + target = args.work + "/chroot_native/mnt/install/home/" + args.user + "/.ssh" pmb.helpers.run.root(args, ["mkdir", target]) pmb.helpers.run.root(args, ["chmod", "700", target]) pmb.helpers.run.root(args, ["cp", authorized_keys, target + "/authorized_keys"]) pmb.helpers.run.root(args, ["rm", authorized_keys]) - pmb.helpers.run.root(args, ["chown", "-R", "12345:12345", target]) + pmb.helpers.run.root(args, ["chown", "-R", "1000:1000", target]) def setup_keymap(args): @@ -199,9 +210,9 @@ def install_system_image(args): sys_image = args.device + ".img" sys_image_sparse = args.device + "-sparse.img" pmb.chroot.user(args, ["img2simg", sys_image, sys_image_sparse], - working_dir="/home/user/rootfs/") + working_dir="/home/pmos/rootfs/") pmb.chroot.user(args, ["mv", "-f", sys_image_sparse, sys_image], - working_dir="/home/user/rootfs/") + working_dir="/home/pmos/rootfs/") # Kernel flash information logging.info("*** (5/5) FLASHING TO DEVICE ***") @@ -223,7 +234,7 @@ def install_system_image(args): logging.info("* pmbootstrap flasher flash_system") logging.info(" Flashes the system image, that has been" " generated to your device:") - logging.info(" " + args.work + "/chroot_native/home/user/rootfs/" + + logging.info(" " + args.work + "/chroot_native/home/pmos/rootfs/" + args.device + ".img") logging.info(" (NOTE: This file has a partition table," " which contains a boot- and root subpartition.)") @@ -273,6 +284,9 @@ def install(args): suffix = "rootfs_" + args.device pmb.chroot.apk.upgrade(args, suffix) + # Create final user and remove 'build' user + set_user(args) + # Explicitly call build on the install packages, to re-build them or any # dependency, in case the version increased if args.extra_packages.lower() != "none": diff --git a/pmb/install/partition.py b/pmb/install/partition.py index c9d12475..487baea2 100644 --- a/pmb/install/partition.py +++ b/pmb/install/partition.py @@ -30,7 +30,7 @@ def partitions_mount(args): """ prefix = args.sdcard if not args.sdcard: - img_path = "/home/user/rootfs/" + args.device + ".img" + img_path = "/home/pmos/rootfs/" + args.device + ".img" prefix = pmb.install.losetup.device_by_back_file(args, img_path) partition_prefix = None diff --git a/pmb/install/recovery.py b/pmb/install/recovery.py index 75ad5b78..76c89f3d 100644 --- a/pmb/install/recovery.py +++ b/pmb/install/recovery.py @@ -66,8 +66,8 @@ def create_zip(args, suffix): # Move config file from /tmp/ to zip root ["mv", "/tmp/install_options", "install_options"], # Create tar archive of the rootfs - ["tar", "-pczf", "rootfs.tar.gz", "--exclude", "./home/user/*", - "-C", rootfs, "."], + ["tar", "-pczf", "rootfs.tar.gz", "--exclude", + "./home/" + args.user + "/*", "-C", rootfs, "."], ["build-recovery-zip"]] for command in commands: pmb.chroot.root(args, command, suffix, working_dir=zip_root) diff --git a/pmb/qemu/run.py b/pmb/qemu/run.py index bb662889..2918291e 100644 --- a/pmb/qemu/run.py +++ b/pmb/qemu/run.py @@ -37,7 +37,7 @@ def system_image(args, device): Returns path to system image for specified device. In case that it doesn't exist, raise and exception explaining how to generate it. """ - path = args.work + "/chroot_native/home/user/rootfs/" + device + ".img" + path = args.work + "/chroot_native/home/pmos/rootfs/" + device + ".img" if not os.path.exists(path): logging.debug("Could not find system image: " + path) img_command = "pmbootstrap install" @@ -253,7 +253,7 @@ def run(args): print() logging.info("You can connect to the virtual machine using the" " following services:") - logging.info("(ssh) ssh -p " + str(args.port) + " user@localhost") + logging.info("(ssh) ssh -p {port} {user}@localhost".format(**vars(args))) logging.info("(telnet) telnet localhost " + str(args.port + 1)) logging.info("(telnet debug) telnet localhost " + str(args.port + 2)) diff --git a/test/test_aport_in_sync_with_git.py b/test/test_aport_in_sync_with_git.py index 52bf2b59..1e41f26d 100644 --- a/test/test_aport_in_sync_with_git.py +++ b/test/test_aport_in_sync_with_git.py @@ -56,7 +56,7 @@ def temp_aports_repo(args): # aports_upstream repo also gets used in test_aportgen.py, so we use that. pmb.chroot.apk.install(args, ["git"]) pmb.helpers.git.clone(args, "aports_upstream") - pmb.chroot.user(args, ["cp", "-r", "/home/user/git/aports_upstream", + pmb.chroot.user(args, ["cp", "-r", "/home/pmos/git/aports_upstream", temp + "/aports"]) # Configure git diff --git a/test/test_challenge_build.py b/test/test_challenge_build.py index 3171e9cf..4c1fbfb7 100644 --- a/test/test_challenge_build.py +++ b/test/test_challenge_build.py @@ -52,7 +52,7 @@ def test_challenge_build(args): version = apkbuild["pkgver"] + "-r" + apkbuild["pkgrel"] temp_path = pmb.chroot.other.tempfolder(args, "/tmp/test_challenge_build/" + args.arch_native) - packages_path = "/home/user/packages/user/" + args.arch_native + packages_path = "/home/pmos/packages/pmos/" + args.arch_native apk_path = packages_path + "/" + pkgname + "-" + version + ".apk" pmb.chroot.user(args, ["cp", apk_path, apk_path + ".buildinfo.json", temp_path]) diff --git a/test/test_mount.py b/test/test_mount.py index dee6f9de..75b39fde 100644 --- a/test/test_mount.py +++ b/test/test_mount.py @@ -30,7 +30,7 @@ def test_umount_all_list(tmpdir): fake_mounts = str(tmpdir + "/mounts") with open(fake_mounts, "w") as handle: handle.write("source /test/var/cache\n") - handle.write("source /test/home/user/packages\n") + handle.write("source /test/home/pmos/packages\n") handle.write("source /test\n") handle.write("source /test/proc\n") @@ -41,5 +41,5 @@ def test_umount_all_list(tmpdir): assert ret == ["/test/var/cache"] ret = pmb.helpers.mount.umount_all_list("/test", fake_mounts) - assert ret == ["/test/var/cache", "/test/proc", "/test/home/user/packages", + assert ret == ["/test/var/cache", "/test/proc", "/test/home/pmos/packages", "/test"]