Compare commits

..

83 Commits

Author SHA1 Message Date
1baf774b53 jenkins: update agent yaml 2020-12-16 12:07:09 +01:00
2a8f36c914 commitpkg: reenable git prune 2020-12-16 11:24:12 +01:00
ea2231980c refactor (#43)
update pkg conf

update iso conf & util-iso

unquote default display name for clone and push

fixes

mkchroot: uncomment work dir checks

mkchroot: create /etc/vconsole.conf

split out deploy.sh

rm deployiso

split out osrelease.sh

var rename of  moved conf vars
reorder m4 includes

refactor & artools-*.conf update

Reviewed-on: artix/artools#43
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-15 11:05:15 +01:00
1ebb75a09c buildiso: fix privs 2020-12-13 19:34:34 +01:00
ee3329223d refactor (#42)
shellcheck

shellcheck

simplify artools dirs mk

remove unused m4 includes

artix-chroot: fix fstab parse

Reviewed-on: artix/artools#42
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-13 16:44:41 +01:00
bfed603033 shellcheck (#41)
use funcs for makepkg.conf & pacman.conf

update base.conf

add missing m4 includes

signpkg: make msg consistent

shellcheck

comparepkg: fix arrays

comparepkg: put array in right place

more comment blocks

valid-names: update

add comment blocks

fixes

update m4 includes

update m4 includes

Makefile: cleanup

use m4_include()

shellcheck & rm obsolete

use repo name defs

valid-names: define all repos names here

add repo.sh

simplify check_root

reenable libdir

reorganize libs

Makefile: more fix libdir

Makefile: fix lib dir

dissolve libs

prepare m4 changes

more shellcheck

commitpkg: fix layout switch

fixes

rename artools-chroot

remove exits

artools-chroot: fix args
signpkg: fix passedfiles

deploypkg: fix passedfiles

chroot-run: fix mounting

comparepkg: fix find

buildtree: fix sync

rm obsolete

shellcheck

Reviewed-on: artix/artools#41
Co-Authored-By: artoo <artoo@artixlinux.org>
Co-Committed-By: artoo <artoo@artixlinux.org>
2020-12-12 20:41:12 +01:00
6721a997bd Merge pull request 's6: use s6-rc-bundle-update to add services' (#40) from Dudemanguy/artools:master into master
Reviewed-on: artix/artools#40
2020-11-29 19:31:46 +01:00
6da82fb56b s6: use s6-rc-bundle-update to add services
The s6 part of the buildiso script was originally added before the
s6-rc-bundle-update script was written which allows adding/removing
services from bundles on the fly. The s6/s6-rc/s6-linux-init backend is
being changed to always have the "default" runlevel defined so this
change in the buildiso script is necessary. The previous way of calling
s6-rc-bundle at the end of the loop will fail because the bundle will
already exist. Instead, we need to use the s6-rc-bundle-update script.
2020-11-29 12:15:31 -06:00
07ad0ef44a commitpkg: fix conditional (#39)
commitpkg: quote vars

commitpkg, support switching rebuild/stable both ways

commitpkg: fix conditional

Reviewed-on: artix/artools#39
2020-11-24 17:30:09 +01:00
6e5e89f164 commitpk: cover case if rebuild changes to staging on possible update 2020-11-23 11:31:20 +01:00
6494c1f787 split out repo defs (#38)
comparepkg: revert display name manipulation and show rebuild

valid-names: fix order

valid-names: use array data

split out repo defs

Reviewed-on: artix/artools#38
2020-11-23 00:55:25 +01:00
5d7abf194a rebuilds (#37)
use file based repo definitions

comparepkg: use case statement

comparepkg: support rebuild dir

add support for rebuild dir

Reviewed-on: artix/artools#37
2020-11-22 20:32:47 +01:00
12fb8aa279 batchpkg: add missing -u flag 2020-11-09 16:42:15 +01:00
d5e3d86210 add qt6 support 2020-10-18 17:38:17 +02:00
bfb20645c6 batchpkg: add update option 2020-10-07 22:05:50 +02:00
0b2973e802 batchpkg: add create option 2020-10-06 20:57:08 +02:00
887a587954 buildtree (#36)
reorder repos

shorten repo defaults

rename var

always enable essential repos
2020-09-20 10:25:19 +02:00
59c664fb30 update TREE_NAMES_ARTIX 2020-09-19 21:41:39 +02:00
75a9c79c72 add new repos support 2020-09-14 11:05:37 +02:00
00821f6e26 data: rm arch repos from pacman.conf 2020-09-04 00:38:20 +02:00
ceb83ff765 buildtree: fix replace invalid char 2020-08-25 21:26:01 +02:00
8b3f5899d3 disable arch extra 2020-07-31 00:24:08 +02:00
c1956b0139 start 0.20 2020-07-26 14:41:54 +02:00
4206fdeff1 buildiso: cp amd fw 2020-07-26 14:41:19 +02:00
ae41ba16c6 buildiso: rm ucode license copying, not present in latest firmware 2020-07-26 12:30:39 +02:00
cf87f88580 pkg2yaml: init pkgbase 2020-07-14 13:40:09 +02:00
76e97b3702 fixes (#35)
buildtree: fix repo msg
comparepkg: fix check_db
deploypkg: use CARCH
2020-06-14 19:59:41 +02:00
d1b2da317f comparepkg: fix color for moves 2020-06-14 13:38:07 +02:00
e59680bf11 commitpkg: simplify and cover all cases 2020-06-14 09:48:24 +02:00
defafdecce commitpkg: default to new layout 2020-06-14 09:02:48 +02:00
2c21030758 comparepkg: fix db check 2020-06-13 22:30:38 +02:00
e29cd8817a merge branch 'layout' into master 2020-06-13 20:09:27 +02:00
e551f42888 yaml (#32)
pkg2yaml: fixes

deploypkg: fix remove

pkg2yaml: change format
2020-06-12 15:24:42 +02:00
ad33bccd49 rm alpm 2020-06-08 03:02:53 +02:00
31eeaa9a0d docker (#30)
dpcker: upd pacman.conf

add docker data
2020-06-08 02:19:58 +02:00
f5daac0d67 commitpkg: commit removal of obsolete arch 2020-05-28 20:12:33 +02:00
2484ea39a4 commitpkg: support are change when moving 2020-05-28 15:54:43 +02:00
9b222bdb83 commitpkg: rm old arch on change of arch
signpkg: tweak msg
2020-05-28 10:39:19 +02:00
a3e6b17c5f deploypkg: add xz compat 2020-05-25 22:49:27 +02:00
21a37f6b00 buildtree: quote vars 2020-05-25 22:10:26 +02:00
80416b76d5 buildtree: fix import for new pkgs 2020-05-25 21:01:05 +02:00
2113ffe4c6 newrepo (#29)
buildtree: only -n creates repos

buildtree: move msg in sync func

buildtree: deprecate pkglists
2020-05-25 18:29:24 +02:00
438473c878 quote vars 2020-05-25 00:14:17 +02:00
86c5c2f47b rm signfile 2020-05-24 19:06:51 +02:00
d333c245c0 next (#28)
deploypkg: fix return codes

deploypkg: only remocve if pkg is in repo

deploypkg: refactor

move unique funcs to script

signpkg: fix typo

minor tweaks
rm commented code

signpkg: load makepkg.conf

buildpkg & deploypkg: add optarg to set repo, proves to be better in pipeline to generate cmd args
add signpkg

start 0.18

deploypkg: add sign check
2020-05-24 11:15:25 +02:00
4a650f00d7 Merge pull request 's6: use database names instead of directory names' (#27) from Dudemanguy/artools:master into master 2020-04-28 17:52:27 +02:00
08b73032a2 buildtree: add gfx group 2020-04-28 17:51:53 +02:00
1a250c2167 s6: use database names instead of directory names
It's possible for a service in s6 to exist but for its name to not
actually be the same as the name of an existing directory (ex: a
pipeline of a logger and service daemon). Instead, rework this function
to detect if a service exists based on whether it is defined in the
s6-rc database.
2020-04-27 16:42:58 -05:00
46431619f2 chroot-run: don't sync tz 2020-04-26 18:49:48 +02:00
12d2159c12 deploypkg: exclude *.log 2020-04-26 18:49:23 +02:00
3865ceab58 buildtree: support new super repos 2020-03-18 22:04:37 +01:00
890e631e1b add net pkg group 2020-03-08 16:27:08 +01:00
273e928905 mkchrootpkg: kill left over nspawn 2020-03-01 10:40:23 +01:00
f5c328f8e5 mkchrootpkg: use the chroot database to find checkpkg packages 2020-02-27 20:53:06 +01:00
4089151791 buildtree: fix team assignment for *testing & *staging 2020-02-25 10:19:51 +01:00
211579f9d7 lib/gitea: remove admin 2020-02-24 00:11:18 +01:00
2a85209e1e buildtree: fix patching 2020-02-21 15:54:49 +01:00
40d691bc85 redo arch repos 2020-02-19 23:12:37 +01:00
d9da64eb51 buildtree: use jq to parse json (#26)
buildtree: fix team for new repos

doouble quote some vars

add git.sh lib

fixes

comparepkg: clean up ugly code

house cleaning

comparepkg: slightly improve performance

fix typo

revert to cloning a new pkg repo

test subrepo init

let buildtree assign team to new repo

commitpkg: check team pkgs

buildtree: improve repo creation, should work push to create with gitea-1.11

commitpkg: fix cross check

commitpkg: run team change check last

commitpkg: rm empty func

commitpkg: change team on cross repo move

buildtree: use jq to parse json
2020-02-16 11:34:58 +01:00
5902f987cc Merge branch 's6-typo-fix' of artix/artools into master 2020-01-26 00:32:46 +01:00
bfa888251e s6: fix a typo 2020-01-24 20:47:58 -06:00
0ecfa1a0f6 Merge branch 's6-fixes' of artix/artools into master 2020-01-24 18:47:07 +01:00
e60180ebdb s6: manually rebuild s6-linux-init binaries
Since the s6-linux-init package is more generic now and has no special
compile options, the binaries need to be rebuilt while making the
liveiso so it works correctly.
2020-01-24 10:59:07 -06:00
20b65d06c8 pkg: use zst 2020-01-11 02:59:10 +01:00
c7728c2e5b start 0.17 2020-01-11 02:58:40 +01:00
a0ca1ab3a4 update makepkg.conf 2020-01-10 23:03:18 +01:00
911a0fff36 buildiso: fix grub theme paths 2019-12-15 23:30:31 +01:00
f80c51e8d3 buildiso: fix umount on error 2019-12-15 23:00:17 +01:00
1e948b3ef5 buildiso: fix cal unpackfs path 2019-12-14 23:14:47 +01:00
bf0a9bc7fc don't create dirs in load_config 2019-12-13 22:50:58 +01:00
a4a690951c set extglob 2019-12-13 21:06:22 +01:00
e05765269e buildiso: fix msg 2019-12-13 18:59:50 +01:00
3df364189b mkchrootpkg: apply arch patch 2019-12-13 18:59:27 +01:00
974df38738 iso (#23) 2019-12-13 18:06:47 +01:00
7b831d8867 arch patches (#22) 2019-12-13 17:51:20 +01:00
7bf4dff1a1 buildiso: add grub kopt msg 2019-11-27 09:55:35 +01:00
529e73e2ab buildiso: add dracut support 2019-11-19 21:41:49 +01:00
7be420a24f buildiso: set proper device label for rw 2019-11-19 14:55:31 +01:00
cd76f7d3cf buildiso: use md5 for img sums 2019-11-19 01:10:58 +01:00
918b95db58 initcpio: fix pxe 2019-11-19 01:10:17 +01:00
77c464d603 initcpio (#21) 2019-11-18 21:06:16 +01:00
55945b8975 refact (#20) 2019-11-17 21:59:25 +01:00
f83cc2a4a8 lib & var cleaning 2019-11-12 10:19:28 +01:00
78 changed files with 2960 additions and 3016 deletions

View File

@@ -1,12 +1,9 @@
VERSION=0.16
CHROOT_VERSION=0.10
VERSION=0.21
TOOLS = artools
PREFIX ?= /usr
SYSCONFDIR = /etc
BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/lib
DATADIR = $(PREFIX)/share
CPIODIR = $(SYSCONFDIR)/initcpio
@@ -14,20 +11,14 @@ BASE_CONF = \
data/conf/artools-base.conf
BASE_BIN = \
bin/base/signfile \
bin/base/chroot-run \
bin/base/mkchroot \
bin/base/basestrap \
bin/base/artools-chroot \
bin/base/artix-chroot \
bin/base/fstabgen
BASE_LIBS = \
$(wildcard lib/base/*.sh)
BASE_UTIL = lib/util-base.sh
BASE_DATA = \
$(wildcard data/base/pacman*.conf)
$(wildcard data/pacman/pacman*.conf)
PKG_CONF = \
data/conf/artools-pkg.conf
@@ -45,7 +36,8 @@ PKG_BIN = \
bin/pkg/checkpkg \
bin/pkg/finddeps \
bin/pkg/find-libdeps \
bin/pkg/batchpkg
bin/pkg/batchpkg \
bin/pkg/signpkg
LN_COMMITPKG = \
extrapkg \
@@ -59,7 +51,8 @@ LN_COMMITPKG = \
multilib-testingpkg \
multilib-stagingpkg \
kde-unstablepkg \
gnome-unstablepkg
gnome-unstablepkg \
rebuildpkg
LN_BUILDPKG = \
buildpkg-system \
@@ -89,13 +82,9 @@ LN_DEPLOYPKG = \
deploypkg-kde-wobble \
deploypkg-gnome-wobble
PKG_LIBS = \
$(wildcard lib/pkg/*)
PKG_UTIL = lib/util-pkg.sh
PKG_DATA = \
data/pkg/makepkg.conf
data/pacman/makepkg.conf \
data/valid-names.conf
PATCHES = \
$(wildcard data/patches/*.patch)
@@ -104,21 +93,12 @@ ISO_CONF = \
data/conf/artools-iso.conf
ISO_BIN = \
bin/iso/buildiso \
bin/iso/deployiso
bin/iso/buildiso
LN_BUILDISO = \
buildiso-gremlins \
buildiso-goblins
ISO_LIBS = \
$(wildcard lib/iso/*.sh)
ISO_UTIL = lib/util-iso.sh
ISO_DATA = \
data/iso/mkinitcpio.conf
DIRMODE = -dm0755
FILEMODE = -m0644
MODE = -m0755
@@ -129,32 +109,22 @@ CHMODAW = chmod a-w
CHMODX = chmod +x
BIN = $(BASE_BIN) $(PKG_BIN) $(ISO_BIN)
UTIL = $(BASE_UTIL) $(PKG_UTIL) $(ISO_UTIL)
all: $(BIN) $(UTIL)
all: $(BIN)
EDIT_UTIL = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@sysconfdir[@]|$(SYSCONFDIR)|g" \
-e "s|@libdir[@]|$(LIBDIR)|g" \
-e "s|@chroot_version@|$(CHROOT_VERSION)|"
EDIT = sed -e "s|@datadir[@]|$(DATADIR)|g" \
-e "s|@sysconfdir[@]|$(SYSCONFDIR)|g"
EDIT_BIN = sed -e "s|@libdir[@]|$(LIBDIR)|g"
$(UTIL): %: %.in Makefile
%: %.in Makefile lib/util-base.sh
@echo "GEN $@"
@$(RM) "$@"
@$(M4) $@.in | $(EDIT_UTIL) >$@
@$(CHMODAW) "$@"
$(BIN): %: %.in Makefile
@echo "GEN $@"
@$(RM) "$@"
@$(M4) $@.in | $(EDIT_BIN) >$@
@{ echo -n 'm4_changequote([[[,]]])'; cat $@.in; } | $(M4) | $(EDIT) >$@
@$(CHMODAW) "$@"
@$(CHMODX) "$@"
@bash -O extglob -n "$@"
clean:
$(RM) $(BIN) $(UTIL)
$(RM) $(BIN)
install_base:
install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
@@ -163,10 +133,6 @@ install_base:
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(BASE_BIN) $(DESTDIR)$(BINDIR)
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(FILEMODE) $(BASE_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(BASE_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(BASE_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
@@ -185,9 +151,7 @@ install_pkg:
for l in $(LN_BUILDPKG); do $(LN) buildpkg $(DESTDIR)$(BINDIR)/$$l; done
for l in $(LN_DEPLOYPKG); do $(LN) deploypkg $(DESTDIR)$(BINDIR)/$$l; done
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install $(FILEMODE) $(PKG_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(PKG_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
$(LN) artix-chroot $(DESTDIR)$(BINDIR)/artools-chroot
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(PKG_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
@@ -207,13 +171,6 @@ install_iso: install_cpio
for l in $(LN_BUILDISO); do $(LN) buildiso $(DESTDIR)$(BINDIR)/$$l; done
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(FILEMODE) $(ISO_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(ISO_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(ISO_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install: install_base install_pkg install_iso
.PHONY: all clean install install_base install_pkg install_iso

View File

@@ -28,7 +28,7 @@ artools
- pkg:
* namcap
* git-subrepo
* jshon
* jq
- iso:
* dosfstools

View File

@@ -14,23 +14,78 @@
shopt -s extglob
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/base/mount.sh)
#{{{ functions
chroot_part_mount() {
info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}")
}
chroot_part_umount() {
chroot_api_umount
info "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
unset CHROOT_ACTIVE_PART_MOUNTS
}
detect(){
local detected
detected="$(os-prober | tr ' ' '_' | paste -s -d ' ')"
echo "${detected}"
}
# $1: os-prober array
get_os_name(){
local str=$1
str="${str#*:}"
str="${str#*:}"
str="${str%:*}"
echo "$str"
}
mount_os(){
CHROOT_ACTIVE_PART_MOUNTS=()
CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_part_umount
chroot_part_mount "$2" "$1"
local mounts
mounts=$(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' "$1"/etc/fstab)
for entry in ${mounts}; do
entry=${entry//UUID=}
local dev=${entry%:*} mp=${entry#*:}
case "${entry#*:}" in
'/'|'swap'|'none') continue ;;
*) chroot_part_mount "/dev/disk/by-uuid/${dev}" "$1${mp}" ;;
esac
done
chroot_setup "$1" true
chroot_add_resolv_conf "$1"
}
select_os(){
local os_list=( $(detect) ) count=${#os_list[@]}
if [[ ${count} > 1 ]];then
local os_list=( "$(detect)" ) count=${#os_list[@]}
if [[ ${count} -gt 1 ]];then
msg "Detected systems:"
local i=0
for os in ${os_list[@]};do
for os in "${os_list[@]}"; do
local last=${os##*:}
case $last in
'efi') count=$((count-1)) ;;
*) info "$i) $(get_os_name $os)"; i=$((i+1)) ;;
*) info "$i) $(get_os_name "$os")"; i=$((i+1)) ;;
esac
done
i=0
msg "Select system to mount [0-%s] : " "$((count-1))"
read select
read -r select
else
select=0
fi
@@ -39,13 +94,15 @@ select_os(){
root=${os_str%%:*}
type=${type##*:}
if [[ "${type##*:}" == 'linux' ]];then
msg "Mounting (%s) [%s]" "$(get_os_name $os_str)" "$root"
msg "Mounting (%s) [%s]" "$(get_os_name "$os_str")" "$root"
mount_os "$1" "$root"
else
die "You can't mount %s!" "$select"
fi
}
#}}}
automount=false
usage() {
@@ -59,11 +116,9 @@ usage() {
echo " and ${chrootdir}."
echo ''
echo ''
exit $1
exit "$1"
}
orig_argv=("$0" "$@")
opts=':ha'
while getopts ${opts} arg; do
@@ -79,13 +134,13 @@ check_root
if ${automount};then
chrootdir=/mnt
run_args=/bin/bash
run_args=(/bin/bash)
select_os "${chrootdir}"
else
chrootdir=$1
shift
run_args="$@"
run_args=("$@")
[[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}"
@@ -93,4 +148,4 @@ else
chroot_add_resolv_conf "${chrootdir}"
fi
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" ${run_args[*]}
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "${run_args[@]}"

View File

@@ -22,7 +22,11 @@
shopt -s extglob
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
m4_include(lib/base/mount.sh)
m4_include(lib/base/chroot.sh)
#{{{ functions
copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
@@ -36,16 +40,19 @@ copy_keyring(){
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/pacman.d}
mkdir -m 1777 -p $1/tmp
mkdir -m 0555 -p $1/{sys,proc}
mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d}
mkdir -m 1777 -p "$1"/tmp
mkdir -m 0555 -p "$1"/{sys,proc}
}
#}}}
newroot=/mnt
hostcache=0
copykeyring=1
copymirrorlist=1
pacmode=-Sy
usage() {
echo "usage: ${0##*/} [options] root [packages...]"
@@ -54,18 +61,17 @@ usage() {
echo " -G Avoid copying the host's pacman keyring to the target"
echo " -i Avoid auto-confirmation of package selections"
echo " -M Avoid copying the host's mirrorlist to the target"
echo ' -U Use pacman -U to install packages'
echo " -h Print this help message"
echo ''
echo ' basestrap installs packages to the specified new root directory.'
echo ' If no packages are given, basestrap defaults to the "base" group.'
echo ''
echo ''
exit $1
exit "$1"
}
orig_argv=("$0" "$@")
opts=':C:cGiM'
opts=':C:cGiMU'
while getopts ${opts} arg; do
case "${arg}" in
@@ -74,6 +80,7 @@ while getopts ${opts} arg; do
i) interactive=1 ;;
G) copykeyring=0 ;;
M) copymirrorlist=0 ;;
U) pacmode=-U ;;
:) echo "invalid argument ${arg}:$OPTARG"; usage 1;;
?) usage 0 ;;
esac
@@ -109,7 +116,7 @@ if (( copykeyring ));then
fi
msg2 'Installing packages to %s' "$newroot"
if ! pacman -r "$newroot" -Sy "${pacman_args[@]}"; then
if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then
die 'Failed to install packages to new root'
fi

View File

@@ -12,9 +12,26 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
chroot_version=0.9
m4_include(lib/base/message.sh)
m4_include(lib/base/mount.sh)
m4_include(lib/base/chroot.sh)
. @libdir@/artools/util-base.sh
# $1: chroot
kill_chroot_process(){
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
}
# umask might have been changed in /etc/profile
# ensure that sane default is set again
@@ -23,7 +40,7 @@ umask 0022
working_dir=''
files=()
mount_args=()
mount_args=("-B:/etc/hosts:/etc/hosts")
usage() {
echo "Usage: ${0##*/} [options] working-dir [run arguments]"
@@ -41,8 +58,6 @@ usage() {
exit 1
}
orig_argv=("$0" "$@")
opts='hC:M:c:b:f:s'
while getopts ${opts} arg; do
@@ -52,12 +67,12 @@ while getopts ${opts} arg; do
c) cache_dirs+=("$OPTARG") ;;
f) files+=("$OPTARG") ;;
s) nosetarch=1 ;;
b) bindmounts=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;;
b) bindmounts+=("$OPTARG"); mount_args+=(${bindmounts[@]}) ;;
h|?) usage ;;
*) error "invalid argument '$arg'"; usage ;;
esac
done
shift $(($OPTIND - 1))
shift $(( OPTIND - 1 ))
(( $# < 1 )) && die 'You must specify a directory.'
@@ -74,10 +89,12 @@ if (( ${#cache_dirs[@]} == 0 )); then
mapfile -t cache_dirs < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" CacheDir)
fi
host_mirrors=($($pacconf_cmd --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#'))
# shellcheck disable=2016
host_mirrors=($("$pacconf_cmd" --repo world Server 2> /dev/null | sed -r 's#(.*/)world/os/.*#\1$repo/os/$arch#'))
for host_mirror in "${host_mirrors[@]}"; do
if [[ $host_mirror == *file://* ]]; then
# shellcheck disable=2016
host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g')
info "host mirror: %s" "$host_mirror"
in_array "$host_mirror" "${cache_dirs[@]}" || cache_dirs+=("$host_mirror")
@@ -85,17 +102,16 @@ for host_mirror in "${host_mirrors[@]}"; do
done
while read -r line; do
# shellcheck disable=2016
mapfile -t lines < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" \
--repo $line Server | sed -r 's#(.*/)[^/]+/os/.+#\1$repo/os/$arch#')
if [[ ${lines[0]} != ${host_mirrors[0]} ]]; then
for line in "${lines[@]}"; do
if [[ $line = file://* ]]; then
line=${line#file://}
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi
done
fi
done < <($pacconf_cmd --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
--repo "$line" Server | sed -r 's#(.*/)[^/]+/os/.+#\1#')
for line in "${lines[@]}"; do
if [[ $line = file://* ]]; then
line=${line#file://}
in_array "$line" "${cache_dirs[@]}" || cache_dirs+=("$line")
fi
done
done < <("$pacconf_cmd" --config "${pac_conf:-$working_dir/etc/pacman.conf}" --repo-list)
copy_hostconf () {
unshare --fork --pid gpg --homedir "$working_dir"/etc/pacman.d/gnupg/ --no-permission-warning --quiet --batch --import --import-options import-local-sigs "$(pacman-conf GpgDir)"/pubring.gpg >/dev/null 2>&1
@@ -103,9 +119,9 @@ copy_hostconf () {
printf 'Server = %s\n' "${host_mirrors[@]}" >"$working_dir/etc/pacman.d/mirrorlist"
[[ -n $pacman_conf ]] && cp $pacman_conf "${working_dir}/etc/pacman.conf"
[[ -n $pacman_conf ]] && cp "$pacman_conf" "${working_dir}/etc/pacman.conf"
[[ -n $makepkg_conf ]] && cp $makepkg_conf "${working_dir}/etc/makepkg.conf"
[[ -n $makepkg_conf ]] && cp "$makepkg_conf" "${working_dir}/etc/makepkg.conf"
local file
for file in "${files[@]}"; do
@@ -116,7 +132,7 @@ copy_hostconf () {
sed -r "s|^#?\\s*CacheDir.+|CacheDir = ${cache_dirs[*]}|g" -i "${working_dir}/etc/pacman.conf"
}
mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}" "-B:/etc/hosts:/etc/hosts")
mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}")
for cache_dir in "${cache_dirs[@]:1}"; do
mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}")
@@ -125,7 +141,7 @@ done
chroot_extra_mount() {
chroot_add_resolv_conf "${working_dir}"
for arg in ${mount_args[@]}; do
for arg in "${mount_args[@]}"; do
local flag=${arg%%:*}
local dest=${arg##*:}
local src=${arg%:*}
@@ -145,11 +161,11 @@ umask 0022
# Sanity check
if [[ ! -f "$working_dir/.artools" ]]; then
die "'%s' does not appear to be an artix chroot." "$working_dir"
elif [[ $(cat "$working_dir/.artools") != ${CHROOTVERSION} ]]; then
elif [[ $(cat "$working_dir/.artools") != "${CHROOTVERSION}" ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}"
fi
sync_host_localtime
#sync_host_localtime
chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}"
@@ -157,7 +173,7 @@ chroot_extra_mount
copy_hostconf
eval $(grep '^CARCH=' "$working_dir/etc/makepkg.conf")
eval "$(grep '^CARCH=' "$working_dir/etc/makepkg.conf")"
[[ -z $nosetarch ]] || unset CARCH

View File

@@ -14,10 +14,214 @@
shopt -s extglob
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
#{{{ filesystems
declare -A pseudofs_types=([anon_inodefs]=1
[autofs]=1
[bdev]=1
[bpf]=1
[binfmt_misc]=1
[cgroup]=1
[cgroup2]=1
[configfs]=1
[cpuset]=1
[debugfs]=1
[devfs]=1
[devpts]=1
[devtmpfs]=1
[dlmfs]=1
[efivarfs]=1
[fuse.gvfs-fuse-daemon]=1
[fusectl]=1
[hugetlbfs]=1
[mqueue]=1
[nfsd]=1
[none]=1
[pipefs]=1
[proc]=1
[pstore]=1
[ramfs]=1
[rootfs]=1
[rpc_pipefs]=1
[securityfs]=1
[sockfs]=1
[spufs]=1
[sysfs]=1
[tmpfs]=1)
declare -A fsck_types=([cramfs]=1
[exfat]=1
[ext2]=1
[ext3]=1
[ext4]=1
[ext4dev]=1
[jfs]=1
[minix]=1
[msdos]=1
[reiserfs]=1
[vfat]=1
[xfs]=1)
#}}}
#{{{ functions
fstype_is_pseudofs() {
(( pseudofs_types["$1"] ))
}
fstype_has_fsck() {
(( fsck_types["$1"] ))
}
valid_number_of_base() {
local base=$1 len=${#2} i
for (( i = 0; i < len; i++ )); do
{ _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
done
return 0
}
mangle() {
local i chr out
local {a..f}= {A..F}=
for (( i = 0; i < ${#1}; i++ )); do
chr=${1:i:1}
case $chr in
[[:space:]\\])
printf -v chr '%03o' "'$chr"
out+=\\
;;
esac
out+=$chr
done
printf '%s' "$out"
}
unmangle() {
local i chr out len=$(( ${#1} - 4 ))
local {a..f}= {A..F}=
for (( i = 0; i < len; i++ )); do
chr=${1:i:1}
case $chr in
\\)
if valid_number_of_base 8 "${1:i+1:3}" ||
valid_number_of_base 16 "${1:i+1:3}"; then
printf -v chr '%b' "${1:i:4}"
(( i += 3 ))
fi
;;
esac
out+=$chr
done
printf '%s' "$out${1:i}"
}
dm_name_for_devnode() {
read -r dm_name <"/sys/class/block/${1#/dev/}/dm/name"
if [[ $dm_name ]]; then
printf '/dev/mapper/%s' "$dm_name"
else
# don't leave the caller hanging, just print the original name
# along with the failure.
print '%s' "$1"
error 'Failed to resolve device mapper name for: %s' "$1"
fi
}
optstring_match_option() {
local candidate pat patterns
IFS=, read -ra patterns <<<"$1"
for pat in "${patterns[@]}"; do
if [[ $pat = *=* ]]; then
# "key=val" will only ever match "key=val"
candidate=$2
else
# "key" will match "key", but also "key=anyval"
candidate=${2%%=*}
fi
[[ $pat = "$candidate" ]] && return 0
done
return 1
}
optstring_remove_option() {
local o options_ remove=$2 IFS=,
read -ra options_ <<<"${!1}"
for o in "${!options_[@]}"; do
optstring_match_option "$remove" "${options_[o]}" && unset 'options_[o]'
done
declare -g "$1=${options_[*]}"
}
optstring_normalize() {
local o options_ norm IFS=,
read -ra options_ <<<"${!1}"
# remove empty fields
for o in "${options_[@]}"; do
[[ $o ]] && norm+=("$o")
done
# avoid empty strings, reset to "defaults"
declare -g "$1=${norm[*]:-defaults}"
}
optstring_append_option() {
if ! optstring_has_option "$1" "$2"; then
declare -g "$1=${!1},$2"
fi
optstring_normalize "$1"
}
optstring_prepend_option() {
if ! optstring_has_option "$1" "$2"; then
declare -g "$1=$2,${!1}"
fi
optstring_normalize "$1"
}
optstring_get_option() {
local opts o
IFS=, read -ra opts <<<"${!1}"
for o in "${opts[@]}"; do
if optstring_match_option "$2" "$o"; then
declare -g "$o"
return 0
fi
done
return 1
}
optstring_has_option() {
local "${2%%=*}"
optstring_get_option "$1" "$2"
}
write_source() {
local src=$1 spec= label= uuid= comment=()
local src=$1 spec label uuid comment=()
label=$(lsblk -rno LABEL "$1" 2>/dev/null)
uuid=$(lsblk -rno UUID "$1" 2>/dev/null)
@@ -45,7 +249,7 @@ write_source() {
;;
esac
[[ $comment ]] && printf '# %s\n' "${comment[*]}"
[[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}"
if [[ $spec ]]; then
printf '%-20s' "$bytag=$(mangle "$spec")"
@@ -55,7 +259,7 @@ write_source() {
}
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
# if the system we're generating the fstab for has any support for SELinux (as
@@ -78,7 +282,7 @@ optstring_apply_quirks() {
;;
vfat)
# 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_append_option "$varname" "codepage=${codepage#cp}"
fi
@@ -86,6 +290,8 @@ optstring_apply_quirks() {
esac
}
#}}}
usage() {
cat <<EOF
usage: ${0##*/} [options] root
@@ -203,7 +409,7 @@ done
# handle swaps devices
{
# ignore header
read
read -r
while read -r device type _ _ prio; do
options=defaults

View File

@@ -12,9 +12,11 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
working_dir=''
umode=''
files=()
chroot_args=()
@@ -22,6 +24,7 @@ chroot_args=()
usage() {
echo "Usage: ${0##*/} [options] working-dir package-list..."
echo ' options:'
echo ' -U Use pacman -U to install packages'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -c <dir> Set pacman cache'
@@ -31,12 +34,11 @@ usage() {
exit 1
}
orig_argv=("$0" "$@")
opts='hC:M:c:f:s'
opts='hUC:M:c:f:s'
while getopts ${opts} arg; do
case "${arg}" in
U) umode=U ;;
C) pacman_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
c) cache_dir="$OPTARG" ;;
@@ -45,16 +47,18 @@ while getopts ${opts} arg; do
h|?) usage ;;
*) error "invalid argument '%s'" "$arg"; usage ;;
esac
chroot_args+=("-$arg")
[[ -v OPTARG ]] && chroot_args+=("$OPTARG")
if [[ $arg != U ]]; then
chroot_args+=("-$arg")
[[ -v OPTARG ]] && chroot_args+=("$OPTARG")
fi
done
shift $(($OPTIND - 1))
shift $(( OPTIND - 1 ))
(( $# < 2 )) && die 'You must specify a directory and one or more packages.'
check_root
working_dir="$(readlink -f $1)"
working_dir="$(readlink -f "$1")"
shift 1
[[ -z $working_dir ]] && die 'Please specify a working directory.'
@@ -67,9 +71,9 @@ fi
umask 0022
#[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir"
[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir"
#mkdir -p "$working_dir"
mkdir -p "$working_dir"
[[ ! -d $working_dir ]] && mkdir -p "$working_dir"
@@ -88,11 +92,12 @@ for f in "${files[@]}"; do
cp "$f" "$working_dir$f"
done
basestrap -Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \
${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages'
basestrap -${umode}Mc ${pacman_conf:+-C "$pacman_conf"} "$working_dir" \
"${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages'
printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$working_dir/etc/locale.gen"
echo 'LANG=en_US.UTF-8' > "$working_dir/etc/locale.conf"
# echo 'KEYMAP=en' > "$working_dir/etc/vconsole.conf"
echo "${CHROOTVERSION}" > "$working_dir/.artools"
dbus-uuidgen --ensure="$working_dir"/etc/machine-id

View File

@@ -1,32 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
. @libdir@/artools/util-base.sh
load_makepkg_config
file_to_sign="$1"
if [ ! -e "$1" ]; then
error "%s does not exist!" "$file_to_sign"
exit 1
fi
if [[ -n "${BUILDBOT_GPGP}" ]]; then
msg2 "Signing [%s]" "${file_to_sign##*/}"
gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign"
else
msg2 "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..."
gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign"
fi

View File

@@ -12,56 +12,207 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-iso.sh
m4_include(lib/util-base.sh)
m4_include(lib/util-iso.sh)
m4_include(lib/base/message.sh)
m4_include(lib/base/common.sh)
m4_include(lib/base/chroot.sh)
m4_include(lib/iso/mount.sh)
m4_include(lib/iso/services.sh)
m4_include(lib/base/yaml.sh)
m4_include(lib/iso/calamares.sh)
m4_include(lib/iso/config.sh)
m4_include(lib/iso/firmware.sh)
m4_include(lib/iso/dracut.sh)
m4_include(lib/iso/initcpio.sh)
m4_include(lib/iso/grub.sh)
m4_include(lib/iso/squash.sh)
m4_include(lib/iso/iso.sh)
m4_include(lib/iso/profile.sh)
m4_include(lib/iso/trap.sh)
clean_up_chroot(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
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
# shellcheck disable=2035
find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete
if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then
rm "$mnt"/boot/grub/grub.cfg
fi
if [[ -f "$mnt/etc/machine-id" ]]; then
rm "$mnt"/etc/machine-id
fi
}
copy_overlay(){
local src="$1" dest="$2"
if [[ -e "$src" ]];then
msg2 "Copying [%s] ..." "${src##*/}"
cp -LR "$src"/* "$dest"
fi
}
make_rootfs() {
if [[ ! -e "${work_dir}"/rootfs.lock ]]; then
msg "Prepare [Base installation] (rootfs)"
local rootfs="${work_dir}/rootfs"
prepare_dir "${rootfs}"
basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}"
copy_overlay "${ROOT_OVERLAY}" "${rootfs}"
[[ -z ${LIVE_LIST} ]] && configure_chroot "${rootfs}"
clean_up_chroot "${rootfs}"
: > "${work_dir}"/rootfs.lock
msg "Done [Base installation] (rootfs)"
fi
}
make_livefs() {
if [[ ! -e ${work_dir}/livefs.lock ]]; then
msg "Prepare [Live installation] (livefs)"
local livefs="${work_dir}/livefs"
prepare_dir "${livefs}"
mount_overlayfs "${livefs}" "${work_dir}"
basestrap "${basestrap_args[@]}" "${livefs}" "${packages[@]}"
copy_overlay "${LIVE_OVERLAY}" "${livefs}"
configure_chroot "${livefs}"
umount_overlayfs
clean_up_chroot "${livefs}"
: > "${work_dir}"/livefs.lock
msg "Done [Live installation] (livefs)"
fi
}
make_bootfs() {
if [[ ! -e ${work_dir}/bootfs.lock ]]; then
msg "Prepare [/iso/boot]"
prepare_dir "${iso_root}/boot"
cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}"
local bootfs="${work_dir}/bootfs"
mount_overlayfs "${bootfs}" "${work_dir}"
if "${use_dracut}"; then
prepare_initramfs_dracut "${bootfs}"
else
prepare_initramfs "${bootfs}"
fi
umount_overlayfs
rm -R "${bootfs}"
: > "${work_dir}"/bootfs.lock
msg "Done [/iso/boot]"
fi
}
make_grub(){
if [[ ! -e ${work_dir}/grub.lock ]]; then
msg "Prepare [/iso/boot/grub]"
local layer=${work_dir}/rootfs
[[ -n ${LIVE_LIST} ]] && layer=${work_dir}/livefs
prepare_grub "${work_dir}/rootfs" "$layer"
if ${use_dracut}; then
configure_grub_dracut
else
configure_grub
fi
: > "${work_dir}"/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
gen_iso_fn(){
local vars=("artix") name
vars+=("${PROFILE}")
vars+=("${profile}")
vars+=("${INITSYS}")
case "${REPOSITORY}" in
'gremlins'|'goblins') vars+=("${REPOSITORY}") ;;
case "${repo}" in
'gremlins'|'goblins') vars+=("${repo}") ;;
esac
vars+=("${ISO_VERSION}")
vars+=("${ARCH}")
for n in ${vars[@]};do
vars+=("${arch}")
for n in "${vars[@]}"; do
name=${name:-}${name:+-}${n}
done
echo $name
echo "$name"
}
prepare_build(){
timer_start=$(get_timer)
load_profile
local pacman_conf pac_file="pacman-default.conf"
local repo=default
case "${REPOSITORY}" in
'gremlins'|'goblins') pac_file="pacman-${REPOSITORY}.conf" ;;
case "${repo}" in
'gremlins'|'goblins') repo="${repo}" ;;
esac
pacman_conf="${DATADIR}/$pac_file"
[[ -f ${USER_CONF_DIR}/$pac_file ]] && pacman_conf="${USER_CONF_DIR}/$pac_file"
get_pacman_conf "${repo}"
iso_file=$(gen_iso_fn).iso
iso_label="ARTIX_$(date +%Y%m)"
basestrap_args+=(-C ${pacman_conf})
work_dir=${CHROOTS_ISO}/${PROFILE}/${ARCH}
basestrap_args+=(-C "${pacman_conf}")
work_dir=${chroots_iso}/${profile}/artix
iso_dir="${ISO_POOL}/${PROFILE}"
iso_dir="${ISO_POOL}/${profile}"
iso_root=${CHROOTS_ISO}/${PROFILE}/iso
mnt_dir=${CHROOTS_ISO}/${PROFILE}/mnt
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
prepare_dir "${iso_root}"
iso_root=${chroots_iso}/${profile}/iso
live_dir=/LiveOS
mnt_dir=${chroots_iso}/${profile}/mnt
}
display_settings(){
msg "OPTIONS:"
msg2 "PROFILE: %s" "${PROFILE}"
msg2 "profile: %s" "${profile}"
msg2 "INITSYS: %s" "${INITSYS}"
[[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}"
@@ -72,8 +223,42 @@ display_settings(){
show_profile
}
mk_squash(){
make_sfs "${work_dir}/rootfs"
if [[ -d "${work_dir}/livefs" ]]; then
make_sfs "${work_dir}/livefs"
fi
}
mk_iso(){
touch "${iso_root}/.artix"
msg "Making bootable image"
# Sanity checks
[[ ! -d "${iso_root}" ]] && return 1
if [[ -f "${iso_dir}/${iso_file}" ]]; then
msg2 "Removing existing bootable image..."
rm -rf "${iso_dir}/${iso_file}"
fi
assemble_iso
chown -R "${owner}:$(id --group "${owner}")" "${iso_dir}"
}
mk_boot(){
run_safe "make_bootfs"
run_safe "make_grub"
}
mk_chroots(){
load_pkgs "${ROOT_LIST}" "${INITSYS}"
run_safe "make_rootfs"
if [[ -n ${LIVE_LIST} ]]; then
load_pkgs "${LIVE_LIST}" "${INITSYS}"
run_safe "make_livefs"
fi
}
build(){
msg "Start building [%s]" "${PROFILE}"
msg "Start building [%s]" "${profile}"
if ${clean_first};then
for copy in "${work_dir}"/*; do
[[ -d $copy ]] || continue
@@ -92,86 +277,108 @@ build(){
rm -rf --one-file-system "${iso_root}"
fi
if ${iso_only}; then
[[ ! -d ${work_dir} ]] && die "Create images: %s -p %s -x" "${cmd}" "${PROFILE}"
compress_images
if ${chroot_only}; then
mk_chroots
warning "Continue squash: %s -p %s -sc ..." "${cmd}" "${profile}"
exit 1
fi
if ${images_only}; then
prepare_images
warning "Continue compress: %s -p %s -zc ..." "${cmd}" "${PROFILE}"
elif ${boot_only}; then
mk_boot
warning "Continue iso: %s -p %s -zc ..." "${cmd}" "${profile}"
exit 1
elif ${squash_only}; then
mk_squash
warning "Continue boot: %s -p %s -bc ..." "${cmd}" "${profile}"
exit 1
elif ${iso_only}; then
[[ ! -d ${work_dir} ]] && die "Create chroot: %s -p %s -x" "${cmd}" "${profile}"
mk_iso
else
prepare_images
compress_images
mk_chroots
mk_boot
mk_squash
mk_iso
fi
msg "Finished building [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
msg "Finished building [%s]" "${profile}"
}
clean_first=true
pretend=false
images_only=false
chroot_only=false
iso_only=false
persist=false
use_dracut=false
squash_only=false
boot_only=false
basestrap_args=(-GMc)
cmd=${0##*/}
REPOSITORY=${cmd##*-}
repo=${cmd##*-}
owner=${SUDO_USER:-$USER}
profile='base'
chroots_iso="${CHROOTS_DIR}/buildiso"
arch=$(uname -m)
usage() {
echo "Usage: ${cmd} [options]"
echo " -p <profile> Profile [default: ${PROFILE}]"
echo " -p <profile> Profile [default: ${profile}]"
echo ' -r <dir> Chroots directory'
echo " [default: ${CHROOTS_ISO}]"
echo " [default: ${chroots_iso}]"
echo ' -t <dir> Target directory'
echo " [default: ${ISO_POOL}]"
echo ' -i <name> Init system to use'
echo " [default: ${INITSYS}]"
echo ' -g <key> The gpg key for sfs signing'
echo ' -g <key> The gpg key for img signing'
echo " [default: ${GPG_KEY}]"
echo ' -m Set SquashFS image mode to persistence'
echo ' -c Disable clean work dir'
echo ' -x Build images only'
echo ' -x Build chroot only'
echo ' -s Squash chroot only'
echo ' -b Generate iso boot only'
echo ' -z Generate iso only'
echo ' Requires pre built images (-x)'
echo ' -d Use dracut instead of mkinitcpio for iso initramfs'
echo ' -q Query settings and pretend build'
echo ' -h This help'
echo ''
echo ''
exit $1
exit "$1"
}
orig_argv=("$0" "$@")
opts='p:r:t:i:g:czxmqh'
opts='p:r:t:i:g:czsbxmdqh'
while getopts "${opts}" arg; do
case "${arg}" in
p) PROFILE="$OPTARG" ;;
r) CHROOTS_ISO="$OPTARG" ;;
p) profile="$OPTARG" ;;
r) chroots_iso="$OPTARG" ;;
t) ISO_POOL="$OPTARG" ;;
i) INITSYS="$OPTARG" ;;
g) GPG_KEY="$OPTARG" ;;
c) clean_first=false ;;
x) images_only=true ;;
x) chroot_only=true ;;
z) iso_only=true ;;
s) squash_only=true ;;
b) boot_only=true ;;
m) persist=true ;;
d) use_dracut=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
check_root
prepare_traps
shift $(( OPTIND - 1 ))
prepare_build
${pretend} && display_settings && exit 1
check_root
prepare_dir "${mnt_dir}"
prepare_dir "${iso_dir}"
prepare_dir "${iso_root}"
prepare_traps
build

View File

@@ -1,71 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
. @libdir@/artools/util-iso.sh
connect(){
echo "${ACCOUNT}@${FILE_HOST}:${FILE_HOME}"
}
prepare_transfer(){
DEST_DIR="/iso/${PROFILE}/"
SRC_DIR="${ISO_POOL}/${PROFILE}/"
}
sync_dir(){
msg "Start upload [%s] ..." "${PROFILE}"
rsync "${rsync_args[@]}" ${SRC_DIR} $(connect)${DEST_DIR}
msg "Done upload [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
update=false
verbose=false
rsync_args=(-aP --progress -e "ssh -p ${FILE_PORT}")
usage() {
echo "Usage: ${0##*/} [options]"
echo " -p Source folder to upload [default: ${PROFILE}]"
echo " -l Limit bandwidth in kB/s [default:${UPLIMIT}]"
echo ' -u Update remote directory'
echo ' -v Verbose output'
echo ' -h This help'
echo ''
echo ''
exit $1
}
opts='p:l:uvh'
while getopts "${opts}" arg; do
case "${arg}" in
p) PROFILE="$OPTARG" ;;
l) UPLIMIT="$OPTARG" ;;
u) update=true; rsync_args+=(-u) ;;
v) verbose=true; rsync_args+=(-v --stats) ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
timer_start=$(get_timer)
rsync_args+=(--bwlimit=${UPLIMIT})
prepare_transfer
sync_dir

View File

@@ -1,6 +1,6 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018-20 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# This program is free software; you can redistribute it and/or modify
@@ -12,13 +12,17 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. /usr/lib/artools/util-pkg.sh
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
#{{{ functions
batch_move() {
local name="${1:-pkg_moves}"
local pkglist=${TREE_DIR_ARTIX}/$name.list
local pkglist="${TREE_DIR_ARTIX}"/"$name".list
[[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
while read entry;do
while read -r entry; do
local pkg=${entry##*:}
local src=${entry%:*}
src=${src#*:}
@@ -28,44 +32,84 @@ batch_move() {
else
msg "%s" "${dest}pkg -s ${src} -u -p ${pkg}"
fi
done < $pkglist
done < "$pkglist"
}
# batch_upgrade() {
# local pkglist=${TREE_DIR_ARTIX}/pkg_upgrades.list
# [[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
# while read entry;do
# local pkg=${entry#*:}
# local dest=${entry%:*}
# echo "buildtree -i -p ${pkg}"
# echo "${dest}pkg -u -p ${pkg}"
# done < $pkglist
# }
batch_create() {
local name="${1:-pkg_create}"
local pkglist="${TREE_DIR_ARTIX}"/"$name".list
[[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
while read -r entry; do
local pkg=${entry##*:}
local group=${entry%:*}
group=${group#*:}
local team=${entry%%:*}
if ${runlist}; then
buildtree -n -p "${pkg}" -t "${team}" -g "${group}"
buildtree -i -p "${pkg}"
commitpkg -p "${pkg}"
else
msg "%s" "buildtree -n -p ${pkg} -t ${team} -g ${group}"
msg2 "%s" "buildtree -i -p ${pkg}"
msg2 "%s" "commitpkg -p ${pkg}"
fi
done < "$pkglist"
}
batch_update() {
local name="${1:-pkg_upgrades}"
local pkglist=${TREE_DIR_ARTIX}/$name.list
[[ -f $pkglist ]] || die "%s does not exist!" "$pkglist"
while read -r entry; do
local pkg=${entry#*:}
local dest=${entry%:*}
if ${runlist}; then
buildtree -i -p "${pkg}"
"${dest}"pkg -u -p "${pkg}"
else
msg "buildtree -i -p ${pkg}"
msg2 "${dest}pkg -u -p ${pkg}"
fi
done < "$pkglist"
}
#}}}
usage() {
echo "Usage: ${0##*/} [optional listname]"
echo ' -r Run generated commands'
echo ' -c Create subrepos from list'
echo ' -u Update subrepos from list'
echo ' -h This help'
echo ''
echo ''
exit $1
exit "$1"
}
movelistname=pkg_moves
runlist=false
create=false
update=false
opts='rh'
opts='rcuh'
while getopts "${opts}" arg; do
case "${arg}" in
r) runlist=true ;;
c) create=true ;;
u) update=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
shift $(( OPTIND - 1 ))
movelistname="$1"; shift
listname="$1"; shift
batch_move "$movelistname"
if ${create}; then
batch_create "${listname}"
elif ${update}; then
batch_update "${listname}"
else
batch_move "${listname}"
fi

View File

@@ -12,22 +12,26 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh
m4_include(lib/util-base.sh)
m4_include(lib/base/message.sh)
m4_include(lib/base/common.sh)
m4_include(lib/base/chroot.sh)
create_first=false
rebuild=false
no_check=false
is_checkpkg=false
mkchrootpkg_args=(-c -n)
cmd=${0##*/}
repo=${cmd#*-}
base_devel=('base-devel')
chroots_pkg="${CHROOTS_DIR}/buildpkg"
arch=$(uname -m)
usage() {
echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]"
echo " -r <dir> Create chroots in this directory"
echo " -d <dir> Destination repo chroot"
echo ' -c Recreate the chroot before building'
echo ' -m Major rebuild'
echo ' -N Disable check() function'
@@ -36,20 +40,19 @@ usage() {
echo ''
echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}"
echo ''
exit $1
exit "$1"
}
orig_argv=("$0" "$@")
opts='hcCNmr:'
opts='hcCNmr:d:'
while getopts "${opts}" arg; do
case "${arg}" in
r) CHROOTS_PKG="$OPTARG" ;;
r) chroots_pkg="$OPTARG" ;;
d) repo="$OPTARG" ;;
c) create_first=true ;;
m) rebuild=true ;;
C) is_checkpkg=true; mkchrootpkg_args+=(-C) ;;
N) no_check=true; mkchrootpkg_args+=(-N) ;;
C) mkchrootpkg_args+=(-C) ;;
N) mkchrootpkg_args+=(-N) ;;
h|?) usage 0 ;;
*) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac
@@ -65,20 +68,18 @@ else
esac
fi
pacman_conf="${DATADIR}/pacman-${repo}.conf"
[[ -f ${USER_CONF_DIR}/pacman-${repo}.conf ]] && pacman_conf="${USER_CONF_DIR}/pacman-${repo}.conf"
get_pacman_conf "${repo}"
makepkg_conf="${DATADIR}/makepkg.conf"
[[ -f ${USER_CONF_DIR}/makepkg.conf ]] && makepkg_conf="${USER_CONF_DIR}/makepkg.conf"
get_makepkg_conf
check_root SOURCE_DATE_EPOCH
check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME
mkchrootpkg_args+=("${@:$OPTIND}")
if ${create_first} || [[ ! -d "${CHROOTS_PKG}/${repo}-${ARCH}" ]];then
msg "Creating chroot for [%s] (%s)..." "${repo}" "${ARCH}"
if ${create_first} || [[ ! -d "${chroots_pkg}/${repo}-${arch}" ]];then
msg "Creating chroot for [%s] (%s)..." "${repo}" "${arch}"
for copy in "${CHROOTS_PKG}/${repo}-${ARCH}"/*; do
for copy in "${chroots_pkg}/${repo}-${arch}"/*; do
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")"
@@ -89,19 +90,19 @@ if ${create_first} || [[ ! -d "${CHROOTS_PKG}/${repo}-${ARCH}" ]];then
done
lock_close 9
rm -rf --one-file-system "${CHROOTS_PKG}/${repo}-${ARCH}"
mkdir -p "${CHROOTS_PKG}/${repo}-${ARCH}"
setarch "${ARCH}" mkchroot \
rm -rf --one-file-system "${chroots_pkg}/${repo}-${arch}"
(umask 0022; mkdir -p "${chroots_pkg}/${repo}-${arch}")
setarch "${arch}" mkchroot \
-C "${pacman_conf}" \
-M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \
"${chroots_pkg}/${repo}-${arch}/root" \
"${base_devel[@]}" || abort
else
lock 9 "${CHROOTS_PKG}/${repo}-${ARCH}/root.lock" "Locking clean chroot"
lock 9 "${chroots_pkg}/${repo}-${arch}/root.lock" "Locking clean chroot"
chroot-run \
-C "${pacman_conf}" \
-M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \
"${chroots_pkg}/${repo}-${arch}/root" \
pacman -Syuu --noconfirm || abort
fi
@@ -110,9 +111,5 @@ if [[ ! -v SOURCE_DATE_EPOCH ]]; then
export SOURCE_DATE_EPOCH=$(date +%s)
fi
timer_start=$(get_timer)
msg "Building in chroot for [%s] (%s)..." "${repo}" "${ARCH}"
exec mkchrootpkg -r "${CHROOTS_PKG}/${repo}-${ARCH}" "${mkchrootpkg_args[@]}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
msg "Building in chroot for [%s] (%s)..." "${repo}" "${arch}"
exec mkchrootpkg -r "${chroots_pkg}/${repo}-${arch}" "${mkchrootpkg_args[@]}"

View File

@@ -12,233 +12,309 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/git.sh)
m4_include(lib/pkg/repo.sh)
m4_include(lib/pkg/jenkins.sh)
patch_pkg(){
local pkg="$1"
case $pkg in
glibc)
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \
-i $pkg/trunk/PKGBUILD
;;
linux|linux-lts)
sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i $pkg/trunk/PKGBUILD
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-i $pkg/trunk/config
;;
bash)
sed -e 's|system.bash_logout)|system.bash_logout artix.bashrc)|' \
-e "s|etc/bash.|etc/bash/|g" \
-e 's|"$pkgdir/etc/skel/.bash_logout"|"$pkgdir/etc/skel/.bash_logout"\n install -Dm644 artix.bashrc $pkgdir/etc/bash/bashrc.d/artix.bashrc|' \
-i $pkg/trunk/PKGBUILD
cd $pkg/trunk
patch -Np 1 -i ${DATADIR}/patches/artix-bash.patch
updpkgsums
cd ../..
;;
gstreamer|gst-plugins-*|licenses)
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
-e 's|(Arch Linux)|(Artix Linux)|' \
-i $pkg/trunk/PKGBUILD
;;
#{{{ new git repo
get_compliant_name(){
local gitname="$1"
case "$gitname" in
*+) gitname=${gitname//+/plus} ;;
*+*) gitname=${gitname//+/-} ;;
esac
echo "$gitname"
}
pull_tree_arch(){
cd ${TREE_DIR_ARCH}
for tree in ${TREE_NAMES_ARCH[@]};do
if [[ -d ${tree} ]];then
cd ${tree}
pull_tree "${tree}" "$(get_local_head)" "Arch"
cd ..
else
clone_tree "${HOST_TREE_ARCH}" "${tree}" "Arch"
fi
done
subrepo_clone(){
local pkg="$1" org="$2"
local gitname
gitname=$(get_compliant_name "$pkg")
msg2 "Subrepo clone [%s] from (%s)" "$pkg" "$org/$gitname"
git subrepo clone "${GIT_SSH}":"$org"/"$gitname".git "$pkg"
}
pull_tree_artix(){
local repos=("$1")
cd ${TREE_DIR_ARTIX}
for tree in ${repos[@]};do
if [[ -d ${tree} ]];then
config_tree "${tree}"
cd ${tree}
pull_tree "${tree}" "$(get_local_head)"
cd ..
else
clone_tree "${HOST_TREE_ARTIX}" "${tree}"
config_tree "${tree}"
fi
done
}
create_repo() {
local pkg="$1" org="$2"
local gitname
gitname=$(get_compliant_name "$pkg")
local json="{ \"auto_init\": true, \"name\":\"$gitname\", \"gitignores\":\"ArchLinuxPackages\", \"readme\": \"Default\" }"
sync_pkg(){
local rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
local src="$1" dest="$2"
msg2 "Create package repo [%s] in org (%s)" "${pkg}" "${org}"
rsync "${rsync_args[@]}" $src/ $dest/
}
curl -s -X POST "${GIT_URL}/api/v1/org/$org/repos?access_token=${GIT_TOKEN}" \
-H "accept: application/json" \
-H "content-type: application/json" \
-d "$json"
show_deps(){
local src="$1" repo="$2"
. $src/PKGBUILD 2>/dev/null
[[ $arch == 'any' ]] && CARCH=any
local archver=$(get_full_version)
msg2 "repo: %s" "$repo"
[[ -n ${pkgbase} ]] && msg2 "pkgbase: %s" "${pkgbase}"
msg2 "pkgname: %s" "${pkgname[*]}"
[[ -n $pkgdesc ]] && msg2 "pkgdesc: %s" "${pkgdesc}"
msg2 "Arch Version: %s" "$archver"
msg2 "arch: %s" "$CARCH"
[[ -n ${makedepends[@]} ]] && msg2 "makedepends: %s" "${makedepends[*]}"
[[ -n ${checkdepends[@]} ]] && msg2 "checkdepends: %s" "${checkdepends[*]}"
[[ -n ${depends[@]} ]] && msg2 "depends: %s" "${depends[*]}"
[[ -n ${optdepends[@]} ]] && msg2 "optdepends: %s" "${optdepends[@]}"
echo
}
subrepo_new(){
local group="${1:-$GROUP}" team="${2:-$TEAM}"
local dest=${TREE_DIR_ARTIX}/$group/${PACKAGE}/trunk
cd "${TREE_DIR_ARTIX}/${GROUP}" || return
cd ${TREE_DIR_ARTIX}/$group
local org=$(get_pkg_org "${PACKAGE}")
local org
org=$(get_pkg_org "${PACKAGE}")
create_repo "${PACKAGE}" "$org"
add_repo_to_team "${PACKAGE}" "$org" "$team"
add_repo_to_team "${PACKAGE}" "$org" "${TEAM}"
subrepo_clone "${PACKAGE}" "$org"
prepare_dir "$dest"
mkdir -p "${TREE_DIR_ARTIX}/${GROUP}/${PACKAGE}/trunk"
commit_jenkins_files "${PACKAGE}"
}
from_arch(){
local src= dest=
#}}}
cd ${TREE_DIR_ARTIX}
#{{{ pull
local git_tree_arch=$(find_tree "${TREE_DIR_ARCH}" "${PACKAGE}")
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "${PACKAGE}"
clone_tree(){
local url="$1" tree="$2" os="${3:-Artix}"
local package=${TREE_DIR_ARCH}/$git_tree_arch/${PACKAGE}
local repo=$(find_repo "$package" "${staging}" "${unstable}")
msg "Cloning %s (%s) ..." "$tree" "$os"
src=$package/repos/$repo
local git_tree_artix=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
local tree_dir=$(get_artix_tree "${PACKAGE}" "$git_tree_artix" "$git_tree_arch")
dest=${TREE_DIR_ARTIX}/$tree_dir/${PACKAGE}/trunk
msg "tree: %s" "$tree_dir"
show_deps "$src" "$repo"
if [[ -d $dest ]];then
cd ${TREE_DIR_ARTIX}/$git_tree_artix
. $dest/PKGBUILD 2>/dev/null
local artixver=$(get_full_version)
msg2 "Artix Version: %s" "$artixver"
else
subrepo_new "$tree_dir" "$git_tree_arch"
fi
msg "Sync (%s) from [%s] to [%s]" "${PACKAGE}" "$git_tree_arch" "$tree_dir"
sync_pkg "$src" "$dest"
patch_pkg "${PACKAGE}"
git clone "$url/$tree".git
}
pull_tree_arch(){
cd "${TREE_DIR_ARCH}" || return
for tree in "${ARCH_TREE[@]}";do
if [[ -d "${tree}" ]];then
( cd "${tree}" || return
pull_tree "${tree}" "$(get_local_head)" "Arch"
)
else
clone_tree "${host_tree_arch}" "${tree}" "Arch"
fi
done
}
config_tree(){
local tree="$1"
cd "$tree" || return
git config --bool pull.rebase true
git config commit.gpgsign true
if [[ -n "${GPGKEY}" ]];then
git config user.signingkey "${GPGKEY}"
else
warning "No GPGKEY configured in makepkg.conf!"
fi
cd ..
}
pull_tree_artix(){
local repos=()
if ${sync_group}; then
repos=("${GROUP}")
else
repos=("${ARTIX_TREE[@]}")
fi
cd "${TREE_DIR_ARTIX}" || return
for tree in "${repos[@]}"; do
if [[ -d "${tree}" ]];then
config_tree "${tree}"
( cd "${tree}" || return
pull_tree "${tree}" "$(get_local_head)"
)
else
clone_tree "${host_tree_artix}" "${tree}"
config_tree "${tree}"
fi
done
}
#}}}
#{{{ patch
patch_pkg(){
local pkgpath="$1"
local pkg=${pkgpath%/*}
pkg=${pkg##*/}
case $pkg in
glibc)
msg2 "Patching %s" "$pkg"
sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \
-e '/nscd.service/d' \
-i "$pkgpath"/PKGBUILD
;;
linux|linux-lts)
msg2 "Patching %s" "$pkg"
sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i "$pkgpath"/PKGBUILD
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-i "$pkgpath"/config
;;
bash)
msg2 "Patching %s" "$pkg"
# shellcheck disable=2016
sed -e 's|system.bash_logout)|system.bash_logout artix.bashrc)|' \
-e "s|etc/bash.|etc/bash/|g" \
-e 's|"$pkgdir/etc/skel/.bash_logout"|"$pkgdir/etc/skel/.bash_logout"\n install -Dm644 artix.bashrc $pkgdir/etc/bash/bashrc.d/artix.bashrc|' \
-i "$pkgpath"/PKGBUILD
( cd "$pkgpath" || return
patch -Np 1 -i "${DATADIR}"/patches/artix-bash.patch
updpkgsums
)
;;
gstreamer|gst-plugins-*|licenses)
msg2 "Patching %s" "$pkg"
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
-e 's|(Arch Linux)|(Artix Linux)|' \
-i "$pkgpath"/PKGBUILD
;;
esac
}
#}}}
#{{{ pkgbuild import
sync_pkg(){
local rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
local src="$1" dest="$2"
msg "Sync from Arch [%s] to Artix [%s]" "${src##*archlinux/}" "${dest##*artixlinux/}"
rsync "${rsync_args[@]}" "$src"/ "$dest"/
}
show_deps(){
local src="$1" archver
# shellcheck disable=1090
. "$src"/PKGBUILD 2>/dev/null
archver=$(get_full_version)
# shellcheck disable=2154
[[ -n ${pkgbase} ]] && msg2 "pkgbase: %s" "${pkgbase}"
# shellcheck disable=2154
msg2 "pkgname: %s" "${pkgname[*]}"
# shellcheck disable=2154
[[ -n "${pkgdesc}" ]] && msg2 "pkgdesc: %s" "${pkgdesc}"
# shellcheck disable=2154
msg2 "Arch Version: %s" "$archver"
# shellcheck disable=2154
msg2 "arch: %s" "$arch"
# shellcheck disable=2154
[[ -n ${makedepends[*]} ]] && msg2 "makedepends: %s" "${makedepends[*]}"
# shellcheck disable=2154
[[ -n ${checkdepends[*]} ]] && msg2 "checkdepends: %s" "${checkdepends[*]}"
# shellcheck disable=2154
[[ -n ${depends[*]} ]] && msg2 "depends: %s" "${depends[*]}"
# shellcheck disable=2154
[[ -n ${optdepends[*]} ]] && msg2 "optdepends: %s" "${optdepends[@]}"
}
from_arch(){
cd "${TREE_DIR_ARTIX}" || return
local srcpath repo archpath artixpath
srcpath=$(find_pkg "${TREE_DIR_ARCH}" "${PACKAGE}")
[[ -z $srcpath ]] && die "Package '%s' does not exist!" "${PACKAGE}"
repo=$(find_repo "$srcpath")
msg "repo: %s" "${repo#*/}"
archpath=$srcpath/$repo
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${PACKAGE}")
show_deps "$archpath"
if [[ -f "$artixpath"/.gitrepo ]]; then
artixpath="$artixpath"/trunk
if [[ -d "$artixpath" ]];then
sync_pkg "$archpath" "$artixpath"
patch_pkg "$artixpath"
fi
else
die "Package '%s' does not exist!" "${PACKAGE}"
fi
}
#}}}
view_build(){
local src=
local git_tree_arch=$(find_tree "${TREE_DIR_ARCH}" "${PACKAGE}")
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "${PACKAGE}"
local pkg_path=${TREE_DIR_ARCH}/$git_tree_arch/${PACKAGE}
local repo=$(find_repo "$pkg_path" "${staging}" "${unstable}")
src=$pkg_path/repos/$repo
show_deps "$src" "$repo"
local archpath repo
archpath=$(find_pkg "${TREE_DIR_ARCH}" "${PACKAGE}")
[[ -z $archpath ]] && die "Package '%s' does not exist!" "${PACKAGE}"
repo=$(find_repo "${archpath}")
archpath=$archpath/$repo
msg "repo: %s" "${repo#*/}"
show_deps "$archpath"
}
check_tree(){
local git_tree_arch=$(find_tree "${TREE_DIR_ARCH}" "${PACKAGE}")
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "${PACKAGE}"
local git_tree_artix=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
local tree_dir=$(get_artix_tree "${PACKAGE}" "$git_tree_artix" "$git_tree_arch")
msg "tree_dir: %s" "$tree_dir"
[[ -z $git_tree_artix ]] && msg2 "exists: %s" "no"
[[ -n $git_tree_artix ]] && msg2 "exists: %s" "yes"
local archpath artixpath group
archpath=$(find_pkg "${TREE_DIR_ARCH}" "${PACKAGE}")
[[ -z $archpath ]] && die "Package '%s' does not exist!" "${PACKAGE}"
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${PACKAGE}")
group=${artixpath%/*}
msg "group: %s" "${group##*/}"
[[ -z $artixpath ]] && msg2 "exists: %s" "no"
[[ -n $artixpath ]] && msg2 "exists: %s" "yes"
}
sync_repos(){
${sync_arch} && pull_tree_arch
if ${sync_artix};then
if ${sync_group}; then
pull_tree_artix "${GROUP}"
else
pull_tree_artix "${TREE_NAMES_ARTIX[*]}"
fi
fi
${sync_artix} && pull_tree_artix
}
load_makepkg_config
testing=true
staging=true
unstable=false
sync=false
sync_arch=true
sync_artix=true
import=false
view=false
createnew=false
conf=false
unstable=false
staging=true
sync_group=false
check=false
PACKAGE=''
TEAM=${TREE_NAMES_ARTIX[0]}
GROUP=${TREE_NAMES_ARTIX[0]}
TEAM='community'
GROUP="${ARTIX_TREE[0]}"
host_tree_artix="${GIT_SSH}:artixlinux"
host_tree_arch='git://git.archlinux.org/svntogit'
usage() {
echo "Usage: ${0##*/} [options]"
echo ' -p <pkg> Package name'
echo ' -t <team> Team name (only with -n)'
echo ' Possible values: core,extra,community,multilib'
echo " [default: ${TEAM}]"
echo ' -g <group> Group name, the superrepo (only with -n or -s)'
echo " [default: ${GROUP}]"
echo " -s Clone or pull repos"
echo " -z Don't clone or pull arch repos"
echo " -y Don't clone or pull artix repos"
echo " -a Don't clone or pull arch repos"
echo " -b Don't clone or pull artix repos"
echo ' -i Import a package from arch repos'
echo ' -n Make new remote subrepo and clone it'
echo ' -u Include kde & gnome unstable (only with -i)'
echo ' -w Exclude staging (only with -i)'
echo ' -n New remote subrepo and clone it'
echo ' -v Check if a package is in the artix tree(s)'
echo ' -c View package depends'
echo ' -x Exclude testing (only with -i)'
echo ' -y Exclude staging (only with -i)'
echo ' -z Include kde & gnome unstable (only with -i)'
echo ' -h This help'
echo ''
echo ''
exit $1
exit "$1"
}
orig_argv=("$0" "$@")
opts='p:t:g:uwsinzycvh'
opts='p:t:g:sinabcvxyzh'
while getopts "${opts}" arg; do
case "${arg}" in
@@ -246,23 +322,23 @@ while getopts "${opts}" arg; do
t) TEAM="$OPTARG" ;;
g) GROUP="$OPTARG"; sync_group=true ;;
s) sync=true ;;
z) sync_arch=false ;;
y) sync_artix=false ;;
a) sync_arch=false ;;
b) sync_artix=false ;;
i) import=true ;;
n) createnew=true ;;
w) staging=false ;;
u) unstable=true ;;
c) check=true ;;
v) view=true ;;
x) testing=false ;;
y) staging=false ;;
z) unstable=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
shift $(( OPTIND - 1 ))
prepare_dir "${TREE_DIR_ARTIX}"
prepare_dir "${TREE_DIR_ARCH}"
set_arch_repos "$testing" "$staging" "$unstable"
${sync} && sync_repos

View File

@@ -12,26 +12,77 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh
m4_include(lib/base/message.sh)
shopt -s extglob
# Source makepkg.conf; fail if it is not found
if [[ -r '/etc/makepkg.conf' ]]; then
# shellcheck source=makepkg-x86_64.conf
source '/etc/makepkg.conf'
else
die '/etc/makepkg.conf not found!'
fi
load_makepkg_config
# Source user-specific makepkg.conf overrides
if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf"
elif [[ -r "$HOME/.makepkg.conf" ]]; then
# shellcheck source=/dev/null
source "$HOME/.makepkg.conf"
fi
#{{{ functions
pkgver_equal() {
if [[ $1 = *-* && $2 = *-* ]]; then
# if both versions have a pkgrel, then they must be an exact match
[[ $1 = "$2" ]]
else
# otherwise, trim any pkgrel and compare the bare version.
[[ ${1%%-*} = "${2%%-*}" ]]
fi
}
find_cached_package() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local targetname=$1 targetver=$2 targetarch=$3
local dir pkg pkgbasename name ver rel arch r results
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
for pkg in "$dir"/*.pkg.tar?(.!(sig|*.*)); do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
for r in "${results[@]}"; do
[[ $r -ef $pkg ]] && continue 2
done
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar*}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
pkgver_equal "$targetver" "$ver-$rel"; then
results+=("$pkg")
fi
done
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "${results[0]}"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
;;
esac
}
#}}}
usage() {
cat <<- _EOF_

View File

@@ -12,135 +12,204 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/git.sh)
m4_include(lib/pkg/repo.sh)
get_path(){
local repo="$1" pkg=trunk/PKGBUILD
if [[ $repo != trunk ]]; then
[[ -f repos/$repo-${ARCH}/PKGBUILD ]] && pkg=repos/$repo-${ARCH}/PKGBUILD
[[ -f repos/$repo-any/PKGBUILD ]] && pkg=repos/$repo-any/PKGBUILD
fi
echo $pkg
#{{{ functions
push_tree(){
local tree="$1"
msg "Update (%s)" "${tree}"
git push origin master
}
subrepo_push(){
local pkg="$1"
msg2 "Subrepo push (%s)" "$pkg"
git subrepo push "$pkg" || die "%s push failed" "$pkg"
}
subrepo_clean(){
local pkg="$1"
msg2 "Subrepo clean (%s)" "$pkg"
git subrepo clean "$pkg"
}
subrepo_pull(){
local pkg="$1"
msg2 "Subrepo pull (%s)" "$pkg"
git subrepo pull "$pkg"
}
prepare_commit(){
local dest="$1"
[[ -d repos/$dest ]] && git rm -r repos/$dest
[[ ! -d repos ]] && mkdir repos
[[ ! -d repos/$dest ]] && mkdir repos/$dest
}
# create new layout, copy & remove repos
if [[ -d repos ]]; then
msg "Switching to new layout ..."
[[ ! -d "$CARCH" ]] && mkdir "$CARCH"
commit_pkg(){
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
if [[ -n ${git_tree} ]];then
for r in repos/*; do
local name noarch
name=${r#*/}
noarch=${name%-*}
mkdir "$CARCH/${noarch}"
cp repos/"${name}"/* "$CARCH/${noarch}/"
git add "$CARCH/${noarch}"
done
cd ${TREE_DIR_ARTIX}/${git_tree}
git rm -r repos
git commit -m "switch to new repo layout"
msg "Done switch"
fi
local head=$(get_local_head)
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
local pkgbuild=$(get_path "${REPO_SRC}")
. $pkgbuild
[[ $arch == 'any' ]] && CARCH=any
local version=$(get_full_version)
local commit_msg=""
if ${remove};then
local action='remove'
if [[ "${REPO_SRC}" == 'trunk' ]];then
local pkg=${PACKAGE}
git rm -r trunk
else
local pkg="${PACKAGE}-$version"
git rm -r repos/"${REPO_SRC}-$CARCH"
fi
commit_msg="[${REPO_SRC}] '$pkg' ${action}"
msg "Action: %s" "$commit_msg"
else
local action='modify'
commit_msg="[${REPO_SRC}] '${PACKAGE}-$version' ${action}"
msg "Action: %s" "$commit_msg"
git add .
fi
git commit -m "$commit_msg"
cd ${TREE_DIR_ARTIX}/${git_tree}
${push} && pull_tree "${git_tree}" "$head"
# subrepo_pull "${PACKAGE}"
subrepo_push "${PACKAGE}"
subrepo_clean "${PACKAGE}"
${push} && push_tree "${git_tree}"
git prune
else
error "Package '%s' does not exist!" "${PACKAGE}"
if [[ $action == 'add' ]] || [[ $action == 'move' ]] ;then
[[ -d "$CARCH/${REPO_DEST}" ]] && git rm -r "$CARCH/${REPO_DEST}"
[[ ! -d "$CARCH" ]] && mkdir "$CARCH"
[[ ! -d "$CARCH/${REPO_DEST}" ]] && mkdir "$CARCH/${REPO_DEST}"
fi
}
symlink_commit_pkg(){
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
if [[ -n ${git_tree} ]];then
check_rebuild(){
if [[ -d "$CARCH"/"${valid_names[10]}" ]] \
&& [[ "${REPO_DEST}" == "${valid_names[7]}" ]]; then
git rm -r "$CARCH"/"${valid_names[10]}"
git commit -m "switch from ${valid_names[10]} to ${valid_names[7]}"
elif [[ -d "$CARCH"/"${valid_names[7]}" ]] \
&& [[ "${REPO_DEST}" == "${valid_names[10]}" ]]; then
git rm -r "$CARCH"/"${valid_names[7]}"
git commit -m "switch from ${valid_names[7]} to ${valid_names[10]}"
fi
}
cd ${TREE_DIR_ARTIX}/${git_tree}
check_team(){
if [[ "${REPO_SRC}" == "${valid_names[0]}" \
&& "${REPO_DEST}" == "${valid_names[1]}" ]] || \
[[ "${REPO_SRC}" == "${valid_names[1]}" \
&& "${REPO_DEST}" == "${valid_names[0]}" ]] || \
[[ "${REPO_SRC}" == "${valid_names[1]}" \
&& "${REPO_DEST}" == "${valid_names[2]}" ]] || \
[[ "${REPO_SRC}" == "${valid_names[2]}" \
&& "${REPO_DEST}" == "${valid_names[1]}" ]] ;then
local head=$(get_local_head)
local org
org=$(get_pkg_org "${PACKAGE}")
add_repo_to_team "${PACKAGE}" "$org" "${REPO_DEST}"
remove_repo_from_team "${PACKAGE}" "$org" "${REPO_SRC}"
fi
}
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
path_config() {
[[ "${REPO_SRC}" != 'trunk' ]] && pkgbuild="$CARCH/${REPO_SRC}"/PKGBUILD
local pkgbuild=$(get_path "${REPO_SRC}")
if [[ ! -f "$pkgbuild" ]]; then
pkgbuild=repos/"${REPO_SRC}-${CARCH}"/PKGBUILD
[[ -f repos/"${REPO_SRC}"-any/PKGBUILD ]] && pkgbuild=repos/"${REPO_SRC}"-any/PKGBUILD
fi
. $pkgbuild
[[ $arch == 'any' ]] && CARCH=any
# shellcheck disable=1090
. "$pkgbuild"
}
local version=$(get_full_version)
if [[ ${REPO_SRC} == 'trunk' ]];then
local action='add'
local dest="${REPO_DEST}-$CARCH"
prepare_commit "$dest"
cp trunk/* repos/$dest/
commit_pkg() {
local commit_msg pkg
if ${remove};then
action='remove'
if [[ "${REPO_SRC}" == 'trunk' ]];then
pkg=${PACKAGE}
git rm -r trunk
else
local action='move'
local src="${REPO_SRC}-$CARCH" dest="${REPO_DEST}-$CARCH"
pkg="${PACKAGE}-$(get_full_version)"
[[ ! -f repos/$src/PKGBUILD ]] && die "%s does not exist!" "repos/$src/PKGBUILD"
prepare_commit "$dest"
prepare_commit
cp repos/$src/* repos/$dest/
git rm -r repos/$src
git rm -r "$CARCH/${REPO_SRC}"
fi
local commit_msg="[${REPO_SRC}] -> [${REPO_DEST}] '${PACKAGE}-$version' ${action}"
commit_msg="[${REPO_SRC}] '$pkg' ${action}"
msg "Action: %s" "$commit_msg"
else
action='modify'
commit_msg="[${REPO_SRC}] '${PACKAGE}-$(get_full_version)' ${action}"
msg "Action: %s" "$commit_msg"
git add .
git commit -m "$commit_msg"
fi
git commit -m "$commit_msg"
}
cd ${TREE_DIR_ARTIX}/${git_tree}
repo_commit_pkg() {
local commit_msg
if [[ "${REPO_SRC}" == 'trunk' ]];then
action='add'
${push} && pull_tree "${git_tree}" "$head"
prepare_commit
check_rebuild
cp trunk/* "$CARCH/${REPO_DEST}"/
else
action='move'
[[ ! -f $pkgbuild ]] && die "%s does not exist!" "$pkgbuild"
prepare_commit
cp "$CARCH/${REPO_SRC}"/* "$CARCH/${REPO_DEST}"/
git rm -r "$CARCH/${REPO_SRC}"
fi
commit_msg="[${REPO_SRC}] -> [${REPO_DEST}] '${PACKAGE}-$(get_full_version)' ${action}"
msg "Action: %s" "$commit_msg"
git add .
git commit -m "$commit_msg"
}
run(){
local artixpath head group
artixpath=$(find_pkg "${TREE_DIR_ARTIX}" "${PACKAGE}")
if [[ -n ${artixpath} ]];then
group=${artixpath%/*}
cd "${group}" || return
head=$(get_local_head)
cd "${artixpath}" || return
path_config
if [[ "${cmd}" == 'commitpkg' ]];then
commit_pkg
else
repo_commit_pkg
fi
cd "${group}" || return
${push} && pull_tree "${group##*/}" "$head"
# subrepo_pull "${PACKAGE}"
subrepo_push "${PACKAGE}"
subrepo_clean "${PACKAGE}"
${push} && push_tree "${git_tree}"
${push} && push_tree "${group##*/}"
git prune
[[ "${cmd}" != 'commitpkg' ]] && check_team
else
error "Package '%s' does not exist!" "${PACKAGE}"
die "Package '%s' does not exist!" "${PACKAGE}"
fi
}
is_valid_repo(){
local _valid=trunk
for repo in "${valid_names[@]}"; do
_valid=${repo:-}${repo:+|}$_valid
done
eval "case ${REPO_SRC} in
${_valid}) return 0 ;;
*) return 1 ;;
esac"
}
#}}}
load_makepkg_config
REPO_SRC='trunk'
@@ -148,6 +217,8 @@ PACKAGE=''
remove=false
push=false
pkgbuild=trunk/PKGBUILD
cmd=${0##*/}
REPO_DEST=${cmd%pkg}
@@ -160,11 +231,9 @@ usage() {
echo ' -h This help'
echo ''
echo ''
exit $1
exit "$1"
}
orig_argv=("$0" "$@")
opts='p:s:urh'
while getopts "${opts}" arg; do
@@ -178,14 +247,12 @@ while getopts "${opts}" arg; do
esac
done
shift $(($OPTIND - 1))
shift $(( OPTIND - 1 ))
if $(is_valid_repo "${REPO_SRC}");then
if [[ "${cmd}" == 'commitpkg' ]];then
commit_pkg
else
symlink_commit_pkg
fi
set_arch_repos "false" "false" "false"
if is_valid_repo;then
run
else
error "source repository '%s' is not valid!" "${REPO_SRC}"
die "source repository '%s' is not valid!" "${REPO_SRC}"
fi

View File

@@ -12,243 +12,362 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/repo.sh)
compare(){
local pkgpath="$1" group="$2"
local pkg=${pkgpath##*/}
local artixrepo=$(find_repo "$pkgpath" "${staging}" "${unstable}")
local artixshow=${artixrepo%-*}
local pkgbuild=$pkgpath/repos/$artixrepo/PKGBUILD
#{{{ table
if [[ -f $pkgbuild ]];then
msg_table_header(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
. $pkgbuild 2>/dev/null
local artixver=$(get_full_version)
msg_row_downgrade(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" >&2
}
local archpath=$(get_import_path $pkg)
msg_row_notify(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" >&2
}
local archrepo=$(find_repo "$archpath" "${staging}" "${unstable}")
msg_row(){
local mesg=$1; shift
# printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
# shellcheck disable=2059
printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" >&2
}
local archshow=${archrepo%-*}
pkgbuild=$archpath/repos/$archrepo/PKGBUILD
msg_row_upgrade(){
local mesg=$1; shift
# shellcheck disable=2059
printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local archver=$(get_full_version)
fi
#}}}
local result=$(vercmp "$artixver" "$archver")
#{{{ upgrades, downgrades, moves
local repomatch=false
[[ "$archrepo" == "$artixrepo" ]] && repomatch=true
if ${move};then
if [ $result -gt -1 ];then
case $artixrepo in
*testing*|*staging*)
if $repomatch;then
msg_row "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "${group#*-}"
else
msg_row_notify "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "${group#*-}"
if [[ -n "$archshow" ]]; then
printf "%s\n" "$archshow:$artixshow:$pkg" >> ${TREE_DIR_ARTIX}/pkg_moves.list
fi
fi
;;
esac
fi
elif ${upgrades};then
if [ $result -eq -1 ];then
msg_row_upgrade "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "${group#*-}"
printf "%s\n" "$archshow:$pkg" >> ${TREE_DIR_ARTIX}/pkg_upgrades.list
fi
elif ${downgrades};then
if [ $result -eq 1 ];then
if [[ -n $archver ]] && [[ -n $archrepo ]];then
msg_row_downgrade "${table}" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver" "${group#*-}"
compare_m(){
result=$(vercmp "$artixver" "$archver")
case ${artixrepo} in
*testing*|*staging*|*rebuild)
if [[ "${a}" == "${b}" ]] || [[ "${a}" == 'staging' && "${b}" == 'rebuild' ]]; then
msg_row "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
else
msg_row_notify "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
if [[ -n "$archrepo" ]]; then
printf "%s\n" "${a}:${b}:$pkg" >> "${TREE_DIR_ARTIX}"/pkg_moves.list
fi
fi
;;
esac
}
fi
unset pkgver epoch pkgrel artixver archver pkgbuild archpath
compare_u(){
result=$(vercmp "$artixver" "$archver")
if [ "$result" -eq -1 ];then
msg_row_upgrade "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
printf "%s\n" "${a}:$pkg" >> "${TREE_DIR_ARTIX}"/pkg_upgrades.list
fi
}
compare_d(){
result=$(vercmp "$artixver" "$archver")
if [ "$result" -eq 1 ];then
if [[ -n "$archver" ]] && [[ -n "$archrepo" ]];then
msg_row_downgrade "${table}" "${a}" "${b}" "$pkg" "$archver" "$artixver" "${group#*-}"
fi
fi
}
get_archpath(){
local pkg="$1" archpath
for tree in "${ARCH_TREE[@]}"; do
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && archpath=${TREE_DIR_ARCH}/$tree/$pkg
done
echo "$archpath"
}
pre_compare(){
local func="$1" pkgpath="$2" result group
group="${pkgpath%/*}"
group=${group##*/}
local pkg artixrepo archrepo pkgbuild artixver archver archpath node a b
pkg=${pkgpath##*/}
artixrepo=$(find_repo "$pkgpath")
pkgbuild=$pkgpath/$artixrepo/PKGBUILD
if [[ -f $pkgbuild ]]; then
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
artixver=$(get_full_version)
archpath=$(get_archpath "$pkg")
archrepo=$(find_repo "${archpath}")
pkgbuild=$archpath/$archrepo/PKGBUILD
node=${artixrepo%/*}
a=${archrepo#*/} b=${artixrepo#*/}
a="${a%-*}"
[[ "$node" != "$CARCH" ]] && b=${b%-*}
if [[ -f "$pkgbuild" ]]; then
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
archver=$(get_full_version)
fi
"$func"
unset pkgver epoch pkgrel artixver archver pkgbuild archpath
fi
}
compare_upgrades(){
local pkgpath="${1%/*}"
pre_compare compare_u "$pkgpath"
}
compare_downgrades(){
local pkgpath="${1%/*}"
pre_compare compare_d "$pkgpath"
}
compare_move(){
local pkgpath="${1%/*}"
pre_compare compare_m "$pkgpath"
}
#}}}
#{{{ functions
tree_loop(){
local func="$1"
for tree in "${ARTIX_TREE[@]}"; do
for package in $(find "${TREE_DIR_ARTIX}/$tree" -name trunk); do
"$func" "$package"
done
done
}
show_compare_header(){
msg_table_header "${table}" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" "Group"
}
show_upgrades_table(){
show_compare_header
[[ -f "${TREE_DIR_ARTIX}"/pkg_upgrades.list ]] && rm "${TREE_DIR_ARTIX}"/pkg_upgrades.list
tree_loop compare_upgrades
}
show_downgrades_table(){
show_compare_header
tree_loop compare_downgrades
}
show_move_table(){
show_compare_header
[[ -f "${TREE_DIR_ARTIX}"/pkg_moves.list ]] && rm "${TREE_DIR_ARTIX}"/pkg_moves.list
tree_loop compare_move
}
update_db_cache(){
msg "Updating database cache"
for repo in "${searchrepos[@]}"; do
local cachedir=${db_cache_dir}/${linksdb_ext}/${CARCH}/${repo}
rm -rf "$cachedir"
mkdir -p "$cachedir"
msg2 "%s" "$repo"
curl -L -s "${REPOS_MIRROR}/${repo}/os/${CARCH}/${repo}.${linksdb_ext}" \
| bsdtar -xf - -C "$cachedir"
done
msg "Done"
}
#}}}
#{{{ sogrep
query_db() {
for repo in "${searchrepos[@]}"; do
local db=${db_cache_dir}/${linksdb_ext}/${CARCH}/${repo}/
if [[ -d ${db} ]]; then
while read -rd '' pkg; do
read -r match
pkg=${pkg#${db}}
pkg="${pkg%/*}"
msg_row "${tableQ}" "${repo}" "${pkg}" "${match}"
done < <(grep -rZ "${library}" "${db}") | sort -u
fi
done
}
show_lib_table() {
${sync} && update_db_cache
msg_table_header "${tableQ}" "Repo" "Package" "Library"
query_db
}
#}}}
#{{{ check db
is_db_entry() {
local pkgname="$1" repo="$(arch2artix $2)"
if [[ -d ${USER_CACHE_DIR}/${LINKSDBEXT}/${ARCH}/$repo/$pkgname ]];then
local pkgname="$1" repo="${REPOS[$2]}"
if [[ -d ${db_cache_dir}/${linksdb_ext}/${CARCH}/$repo/$pkgname ]];then
return 0
fi
return 1
}
check_db(){
local pkgpath="$1"
local pkg=${pkgpath##*/}
local sarch=(any ${ARCH})
local arch_repos=$(arch_repos "${staging}" "${unstable}")
local pkgpath="${1%/*}"
for repo in ${arch_repos[@]};do
for repo in "${!REPOS[@]}"; do
local pkgbuild artixver
[[ -f $pkgpath/$CARCH/$repo/PKGBUILD ]] && pkgbuild=$pkgpath/$CARCH/$repo/PKGBUILD
[[ -f $pkgpath/repos/$repo-$CARCH/PKGBUILD ]] && pkgbuild=$pkgpath/repos/$repo-$CARCH/PKGBUILD
[[ -f $pkgpath/repos/$repo-any/PKGBUILD ]] && pkgbuild=$pkgpath/repos/$repo-any/PKGBUILD
for a in ${sarch[@]};do
# shellcheck disable=1090
. "$pkgbuild" 2>/dev/null
local pkgbuild=$pkgpath/repos/$repo-$a/PKGBUILD
artixver=$(get_full_version)
for name in "${pkgname[@]}"; do
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local artixver=$(get_full_version)
local is_entry=false
for name in ${pkgname[@]};do
if is_db_entry "$name-$artixver" "$repo";then
is_entry=true
fi
if ! $is_entry; then
msg_row "${tableU}" "$repo" "$name" "$artixver" "$is_entry"
fi
done
unset artixver is_entry pkgbuild pkgver epoch pkgname pkgbase
if ! is_db_entry "$name-$artixver" "$repo"; then
msg_row "${tableU}" "$repo" "$name" "$artixver" "false"
fi
done
unset artixver pkgbuild pkgver epoch pkgname pkgbase
done
}
update_db_cache(){
msg "Updating database cache"
for repo in "${searchrepos[@]}"; do
local cachedir=${USER_CACHE_DIR}/${LINKSDBEXT}/${ARCH}/${repo}
rm -rf "$cachedir"
mkdir -p "$cachedir"
msg2 "%s" "$repo"
curl -L -s "${REPOS_MIRROR}/${repo}/os/${ARCH}/${repo}.${LINKSDBEXT}" \
| bsdtar -xf - -C "$cachedir"
done
msg "Done"
show_db_table(){
${sync} && update_db_cache
msg_table_header "${tableU}" "Repo" "Package" "Version" "Database"
tree_loop check_db
}
query_db() {
for repo in "${searchrepos[@]}"; do
local prefix=
local db=${USER_CACHE_DIR}/${LINKSDBEXT}/${ARCH}/${repo}/
if [[ -d ${db} ]]; then
while read -rd '' pkg; do
read -r match
pkg=${pkg#${db}}
pkg="${pkg%/*}"
#}}}
msg_row "${tableQ}" "${repo}" "${pkg}" "${match}"
done < <(grep -rZ "${library}" "${db}") | sort -u
fi
done
exit 0
}
db_cache_dir="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
show_version_table(){
if ${check};then
${sync} && update_db_cache
msg_table_header "${tableU}" "Repo" "Package" "Version" "Database"
elif ${query};then
${sync} && update_db_cache
msg_table_header "${tableQ}" "Repo" "Package" "Library"
query_db
else
msg_table_header "${table}" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version" "Group"
fi
if ${move} && [[ -f ${TREE_DIR_ARTIX}/pkg_moves.list ]]; then
rm ${TREE_DIR_ARTIX}/pkg_moves.list
elif ${upgrades} && [[ -f ${TREE_DIR_ARTIX}/pkg_upgrades.list ]]; then
rm ${TREE_DIR_ARTIX}/pkg_upgrades.list
fi
for tree in ${TREE_NAMES_ARTIX[@]};do
local git=$(find ${TREE_DIR_ARTIX}/$tree/ -mindepth 1 -maxdepth 1 -type d)
for package in ${git[@]}; do
if ${check};then
check_db "$package"
else
compare "$package" "$tree"
fi
done
done
}
linksdb_ext="links.tar.${DBEXT}"
load_makepkg_config
unstable=false
testing=true
staging=true
unstable=false
upgrades=false
downgrades=false
move=false
check=false
sync=false
query=false
artix_repos=(
'goblins' 'gremlins' 'system' 'world'
'galaxy-goblins' 'galaxy-gremlins' 'galaxy'
'lib32-goblins' 'lib32-gremlins' 'lib32'
'gnome-wobble' 'kde-wobble'
)
sync=false
check=false
query=false
readonly table="%-18s %-18s %-25s %-27s %-27s %-10s"
readonly tableU="%-20s %-35s %-30s %-10s"
readonly tableQ="%-20s %-45s %s"
searchrepos=(${artix_repos[@]})
usage() {
echo "Usage: ${0##*/} [options] (with -q [libname])"
echo ' -u Show upgrade packages'
echo ' -d Show downgrade packages'
echo ' -m Show packages to move'
echo " -x Don't inlcude staging packages"
echo ' -y Include unstable kde and gnome'
echo ' -c Check repos'
echo " -x Don't inlcude testing packages"
echo " -y Don't inlcude staging packages"
echo ' -z Include unstable kde and gnome'
echo " -s Sync repo databases"
echo ' -c Check repos'
echo " -q Query repo databases for so libs"
echo ' -r <repo> Repo name to query'
echo ' [default: all]'
echo ' -h This help'
echo ''
echo ''
exit $1
exit "$1"
}
orig_argv=("$0" "$@")
opts='r:qcsudmxyh'
opts='r:qcsudmxyzh'
while getopts "${opts}" arg; do
case "${arg}" in
u) upgrades=true ;;
d) downgrades=true ;;
m) move=true ;;
x) staging=false ;;
y) unstable=true ;;
c) check=true ;;
s) sync=true ;;
c) check=true ;;
q) query=true ;;
r) searchrepos=("$OPTARG") ;;
x) testing=false ;;
y) staging=false ;;
z) unstable=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
shift $(( OPTIND - 1 ))
library="$1"; shift
show_version_table
set_arch_repos "$testing" "$staging" "$unstable"
#{{{ repo names arrays
declare -A REPOS=(
[${valid_names[0]}]=system
[${valid_names[1]}]=world
[${valid_names[2]}]=galaxy
[${valid_names[3]}]=lib32
[${valid_names[4]}]=gremlins
[${valid_names[5]}]=galaxy-gremlins
[${valid_names[6]}]=lib32-gremlins
[${valid_names[7]}]=goblins
[${valid_names[8]}]=galaxy-goblins
[${valid_names[9]}]=lib32-goblins
[${valid_names[11]}]=kde-wobble
[${valid_names[12]}]=gnome-wobble
)
searchrepos=(
"${REPOS[${valid_names[11]}]}"
"${REPOS[${valid_names[12]}]}"
"${REPOS[${valid_names[7]}]}"
"${REPOS[${valid_names[8]}]}"
"${REPOS[${valid_names[9]}]}"
"${REPOS[${valid_names[4]}]}"
"${REPOS[${valid_names[5]}]}"
"${REPOS[${valid_names[6]}]}"
"${REPOS[${valid_names[0]}]}"
"${REPOS[${valid_names[1]}]}"
"${REPOS[${valid_names[2]}]}"
"${REPOS[${valid_names[3]}]}"
)
#}}}
${move} && show_move_table
${upgrades} && show_upgrades_table
${downgrades} && show_downgrades_table
${check} && show_db_table
${query} && show_lib_table

View File

@@ -12,128 +12,49 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-pkg.sh
m4_include(lib/util-base.sh)
m4_include(lib/util-pkg.sh)
m4_include(lib/base/message.sh)
m4_include(lib/pkg/deploy.sh)
find_cached_pkgfile() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local pkg="$1"
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
results+=$(find "$dir" -type f -name "$pkg")
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "${results[0]}"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
;;
esac
}
#{{{ functions
get_pkgbasename(){
local pkg="$1"
local pkgbasename name ver rel arch
pkgbasename=${pkg%.pkg.tar.?z}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
echo $name
}
update_repo2(){
local repo="$1"
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=()
for name in ${passfiles[@]}; do
if pkgfile=$(find_cached_pkgfile "$name");then
info "Found: %s" "$name"
if ${add_pkg};then
local action='add'
packages+=("$name")
if ${sign_pkg};then
[[ -e ${pkgfile}.sig ]] && rm ${pkgfile}.sig
signfile ${pkgfile}
fi
ln -sf ${pkgfile}{,.sig} $repo_path/
elif ${del_pkg};then
local action='remove'
packages+=("$(get_pkgbasename "$name")")
[[ -e $repo_path/$name ]] && rm $repo_path/$name
[[ -e $repo_path/$name.sig ]] && rm $repo_path/$name.sig
fi
fi
done
cd $repo_path
if [[ -n $action ]]; then
repo-$action -R $repo.${PKGDBEXT} ${packages[@]}
${linksdb} && links-$action $repo.${LINKSDBEXT} ${packages[@]}
add(){
if pkgfile=$(find_cached_pkgfile "${pkgname}"); then
msg "Found: %s" "${pkgfile}"
packages+=("${pkgname}")
action='add'
ln -sfv "${pkgfile}"{,.sig} "$repo_path"/
fi
return 0
}
update_repo(){
local repo="$1" pkgfile ver
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=()
remove(){
packages+=("$pkgname")
action='remove'
rm -v "$repo_path"/"$pkgname"*.pkg.tar.*
}
. PKGBUILD
local pkgsearch=(${pkgname[@]})
if check_option "debug" "y"; then
pkgbase=${pkgbase:-${pkgname[@]}}
pkgsearch+=("${pkgbase}-debug")
fi
for name in ${pkgsearch[@]}; do
pkgarch=$(get_pkg_arch "$name")
ver=$(get_full_version)
if pkgfile=$(find_cached_package "$name" "$ver" "$pkgarch");then
local pkg=${pkgfile##*/}
info "Found: %s" "$pkg"
if ${add_pkg};then
local action='add'
packages+=("$pkg")
if ${sign_pkg};then
[[ -e ${pkgfile}.sig ]] && rm ${pkgfile}.sig
signfile ${pkgfile}
fi
ln -sf ${pkgfile}{,.sig} $repo_path/
elif ${del_pkg};then
local action='remove'
packages+=("$name")
[[ -e $repo_path/$pkg ]] && rm $repo_path/$pkg
[[ -e $repo_path/$pkg.sig ]] && rm $repo_path/$pkg.sig
fi
fi
repo_action(){
local packages=() action func="$1"
for pkgname in "${passfiles[@]}"; do
"$func"
done
cd $repo_path
if [[ -n $action ]]; then
repo-$action -R $repo.${PKGDBEXT} ${packages[@]}
${linksdb} && links-$action $repo.${LINKSDBEXT} ${packages[@]}
cd "$repo_path" || return
if [[ -n "${action}" ]]; then
repo-"${action}" -R "${dest_repo}"."${pkgdb_ext}" "${packages[@]}"
${linksdb} && links-"${action}" "${dest_repo}"."${linksdb_ext}" "${packages[@]}"
fi
return 0
}
#}}}
load_makepkg_config
pkgdb_ext="db.tar.${DBEXT}"
linksdb_ext="links.tar.${DBEXT}"
add_pkg=false
del_pkg=false
sign_pkg=false
rm_pkg=false
linksdb=false
cmd=${0##*/}
@@ -141,37 +62,36 @@ dest_repo=${cmd#*-}
usage() {
echo "Usage: ${cmd} [options]"
echo ' -d <dest> Destination repository'
echo ' -a Add package(s) to repository'
echo ' -r Remove package(s) from repository'
echo ' -l Use links db'
echo ' -s Sign package(s)'
echo ' -h This help'
echo ''
echo ''
exit $1
exit "$1"
}
opts='arlsh'
opts='arlhd:'
while getopts "${opts}" arg; do
case "${arg}" in
a) add_pkg=true; del_pkg=false ;;
r) del_pkg=true; add_pkg=false ;;
d) dest_repo="$OPTARG" ;;
a) add_pkg=true; rm_pkg=false ;;
r) rm_pkg=true; add_pkg=false ;;
l) linksdb=true ;;
s) sign_pkg=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
shift $(( OPTIND - 1 ))
passfiles="$@"
passfiles=("$@")
prepare_dir "${REPOS_ROOT}"
repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH}
if [[ -n ${passfiles[@]} ]]; then
update_repo2 "${dest_repo}"
else
update_repo "${dest_repo}"
if [[ -n "${passfiles[*]}" ]]; then
${add_pkg} && repo_action add
${rm_pkg} && repo_action remove
fi

View File

@@ -12,8 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
m4_include(lib/base/message.sh)
set -e
shopt -s extglob

View File

@@ -12,7 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
match=$1

View File

@@ -12,7 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
ifs=$IFS
IFS="${IFS}:"

View File

@@ -19,6 +19,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
m4_include(lib/base/message.sh)
shopt -s extglob
declare -r REPO_DB_NAME="links"
@@ -35,8 +37,6 @@ LOCKFILE=
CLEAN_LOCK=0
# PREVENT_DOWNGRADE=0
. @libdir@/artools/util-base.sh
# ensure we have a sane umask set
umask 0022
@@ -73,12 +73,12 @@ packages to remove can be specified on the command line.\n"
printf -- " -k, --key <key> use the specified key to sign the database\n"
printf -- " -v, --verify verify database's signature before update\n"
printf -- "\n\
See %s(8) for more details and descriptions of the available options.\n" $cmd
See %s(8) for more details and descriptions of the available options.\n" "$cmd"
printf "\n"
if [[ $cmd == "links-add" ]] ; then
printf -- "Example: links-add /path/to/repo.${LINKSDBEXT} pacman-5.1.3-1-x86_64.pkg.tar.xz\n"
printf -- "Example: links-add /path/to/repo.links.tar.xz pacman-5.1.3-1-x86_64.pkg.tar.xz\n"
elif [[ $cmd == "links-remove" ]] ; then
printf -- "Example: links-remove /path/to/repo.${LINKSDBEXT} kernel26\n"
printf -- "Example: links-remove /path/to/repo.links.tar.xz kernel26\n"
fi
}
@@ -88,8 +88,8 @@ find_pkgentry() {
for pkgentry in "$tmpdir/${REPO_DB_NAME}/$pkgname"*; do
name=${pkgentry##*/}
if [[ ${name%-*-*} = $pkgname ]]; then
echo $pkgentry
if [[ ${name%-*-*} = "$pkgname" ]]; then
echo "$pkgentry"
return 0
fi
done
@@ -103,8 +103,8 @@ check_gpg() {
fi
if (( ! VERIFY )); then
if ! gpg --list-key ${GPGKEY} &>/dev/null; then
if [[ ! -z $GPGKEY ]]; then
if ! gpg --list-key "${GPGKEY}" &>/dev/null; then
if [[ -n "$GPGKEY" ]]; then
error "The key ${GPGKEY} does not exist in your keyring."
elif (( ! KEY )); then
error "There is no key in your keyring."
@@ -125,7 +125,7 @@ create_signature() {
if [[ -n $GPGKEY ]]; then
SIGNWITHKEY="-u ${GPGKEY}"
fi
gpg --detach-sign --use-agent --no-armor ${SIGNWITHKEY} "$dbfile" &>/dev/null || ret=$?
gpg --detach-sign --use-agent --no-armor "${SIGNWITHKEY}" "$dbfile" &>/dev/null || ret=$?
if (( ! ret )); then
msg2 "Created signature file '%s'" "${dbfile##*/.tmp.}.sig"
@@ -222,7 +222,7 @@ db_write_entry() {
mkdir "$tmppkg"
bsdtar -xof $pkgfile -C $tmppkg --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null
bsdtar -xof "$pkgfile" -C "$tmppkg" --include={opt,{,usr/}{lib{,32},{s,}bin}}'/*' 2>/dev/null
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
mkdir "$pkgname-$pkgver"
@@ -233,9 +233,9 @@ db_write_entry() {
local linksentry=$tmpdir/${REPO_DB_NAME}/$pkgname-$pkgver/${REPO_DB_NAME}
for f in $(find $tmppkg -type f); do
for f in $(find "$tmppkg" -type f); do
readelf -d "$f" 2> /dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p'
done | sort -u > $linksentry
done | sort -u > "$linksentry"
popd >/dev/null
popd >/dev/null
@@ -248,7 +248,8 @@ db_write_entry() {
db_remove_entry() {
local pkgname=$1
local notfound=1
local pkgentry=$(find_pkgentry "$pkgname")
local pkgentry
pkgentry=$(find_pkgentry "$pkgname")
while [[ -n $pkgentry ]]; do
notfound=0
@@ -257,7 +258,8 @@ db_remove_entry() {
rm -rf "$pkgentry"
# remove entries in "links" database
local linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//')
local linksentry
linksentry=$(echo "$pkgentry" | sed 's/\(.*\)\/db\//\1\/links\//')
rm -rf "$linksentry"
pkgentry=$(find_pkgentry "$pkgname")
@@ -404,11 +406,11 @@ create_db() {
pushd "$tmpdir/${REPO_DB_NAME}" >/dev/null
if ( shopt -s nullglob; files=(*); (( ${#files[*]} )) ); then
bsdtar -c${TAR_OPT}f "$tempname" *
bsdtar -c"${TAR_OPT}"f "$tempname" *
else
# we have no packages remaining? zip up some emptyness
warning "No packages remain, creating empty database."
bsdtar -c${TAR_OPT}f "$tempname" -T /dev/null
bsdtar -c"${TAR_OPT}"f "$tempname" -T /dev/null
fi
popd >/dev/null
@@ -433,7 +435,7 @@ clean_up() {
[[ -d $tmpdir ]] && rm -rf "$tmpdir"
(( CLEAN_LOCK )) && [[ -f $LOCKFILE ]] && rm -f "$LOCKFILE"
exit $exit_code
exit "$exit_code"
}
# PROGRAM START

View File

@@ -12,7 +12,8 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
m4_include(lib/base/chroot.sh)
shopt -s nullglob
@@ -278,8 +279,6 @@ move_products() {
}
# }}}
orig_argv=("$0" "$@")
opts='hcur:I:l:nNCTb:U:'
while getopts "${opts}" arg; do
@@ -377,11 +376,7 @@ if chroot-run \
"$copydir" \
/chrootbuild "${makepkg_args[@]}"
then
pkgnames=()
for pkgfile in "$copydir"/pkgdest/*; do
pkgfile=${pkgfile##*/};
pkgnames+=("${pkgfile%-*-*-*}");
done
mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"')
move_products
else
(( ret += 1 ))
@@ -398,13 +393,28 @@ if (( ret != 0 )); then
else
if (( run_checkpkg )); then
msg "Running checkpkg"
msg2 "Downloading current versions"
if pacman --noconfirm -Swdd --logfile /dev/null "${pkgnames[@]}"; then
msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn
else
warning "Skipped checkpkg due to missing packages"
mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
--dbpath "$copydir"/var/lib/pacman \
-Sddp "${pkgnames[@]}")
if ! wait $!; then
warning "Skipped checkpkg due to missing repo packages"
exit 0
fi
# download package files if any non-local location exists
for remotepkg in "${remotepkgs[@]}"; do
if [[ $remotepkg != file://* ]]; then
msg2 "Downloading current versions"
chroot-run "$copydir" pacman --noconfirm -Swdd "${pkgnames[@]}"
mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \
--dbpath "$copydir"/var/lib/pacman \
-Sddp "${pkgnames[@]}")
break
fi
done
msg2 "Checking packages"
sudo -u "$makepkg_user" checkpkg --rmdir --warn "${remotepkgs[@]/#file:\/\//}"
fi
true
fi

View File

@@ -12,9 +12,12 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
. @libdir@/artools/util-base.sh
m4_include(lib/base/message.sh)
m4_include(lib/base/yaml.sh)
write_attr(){
#{{{ functions
srcyaml_write_attr(){
local ident1="$1" ident2="$2" ident3="$3"
local attrname=$4 attrvalues=("${@:5}")
@@ -24,47 +27,41 @@ write_attr(){
attrvalues=("${attrvalues[@]%[[:space:]]}")
case $attrname in
makedepends|checkdepends|depends|provides|arch)
Yaml+=$(write_yaml_map $ident1 "$attrname")
for v in ${attrvalues[@]};do
Yaml+=$(write_yaml_seq $ident2 "$v")
pkgver|pkgrel|epoch|url|install|changelog)
for v in "${attrvalues[@]}"; do
Yaml+=$(write_yaml_map "$ident3" "$attrname" "$v")
done
;;
*)
for v in ${attrvalues[@]};do
Yaml+=$(write_yaml_map $ident3 "$attrname" "$v")
Yaml+=$(write_yaml_map "$ident1" "$attrname")
for v in "${attrvalues[@]}"; do
Yaml+=$(write_yaml_seq "$ident2" "$v")
done
;;
esac
}
extract_info() {
pkgbuild_extract_to_yaml() {
local pkgname=$1 attrname=$2 isarray=$3 outvalue=
if get_pkgbuild_attribute "$pkgname" "$attrname" "$isarray" 'outvalue'; then
[[ -z $pkgname ]] && write_attr 2 4 2 "$attrname" "${outvalue[@]}"
[[ -n $pkgname ]] && write_attr 4 6 2 "$attrname" "${outvalue[@]}"
[[ -z $pkgname ]] && srcyaml_write_attr 2 4 2 "$attrname" "${outvalue[@]}"
[[ -n $pkgname ]] && srcyaml_write_attr 4 6 2 "$attrname" "${outvalue[@]}"
fi
}
write_details() {
srcyaml_write_section_details() {
local attr package_arch a
local multivalued_arch_attrs=(provides depends makedepends checkdepends)
local singlevalued=()
local multivalued=(arch provides depends checkdepends)
if [[ -z "$1" ]];then
singlevalued=(pkgver pkgrel epoch)
multivalued=(arch provides depends makedepends checkdepends)
fi
local multivalued_arch_attrs=(source provides conflicts depends replaces
optdepends makedepends checkdepends)
# "${known_hash_algos[@]/%/sums}")
for attr in "${singlevalued[@]}"; do
extract_info "$1" "$attr" 0
pkgbuild_extract_to_yaml "$1" "$attr" 0
done
for attr in "${multivalued[@]}"; do
extract_info "$1" "$attr" 1
pkgbuild_extract_to_yaml "$1" "$attr" 1
done
get_pkgbuild_attribute "$1" 'arch' 1 'package_arch'
@@ -73,56 +70,69 @@ write_details() {
[[ $a = any ]] && continue
for attr in "${multivalued_arch_attrs[@]}"; do
extract_info "$1" "${attr}_$a" 1
pkgbuild_extract_to_yaml "$1" "${attr}_$a" 1
done
done
}
write_pkg_yaml(){
Yaml=$(write_yaml_header)
yaml_write_global() {
local singlevalued=(pkgver pkgrel epoch url install changelog) #pkgdesc
local multivalued=(arch groups license checkdepends makedepends
depends provides conflicts replaces)
#noextract options backup optdepends
#source validpgpkeys "${known_hash_algos[@]/%/sums}")
Yaml+=$(write_empty_line)
local full=$(get_full_version)
local ver=${full:-0}
pkgbase=${pkgbase:-${pkgname[0]}}
Yaml+=$(write_yaml_map 0 "pkgbase")
Yaml+=$(write_yaml_map 2 "pkgname" "${pkgbase}")
${details} && write_details ''
Yaml+=$(write_yaml_map 2 "fullver" "${ver}")
Yaml+=$(write_yaml_map 2 "name" "${pkgbase:-$pkgname}")
${details} && srcyaml_write_section_details ''
Yaml+=$(write_empty_line)
}
Yaml+=$(write_yaml_map 0 "package")
yaml_write_package() {
local singlevalued=(url install changelog) #pkgdesc
local multivalued=(arch groups license checkdepends depends
provides conflicts replaces) #options backup optdepends)
Yaml+=$(write_yaml_map 0 "packages")
for pkg in "${pkgname[@]}"; do
Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg")
${details} && write_details "$pkg"
${details} && srcyaml_write_section_details "$pkg"
done
Yaml+=$(write_empty_line)
}
local pkgfile=$(print_all_package_names)
Yaml+=$(write_yaml_map 0 "pkgfile")
for f in ${pkgfile[@]};do
yaml_write_fileinfo(){
local version
version=$(get_full_version)
pkgbase=${pkgbase:-$pkgname}
Yaml+=$(write_yaml_map 0 "version" "${version:-0}")
Yaml+=$(write_empty_line)
local pkgfile
pkgfile=$(print_all_package_names)
Yaml+=$(write_yaml_map 0 "files")
for f in ${pkgfile}; do
Yaml+=$(write_yaml_seq 2 "${f##*/}")
done
Yaml+=$(write_empty_line)
}
write_srcyaml(){
Yaml=$(write_yaml_header)
yaml_write_global
yaml_write_package
yaml_write_fileinfo
printf '%s' "${Yaml}"
}
#}}}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -d Don't include details"
echo ' -h This help'
echo ''
exit $1
exit "$1"
}
details=true
@@ -137,13 +147,16 @@ while getopts "${opts}" arg; do
esac
done
shift $(( $OPTIND - 1 ))
shift $(( OPTIND - 1 ))
[[ -f "$1"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$1"
PACKAGE="$1"/PKGBUILD; shift
srcpath=$(readlink -f "$1")
[[ -f "$srcpath"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$srcpath"
PACKAGE="$srcpath"/PKGBUILD; shift
# shellcheck disable=1090
. "$PACKAGE"
load_makepkg_config
write_pkg_yaml
write_srcyaml

46
bin/pkg/signpkg.in Normal file
View File

@@ -0,0 +1,46 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
m4_include(lib/base/message.sh)
m4_include(lib/pkg/deploy.sh)
load_makepkg_config
passfiles=("$@")
sign_pkg(){
local file_to_sign="$1"
if [ ! -e "$file_to_sign" ]; then
error "%s does not exist!" "$file_to_sign"
exit 1
fi
if [[ -n "${BUILDBOT_GPGP}" ]]; then
msg "Signing [%s]" "${file_to_sign##*/}"
gpg --batch --passphrase "${BUILDBOT_GPGP}" --detach-sign "$file_to_sign"
else
msg "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..."
gpg --detach-sign --use-agent -u "${GPGKEY}" "$file_to_sign"
fi
}
for pkg in "${passfiles[@]}"; do
msg "Searching %s ..." "$pkg"
if pkgfile=$(find_cached_pkgfile "$pkg");then
msg2 "Found: %s" "${pkgfile}"
[[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig
sign_pkg "${pkgfile}"
fi
done

View File

@@ -6,4 +6,4 @@
# CHROOTS_DIR=/var/lib/artools
# the workspace directory
# WORKSPACE_DIR="/home/${OWNER}/artools-workspace"
# WORKSPACE_DIR="/home/${USER}/artools-workspace"

View File

@@ -11,11 +11,5 @@
# possible values: openrc, runit, s6
# INITSYS="openrc"
# gpg key; leave empty or commented to skip sfs signing
# gpg key; leave empty or commented to skip img signing
# GPG_KEY=""
# set upload bandwidth limit in kB/s
# UPLIMIT=1000
# the server user
# ACCOUNT=[SetUser]

View File

@@ -2,44 +2,39 @@
################ artools-pkg ################
#############################################
# gitea user access token
# gitea user access token for buildtree
# GIT_TOKEN=''
# HOST_TREE_ARTIX='gitea@gitea.artixlinux.org:artixlinux'
# TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux
# customize buildtree, packages and community should be enabled
# customize buildtree; uncomment to include
# TREE_NAMES_ARTIX=(
# packages
# community
# packages-kernel
# packages-openrc
# packages-runit
# packages-s6
# packages-media
# packages-xorg
# packages-python
# packages-perl
# packages-java
# packages-qt5
# packages-devel
# packages-ruby
# packages-gtk
# packages-kf5
# packages-plasma
# packages-kde
# packages-gnome
# packages-cinnamon
# packages-lxqt
# packages-mate
# packages-kde
# packages-xfce
# packages-wm
# packages-devel
# packages-lib32
# packages-qt6
# )
# HOST_TREE_ARCH=git://git.archlinux.org/svntogit
# TREE_DIR_ARCH=${WORKSPACE_DIR}/archlinux
# default repos root
# default repos root for deploypkg
# REPOS_ROOT=${WORKSPACE_DIR}/repos
# default mirror for sogrep
# default mirror for comparepkg -s
# REPOS_MIRROR="http://mirror1.artixlinux.org/repos"

View File

@@ -1,5 +0,0 @@
MODULES=(loop dm-snapshot)
HOOKS=(base udev artix_shutdown artix artix_loop_mnt artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs artix_kms modconf block filesystems keyboard keymap)
COMPRESSION="xz"

View File

@@ -132,7 +132,7 @@ DBGSRCDIR="/usr/src/debug"
COMPRESSGZ=(gzip -c -f -n)
COMPRESSBZ2=(bzip2 -c -f)
COMPRESSXZ=(xz -c -z -)
COMPRESSZST=(zstd -c -z -q -)
COMPRESSZST=(zstd -c -T0 --ultra -20 -)
COMPRESSLRZ=(lrzip -q)
COMPRESSLZO=(lzop -q)
COMPRESSZ=(compress -c -f)
@@ -143,7 +143,7 @@ COMPRESSLZ=(lzip -c -f)
# EXTENSION DEFAULTS
#########################################################################
#
PKGEXT='.pkg.tar.xz'
PKGEXT='.pkg.tar.zst'
SRCEXT='.src.tar.gz'
# vim: set ft=sh ts=2 sw=2 et:

View File

@@ -97,25 +97,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
#[testing]
#Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
#[community-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -0,0 +1,111 @@
#
# /etc/pacman.conf
#
# See the pacman.conf(5) manpage for option and repository directives
#
# GENERAL OPTIONS
#
[options]
# The following paths are commented out with their default values listed.
# If you wish to use different paths, uncomment and update the paths.
#RootDir = /
#DBPath = /var/lib/pacman/
#CacheDir = /var/cache/pacman/pkg/
#LogFile = /var/log/pacman.log
#GPGDir = /etc/pacman.d/gnupg/
#HookDir = /etc/pacman.d/hooks/
HoldPkg = pacman glibc
#XferCommand = /usr/bin/curl -L -C - -f -o %o %u
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
NoExtract = usr/share/help/* !usr/share/help/en*
NoExtract = usr/share/gtk-doc/html/* usr/share/doc/*
NoExtract = usr/share/locale/* usr/share/X11/locale/* usr/share/i18n/*
NoExtract = !*locale*/en*/* !usr/share/i18n/charmaps/UTF-8.gz !usr/share/*locale*/locale.*
NoExtract = !usr/share/*locales/en_?? !usr/share/*locales/i18n* !usr/share/*locales/iso*
NoExtract = !usr/share/*locales/trans*
NoExtract = usr/share/man/* usr/share/info/*
NoExtract = usr/share/vim/vim*/lang/*
# Misc options
#UseSyslog
#Color
#TotalDownload
CheckSpace
VerbosePkgLists
# By default, pacman accepts packages signed by keys that its local keyring
# trusts (see pacman-key and its man page), as well as unsigned packages.
SigLevel = Required DatabaseOptional
LocalFileSigLevel = Optional
#RemoteFileSigLevel = Required
# NOTE: You must run `pacman-key --init` before first using pacman; the local
# keyring can then be populated with the keys of all official Artix Linux
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
# - can be defined here or included from another file
# - pacman will search repositories in the order defined here
# - local/custom mirrors can be added here or in separate files
# - repositories listed first will take precedence when packages
# have identical names, regardless of version number
# - URLs will have $repo replaced by the name of the current repo
# - URLs will have $arch replaced by the name of the architecture
#
# Repository entries are of the format:
# [repo-name]
# Server = ServerName
# Include = IncludePath
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
# The gremlins repositories are disabled by default. To enable, uncomment the
# repo name header and Include lines. You can add preferred servers immediately
# after the header, and they will be used before the default mirrors.
[system]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy]
Include = /etc/pacman.d/mirrorlist
# If you want to run 32 bit applications on your x86_64 system,
# enable the lib32 repositories as required here.
#[lib32]
#Include = /etc/pacman.d/mirrorlist
# An example of a custom package repository. See the pacman manpage for
# tips on creating your own repositories.
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
#[extra]
#Include = /etc/pacman.d/mirrorlist-arch
#[community]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -109,37 +109,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[gnome-unstable]
Include = /etc/pacman.d/mirrorlist-arch
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -106,34 +106,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -97,25 +97,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -109,37 +109,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[kde-unstable]
Include = /etc/pacman.d/mirrorlist-arch
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-staging]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -106,34 +106,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[staging]
Include = /etc/pacman.d/mirrorlist-arch
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-staging]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
[multilib-staging]
Include = /etc/pacman.d/mirrorlist-arch
[multilib-testing]
Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -97,25 +97,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
[testing]
Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
[multilib-testing]
Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -97,25 +97,3 @@ Include = /etc/pacman.d/mirrorlist
#[custom]
#SigLevel = Optional TrustAll
#Server = file:///home/custompkgs
#
# ARCHLINUX
#
#[testing]
#Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
#[community-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[community]
Include = /etc/pacman.d/mirrorlist-arch
#[multilib-testing]
#Include = /etc/pacman.d/mirrorlist-arch
[multilib]
Include = /etc/pacman.d/mirrorlist-arch

42
data/valid-names.conf Normal file
View File

@@ -0,0 +1,42 @@
#!/hint/bash
valid_names=(
core
extra
community
multilib
testing
community-testing
multilib-testing
staging
community-staging
multilib-staging
rebuild
gnome-unstable
kde-unstable
)
stable=(
"${valid_names[0]}"
"${valid_names[1]}"
"${valid_names[2]}"
"${valid_names[3]}"
)
gremlins=(
"${valid_names[4]}"
"${valid_names[5]}"
"${valid_names[6]}"
)
goblins=(
"${valid_names[7]}"
"${valid_names[8]}"
"${valid_names[9]}"
"${valid_names[10]}"
)
unstable=(
"${valid_names[11]}"
"${valid_names[12]}"
)

View File

@@ -8,36 +8,36 @@ _mnt_dmsnapshot() {
local ro_dev ro_dev_size rw_dev
ro_dev=$(losetup --find --show --read-only "${img}")
echo ${ro_dev} >> /run/artix/used_block_devices
echo ${ro_dev} >> ${live_root}/used_block_devices
ro_dev_size=$(blockdev --getsz ${ro_dev})
if [[ "${cow_persistent}" == "P" ]]; then
if [[ -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '/run/artix/cowspace/${cow_directory}/${img_name}.cow', using as persistent."
if [[ -f "${cow}/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '${cow}/${cow_directory}/${img_name}.cow', using as persistent."
else
msg ":: Creating '/run/artix/cowspace/${cow_directory}/${img_name}.cow' as persistent."
truncate -s "${cow_spacesize}" "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
msg ":: Creating '${cow}/${cow_directory}/${img_name}.cow' as persistent."
truncate -s "${cow_spacesize}" "${cow}/${cow_directory}/${img_name}.cow"
fi
else
if [[ -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '/run/artix/cowspace/${cow_directory}/${img_name}.cow' but non-persistent requested, removing."
rm -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
if [[ -f "${cow}/${cow_directory}/${img_name}.cow" ]]; then
msg ":: Found '${cow}/${cow_directory}/${img_name}.cow' but non-persistent requested, removing."
rm -f "${cow}/${cow_directory}/${img_name}.cow"
fi
msg ":: Creating '/run/artix/cowspace/${cow_directory}/${img_name}.cow' as non-persistent."
truncate -s "${cow_spacesize}" "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
msg ":: Creating '${cow}/${cow_directory}/${img_name}.cow' as non-persistent."
truncate -s "${cow_spacesize}" "${cow}/${cow_directory}/${img_name}.cow"
fi
rw_dev=$(losetup --find --show "/run/artix/cowspace/${cow_directory}/${img_name}.cow")
echo ${rw_dev} >> /run/artix/used_block_devices
rw_dev=$(losetup --find --show "${cow}/${cow_directory}/${img_name}.cow")
echo ${rw_dev} >> ${live_root}/used_block_devices
dmsetup create ${dm_snap_name} --table "0 ${ro_dev_size} snapshot ${ro_dev} ${rw_dev} ${cow_persistent} ${cow_chunksize}"
if [[ "${cow_persistent}" != "P" ]]; then
rm -f "/run/artix/cowspace/${cow_directory}/${img_name}.cow"
rm -f "${cow}/${cow_directory}/${img_name}.cow"
fi
_mnt_dev "/dev/mapper/${dm_snap_name}" "${mnt}" "-w" "defaults"
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/artix/used_block_devices
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> ${live_root}/used_block_devices
}
# args: source, newroot, mountpoint
@@ -45,8 +45,8 @@ _mnt_overlayfs() {
local src="${1}"
local newroot="${2}"
local mnt="${3}"
local work_dir="/run/artix/overlay_root/work"
local upper_dir="/run/artix/overlay_root/upper"
local work_dir="${overlay_root}/work"
local upper_dir="${overlay_root}/upper"
mkdir -p "${upper_dir}" "${work_dir}"
@@ -63,15 +63,15 @@ _mnt_sfs() {
if [[ "${copytoram}" == "y" ]]; then
msg -n ":: Copying squashfs image to RAM..."
if ! "${oper}" "${img}" "/run/artix/copytoram/${img_fullname}" ; then
echo "ERROR: while copy '${img}' to '/run/artix/copytoram/${img_fullname}'"
if ! "${oper}" "${img}" "${cp2ram}/${img_fullname}" ; then
echo "ERROR: while copy '${img}' to '${cp2ram}/${img_fullname}'"
launch_interactive_shell
fi
img="/run/artix/copytoram/${img_fullname}"
img="${cp2ram}/${img_fullname}"
msg "done."
fi
sfs_dev=$(losetup --find --show --read-only "${img}")
echo ${sfs_dev} >> /run/artix/used_block_devices
echo ${sfs_dev} >> ${live_root}/used_block_devices
_mnt_dev "${sfs_dev}" "${mnt}" "-r" "defaults"
}
@@ -105,8 +105,8 @@ _mnt_dev() {
_verify_checksum() {
local _status
cd "/run/artix/bootmnt/${artixbasedir}/${arch}"
sha512sum -c $1.sha512 > /tmp/checksum.log 2>&1
cd "${bootmnt}/${root}"
sha512sum -c $1.img.sha512 > /tmp/checksum.log 2>&1
_status=$?
cd "${OLDPWD}"
return ${_status}
@@ -114,20 +114,19 @@ _verify_checksum() {
_verify_signature() {
local _status
cd "/run/artix/bootmnt/${artixbasedir}/${arch}"
gpg --homedir /gpg --status-fd 1 --verify $1.sfs.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG'
cd "${bootmnt}/${root}"
gpg --homedir /gpg --status-fd 1 --verify $1.img.sig 2>/dev/null | grep -qE '^\[GNUPG:\] GOODSIG'
_status=$?
cd "${OLDPWD}"
return ${_status}
}
run_hook() {
[[ -z "${arch}" ]] && arch="$(uname -m)"
[[ -z "${copytoram_size}" ]] && copytoram_size="75%"
[[ -z "${artixbasedir}" ]] && artixbasedir="artix"
[[ -z "${root}" ]] && root="LiveOS"
[[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="arch"
[[ -z "${artixdevice}" ]] && artixdevice="/dev/disk/by-label/${artixlabel}"
[[ -z "${dm_snap_prefix}" ]] && dm_snap_prefix="artix"
[[ -z "${artixdevice}" ]] && artixdevice="/dev/disk/by-label/${label}"
[[ -z "${cow_spacesize}" ]] && cow_spacesize="256M"
[[ -z "${overlay_root_size}" ]] && overlay_root_size="75%"
@@ -141,109 +140,135 @@ run_hook() {
fi
[[ -z "${cow_flags}" ]] && cow_flags="defaults"
[[ -z "${cow_directory}" ]] && cow_directory="persistent_${artixlabel}/${arch}"
[[ -z "${cow_directory}" ]] && cow_directory="persistent_${label}"
[[ -z "${cow_chunksize}" ]] && cow_chunksize="8"
[[ -z "${overlay}" ]] && overlay=""
lower_dir=''
live_root="/run/artix"
bootmnt="${live_root}/bootmnt"
overlay_root="${live_root}/overlay_root"
cow="${live_root}/cowspace"
cp2ram="${live_root}/copytoram"
# set mount handler for artix
mount_handler="artix_mount_handler"
}
_check_sum() {
local fs="${1}"
if [[ -f "${bootmnt}/${root}/${fs}.img" ]]; then
if [[ -f "${bootmnt}/${root}/${fs}.img.md5" ]]; then
msg -n ":: Self-test requested, please wait..."
if _verify_checksum "${fs}"; then
msg "done. Checksum is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
echo "see /tmp/checksum.log for details"
launch_interactive_shell
fi
else
echo "ERROR: checksum=y option specified but ${root}/${fs}.img.md5 not found"
launch_interactive_shell
fi
fi
}
_check_sig() {
local fs="${1}"
if [[ -f "${bootmnt}/${root}/${fs}.img" ]]; then
if [[ -f "${bootmnt}/${root}/${fs}.img.sig" ]]; then
msg -n ":: Signature verification requested, please wait..."
if _verify_signature "${fs}"; then
msg "done. Signature is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
launch_interactive_shell
fi
else
echo "ERROR: verify=y option specified but ${root}/${fs}.img.sig not found"
launch_interactive_shell
fi
fi
}
_gen_arg() {
local arg="${1}"
echo "${lower_dir:-}${lower_dir:+:}${arg}"
}
_mount_root_overlayfs() {
local sfs="${1}"
local src="${bootmnt}/${root}"
local dest_sfs="${live_root}/sfs"
local dest_img="${live_root}/img"
if [[ -f "${src}/${sfs}.img" ]]; then
_mnt_sfs "${src}/${sfs}.img" "${dest_sfs}/${sfs}"
local find_img="${dest_sfs}/${sfs}/LiveOS/${sfs}.img"
if [[ -f "${find_img}" ]]; then
mkdir -p ${dest_img}
lower_dir=$(_gen_arg "${dest_img}/${sfs}")
_mnt_dmsnapshot "${find_img}" "${dest_img}/${sfs}"
else
lower_dir=$(_gen_arg "${dest_sfs}/${sfs}")
fi
fi
}
# This function is called normally from init script, but it can be called
# as chain from other mount handlers.
# args: /path/to/newroot
artix_mount_handler() {
local newroot="${1}"
if ! mountpoint -q "/run/artix/bootmnt"; then
_mnt_dev "${artixdevice}" "/run/artix/bootmnt" "-r" "defaults"
if ! mountpoint -q "${bootmnt}"; then
_mnt_dev "${artixdevice}" "${bootmnt}" "-r" "defaults"
if [[ "${copytoram}" != "y" ]]; then
echo $(readlink -f ${artixdevice}) >> /run/artix/used_block_devices
echo $(readlink -f ${artixdevice}) >> ${live_root}/used_block_devices
fi
fi
if [[ "${checksum}" == "y" ]]; then
for fs in rootfs livefs;do
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sfs" ]]; then
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sha512" ]]; then
msg -n ":: Self-test requested, please wait..."
if _verify_checksum "${fs}"; then
msg "done. Checksum is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
echo "see /tmp/checksum.log for details"
launch_interactive_shell
fi
else
echo "ERROR: checksum=y option specified but ${artixbasedir}/${arch}/${fs}.sha512 not found"
launch_interactive_shell
fi
fi
done
_check_sum "rootfs"
[[ -n "${overlay}" ]] && _check_sum "${overlay}"
fi
if [[ "${verify}" == "y" ]]; then
for fs in rootfs livefs;do
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sfs" ]]; then
if [[ -f "/run/artix/bootmnt/${artixbasedir}/${arch}/${fs}.sfs.sig" ]]; then
msg -n ":: Signature verification requested, please wait..."
if _verify_signature "${fs}"; then
msg "done. Signature is OK, continue booting."
else
echo "ERROR: one or more files are corrupted"
launch_interactive_shell
fi
else
echo "ERROR: verify=y option specified but ${artixbasedir}/${arch}/${fs}.sfs.sig not found"
launch_interactive_shell
fi
fi
done
_check_sig "rootfs"
[[ -n "${overlay}" ]] && _check_sig "${overlay}"
fi
if [[ "${copytoram}" == "y" ]]; then
msg ":: Mounting /run/artix/copytoram (tmpfs) filesystem, size=${copytoram_size}"
mkdir -p /run/artix/copytoram
mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram /run/artix/copytoram
msg ":: Mounting ${cp2ram} (tmpfs) filesystem, size=${copytoram_size}"
mkdir -p ${cp2ram}
mount -t tmpfs -o "size=${copytoram_size}",mode=0755 copytoram ${cp2ram}
fi
if [[ -n "${cow_device}" ]]; then
_mnt_dev "${cow_device}" "/run/artix/cowspace" "-r" "${cow_flags}"
echo $(readlink -f ${cow_device}) >> /run/artix/used_block_devices
mount -o remount,rw "/run/artix/cowspace"
_mnt_dev "${cow_device}" "${cow}" "-r" "${cow_flags}"
echo $(readlink -f ${cow_device}) >> ${live_root}/used_block_devices
mount -o remount,rw "${cow}"
else
msg ":: Mounting /run/artix/cowspace (tmpfs) filesystem, size=${cow_spacesize}..."
mkdir -p /run/artix/cowspace
mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace /run/artix/cowspace
msg ":: Mounting ${cow} (tmpfs) filesystem, size=${cow_spacesize}..."
mkdir -p ${cow}
mount -t tmpfs -o "size=${cow_spacesize}",mode=0755 cowspace ${cow}
fi
mkdir -p -m 0700 "/run/artix/cowspace/${cow_directory}"
mkdir -p -m 0700 "${cow}/${cow_directory}"
msg -n ":: Mounting overlay root (tmpfs) filesystem, size=${overlay_root_size}..."
mkdir -p /run/artix/overlay_root
mount -t tmpfs -o "size=${overlay_root_size}",mode=0755 overlay_root /run/artix/overlay_root
mkdir -p ${overlay_root}
mount -t tmpfs -o "size=${overlay_root_size}",mode=0755 overlay_root ${overlay_root}
local src="/run/artix/bootmnt/${artixbasedir}/${arch}"
local dest_sfs="/run/artix/sfs" dest_img="/run/artix/img"
local lower_dir
for sfs in livefs rootfs;do
if [[ -f "${src}/${sfs}.sfs" ]]; then
_mnt_sfs "${src}/${sfs}.sfs" "${dest_sfs}/${sfs}"
if [[ -f "${dest_sfs}/${sfs}/${sfs}.img" ]]; then
mkdir -p ${dest_img}
lower_dir=${lower_dir:-}${lower_dir:+:}"${dest_img}/${sfs}"
_mnt_dmsnapshot "${dest_sfs}/${sfs}/${sfs}.img" "${dest_img}/${sfs}"
else
lower_dir=${lower_dir:-}${lower_dir:+:}"${dest_sfs}/${sfs}"
fi
fi
done
[[ -n "${overlay}" ]] && _mount_root_overlayfs "${overlay}"
_mount_root_overlayfs "rootfs"
_mnt_overlayfs "${lower_dir}" "${newroot}" "/"
if [[ "${copytoram}" == "y" ]]; then
umount -d /run/artix/bootmnt
mkdir -p /run/artix/bootmnt/${artixbasedir}/${arch}
mount -o bind /run/artix/copytoram /run/artix/bootmnt/${artixbasedir}/${arch}
umount -d ${bootmnt}
mkdir -p ${bootmnt}/${root}
mount -o bind ${cp2ram} ${bootmnt}/${root}
fi
}

View File

@@ -14,15 +14,15 @@ artix_loop_mount_handler () {
local _dev_loop
msg ":: Setup a loop device from ${img_loop} located at device ${img_dev}"
_mnt_dev "${img_dev}" "/run/artix/img_dev" "-r" "${img_flags}"
_mnt_dev "${img_dev}" "${live_root}/img_dev" "-r" "${img_flags}"
if [[ "${copytoram}" != "y" ]]; then
echo $(readlink -f ${img_dev}) >> /run/artix/used_block_devices
echo $(readlink -f ${img_dev}) >> ${live_root}/used_block_devices
fi
if _dev_loop=$(losetup --find --show --read-only "/run/artix/img_dev/${img_loop}"); then
if _dev_loop=$(losetup --find --show --read-only "${live_root}/img_dev/${img_loop}"); then
artixdevice="${_dev_loop}"
else
echo "ERROR: Setting loopback device for file '/run/artix/img_dev/${img_loop}'"
echo "ERROR: Setting loopback device for file '${live_root}/img_dev/${img_loop}'"
launch_interactive_shell
fi
@@ -30,6 +30,6 @@ artix_loop_mount_handler () {
if [[ "${copytoram}" == "y" ]]; then
losetup -d ${_dev_loop} 2>/dev/null
umount /run/artix/img_dev
umount ${live_root}/img_dev
fi
}

View File

@@ -17,13 +17,13 @@ run_hook() {
# Fetch a file with CURL
#
# $1 URL
# $2 Destination directory inside httpspace/${artixbasedir}
# $2 Destination directory inside httpspace/${root}
_curl_get() {
local _url="${1}"
local _dst="${2}"
msg ":: Downloading '${_url}'"
if ! curl -L -f -o "/run/artix/httpspace/${artixbasedir}${_dst}/${_url##*/}" --create-dirs "${_url}"; then
if ! curl -L -f -o "${live_root}/httpspace/${root}${_dst}/${_url##*/}" --create-dirs "${_url}"; then
echo "ERROR: Downloading '${_url}'"
echo " Falling back to interactive prompt"
echo " You can try to fix the problem manually, log out when you are finished"
@@ -31,29 +31,33 @@ _curl_get() {
fi
}
_get_sfs() {
local _sfs="${2}"
local _src=${artix_http_srv}${root}
if [[ ! -z "$( curl -s --head "${_src}/${_sfs}.img" | grep "OK" )" ]]; then
_curl_get "${_src}/${_sfs}.img" "/"
if [[ "${checksum}" == "y" ]]; then
_curl_get "${_src}/${_sfs}.md5" "/"
fi
if [[ "${verify}" == "y" ]]; then
_curl_get "${_src}/${_sfs}.img.sig" "/"
fi
fi
}
artix_pxe_http_mount_handler () {
newroot="${1}"
msg ":: Mounting /run/artix/httpspace (tmpfs) filesystem, size='${artix_http_spc}'"
mkdir -p "/run/artix/httpspace"
mount -t tmpfs -o size="${artix_http_spc}",mode=0755 httpspace "/run/artix/httpspace"
msg ":: Mounting ${live_root}/httpspace (tmpfs) filesystem, size='${artix_http_spc}'"
mkdir -p "${live_root}/httpspace"
mount -t tmpfs -o size="${artix_http_spc}",mode=0755 httpspace "${live_root}/httpspace"
local _src=${artix_http_srv}${artixbasedir}/${arch}
_get_sfs "rootfs"
[[ -n "${overlay}" ]] && _mount_root_overlayfs "${overlay}"
for sfs in livefs rootfs;do
if [[ ! -z "$( curl -s --head "${_src}/${sfs}.sfs" | grep "OK" )" ]]; then
_curl_get "${_src}/${sfs}.sfs" "/${arch}"
if [[ "${checksum}" == "y" ]]; then
_curl_get "${_src}/${sfs}.md5" "/${arch}"
fi
if [[ "${verify}" == "y" ]]; then
_curl_get "${_src}/${sfs}.sfs.sig" "/${arch}"
fi
fi
done
mkdir -p "/run/artix/bootmnt"
mount -o bind /run/artix/httpspace /run/artix/bootmnt
mkdir -p "${bootmnt}"
mount -o bind ${live_root}/httpspace ${bootmnt}
artix_mount_handler ${newroot}
}

View File

@@ -12,10 +12,10 @@ run_hook() {
artix_nfs_mount_handler() {
newroot="${1}"
mkdir -p "/run/artix/bootmnt"
mkdir -p "${bootmnt}"
msg ":: Mounting '${artix_nfs_srv}'"
# Do not put "${artix_nfs_opt}" nfsmount fails!
if ! nfsmount ${artix_nfs_opt} "${artix_nfs_srv}" "/run/artix/bootmnt"; then
if ! nfsmount ${artix_nfs_opt} "${artix_nfs_srv}" "${bootmnt}"; then
echo "ERROR: Mounting '${artix_nfs_srv}'"
echo " Falling back to interactive prompt"
echo " You can try to fix the problem manually, log out when you are finished"

View File

@@ -5,8 +5,7 @@ mkdir /oldrun
mount -n --move /oldroot/run /oldrun
# Unmount all mounts now.
#umount $(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r)
umount $(mount | awk '$3 ~/^\/oldroot/ {if($3 != "/run/artix/bootmnt") print $3}' | sort -r)
umount $(mount | awk '$3 ~/^\/oldroot/ {print $3}' | sort -r)
# Remove all dm-snapshot devices.
dmsetup remove_all
@@ -26,7 +25,7 @@ if [[ ! -d /oldrun/artix/copytoram ]]; then
if [[ -d /oldrun/artix/img_dev ]]; then
umount /oldrun/artix/img_dev
else
umount /oldrun/artix/bootmnt
umount /oldrun/bootmnt
fi
fi

View File

@@ -1,16 +1,22 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
#{{{ chroot
CHROOTVERSION=0.10
orig_argv=("$0" "$@")
check_root() {
local keepenv="$1"
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
# shellcheck disable=2154
exec sudo --preserve-env="$keepenv" -- "${orig_argv[@]}"
else
# shellcheck disable=2154
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}
is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
@@ -20,9 +26,9 @@ is_subvolume() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs && "$(stat -c %i "$1")" == 256 ]]
}
is_same_fs() {
[[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]]
}
# is_same_fs() {
# [[ "$(stat -c %d "$1")" == "$(stat -c %d "$2")" ]]
# }
subvolume_delete_recursive() {
local subvol
@@ -42,19 +48,4 @@ subvolume_delete_recursive() {
return 0
}
# $1: chroot
kill_chroot_process(){
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
}
# }}}

16
lib/base/common.sh Normal file
View File

@@ -0,0 +1,16 @@
#!/hint/bash
#{{{ common
get_makepkg_conf() {
makepkg_conf="${DATADIR}/makepkg.conf"
[[ -f ${USER_CONF_DIR}/makepkg.conf ]] && makepkg_conf="${USER_CONF_DIR}/makepkg.conf"
}
get_pacman_conf() {
local repo="$1"
pacman_conf="${DATADIR}/pacman-${repo}.conf"
[[ -f "${USER_CONF_DIR}/pacman-${repo}.conf" ]] && pacman_conf="${USER_CONF_DIR}/pacman-${repo}.conf"
}
#}}}

View File

@@ -1,213 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
declare -A pseudofs_types=([anon_inodefs]=1
[autofs]=1
[bdev]=1
[bpf]=1
[binfmt_misc]=1
[cgroup]=1
[cgroup2]=1
[configfs]=1
[cpuset]=1
[debugfs]=1
[devfs]=1
[devpts]=1
[devtmpfs]=1
[dlmfs]=1
[efivarfs]=1
[fuse.gvfs-fuse-daemon]=1
[fusectl]=1
[hugetlbfs]=1
[mqueue]=1
[nfsd]=1
[none]=1
[pipefs]=1
[proc]=1
[pstore]=1
[ramfs]=1
[rootfs]=1
[rpc_pipefs]=1
[securityfs]=1
[sockfs]=1
[spufs]=1
[sysfs]=1
[tmpfs]=1)
declare -A fsck_types=([cramfs]=1
[exfat]=1
[ext2]=1
[ext3]=1
[ext4]=1
[ext4dev]=1
[jfs]=1
[minix]=1
[msdos]=1
[reiserfs]=1
[vfat]=1
[xfs]=1)
fstype_is_pseudofs() {
(( pseudofs_types["$1"] ))
}
fstype_has_fsck() {
(( fsck_types["$1"] ))
}
valid_number_of_base() {
local base=$1 len=${#2} i=
for (( i = 0; i < len; i++ )); do
{ _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null
done
return 0
}
mangle() {
local i= chr= out=
local {a..f}= {A..F}=
for (( i = 0; i < ${#1}; i++ )); do
chr=${1:i:1}
case $chr in
[[:space:]\\])
printf -v chr '%03o' "'$chr"
out+=\\
;;
esac
out+=$chr
done
printf '%s' "$out"
}
unmangle() {
local i= chr= out= len=$(( ${#1} - 4 ))
local {a..f}= {A..F}=
for (( i = 0; i < len; i++ )); do
chr=${1:i:1}
case $chr in
\\)
if valid_number_of_base 8 "${1:i+1:3}" ||
valid_number_of_base 16 "${1:i+1:3}"; then
printf -v chr '%b' "${1:i:4}"
(( i += 3 ))
fi
;;
esac
out+=$chr
done
printf '%s' "$out${1:i}"
}
dm_name_for_devnode() {
read dm_name <"/sys/class/block/${1#/dev/}/dm/name"
if [[ $dm_name ]]; then
printf '/dev/mapper/%s' "$dm_name"
else
# don't leave the caller hanging, just print the original name
# along with the failure.
print '%s' "$1"
error 'Failed to resolve device mapper name for: %s' "$1"
fi
}
optstring_match_option() {
local candidate pat patterns
IFS=, read -ra patterns <<<"$1"
for pat in "${patterns[@]}"; do
if [[ $pat = *=* ]]; then
# "key=val" will only ever match "key=val"
candidate=$2
else
# "key" will match "key", but also "key=anyval"
candidate=${2%%=*}
fi
[[ $pat = "$candidate" ]] && return 0
done
return 1
}
optstring_remove_option() {
local o options_ remove=$2 IFS=,
read -ra options_ <<<"${!1}"
for o in "${!options_[@]}"; do
optstring_match_option "$remove" "${options_[o]}" && unset 'options_[o]'
done
declare -g "$1=${options_[*]}"
}
optstring_normalize() {
local o options_ norm IFS=,
read -ra options_ <<<"${!1}"
# remove empty fields
for o in "${options_[@]}"; do
[[ $o ]] && norm+=("$o")
done
# avoid empty strings, reset to "defaults"
declare -g "$1=${norm[*]:-defaults}"
}
optstring_append_option() {
if ! optstring_has_option "$1" "$2"; then
declare -g "$1=${!1},$2"
fi
optstring_normalize "$1"
}
optstring_prepend_option() {
local options_=$1
if ! optstring_has_option "$1" "$2"; then
declare -g "$1=$2,${!1}"
fi
optstring_normalize "$1"
}
optstring_get_option() {
local opts o
IFS=, read -ra opts <<<"${!1}"
for o in "${opts[@]}"; do
if optstring_match_option "$2" "$o"; then
declare -g "$o"
return 0
fi
done
return 1
}
optstring_has_option() {
local "${2%%=*}"
optstring_get_option "$1" "$2"
}

View File

@@ -1,21 +1,17 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
#{{{ message
#set +u +o posix
# shellcheck disable=1091
. /usr/share/makepkg/util.sh
# export LC_MESSAGES=C
export LANG=C
if [[ -t 2 ]]; then
shopt -s extglob
if [[ -t 2 && "$TERM" != dumb ]]; then
colorize
else
declare -gr ALL_OFF='' BOLD='' BLUE='' GREEN='' RED='' YELLOW=''
@@ -23,15 +19,18 @@ fi
info() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${YELLOW} -->${ALL_OFF}${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
}
stat_busy() {
local mesg=$1; shift
# shellcheck disable=2059
printf "${GREEN}==>${ALL_OFF}${BOLD} ${mesg}...${ALL_OFF}" "$@" >&2
}
stat_done() {
# shellcheck disable=2059
printf "${BOLD}done${ALL_OFF}\n" >&2
}
@@ -45,9 +44,9 @@ lock() {
mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"'
fi
if ! flock -n $1; then
if ! flock -n "$1"; then
stat_busy "$3"
flock $1
flock "$1"
stat_done
fi
}
@@ -57,9 +56,9 @@ slock() {
mkdir -p -- "$(dirname -- "$2")"
eval "exec $1>"'"$2"'
fi
if ! flock -sn $1; then
if ! flock -sn "$1"; then
stat_busy "$3"
flock -s $1
flock -s "$1"
stat_done
fi
}
@@ -100,28 +99,4 @@ die() {
cleanup 255
}
msg_table_header(){
local mesg=$1; shift
printf "${BLUE} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
msg_row_downgrade(){
local mesg=$1; shift
printf "${YELLOW} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_notify(){
local mesg=$1; shift
printf "${GREEN} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row(){
local mesg=$1; shift
# printf "${BOLD} ${mesg}${ALL_OFF}\n" "$@" >&2
printf "${WHITE} ${mesg}${ALL_OFF}\n" "$@" >&2
}
msg_row_upgrade(){
local mesg=$1; shift
printf "${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
#}}}

View File

@@ -1,47 +1,12 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
#{{{ mount
ignore_error() {
"$@" 2>/dev/null
return 0
}
parse_fstab(){
echo $(perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^UUID=#;' $1/etc/fstab)
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^/dev#;' $1/etc/fstab
# perl -ane 'printf("%s:%s\n", @F[0,1]) if $F[0] =~ m#^LABEL=#;' $1/etc/fstab
}
detect(){
local detected="$(os-prober | tr ' ' '_' | paste -s -d ' ')"
echo ${detected}
}
# $1: os-prober array
get_os_name(){
local str=$1
str="${str#*:}"
str="${str#*:}"
str="${str%:*}"
echo "$str"
}
chroot_part_mount() {
info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}")
}
trap_setup(){
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap "$1" EXIT
@@ -88,8 +53,8 @@ chroot_mount_conditional() {
}
chroot_setup(){
local mnt="$1" os="$2" run_args='-t tmpfs -o nosuid,nodev,mode=0755'
$os && run_args='--bind'
local mnt="$1" os="$2" args='-t tmpfs -o nosuid,nodev,mode=0755'
$os && args='--bind'
chroot_mount_conditional "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind &&
chroot_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
@@ -98,33 +63,10 @@ chroot_setup(){
chroot_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount /run "$mnt/run" ${run_args} &&
chroot_mount /run "$mnt/run" ${args} &&
chroot_mount tmp "$mnt/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
mount_os(){
CHROOT_ACTIVE_PART_MOUNTS=()
CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_part_umount
chroot_part_mount "$2" "$1"
local mounts=$(parse_fstab "$1")
for entry in ${mounts[@]}; do
entry=${entry//UUID=}
local dev=${entry%:*} mp=${entry#*:}
case "${entry#*:}" in
'/'|'swap'|'none') continue ;;
*) chroot_part_mount "/dev/disk/by-uuid/${dev}" "$1${mp}" ;;
esac
done
chroot_setup "$1" true
chroot_add_resolv_conf "$1"
}
chroot_api_mount() {
CHROOT_ACTIVE_MOUNTS=()
trap_setup chroot_api_umount
@@ -139,10 +81,4 @@ chroot_api_umount() {
unset CHROOT_ACTIVE_MOUNTS
}
chroot_part_umount() {
chroot_api_umount
info "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
unset CHROOT_ACTIVE_PART_MOUNTS
}
#}}}

View File

@@ -1,47 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
get_timer(){
echo $(date +%s)
}
# $1: start timer
elapsed_time(){
echo $(echo $1 $(get_timer) | awk '{ printf "%0.2f",($2-$1)/60 }')
}
show_elapsed_time(){
info "Time %s: %s minutes" "$1" "$(elapsed_time $2)"
}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p $1
}
get_osname(){
. /usr/lib/os-release
echo "${NAME}"
}
# orig_argv=("$0" "$@")
check_root() {
local keepenv=$1
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo --preserve-env=$keepenv -- "${orig_argv[@]}"
else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}

View File

@@ -1,16 +1,6 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
#{{{ yaml
write_yaml_header(){
printf '%s' '---'
@@ -34,3 +24,5 @@ write_yaml_seq_map(){
local ident="$1" key="$2" val="$3"
printf "\n%${ident}s- %s: %s\n" '' "$key" "$val"
}
#}}}

98
lib/iso/calamares.sh Normal file
View File

@@ -0,0 +1,98 @@
#!/hint/bash
#{{{ calamares
write_users_conf(){
local yaml
yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'defaultGroups')
local IFS=','
for g in "${ADDGROUPS[@]}"; do
yaml+=$(write_yaml_seq 2 "$g")
done
unset IFS
yaml+=$(write_yaml_map 0 'autologinGroup' 'autologin')
yaml+=$(write_yaml_map 0 'doAutologin' 'false')
yaml+=$(write_yaml_map 0 'sudoersGroup' 'wheel')
yaml+=$(write_yaml_map 0 'setRootPassword' 'true')
yaml+=$(write_yaml_map 0 'availableShells' '/bin/bash, /bin/zsh')
# yaml+=$(write_yaml_map 0 'passwordRequirements')
# yaml+=$(write_yaml_map 2 'minLength' '-1')
# yaml+=$(write_yaml_map 2 'maxLength' '-1')
# yaml+=$(write_yaml_map 2 'libpwquality')
# yaml+=$(write_yaml_seq 4 "minlen=8")
# yaml+=$(write_yaml_seq 4 "minclass=80")
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_services_conf(){
local key1="$1" val1="$2" key2="$3" val2="$4"
local yaml
yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 "$key1" "$val1")
yaml+=$(write_yaml_map 0 "$key2" "$val2")
yaml+=$(write_yaml_map 0 'services')
for svc in "${SERVICES[@]}"; do
yaml+=$(write_yaml_seq 2 "$svc")
done
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_services_openrc_conf(){
local conf="$1"/services-openrc.conf
write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf"
}
write_services_runit_conf(){
local conf="$1"/services-runit.conf
write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf"
}
write_services_s6_conf(){
local conf="$1"/services-s6.conf
write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf"
}
write_postcfg(){
local yaml
yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'keyrings')
for k in archlinux artix;do
yaml+=$(write_yaml_seq 2 "$k")
done
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_unpackfs() {
local yaml
yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'unpack')
# if ${persist}; then
# yaml+=$(write_yaml_seq_map 2 'source' '"/run/artix/bootmnt/LiveOS/rootfs.img"')
# yaml+=$(write_yaml_map 4 'sourcefs' '"ext4"')
# else
yaml+=$(write_yaml_seq_map 2 'source' '"/run/artix/bootmnt/LiveOS/rootfs.img"')
yaml+=$(write_yaml_map 4 'sourcefs' '"squashfs"')
# fi
yaml+=$(write_yaml_map 4 'destination' '""')
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
configure_calamares(){
local mods="$1/etc/calamares/modules"
if [[ -d "$mods" ]];then
msg2 "Configuring Calamares"
write_users_conf > "$mods"/users.conf
write_services_"${INITSYS}"_conf "$mods"
write_postcfg > "$mods"/postcfg.conf
write_unpackfs > "$mods"/unpackfs.conf
sed -e "s|services-openrc|services-${INITSYS}|" \
-i "$1"/etc/calamares/settings.conf
fi
}
#}}}

View File

@@ -1,165 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
add_svc_openrc(){
local mnt="$1" names="$2" rlvl="${3:-default}"
for svc in $names; do
if [[ -f $mnt/etc/init.d/$svc ]];then
msg2 "Setting %s ..." "$svc"
[[ $svc == "xdm" ]] && set_xdm "$mnt"
chroot $mnt rc-update add $svc $rlvl &>/dev/null
fi
done
}
add_svc_runit(){
local mnt="$1" names="$2" rlvl="${3:-default}"
for svc in $names; do
if [[ -d $mnt/etc/runit/sv/$svc ]]; then
msg2 "Setting %s ..." "$svc"
chroot $mnt ln -s /etc/runit/sv/$svc /etc/runit/runsvdir/$rlvl &>/dev/null
fi
done
}
add_svc_s6(){
local mnt="$1" names="$2" valid="" rlvl="${3:-default}"
for svc in $names; do
if [[ -d $mnt/etc/s6/sv/$svc ]]; then
msg2 "Setting %s ..." "$svc"
valid=${valid:-}${valid:+' '}${svc}
fi
done
chroot $mnt s6-rc-bundle -c /etc/s6/rc/compiled add $rlvl $valid
}
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_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${HOST_NAME}|" -i $1/etc/hosts
}
configure_logind(){
local conf=$1/etc/$2/logind.conf
if [[ -e $conf ]];then
msg2 "Configuring logind ..."
sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf"
fi
}
configure_services(){
local mnt="$1"
info "Configuring [%s] services" "${INITSYS}"
add_svc_${INITSYS} "$mnt" "${SERVICES[*]} ${SERVICES_LIVE[*]}"
info "Done configuring [%s] services" "${INITSYS}"
}
configure_system(){
local mnt="$1"
configure_logind "$mnt" "elogind"
echo ${HOST_NAME} > $mnt/etc/hostname
}
write_users_conf(){
local yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'defaultGroups')
local IFS=','
for g in ${ADDGROUPS[@]};do
yaml+=$(write_yaml_seq 2 "$g")
done
unset IFS
yaml+=$(write_yaml_map 0 'autologinGroup' 'autologin')
yaml+=$(write_yaml_map 0 'doAutologin' 'false')
yaml+=$(write_yaml_map 0 'sudoersGroup' 'wheel')
yaml+=$(write_yaml_map 0 'setRootPassword' 'true')
yaml+=$(write_yaml_map 0 'availableShells' '/bin/bash, /bin/zsh')
# yaml+=$(write_yaml_map 0 'passwordRequirements')
# yaml+=$(write_yaml_map 2 'minLength' '-1')
# yaml+=$(write_yaml_map 2 'maxLength' '-1')
# yaml+=$(write_yaml_map 2 'libpwquality')
# yaml+=$(write_yaml_seq 4 "minlen=8")
# yaml+=$(write_yaml_seq 4 "minclass=80")
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_services_conf(){
local key1="$1" val1="$2" key2="$3" val2="$4"
local yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 "$key1" "$val1")
yaml+=$(write_yaml_map 0 "$key2" "$val2")
yaml+=$(write_yaml_map 0 'services')
for svc in ${SERVICES[@]};do
yaml+=$(write_yaml_seq 2 "$svc")
done
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
write_services_openrc_conf(){
local conf="$1"/services-openrc.conf
write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf"
}
write_services_runit_conf(){
local conf="$1"/services-runit.conf
write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf"
}
write_services_s6_conf(){
local conf="$1"/services-s6.conf
write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf"
}
write_postcfg(){
local yaml=$(write_yaml_header)
yaml+=$(write_yaml_map 0 'keyrings')
for k in archlinux artix;do
yaml+=$(write_yaml_seq 2 "$k")
done
yaml+=$(write_empty_line)
printf '%s' "${yaml}"
}
configure_calamares(){
local mods="$1/etc/calamares/modules"
if [[ -d "$mods" ]];then
msg2 "Configuring Calamares"
write_users_conf > "$mods"/users.conf
write_services_"${INITSYS}"_conf "$mods"
write_postcfg > "$mods"/postcfg.conf
sed -e "s|services-openrc|services-${INITSYS}|" \
-i "$1"/etc/calamares/settings.conf
fi
}
configure_image(){
local fs="$1"
msg "Configuring [%s]" "${fs##*/}"
configure_hosts "$fs"
configure_system "$fs"
configure_services "$fs"
configure_calamares "$fs"
[[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools"
msg2 "Writing live.conf"
write_live_session_conf > "$fs/etc/artools/live.conf"
msg "Done configuring [%s]" "${fs##*/}"
}

55
lib/iso/config.sh Normal file
View File

@@ -0,0 +1,55 @@
#!/hint/bash
#{{{ session
configure_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${HOST_NAME}|" -i "$1"/etc/hosts
}
configure_logind(){
local conf=$1/etc/"$2"/logind.conf
if [[ -e "$conf" ]];then
msg2 "Configuring logind ..."
sed -i 's/#\(HandleSuspendKey=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleLidSwitch=\)suspend/\1ignore/' "$conf"
sed -i 's/#\(HandleHibernateKey=\)hibernate/\1ignore/' "$conf"
fi
}
configure_services(){
local mnt="$1"
info "Configuring [%s] services" "${INITSYS}"
add_svc_"${INITSYS}" "$mnt" "${SERVICES[*]} ${SERVICES_LIVE[*]}"
info "Done configuring [%s] services" "${INITSYS}"
}
configure_system(){
local mnt="$1"
configure_logind "$mnt" "elogind"
echo "${HOST_NAME}" > "$mnt"/etc/hostname
}
write_live_session_conf(){
local conf=''
conf+=$(printf '%s\n' '# live session configuration')
conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}")
conf+=$(printf "\nUSER_NAME=%s\n" "${USER_NAME}")
conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}")
conf+=$(printf "\nADDGROUPS='%s'\n" "${ADDGROUPS}")
printf '%s' "$conf"
}
configure_chroot(){
local fs="$1"
msg "Configuring [%s]" "${fs##*/}"
configure_hosts "$fs"
configure_system "$fs"
configure_services "$fs"
configure_calamares "$fs"
[[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools"
msg2 "Writing live.conf"
write_live_session_conf > "$fs/etc/artools/live.conf"
msg "Done configuring [%s]" "${fs##*/}"
}
#}}}

42
lib/iso/dracut.sh Normal file
View File

@@ -0,0 +1,42 @@
#!/hint/bash
#{{{ dracut
prepare_initramfs_dracut(){
local mnt="$1"
local kver
kver=$(<"$mnt"/usr/src/linux/version)
printf "%s\n" 'add_dracutmodules+=" dmsquash-live"' > "$mnt"/etc/dracut.conf.d/50-live.conf
msg "Starting build: %s" "${kver}"
artools-chroot "$mnt" dracut -fqM /boot/initramfs.img "$kver"
msg "Image generation successful"
cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img
prepare_boot_extras "$mnt"
}
configure_grub_dracut(){
msg "Configuring grub kernel options ..."
local kopts=()
kopts=(
"root=live:LABEL=${iso_label}"
'rd.live.squashimg=rootfs.img'
'rd.live.image'
'rootflags=auto'
)
[[ "${profile}" != 'base' ]] && kopts+=("rd.live.join=livefs.img")
local ro_opts=()
local rw_opts=()
# 'rd.writable.fsimg=1'
sed -e "s|@kopts@|${kopts[*]}|" \
-e "s|@ro_opts@|${ro_opts[*]}|" \
-e "s|@rw_opts@|${rw_opts[*]}|" \
-i "${iso_root}"/boot/grub/kernels.cfg
}
#}}}

17
lib/iso/firmware.sh Normal file
View File

@@ -0,0 +1,17 @@
#!/hint/bash
#{{{ firmware
prepare_boot_extras(){
local src="$1" dest
dest=${iso_root}/boot
for fw in intel amd; do
cp "$src"/boot/"$fw"-ucode.img "$dest/$fw"-ucode.img
done
cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest
cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING
}
#}}}

View File

@@ -1,116 +1,76 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
prepare_initcpio(){
msg2 "Copying initcpio ..."
local dest="$1"
cp /etc/initcpio/hooks/artix* $dest/etc/initcpio/hooks
cp /etc/initcpio/install/artix* $dest/etc/initcpio/install
cp /etc/initcpio/artix_shutdown $dest/etc/initcpio
}
prepare_initramfs(){
local mnt="$1"
cp ${DATADIR}/mkinitcpio.conf $mnt/etc/mkinitcpio-artix.conf
if [[ "${PROFILE}" != 'base' ]];then
sed -e 's/artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs //' -i $mnt/etc/mkinitcpio-artix.conf
fi
if [[ -n ${GPG_KEY} ]]; then
su ${OWNER} -c "gpg --export ${GPG_KEY} >/tmp/GPG_KEY"
exec 17<>/tmp/GPG_KEY
fi
local _kernel=$(<$mnt/usr/src/linux/version)
ARTIX_GNUPG_FD=${GPG_KEY:+17} artools-chroot $mnt \
/usr/bin/mkinitcpio -k ${_kernel} \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n ${GPG_KEY} ]]; then
exec 17<&-
fi
if [[ -f /tmp/GPG_KEY ]]; then
rm /tmp/GPG_KEY
fi
}
prepare_boot_extras(){
local src="$1" dest="$2"
for u in intel amd;do
cp $src/boot/$u-ucode.img $dest/$u-ucode.img
cp $src/usr/share/licenses/$u-ucode/LICENSE $dest/$u-ucode.LICENSE
done
cp $src/boot/memtest86+/memtest.bin $dest/memtest
cp $src/usr/share/licenses/common/GPL2/license.txt $dest/memtest.COPYING
}
#{{{ grub
configure_grub(){
sed -e "s|@iso_label@|${iso_label}|" -i ${iso_root}/boot/grub/kernels.cfg
msg "Configuring grub kernel options ..."
local ro_opts=()
local rw_opts=()
local kopts=("label=${iso_label}")
[[ "${profile}" != 'base' ]] && kopts+=('overlay=livefs')
sed -e "s|@kopts@|${kopts[*]}|" \
-e "s|@ro_opts@|${ro_opts[*]}|" \
-e "s|@rw_opts@|${rw_opts[*]}|" \
-i "${iso_root}"/boot/grub/kernels.cfg
}
prepare_grub(){
local platform=i386-pc img='core.img' prefix=/boot/grub
local lib=$1/usr/lib/grub theme=$2/usr/share/grub
local lib="$1"/usr/lib/grub
local theme="$1"/usr/share/grub
local livecfg="$2"/usr/share/grub
local grub=${iso_root}/boot/grub efi=${iso_root}/efi/boot
prepare_dir ${grub}/${platform}
cp ${theme}/cfg/*.cfg ${grub}
prepare_dir "${grub}/${platform}"
cp ${lib}/${platform}/* ${grub}/${platform}
cp "${livecfg}"/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
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
cat "${grub}/${platform}"/cdboot.img "${grub}/${platform}/${img}" > "${grub}/${platform}"/eltorito.img
platform=x86_64-efi
img=bootx64.efi
prepare_dir ${efi}
prepare_dir ${grub}/${platform}
prepare_dir "${efi}"
prepare_dir "${grub}/${platform}"
cp ${lib}/${platform}/* ${grub}/${platform}
cp "${lib}/${platform}"/* "${grub}/${platform}"
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660
grub-mkimage -d "${grub}/${platform}" -o "${efi}/${img}" -O "${platform}" -p "${prefix}" iso9660
prepare_dir ${grub}/themes
cp -r ${theme}/themes/artix ${grub}/themes/
cp -r ${theme}/{locales,tz} ${grub}
prepare_dir "${grub}"/themes
cp -r "${theme}"/themes/artix "${grub}"/themes
cp -r "${livecfg}"/{locales,tz} "${grub}"
if [[ -f /usr/share/grub/unicode.pf2 ]];then
msg2 "Copying %s ..." "unicode.pf2"
cp /usr/share/grub/unicode.pf2 ${grub}/unicode.pf2
cp /usr/share/grub/unicode.pf2 "${grub}"/unicode.pf2
else
msg2 "Creating %s ..." "unicode.pf2"
grub-mkfont -o ${grub}/unicode.pf2 /usr/share/fonts/misc/unifont.bdf
grub-mkfont -o "${grub}"/unicode.pf2 /usr/share/fonts/misc/unifont.bdf
fi
local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/efi.img"
local size=4M mnt="${mnt_dir}/efiboot" efi_img="${iso_root}/boot/efi.img"
msg2 "Creating fat image of %s ..." "${size}"
truncate -s ${size} "${efi_img}"
truncate -s "${size}" "${efi_img}"
mkfs.fat -n ARTIX_EFI "${efi_img}" &>/dev/null
prepare_dir "${mnt}"
mount_img "${efi_img}" "${mnt}"
prepare_dir ${mnt}/efi/boot
prepare_dir "${mnt}"/efi/boot
msg2 "Building %s ..." "${img}"
grub-mkimage -d ${grub}/${platform} -o ${mnt}/efi/boot/${img} -O ${platform} -p ${prefix} iso9660
grub-mkimage -d "${grub}/${platform}" -o "${mnt}"/efi/boot/"${img}" -O "${platform}" -p "${prefix}" iso9660
umount_img "${mnt}"
}
#}}}

57
lib/iso/initcpio.sh Normal file
View File

@@ -0,0 +1,57 @@
#!/hint/bash
#{{{ initcpio
write_mkinitcpio_conf() {
msg2 "Writing mkinitcpio.conf ..."
local conf="$1/etc/mkinitcpio-artix.conf"
printf "%s\n" 'MODULES=(loop dm-snapshot)' > "$conf"
printf "%s\n" 'COMPRESSION="xz"' >> "$conf"
if [[ "${profile}" == 'base' ]];then
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_pxe_common artix_pxe_http artix_pxe_nbd artix_pxe_nfs
artix_kms modconf block filesystems keyboard keymap)' >> "$conf"
else
printf "%s\n" 'HOOKS=(base udev artix_shutdown artix artix_loop_mnt
artix_kms modconf block filesystems keyboard keymap)' >> "$conf"
fi
}
prepare_initcpio(){
msg2 "Copying initcpio ..."
local dest="$1"
cp /etc/initcpio/hooks/artix* "$dest"/etc/initcpio/hooks
cp /etc/initcpio/install/artix* "$dest"/etc/initcpio/install
cp /etc/initcpio/artix_shutdown "$dest"/etc/initcpio
}
prepare_initramfs(){
local mnt="$1"
prepare_initcpio "$mnt"
write_mkinitcpio_conf "$mnt"
if [[ -n ${GPG_KEY} ]]; then
su "${owner}" -c "gpg --export ${GPG_KEY} >/tmp/GPG_KEY"
exec 17<>/tmp/GPG_KEY
fi
local _kernel
_kernel=$(<"$mnt"/usr/src/linux/version)
ARTIX_GNUPG_FD=${GPG_KEY:+17} artools-chroot "$mnt" \
/usr/bin/mkinitcpio -k "${_kernel}" \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n "${GPG_KEY}" ]]; then
exec 17<&-
fi
if [[ -f /tmp/GPG_KEY ]]; then
rm /tmp/GPG_KEY
fi
cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img
prepare_boot_extras "$mnt"
}
#}}}

View File

@@ -1,115 +1,30 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
make_sig () {
local idir="$1" file="$2"
msg2 "Creating signature file..."
cd "$idir"
chown "${OWNER}:$(id --group ${OWNER})" "$idir"
su ${OWNER} -c "gpg --detach-sign --default-key ${GPG_KEY} $file.sfs"
chown -R root "$idir"
cd ${OLDPWD}
}
make_checksum(){
local idir="$1" file="$2"
msg2 "Creating sha512sum ..."
cd $idir
sha512sum $file.sfs > $file.sha512
cd ${OLDPWD}
}
# $1: image path
make_sfs() {
local src="$1"
if [[ ! -e "${src}" ]]; then
error "The path %s does not exist" "${src}"
retrun 1
fi
local timer=$(get_timer) dest=${iso_root}/artix/${ARCH}
local name=${1##*/}
local sfs="${dest}/${name}.sfs"
mkdir -p ${dest}
msg "Generating SquashFS image for %s" "${src}"
if [[ -f "${sfs}" ]]; then
local has_changed_dir=$(find ${src} -newer ${sfs})
msg2 "Possible changes for %s ..." "${src}" >> /tmp/buildiso.debug
msg2 "%s" "${has_changed_dir}" >> /tmp/buildiso.debug
if [[ -n "${has_changed_dir}" ]]; then
msg2 "SquashFS image %s is not up to date, rebuilding..." "${sfs}"
rm "${sfs}"
else
msg2 "SquashFS image %s is up to date, skipping." "${sfs}"
return
fi
fi
if ${persist};then
local size=32G
local mnt="${mnt_dir}/${name}"
msg2 "Creating ext4 image of %s ..." "${size}"
truncate -s ${size} "${src}.img"
local ext4_args=()
ext4_args+=(-O ^has_journal,^resize_inode -E lazy_itable_init=0 -m 0)
mkfs.ext4 ${ext4_args[@]} -F "${src}.img" &>/dev/null
tune2fs -c 0 -i 0 "${src}.img" &> /dev/null
mount_img "${work_dir}/${name}.img" "${mnt}"
msg2 "Copying %s ..." "${src}/"
cp -aT "${src}/" "${mnt}/"
umount_img "${mnt}"
fi
msg2 "Creating SquashFS image, this may take some time..."
local mksfs_args=()
if ${persist};then
mksfs_args+=(${work_dir}/${name}.img)
else
mksfs_args+=(${src})
fi
mksfs_args+=(${sfs} -noappend)
local highcomp="-b 256K -Xbcj x86" comp='xz'
mksfs_args+=(-comp ${comp} ${highcomp})
mksquashfs "${mksfs_args[@]}"
make_checksum "${dest}" "${name}"
${persist} && rm "${src}.img"
if [[ -n ${GPG_KEY} ]];then
make_sig "${dest}" "${name}"
fi
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
#{{{ iso
get_disturl(){
# shellcheck disable=1091
. /usr/lib/os-release
echo "${HOME_URL}"
}
get_osname(){
# shellcheck disable=1091
. /usr/lib/os-release
echo "${NAME}"
}
assemble_iso(){
msg "Creating ISO image..."
local mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
local appid="$(get_osname) Live/Rescue CD"
local publisher="$(get_osname) <$(get_disturl)>"
local mod_date
mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
local appid
appid="$(get_osname) Live/Rescue CD"
local publisher
publisher="$(get_osname) <$(get_disturl)>"
xorriso -as mkisofs \
--modification-date=${mod_date} \
--modification-date="${mod_date}" \
--protective-msdos-label \
-volid "${iso_label}" \
-appid "${appid}" \
@@ -118,16 +33,18 @@ assemble_iso(){
-r -graft-points -no-pad \
--sort-weight 0 / \
--sort-weight 1 /boot \
--grub2-mbr ${iso_root}/boot/grub/i386-pc/boot_hybrid.img \
--grub2-mbr "${iso_root}"/boot/grub/i386-pc/boot_hybrid.img \
-partition_offset 16 \
-b boot/grub/i386-pc/eltorito.img \
-c boot.catalog \
-no-emul-boot -boot-load-size 4 -boot-info-table --grub2-boot-info \
-eltorito-alt-boot \
-append_partition 2 0xef ${iso_root}/efi.img \
-append_partition 2 0xef "${iso_root}"/boot/efi.img \
-e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \
-no-emul-boot \
-iso-level 3 \
-o ${iso_dir}/${iso_file} \
${iso_root}/
-o "${iso_dir}/${iso_file}" \
"${iso_root}"/
}
#}}}

View File

@@ -1,16 +1,6 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
#{{{ mount
track_img() {
info "mount: [%s]" "$2"
@@ -24,7 +14,7 @@ mount_img() {
}
umount_img() {
if [[ -n ${IMG_ACTIVE_MOUNTS[@]} ]];then
if [[ -n "${IMG_ACTIVE_MOUNTS[*]}" ]];then
info "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}"
umount "${IMG_ACTIVE_MOUNTS[@]}"
unset IMG_ACTIVE_MOUNTS
@@ -37,26 +27,29 @@ track_fs() {
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
}
mount_overlay(){
mount_overlayfs(){
FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2"
local lower upper="$1" work="$2"
mkdir -p "${mnt_dir}/work"
mkdir -p "$upper"
case $upper in
*/livefs) lower="$work/rootfs" ;;
*/bootfs)
lower="$work/rootfs"
[[ -d "$work/livefs" ]] && lower="$work/livefs":"$work/rootfs"
[[ -d "$work/livefs" ]] && lower="$work/livefs:$work/rootfs"
;;
esac
# shellcheck disable=2140
track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
}
umount_overlay(){
if [[ -n ${FS_ACTIVE_MOUNTS[@]} ]];then
umount_overlayfs(){
if [[ -n "${FS_ACTIVE_MOUNTS[*]}" ]];then
info "overlayfs umount: [%s]" "${FS_ACTIVE_MOUNTS[@]}"
umount "${FS_ACTIVE_MOUNTS[@]}"
unset FS_ACTIVE_MOUNTS
rm -rf "${mnt_dir}/work"
fi
}
#}}}

View File

@@ -1,16 +1,6 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
#!/hint/bash
#{{{ profile
show_profile(){
msg2 "iso_file: %s" "${iso_file}"
@@ -27,15 +17,16 @@ load_profile(){
local profile_dir="${DATADIR}/iso-profiles"
[[ -d ${WORKSPACE_DIR}/iso-profiles ]] && profile_dir=${WORKSPACE_DIR}/iso-profiles
ROOT_LIST="$profile_dir/${PROFILE}/Packages-Root"
ROOT_OVERLAY="$profile_dir/${PROFILE}/root-overlay"
ROOT_LIST="$profile_dir/${profile}/Packages-Root"
ROOT_OVERLAY="$profile_dir/${profile}/root-overlay"
[[ -f "$profile_dir/${PROFILE}/Packages-Live" ]] && LIVE_LIST="$profile_dir/${PROFILE}/Packages-Live"
[[ -d "$profile_dir/${PROFILE}/live-overlay" ]] && LIVE_OVERLAY="$profile_dir/${PROFILE}/live-overlay"
[[ -f "$profile_dir/${profile}/Packages-Live" ]] && LIVE_LIST="$profile_dir/${profile}/Packages-Live"
[[ -d "$profile_dir/${profile}/live-overlay" ]] && LIVE_OVERLAY="$profile_dir/${profile}/live-overlay"
[[ -f $profile_dir/${PROFILE}/profile.conf ]] || return 1
[[ -f $profile_dir/${profile}/profile.conf ]] || return 1
[[ -r $profile_dir/${PROFILE}/profile.conf ]] && . $profile_dir/${PROFILE}/profile.conf
# shellcheck disable=1090
[[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf
DISPLAYMANAGER=${DISPLAYMANAGER:-'none'}
@@ -50,7 +41,7 @@ load_profile(){
ADDGROUPS=${ADDGROUPS:-"video,power,optical,network,lp,scanner,wheel,users,log"}
if [[ -z ${SERVICES[@]} ]];then
if [[ -z "${SERVICES[*]}" ]];then
SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'syslog-ng' 'connmand')
fi
@@ -66,16 +57,6 @@ load_profile(){
return 0
}
write_live_session_conf(){
local conf=''
conf+=$(printf '%s\n' '# live session configuration')
conf+=$(printf "\nAUTOLOGIN=%s\n" "${AUTOLOGIN}")
conf+=$(printf "\nUSER_NAME=%s\n" "${USER_NAME}")
conf+=$(printf "\nPASSWORD=%s\n" "${PASSWORD}")
conf+=$(printf "\nADDGROUPS='%s'\n" "${ADDGROUPS}")
printf '%s' "$conf"
}
load_pkgs(){
local pkglist="$1" init="$2"
info "Loading Packages: [%s] ..." "${pkglist##*/}"
@@ -99,3 +80,5 @@ load_pkgs(){
| sed "$_init_rm2" \
| sed "$_clean"))
}
#}}}

52
lib/iso/services.sh Normal file
View File

@@ -0,0 +1,52 @@
#!/hint/bash
#{{{ services
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
}
add_svc_openrc(){
local mnt="$1" names="$2" rlvl="${3:-default}"
for svc in $names; do
if [[ -f $mnt/etc/init.d/$svc ]];then
msg2 "Setting %s ..." "$svc"
[[ $svc == "xdm" ]] && set_xdm "$mnt"
chroot "$mnt" rc-update add "$svc" "$rlvl" &>/dev/null
fi
done
}
add_svc_runit(){
local mnt="$1" names="$2" rlvl="${3:-default}"
for svc in $names; do
if [[ -d $mnt/etc/runit/sv/$svc ]]; then
msg2 "Setting %s ..." "$svc"
chroot "$mnt" ln -s /etc/runit/sv/"$svc" /etc/runit/runsvdir/"$rlvl" &>/dev/null
fi
done
}
add_svc_s6(){
local mnt="$1" names="$2" rlvl="${3:-default}" error ret
for svc in $names; do
error=false
chroot "$mnt" s6-rc-db -c /etc/s6/rc/compiled type "$svc" &> /dev/null || error=true
ret="$?"
if [ $ret -eq 0 ] && [[ "$error" == false ]]; then
msg2 "Setting %s ..." "$svc"
chroot "$mnt" s6-rc-bundle-update -c /etc/s6/rc/compiled add "$rlvl" "$svc"
fi
done
# rebuild s6-linux-init binaries
chroot "$mnt" rm -r /etc/s6/current
chroot "$mnt" s6-linux-init-maker -1 -N -f /etc/s6/skel -G "/usr/bin/agetty -L -8 tty1 115200" -c /etc/s6/current /etc/s6/current
chroot "$mnt" mv /etc/s6/current/bin/init /etc/s6/current/bin/s6-init
chroot "$mnt" cp -a /etc/s6/current/bin /usr
}
#}}}

104
lib/iso/squash.sh Normal file
View File

@@ -0,0 +1,104 @@
#!/hint/bash
#{{{ squash
make_sig () {
local file="$1"
msg2 "Creating signature file..."
cd "${iso_root}${live_dir}"
chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}"
su "${owner}" -c "gpg --detach-sign --default-key ${GPG_KEY} $file"
chown -R root "${iso_root}${live_dir}"
cd "${OLDPWD}"
}
make_checksum(){
local file="$1"
msg2 "Creating md5sum ..."
cd "${iso_root}${live_dir}"
md5sum "$file" > "$file".md5
cd "${OLDPWD}"
}
make_ext_img(){
local src="$1"
local size=32G
local mnt="${mnt_dir}/${src##*/}"
mkdir -p "${work_dir}"/embed"${live_dir}"
local extimg="${work_dir}/embed${live_dir}/${src##*/}".img
msg2 "Creating ext4 image of %s ..." "${size}"
truncate -s ${size} "${extimg}"
local ext4_args=()
ext4_args+=("-O ^has_journal,^resize_inode" -E lazy_itable_init=0 -m 0)
mkfs.ext4 "${ext4_args[@]}" -F "${extimg}" &>/dev/null
tune2fs -c 0 -i 0 "${extimg}" &> /dev/null
mount_img "${extimg}" "${mnt}"
msg2 "Copying %s ..." "${src}/"
cp -aT "${src}/" "${mnt}/"
umount_img "${mnt}"
}
has_changed(){
local src="$1" dest="$2"
if [[ -f "${dest}" ]]; then
local has_changes
has_changes=$(find "${src}" -newer "${dest}")
if [[ -n "${has_changes}" ]]; then
msg2 "Possible changes for %s ..." "${src}"
msg2 "%s" "${has_changes}"
msg2 "SquashFS image %s is not up to date, rebuilding..." "${dest}"
rm "${dest}"
else
msg2 "SquashFS image %s is up to date, skipping." "${dest}"
return 1
fi
fi
}
# $1: image path
make_sfs() {
local sfs_in="$1"
if [[ ! -e "${sfs_in}" ]]; then
error "The path %s does not exist" "${sfs_in}"
retrun 1
fi
mkdir -p "${iso_root}${live_dir}"
local img_name=${sfs_in##*/}.img
local sfs_out="${iso_root}${live_dir}/${img_name}"
if has_changed "${sfs_in}" "${sfs_out}"; then
msg "Generating SquashFS image for %s" "${sfs_in}"
local mksfs_args=()
if ${persist};then
make_ext_img "${sfs_in}"
mksfs_args+=("${work_dir}/embed")
else
mksfs_args+=("${sfs_in}")
fi
mksfs_args+=("${sfs_out}")
mksfs_args+=(-comp xz -b 256K -Xbcj x86 -noappend)
mksquashfs "${mksfs_args[@]}"
if ! ${use_dracut}; then
make_checksum "${img_name}"
if [[ -n ${GPG_KEY} ]];then
make_sig "${img_name}"
fi
fi
if ${persist}; then
rm -r "${work_dir}/embed"
fi
fi
}
#}}}

48
lib/iso/trap.sh Normal file
View File

@@ -0,0 +1,48 @@
#!/hint/bash
#{{{ trap
error_function() {
local func="$1"
# first exit all subshells, then print the error
if (( ! BASH_SUBSHELL )); then
error "A failure occurred in %s()." "$func"
plain "Aborting..."
fi
umount_overlayfs
umount_img
exit 2
}
run_safe() {
local restoretrap func="$1"
set -e
set -E
restoretrap=$(trap -p ERR)
trap 'error_function $func' ERR
"$func"
eval "$restoretrap"
set +E
set +e
}
trap_exit() {
local sig=$1; shift
error "$@"
umount_overlayfs
trap -- "$sig"
kill "-$sig" "$$"
}
prepare_traps(){
for sig in TERM HUP QUIT; do
# shellcheck disable=2064
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
}
#}}}

View File

@@ -1,231 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
error_function() {
local func="$1"
# first exit all subshells, then print the error
if (( ! BASH_SUBSHELL )); then
error "A failure occurred in %s()." "$func"
plain "Aborting..."
fi
umount_overlay
umount_img
exit 2
}
run_safe() {
local restoretrap func="$1"
set -e
set -E
restoretrap=$(trap -p ERR)
trap 'error_function $func' ERR
"$func"
eval $restoretrap
set +E
set +e
}
trap_exit() {
local sig=$1; shift
error "$@"
umount_overlay
trap -- "$sig"
kill "-$sig" "$$"
}
prepare_traps(){
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
}
# Build ISO
make_iso() {
msg "Start [Build ISO]"
touch "${iso_root}/.artix"
for sfs_dir in $(find "${work_dir}" -maxdepth 1 -type d); do
if [[ "${sfs_dir}" != "${work_dir}" ]]; then
make_sfs "${sfs_dir}"
fi
done
msg "Making bootable image"
# Sanity checks
[[ ! -d "${iso_root}" ]] && return 1
if [[ -f "${iso_dir}/${iso_file}" ]]; then
msg2 "Removing existing bootable image..."
rm -rf "${iso_dir}/${iso_file}"
fi
assemble_iso
msg "Done [Build ISO]"
}
copy_overlay(){
local src="$1" dest="$2"
if [[ -e "$src" ]];then
msg2 "Copying [%s] ..." "${src##*/}"
cp -LR "$src"/* "$dest"
fi
}
clean_up_image(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
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
find "$mnt" -name *.pacnew -name *.pacsave -name *.pacorig -delete
if [[ -f "$mnt/boot/grub/grub.cfg" ]]; then
rm $mnt/boot/grub/grub.cfg
fi
if [[ -f "$mnt/etc/machine-id" ]]; then
rm $mnt/etc/machine-id
fi
}
make_rootfs() {
if [[ ! -e ${work_dir}/rootfs.lock ]]; then
msg "Prepare [Base installation] (rootfs)"
local rootfs="${work_dir}/rootfs"
prepare_dir "${rootfs}"
basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}"
copy_overlay "${ROOT_OVERLAY}" "${rootfs}"
[[ -z ${LIVE_LIST} ]] && configure_image "${rootfs}"
clean_up_image "${rootfs}"
: > ${work_dir}/rootfs.lock
msg "Done [Base installation] (rootfs)"
fi
}
make_livefs() {
if [[ ! -e ${work_dir}/livefs.lock ]]; then
msg "Prepare [Live installation] (livefs)"
local livefs="${work_dir}/livefs"
prepare_dir "${livefs}"
mount_overlay "${livefs}" "${work_dir}"
basestrap "${basestrap_args[@]}" "${livefs}" "${packages[@]}"
copy_overlay "${LIVE_OVERLAY}" "${livefs}"
configure_image "${livefs}"
umount_overlay
clean_up_image "${livefs}"
: > ${work_dir}/livefs.lock
msg "Done [Live installation] (livefs)"
fi
}
make_bootfs() {
if [[ ! -e ${work_dir}/bootfs.lock ]]; then
msg "Prepare [/iso/boot]"
local boot="${iso_root}/boot"
prepare_dir "${boot}"
cp ${work_dir}/rootfs/boot/vmlinuz* ${boot}/vmlinuz-${ARCH}
local bootfs="${work_dir}/bootfs"
mount_overlay "${bootfs}" "${work_dir}"
prepare_initcpio "${bootfs}"
prepare_initramfs "${bootfs}"
cp ${bootfs}/boot/initramfs.img ${boot}/initramfs-${ARCH}.img
prepare_boot_extras "${bootfs}" "${boot}"
umount_overlay
rm -R ${bootfs}
: > ${work_dir}/bootfs.lock
msg "Done [/iso/boot]"
fi
}
make_grub(){
if [[ ! -e ${work_dir}/grub.lock ]]; then
msg "Prepare [/iso/boot/grub]"
local layer=${work_dir}/rootfs
[[ -n ${LIVE_LIST} ]] && layer=${work_dir}/livefs
prepare_grub "${work_dir}/rootfs" "$layer"
configure_grub
: > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
compress_images(){
local timer=$(get_timer)
run_safe "make_iso"
chown -R "${OWNER}:$(id --group ${OWNER})" "${iso_dir}"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
prepare_images(){
local timer=$(get_timer)
load_pkgs "${ROOT_LIST}" "${INITSYS}"
run_safe "make_rootfs"
if [[ -n ${LIVE_LIST} ]]; then
load_pkgs "${LIVE_LIST}" "${INITSYS}"
run_safe "make_livefs"
fi
run_safe "make_bootfs"
run_safe "make_grub"
show_elapsed_time "${FUNCNAME}" "${timer}"
}

28
lib/pkg/deploy.sh Normal file
View File

@@ -0,0 +1,28 @@
#!/hint/bash
#{{{ deploy
find_cached_pkgfile() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local pkg="$1"
for dir in "${searchdirs[@]}"; do
[[ -d "$dir" ]] || continue
[[ -e "$dir/$pkg" ]] && results+=("$dir/$pkg")
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "${results[0]}"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
;;
esac
}
#}}}

80
lib/pkg/git.sh Normal file
View File

@@ -0,0 +1,80 @@
#!/hint/bash
#{{{ git
get_pkg_org(){
local pkg="$1" org sub
case ${pkg} in
ruby-*) org="packagesRuby" ;;
perl-*) org="packagesPerl" ;;
python-*|python2-*) org="packagesPython" ;;
*) sub=${pkg:0:1}; org="packages${sub^^}" ;;
esac
echo "$org"
}
get_team_id() {
local org="$1" team="$2"
local id
id=$(curl -s -X GET "${GIT_URL}/api/v1/orgs/$org/teams/search?q=$team&access_token=${GIT_TOKEN}" \
-H "accept: application/json" | jq '.data[] .id')
echo "$id"
}
add_repo_to_team() {
local pkg="$1" org="$2" team="$3"
local id
id=$(get_team_id "$org" "$team")
local gitname
gitname=$(get_compliant_name "$pkg")
msg2 "Adding package repo [%s] to team (%s)" "$gitname" "$team"
curl -s -X PUT "${GIT_URL}/api/v1/teams/$id/repos/$org/$gitname?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
remove_repo_from_team() {
local pkg="$1" org="$2" team="$3"
local id
id=$(get_team_id "$org" "$team")
local gitname
gitname=$(get_compliant_name "$pkg")
msg2 "Removing package repo [%s] from team (%s)" "$gitname" "$team"
curl -s -X DELETE "${GIT_URL}/api/v1/teams/$id/repos/$org/$gitname?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
get_local_head(){
git log --pretty=%H ...refs/heads/master^ | head -n 1
}
get_remote_head(){
git ls-remote origin -h refs/heads/master | cut -f1
}
has_changeset(){
local head_l="$1" head_r="$2"
if [[ "$head_l" == "$head_r" ]]; then
msg2 "remote changes: no"
return 1
else
msg2 "remote changes: yes"
return 0
fi
}
pull_tree(){
local tree="$1" local_head="$2" os="${3:-Artix}"
local remote_head
remote_head=$(get_remote_head)
msg "Checking (%s) (%s)" "${tree}" "$os"
if has_changeset "${local_head}" "${remote_head}";then
git pull origin master
fi
}
#}}}

View File

@@ -1,63 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
create_repo(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
local json="{ \"auto_init\": true, \"name\":\"$gitname\", \"gitignores\":\"ArchLinuxPackages\", \"readme\": \"Default\" }"
msg2 "Create package repo [%s] in org (%s)" "${pkg}" "${org}"
curl -s -X POST "${GIT_URL}/api/v1/org/$org/repos?access_token=${GIT_TOKEN}" \
-H "accept: application/json" \
-H "content-type: application/json" \
-d "$json"
echo
}
delete_repo(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
msg2 "Delete package repo [%s] in org (%s)" "${pkg}" "${org}"
curl -s -X DELETE "${GIT_URL}/api/v1/repos/$org/$gitname?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}
load_team_id(){
local org="$1" team="$2" id=0
local ids=($(curl -s -X GET "${GIT_URL}/api/v1/orgs/$org/teams?access_token=${GIT_TOKEN}" \
-H "accept: application/json" | jshon -a -e id))
case $team in
packages) id="${ids[2]}" ;;
community) id="${ids[1]}" ;;
esac
echo $id
}
add_repo_to_team(){
local pkg="$1" org="$2" team="$3"
local id=$(load_team_id "$org" "$team")
local gitname=$(get_compliant_name "$pkg")
msg2 "Adding package repo [%s] to team (%s)" "$gitname" "$team"
curl -s -X PUT "${GIT_URL}/api/v1/teams/$id/repos/$org/$gitname?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}

43
lib/pkg/jenkins.sh Normal file
View File

@@ -0,0 +1,43 @@
#!/hint/bash
#{{{ jenkins
write_jenkinsfile(){
local pkg="$1"
local jenkins=$pkg/Jenkinsfile
echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > "$jenkins"
{
echo ''
echo 'PackagePipeline(new RepoPackage(this))'
echo ''
} >> "$jenkins"
git add "$jenkins"
}
write_agentyaml(){
local pkg="$1"
local agent="$pkg"/.artixlinux/agent.yaml label='master'
[[ -d $pkg/.artixlinux ]] || mkdir "$pkg"/.artixlinux
echo '---' > "$agent"
{
echo ''
echo "label: $label"
echo ''
} >> "$agent"
git add "$agent"
}
commit_jenkins_files(){
local pkg="$1"
write_jenkinsfile "$pkg"
write_agentyaml "$pkg"
git commit -m "initial commit"
}
#}}}

36
lib/pkg/repo.sh Normal file
View File

@@ -0,0 +1,36 @@
#!/hint/bash
##{{{ repo
shopt -s extglob
set_arch_repos(){
local x="$1" y="$2" z="$3"
# shellcheck disable=1090
. "${DATADIR}"/valid-names.conf
ARCH_REPOS=("${stable[@]}")
$x && ARCH_REPOS+=("${gremlins[@]}")
$y && ARCH_REPOS+=("${goblins[@]}")
$z && ARCH_REPOS+=("${unstable[@]}")
}
find_repo(){
local pkg="$1" repo pkgarch="${2:-${CARCH}}"
for r in "${ARCH_REPOS[@]}"; do
[[ -f $pkg/repos/$r-$pkgarch/PKGBUILD ]] && repo=repos/"$r-$pkgarch"
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=repos/"$r"-any
[[ -f $pkg/$pkgarch/$r/PKGBUILD ]] && repo="$pkgarch/$r"
done
echo "$repo"
}
find_pkg(){
local searchdir="$1" pkg="$2"
local result
result=$(find "$searchdir" -mindepth 2 -maxdepth 2 -type d -name "$pkg")
echo "$result"
}
#}}}

View File

@@ -1,141 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
get_local_head(){
echo $(git log --pretty=%H ...refs/heads/master^ | head -n 1)
}
get_remote_head(){
echo $(git ls-remote origin -h refs/heads/master | cut -f1)
}
get_pkg_org(){
local pkg="$1" org= sub=
case ${pkg} in
ruby-*) org="packagesRuby" ;;
perl-*) org="packagesPerl" ;;
python-*|python2-*) org="packagesPython" ;;
*) sub=${pkg:0:1}; org="packages${sub^^}" ;;
esac
echo $org
}
subrepo_push(){
local pkg="$1"
msg2 "Push (%s)" "$pkg"
git subrepo push "$pkg"
}
subrepo_clean(){
local pkg="$1"
msg2 "Clean (%s)" "$pkg"
git subrepo clean "$pkg"
}
subrepo_pull(){
local pkg="$1"
msg2 "Pull (%s)" "$pkg"
git subrepo pull "$pkg"
}
subrepo_clone(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
msg2 "Clone [%s] from (%s)" "$pkg" "$org/$gitname"
git subrepo clone gitea@"${GIT_DOMAIN}":"$org"/"$gitname".git "$pkg"
}
clone_tree(){
local timer=$(get_timer) url="$1" tree="$2" os="${3:-$(get_osname)}"
msg "Cloning %s (%s) ..." "$tree" "$os"
git clone $url/$tree.git
show_elapsed_time "${FUNCNAME}" "${timer}"
}
has_changes(){
local head_l="$1" head_r="$2"
if [[ "$head_l" == "$head_r" ]]; then
msg2 "remote changes: no"
return 1
else
msg2 "remote changes: yes"
return 0
fi
}
pull_tree(){
local tree="$1" local_head="$2" os="${3:-$(get_osname)}"
local remote_head=$(get_remote_head)
msg "Checking %s (%s)" "${tree}" "$os"
if has_changes "${local_head}" "${remote_head}";then
git pull origin master
fi
}
push_tree(){
local tree="$1"
msg "Update (%s)" "${tree}"
git push origin master
}
write_jenkinsfile(){
local pkg="$1"
local jenkins=$pkg/Jenkinsfile
echo "@Library('artix-ci') import org.artixlinux.RepoPackage" > $jenkins
echo '' >> $jenkins
echo 'PackagePipeline(new RepoPackage(this))' >> $jenkins
echo '' >> $jenkins
git add $jenkins
}
write_agentyaml(){
local pkg="$1"
local agent=$pkg/.artixlinux/agent.yaml label='master'
[[ -d $pkg/.artixlinux ]] || mkdir $pkg/.artixlinux
echo '%YAML 1.2' > $agent
echo '---' >> $agent
echo '' >> $agent
echo "label: $label" >> $agent
echo '' >> $agent
git add $agent
}
commit_jenkins_files(){
local pkg="$1"
write_jenkinsfile "$pkg"
write_agentyaml "$pkg"
git commit -m "add jenkinsfile & .artixlinux/agent.yaml"
}
config_tree(){
local tree="$1"
cd $tree
git config --bool pull.rebase true
git config commit.gpgsign true
if [[ -n "${GPGKEY}" ]];then
git config user.signingkey "${GPGKEY}"
else
warning "No GPGKEY configured in makepkg.conf!"
fi
cd ..
}

View File

@@ -1,190 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
get_compliant_name(){
local gitname="$1"
case $gitname in
*+) gitname=${gitname//+/plus}
esac
echo $gitname
}
arch2artix(){
local repo="$1" artix=none
case "$repo" in
core) artix=system ;;
extra) artix=world ;;
community) artix=galaxy ;;
multilib) artix=lib32 ;;
staging) artix=goblins ;;
testing) artix=gremlins ;;
community-staging) artix=galaxy-goblins ;;
community-testing) artix=galaxy-gremlins ;;
multilib-staging) artix=lib32-goblins ;;
multilib-testing) artix=lib32-gremlins ;;
kde-unstable) artix=kde-wobble ;;
gnome-unstable) artix=gnome-wobble ;;
esac
echo $artix
}
find_tree(){
local tree="$1" pkg="$2"
local result=$(find $tree -mindepth 2 -maxdepth 2 -type d -name "$pkg")
result=${result%/*}
echo ${result##*/}
}
arch_repos(){
local stag="$1" unst="$2"
local repos=(core extra testing community community-testing multilib multilib-testing)
$stag && repos+=(staging community-staging multilib-staging)
$unst && repos+=(gnome-unstable kde-unstable)
echo ${repos[@]}
}
find_repo(){
local pkg="$1" stag="$2" unst="$3" repo=
for r in $(arch_repos "$stag" "$unst");do
[[ -f $pkg/repos/$r-${ARCH}/PKGBUILD ]] && repo=$r-${ARCH}
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=$r-any
done
echo $repo
}
is_valid_repo(){
local src="$1" cases=
for r in $(arch_repos true true);do
cases=${cases:-}${cases:+|}${r}
done
eval "case $src in
${cases}|trunk) return 0 ;;
*) return 1 ;;
esac"
}
get_cases(){
local pkglist="${SYSCONFDIR}/pkglist.d/$1.list"
local _space="s| ||g" _clean=':a;N;$!ba;s/\n/ /g' _com_rm="s|#.*||g"
local pkgs=($(sed "$_com_rm" "$pkglist" | sed "$_space" | sed "$_clean"))
local cases=
for p in ${pkgs[@]};do
cases=${cases:-}${cases:+|}${p}
done
echo $cases
}
get_artix_tree(){
local pkg="$1" artix_tree="${2:-$3}" tree
eval "case $pkg in
$(get_cases kernel)) tree=packages-kernel ;;
$(get_cases python)) tree=packages-python ;;
$(get_cases perl)) tree=packages-perl ;;
$(get_cases ruby)) tree=packages-ruby ;;
$(get_cases openrc)) tree=packages-openrc ;;
$(get_cases runit)) tree=packages-runit ;;
$(get_cases s6)) tree=packages-s6 ;;
$(get_cases media)) tree=packages-media ;;
$(get_cases xorg)) tree=packages-xorg ;;
$(get_cases qt5)) tree=packages-qt5 ;;
$(get_cases gtk)) tree=packages-gtk ;;
$(get_cases java)) tree=packages-java ;;
$(get_cases haskell)) tree=packages-haskell ;;
$(get_cases devel)) tree=packages-devel ;;
$(get_cases lxqt)) tree=packages-lxqt ;;
$(get_cases cinnamon)) tree=packages-cinnamon ;;
$(get_cases kde)) tree=packages-kde ;;
$(get_cases gnome)) tree=packages-gnome ;;
$(get_cases mate)) tree=packages-mate ;;
$(get_cases xfce)) tree=packages-xfce ;;
*) tree=$artix_tree
esac"
echo $tree
}
get_import_path(){
local pkg="$1" import_path=
for tree in ${TREE_NAMES_ARCH[@]};do
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg/repos ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg
done
echo $import_path
}
pkgver_equal() {
if [[ $1 = *-* && $2 = *-* ]]; then
# if both versions have a pkgrel, then they must be an exact match
[[ $1 = "$2" ]]
else
# otherwise, trim any pkgrel and compare the bare version.
[[ ${1%%-*} = "${2%%-*}" ]]
fi
}
find_cached_package() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local targetname=$1 targetver=$2 targetarch=$3
local dir pkg pkgbasename name ver rel arch r results
for dir in "${searchdirs[@]}"; do
[[ -d $dir ]] || continue
for pkg in "$dir"/*.pkg.tar.?z; do
[[ -f $pkg ]] || continue
# avoid adding duplicates of the same inode
for r in "${results[@]}"; do
[[ $r -ef $pkg ]] && continue 2
done
# split apart package filename into parts
pkgbasename=${pkg##*/}
pkgbasename=${pkgbasename%.pkg.tar.?z}
arch=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$arch"}
rel=${pkgbasename##*-}
pkgbasename=${pkgbasename%-"$rel"}
ver=${pkgbasename##*-}
name=${pkgbasename%-"$ver"}
if [[ $targetname = "$name" && $targetarch = "$arch" ]] &&
pkgver_equal "$targetver" "$ver-$rel"; then
results+=("$pkg")
fi
done
done
case ${#results[*]} in
0)
return 1
;;
1)
printf '%s\n' "${results[0]}"
return 0
;;
*)
error 'Multiple packages found:'
printf '\t%s\n' "${results[@]}" >&2
return 1
;;
esac
}

41
lib/util-base.sh Normal file
View File

@@ -0,0 +1,41 @@
#!/hint/bash
#{{{ base conf
DATADIR=${DATADIR:-'@datadir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p "$1"
}
load_base_config(){
local conf="$1/artools-base.conf"
[[ -f "$conf" ]] || return 1
# shellcheck disable=1090
[[ -r "$conf" ]] && . "$conf"
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"/home/${USER}/artools-workspace"}
return 0
}
#}}}
load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}"
prepare_dir "${WORKSPACE_DIR}"
prepare_dir "${USER_CONF_DIR}"

View File

@@ -1,67 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
CHROOTVERSION=@chroot_version@
. @datadir@/makepkg/util.sh
DATADIR=${DATADIR:-'@datadir@/artools'}
LIBDIR=${LIBDIR:-'@libdir@/artools'}
SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'}
for baselib in ${LIBDIR}/base/*.sh; do
. $baselib
done
load_user_info(){
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$USER_HOME/.config}"
USER_CONF_DIR="${XDG_CONFIG_HOME}/artools"
prepare_dir "${USER_CONF_DIR}"
USER_CACHE_DIR="${XDG_CACHE_HOME:-$USER_HOME/.cache}/artools"
}
load_base_config(){
local conf="$1/artools-base.conf"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
ARCH=$(uname -m)
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"/home/${OWNER}/artools-workspace"}
prepare_dir "${WORKSPACE_DIR}"
return 0
}
load_user_info
load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}"

29
lib/util-iso.sh Normal file
View File

@@ -0,0 +1,29 @@
#!/hint/bash
#{{{ iso conf
load_iso_config(){
local conf="$1/artools-iso.conf"
[[ -f "$conf" ]] || return 1
# shellcheck disable=1090
[[ -r "$conf" ]] && . "$conf"
ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}
INITSYS=${INITSYS:-'openrc'}
GPG_KEY=${GPG_KEY:-''}
return 0
}
#}}}
load_iso_config "${USER_CONF_DIR}" || load_iso_config "${SYSCONFDIR}"
prepare_dir "${ISO_POOL}"

View File

@@ -1,56 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
. @libdir@/artools/util-base.sh
for isolib in ${LIBDIR}/iso/*.sh; do
. $isolib
done
load_iso_config(){
local conf="$1/artools-iso.conf"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
CHROOTS_ISO="${CHROOTS_DIR}/buildiso"
ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"}
prepare_dir "${ISO_POOL}"
PROFILE='base'
ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"}
INITSYS=${INITSYS:-'openrc'}
GPG_KEY=${GPG_KEY:-''}
UPLIMIT=${UPLIMIT:-1000}
FILE_HOST="download.${DOMAIN}"
FILE_HOME=${FILE_HOME:-'/srv/iso'}
FILE_PORT=${FILE_PORT:-65432}
ACCOUNT=${ACCOUNT:-'naughtyISOuploader'}
return 0
}
load_iso_config "${USER_CONF_DIR}" || load_iso_config "${SYSCONFDIR}"

69
lib/util-pkg.sh Normal file
View File

@@ -0,0 +1,69 @@
#!/hint/bash
#{{{ pkg conf
load_pkg_config(){
local conf="$1/artools-pkg.conf"
[[ -f "$conf" ]] || return 1
# shellcheck disable=1090
[[ -r "$conf" ]] && . "$conf"
local git_domain="gitea.artixlinux.org"
GIT_URL="https://${git_domain}"
GIT_SSH="gitea@${git_domain}"
GIT_TOKEN=${GIT_TOKEN:-''}
TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
ARTIX_TREE=(
packages community
packages-{gfx,gtk,media,net,qt5,xorg}
)
local dev_tree=(packages-{python,perl,java,ruby})
local init_tree=(packages-{openrc,runit,s6})
local desktop_tree=(
packages-{kf5,plasma,kde,qt6}
packages-{lxqt,gnome,cinnamon,mate,xfce,wm}
)
[[ -z ${TREE_NAMES_ARTIX[*]} ]] && \
TREE_NAMES_ARTIX=(
packages-kernel
"${init_tree[@]}"
"${dev_tree[@]}"
"${desktop_tree[@]}"
packages-devel
packages-lib32
)
ARTIX_TREE+=("${TREE_NAMES_ARTIX[@]}")
TREE_DIR_ARCH=${TREE_DIR_ARCH:-"${WORKSPACE_DIR}/archlinux"}
ARCH_TREE=(packages community)
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
REPOS_MIRROR=${REPOS_MIRROR:-'http://mirror1.artixlinux.org/repos'}
DBEXT=${DBEXT:-'xz'}
return 0
}
#}}}
load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}"
prepare_dir "${REPOS_ROOT}"
prepare_dir "${TREE_DIR_ARTIX}"
prepare_dir "${TREE_DIR_ARCH}"

View File

@@ -1,86 +0,0 @@
#!/bin/bash
#
# Copyright (C) 2018-19 artoo@artixlinux.org
# Copyright (C) 2018 Artix Linux Developers
#
# 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.
. @libdir@/artools/util-base.sh
for pkglib in ${LIBDIR}/pkg/*.sh; do
. $pkglib
done
load_pkg_config(){
local conf="$1/artools-pkg.conf"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
DOMAIN='artixlinux.org'
GIT_DOMAIN="gitea.${DOMAIN}"
GIT_URL="https://${GIT_DOMAIN}"
GIT_TOKEN=${GIT_TOKEN:-''}
TREE_DIR_ARTIX=${TREE_DIR_ARTIX:-"${WORKSPACE_DIR}/artixlinux"}
[[ -z ${TREE_NAMES_ARTIX[@]} ]] && \
TREE_NAMES_ARTIX=(
packages
community
packages-kernel
packages-openrc
packages-runit
packages-xorg
packages-python
packages-perl
packages-java
packages-qt5
packages-devel
packages-ruby
packages-gtk
packages-gnome
packages-cinnamon
packages-lxqt
packages-mate
packages-kde
packages-xfce
# packages-haskell
)
HOST_TREE_ARTIX=${HOST_TREE_ARTIX:-"gitea@${GIT_DOMAIN}:artixlinux"}
TREE_DIR_ARCH=${TREE_DIR_ARCH:-"${WORKSPACE_DIR}/archlinux"}
TREE_NAMES_ARCH=(packages community)
HOST_TREE_ARCH=${HOST_TREE_ARCH:-'git://git.archlinux.org/svntogit'}
CHROOTS_PKG="${CHROOTS_DIR}/buildpkg"
REPOS_ROOT=${REPOS_ROOT:-"${WORKSPACE_DIR}/repos"}
REPOS_MIRROR=${REPOS_MIRROR:-'http://mirror1.artixlinux.org/repos'}
DBEXT=${DBEXT:-'xz'}
LINKSDBEXT=${LINKSDBEXT:-"links.tar.${DBEXT}"}
PKGDBEXT=${PKGDBEXT:-"db.tar.${DBEXT}"}
return 0
}
load_pkg_config "${USER_CONF_DIR}" || load_pkg_config "${SYSCONFDIR}"