Compare commits

...

85 commits

Author SHA1 Message Date
Bernhard Landauer
7ca3b8784f
Merge pull request #279 from BTaskaya/master
Indentation Fixment in bin/mkchroot.in
2018-04-15 22:46:35 +00:00
Bernhard Landauer
702a7b9056 Revert "update iso lists"
This reverts commit 00c88dd7e8.
2018-04-11 23:45:08 +02:00
Bernhard Landauer
c87603c348 Revert "[deployiso] adjust to osdn.net"
This reverts commit fdcd8183e5.
2018-04-11 23:44:42 +02:00
Bernhard Landauer
fdcd8183e5 [deployiso] adjust to osdn.net 2018-04-11 23:40:23 +02:00
Bernhard Landauer
00c88dd7e8 update iso lists 2018-04-11 22:50:48 +02:00
Ste74
277ec0ca3c Revert last commit
Signed-off-by: Ste74 <stefano@manjaro.org>
2018-03-18 19:26:04 +01:00
Stefano Capitani
2612c97ed2
Merge pull request #284 from fhdk/master
Now it works as expected
2018-03-18 19:02:23 +01:00
Frede H
c390da8e34
Update util.sh 2018-03-18 19:01:26 +01:00
Frede H
2bc40b009e
Update util-iso.sh 2018-03-18 18:50:49 +01:00
Frede H
3aecbad7dc
Update util.sh 2018-03-18 18:48:58 +01:00
Stefano Capitani
59e04fc4d1
Merge pull request #282 from fhdk/master
Option to override `extra` option in profile
2018-03-18 18:24:07 +01:00
fhdk
266b8db157 -f build full_iso instead of -n no_extra 2018-03-18 18:11:17 +01:00
Frede H
c2933bb143
Update util-iso.sh
moved the minimal addition xxx-${dist_release}-unstable-minimal-${arch}
2018-03-18 14:12:46 +01:00
Frede H
610a63117e
Update util-iso.sh
fix : to ;
2018-03-18 14:09:22 +01:00
Frede H
acb144f1e3
Update buildiso.in
removed extra from verbose
2018-03-18 13:48:45 +01:00
fhdk
50f39a3b23 no_extra option added 2018-03-18 13:42:00 +01:00
Batuhan Osman Taşkaya
1c19cdd95c
Indentation Fixment in bin/mkchroot.in
Indentation Fixment in bin/mkchroot.in
2018-01-09 21:14:42 +03:00
Bernhard Landauer
369cb4b3e5 workaround locale errors 2017-09-04 04:52:45 +02:00
Philip Müller
d902379ade Merge pull request #274 from elishl/patch-1
Allow for site redirection
2017-08-25 12:44:19 +01:00
elishl
0a2f73993d Allow for site redirection
Sites (like sourceforge.com) use redirection.
The added parameter will take that into account.
2017-08-24 23:10:27 +03:00
Philip Müller
e85da8518c Merge pull request #272 from elishl/master
Reduce RAM usage for HTTP PXE boot
2017-07-03 10:48:31 +02:00
elishl
71e948ded2 Update miso 2017-07-02 17:20:22 +03:00
Bernhard Landauer
5f5b541a3c rm existing .sig file to avoid corrupted signature
https://forum.manjaro.org/t/troubleshooting-signature-errors-with-boxit/26178/
2017-06-24 03:09:39 +02:00
Philip Müller
5704e623e0 Merge pull request #271 from manjaro/revert-269-patch-2
Revert "Update pacman-multilib.conf"
2017-06-11 09:32:28 +02:00
Philip Müller
1c357b69ce Revert "Update pacman-multilib.conf" 2017-06-11 09:32:21 +02:00
Philip Müller
b5b6000852 Merge pull request #269 from Ste74/patch-2
Adjust pacman-multilib.conf
2017-06-11 09:27:15 +02:00
Philip
470773a9ce [util.sh] update os-release path 2017-06-09 09:43:48 +02:00
Stefano Capitani
620fe0655a Update pacman-multilib.conf
Same
2017-06-06 17:32:30 +02:00
udeved
22a3c4221b util-iso-chroot: clean up copy_from_cache() 2017-05-10 14:49:36 +02:00
udeved
e1b82cec3a util-iso-chroot: fix copy_from_cache(); fix svc config 2017-05-10 12:17:44 +02:00
udeved
913b9d874c util-iso-mount: clean up 2017-05-09 22:54:50 +02:00
udeved
1702ed7aea util-iso-chroot: fix typo 2017-05-09 22:54:30 +02:00
udeved
5f06a4dd5d util-iso-mount: use only one overlay mount function 2017-05-09 22:22:01 +02:00
udeved
bb34a7f6d0 util-iso-chroot: use local vars for params 2017-05-09 22:21:28 +02:00
udeved
8046b1f4b1 buildiso: unify chroot locking 2017-05-08 18:19:36 +02:00
udeved
984d5adde4 doc: update buildpkg 2017-05-08 01:18:52 +02:00
udeved
3278c1df91 buildiso: reestore default error handling 2017-05-08 01:09:47 +02:00
udeved
ab5d0deb47 Merge branch 'master' of github.com:manjaro/manjaro-tools 2017-05-08 00:48:22 +02:00
udeved
d734e5457c remove buildlist display 2017-05-08 00:47:29 +02:00
Philip
1648288c9f [util-yaml] work on CAL#695
- see also: https://github.com/calamares/calamares/issues/695
2017-05-07 22:08:33 +02:00
udeved
94fcd520c5 util-iso: rename local vars to be more descriptive 2017-05-07 16:59:58 +02:00
udeved
aef651518a buildpkg & buildiso: move mkchroot_args 2017-05-07 13:46:13 +02:00
udeved
15cfc351e8 util-iso-chroot: rm obsolete lock 2017-05-06 15:56:45 +02:00
udeved
59294cf2a7 update mt.conf
update readme
2017-05-06 15:56:15 +02:00
udeved
95f296acde lib: set tmp_dir=/tmp 2017-05-06 15:49:39 +02:00
elishl
aa84e639a3 Corrections for PXE boot (#266)
* Correction for a faulty condition

The current condition works for checking existence of the .sfs files on the local file system.
The proposed condition checks for the existence of the .sfs files on a remote server.

* Correction for NFS & NBD & HTTP boot

By default, Calamares searches for the .sfs files in the "bootmnt" directory.
When "copytoram==y" (relevant for NFS & NBD & HTTP boot), the .sfs files are stored in the "copytoram" directory.
The proposed code binds the "copytoram" dir with "bootmnt" so Calamares can "see" the .sfs. files.
2017-05-06 14:38:13 +02:00
udeved
1b50455b51 Merge branch 'master' of github.com:manjaro/manjaro-tools 2017-05-06 09:57:25 +02:00
udeved
254bcfd10f check-yaml: move tmp_dir creation 2017-05-06 09:57:01 +02:00
Nate
0b5482f7f0 Added spaces between hashes and the text (#265)
Most (if not all) of the headers in this document were missing a space between the text and the hashes. This was causing problems. By adding these spaces, the headers will get rendered correctly.
2017-05-05 10:39:36 +02:00
udeved
6f00ee26bb update readme 2017-05-04 18:24:41 +02:00
udeved
21d5a1a0d6 buildpkg: clean proper dir 2017-05-04 18:10:06 +02:00
udeved
1d3003ecd9 buildpkg & buildiso: several fixes 2017-04-30 09:13:19 +02:00
udeved
a8c3d88d8c use shared create_chroot() and delete_chroot code in mkchrootpkg, buildpkg and buildiso 2017-04-29 22:19:23 +02:00
udeved
333d307a44 buildiso: remove obsolete load_profile() 2017-04-28 11:29:40 +02:00
udeved
ad7715c3b6 buildiso: add prepare_build() 2017-04-28 10:30:34 +02:00
udeved
7fdcb0fcb3 util-pkg-chroot: shorten group loading 2017-04-28 02:39:11 +02:00
udeved
7aa3c071eb buildpkg: simplfy devel group loading
util-*-chroot: small fixes
2017-04-28 00:30:12 +02:00
udeved
711397a74c update readme 2017-04-27 18:42:42 +02:00
udeved
952f516389 util-*-chroot: minor changes 2017-04-27 15:13:22 +02:00
udeved
28c6d649aa util-iso: import util-chroot 2017-04-27 12:01:26 +02:00
udeved
d84f30aa08 buildpkg: make chroot creation and handling more convenient 2017-04-27 10:55:47 +02:00
udeved
69445b01f5 util-*-chroot: update chroot_clean() 2017-04-26 22:56:49 +02:00
udeved
3828892808 signfile, checkpkg: add load_user_info() 2017-04-20 15:24:23 +02:00
udeved
17b8b418ab mt: reorganize libs 2017-04-19 21:55:43 +02:00
udeved
ecf8a998dc start mt-0.16 2017-04-19 21:30:01 +02:00
udeved
470e64b563 mt: use xdg_config_home for mt.conf and makepkg.conf 2017-04-19 20:37:01 +02:00
udeved
ad13419fbe fstabgen: correct help msg 2017-04-19 19:02:58 +02:00
udeved
c225d41f87 fstabgen, basestrap: backport minor arch changes 2017-04-19 15:29:12 +02:00
artoo
ed8de0f88d Arch patch (#264)
* initial arch backport

* fix args

* chroot-run: remove commented code
mkchrootpkg: update help

* lib: nove lock functions to util-msg

* mkchrootpkg: fix namcap, should go upstream
2017-04-19 08:58:04 +02:00
udeved
bf2ddc1e1d util-iso-boot: fix param 2017-04-02 17:56:23 +02:00
udeved
d455564eb6 util-iso-boot: make the copy paths more structured 2017-04-02 16:56:52 +02:00
Philip
a4fc8325df [util-iso-boot] really proper last commit 2017-04-02 15:00:12 +02:00
Philip
b121fe7490 [util-iso-boot] proper last commit 2017-04-02 14:53:35 +02:00
Philip
518992d723 [util-iso-boot] fix issue with i686 build on x86_64 host 2017-04-02 14:47:21 +02:00
udeved
a1492e8d1e util-iso: set the grub theme by $iso_name 2017-03-31 17:45:16 +02:00
udeved
25ddeb1593 doc: remove obsolete entry from deployiso
util-yaml: formating fix
2017-03-30 23:21:17 +02:00
udeved
37b9feb061 util-iso: clean up assemble_iso() 2017-03-30 23:07:09 +02:00
udeved
93626731c7 util-iso-boot: remove grub video dir 2017-03-30 15:51:44 +02:00
Philip
9533b8ce93 [util-iso] try to fix issue with efi.img 2017-03-30 00:34:24 +02:00
udeved
ed95e249a2 util-iso: don't create mod_dte file for now 2017-03-29 22:19:44 +02:00
udeved
8a5fc4e0b0 util-iso: fox mod_date length 2017-03-29 21:53:47 +02:00
udeved
734ea24b57 util-iso: readd xorriso args 2017-03-29 21:48:38 +02:00
udeved
d477c42ecb util-iso-boot: reduce efi.img size 2017-03-29 21:48:00 +02:00
udeved
92aaea7694 util-iso-*: put grub-theme in livefs 2017-03-29 20:47:17 +02:00
udeved
187aac2a35 util-iso: try to fix uefi usb boot 2017-03-29 19:03:29 +02:00
32 changed files with 1448 additions and 1429 deletions

View file

@ -1,4 +1,4 @@
Version=0.15.0 Version=0.16.0
PREFIX = /usr/local PREFIX = /usr/local
SYSCONFDIR = /etc SYSCONFDIR = /etc
@ -18,6 +18,7 @@ LIBS_BASE = \
lib/util.sh \ lib/util.sh \
lib/util-mount.sh \ lib/util-mount.sh \
lib/util-msg.sh \ lib/util-msg.sh \
lib/util-chroot.sh \
lib/util-fstab.sh lib/util-fstab.sh
SHARED_BASE = \ SHARED_BASE = \

View file

@ -1,11 +1,9 @@
manjaro-tools manjaro-tools
============= =============
Manjaro-tools-0.14
User manual User manual
###1. manjaro-tools.conf ### 1. manjaro-tools.conf
manjaro-tools.conf is the central configuration file for manjaro-tools. manjaro-tools.conf is the central configuration file for manjaro-tools.
By default, the config is installed in By default, the config is installed in
@ -65,9 +63,6 @@ overriding
# build dir where buildpkg or buildiso chroots are created # build dir where buildpkg or buildiso chroots are created
# chroots_dir=/var/lib/manjaro-tools # chroots_dir=/var/lib/manjaro-tools
# log dir where log files are created
# log_dir='/var/log/manjaro-tools'
# custom build mirror server # custom build mirror server
# build_mirror=http://mirror.netzspielplatz.de/manjaro/packages # build_mirror=http://mirror.netzspielplatz.de/manjaro/packages
@ -124,34 +119,37 @@ overriding
# iso_mirrors=('heanet' 'jaist' 'netcologne' 'iweb' 'kent') # iso_mirrors=('heanet' 'jaist' 'netcologne' 'iweb' 'kent')
~~~ ~~~
###2. buildpkg ### 2. buildpkg
buildpkg is the chroot build script of manjaro-tools. buildpkg is the chroot build script of manjaro-tools.
It it run in a abs/pkgbuilds directory which contains directories with PKGBUILD. It it run in a abs/pkgbuilds directory which contains directories with PKGBUILD.
######manjaro-tools.conf supports the makepkg.conf variables ###### manjaro-tools.conf supports the makepkg.conf variables
####Arguments #### Arguments
~~~ ~~~
$ buildpkg -h $ buildpkg -h
Usage: buildpkg [options] Usage: buildpkg [options]
-p <pkg> Buildset or pkg [default: default] -p <pkg> Build list or pkg [default: default]
-a <arch> Arch [default: auto] -a <arch> Arch [default: auto]
-b <branch> Branch [default: stable] -b <branch> Branch [default: stable]
-r <dir> Chroots directory -r <dir> Chroots directory
[default: /var/lib/manjaro-tools/buildpkg] [default: /var/lib/manjaro-tools/buildpkg]
-i <pkg> Install a package into the working copy of the chroot -i <pkgs> Install packages into the working copy of the chroot
-c Recreate chroot -o Create chroot
-d Delete chroot
-c Clean chroot copy
-u Update chroot copy
-w Clean up cache and sources -w Clean up cache and sources
-n Install and run namcap check -n Install and run namcap check
-s Sign packages -s Sign packages
-u udev base-devel group (no systemd) -x Udev base-devel group (no systemd)
-q Query settings and pretend build -q Query settings and pretend build
-h This help -h This help
~~~ ~~~
######* build sysvinit package for both arches and branch testing: ###### * build sysvinit package for both arches and branch testing:
* i686(buildsystem is x86_64) * i686(buildsystem is x86_64)
@ -168,32 +166,32 @@ buildpkg -p sysvinit -b testing -cswn
You can drop the branch arg if you set the branch in manjaro-tools.conf You can drop the branch arg if you set the branch in manjaro-tools.conf
The arch can also be set in manjaro-tools.conf, but under normal conditions, it is better to specify the non native arch by -a parameter. The arch can also be set in manjaro-tools.conf, but under normal conditions, it is better to specify the non native arch by -a parameter.
######* -c ###### * -c
* Removes the chroot dir * Removes the chroot dir
* If the -c parameter is not used, buildpkg will update the existing chroot or create a new one if none is present. * If the -c parameter is not used, buildpkg will update the existing chroot or create a new one if none is present.
######* -w ###### * -w
* Cleans pkgcache, and logfiles * Cleans pkgcache, and logfiles
######* -s ###### * -s
* Signs the package when built * Signs the package when built
######* -n ###### * -n
* Installs the built package in the chroot and runs a namcap check * Installs the built package in the chroot and runs a namcap check
######* -u ###### * -u
* Create udev build root (for eudev builds) * Create udev build root (for eudev builds)
###3. buildiso ### 3. buildiso
buildiso is used to build manjaro-iso-profiles. It is run insde the profiles folder. buildiso is used to build manjaro-iso-profiles. It is run insde the profiles folder.
#####Packages for livecd only: ##### Packages for livecd only:
* manjaro-livecd-openrc * manjaro-livecd-openrc
* manjaro-livecd-systemd * manjaro-livecd-systemd
####Arguments #### Arguments
~~~ ~~~
$ buildiso -h $ buildiso -h
@ -221,7 +219,7 @@ Usage: buildiso [options]
-h This help -h This help
~~~ ~~~
######* build xfce iso profile for both arches and branch testing on x86_64 build system ###### * build xfce iso profile for both arches and branch testing on x86_64 build system
* i686 (buildsystem is x86_64) * i686 (buildsystem is x86_64)
@ -237,16 +235,16 @@ buildiso -p xfce -b testing
The branch can be defined also in manjaro-tools.conf, but a manual parameter will always override conf settings. The branch can be defined also in manjaro-tools.conf, but a manual parameter will always override conf settings.
####Special parameters #### Special parameters
######* -x ###### * -x
* Build images only * Build images only
* will stop after all packages have been installed. No iso sqfs compression will be executed * will stop after all packages have been installed. No iso sqfs compression will be executed
######* -z ###### * -z
* Use this to sqfs compress the chroots if you previously used -x. * Use this to sqfs compress the chroots if you previously used -x.
###4. check-yaml ### 4. check-yaml
check-yaml can be used to write profile package lists to yaml. check-yaml can be used to write profile package lists to yaml.
It is also possible to generate calamares conf file as buildiso would do. It is also possible to generate calamares conf file as buildiso would do.
@ -265,7 +263,7 @@ Usage: check-yaml [options]
-q Query settings -q Query settings
-h This help -h This help
~~~ ~~~
######* build xfce iso profile for both arches and branch testing on x86_64 build system ###### * build xfce iso profile for both arches and branch testing on x86_64 build system
* i686 (buildsystem is x86_64) * i686 (buildsystem is x86_64)
@ -285,19 +283,19 @@ check-yaml -p xfce -c
check-yaml -p kdebase -gv check-yaml -p kdebase -gv
~~~ ~~~
####Special parameters #### Special parameters
######* -c ###### * -c
* generate calamares module and settings conf files per profile * generate calamares module and settings conf files per profile
######* -g ###### * -g
* generate a netgroup for specified pacman group * generate a netgroup for specified pacman group
###5. buildtree ### 5. buildtree
buildtree is a little tools to sync arch abs and manjaro PKGBUILD git repos. buildtree is a little tools to sync arch abs and manjaro PKGBUILD git repos.
####Arguments #### Arguments
~~~ ~~~
$ buildtree -h $ buildtree -h
@ -309,19 +307,19 @@ Usage: buildtree [options]
-h This help -h This help
~~~ ~~~
######* sync arch and manjaro trees ###### * sync arch and manjaro trees
~~~ ~~~
buildtree -as buildtree -as
~~~ ~~~
###6. manjaro-chroot ### 6. manjaro-chroot
manjaro-chroot is a little tool to quickly chroot into a second system installed on the host. manjaro-chroot is a little tool to quickly chroot into a second system installed on the host.
If the automount option is enabled, manjaro-chroot will detect installed systems with os-prober, and pops up a list with linux systems to select from. If the automount option is enabled, manjaro-chroot will detect installed systems with os-prober, and pops up a list with linux systems to select from.
If there is only 1 system installed besides the host system, no list will pop up and it will automatically mount the second system. If there is only 1 system installed besides the host system, no list will pop up and it will automatically mount the second system.
####Arguments #### Arguments
~~~ ~~~
$ manjaro-chroot -h $ manjaro-chroot -h
@ -336,26 +334,26 @@ usage: manjaro-chroot -a [or] manjaro-chroot chroot-dir [command]
and /build/manjaro-tools/manjaro-chroot. and /build/manjaro-tools/manjaro-chroot.
~~~ ~~~
######* automount ###### * automount
~~~ ~~~
manjaro-chroot -a manjaro-chroot -a
~~~ ~~~
######* mount manually ###### * mount manually
~~~ ~~~
manjaro-chroot /mnt /bin/bash manjaro-chroot /mnt /bin/bash
~~~ ~~~
###7. deployiso ### 7. deployiso
deployiso is a script to upload a specific iso or a buiildset to SF. deployiso is a script to upload a specific iso or a buiildset to SF.
It needs to be run inside the iso-profiles directory. It needs to be run inside the iso-profiles directory.
Ideally, you have a running ssh agent on the host, and your key added, and your public key provided to your SF account. You can then upload without being asked for ssh password. Ideally, you have a running ssh agent on the host, and your key added, and your public key provided to your SF account. You can then upload without being asked for ssh password.
####Arguments #### Arguments
~~~ ~~~
$ deployiso -h $ deployiso -h
@ -370,13 +368,13 @@ Usage: deployiso [options]
-h This help -h This help
~~~ ~~~
######* upload official build list, ie all built iso defined in a build list ###### * upload official build list, ie all built iso defined in a build list
~~~ ~~~
deployiso -p official -c deployiso -p official -c
~~~ ~~~
######* upload xfce ###### * upload xfce
~~~ ~~~
deployiso -p xfce -c deployiso -p xfce -c

View file

@ -19,6 +19,7 @@ LIBDIR='@libdir@'
import ${LIBDIR}/util.sh import ${LIBDIR}/util.sh
import ${LIBDIR}/util-mount.sh import ${LIBDIR}/util-mount.sh
import ${LIBDIR}/util-chroot.sh
newroot=/mnt newroot=/mnt
@ -44,12 +45,11 @@ usage() {
} }
# if [[ -z $1 || $1 = @(-h|--help) ]]; then # if [[ -z $1 || $1 = @(-h|--help) ]]; then
# usage # usage
# exit $(( $# ? 0 : 1 )) # exit $(( $# ? 0 : 1 ))
# fi # fi
#
orig_argv=("$@") orig_argv=("$0" "$@")
opts=':C:cdGiM' opts=':C:cdGiM'
@ -67,7 +67,7 @@ while getopts ${opts} arg; do
done done
shift $(( OPTIND - 1 )) shift $(( OPTIND - 1 ))
check_root "$0" "${orig_argv[@]}" check_root
(( $# )) || die "No root directory specified" (( $# )) || die "No root directory specified"
newroot=$1; shift newroot=$1; shift
@ -82,7 +82,7 @@ ${interactive} && pacman_args+=(--noconfirm)
[[ -d $newroot ]] || die "%s is not a directory" "$newroot" [[ -d $newroot ]] || die "%s is not a directory" "$newroot"
if ! mountpoint -q "$newroot" && ! ${directory}; then if ! mountpoint -q "$newroot" && ! ${directory}; then
die '%s is not a mountpoint!' "$newroot" die '%s is not a mountpoint!' "$newroot"
fi fi
# create obligatory directories # create obligatory directories
@ -97,7 +97,7 @@ if ! pacman -r "$newroot" -Sy "${pacman_args[@]}"; then
fi fi
# kill chroot process if needed (TODO: check if needed at all) # kill chroot process if needed (TODO: check if needed at all)
kill_chroot_process "$newroot" # kill_chroot_process "$newroot"
if ${copykeyring};then if ${copykeyring};then
copy_keyring "$newroot" copy_keyring "$newroot"

View file

@ -18,9 +18,42 @@ SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh [[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh import ${LIBDIR}/util.sh
import ${LIBDIR}/util-iso.sh
import ${LIBDIR}/util-iso-mount.sh
prepare_build(){
timer_start=$(get_timer)
profile=$1
edition=$(get_edition "${profile}")
profile_dir=${run_dir}/${edition}/${profile}
check_profile "${profile_dir}"
load_profile_config "${profile_dir}/profile.conf"
local pacman_conf=$(get_pacman_conf)
local mirrors_conf=$(get_pac_mirrors_conf "${target_branch}")
iso_file=$(gen_iso_fn).iso
local mirror="${build_mirror}/${target_branch}"
mkchroot_args+=(-C ${pacman_conf} -S ${mirrors_conf} -B "${mirror}" -K)
work_dir=${chroots_iso}/${profile}/${target_arch}
iso_dir="${cache_dir_iso}/${edition}/${profile}/${dist_release}"
iso_root=${chroots_iso}/${profile}/iso
mnt_dir=${chroots_iso}/${profile}/mnt
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
user_own "${iso_dir}"
}
show_profile(){ show_profile(){
prepare_profile "$1" local prof="$1"
prepare_build "$prof"
msg2 "iso_file: %s" "${iso_file}" msg2 "iso_file: %s" "${iso_file}"
if ${verbose};then if ${verbose};then
msg2 "autologin: %s" "${autologin}" msg2 "autologin: %s" "${autologin}"
@ -61,9 +94,9 @@ display_settings(){
show_version show_version
show_config show_config
msg "PROFILE:" # msg "PROFILE:"
msg2 "build_lists: %s" "$(show_build_lists ${list_dir_iso})" # msg2 "build_lists: %s" "$(show_build_lists ${list_dir_iso})"
msg2 "build_list_iso: %s" "${build_list_iso}" # msg2 "build_list_iso: %s" "${build_list_iso}"
msg2 "is_build_list: %s" "${is_build_list}" msg2 "is_build_list: %s" "${is_build_list}"
msg "OPTIONS:" msg "OPTIONS:"
@ -93,10 +126,7 @@ display_settings(){
load_user_info load_user_info
load_config "${USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf" load_config "${MT_USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf"
# to force old way to have buildiso run in iso-profiles dir
# run_dir=$(pwd)
load_run_dir "${profile_repo}" load_run_dir "${profile_repo}"
@ -107,6 +137,8 @@ iso_only=false
verbose=false verbose=false
persist=false persist=false
mkchroot_args=(-L)
usage() { usage() {
echo "Usage: ${0##*/} [options]" echo "Usage: ${0##*/} [options]"
echo " -p <profile> Buildset or profile [default: ${build_list_iso}]" echo " -p <profile> Buildset or profile [default: ${build_list_iso}]"
@ -135,7 +167,7 @@ usage() {
exit $1 exit $1
} }
orig_argv=("$@") orig_argv=("$0" "$@")
opts='p:a:b:r:t:k:i:g:czxmvqh' opts='p:a:b:r:t:k:i:g:czxmvqh'
@ -162,27 +194,10 @@ done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
timer_start=$(get_timer) check_root
check_root "$0" "${orig_argv[@]}"
prepare_dir "${log_dir}"
prepare_dir "${tmp_dir}"
eval_build_list "${list_dir_iso}" "${build_list_iso}"
import ${LIBDIR}/util-iso.sh
import ${LIBDIR}/util-iso-mount.sh
check_requirements check_requirements
for sig in TERM HUP QUIT; do
trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig"
done
trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT
trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR
${pretend} && display_settings && exit 1 ${pretend} && display_settings && exit 1
run build "${build_list_iso}" run build "${build_list_iso}"

View file

@ -20,6 +20,7 @@ SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh [[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
import ${LIBDIR}/util-pkg.sh import ${LIBDIR}/util-pkg.sh
import ${LIBDIR}/util-pkg-chroot.sh import ${LIBDIR}/util-pkg-chroot.sh
@ -37,9 +38,9 @@ display_settings(){
show_version show_version
show_config show_config
msg "PROFILE:" # msg "PROFILE:"
msg2 "build_lists: %s" "$(show_build_lists ${list_dir_pkg})" # msg2 "build_lists: %s" "$(show_build_lists ${list_dir_pkg})"
msg2 "build_list_pkg: %s" "${build_list_pkg}" # msg2 "build_list_pkg: %s" "${build_list_pkg}"
msg2 "is_build_list: %s" "${is_build_list}" msg2 "is_build_list: %s" "${is_build_list}"
msg "OPTIONS:" msg "OPTIONS:"
@ -49,8 +50,11 @@ display_settings(){
msg "ARGS:" msg "ARGS:"
msg2 "create_first: %s" "${create_first}"
msg2 "delete_first: %s" "${delete_first}"
msg2 "clean_first: %s" "${clean_first}" msg2 "clean_first: %s" "${clean_first}"
msg2 "wipe_clean: %s" "${wipe_clean}" msg2 "update_first: %s" "${update_first}"
msg2 "purge: %s" "${purge}"
msg2 "namcap: %s" "${namcap}" msg2 "namcap: %s" "${namcap}"
msg2 "sign: %s" "${sign}" msg2 "sign: %s" "${sign}"
msg2 "udev_root: %s" "${udev_root}" msg2 "udev_root: %s" "${udev_root}"
@ -58,9 +62,9 @@ display_settings(){
msg "PATHS:" msg "PATHS:"
msg2 "pkg_dir: %s" "${pkg_dir}" msg2 "pkg_dir: %s" "${pkg_dir}"
if ${clean_first};then if ${create_first};then
msg "PKG:" msg "PKG:"
msg2 "base_packages: %s" "${base_packages[*]}" msg2 "packages: %s" "${packages[*]}"
fi fi
msg "BUILD QUEUE:" msg "BUILD QUEUE:"
@ -69,13 +73,15 @@ display_settings(){
load_user_info load_user_info
load_config "${USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf" load_config "${MT_USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf"
load_vars "$USER_HOME/.makepkg.conf" || load_vars /etc/makepkg.conf load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
install_pkgs=()
create_first=false
delete_first=false
clean_first=false clean_first=false
wipe_clean=false update_first=false
purge=false
namcap=false namcap=false
pretend=false pretend=false
is_build_list=false is_build_list=false
@ -83,6 +89,43 @@ sign=false
udev_root=false udev_root=false
is_multilib=false is_multilib=false
mkchroot_args=(-L)
mkchrootpkg_args=()
install_pkgs=()
prepare_build(){
local pac_arch='default'
if [[ "${target_arch}" == 'multilib' ]];then
pac_arch='multilib'
is_multilib=true
fi
local pacman_conf="${DATADIR}/pacman-$pac_arch.conf"
work_dir="${chroots_pkg}/${target_branch}/${target_arch}"
pkg_dir="${cache_dir_pkg}/${target_branch}/${target_arch}"
local makepkg_conf=$(get_makepkg_conf "${target_arch}")
[[ "$pac_arch" == 'multilib' ]] && target_arch='x86_64'
local mirror="${build_mirror}/${target_branch}"
local mirrors_conf=$(get_pac_mirrors_conf "${target_branch}")
mkchroot_args+=(-C ${pacman_conf} -M ${makepkg_conf} -S ${mirrors_conf} -B ${mirror})
mkchrootpkg_args+=(-r ${work_dir})
eval_build_list "${list_dir_pkg}" "${build_list_pkg}"
init_base_devel
timer_start=$(get_timer)
}
usage() { usage() {
echo "Usage: ${0##*/} [options]" echo "Usage: ${0##*/} [options]"
echo " -p <pkg> Build list or pkg [default: ${build_list_pkg}]" echo " -p <pkg> Build list or pkg [default: ${build_list_pkg}]"
@ -91,11 +134,14 @@ usage() {
echo ' -r <dir> Chroots directory' echo ' -r <dir> Chroots directory'
echo " [default: ${chroots_pkg}]" echo " [default: ${chroots_pkg}]"
echo ' -i <pkgs> Install packages into the working copy of the chroot' echo ' -i <pkgs> Install packages into the working copy of the chroot'
echo ' -c Recreate chroot' echo ' -o Create chroot'
echo ' -d Delete chroot'
echo ' -c Clean chroot copy'
echo ' -u Update chroot copy'
echo ' -w Clean up cache and sources' echo ' -w Clean up cache and sources'
echo ' -n Install and run namcap check' echo ' -n Install and run namcap check'
echo ' -s Sign packages' echo ' -s Sign packages'
echo ' -u Udev base-devel group (no systemd)' echo ' -x Udev base-devel group (no systemd)'
echo ' -q Query settings and pretend build' echo ' -q Query settings and pretend build'
echo ' -h This help' echo ' -h This help'
echo '' echo ''
@ -103,9 +149,9 @@ usage() {
exit $1 exit $1
} }
orig_argv=("$@") orig_argv=("$0" "$@")
opts='p:a:b:r:i:cwnsuqh' opts='p:a:b:r:i:odcuwnsxqh'
while getopts "${opts}" arg; do while getopts "${opts}" arg; do
case "${arg}" in case "${arg}" in
@ -113,48 +159,31 @@ while getopts "${opts}" arg; do
a) target_arch="$OPTARG" ;; a) target_arch="$OPTARG" ;;
b) target_branch="$OPTARG" ;; b) target_branch="$OPTARG" ;;
r) chroots_pkg="$OPTARG" ;; r) chroots_pkg="$OPTARG" ;;
i) install_pkgs+=("$OPTARG"); mkchrootpkg_args+=(-I ${install_pkgs[*]}) ;; i) install_pkgs+=("$OPTARG"); mkchrootpkg_args+=(-I "${install_pkgs[*]}") ;;
c) clean_first=true ;; o) create_first=true ;;
w) wipe_clean=true ;; d) delete_first=true ;;
c) clean_first=true ; mkchrootpkg_args+=(-c) ;;
u) update_first=true ; mkchrootpkg_args+=(-u) ;;
w) purge=true ;;
n) namcap=true; mkchrootpkg_args+=(-n) ;; n) namcap=true; mkchrootpkg_args+=(-n) ;;
s) sign=true ;; s) sign=true ;;
u) udev_root=true ;; x) udev_root=true ;;
q) pretend=true ;; q) pretend=true ;;
h|?) usage 0 ;; h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;; *) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
check_root "$0" "${orig_argv[@]}" check_root
prepare_dir "${log_dir}" prepare_build
prepare_dir "${tmp_dir}"
prepare_conf "${target_arch}"
mirrors_conf=$(get_pac_mirrors_conf "${target_branch}")
mkchroot_args+=(-C ${pacman_conf} -M ${makepkg_conf} -S ${mirrors_conf} -B "${build_mirror}/${target_branch}")
mkchrootpkg_args+=(-r ${work_dir})
timer_start=$(get_timer)
eval_build_list "${list_dir_pkg}" "${build_list_pkg}"
prepare_dir "${pkg_dir}"
user_own "${pkg_dir}"
init_base_devel
${pretend} && display_settings && exit ${pretend} && display_settings && exit
${wipe_clean} && clean_up ${delete_first} && delete_chroot "${work_dir}/root" "${work_dir}"
chroot_init ${create_first} && create_chroot "${mkchroot_args[@]}" "${work_dir}/root" "${packages[@]}"
run make_pkg "${build_list_pkg}" run make_pkg "${build_list_pkg}"

View file

@ -16,7 +16,7 @@ SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh [[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh import ${LIBDIR}/util.sh
import ${LIBDIR}/util-pkgtree.sh import ${LIBDIR}/util-pkg-tree.sh
display_settings(){ display_settings(){
show_version show_version
@ -36,7 +36,7 @@ display_settings(){
load_user_info load_user_info
load_config "${USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf" load_config "${MT_USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf"
sync=false sync=false
pretend=false pretend=false
@ -55,7 +55,7 @@ usage() {
exit $1 exit $1
} }
orig_argv=("$@") orig_argv=("$0" "$@")
opts='sacqh' opts='sacqh'
@ -72,7 +72,7 @@ done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
check_root "$0" "${orig_argv[@]}" check_root
prepare_dir "${tree_dir_abs}" prepare_dir "${tree_dir_abs}"

View file

@ -62,9 +62,9 @@ display_settings(){
show_version show_version
show_config show_config
msg "PROFILE:" # msg "PROFILE:"
msg2 "build_lists: %s" "$(show_build_lists ${list_dir_iso})" # msg2 "build_lists: %s" "$(show_build_lists ${list_dir_iso})"
msg2 "build_list_iso: %s" "${build_list_iso}" # msg2 "build_list_iso: %s" "${build_list_iso}"
msg2 "is_build_list: %s" "${is_build_list}" msg2 "is_build_list: %s" "${is_build_list}"
msg "OPTIONS:" msg "OPTIONS:"
@ -83,7 +83,7 @@ display_settings(){
load_user_info load_user_info
load_config "${USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf" load_config "${MT_USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf"
# to force old way to have buildiso run in iso-profiles dir # to force old way to have buildiso run in iso-profiles dir
# run_dir=$(pwd) # run_dir=$(pwd)
@ -112,7 +112,7 @@ usage() {
exit $1 exit $1
} }
orig_argv=("$@") orig_argv=("$0" "$@")
opts='p:a:i:k:gcvqh' opts='p:a:i:k:gcvqh'
@ -133,9 +133,7 @@ done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
check_root "$0" "${orig_argv[@]}" check_root
prepare_dir "${tmp_dir}"
eval_build_list "${list_dir_iso}" "${build_list_iso}" eval_build_list "${list_dir_iso}" "${build_list_iso}"

View file

@ -19,7 +19,9 @@ import ${LIBDIR}/util-pkg.sh
shopt -s extglob shopt -s extglob
load_vars "$HOME/.makepkg.conf" load_user_info
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf load_vars /etc/makepkg.conf
if [[ ! -f PKGBUILD ]]; then if [[ ! -f PKGBUILD ]]; then

View file

@ -19,7 +19,9 @@ import ${LIBDIR}/util.sh
import ${LIBDIR}/util-mount.sh import ${LIBDIR}/util-mount.sh
working_dir='' working_dir=''
files=()
keep_mirrors=false keep_mirrors=false
nosetarch=false
usage() { usage() {
echo "Usage: ${0##*/} [options] working-dir [run arguments]" echo "Usage: ${0##*/} [options] working-dir [run arguments]"
@ -30,18 +32,20 @@ usage() {
echo ' -M <file> Location of a makepkg config file' echo ' -M <file> Location of a makepkg config file'
echo ' -S <file> Location of a pacman-mirrors config file' echo ' -S <file> Location of a pacman-mirrors config file'
echo ' -c <dir> Set pacman cache' echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -s Do not run setarch'
echo ' -r <list> Bind mountargs ro' echo ' -r <list> Bind mountargs ro'
echo ' -w <list> Bind mountargs rw' echo ' -w <list> Bind mountargs rw'
echo ' List format [src1:target1,...,srcN:targetN]' echo ' List format [src1:target1 ... srcN:targetN]'
echo ' -B Use custom build mirror' echo ' -B Use custom build mirror'
echo ' -K Keep mirrorlist (-B)' echo ' -K Keep mirrorlist (-B)'
echo ' -h This message' echo ' -h This message'
exit 1 exit 1
} }
orig_argv=("$@") orig_argv=("$0" "$@")
opts='hKC:M:S:c:r:w:B:' opts='hKC:M:S:c:r:w:B:f:s'
while getopts ${opts} arg; do while getopts ${opts} arg; do
case "${arg}" in case "${arg}" in
@ -49,8 +53,10 @@ while getopts ${opts} arg; do
M) makepkg_conf="$OPTARG" ;; M) makepkg_conf="$OPTARG" ;;
S) mirrors_conf="$OPTARG" ;; S) mirrors_conf="$OPTARG" ;;
c) cache_dir="$OPTARG" ;; c) cache_dir="$OPTARG" ;;
r) mountargs_ro="$OPTARG" ;; f) files+=("$OPTARG") ;;
w) mountargs_rw="$OPTARG" ;; s) nosetarch=true ;;
r) bindmounts_ro=("$OPTARG") ;;
w) bindmounts_rw=("$OPTARG") ;;
B) build_mirror="$OPTARG" ;; B) build_mirror="$OPTARG" ;;
K) keep_mirrors=true ;; K) keep_mirrors=true ;;
h|?) usage ;; h|?) usage ;;
@ -60,7 +66,8 @@ done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
(( $# < 1 )) && die 'You must specify a directory.' (( $# < 1 )) && die 'You must specify a directory.'
check_root "$0" "${orig_argv[@]}"
check_root
working_dir=$(readlink -f "$1") working_dir=$(readlink -f "$1")
shift 1 shift 1
@ -81,6 +88,12 @@ copy_hostconf () {
[[ -n $makepkg_conf ]] && cp $makepkg_conf "$1/etc/makepkg.conf" [[ -n $makepkg_conf ]] && cp $makepkg_conf "$1/etc/makepkg.conf"
[[ -n $mirrors_conf ]] && cp ${mirrors_conf} "$1/etc/pacman-mirrors.conf" [[ -n $mirrors_conf ]] && cp ${mirrors_conf} "$1/etc/pacman-mirrors.conf"
local file
for file in "${files[@]}"; do
mkdir -p "$(dirname "$working_dir$file")"
cp -T "$file" "$working_dir$file"
done
if [[ -n ${build_mirror} ]];then if [[ -n ${build_mirror} ]];then
build_mirror=${build_mirror}'/$repo/$arch' build_mirror=${build_mirror}'/$repo/$arch'
if ${keep_mirrors}; then if ${keep_mirrors}; then
@ -95,7 +108,7 @@ copy_hostconf () {
sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${cache_dirs[@]})|g" -i "$1/etc/pacman.conf" sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${cache_dirs[@]})|g" -i "$1/etc/pacman.conf"
} }
chroot_extra_umount() { chroot_extra_mount() {
chroot_mount "/etc/resolv.conf" "$1/etc/resolv.conf" -B chroot_mount "/etc/resolv.conf" "$1/etc/resolv.conf" -B
chroot_mount "${cache_dirs[0]}" "$1${cache_dirs[0]}" -B chroot_mount "${cache_dirs[0]}" "$1${cache_dirs[0]}" -B
@ -103,21 +116,13 @@ chroot_extra_umount() {
chroot_mount "$cache_dir" "$1${cache_dir}" -Br chroot_mount "$cache_dir" "$1${cache_dir}" -Br
done done
if [[ -n ${mountargs_ro[@]} ]];then for m in ${bindmounts_ro[@]}; do
local IFS=',' chroot_mount "${m%%:*}" "$1${m##*:}" -Br
for m in ${mountargs_ro[@]}; do done
chroot_mount "${m%%:*}" "$1${m##*:}" -Br
done
unset IFS
fi
if [[ -n ${mountargs_rw[@]} ]];then for m in ${bindmounts_rw[@]}; do
local IFS=',' chroot_mount "${m%%:*}" "$1${m##*:}" -B
for m in ${mountargs_rw[@]}; do done
chroot_mount "${m%%:*}" "$1${m##*:}" -B
done
unset IFS
fi
} }
umask 0022 umask 0022
@ -131,12 +136,14 @@ fi
chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}"
chroot_extra_umount "${working_dir}" chroot_extra_mount "${working_dir}"
copy_hostconf "${working_dir}" copy_hostconf "${working_dir}"
eval $(grep '^CARCH=' "$working_dir/etc/makepkg.conf") eval $(grep '^CARCH=' "$working_dir/etc/makepkg.conf")
${nosetarch} && unset CARCH
${CARCH:+setarch "$CARCH"} chroot "${working_dir}" "$@" ${CARCH:+setarch "$CARCH"} chroot "${working_dir}" "$@"
kill_chroot_process "${working_dir}" # kill_chroot_process "${working_dir}"

View file

@ -30,9 +30,9 @@ display_settings(){
show_version show_version
show_config show_config
msg "PROFILE:" # msg "PROFILE:"
msg2 "build_lists: %s" "$(show_build_lists ${list_dir_iso})" # msg2 "build_lists: %s" "$(show_build_lists ${list_dir_iso})"
msg2 "build_list_iso: %s" "${build_list_iso}" # msg2 "build_list_iso: %s" "${build_list_iso}"
msg2 "is_build_list: %s" "${is_build_list}" msg2 "is_build_list: %s" "${is_build_list}"
msg "OPTIONS:" msg "OPTIONS:"
@ -62,7 +62,7 @@ display_settings(){
load_user_info load_user_info
load_config "${USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf" load_config "${MT_USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf"
run_dir=${cache_dir_iso} run_dir=${cache_dir_iso}

View file

@ -20,73 +20,73 @@ LIBDIR='@libdir@'
import ${LIBDIR}/util-fstab.sh import ${LIBDIR}/util-fstab.sh
write_source() { write_source() {
local src=$1 spec= label= uuid= comment=() local src=$1 spec= label= uuid= comment=()
label=$(lsblk -rno LABEL "$1" 2>/dev/null) label=$(lsblk -rno LABEL "$1" 2>/dev/null)
uuid=$(lsblk -rno UUID "$1" 2>/dev/null) uuid=$(lsblk -rno UUID "$1" 2>/dev/null)
# bind mounts do not have a UUID! # bind mounts do not have a UUID!
case $bytag in case $bytag in
'') '')
[[ $uuid ]] && comment=("UUID=$uuid") [[ $uuid ]] && comment=("UUID=$uuid")
[[ $label ]] && comment+=("LABEL=$(mangle "$label")") [[ $label ]] && comment+=("LABEL=$(mangle "$label")")
;; ;;
LABEL) LABEL)
spec=$label spec=$label
[[ $uuid ]] && comment=("$src" "UUID=$uuid") [[ $uuid ]] && comment=("$src" "UUID=$uuid")
;; ;;
UUID) UUID)
spec=$uuid spec=$uuid
comment=("$src") comment=("$src")
[[ $label ]] && comment+=("LABEL=$(mangle "$label")") [[ $label ]] && comment+=("LABEL=$(mangle "$label")")
;; ;;
*) *)
[[ $uuid ]] && comment=("$1" "UUID=$uuid") [[ $uuid ]] && comment=("$1" "UUID=$uuid")
[[ $label ]] && comment+=("LABEL=$(mangle "$label")") [[ $label ]] && comment+=("LABEL=$(mangle "$label")")
[[ $bytag ]] && spec=$(lsblk -rno "$bytag" "$1" 2>/dev/null) [[ $bytag ]] && spec=$(lsblk -rno "$bytag" "$1" 2>/dev/null)
;; ;;
esac esac
[[ $comment ]] && printf '# %s\n' "${comment[*]}" [[ $comment ]] && printf '# %s\n' "${comment[*]}"
if [[ $spec ]]; then if [[ $spec ]]; then
printf '%-20s' "$bytag=$(mangle "$spec")" printf '%-20s' "$bytag=$(mangle "$spec")"
else else
printf '%-20s' "$(mangle "$src")" printf '%-20s' "$(mangle "$src")"
fi fi
} }
optstring_apply_quirks() { optstring_apply_quirks() {
local varname=$1 fstype=$2 local varname=$1 fstype=$2
# SELinux displays a 'seclabel' option in /proc/self/mountinfo. We can't know # SELinux displays a 'seclabel' option in /proc/self/mountinfo. We can't know
# if the system we're generating the fstab for has any support for SELinux (as # if the system we're generating the fstab for has any support for SELinux (as
# one might install Arch from a Fedora environment), so let's remove it. # one might install Arch from a Fedora environment), so let's remove it.
optstring_remove_option "$varname" seclabel optstring_remove_option "$varname" seclabel
case $fstype in case $fstype in
f2fs) f2fs)
# These are Kconfig options for f2fs. Kernels supporting the options will # These are Kconfig options for f2fs. Kernels supporting the options will
# only provide the negative versions of these (e.g. noacl), and vice versa # only provide the negative versions of these (e.g. noacl), and vice versa
# for kernels without support. # for kernels without support.
optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr
;; ;;
vfat) vfat)
# Before Linux v3.8, "cp" is prepended to the value of the codepage. # Before Linux v3.8, "cp" is prepended to the value of the codepage.
if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then
optstring_remove_option "$varname" codepage optstring_remove_option "$varname" codepage
optstring_append_option "$varname" "codepage=${codepage#cp}" optstring_append_option "$varname" "codepage=${codepage#cp}"
fi fi
;; ;;
esac esac
} }
usage() { usage() {
cat <<EOF cat <<EOF
usage: ${0##*/} [options] root usage: ${0##*/} [options] root
Options: Options:
-L Use labels for source identifiers (shortcut for -t LABEL) -L Use labels for source identifiers (shortcut for -t LABEL)
-p Exclude pseudofs mounts (default behavior) -p Exclude pseudofs mounts (default behavior)
-P Include printing mounts -P Include printing mounts
@ -102,135 +102,121 @@ EOF
} }
if [[ -z $1 || $1 = @(-h|--help) ]]; then if [[ -z $1 || $1 = @(-h|--help) ]]; then
usage usage
exit $(( $# ? 0 : 1 )) exit $(( $# ? 0 : 1 ))
fi fi
while getopts ':LPpt:U' flag; do while getopts ':LPpt:U' flag; do
case $flag in case $flag in
L) L) bytag=LABEL ;;
bytag=LABEL U) bytag=UUID ;;
;; P) pseudofs=1 ;;
U) p) pseudofs=0 ;;
bytag=UUID t) bytag=${OPTARG^^} ;;
;; :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
P) ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;;
pseudofs=1 esac
;;
p)
pseudofs=0
;;
t)
bytag=${OPTARG^^}
;;
:)
die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG"
;;
?)
die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG"
;;
esac
done done
shift $(( OPTIND - 1 )) shift $(( OPTIND - 1 ))
(( $# )) || die "No root directory specified" (( $# )) || die "No root directory specified"
root=$1; shift root=$(realpath -mL "$1"); shift
if ! mountpoint -q "$root"; then if ! mountpoint -q "$root"; then
die "$root is not a mountpoint" die "$root is not a mountpoint"
fi fi
# handle block devices # handle block devices
findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root" | findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root" |
while read -r src target fstype opts fsroot; do while read -r src target fstype opts fsroot; do
if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then
continue
fi
# default 5th and 6th columns
dump=0 pass=2
src=$(unmangle "$src")
target=$(unmangle "$target")
target=${target#$root}
if (( !foundroot )) && findmnt "$src" "$root" >/dev/null; then
# this is root. we can't possibly have more than one...
pass=1 foundroot=1
fi
# if there's no fsck tool available, then only pass=0 makes sense.
if ! fstype_has_fsck "$fstype"; then
pass=0
fi
if [[ $fsroot != / ]]; then
if [[ $fstype = btrfs ]]; then
opts+=,subvol=${fsroot#/}
else
# it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot
if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it,
# because this won't actually be a valid mount. Worst case, the user
# just re-adds it.
continue continue
fi fi
fstype=none
opts+=,bind # default 5th and 6th columns
pass=0 dump=0 pass=2
src=$(unmangle "$src")
target=$(unmangle "$target")
target=${target#$root}
if (( !foundroot )) && findmnt "$src" "$root" >/dev/null; then
# this is root. we can't possibly have more than one...
pass=1 foundroot=1
fi fi
fi
# filesystem quirks # if there's no fsck tool available, then only pass=0 makes sense.
case $fstype in if ! fstype_has_fsck "$fstype"; then
fuseblk) pass=0
# well-behaved FUSE filesystems will report themselves as fuse.$fstype.
# this is probably NTFS-3g, but let's just make sure.
if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then
# avoid blanking out fstype, leading to an invalid fstab
error 'Failed to derive real filesystem type for FUSE device on %s' "$target"
else
fstype=$newtype
fi fi
;;
esac
optstring_apply_quirks "opts" "$fstype" if [[ $fsroot != / ]]; then
if [[ $fstype = btrfs ]]; then
opts+=,subvol=${fsroot#/}
else
# it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot
if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it,
# because this won't actually be a valid mount. Worst case, the user
# just re-adds it.
continue
fi
fstype=none
opts+=,bind
pass=0
fi
fi
# write one line # filesystem quirks
write_source "$src" case $fstype in
printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" fuseblk)
printf '\t%s %s' "$dump" "$pass" # well-behaved FUSE filesystems will report themselves as fuse.$fstype.
printf '\n\n' # this is probably NTFS-3g, but let's just make sure.
if ! newtype=$(lsblk -no FSTYPE "$src") || [[ -z $newtype ]]; then
# avoid blanking out fstype, leading to an invalid fstab
error 'Failed to derive real filesystem type for FUSE device on %s' "$target"
else
fstype=$newtype
fi
;;
esac
optstring_apply_quirks "opts" "$fstype"
# write one line
write_source "$src"
printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts"
printf '\t%s %s' "$dump" "$pass"
printf '\n\n'
done done
# handle swaps devices # handle swaps devices
{ {
# ignore header # ignore header
read read
while read -r device type _ _ prio; do while read -r device type _ _ prio; do
options=defaults options=defaults
if [[ $prio != -1 ]]; then if [[ $prio != -1 ]]; then
options+=,pri=$prio options+=,pri=$prio
fi fi
# skip files marked deleted by the kernel # skip files marked deleted by the kernel
[[ $device = *'\040(deleted)' ]] && continue [[ $device = *'\040(deleted)' ]] && continue
if [[ $type = file ]]; then if [[ $type = file ]]; then
printf '%-20s' "$device" printf '%-20s' "$device"
elif [[ $device = /dev/dm-+([0-9]) ]]; then elif [[ $device = /dev/dm-+([0-9]) ]]; then
# device mapper doesn't allow characters we need to worry # device mapper doesn't allow characters we need to worry
# about being mangled, and it does the escaping of dashes # about being mangled, and it does the escaping of dashes
# for us in sysfs. # for us in sysfs.
write_source "$(dm_name_for_devnode "$device")" write_source "$(dm_name_for_devnode "$device")"
else else
write_source "$(unmangle "$device")" write_source "$(unmangle "$device")"
fi fi
printf '\t%-10s\t%-10s\t%-10s\t0 0\n\n' 'none' 'swap' "$options" printf '\t%-10s\t%-10s\t%-10s\t0 0\n\n' 'none' 'swap' "$options"
done done
} </proc/swaps } </proc/swaps

View file

@ -35,7 +35,7 @@ display_settings(){
load_user_info load_user_info
load_config "${USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf" load_config "${MT_USERCONFDIR}/manjaro-tools.conf" || load_config "${SYSCONFDIR}/manjaro-tools.conf"
automount=false automount=false
pretend=false pretend=false
@ -55,7 +55,7 @@ usage() {
exit $1 exit $1
} }
orig_argv=("$@") orig_argv=("$0" "$@")
opts=':haq' opts=':haq'
@ -69,7 +69,7 @@ while getopts ${opts} arg; do
done done
shift $(( OPTIND - 1 )) shift $(( OPTIND - 1 ))
check_root "$0" "${orig_argv[@]}" check_root
if ${automount};then if ${automount};then
chrootdir=/mnt chrootdir=/mnt

View file

@ -16,11 +16,15 @@ LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh [[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
working_dir='' working_dir=''
files=()
build_locales=false build_locales=false
keep_mirrors=false keep_mirrors=false
keep_flag='' keep_flag=''
nosetarch=false
usage() { usage() {
echo "Usage: ${0##*/} [options] working-dir package-list..." echo "Usage: ${0##*/} [options] working-dir package-list..."
@ -29,6 +33,8 @@ usage() {
echo ' -M <file> Location of a makepkg config file' echo ' -M <file> Location of a makepkg config file'
echo ' -S <file> Location of a pacman-mirrors config file' echo ' -S <file> Location of a pacman-mirrors config file'
echo ' -c <dir> Set pacman cache' echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -s Do not run setarch'
echo ' -L Use build locale.gen en/de' echo ' -L Use build locale.gen en/de'
echo ' -B Use custom build mirror' echo ' -B Use custom build mirror'
echo ' -K Keep mirrorlist (-B)' echo ' -K Keep mirrorlist (-B)'
@ -37,9 +43,9 @@ usage() {
exit 1 exit 1
} }
orig_argv=("$@") orig_argv=("$0" "$@")
opts='hLKC:M:S:c:B:' opts='hLKC:M:S:c:B:f:s'
while getopts ${opts} arg; do while getopts ${opts} arg; do
case "${arg}" in case "${arg}" in
@ -47,18 +53,20 @@ while getopts ${opts} arg; do
M) makepkg_conf="$OPTARG" ;; M) makepkg_conf="$OPTARG" ;;
S) mirrors_conf="$OPTARG" ;; S) mirrors_conf="$OPTARG" ;;
c) cache_dir="$OPTARG" ;; c) cache_dir="$OPTARG" ;;
f) files+=("$OPTARG") ;;
s) nosetarch=true ;;
L) build_locales=true ;; L) build_locales=true ;;
B) build_mirror="$OPTARG" ;; B) build_mirror="$OPTARG" ;;
K) keep_mirrors=true; keep_flag='-K' ;; K) keep_mirrors=true; keep_flag='-K' ;;
h|?) usage ;; h|?) usage ;;
*) error "invalid argument '$arg'"; usage ;; *) error "invalid argument '%s'" "$arg"; usage ;;
esac esac
done done
shift $(($OPTIND - 1)) shift $(($OPTIND - 1))
(( $# < 2 )) && die 'You must specify a directory and one or more packages.' (( $# < 2 )) && die 'You must specify a directory and one or more packages.'
check_root "$0" "${orig_argv[@]}" check_root
working_dir="$(readlink -f $1)" working_dir="$(readlink -f $1)"
shift 1 shift 1
@ -82,13 +90,18 @@ umask 0022
lock 9 "${working_dir}.lock" "Locking chroot" lock 9 "${working_dir}.lock" "Locking chroot"
if is_btrfs "$working_dir"; then if is_btrfs "$working_dir"; then
rmdir "$working_dir" rmdir "$working_dir"
if ! btrfs subvolume create "$working_dir"; then if ! btrfs subvolume create "$working_dir"; then
die "Couldn't create subvolume for '%s'" "$working_dir" die "Couldn't create subvolume for '%s'" "$working_dir"
fi fi
chmod 0755 "$working_dir" chmod 0755 "$working_dir"
fi fi
for file in "${files[@]}"; do
mkdir -p "$(dirname "$working_dir$file")"
cp "$file" "$working_dir$file"
done
# Workaround when creating a chroot in a branch different of the host # Workaround when creating a chroot in a branch different of the host
if [[ -n $pac_conf ]] && [[ -n $mirrors_conf ]] && [[ -n ${build_mirror} ]]; then if [[ -n $pac_conf ]] && [[ -n $mirrors_conf ]] && [[ -n ${build_mirror} ]]; then
url=${build_mirror}'/$repo/$arch' url=${build_mirror}'/$repo/$arch'
@ -96,11 +109,21 @@ if [[ -n $pac_conf ]] && [[ -n $mirrors_conf ]] && [[ -n ${build_mirror} ]]; the
pac_base="$working_dir/pacman-basestrap.conf" pac_base="$working_dir/pacman-basestrap.conf"
sed "s#Include = /etc/pacman.d/mirrorlist#Server = ${url}#g" $pac_conf > $pac_base sed "s#Include = /etc/pacman.d/mirrorlist#Server = ${url}#g" $pac_conf > $pac_base
_env=()
while read -r varname; do
_env+=("$varname=${!varname}")
done < <(declare -x | sed -r 's/^declare -x ([^=]*)=.*/\1/' | grep -i '_proxy$')
env -i "${_env[@]}" \
basestrap -GMcd ${pac_base:+-C "$pac_base"} "$working_dir" \ basestrap -GMcd ${pac_base:+-C "$pac_base"} "$working_dir" \
"${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages' "${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages'
[[ -f "$pac_base" ]] && rm "$pac_base" [[ -f "$pac_base" ]] && rm "$pac_base"
else else
_env=()
while read -r varname; do
_env+=("$varname=${!varname}")
done < <(declare -x | sed -r 's/^declare -x ([^=]*)=.*/\1/' | grep -i '_proxy$')
env -i "${_env[@]}" \
basestrap -GMcd ${pac_conf:+-C "$pac_conf"} "$working_dir" \ basestrap -GMcd ${pac_conf:+-C "$pac_conf"} "$working_dir" \
"${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages' "${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages'
fi fi
@ -117,6 +140,7 @@ if ${build_locales};then
fi fi
chroot_args=(${pac_conf:+-C "$pac_conf"} ${makepkg_conf:+-M "$makepkg_conf"} ${mirrors_conf:+-S "$mirrors_conf"} ${build_mirror:+-B "$build_mirror"} ${cache_dir:+-c "$cache_dir"} ${keep_flag}) chroot_args=(${pac_conf:+-C "$pac_conf"} ${makepkg_conf:+-M "$makepkg_conf"} ${mirrors_conf:+-S "$mirrors_conf"} ${build_mirror:+-B "$build_mirror"} ${cache_dir:+-c "$cache_dir"} ${keep_flag})
${nosetarch} && chroot_args+=(${nosetarch:+-s})
exec chroot-run \ exec chroot-run \
${chroot_args[*]} \ ${chroot_args[*]} \

View file

@ -16,171 +16,160 @@ LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh [[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
shopt -s nullglob shopt -s nullglob
makepkg_args=(-s --noconfirm -L) init_variables() {
repack=false default_makepkg_args=(-s --noconfirm -L --holdver)
update_first=false makepkg_args=("${default_makepkg_args[@]}")
clean_first=false repack=false
install_pkg= update_first=false
run_namcap=false clean_first=false
temp_chroot=false run_namcap=false
chrootdir= temp_chroot=false
passeddir= chrootdir=
declare -a install_pkgs passeddir=
declare -i ret=0 makepkg_user=
declare -ga install_pkgs
declare -gi ret=0
copy=$USER bindmounts_ro=()
[[ -n $SUDO_USER ]] && copy=$SUDO_USER bindmounts_rw=()
[[ -z "$copy" || $copy = root ]] && copy=copy
src_owner=${SUDO_USER:-$USER} copy=$USER
[[ -n ${SUDO_USER:-} ]] && copy=$SUDO_USER
[[ -z "$copy" || $copy = root ]] && copy=copy
src_owner=${SUDO_USER:-$USER}
}
usage() { usage() {
echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]" echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
echo ' Run this script in a PKGBUILD dir to build a package inside a' echo ' Run this script in a PKGBUILD dir to build a package inside a'
echo ' clean chroot. Arguments passed to this script after the' echo ' clean chroot. Arguments passed to this script after the'
echo ' end-of-options marker (--) will be passed to makepkg.' echo ' end-of-options marker (--) will be passed to makepkg.'
echo '' echo ''
echo ' The chroot dir consists of the following directories:' echo ' The chroot dir consists of the following directories:'
echo ' <chrootdir>/{root, copy} but only "root" is required' echo ' <chrootdir>/{root, copy} but only "root" is required'
echo ' by default. The working copy will be created as needed' echo ' by default. The working copy will be created as needed'
echo '' echo ''
echo ' The chroot "root" directory must be created via the following' echo 'The chroot "root" directory must be created via the following'
echo ' command:' echo 'command:'
echo ' mkchroot <chrootdir>/root base-devel' echo ' mkchroot <chrootdir>/root base-devel'
echo '' echo ''
echo " Default makepkg args: ${makepkg_args[*]}" echo 'This script reads {SRC,SRCPKG,PKG,LOG}DEST, MAKEFLAGS and PACKAGER'
echo 'from makepkg.conf(5), if those variables are not part of the'
echo 'environment.'
echo '' echo ''
echo ' Flags:' echo "Default makepkg args: ${default_makepkg_args[*]}"
echo ' -h This help' echo ''
echo ' -c Clean the chroot before building' echo 'Flags:'
echo ' -u Update the working copy of the chroot before building' echo '-h This help'
echo ' This is useful for rebuilds without dirtying the pristine' echo '-c Clean the chroot before building'
echo ' chroot' echo '-d <dir> Bind directory into build chroot as read-write'
echo ' -r <dir> The chroot dir to use' echo '-D <dir> Bind directory into build chroot as read-only'
echo ' -I <pkg> Install a package into the working copy of the chroot' echo '-u Update the working copy of the chroot before building'
echo ' -l <copy> The directory to use as the working copy of the chroot' echo ' This is useful for rebuilds without dirtying the pristine'
echo ' Useful for maintaining multiple copies' echo ' chroot'
echo " Default: $copy" echo '-r <dir> The chroot dir to use'
echo ' -n Run namcap on the package' echo '-I <pkg> Install a package into the working copy of the chroot'
echo ' -T Build in a temporary directory' echo '-l <copy> The directory to use as the working copy of the chroot'
echo ' Useful for maintaining multiple copies'
echo " Default: $copy"
echo '-n Run namcap on the package'
echo '-T Build in a temporary directory'
echo '-U Run makepkg as a specified user'
exit 1 exit 1
} }
orig_argv=("$@") sync_chroot() {
local chrootdir=$1
while getopts 'hcur:I:l:nT' arg; do local copy=$2
case "$arg" in local copydir=''
c) clean_first=true ;; if [[ ${copy:0:1} = / ]]; then
u) update_first=true ;; copydir=$copy
r) passeddir="$OPTARG" ;; else
I) install_pkgs+=("$OPTARG") ;; copydir="$chrootdir/$copy"
l) copy="$OPTARG" ;;
n) run_namcap=true; makepkg_args+=(-i) ;;
T) temp_chroot=true; copy+="-$$" ;;
h|*) usage ;;
esac
done
[[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.'
check_root "$0" "${orig_argv[@]}"
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir")
[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir"
[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkchroot %s/root base-devel" "$chrootdir"
# Detect chrootdir filesystem type
chroottype=$(stat -f -c %T "$chrootdir")
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
copydir="$chrootdir/$copy"
fi
# Pass all arguments after -- right to makepkg
makepkg_args+=("${@:$OPTIND}")
# See if -R was passed to makepkg
for arg in "${@:OPTIND}"; do
case ${arg%%=*} in
-*R*|--repackage)
repack=true
break 2
;;
esac
done
load_user_info
# {{{ functions
create_chroot() {
# Lock the chroot we want to use. We'll keep this lock until we exit.
lock 9 "$copydir.lock" "Locking chroot copy [$copy]"
if [[ ! -d $copydir ]] || $clean_first; then
# Get a read lock on the root chroot to make
# sure we don't clone a half-updated chroot
slock 8 "$chrootdir/root.lock" "Locking clean chroot"
stat_busy "Creating clean working copy [$copy]"
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null ||
die "Unable to create subvolume %s" "$copydir"
else
mkdir -p "$copydir"
rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
fi
stat_done
# Drop the read lock again
exec 8>&-
fi fi
if [[ "$chrootdir/root" -ef "$copydir" ]]; then
error 'Cannot sync copy with itself: %s' "$copydir"
return 1
fi
# Get a read lock on the root chroot to make
# sure we don't clone a half-updated chroot
slock 8 "$chrootdir/root.lock" \
"Locking clean chroot [%s]" "$chrootdir/root"
stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copydir"
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null ||
die "Unable to create subvolume %s" "$copydir"
else
mkdir -p "$copydir"
rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
fi
stat_done
# Drop the read lock again
lock_close 8
# Update mtime # Update mtime
touch "$copydir" touch "$copydir"
} }
clean_temporary() { # Usage: delete_chroot $copydir [$copy]
stat_busy "Removing temporary copy [$copy]" # delete_chroot() {
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then # local copydir=$1
btrfs subvolume delete "$copydir" >/dev/null || # local copy=${1:-$2}
die "Unable to delete subvolume %s" "$copydir" #
else # stat_busy "Removing chroot copy [%s]" "$copy"
# avoid change of filesystem in case of an umount failure # if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
rm --recursive --force --one-file-system "$copydir" || # subvolume_delete_recursive "$copydir" ||
die "Unable to delete %s" "$copydir" # die "Unable to delete subvolume %s" "$copydir"
fi # else
# # avoid change of filesystem in case of an umount failure
# remove lock file # rm --recursive --force --one-file-system "$copydir" ||
rm -f "$copydir.lock" # die "Unable to delete %s" "$copydir"
stat_done # fi
} #
# # remove lock file
# rm -f "$copydir.lock"
# stat_done
# }
# Usage: install_packages $copydir $pkgs...
install_packages() { install_packages() {
local copydir=$1
local install_pkgs=("${@:2}")
local -a pkgnames local -a pkgnames
local ret local ret
pkgnames=("${install_pkgs[@]##*/}") pkgnames=("${install_pkgs[@]##*/}")
cp -- "${install_pkgs[@]}" "$copydir/root/" cp -- "${install_pkgs[@]}" "$copydir/root/"
chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
chroot-run "$copydir" \ pacman -U --noconfirm -- "${pkgnames[@]/#//root/}"
pacman -U --noconfirm -- "${pkgnames[@]/#//root/}"
ret=$? ret=$?
rm -- "${pkgnames[@]/#/$copydir/root/}" rm -- "${pkgnames[@]/#/$copydir/root/}"
# If there is no PKGBUILD we are done return $ret
[[ -f PKGBUILD ]] || exit $ret
} }
# Usage: prepare_chroot $copydir $HOME $repack $run_namcap
# Globals:
# - MAKEFLAGS
# - PACKAGER
prepare_chroot() { prepare_chroot() {
local copydir=$1
local USER_HOME=$2
local repack=$3
local run_namcap=$4
$repack || rm -rf "$copydir/build" $repack || rm -rf "$copydir/build"
local builduser_uid="${SUDO_UID:-$UID}" local builduser_uid="${SUDO_UID:-$UID}"
@ -204,7 +193,7 @@ prepare_chroot() {
sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf" sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf"
for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \ for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \
"MAKEFLAGS='$MAKEFLAGS'" "PACKAGER='$PACKAGER'" "MAKEFLAGS='${MAKEFLAGS:-}'" "PACKAGER='${PACKAGER:-}'"
do do
grep -q "^$x" "$copydir/etc/makepkg.conf" && continue grep -q "^$x" "$copydir/etc/makepkg.conf" && continue
echo "$x" >>"$copydir/etc/makepkg.conf" echo "$x" >>"$copydir/etc/makepkg.conf"
@ -220,9 +209,7 @@ EOF
{ {
printf '#!/bin/bash\n' printf '#!/bin/bash\n'
declare -f _chrootbuild declare -f _chrootbuild
printf '_chrootbuild' printf '_chrootbuild "$@" || exit\n'
printf ' %q' "${makepkg_args[@]}"
printf ' || exit\n'
if $run_namcap; then if $run_namcap; then
declare -f _chrootnamcap declare -f _chrootnamcap
@ -235,10 +222,8 @@ EOF
# These functions aren't run in makechrootpkg, # These functions aren't run in makechrootpkg,
# so no global variables # so no global variables
_chrootbuild() { _chrootbuild() {
export LC_ALL=C
. /etc/profile . /etc/profile
# export HOME=/build
# cd /startdir
# sudo -u builduser makepkg "$@"
sudo -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@" sudo -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
} }
@ -250,37 +235,52 @@ _chrootnamcap() {
done done
} }
# Usage: download_sources $copydir $src_owner
# Globals:
# - SRCDEST
# - USER
download_sources() { download_sources() {
local copydir=$1
local src_owner=$2
local builddir="$(mktemp -d)" local builddir="$(mktemp -d)"
chmod 1777 "$builddir" chmod 1777 "$builddir"
# Ensure sources are downloaded # Ensure sources are downloaded
if [[ -n $SUDO_USER ]]; then makepkg_user=${makepkg_user:-$SUDO_USER}
sudo -u $SUDO_USER env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \ if [[ -n $makepkg_user ]]; then
sudo -u "$makepkg_user" env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o
else else
( export SRCDEST BUILDDIR="$builddir" error "Running makepkg as root is not allowed."
makepkg --asroot --config="$copydir/etc/makepkg.conf" --verifysource -o exit 1
)
fi fi
(( $? != 0 )) && die "Could not download sources." (( $? != 0 )) && die "Could not download sources."
# Clean up garbage from verifysource # Clean up garbage from verifysource
rm -rf $builddir rm -rf "$builddir"
} }
# Usage: move_products $copydir $owner
# Globals:
# - PKGDEST
# - LOGDEST
move_products() { move_products() {
local copydir=$1
local src_owner=$2
local pkgfile
for pkgfile in "$copydir"/pkgdest/*; do for pkgfile in "$copydir"/pkgdest/*; do
chown "$src_owner" "$pkgfile" chown "$src_owner" "$pkgfile"
mv "$pkgfile" "$PKGDEST" mv "$pkgfile" "$PKGDEST"
# Fix broken symlink because of temporary chroot PKGDEST /pkgdest # Fix broken symlink because of temporary chroot PKGDEST /pkgdest
if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then
rm "$PWD/${pkgfile##*/}"
ln -sf "$PKGDEST/${pkgfile##*/}" ln -sf "$PKGDEST/${pkgfile##*/}"
fi fi
done done
local l
for l in "$copydir"/logdest/*; do for l in "$copydir"/logdest/*; do
[[ $l == */logpipe.* ]] && continue [[ $l == */logpipe.* ]] && continue
chown "$src_owner" "$l" chown "$src_owner" "$l"
@ -294,49 +294,112 @@ move_products() {
} }
# }}} # }}}
umask 0022 orig_argv=("$0" "$@")
load_vars "$USER_HOME/.makepkg.conf" || load_vars /etc/makepkg.conf main() {
init_variables
# Use PKGBUILD directory if these don't exist local opts='hcur:I:l:nTD:d:U:'
[[ -d $PKGDEST ]] || PKGDEST=$PWD
[[ -d $SRCDEST ]] || SRCDEST=$PWD
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
[[ -d $LOGDEST ]] || LOGDEST=$PWD
create_chroot while getopts ${opts} arg; do
case "$arg" in
c) clean_first=true ;;
D) bindmounts_ro+=("$OPTARG") ;;
d) bindmounts_rw+=("$OPTARG") ;;
u) update_first=true ;;
r) passeddir="$OPTARG" ;;
I) install_pkgs+=("$OPTARG") ;;
l) copy="$OPTARG" ;;
n) run_namcap=true; makepkg_args+=(-i) ;;
T) temp_chroot=true; copy+="-$$" ;;
U) makepkg_user="$OPTARG" ;;
h|*) usage ;;
esac
done
$update_first && chroot-run \ [[ ! -f PKGBUILD && -z "${install_pkgs[*]}" ]] && die 'This must be run in a directory containing a PKGBUILD.'
-r "${mountargs_ro}" \ [[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
-w "${mountargs_rw}" \
"$copydir" \ check_root
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir")
[[ ! -d $chrootdir ]] && die "No chroot dir defined, or invalid path '%s'" "$passeddir"
[[ ! -d $chrootdir/root ]] && die "Missing chroot dir root directory. Try using: mkchroot %s/root base-devel" "$chrootdir"
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
copydir="$chrootdir/$copy"
fi
# Pass all arguments after -- right to makepkg
makepkg_args+=("${@:$OPTIND}")
# See if -R was passed to makepkg
for arg in "${@:OPTIND}"; do
case ${arg%%=*} in
-*R*|--repackage)
repack=true
break 2
;;
esac
done
load_user_info
umask 0022
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
# Use PKGBUILD directory if these don't exist
[[ -d $PKGDEST ]] || PKGDEST=$PWD
[[ -d $SRCDEST ]] || SRCDEST=$PWD
[[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
[[ -d $LOGDEST ]] || LOGDEST=$PWD
# Lock the chroot we want to use. We'll keep this lock until we exit.
lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
if [[ ! -d $copydir ]] || $clean_first; then
sync_chroot "$chrootdir" "$copy"
fi
$update_first && chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
pacman -Syu --noconfirm pacman -Syu --noconfirm
[[ -n ${install_pkgs[*]} ]] && install_packages if [[ -n ${install_pkgs[*]:-} ]]; then
install_packages "$copydir" "${install_pkgs[@]}"
download_sources ret=$?
# If there is no PKGBUILD we have done
prepare_chroot [[ -f PKGBUILD ]] || return $ret
mountargs_rw="${PWD}:/startdir,${SRCDEST}:/srcdest"
if chroot-run -r "${mountargs_ro}" \
-w "${mountargs_rw}" \
"$copydir" \
/chrootbuild; then
move_products
else
(( ret += 1 ))
fi
$temp_chroot && clean_temporary
if (( ret != 0 )); then
if $temp_chroot; then
die "Build failed"
else
die "Build failed, check %s/build" "$copydir"
fi fi
else
true download_sources "$copydir" "$src_owner"
fi
prepare_chroot "$copydir" "$USER_HOME" "$repack" "$run_namcap"
bindmounts_rw+=("${PWD}:/startdir" "${SRCDEST}:/srcdest")
if chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
/chrootbuild "${makepkg_args[@]}"; then
move_products "$copydir" "$src_owner"
else
(( ret += 1 ))
fi
$temp_chroot && delete_chroot "$copydir" "$copy"
if (( ret != 0 )); then
if $temp_chroot; then
die "Build failed"
else
die "Build failed, check %s/build" "$copydir"
fi
else
true
fi
}
main "$@"

View file

@ -17,7 +17,9 @@ LIBDIR='@libdir@'
import ${LIBDIR}/util.sh import ${LIBDIR}/util.sh
load_vars "$HOME/.makepkg.conf" load_user_info
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf load_vars /etc/makepkg.conf
if [ ! -e "$1" ]; then if [ ! -e "$1" ]; then
@ -26,4 +28,5 @@ if [ ! -e "$1" ]; then
fi fi
msg2 "Signing [%s] with key %s" "${1##*/}" "${GPGKEY}..." msg2 "Signing [%s] with key %s" "${1##*/}" "${GPGKEY}..."
[[ -e "$1".sig ]] && rm "$1".sig
gpg --detach-sign --use-agent -u "${GPGKEY}" "$1" gpg --detach-sign --use-agent -u "${GPGKEY}" "$1"

View file

@ -14,9 +14,6 @@
# build dir where buildpkg or buildiso chroots are created # build dir where buildpkg or buildiso chroots are created
# chroots_dir=/var/lib/manjaro-tools # chroots_dir=/var/lib/manjaro-tools
# log dir where log files are created
# log_dir='/var/log/manjaro-tools'
# custom build mirror server # custom build mirror server
# build_mirror=http://mirror.netzspielplatz.de/manjaro/packages # build_mirror=http://mirror.netzspielplatz.de/manjaro/packages

View file

@ -96,13 +96,31 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<varlistentry> <varlistentry>
<term><option>-i PKG</option></term> <term><option>-i PKG</option></term>
<listitem><para>Install a package into the working copy of the chroot.</para></listitem> <listitem><para>Install packages into the working copy of the chroot.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-o</option></term>
<listitem><para>Create chroot.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-d</option></term>
<listitem><para>Delete chroot.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
<term><option>-c</option></term> <term><option>-c</option></term>
<listitem><para>Recreate chroot.</para></listitem> <listitem><para>Clean chroot copy.</para></listitem>
</varlistentry>
<varlistentry>
<term><option>-u</option></term>
<listitem><para>Update chroot copy.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry> <varlistentry>
@ -123,6 +141,12 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
<listitem><para>Sign package.</para></listitem> <listitem><para>Sign package.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><option>-x</option></term>
<listitem><para>Udev base-devel group (no systemd).</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><option>-q</option></term> <term><option>-q</option></term>

View file

@ -76,12 +76,6 @@ along with systemd; If not, see <http://www.gnu.org/licenses/>.
you will upload.</para></listitem> you will upload.</para></listitem>
</varlistentry> </varlistentry>
<varlistentry>
<term><option>-c</option></term>
<listitem><para>Create new remote release.</para></listitem>
</varlistentry>
<varlistentry> <varlistentry>
<term><option>-l</option></term> <term><option>-l</option></term>

View file

@ -55,10 +55,11 @@ _mnt_sfs() {
local mnt="${2}" local mnt="${2}"
local img_fullname="${img##*/}" local img_fullname="${img##*/}"
local sfs_dev local sfs_dev
local oper=$( [[ -n "${ip}" && -n "${miso_http_srv}" ]] && echo "mv" || echo "cp" )
if [[ "${copytoram}" == "y" ]]; then if [[ "${copytoram}" == "y" ]]; then
msg -n ":: Copying squashfs image to RAM..." msg -n ":: Copying squashfs image to RAM..."
if ! cp "${img}" "/run/miso/copytoram/${img_fullname}" ; then if ! "${oper}" "${img}" "/run/miso/copytoram/${img_fullname}" ; then
echo "ERROR: while copy '${img}' to '/run/miso/copytoram/${img_fullname}'" echo "ERROR: while copy '${img}' to '/run/miso/copytoram/${img_fullname}'"
launch_interactive_shell launch_interactive_shell
fi fi
@ -237,6 +238,8 @@ miso_mount_handler() {
if [[ "${copytoram}" == "y" ]]; then if [[ "${copytoram}" == "y" ]]; then
umount -d /run/miso/bootmnt umount -d /run/miso/bootmnt
mkdir -p /run/miso/bootmnt/${misobasedir}/${arch}
mount -o bind /run/miso/copytoram /run/miso/bootmnt/${misobasedir}/${arch}
fi fi
} }

View file

@ -41,7 +41,7 @@ miso_pxe_http_mount_handler () {
local _src=${miso_http_srv}${misobasedir}/${arch} local _src=${miso_http_srv}${misobasedir}/${arch}
for sfs in livefs mhwdfs desktopfs rootfs;do for sfs in livefs mhwdfs desktopfs rootfs;do
if [[ -f "${_src}/${sfs}.sfs" ]]; then if [[ ! -z "$( curl -L -s --head "${_src}/${sfs}.sfs" | grep "OK" )" ]]; then
_curl_get "${_src}/${sfs}.sfs" "/${arch}" _curl_get "${_src}/${sfs}.sfs" "/${arch}"
if [[ "${checksum}" == "y" ]]; then if [[ "${checksum}" == "y" ]]; then

94
lib/util-chroot.sh Normal file
View file

@ -0,0 +1,94 @@
#!/bin/bash
# This program 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; version 2 of the License.
#
# This program 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.
copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
}
copy_keyring(){
if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/"
fi
}
create_min_fs(){
msg "Creating install root at %s" "$1"
mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,run,etc}
mkdir -m 1777 -p $1/tmp
mkdir -m 0555 -p $1/{sys,proc}
}
is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
}
subvolume_delete_recursive() {
local subvol
is_btrfs "$1" || return 0
while IFS= read -d $'\0' -r subvol; do
if ! btrfs subvolume delete "$subvol" &>/dev/null; then
error "Unable to delete subvolume %s" "$subvol"
return 1
fi
done < <(find "$1" -xdev -depth -inum 256 -print0)
return 0
}
create_chroot(){
local timer=$(get_timer)
setarch "${target_arch}" \
mkchroot "$@"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
delete_chroot() {
local copydir=$1
local copy=${1:-$2}
stat_busy "Removing chroot copy [%s]" "$copy"
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
else
# avoid change of filesystem in case of an umount failure
rm --recursive --force --one-file-system "$copydir" ||
die "Unable to delete %s" "$copydir"
fi
# remove lock file
rm -f "$copydir.lock"
stat_done
}
# $1: chroot
# kill_chroot_process(){
# # enable to have more debug info
# #msg "machine-id (etc): $(cat $1/etc/machine-id)"
# #[[ -e $1/var/lib/dbus/machine-id ]] && msg "machine-id (lib): $(cat $1/var/lib/dbus/machine-id)"
# #msg "running processes: "
# #lsof | grep $1
#
# local prefix="$1" flink pid name
# for root_dir in /proc/*/root; do
# flink=$(readlink $root_dir)
# if [ "x$flink" != "x" ]; then
# if [ "x${flink:0:${#prefix}}" = "x$prefix" ]; then
# # this process is in the chroot...
# pid=$(basename $(dirname "$root_dir"))
# name=$(ps -p $pid -o comm=)
# info "Killing chroot process: %s (%s)" "$name" "$pid"
# kill -9 "$pid"
# fi
# fi
# done
# }

View file

@ -1,97 +0,0 @@
#!/bin/bash
#
# This program 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; version 2 of the License.
#
# This program 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.
prepare_initcpio(){
msg2 "Copying initcpio ..."
cp /etc/initcpio/hooks/miso* $1/etc/initcpio/hooks
cp /etc/initcpio/install/miso* $1/etc/initcpio/install
cp /etc/initcpio/miso_shutdown $1/etc/initcpio
}
prepare_initramfs(){
cp ${DATADIR}/mkinitcpio.conf $1/etc/mkinitcpio-${iso_name}.conf
local _kernver=$(cat $1/usr/lib/modules/*/version)
if [[ -n ${gpgkey} ]]; then
su ${OWNER} -c "gpg --export ${gpgkey} >${USERCONFDIR}/gpgkey"
exec 17<>${USERCONFDIR}/gpgkey
fi
MISO_GNUPG_FD=${gpgkey:+17} chroot-run $1 \
/usr/bin/mkinitcpio -k ${_kernver} \
-c /etc/mkinitcpio-${iso_name}.conf \
-g /boot/initramfs.img
if [[ -n ${gpgkey} ]]; then
exec 17<&-
fi
if [[ -f ${USERCONFDIR}/gpgkey ]]; then
rm ${USERCONFDIR}/gpgkey
fi
}
prepare_boot_extras(){
cp $1/boot/intel-ucode.img $2/intel_ucode.img
cp $1/usr/share/licenses/intel-ucode/LICENSE $2/intel_ucode.LICENSE
cp $1/boot/memtest86+/memtest.bin $2/memtest
cp $1/usr/share/licenses/common/GPL2/license.txt $2/memtest.COPYING
}
prepare_grub(){
local platform=i386-pc img='core.img' grub=$2/boot/grub efi=$2/efi/boot \
data=$1/usr/share/grub lib=$1/usr/lib/grub prefix=/boot/grub
prepare_dir ${grub}/${platform}
cp ${data}/cfg/*.cfg ${grub}
cp ${lib}/${platform}/* ${grub}/${platform}
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${grub}/${platform}/${img} -O ${platform} -p ${prefix} biosdisk iso9660
cat ${grub}/${platform}/cdboot.img ${grub}/${platform}/${img} > ${grub}/${platform}/eltorito.img
case ${target_arch} in
'i686')
platform=i386-efi
img=bootia32.efi
;;
'x86_64')
platform=x86_64-efi
img=bootx64.efi
;;
esac
prepare_dir ${efi}
prepare_dir ${grub}/${platform}
cp ${lib}/${platform}/* ${grub}/${platform}
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660
prepare_dir ${grub}/themes
cp -r ${data}/themes/${iso_name}-live ${grub}/themes/
cp ${data}/unicode.pf2 ${grub}
cp -r ${data}/{locales,tz,video} ${grub}
local size=8M mnt="${mnt_dir}/efiboot" efi_img="$2/efi.img"
msg2 "Creating fat image of %s ..." "${size}"
truncate -s ${size} "${efi_img}"
mkfs.fat -n MISO_EFI "${efi_img}" &>/dev/null
prepare_dir "${mnt}"
mount_img "${efi_img}" "${mnt}"
prepare_dir ${mnt}/efi/boot
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${mnt}/efi/boot/${img} -O ${platform} -p ${prefix} iso9660
umount_img "${mnt}"
}

366
lib/util-iso-chroot.sh Normal file
View file

@ -0,0 +1,366 @@
#!/bin/bash
#
# This program 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; version 2 of the License.
#
# This program 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.
copy_overlay(){
local src="$1" dest="$2"
if [[ -e $src ]];then
msg2 "Copying [%s] ..." "${src##*/}"
if [[ -L $src ]];then
cp -a --no-preserve=ownership $src/* $dest
else
cp -LR $src/* $dest
fi
fi
}
add_svc_rc(){
local mnt="$1" name="$2"
if [[ -f $mnt/etc/init.d/$name ]];then
msg2 "Setting %s ..." "$name"
chroot $mnt rc-update add $name default &>/dev/null
fi
}
add_svc_sd(){
local mnt="$1" name="$2"
if [[ -f $mnt/etc/systemd/system/$name.service ]] || \
[[ -f $mnt/usr/lib/systemd/system/$name.service ]];then
msg2 "Setting %s ..." "$name"
chroot $mnt systemctl enable $name &>/dev/null
fi
}
set_xdm(){
if [[ -f $1/etc/conf.d/xdm ]];then
local conf='DISPLAYMANAGER="'${displaymanager}'"'
sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm
fi
}
configure_mhwd_drivers(){
local path=$1${mhwd_repo}/ \
drv_path=$1/var/lib/mhwd/db/pci/graphic_drivers
info "Configuring mwwd db ..."
if [ -z "$(ls $path | grep catalyst-utils 2> /dev/null)" ]; then
msg2 "Disabling Catalyst driver"
mkdir -p $drv_path/catalyst/
touch $drv_path/catalyst/MHWDCONFIG
fi
if [ -z "$(ls $path | grep nvidia-utils 2> /dev/null)" ]; then
msg2 "Disabling Nvidia driver"
mkdir -p $drv_path/nvidia/
touch $drv_path/nvidia/MHWDCONFIG
msg2 "Disabling Nvidia Bumblebee driver"
mkdir -p $drv_path/hybrid-intel-nvidia-bumblebee/
touch $drv_path/hybrid-intel-nvidia-bumblebee/MHWDCONFIG
fi
if [ -z "$(ls $path | grep nvidia-304xx-utils 2> /dev/null)" ]; then
msg2 "Disabling Nvidia 304xx driver"
mkdir -p $drv_path/nvidia-304xx/
touch $drv_path/nvidia-304xx/MHWDCONFIG
fi
if [ -z "$(ls $path | grep nvidia-340xx-utils 2> /dev/null)" ]; then
msg2 "Disabling Nvidia 340xx driver"
mkdir -p $drv_path/nvidia-340xx/
touch $drv_path/nvidia-340xx/MHWDCONFIG
fi
if [ -z "$(ls $path | grep xf86-video-amdgpu 2> /dev/null)" ]; then
msg2 "Disabling AMD gpu driver"
mkdir -p $drv_path/xf86-video-amdgpu/
touch $drv_path/xf86-video-amdgpu/MHWDCONFIG
fi
}
configure_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${hostname}|" -i $1/etc/hosts
}
configure_lsb(){
local conf=$1/etc/lsb-release
if [[ -e $conf ]] ; then
msg2 "Configuring lsb-release"
sed -i -e "s/^.*DISTRIB_RELEASE.*/DISTRIB_RELEASE=${dist_release}/" $conf
sed -i -e "s/^.*DISTRIB_CODENAME.*/DISTRIB_CODENAME=${dist_codename}/" $conf
fi
}
configure_logind(){
msg2 "Configuring logind ..."
local conf=$1/etc/$2/logind.conf
if [[ -e $conf ]];then
sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf"
fi
}
configure_journald(){
msg2 "Configuring journald ..."
local conf=$1/etc/systemd/journald.conf
sed -i 's/#\(Storage=\)auto/\1volatile/' "$conf"
}
configure_services(){
local mnt="$1"
info "Configuring [%s]" "${initsys}"
case ${initsys} in
'openrc')
for svc in ${enable_openrc[@]}; do
[[ $svc == "xdm" ]] && set_xdm "$mnt"
add_svc_rc "$mnt" "$svc"
done
for svc in ${enable_openrc_live[@]}; do
add_svc_rc "$mnt" "$svc"
done
;;
'systemd')
for svc in ${enable_systemd[@]}; do
add_svc_sd "$mnt" "$svc"
done
for svc in ${enable_systemd_live[@]}; do
add_svc_sd "$mnt" "$svc"
done
;;
esac
info "Done configuring [%s]" "${initsys}"
}
write_live_session_conf(){
local path=$1${SYSCONFDIR}
[[ ! -d $path ]] && mkdir -p $path
local conf=$path/live.conf
msg2 "Writing %s" "${conf##*/}"
echo '# live session configuration' > ${conf}
echo '' >> ${conf}
echo '# autologin' >> ${conf}
echo "autologin=${autologin}" >> ${conf}
echo '' >> ${conf}
echo '# login shell' >> ${conf}
echo "login_shell=${login_shell}" >> ${conf}
echo '' >> ${conf}
echo '# live username' >> ${conf}
echo "username=${username}" >> ${conf}
echo '' >> ${conf}
echo '# live password' >> ${conf}
echo "password=${password}" >> ${conf}
echo '' >> ${conf}
echo '# live group membership' >> ${conf}
echo "addgroups='${addgroups}'" >> ${conf}
if [[ -n ${smb_workgroup} ]];then
echo '' >> ${conf}
echo '# samba workgroup' >> ${conf}
echo "smb_workgroup=${smb_workgroup}" >> ${conf}
fi
}
configure_system(){
local mnt="$1"
case ${initsys} in
'systemd')
configure_logind "$mnt" "systemd"
configure_journald "$mnt"
# Prevent some services to be started in the livecd
echo 'File created by manjaro-tools. See systemd-update-done.service(8).' \
| tee "${path}/etc/.updated" >"${path}/var/.updated"
msg2 "Disable systemd-gpt-auto-generator"
ln -sf /dev/null "${path}/usr/lib/systemd/system-generators/systemd-gpt-auto-generator"
;;
'openrc')
configure_logind "$mnt" "elogind"
;;
esac
echo ${hostname} > $mnt/etc/hostname
}
make_repo(){
local dest="$1"
cp ${DATADIR}/pacman-mhwd.conf $dest/opt
repo-add $dest${mhwd_repo}/mhwd.db.tar.gz $dest${mhwd_repo}/*pkg*z
}
clean_iso_root(){
local dest="$1"
msg2 "Deleting isoroot [%s] ..." "${dest##*/}"
rm -rf --one-file-system "$dest"
}
clean_up_image(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
if [[ ${1##*/} == 'mhwdfs' ]];then
path=$mnt/var
if [[ -d $path ]];then
find "$path" -mindepth 0 -delete &> /dev/null
fi
path=$mnt/etc
if [[ -d $path ]];then
find "$path" -mindepth 0 -delete &> /dev/null
fi
else
[[ -f "$mnt/etc/locale.gen.bak" ]] && mv "$mnt/etc/locale.gen.bak" "$mnt/etc/locale.gen"
[[ -f "$mnt/etc/locale.conf.bak" ]] && mv "$mnt/etc/locale.conf.bak" "$mnt/etc/locale.conf"
path=$mnt/boot
if [[ -d "$path" ]]; then
find "$path" -name 'initramfs*.img' -delete &> /dev/null
fi
path=$mnt/var/lib/pacman/sync
if [[ -d $path ]];then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/cache/pacman/pkg
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/log
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
path=$mnt/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
if [[ ${mnt##*/} == 'livefs' ]];then
rm -rf "$mnt/etc/pacman.d/gnupg"
fi
fi
find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete
file=$mnt/boot/grub/grub.cfg
if [[ -f "$file" ]]; then
rm $file
fi
}
copy_from_cache(){
local list="${tmp_dir}"/mhwd-cache.list mirror="${build_mirror}/${target_branch}"
local mnt="$1"; shift
chroot-run -B "$mirror" "$mnt" \
pacman -v -Syw --noconfirm "$@" || return 1
chroot-run -B "$mirror" "$mnt" \
pacman -v -Sp --noconfirm "$@" > "$list"
sed -ni '/.pkg.tar.xz/p' "$list"
sed -i "s/.*\///" "$list"
msg2 "Copying mhwd package cache ..."
rsync -v --files-from="$list" /var/cache/pacman/pkg "$mnt${mhwd_repo}"
}
chroot_clean(){
local dest="$1"
for root in "$dest"/*; do
[[ -d ${root} ]] || continue
local name=${root##*/}
if [[ $name != "mhwdfs" ]];then
# lock 9 "$name.lock" "Locking chroot copy [%s]" "$name"
delete_chroot "${root}" "$dest"
fi
done
rm -rf --one-file-system "$dest"
}
prepare_initcpio(){
msg2 "Copying initcpio ..."
local dest="$1"
cp /etc/initcpio/hooks/miso* $dest/etc/initcpio/hooks
cp /etc/initcpio/install/miso* $dest/etc/initcpio/install
cp /etc/initcpio/miso_shutdown $dest/etc/initcpio
}
prepare_initramfs(){
local mnt="$1"
cp ${DATADIR}/mkinitcpio.conf $mnt/etc/mkinitcpio-${iso_name}.conf
local _kernver=$(cat $mnt/usr/lib/modules/*/version)
if [[ -n ${gpgkey} ]]; then
su ${OWNER} -c "gpg --export ${gpgkey} >${MT_USERCONFDIR}/gpgkey"
exec 17<>${MT_USERCONFDIR}/gpgkey
fi
MISO_GNUPG_FD=${gpgkey:+17} chroot-run $mnt \
/usr/bin/mkinitcpio -k ${_kernver} \
-c /etc/mkinitcpio-${iso_name}.conf \
-g /boot/initramfs.img
if [[ -n ${gpgkey} ]]; then
exec 17<&-
fi
if [[ -f ${MT_USERCONFDIR}/gpgkey ]]; then
rm ${MT_USERCONFDIR}/gpgkey
fi
}
prepare_boot_extras(){
local src="$1" dest="$2"
cp $src/boot/intel-ucode.img $dest/intel_ucode.img
cp $src/usr/share/licenses/intel-ucode/LICENSE $dest/intel_ucode.LICENSE
cp $src/boot/memtest86+/memtest.bin $dest/memtest
cp $src/usr/share/licenses/common/GPL2/license.txt $dest/memtest.COPYING
}
prepare_grub(){
local platform=i386-pc img='core.img' grub=$3/boot/grub efi=$3/efi/boot \
lib=$1/usr/lib/grub prefix=/boot/grub theme=$2/usr/share/grub data=$1/usr/share/grub
prepare_dir ${grub}/${platform}
cp ${theme}/cfg/*.cfg ${grub}
cp ${lib}/${platform}/* ${grub}/${platform}
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${grub}/${platform}/${img} -O ${platform} -p ${prefix} biosdisk iso9660
cat ${grub}/${platform}/cdboot.img ${grub}/${platform}/${img} > ${grub}/${platform}/eltorito.img
case ${target_arch} in
'i686')
platform=i386-efi
img=bootia32.efi
;;
'x86_64')
platform=x86_64-efi
img=bootx64.efi
;;
esac
prepare_dir ${efi}
prepare_dir ${grub}/${platform}
cp ${lib}/${platform}/* ${grub}/${platform}
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660
prepare_dir ${grub}/themes
cp -r ${theme}/themes/${iso_name}-live ${grub}/themes/
cp ${data}/unicode.pf2 ${grub}
cp -r ${theme}/{locales,tz} ${grub}
local size=4M mnt="${mnt_dir}/efiboot" efi_img="$3/efi.img"
msg2 "Creating fat image of %s ..." "${size}"
truncate -s ${size} "${efi_img}"
mkfs.fat -n MISO_EFI "${efi_img}" &>/dev/null
prepare_dir "${mnt}"
mount_img "${efi_img}" "${mnt}"
prepare_dir ${mnt}/efi/boot
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${mnt}/efi/boot/${img} -O ${platform} -p ${prefix} iso9660
umount_img "${mnt}"
}

View file

@ -1,313 +0,0 @@
#!/bin/bash
#
# This program 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; version 2 of the License.
#
# This program 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.
copy_overlay(){
if [[ -e $1 ]];then
msg2 "Copying [%s] ..." "${1##*/}"
if [[ -L $1 ]];then
cp -a --no-preserve=ownership $1/* $2
else
cp -LR $1/* $2
fi
fi
}
add_svc_rc(){
if [[ -f $1/etc/init.d/$2 ]];then
msg2 "Setting %s ..." "$2"
chroot $1 rc-update add $2 default &>/dev/null
fi
}
add_svc_sd(){
if [[ -f $1/etc/systemd/system/$2.service ]] || \
[[ -f $1/usr/lib/systemd/system/$2.service ]];then
msg2 "Setting %s ..." "$2"
chroot $1 systemctl enable $2 &>/dev/null
fi
}
set_xdm(){
if [[ -f $1/etc/conf.d/xdm ]];then
local conf='DISPLAYMANAGER="'${displaymanager}'"'
sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm
fi
}
configure_mhwd_drivers(){
local path=$1${mhwd_repo}/ \
drv_path=$1/var/lib/mhwd/db/pci/graphic_drivers
info "Configuring mwwd db ..."
if [ -z "$(ls $path | grep catalyst-utils 2> /dev/null)" ]; then
msg2 "Disabling Catalyst driver"
mkdir -p $drv_path/catalyst/
touch $drv_path/catalyst/MHWDCONFIG
fi
if [ -z "$(ls $path | grep nvidia-utils 2> /dev/null)" ]; then
msg2 "Disabling Nvidia driver"
mkdir -p $drv_path/nvidia/
touch $drv_path/nvidia/MHWDCONFIG
msg2 "Disabling Nvidia Bumblebee driver"
mkdir -p $drv_path/hybrid-intel-nvidia-bumblebee/
touch $drv_path/hybrid-intel-nvidia-bumblebee/MHWDCONFIG
fi
if [ -z "$(ls $path | grep nvidia-304xx-utils 2> /dev/null)" ]; then
msg2 "Disabling Nvidia 304xx driver"
mkdir -p $drv_path/nvidia-304xx/
touch $drv_path/nvidia-304xx/MHWDCONFIG
fi
if [ -z "$(ls $path | grep nvidia-340xx-utils 2> /dev/null)" ]; then
msg2 "Disabling Nvidia 340xx driver"
mkdir -p $drv_path/nvidia-340xx/
touch $drv_path/nvidia-340xx/MHWDCONFIG
fi
if [ -z "$(ls $path | grep xf86-video-amdgpu 2> /dev/null)" ]; then
msg2 "Disabling AMD gpu driver"
mkdir -p $drv_path/xf86-video-amdgpu/
touch $drv_path/xf86-video-amdgpu/MHWDCONFIG
fi
}
configure_lsb(){
if [ -e $1/etc/lsb-release ] ; then
msg2 "Configuring lsb-release"
sed -i -e "s/^.*DISTRIB_RELEASE.*/DISTRIB_RELEASE=${dist_release}/" $1/etc/lsb-release
sed -i -e "s/^.*DISTRIB_CODENAME.*/DISTRIB_CODENAME=${dist_codename}/" $1/etc/lsb-release
fi
}
configure_logind(){
msg2 "Configuring logind ..."
local conf=$1/etc/$2/logind.conf
sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf"
}
configure_journald(){
msg2 "Configuring journald ..."
local conf=$1/etc/systemd/journald.conf
sed -i 's/#\(Storage=\)auto/\1volatile/' "$conf"
}
configure_services(){
info "Configuring [%s]" "${initsys}"
case ${initsys} in
'openrc')
for svc in ${enable_openrc[@]}; do
[[ $svc == "xdm" ]] && set_xdm "$1"
add_svc_rc "$1" "$svc"
done
for svc in ${enable_openrc_live[@]}; do
add_svc_rc "$1" "$svc"
done
;;
'systemd')
for svc in ${enable_systemd[@]}; do
add_svc_sd "$1" "$svc"
done
for svc in ${enable_systemd_live[@]}; do
add_svc_sd "$1" "$svc"
done
;;
esac
info "Done configuring [%s]" "${initsys}"
}
write_live_session_conf(){
local path=$1${SYSCONFDIR}
[[ ! -d $path ]] && mkdir -p $path
local conf=$path/live.conf
msg2 "Writing %s" "${conf##*/}"
echo '# live session configuration' > ${conf}
echo '' >> ${conf}
echo '# autologin' >> ${conf}
echo "autologin=${autologin}" >> ${conf}
echo '' >> ${conf}
echo '# login shell' >> ${conf}
echo "login_shell=${login_shell}" >> ${conf}
echo '' >> ${conf}
echo '# live username' >> ${conf}
echo "username=${username}" >> ${conf}
echo '' >> ${conf}
echo '# live password' >> ${conf}
echo "password=${password}" >> ${conf}
echo '' >> ${conf}
echo '# live group membership' >> ${conf}
echo "addgroups='${addgroups}'" >> ${conf}
if [[ -n ${smb_workgroup} ]];then
echo '' >> ${conf}
echo '# samba workgroup' >> ${conf}
echo "smb_workgroup=${smb_workgroup}" >> ${conf}
fi
}
configure_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${hostname}|" -i $1/etc/hosts
}
configure_system(){
case ${initsys} in
'systemd')
configure_logind "$1" "systemd"
configure_journald "$1"
# Prevent some services to be started in the livecd
echo 'File created by manjaro-tools. See systemd-update-done.service(8).' \
| tee "${path}/etc/.updated" >"${path}/var/.updated"
msg2 "Disable systemd-gpt-auto-generator"
ln -sf /dev/null "${path}/usr/lib/systemd/system-generators/systemd-gpt-auto-generator"
;;
'openrc')
configure_logind "$1" "elogind"
# local hn='hostname="'${hostname}'"'
# sed -i -e "s|^.*hostname=.*|${hn}|" $1/etc/conf.d/hostname
;;
esac
echo ${hostname} > $1/etc/hostname
}
configure_thus(){
msg2 "Configuring Thus ..."
source "$1/etc/mkinitcpio.d/${kernel}.preset"
local conf="$1/etc/thus.conf"
echo "[distribution]" > "$conf"
echo "DISTRIBUTION_NAME = \"${dist_name} Linux\"" >> "$conf"
echo "DISTRIBUTION_VERSION = \"${dist_release}\"" >> "$conf"
echo "SHORT_NAME = \"${dist_name}\"" >> "$conf"
echo "[install]" >> "$conf"
echo "LIVE_MEDIA_SOURCE = \"/run/miso/bootmnt/${iso_name}/${target_arch}/rootfs.sfs\"" >> "$conf"
echo "LIVE_MEDIA_DESKTOP = \"/run/miso/bootmnt/${iso_name}/${target_arch}/desktopfs.sfs\"" >> "$conf"
echo "LIVE_MEDIA_TYPE = \"squashfs\"" >> "$conf"
echo "LIVE_USER_NAME = \"${username}\"" >> "$conf"
echo "KERNEL = \"${kernel}\"" >> "$conf"
echo "VMLINUZ = \"$(echo ${ALL_kver} | sed s'|/boot/||')\"" >> "$conf"
echo "INITRAMFS = \"$(echo ${default_image} | sed s'|/boot/||')\"" >> "$conf"
echo "FALLBACK = \"$(echo ${fallback_image} | sed s'|/boot/||')\"" >> "$conf"
if [[ -f $1/usr/share/applications/thus.desktop && -f $1/usr/bin/kdesu ]];then
sed -i -e 's|sudo|kdesu|g' $1/usr/share/applications/thus.desktop
fi
}
configure_live_image(){
msg "Configuring [livefs]"
configure_hosts "$1"
configure_system "$1"
configure_services "$1"
configure_calamares "$1"
[[ ${edition} == "sonar" ]] && configure_thus "$1"
write_live_session_conf "$1"
msg "Done configuring [livefs]"
}
make_repo(){
repo-add $1${mhwd_repo}/mhwd.db.tar.gz $1${mhwd_repo}/*pkg*z
}
copy_from_cache(){
local list="${tmp_dir}"/mhwd-cache.list
chroot-run \
-r "${mountargs_ro}" \
-w "${mountargs_rw}" \
-B "${build_mirror}/${target_branch}" \
"$1" \
pacman -v -Syw $2 --noconfirm || return 1
chroot-run \
-r "${mountargs_ro}" \
-w "${mountargs_rw}" \
-B "${build_mirror}/${target_branch}" \
"$1" \
pacman -v -Sp $2 --noconfirm > "$list"
sed -ni '/.pkg.tar.xz/p' "$list"
sed -i "s/.*\///" "$list"
msg2 "Copying mhwd package cache ..."
rsync -v --files-from="$list" /var/cache/pacman/pkg "$1${mhwd_repo}"
}
chroot_create(){
[[ "${1##*/}" == "rootfs" ]] && local flag="-L"
setarch "${target_arch}" \
mkchroot ${mkchroot_args[*]} ${flag} $@
}
clean_iso_root(){
msg2 "Deleting isoroot [%s] ..." "${1##*/}"
rm -rf --one-file-system "$1"
}
chroot_clean(){
msg "Cleaning up ..."
for image in "$1"/*fs; do
[[ -d ${image} ]] || continue
local name=${image##*/}
if [[ $name != "mhwdfs" ]];then
msg2 "Deleting chroot [%s] (%s) ..." "$name" "${1##*/}"
lock 9 "${image}.lock" "Locking chroot '${image}'"
if [[ "$(stat -f -c %T "${image}")" == btrfs ]]; then
{ type -P btrfs && btrfs subvolume delete "${image}"; } #&> /dev/null
fi
rm -rf --one-file-system "${image}"
fi
done
exec 9>&-
rm -rf --one-file-system "$1"
}
clean_up_image(){
msg2 "Cleaning [%s]" "${1##*/}"
local path
if [[ ${1##*/} == 'mhwdfs' ]];then
path=$1/var
if [[ -d $path ]];then
find "$path" -mindepth 0 -delete &> /dev/null
fi
path=$1/etc
if [[ -d $path ]];then
find "$path" -mindepth 0 -delete &> /dev/null
fi
else
[[ -f "$1/etc/locale.gen.bak" ]] && mv "$1/etc/locale.gen.bak" "$1/etc/locale.gen"
[[ -f "$1/etc/locale.conf.bak" ]] && mv "$1/etc/locale.conf.bak" "$1/etc/locale.conf"
path=$1/boot
if [[ -d "$path" ]]; then
find "$path" -name 'initramfs*.img' -delete &> /dev/null
fi
path=$1/var/lib/pacman/sync
if [[ -d $path ]];then
find "$path" -type f -delete &> /dev/null
fi
path=$1/var/cache/pacman/pkg
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$1/var/log
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$1/var/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
path=$1/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
fi
find "$1" -name *.pacnew -name *.pacsave -name *.pacorig -delete
file=$1/boot/grub/grub.cfg
if [[ -f "$file" ]]; then
rm $file
fi
}

View file

@ -34,29 +34,25 @@ track_fs() {
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}") mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
} }
# $1: new branch mount_fs(){
mount_fs_root(){
FS_ACTIVE_MOUNTS=() FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2" pkglist="$3"
local fs=${upper##*/}
local rootfs="$work/rootfs" desktopfs="$work/desktopfs" livefs="$work/livefs"
mkdir -p "${mnt_dir}/work" mkdir -p "${mnt_dir}/work"
track_fs -t overlay overlay -olowerdir="${work_dir}/rootfs",upperdir="$1",workdir="${mnt_dir}/work" "$1" mkdir -p "$upper"
} case $fs in
desktopfs) lower="$rootfs" ;;
mount_fs_desktop(){ livefs|mhwdfs)
FS_ACTIVE_MOUNTS=() lower="$rootfs"
mkdir -p "${mnt_dir}/work" [[ -f $pkglist ]] && lower="$desktopfs":"$rootfs"
track_fs -t overlay overlay -olowerdir="${work_dir}/desktopfs":"${work_dir}/rootfs",upperdir="$1",workdir="${mnt_dir}/work" "$1" ;;
} bootfs)
lower="$livefs":"$rootfs"
mount_fs_live(){ [[ -f $pkglist ]] && lower="$livefs":"$desktopfs":"$rootfs"
FS_ACTIVE_MOUNTS=() ;;
mkdir -p "${mnt_dir}/work" esac
track_fs -t overlay overlay -olowerdir="${work_dir}/livefs":"${work_dir}/desktopfs":"${work_dir}/rootfs",upperdir="$1",workdir="${mnt_dir}/work" "$1" track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
}
mount_fs_net(){
FS_ACTIVE_MOUNTS=()
mkdir -p "${mnt_dir}/work"
track_fs -t overlay overlay -olowerdir="${work_dir}/livefs":"${work_dir}/rootfs",upperdir="$1",workdir="${mnt_dir}/work" "$1"
} }
umount_fs(){ umount_fs(){

View file

@ -9,17 +9,18 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
import ${LIBDIR}/util-iso-image.sh import ${LIBDIR}/util-chroot.sh
import ${LIBDIR}/util-iso-boot.sh import ${LIBDIR}/util-iso-chroot.sh
import ${LIBDIR}/util-yaml.sh import ${LIBDIR}/util-yaml.sh
error_function() { error_function() {
if [[ -p $logpipe ]]; then if [[ -p $logpipe ]]; then
rm "$logpipe" rm "$logpipe"
fi fi
local func="$1"
# first exit all subshells, then print the error # first exit all subshells, then print the error
if (( ! BASH_SUBSHELL )); then if (( ! BASH_SUBSHELL )); then
error "A failure occurred in %s()." "$1" error "A failure occurred in %s()." "$func"
plain "Aborting..." plain "Aborting..."
fi fi
umount_fs umount_fs
@ -68,20 +69,57 @@ trap_exit() {
kill "-$sig" "$$" kill "-$sig" "$$"
} }
configure_thus(){
local fs="$1"
msg2 "Configuring Thus ..."
source "$fs/etc/mkinitcpio.d/${kernel}.preset"
local conf="$fs/etc/thus.conf"
echo "[distribution]" > "$conf"
echo "DISTRIBUTION_NAME = \"${dist_name} Linux\"" >> "$conf"
echo "DISTRIBUTION_VERSION = \"${dist_release}\"" >> "$conf"
echo "SHORT_NAME = \"${dist_name}\"" >> "$conf"
echo "[install]" >> "$conf"
echo "LIVE_MEDIA_SOURCE = \"/run/miso/bootmnt/${iso_name}/${target_arch}/rootfs.sfs\"" >> "$conf"
echo "LIVE_MEDIA_DESKTOP = \"/run/miso/bootmnt/${iso_name}/${target_arch}/desktopfs.sfs\"" >> "$conf"
echo "LIVE_MEDIA_TYPE = \"squashfs\"" >> "$conf"
echo "LIVE_USER_NAME = \"${username}\"" >> "$conf"
echo "KERNEL = \"${kernel}\"" >> "$conf"
echo "VMLINUZ = \"$(echo ${ALL_kver} | sed s'|/boot/||')\"" >> "$conf"
echo "INITRAMFS = \"$(echo ${default_image} | sed s'|/boot/||')\"" >> "$conf"
echo "FALLBACK = \"$(echo ${fallback_image} | sed s'|/boot/||')\"" >> "$conf"
if [[ -f $fs/usr/share/applications/thus.desktop && -f $fs/usr/bin/kdesu ]];then
sed -i -e 's|sudo|kdesu|g' $fs/usr/share/applications/thus.desktop
fi
}
configure_live_image(){
local fs="$1"
msg "Configuring [livefs]"
configure_hosts "$fs"
configure_system "$fs"
configure_services "$fs"
configure_calamares "$fs"
[[ ${edition} == "sonar" ]] && configure_thus "$fs"
write_live_session_conf "$fs"
msg "Done configuring [livefs]"
}
make_sig () { make_sig () {
local idir="$1" file="$2"
msg2 "Creating signature file..." msg2 "Creating signature file..."
cd "$1" cd "$idir"
user_own "$1" user_own "$idir"
su ${OWNER} -c "gpg --detach-sign --default-key ${gpgkey} $2.sfs" su ${OWNER} -c "gpg --detach-sign --default-key ${gpgkey} $file.sfs"
chown -R root "$1" chown -R root "$idir"
cd ${OLDPWD} cd ${OLDPWD}
} }
# $1: file
make_checksum(){ make_checksum(){
local idir="$1" file="$2"
msg2 "Creating md5sum ..." msg2 "Creating md5sum ..."
cd $1 cd $idir
md5sum $2.sfs > $2.md5 md5sum $file.sfs > $file.md5
cd ${OLDPWD} cd ${OLDPWD}
} }
@ -161,55 +199,35 @@ make_sfs() {
assemble_iso(){ assemble_iso(){
msg "Creating ISO image..." msg "Creating ISO image..."
local iso_publisher iso_app_id local iso_publisher="$(get_osname) <$(get_disturl)>" \
iso_app_id="$(get_osname) Live/Rescue CD" \
iso_publisher="$(get_osname) <$(get_disturl)>" mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
iso_app_id="$(get_osname) Live/Rescue CD"
# xorriso -as mkisofs \
# --protective-msdos-label \
# -volid "${iso_label}" \
# -appid "${iso_app_id}" \
# -publisher "${iso_publisher}" \
# -preparer "Prepared by manjaro-tools/${0##*/}" \
# -e /efi.img \
# -b boot/grub/i386-pc/eltorito.img \
# -c boot.catalog \
# -no-emul-boot \
# -boot-load-size 4 \
# -boot-info-table \
# -graft-points \
# --grub2-boot-info \
# --grub2-mbr ${iso_root}/boot/grub/i386-pc/boot_hybrid.img \
# --sort-weight 0 / --sort-weight 1 /boot \
# -isohybrid-gpt-basdat \
# -eltorito-alt-boot \
# -output "${iso_dir}/${iso_file}" \
# "${iso_root}/"
xorriso -as mkisofs \ xorriso -as mkisofs \
--protective-msdos-label \ --modification-date=${mod_date} \
-volid "${iso_label}" \ --protective-msdos-label \
-appid "${iso_app_id}" \ -volid "${iso_label}" \
-publisher "${iso_publisher}" \ -appid "${iso_app_id}" \
-preparer "Prepared by manjaro-tools/${0##*/}" \ -publisher "${iso_publisher}" \
-b boot/grub/i386-pc/eltorito.img \ -preparer "Prepared by manjaro-tools/${0##*/}" \
-c boot.catalog \ -r -graft-points -no-pad \
-no-emul-boot \ --sort-weight 0 / \
-boot-load-size 4 \ --sort-weight 1 /boot \
-boot-info-table \ --grub2-mbr ${iso_root}/boot/grub/i386-pc/boot_hybrid.img \
-graft-points \ -partition_offset 16 \
--grub2-boot-info \ -b boot/grub/i386-pc/eltorito.img \
--grub2-mbr ${iso_root}/boot/grub/i386-pc/boot_hybrid.img \ -c boot.catalog \
--sort-weight 0 / --sort-weight 1 /boot \ -no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot \ -eltorito-alt-boot \
-efi-boot-part --efi-boot-image \ -append_partition 2 0xef ${iso_root}/efi.img \
-e efi.img \ -e --interval:appended_partition_2:all:: \
-no-emul-boot \ -no-emul-boot \
-isohybrid-gpt-basdat \ -iso-level 3 \
-output "${iso_dir}/${iso_file}" \ -o ${iso_dir}/${iso_file} \
"${iso_root}/" ${iso_root}/
# arg to add with xorriso-1.4.7
# -iso_mbr_part_type 0x00
} }
# Build ISO # Build ISO
@ -250,154 +268,144 @@ gen_iso_fn(){
} }
reset_pac_conf(){ reset_pac_conf(){
info "Restoring [%s/etc/pacman.conf] ..." "$1" local fs="$1"
info "Restoring [%s/etc/pacman.conf] ..." "$fs"
sed -e 's|^.*HoldPkg.*|HoldPkg = pacman glibc manjaro-system|' \ sed -e 's|^.*HoldPkg.*|HoldPkg = pacman glibc manjaro-system|' \
-e "s|^.*#CheckSpace|CheckSpace|" \ -e "s|^.*#CheckSpace|CheckSpace|" \
-i "$1/etc/pacman.conf" -i "$fs/etc/pacman.conf"
} }
# Base installation (rootfs) # Base installation (rootfs)
make_image_root() { make_image_root() {
if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then if [[ ! -e ${work_dir}/rootfs.lock ]]; then
msg "Prepare [Base installation] (rootfs)" msg "Prepare [Base installation] (rootfs)"
local path="${work_dir}/rootfs" local rootfs="${work_dir}/rootfs"
mkdir -p ${path}
chroot_create "${path}" "${packages}" || die prepare_dir "${rootfs}"
pacman -Qr "${path}" > "${path}/rootfs-pkgs.txt" create_chroot "${mkchroot_args[@]}" "${rootfs}" "${packages[@]}"
copy_overlay "${profile_dir}/root-overlay" "${path}"
reset_pac_conf "${path}" pacman -Qr "${rootfs}" > "${rootfs}/rootfs-pkgs.txt"
copy_overlay "${profile_dir}/root-overlay" "${rootfs}"
configure_lsb "${path}" reset_pac_conf "${rootfs}"
configure_lsb "${rootfs}"
clean_up_image "${rootfs}"
clean_up_image "${path}"
: > ${work_dir}/build.${FUNCNAME}
msg "Done [Base installation] (rootfs)" msg "Done [Base installation] (rootfs)"
fi fi
} }
make_image_desktop() { make_image_desktop() {
if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then if [[ ! -e ${work_dir}/desktopfs.lock ]]; then
msg "Prepare [Desktop installation] (desktopfs)" msg "Prepare [Desktop installation] (desktopfs)"
local path="${work_dir}/desktopfs" local desktopfs="${work_dir}/desktopfs"
mkdir -p ${path}
mount_fs_root "${path}" prepare_dir "${desktopfs}"
chroot_create "${path}" "${packages}" mount_fs "${desktopfs}" "${work_dir}"
pacman -Qr "${path}" > "${path}/desktopfs-pkgs.txt" create_chroot "${mkchroot_args[@]}" "${desktopfs}" "${packages[@]}"
cp "${path}/desktopfs-pkgs.txt" ${iso_dir}/$(gen_iso_fn)-pkgs.txt
[[ -e ${profile_dir}/desktop-overlay ]] && copy_overlay "${profile_dir}/desktop-overlay" "${path}"
reset_pac_conf "${path}" pacman -Qr "${desktopfs}" > "${desktopfs}/desktopfs-pkgs.txt"
cp "${desktopfs}/desktopfs-pkgs.txt" ${iso_dir}/$(gen_iso_fn)-pkgs.txt
[[ -e ${profile_dir}/desktop-overlay ]] && copy_overlay "${profile_dir}/desktop-overlay" "${desktopfs}"
reset_pac_conf "${desktopfs}"
umount_fs umount_fs
clean_up_image "${path}" clean_up_image "${desktopfs}"
: > ${work_dir}/build.${FUNCNAME}
msg "Done [Desktop installation] (desktopfs)" msg "Done [Desktop installation] (desktopfs)"
fi fi
} }
mount_fs_select(){
if [[ -f "${packages_desktop}" ]]; then
mount_fs_desktop "$1"
else
mount_fs_root "$1"
fi
}
make_image_live() { make_image_live() {
if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then if [[ ! -e ${work_dir}/livefs.lock ]]; then
msg "Prepare [Live installation] (livefs)" msg "Prepare [Live installation] (livefs)"
local path="${work_dir}/livefs" local livefs="${work_dir}/livefs"
mkdir -p ${path}
mount_fs_select "${path}" prepare_dir "${livefs}"
chroot_create "${path}" "${packages}" mount_fs "${livefs}" "${work_dir}" "${desktop_list}"
pacman -Qr "${path}" > "${path}/livefs-pkgs.txt" create_chroot "${mkchroot_args[@]}" "${livefs}" "${packages[@]}"
copy_overlay "${profile_dir}/live-overlay" "${path}"
configure_live_image "${path}"
reset_pac_conf "${path}" pacman -Qr "${livefs}" > "${livefs}/livefs-pkgs.txt"
copy_overlay "${profile_dir}/live-overlay" "${livefs}"
configure_live_image "${livefs}"
reset_pac_conf "${livefs}"
umount_fs umount_fs
# Clean up GnuPG keys clean_up_image "${livefs}"
rm -rf "${path}/etc/pacman.d/gnupg"
clean_up_image "${path}"
: > ${work_dir}/build.${FUNCNAME}
msg "Done [Live installation] (livefs)" msg "Done [Live installation] (livefs)"
fi fi
} }
make_image_mhwd() { make_image_mhwd() {
if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then if [[ ! -e ${work_dir}/mhwdfs.lock ]]; then
msg "Prepare [drivers repository] (mhwdfs)" msg "Prepare [drivers repository] (mhwdfs)"
local path="${work_dir}/mhwdfs" local mhwdfs="${work_dir}/mhwdfs"
mkdir -p ${path}${mhwd_repo}
mount_fs_select "${path}" prepare_dir "${mhwdfs}${mhwd_repo}"
reset_pac_conf "${path}" mount_fs "${mhwdfs}" "${work_dir}" "${desktop_list}"
copy_from_cache "${path}" "${packages}" reset_pac_conf "${mhwdfs}"
if [[ -n "${packages_cleanup}" ]]; then copy_from_cache "${mhwdfs}" "${packages[@]}"
for mhwd_clean in ${packages_cleanup}; do
rm ${path}${mhwd_repo}/${mhwd_clean} if [[ -n "${packages_cleanup[@]}" ]]; then
for pkg in ${packages_cleanup[@]}; do
rm ${mhwdfs}${mhwd_repo}/${pkg}
done done
fi fi
cp ${DATADIR}/pacman-mhwd.conf ${path}/opt
make_repo "${path}" make_repo "${mhwdfs}"
configure_mhwd_drivers "${path}" configure_mhwd_drivers "${mhwdfs}"
umount_fs umount_fs
clean_up_image "${path}" clean_up_image "${mhwdfs}"
: > ${work_dir}/build.${FUNCNAME} : > ${work_dir}/mhwdfs.lock
msg "Done [drivers repository] (mhwdfs)" msg "Done [drivers repository] (mhwdfs)"
fi fi
} }
make_image_boot() { make_image_boot() {
if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then if [[ ! -e ${work_dir}/bootfs.lock ]]; then
msg "Prepare [/iso/boot]" msg "Prepare [/iso/boot]"
local boot="${iso_root}/boot" local boot="${iso_root}/boot"
mkdir -p ${boot} prepare_dir "${boot}"
cp ${work_dir}/rootfs/boot/vmlinuz* ${boot}/vmlinuz-${target_arch} cp ${work_dir}/rootfs/boot/vmlinuz* ${boot}/vmlinuz-${target_arch}
local path="${work_dir}/bootfs" local bootfs="${work_dir}/bootfs"
mkdir -p ${path}
if [[ -f "${packages_desktop}" ]]; then mount_fs "${bootfs}" "${work_dir}" "${desktop_list}"
mount_fs_live "${path}"
else
mount_fs_net "${path}"
fi
prepare_initcpio "${path}" prepare_initcpio "${bootfs}"
prepare_initramfs "${path}" prepare_initramfs "${bootfs}"
cp ${path}/boot/initramfs.img ${boot}/initramfs-${target_arch}.img cp ${bootfs}/boot/initramfs.img ${boot}/initramfs-${target_arch}.img
prepare_boot_extras "${path}" "${boot}" prepare_boot_extras "${bootfs}" "${boot}"
umount_fs umount_fs
rm -R ${path} rm -R ${bootfs}
: > ${work_dir}/build.${FUNCNAME} : > ${work_dir}/bootfs.lock
msg "Done [/iso/boot]" msg "Done [/iso/boot]"
fi fi
} }
configure_grub(){ configure_grub(){
local default_args="misobasedir=${iso_name} misolabel=${iso_label}" \ local conf="$1"
boot_args=('quiet') local default_args="misobasedir=${iso_name} misolabel=${iso_label}" boot_args=('quiet')
[[ ${initsys} == 'systemd' ]] && boot_args+=('systemd.show_status=1') [[ ${initsys} == 'systemd' ]] && boot_args+=('systemd.show_status=1')
sed -e "s|@DIST_NAME@|${dist_name}|g" \ sed -e "s|@DIST_NAME@|${dist_name}|g" \
@ -405,42 +413,46 @@ configure_grub(){
-e "s|@DEFAULT_ARGS@|${default_args}|g" \ -e "s|@DEFAULT_ARGS@|${default_args}|g" \
-e "s|@BOOT_ARGS@|${boot_args[*]}|g" \ -e "s|@BOOT_ARGS@|${boot_args[*]}|g" \
-e "s|@PROFILE@|${profile}|g" \ -e "s|@PROFILE@|${profile}|g" \
-i $1 -i $conf
}
configure_grub_theme(){
local conf="$1"
sed -e "s|@ISO_NAME@|${iso_name}|" -i "$conf"
} }
make_grub(){ make_grub(){
if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then if [[ ! -e ${work_dir}/grub.lock ]]; then
msg "Prepare [/iso/boot/grub]" msg "Prepare [/iso/boot/grub]"
local path="${work_dir}/rootfs" prepare_grub "${work_dir}/rootfs" "${work_dir}/livefs" "${iso_root}"
prepare_grub "${path}" "${iso_root}"
configure_grub "${iso_root}/boot/grub/kernels.cfg" configure_grub "${iso_root}/boot/grub/kernels.cfg"
configure_grub_theme "${iso_root}/boot/grub/variable.cfg"
: > ${work_dir}/build.${FUNCNAME} : > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]" msg "Done [/iso/boot/grub]"
fi fi
} }
check_requirements(){ check_requirements(){
[[ -f ${run_dir}/repo_info ]] || die "%s is not a valid iso profiles directory!" "${run_dir}" prepare_dir "${log_dir}"
if ! $(is_valid_arch_iso ${target_arch});then
die "%s is not a valid arch!" "${target_arch}"
fi
if ! $(is_valid_branch ${target_branch});then
die "%s is not a valid branch!" "${target_branch}"
fi
if ! is_valid_init "${initsys}";then eval_build_list "${list_dir_iso}" "${build_list_iso}"
die "%s is not a valid init system!" "${initsys}"
fi [[ -f ${run_dir}/repo_info ]] || die "%s is not a valid iso profiles directory!" "${run_dir}"
local iso_kernel=${kernel:5:1} host_kernel=$(uname -r) local iso_kernel=${kernel:5:1} host_kernel=$(uname -r)
if [[ ${iso_kernel} < "4" ]] \ if [[ ${iso_kernel} < "4" ]] \
|| [[ ${host_kernel%%*.} < "4" ]];then || [[ ${host_kernel%%*.} < "4" ]];then
die "The host and iso kernels must be version>=4.0!" die "The host and iso kernels must be version>=4.0!"
fi fi
for sig in TERM HUP QUIT; do
trap "trap_exit $sig \"$(gettext "%s signal caught. Exiting...")\" \"$sig\"" "$sig"
done
trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT
trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR
} }
compress_images(){ compress_images(){
@ -454,16 +466,16 @@ prepare_images(){
local timer=$(get_timer) local timer=$(get_timer)
load_pkgs "${profile_dir}/Packages-Root" load_pkgs "${profile_dir}/Packages-Root"
run_safe "make_image_root" run_safe "make_image_root"
if [[ -f "${packages_desktop}" ]] ; then if [[ -f "${desktop_list}" ]] ; then
load_pkgs "${packages_desktop}" load_pkgs "${desktop_list}"
run_safe "make_image_desktop" run_safe "make_image_desktop"
fi fi
if [[ -f ${profile_dir}/Packages-Live ]]; then if [[ -f ${profile_dir}/Packages-Live ]]; then
load_pkgs "${profile_dir}/Packages-Live" load_pkgs "${profile_dir}/Packages-Live"
run_safe "make_image_live" run_safe "make_image_live"
fi fi
if [[ -f ${packages_mhwd} ]] ; then if [[ -f ${mhwd_list} ]] ; then
load_pkgs "${packages_mhwd}" load_pkgs "${mhwd_list}"
run_safe "make_image_mhwd" run_safe "make_image_mhwd"
fi fi
run_safe "make_image_boot" run_safe "make_image_boot"
@ -532,41 +544,8 @@ get_pacman_conf(){
echo "$conf" echo "$conf"
} }
load_profile(){
conf="$1/profile.conf"
info "Profile: [%s]" "${profile}"
load_profile_config "$conf"
pacman_conf=$(get_pacman_conf)
mirrors_conf=$(get_pac_mirrors_conf "${target_branch}")
iso_file=$(gen_iso_fn).iso
mkchroot_args+=(-C ${pacman_conf} -S ${mirrors_conf} -B "${build_mirror}/${target_branch}" -K)
work_dir=${chroots_iso}/${profile}/${target_arch}
iso_dir="${cache_dir_iso}/${edition}/${profile}/${dist_release}"
iso_root=${chroots_iso}/${profile}/iso
mnt_dir=${chroots_iso}/${profile}/mnt
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
user_own "${iso_dir}"
}
prepare_profile(){
profile=$1
edition=$(get_edition ${profile})
profile_dir=${run_dir}/${edition}/${profile}
check_profile "${profile_dir}"
load_profile "${profile_dir}"
}
build(){ build(){
prepare_profile "$1" local prof="$1"
prepare_build "$prof"
make_profile make_profile
} }

View file

@ -11,11 +11,9 @@
export LC_MESSAGES=C export LC_MESSAGES=C
export LANG=C export LANG=C
disable_colors(){ declare ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
unset ALL_OFF BOLD BLUE GREEN RED YELLOW
}
enable_colors(){ if [[ -t 2 ]]; then
# prefer terminal safe colored and bold text when tput is supported # prefer terminal safe colored and bold text when tput is supported
if tput setaf 0 &>/dev/null; then if tput setaf 0 &>/dev/null; then
ALL_OFF="$(tput sgr0)" ALL_OFF="$(tput sgr0)"
@ -32,14 +30,8 @@ enable_colors(){
YELLOW="${BOLD}\e[33m" YELLOW="${BOLD}\e[33m"
BLUE="${BOLD}\e[34m" BLUE="${BOLD}\e[34m"
fi fi
readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
}
if [[ -t 2 ]]; then
enable_colors
else
disable_colors
fi fi
readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
plain() { plain() {
local mesg=$1; shift local mesg=$1; shift
@ -73,13 +65,42 @@ error() {
stat_busy() { stat_busy() {
local mesg=$1; shift local mesg=$1; shift
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" >&2 printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2
} }
stat_done() { stat_done() {
printf "${BOLD}done${ALL_OFF}\n" >&2 printf "${BOLD}done${ALL_OFF}\n" >&2
} }
lock_close() {
local fd=$1
exec {fd}>&-
}
lock() {
if ! [[ "/dev/fd/$1" -ef "$2" ]]; then
mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"'
fi
if ! flock -n $1; then
stat_busy "$3"
flock $1
stat_done
fi
}
slock() {
if ! [[ "/dev/fd/$1" -ef "$2" ]]; then
mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"'
fi
if ! flock -sn $1; then
stat_busy "$3"
flock -s $1
stat_done
fi
}
cleanup() { cleanup() {
exit ${1:-0} exit ${1:-0}
} }

View file

@ -10,23 +10,25 @@
# GNU General Public License for more details. # GNU General Public License for more details.
load_compiler_settings(){ load_compiler_settings(){
local tarch="$1" conf local arch="$1" conf
conf=${make_conf_dir}/$tarch.conf conf=${make_conf_dir}/$arch.conf
[[ -f $conf ]] || return 1 [[ -f $conf ]] || return 1
info "Loading compiler settings: %s" "$tarch" info "Loading compiler settings: %s" "$arch"
source $conf source $conf
return 0 return 0
} }
get_makepkg_conf(){ get_makepkg_conf(){
local conf="${tmp_dir}/makepkg-$1.conf"
local arch="$1"
local conf="${tmp_dir}/makepkg-${arch}.conf"
cp "${DATADIR}/makepkg.conf" "$conf" cp "${DATADIR}/makepkg.conf" "$conf"
load_compiler_settings "$1" load_compiler_settings "${arch}"
sed -i "$conf" \ sed -i "$conf" \
-e "s|@CARCH[@]|$carch|g" \ -e "s|@CARCH[@]|$carch|g" \
@ -36,111 +38,39 @@ get_makepkg_conf(){
echo "$conf" echo "$conf"
} }
# $1: target_arch
prepare_conf(){
if ! is_valid_arch_pkg "$1";then
die "%s is not a valid arch!" "$1"
fi
local pac_arch='default'
if [[ "$1" == 'multilib' ]];then
pac_arch='multilib'
is_multilib=true
fi
pacman_conf="${DATADIR}/pacman-$pac_arch.conf"
work_dir="${chroots_pkg}/${target_branch}/$1"
pkg_dir="${cache_dir_pkg}/${target_branch}/$1"
makepkg_conf=$(get_makepkg_conf "$1")
[[ "$pac_arch" == 'multilib' ]] && target_arch='x86_64'
}
check_build(){ check_build(){
find_pkg $1 local bdir="$1"
[[ ! -f $1/PKGBUILD ]] && die "Directory must contain a PKGBUILD!" find_pkg "${bdir}"
[[ ! -f ${bdir}/PKGBUILD ]] && die "Directory must contain a PKGBUILD!"
} }
find_pkg(){ find_pkg(){
local result=$(find . -type d -name "$1") local bdir="$1"
[[ -z $result ]] && die "%s is not a valid package or build list!" "$1" local result=$(find . -type d -name "${bdir}")
} [[ -z $result ]] && die "%s is not a valid package or build list!" "${bdir}"
load_group(){
local _multi \
_space="s| ||g" \
_clean=':a;N;$!ba;s/\n/ /g' \
_com_rm="s|#.*||g" \
devel_group='' \
file=${DATADIR}/base-devel-udev
info "Loading custom group: %s" "$file"
if ${is_multilib}; then
_multi="s|>multilib||g"
else
_multi="s|>multilib.*||g"
fi
devel_group=$(sed "$_com_rm" "$file" \
| sed "$_space" \
| sed "$_multi" \
| sed "$_clean")
echo ${devel_group}
} }
init_base_devel(){ init_base_devel(){
if ${udev_root};then if ${udev_root};then
base_packages=( "$(load_group)" ) local _multi _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g"
local file=${DATADIR}/base-devel-udev
# info "Loading custom group: %s" "$file"
_multi="s|>multilib.*||g"
${is_multilib} && _multi="s|>multilib||g"
packages=($(sed "$_com_rm" "$file" \
| sed "$_space" \
| sed "$_multi" \
| sed "$_clean"))
else else
if ${is_multilib};then packages=('base-devel')
base_packages=('base-devel' 'multilib-devel') ${is_multilib} && packages+=('multilib-devel')
else
base_packages=('base-devel')
fi
fi fi
} }
chroot_create(){
msg "Creating chroot for [%s] (%s)..." "${target_branch}" "${target_arch}"
mkdir -p "${work_dir}"
mkchroot_args+=(-L)
setarch "${target_arch}" \
mkchroot ${mkchroot_args[*]} \
"${work_dir}/root" \
${base_packages[*]} || abort
}
chroot_clean(){
msg "Cleaning chroot for [%s] (%s)..." "${target_branch}" "${target_arch}"
for copy in "${work_dir}"/*; do
[[ -d ${copy} ]] || continue
msg2 "Deleting chroot copy %s ..." "$(basename "${copy}")"
lock 9 "${copy}.lock" "Locking chroot copy '${copy}'"
subvolume_delete_recursive "${copy}"
rm -rf --one-file-system "${copy}"
done
exec 9>&-
rm -rf --one-file-system "${work_dir}"
}
chroot_update(){
msg "Updating chroot for [%s] (%s)..." "${target_branch}" "${target_arch}"
chroot-run ${mkchroot_args[*]} \
"${work_dir}/${OWNER}" \
pacman -Syu --noconfirm || abort
}
clean_up(){ clean_up(){
msg "Cleaning up ..." # msg "Cleaning up ..."
msg2 "Cleaning [%s]" "${pkg_dir}" msg2 "Cleaning [%s]" "${pkg_dir}"
find ${pkg_dir} -maxdepth 1 -name "*.*" -delete #&> /dev/null find ${pkg_dir} -maxdepth 1 -name "*.*" -delete #&> /dev/null
if [[ -z $SRCDEST ]];then if [[ -z $SRCDEST ]];then
@ -150,35 +80,38 @@ clean_up(){
} }
sign_pkg(){ sign_pkg(){
su ${OWNER} -c "signfile ${pkg_dir}/$1" local pkg="$1"
su ${OWNER} -c "signfile ${pkg_dir}/${pkg}"
} }
move_to_cache(){ move_to_cache(){
prepare_dir "${log_dir}"
local src="$1" local src="$1"
[[ -n $PKGDEST ]] && src="$PKGDEST/$1" [[ -n $PKGDEST ]] && src="$PKGDEST/$src"
[[ ! -f $src ]] && die [[ ! -f $src ]] && die
msg2 "Moving [%s] -> [%s]" "${src##*/}" "${pkg_dir}" msg2 "Moving [%s] -> [%s]" "${src##*/}" "${pkg_dir}"
mv $src ${pkg_dir}/ mv $src ${pkg_dir}/
${sign} && sign_pkg "${src##*/}" ${sign} && sign_pkg "${src##*/}"
[[ -n $PKGDEST ]] && rm "$1" # [[ -n $PKGDEST ]] && rm "$src"
user_own "${pkg_dir}" "-R" user_own "${pkg_dir}" "-R"
} }
archive_logs(){ archive_logs(){
local archive name="$1" ext=log.tar.xz ver src=${tmp_dir}/archives.list target='.' local archive name="$1" ext=log.tar.xz ver src=${tmp_dir}/archives.list dest='.'
ver=$(get_full_version "$name") ver=$(get_full_version "$name")
archive="${name}-${ver}-${target_arch}" archive="${name}-${ver}-${target_arch}"
if [[ -n $LOGDEST ]];then if [[ -n $LOGDEST ]];then
target=$LOGDEST dest=$LOGDEST
find $target -maxdepth 1 -name "$archive*.log" -printf "%f\n" > $src find ${dest} -maxdepth 1 -name "$archive*.log" -printf "%f\n" > $src
else else
find $target -maxdepth 1 -name "$archive*.log" > $src find ${dest} -maxdepth 1 -name "$archive*.log" > $src
fi fi
msg2 "Archiving log files [%s] ..." "$archive.$ext" msg2 "Archiving log files [%s] ..." "$archive.$ext"
tar -cJf ${log_dir}/$archive.$ext -C "$target" -T $src tar -cJf ${log_dir}/$archive.$ext -C "${dest}" -T $src
msg2 "Cleaning log files ..." msg2 "Cleaning log files ..."
find $target -maxdepth 1 -name "$archive*.log" -delete find ${dest} -maxdepth 1 -name "$archive*.log" -delete
} }
post_build(){ post_build(){
@ -197,30 +130,23 @@ post_build(){
archive_logs "$name" archive_logs "$name"
} }
chroot_init(){
local timer=$(get_timer)
if ${clean_first} || [[ ! -d "${work_dir}" ]]; then
chroot_clean
chroot_create
else
chroot_update
fi
show_elapsed_time "${FUNCNAME}" "${timer}"
}
build_pkg(){ build_pkg(){
prepare_dir "${pkg_dir}"
user_own "${pkg_dir}"
${purge} && clean_up
setarch "${target_arch}" \ setarch "${target_arch}" \
mkchrootpkg ${mkchrootpkg_args[*]} mkchrootpkg "${mkchrootpkg_args[@]}"
post_build post_build
} }
make_pkg(){ make_pkg(){
check_build "$1" local pkg="$1"
msg "Start building [%s]" "$1" check_build "${pkg}"
cd $1 msg "Start building [%s]" "${pkg}"
cd ${pkg}
build_pkg build_pkg
cd .. cd ..
msg "Finished building [%s]" "$1" msg "Finished building [%s]" "${pkg}"
show_elapsed_time "${FUNCNAME}" "${timer_start}" show_elapsed_time "${FUNCNAME}" "${timer_start}"
} }

View file

@ -9,6 +9,15 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details. # GNU General Public License for more details.
in_array() {
local needle=$1; shift
local item
for item in "$@"; do
[[ $item = $needle ]] && return 0 # Found
done
return 1 # Not Found
}
# $1: sofile # $1: sofile
# $2: soarch # $2: soarch
process_sofile() { process_sofile() {

View file

@ -135,7 +135,7 @@ write_unpack_conf(){
echo " - source: \"/run/miso/bootmnt/${iso_name}/${target_arch}/rootfs.sfs\"" >> "$conf" echo " - source: \"/run/miso/bootmnt/${iso_name}/${target_arch}/rootfs.sfs\"" >> "$conf"
echo " sourcefs: \"squashfs\"" >> "$conf" echo " sourcefs: \"squashfs\"" >> "$conf"
echo " destination: \"\"" >> "$conf" echo " destination: \"\"" >> "$conf"
if [[ -f "${packages_desktop}" ]] ; then if [[ -f "${desktop_list}" ]] ; then
echo " - source: \"/run/miso/bootmnt/${iso_name}/${target_arch}/desktopfs.sfs\"" >> "$conf" echo " - source: \"/run/miso/bootmnt/${iso_name}/${target_arch}/desktopfs.sfs\"" >> "$conf"
echo " sourcefs: \"squashfs\"" >> "$conf" echo " sourcefs: \"squashfs\"" >> "$conf"
echo " destination: \"\"" >> "$conf" echo " destination: \"\"" >> "$conf"
@ -238,6 +238,14 @@ write_postcfg_conf(){
fi fi
} }
write_umount_conf(){
local conf="${modules_dir}/umount.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo 'srcLog: "/root/.cache/Calamares/Calamares/Calamares.log"' >> "$conf"
echo 'destLog: "/var/log/Calamares.log"' >> "$conf"
}
get_yaml(){ get_yaml(){
local args=() yaml local args=() yaml
if ${chrootcfg};then if ${chrootcfg};then
@ -325,7 +333,7 @@ write_settings_conf(){
echo " - grubcfg" >> "$conf" echo " - grubcfg" >> "$conf"
echo " - bootloader" >> "$conf" && write_bootloader_conf echo " - bootloader" >> "$conf" && write_bootloader_conf
echo " - postcfg" >> "$conf" && write_postcfg_conf echo " - postcfg" >> "$conf" && write_postcfg_conf
echo " - umount" >> "$conf" echo " - umount" >> "$conf" && write_umount_conf
echo " - show:" >> "$conf" echo " - show:" >> "$conf"
echo " - finished" >> "$conf" && write_finished_conf echo " - finished" >> "$conf" && write_finished_conf
echo '' >> "$conf" echo '' >> "$conf"
@ -370,7 +378,7 @@ write_calamares_yaml(){
for conf in "${yaml_dir}"/etc/calamares/modules/*.conf "${yaml_dir}"/etc/calamares/settings.conf; do for conf in "${yaml_dir}"/etc/calamares/modules/*.conf "${yaml_dir}"/etc/calamares/settings.conf; do
check_yaml "$conf" check_yaml "$conf"
done done
fi fi
} }
write_netgroup_yaml(){ write_netgroup_yaml(){
@ -385,7 +393,7 @@ write_netgroup_yaml(){
for p in ${packages[@]};do for p in ${packages[@]};do
echo " - $p" >> "$2" echo " - $p" >> "$2"
done done
${validate} && check_yaml "$2" ${validate} && check_yaml "$2"
} }
write_pacman_group_yaml(){ write_pacman_group_yaml(){
@ -417,8 +425,8 @@ make_profile_yaml(){
prepare_check "$1" prepare_check "$1"
load_pkgs "${profile_dir}/Packages-Root" load_pkgs "${profile_dir}/Packages-Root"
write_netgroup_yaml "$1" "$(gen_fn "Packages-Root")" write_netgroup_yaml "$1" "$(gen_fn "Packages-Root")"
if [[ -f "${packages_desktop}" ]]; then if [[ -f "${desktop_list}" ]]; then
load_pkgs "${packages_desktop}" load_pkgs "${desktop_list}"
write_netgroup_yaml "$1" "$(gen_fn "Packages-Desktop")" write_netgroup_yaml "$1" "$(gen_fn "Packages-Desktop")"
fi fi
${calamares} && write_calamares_yaml "$1" ${calamares} && write_calamares_yaml "$1"

View file

@ -110,20 +110,10 @@ eval_build_list(){
esac" esac"
} }
in_array() {
local needle=$1; shift
local item
for item in "$@"; do
[[ $item = $needle ]] && return 0 # Found
done
return 1 # Not Found
}
get_timer(){ get_timer(){
echo $(date +%s) echo $(date +%s)
} }
# $1: start timer # $1: start timer
elapsed_time(){ elapsed_time(){
echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }') echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
@ -133,43 +123,6 @@ show_elapsed_time(){
info "Time %s: %s minutes" "$1" "$(elapsed_time $2)" info "Time %s: %s minutes" "$1" "$(elapsed_time $2)"
} }
lock() {
eval "exec $1>"'"$2"'
if ! flock -n $1; then
stat_busy "$3"
flock $1
stat_done
fi
}
slock() {
eval "exec $1>"'"$2"'
if ! flock -sn $1; then
stat_busy "$3"
flock -s $1
stat_done
fi
}
check_root() {
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo -- "$@"
else
exec su root -c "$(printf ' %q' "$@")"
fi
}
copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
}
copy_keyring(){
if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/"
fi
}
load_vars() { load_vars() {
local var local var
@ -207,11 +160,11 @@ init_common(){
[[ -z ${chroots_dir} ]] && chroots_dir='/var/lib/manjaro-tools' [[ -z ${chroots_dir} ]] && chroots_dir='/var/lib/manjaro-tools'
[[ -z ${log_dir} ]] && log_dir='/var/log/manjaro-tools'
[[ -z ${build_mirror} ]] && build_mirror='http://mirror.netzspielplatz.de/manjaro/packages' [[ -z ${build_mirror} ]] && build_mirror='http://mirror.netzspielplatz.de/manjaro/packages'
[[ -z ${tmp_dir} ]] && tmp_dir='/tmp/manjaro-tools' log_dir='/var/log/manjaro-tools'
tmp_dir='/tmp'
} }
init_buildtree(){ init_buildtree(){
@ -233,7 +186,7 @@ init_buildpkg(){
make_conf_dir="${SYSCONFDIR}/make.conf.d" make_conf_dir="${SYSCONFDIR}/make.conf.d"
[[ -d ${USERCONFDIR}/pkg.list.d ]] && list_dir_pkg=${USERCONFDIR}/pkg.list.d [[ -d ${MT_USERCONFDIR}/pkg.list.d ]] && list_dir_pkg=${MT_USERCONFDIR}/pkg.list.d
[[ -z ${build_list_pkg} ]] && build_list_pkg='default' [[ -z ${build_list_pkg} ]] && build_list_pkg='default'
@ -270,17 +223,17 @@ get_distid(){
} }
get_disturl(){ get_disturl(){
source /etc/os-release source /usr/lib/os-release
echo "${HOME_URL}" echo "${HOME_URL}"
} }
get_osname(){ get_osname(){
source /etc/os-release source /usr/lib/os-release
echo "${NAME}" echo "${NAME}"
} }
get_osid(){ get_osid(){
source /etc/os-release source /usr/lib/os-release
echo "${ID}" echo "${ID}"
} }
@ -289,7 +242,7 @@ init_buildiso(){
list_dir_iso="${SYSCONFDIR}/iso.list.d" list_dir_iso="${SYSCONFDIR}/iso.list.d"
[[ -d ${USERCONFDIR}/iso.list.d ]] && list_dir_iso=${USERCONFDIR}/iso.list.d [[ -d ${MT_USERCONFDIR}/iso.list.d ]] && list_dir_iso=${MT_USERCONFDIR}/iso.list.d
[[ -z ${build_list_iso} ]] && build_list_iso='default' [[ -z ${build_list_iso} ]] && build_list_iso='default'
@ -457,8 +410,8 @@ reset_profile(){
unset disable_openrc unset disable_openrc
unset enable_systemd_live unset enable_systemd_live
unset enable_openrc_live unset enable_openrc_live
unset packages_desktop unset desktop_list
unset packages_mhwd unset mhwd_list
unset login_shell unset login_shell
unset netinstall unset netinstall
unset chrootcfg unset chrootcfg
@ -494,9 +447,9 @@ check_profile(){
die "Profile [%s] sanity check failed!" "$1" die "Profile [%s] sanity check failed!" "$1"
fi fi
[[ -f "$1/Packages-Desktop" ]] && packages_desktop=$1/Packages-Desktop [[ -f "$1/Packages-Desktop" ]] && desktop_list=$1/Packages-Desktop
[[ -f "$1/Packages-Mhwd" ]] && packages_mhwd=$1/Packages-Mhwd [[ -f "$1/Packages-Mhwd" ]] && mhwd_list=$1/Packages-Mhwd
if ! ${netinstall}; then if ! ${netinstall}; then
chrootcfg="false" chrootcfg="false"
@ -600,7 +553,7 @@ load_pkgs(){
_purge="s|>cleanup.*||g" \ _purge="s|>cleanup.*||g" \
_purge_rm="s|>cleanup||g" _purge_rm="s|>cleanup||g"
packages=$(sed "$_com_rm" "$1" \ packages=($(sed "$_com_rm" "$1" \
| sed "$_space" \ | sed "$_space" \
| sed "$_blacklist" \ | sed "$_blacklist" \
| sed "$_purge" \ | sed "$_purge" \
@ -620,18 +573,18 @@ load_pkgs(){
| sed "$_basic_rm" \ | sed "$_basic_rm" \
| sed "$_extra" \ | sed "$_extra" \
| sed "$_extra_rm" \ | sed "$_extra_rm" \
| sed "$_clean") | sed "$_clean"))
if [[ $1 == "${packages_mhwd}" ]]; then if [[ $1 == "${mhwd_list}" ]]; then
[[ ${_used_kernel} < "42" ]] && local _amd="s|xf86-video-amdgpu||g" [[ ${_used_kernel} < "42" ]] && local _amd="s|xf86-video-amdgpu||g"
packages_cleanup=$(sed "$_com_rm" "$1" \ packages_cleanup=($(sed "$_com_rm" "$1" \
| grep cleanup \ | grep cleanup \
| sed "$_purge_rm" \ | sed "$_purge_rm" \
| sed "$_kernel" \ | sed "$_kernel" \
| sed "$_clean" \ | sed "$_clean" \
| sed "$_amd") | sed "$_amd"))
fi fi
} }
@ -654,7 +607,7 @@ write_repo_conf(){
for r in ${repos[@]}; do for r in ${repos[@]}; do
path=${r%/repo_info} path=${r%/repo_info}
name=${path##*/} name=${path##*/}
echo "run_dir=$path" > ${USERCONFDIR}/$name.conf echo "run_dir=$path" > ${MT_USERCONFDIR}/$name.conf
done done
} }
@ -667,13 +620,14 @@ load_user_info(){
USER_HOME=$HOME USER_HOME=$HOME
fi fi
USERCONFDIR="$USER_HOME/.config/manjaro-tools" MT_USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/manjaro-tools"
prepare_dir "${USERCONFDIR}" PAC_USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/pacman"
prepare_dir "${MT_USERCONFDIR}"
} }
load_run_dir(){ load_run_dir(){
[[ -f ${USERCONFDIR}/$1.conf ]] || write_repo_conf [[ -f ${MT_USERCONFDIR}/$1.conf ]] || write_repo_conf
[[ -r ${USERCONFDIR}/$1.conf ]] && source ${USERCONFDIR}/$1.conf [[ -r ${MT_USERCONFDIR}/$1.conf ]] && source ${MT_USERCONFDIR}/$1.conf
return 0 return 0
} }
@ -683,71 +637,13 @@ show_version(){
} }
show_config(){ show_config(){
if [[ -f ${USERCONFDIR}/manjaro-tools.conf ]]; then if [[ -f ${MT_USERCONFDIR}/manjaro-tools.conf ]]; then
msg2 "config: %s" "~/.config/manjaro-tools/manjaro-tools.conf" msg2 "config: %s" "~/.config/manjaro-tools/manjaro-tools.conf"
else else
msg2 "config: %s" "${manjaro_tools_conf}" msg2 "config: %s" "${manjaro_tools_conf}"
fi fi
} }
# $1: chroot
kill_chroot_process(){
# enable to have more debug info
#msg "machine-id (etc): $(cat $1/etc/machine-id)"
#[[ -e $1/var/lib/dbus/machine-id ]] && msg "machine-id (lib): $(cat $1/var/lib/dbus/machine-id)"
#msg "running processes: "
#lsof | grep $1
local prefix="$1" flink pid name
for root_dir in /proc/*/root; do
flink=$(readlink $root_dir)
if [ "x$flink" != "x" ]; then
if [ "x${flink:0:${#prefix}}" = "x$prefix" ]; then
# this process is in the chroot...
pid=$(basename $(dirname "$root_dir"))
name=$(ps -p $pid -o comm=)
info "Killing chroot process: %s (%s)" "$name" "$pid"
kill -9 "$pid"
fi
fi
done
}
create_min_fs(){
msg "Creating install root at %s" "$1"
mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,run,etc}
mkdir -m 1777 -p $1/tmp
mkdir -m 0555 -p $1/{sys,proc}
}
is_valid_init(){
case $1 in
'openrc'|'systemd') return 0 ;;
*) return 1 ;;
esac
}
is_valid_arch_pkg(){
eval "case $1 in
$(show_build_profiles "${make_conf_dir}")) return 0 ;;
*) return 1 ;;
esac"
}
is_valid_arch_iso(){
case $1 in
'i686'|'x86_64') return 0 ;;
*) return 1 ;;
esac
}
is_valid_branch(){
case $1 in
'stable'|'testing'|'unstable') return 0 ;;
*) return 1 ;;
esac
}
run(){ run(){
if ${is_build_list};then if ${is_build_list};then
for item in ${build_list[@]};do for item in ${build_list[@]};do
@ -758,21 +654,11 @@ run(){
fi fi
} }
is_btrfs() { check_root() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]] (( EUID == 0 )) && return
} if type -P sudo >/dev/null; then
exec sudo -- "${orig_argv[@]}"
subvolume_delete_recursive() { else
local subvol exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
is_btrfs "$1" || return 0
while IFS= read -d $'\0' -r subvol; do
if ! btrfs subvolume delete "$subvol" &>/dev/null; then
error "Unable to delete subvolume %s" "$subvol"
return 1
fi
done < <(find "$1" -xdev -depth -inum 256 -print0)
return 0
} }