Compare commits

...

229 Commits

Author SHA1 Message Date
f0b84c0442 split up mainrepos (#8) 2019-01-28 00:22:42 +01:00
f0262f3cbd Merge branch 'arch-patches' of artix/artools into master 2019-01-24 17:29:25 +01:00
1905aef7d7 devtools patches 2019-01-24 13:39:17 +01:00
0a80e2b4e1 signfile: don't print key in pipeline 2019-01-16 21:44:40 +01:00
4679c59de0 data: update artools.conf 2019-01-16 21:44:03 +01:00
f308217f62 base: set new arch git url 2019-01-16 21:29:50 +01:00
0cd97b0b1d commitpkg: always push to subrepo; -u will only control maain repo push 2019-01-14 18:55:14 +01:00
a4956dba6e base: don't quote run_args 2019-01-12 02:18:10 +01:00
8738706db2 base: bind mount /run wiht os mount 2019-01-12 01:56:11 +01:00
5ca22931dd base: fix /run mount 2019-01-09 01:43:36 +01:00
652ddcd3a9 arch patches 2019-01-08 20:28:00 +01:00
7c60916356 artools-0.12 (#6) 2019-01-06 11:31:11 +01:00
b4e6dface6 buildiso: display_settings() without root; use printf for live.conf 2019-01-02 20:11:41 +01:00
fa38579488 util-iso: don't use var to set live.conf 2019-01-02 17:46:34 +01:00
07c1605666 util-yaml: only print header essential 2019-01-02 17:45:58 +01:00
bfde5dbbb1 replace old group & fix user 2019-01-02 11:48:23 +01:00
0918ff749d pkg2yaml: write valid yaml 2019-01-01 21:23:33 +01:00
3d3e4376c5 fix empty line 2019-01-01 12:58:48 +01:00
7499878d00 rename lib 2019-01-01 12:41:22 +01:00
d9e99543f6 unify yaml writer 2019-01-01 12:37:58 +01:00
43983042dd pkg2yaml: write pkgname in pkgbase 2018-12-31 14:32:08 +01:00
1b5f09076f pkg2yaml: write pkgbase name 2018-12-31 12:08:53 +01:00
d770030869 pkg2yaml: fix ident for pkgbase info 2018-12-31 11:24:25 +01:00
ea06ec0b2e util-pkg-subrepo: check master by default 2018-12-30 11:56:05 +01:00
e67990ae04 commitpkg: make check for pull work 2018-12-30 11:50:33 +01:00
b37d5f0236 buildtree & commitpkg: use same pull func 2018-12-30 03:45:17 +01:00
989af04593 pkg2yaml: include deps 2018-12-30 03:44:29 +01:00
90f46d7ecc buildtree: ensure trunk exists for newly cloned subrepos 2018-12-29 13:22:35 +01:00
8e872ca9ca buildtree: fix new repo sync & help 2018-12-28 17:08:08 +01:00
05c95b7025 comparepkg: fix help
buildtree: rm unstable flag
2018-12-21 18:29:11 +01:00
442aee08df fix move display 2018-12-21 12:27:50 +01:00
2c497f663b buildtree: split out compare 2018-12-21 01:11:25 +01:00
9a84cdedd5 util-pkg-subrepo: write updated jenkinsfile 2018-12-18 06:30:38 +01:00
bcc807ebbc buildpkg: fix opts 2018-12-17 02:54:07 +01:00
6b00319bfc buildpkg, deploypkg: restore global path vars 2018-12-17 02:50:08 +01:00
c24f625d81 Makefile: add gnome & kde unstable pacman.conf 2018-12-16 20:43:49 +01:00
15ca2bfc7e util-pkg: move get_pkg_org() 2018-12-16 20:43:22 +01:00
2487f4655e builtree: show repo moved updates 2018-12-16 12:24:32 +01:00
c2fd4636a3 version 0.11 (#5) 2018-12-16 01:34:30 +01:00
a82b704c2b pkg2yaml: use file names 2018-12-14 23:11:31 +01:00
1aa6a644b0 util-pkg: readd lost func 2018-12-14 23:11:06 +01:00
ff3ea53482 Nakefile: fix pkg2yaml path 2018-12-14 18:48:26 +01:00
d0e3c4e421 add pkg2yaml; some cosmetics in buildiso & buildrtree 2018-12-14 18:45:55 +01:00
1659689e71 buildtree: mkrepo for non arch packages (#4) 2018-12-12 16:05:00 +01:00
81ebb6c399 buildtree: fix import new pkg 2018-12-11 11:45:35 +01:00
ea66cb27fc migration of buildtree & commitpkg (#3) 2018-12-10 21:57:27 +01:00
3e7c4e371c deployiso: remove old Sf code 2018-11-18 17:54:10 +01:00
8dbd07ff55 deployiso: fix typo file_host, fix home path 2018-11-18 03:14:27 +01:00
d88ede3984 deployiso: switch to artix host
commitpkg: only --clean on subrepo push
2018-11-18 03:00:28 +01:00
04a1da9dd9 util-pkg-subrepo: use --clean in pull and push 2018-11-15 12:16:00 +01:00
7eb70fcf2b util-pkg: rm repo_map 2018-11-07 18:55:55 +01:00
16207221dc deployiso: remove obsolete vars 2018-11-07 18:12:47 +01:00
daf58430a9 buildtree: use renamed func 2018-11-07 18:12:19 +01:00
8b32e346f6 util-pkg: rename func, small optimizations 2018-11-07 18:11:40 +01:00
8df5a87738 util: rm obsolete vars 2018-11-07 18:10:41 +01:00
e2dbe82949 upd artools.conf 2018-11-07 18:09:49 +01:00
38075ad5ad buildiso: iso_label doesn't need a shared scope 2018-10-22 19:41:04 +02:00
a99a9c9699 capitals for input param 2018-10-22 12:18:14 +02:00
2cd876ade4 artools.conf: set default uplimit 1000 2018-10-22 12:16:57 +02:00
4eea0db73d buildiso: fix user & host name 2018-10-22 01:52:45 +02:00
6f18d339df var adjustments & fixes 2018-10-21 23:50:21 +02:00
d31ca02c2a * start 0.10
* capitalize global vars
2018-10-21 17:31:17 +02:00
8a0cd5c236 util-iso*: remove old code 2018-10-21 14:35:40 +02:00
e300104dcf util-pkg: improve find_repo()
Makefile: clean up
2018-10-21 14:35:06 +02:00
a13f0079db more clean up 2018-10-12 17:34:53 +02:00
cae48c0878 util-iso-profile: use @ operator to tag init specific pkgs 2018-10-09 16:53:52 +02:00
ce481f6b07 clean up 2018-10-08 19:36:28 +02:00
b6a4619ab3 mkchroot: add switch for mirrorlist copying 2018-10-08 17:09:19 +02:00
88ebc5c476 rm unused code 2018-10-08 16:49:43 +02:00
c27c516610 update artools.conf 2018-10-07 22:53:05 +02:00
42ee8522dd deployiso: remove torrent support; will become a standalone wrapper eventually 2018-10-07 22:51:48 +02:00
b7f05f4dd2 util-iso: always include initsys in iso filename & if gremlins/goblins 2018-10-06 22:59:34 +02:00
f58e8b6c15 util-iso-yaml: add optional libpwquality check in user module 2018-10-03 11:11:02 +02:00
d432ffee3f util-iso-yaml: remoive netinstall commented code
util-iso: check for $log_dir
2018-10-03 10:22:31 +02:00
961bc2cd59 Explicitly create log_dir and iso_root (#2) 2018-10-03 04:18:54 +02:00
92aeff61d8 util-iso-grub: enable ucode
util-iso-yaml: rm netinstall
util-pkg-subrepo: simplify
2018-10-02 22:31:57 +02:00
64725482f8 update readme 2018-09-07 22:27:08 +02:00
11cd590529 util-iso-yaml: fix services in settings.conf 2018-09-07 22:19:26 +02:00
bb22741aa1 util-iso-grub: set pxe in base profile only 2018-09-07 17:34:52 +02:00
28e4b73964 util-iso-yaml: add dir options in services-openrc; fix runit svc typos 2018-09-06 19:29:57 +02:00
7ea0d6f475 util-iso-yaml: adopt upstream cal new services naming 2018-09-06 18:06:20 +02:00
bdcc22fd46 Makefile: remove uninstall & dist 2018-09-06 18:05:29 +02:00
3c2e97f915 buildtree: fix config arg on pull 2018-08-12 02:58:32 +02:00
ba77c20d77 buildtree: ch in proper dir in config 2018-08-12 02:48:47 +02:00
c376041a07 buildtree: fix it 2018-08-12 02:38:24 +02:00
bd29d360b4 buildtree: fix path 2018-08-12 02:34:47 +02:00
7e1b1ee238 nuildtree: configure repo after clone as well, its too later after pull only 2018-08-12 02:21:24 +02:00
221218ba2a util-pkg: don't set localersion in kernel config 2018-08-09 01:54:48 +02:00
697d18da82 util-pkg-gitea: create compliant git repo 2018-08-07 21:47:34 +02:00
27d0230ed7 buildtree: fix import 2018-08-07 02:38:25 +02:00
41fdcb68fb commitpkg: run git prune 2018-08-06 22:17:01 +02:00
37b02c08bc util-pkg-gitea: add licence header 2018-07-30 02:43:29 +02:00
31200d7765 util-pkg-gitea: get compliant repo name 2018-07-30 02:21:53 +02:00
60844ee0ea Merge branch 'subrepo' of artix/artools into master 2018-07-29 20:47:25 +00:00
2c2e6b41a1 commitpkg: move subrepo push in push switch 2018-07-29 18:45:40 +02:00
52c81a0e61 bump version 2018-07-29 18:38:10 +02:00
6667147b77 buildtree: fix import 2018-07-29 17:25:48 +02:00
26635e3a10 use ssh for git 2018-07-29 00:28:43 +02:00
1d5a565ed8 commitpkg: spilt out subrepo functions 2018-07-28 22:29:15 +02:00
4e54b48903 commitpkg: fix, add sleep 1 2018-07-28 22:23:10 +02:00
2f16cd73c9 buildtree, commitpkg: prepare first test 2018-07-28 21:54:26 +02:00
9fd6ac3531 buildtree: revert to old pkg repos 2018-07-27 20:39:26 +02:00
2f5acc6e3c buildtree, commitpkg: adapt import path 2018-07-27 19:51:27 +02:00
d73b6d9178 rename gitea lib 2018-07-27 19:47:30 +02:00
d5404ac2fa builtree: write jenkinsfile for new pkgs 2018-07-27 18:28:34 +02:00
d250b967ba buildtree, commitpkg: use subrepo 2018-07-27 14:52:30 +02:00
5715eecf0c buildtree, commitpkg: initial gitea/subrepo support 2018-07-27 13:35:31 +02:00
b6ef4d1895 buildtree: add -y arg to exclude staging from compare ops 2018-07-02 01:56:55 +02:00
3fd33eca4a mkchrootpkg: rm workarounds in chroot 2018-06-30 00:37:51 +02:00
eceed82a61 Remove cow file early for non-persistent systems 2018-06-29 21:42:12 +02:00
7337c341ba buildtree: configure git repo with makepkg's GPGKEY 2018-06-29 20:08:02 +02:00
51658f4838 buildtree: make signing commits mandatory 2018-06-29 16:50:19 +02:00
9dcef56350 chroot-run: bind mount /etc/hosts again 2018-06-27 22:51:59 +02:00
ba2647b4b0 rm pcmcia from initcpio 2018-06-27 22:51:15 +02:00
e10571eac0 util-iso-grub: create unicode fontinstead of copying 2018-06-21 23:52:31 +02:00
045ed9e895 Merge branch 'master' of github.com:artix-linux/artools into devel 2018-06-19 21:34:46 +02:00
60e77a878c readd locale backup 2018-06-19 21:34:23 +02:00
69d3897abb makefile: bump chroot version 2018-06-19 20:35:37 +02:00
90060a3851 mkchroot: fix dbus-uuidgen call 2018-06-19 20:12:32 +02:00
1bc756ec15 rm old code 2018-06-19 14:47:58 +02:00
26daf3aaa0 basestrap: improve resolv.conf mounting 2018-06-19 13:10:01 +02:00
c772bf8ea1 simplify chroot traps & mounting 2018-06-19 10:15:29 +02:00
caccd55fc1 util-chroot: fix locale 2018-06-19 09:47:44 +02:00
a2b31b72a0 fstabgen: add support for prefix matching 2018-06-18 21:54:41 +02:00
1beb5131ce disable crypto_speck module on linux import 2018-06-13 14:47:28 +02:00
udeved
ef794a0b85 mkchrootpkg: whitelist return code 14 from makepkg 2018-05-31 18:07:31 +02:00
udeved
aa12fc42bd buildtree: quote version vars 2018-05-29 17:29:07 +02:00
udeved
50f90ab53c mkchrootpkg: arch patches 2018-05-29 13:30:32 +02:00
udeved
63137eb046 util-iso-yaml: fix settings.conf path 2018-05-28 13:06:59 +02:00
udeved
92ec5eb194 util-iso-yaml: adopt runitcfg changes 2018-05-28 10:10:12 +02:00
udeved
f8e07c66c1 util-iso-grub: rm i686 support 2018-05-28 09:23:16 +02:00
udeved
2130eea235 initcpio: rm i686 from kms 2018-05-28 09:22:54 +02:00
udeved
58fc4bbe45 buildiso: remove kernel opt 2018-05-28 09:01:32 +02:00
udeved
591ae02d55 mkchrootpkg: update for pacman-5.1 2018-05-28 09:00:49 +02:00
udeved
6311233f73 util-iso-yaml: adopt calamares modules changes 2018-05-27 22:47:36 +02:00
udeved
398e91bdd9 deploypkg: add repo action check 2018-05-12 23:13:26 +00:00
udeved
d1f4c03e05 mkchrootpkg: add /etc/shadow entry for builduser for sudo 1.8.23 2018-05-12 09:28:57 +00:00
udeved
180decbc5e gitignore: update 2018-04-28 20:20:08 +02:00
udeved
943c0c36ea util-iso-profile: support base in git repo if present 2018-04-28 20:19:50 +02:00
udeved
60116e9f93 update pacman.conf files 2018-04-28 02:16:19 +02:00
udeved
eea5d31427 uril-iso-profile: split the path setters in init_profile() 2018-04-27 11:10:15 +02:00
udeved
d05e8700ef util-profile: update defaults 2018-04-26 22:59:44 +02:00
udeved
1d310e18e9 buildtree: add braodcom-wl to patch_pkg() 2018-04-26 22:41:32 +02:00
udeved
baf290d3aa Makefile: rm base profile 2018-04-26 19:37:37 +02:00
udeved
1f379eec51 Merge branch 'devel' of github.com:artix-linux/artools 2018-04-26 19:32:55 +02:00
udeved
c4d1425c46 move base profile in iso-profiles 2018-04-26 19:30:59 +02:00
udeved
e5211838e8 Merge branch 'devel' of github.com:artix-linux/artools 2018-04-17 21:28:02 +02:00
udeved
441c97730b util-iso: append if runit to iso filename 2018-04-15 03:08:47 +02:00
udeved
8ca984325a util-iso-profiles: make setting DM easy to expand 2018-04-15 02:57:17 +02:00
artoo
3c4fc6e00b Merge pull request #42 from konimex/devel
Add initial runit support
2018-04-15 00:05:10 +02:00
udeved
20a20ee8bb buildiso: set the DM on runit 2018-04-14 22:44:30 +02:00
2aae876d98 Detect the service directory using the correct check.
I was an idiot..
2018-04-14 21:16:24 +07:00
a19379596d Add initial runit support 2018-04-14 21:15:49 +07:00
udeved
af8ab5fd1e buildiso: runit support for servicescfg 2018-04-14 10:37:10 +02:00
artoo
1c56ce7f8c Merge pull request #63 from artix-linux/devel
Devel
2018-04-11 17:14:38 +02:00
udeved
f80c5bf587 Makefile: clean up iso install & uninstall 2018-04-11 17:11:35 +02:00
udeved
d5c8af7025 initcpio: fix uninstall 2018-04-11 12:31:05 +02:00
udeved
12a41ec0b2 Makefile: fix sub makes 2018-04-11 12:23:52 +02:00
udeved
b5eb287867 Makefile: use CPIODIR 2018-04-11 12:18:12 +02:00
udeved
3e4fbd892e readme: fix typo 2018-04-11 11:56:11 +02:00
udeved
dca96f29d7 readme: update 2018-04-11 11:49:24 +02:00
udeved
a382bdc83a Makefile: split initcpio 2018-04-11 11:26:54 +02:00
udeved
b73aec6031 initcpio: add makefile 2018-04-11 11:26:35 +02:00
udeved
88f1145c96 Makefile: split base profile in sep. Makefile 2018-04-11 11:03:36 +02:00
udeved
43bc1d149a Makefile: add default mode 2018-04-10 15:30:14 +02:00
udeved
ffa532591c Makefile: cleanup uninstall 2018-04-10 15:22:11 +02:00
udeved
f9f8ca6b68 Makefile: define overlaydir 2018-04-10 14:25:55 +02:00
udeved
dbc3a94906 Makefile: add condition flags 2018-04-10 11:55:19 +02:00
udeved
8e4b5f88ca start 0.8 2018-04-10 00:32:26 +02:00
udeved
104cc0b1ef data: fix base profile fstab 2018-04-10 00:29:07 +02:00
udeved
ce790fcaab Makefile: fix uninstall 2018-04-10 00:28:11 +02:00
udeved
2d03e16a5f buildiso: add goblins repo support 2018-04-08 14:17:41 +02:00
udeved
64e0badbac Makefile: add buildiso-goblins symlink 2018-04-08 14:13:14 +02:00
udeved
a94afab8a0 readme: update 2018-04-07 16:30:01 +02:00
artoo
1d3c77dc73 Merge pull request #62 from artix-linux/devel
deploypkg: simplify code in update_repo()
2018-04-07 12:03:33 +02:00
udeved
1cccece399 deploypkg: simplify code in update_repo() 2018-04-06 23:05:15 +02:00
artoo
cc8b47912e Merge pull request #61 from artix-linux/devel
Devel
2018-04-06 22:19:26 +02:00
udeved
f36cf35d9a deploypkg: enable checkpkg on add 2018-04-06 22:17:46 +02:00
udeved
cca5283db6 deploypkg: optimize pacman db access 2018-04-06 22:04:39 +02:00
udeved
d6bf8bcf12 util-pkg: check for PKGBUILD instead of checking for repo dir in find_repo() 2018-04-06 21:04:49 +02:00
udeved
88886de9e9 remove vbox from base Packages-Live 2018-03-31 11:19:53 +02:00
artoo
55b0cd4ae2 Merge pull request #59 from artix-linux/devel
Devel
2018-03-30 23:39:01 +02:00
udeved
84a51f4a9e buildtree: code cleanup 2018-03-30 23:27:55 +02:00
udeved
87ad3a631a buildtree: add option to import from trunk, defaults to repos/$repo 2018-03-30 16:15:50 +02:00
udeved
2a70b5f123 commitpkg: quote some vars 2018-03-30 16:15:18 +02:00
udeved
3106e8975f commitpkg: make move more safe; prevent unwanted subdir in $repo in few cases 2018-03-30 02:18:25 +02:00
udeved
4a02e2d7be buildtree: init unstable false
unstable repos are only included on -x
2018-03-28 21:15:12 +02:00
udeved
4363421ce8 mkchrootpkg: revert fix verifysource with pacman-git until new pacman version 2018-03-27 20:38:38 +02:00
udeved
4b96a54347 buildtree: add -x to disable arch unstale kde and gnome when comparing 2018-03-27 20:12:59 +02:00
udeved
0ad953ead8 mkchrootpkg: port arch patch 2018-03-27 19:05:42 +02:00
udeved
45ebe43272 buildtree: fix upate display by sourcing the repo build instead of trunk 2018-03-27 19:04:58 +02:00
udeved
1c64fe7f69 commitpkg: make move more safe 2018-03-22 11:16:02 +01:00
udeved
c2a030b016 mkpkgclean: fix pretend 2018-03-18 16:44:25 +01:00
udeved
94670e18e7 add mkpkgclean 2018-03-18 16:20:00 +01:00
udeved
5c835b6e2c deploypkg: navigate in the repo dir in order to make old package removal work on repo-add 2018-03-18 15:47:53 +01:00
udeved
3f803be6b8 buildtree: clean view 2018-03-17 01:23:54 +01:00
udeved
70b81d7ff8 buildtree: view arch 2018-03-16 19:04:41 +01:00
udeved
12a34bd5a2 buildtree: add option to view depends of a given pkg 2018-03-16 18:53:59 +01:00
udeved
11504d3267 buildtree: fix checkdepends msg 2018-03-15 17:16:55 +01:00
udeved
203df20e76 commitpkg: prevent trunk dir copy in certain cases 2018-03-14 09:32:57 +01:00
udeved
184259c600 Merge branch 'devel' of github.com:artix-linux/artools 2018-03-12 21:50:29 +01:00
udeved
b95c7dee0d mkchrootpkg: reenable ctty workaround 2018-03-12 21:49:20 +01:00
udeved
c7c67fbc21 buildtree: show arch kde and gnome unstable 2018-03-12 21:47:34 +01:00
artoo
21a5c7e916 Merge pull request #57 from artix-linux/devel
Devel
2018-03-05 17:15:21 +01:00
udeved
62810d1d85 rm lists, pipelines 2018-03-05 17:09:19 +01:00
udeved
865bd20674 buildtree: add -z switch to skip arch sync 2018-03-04 23:13:41 +01:00
artoo
b46b5c626e Merge pull request #54 from artix-linux/devel
Devel
2018-02-21 01:11:10 +01:00
udeved
9ac4576666 upd missing pkgs list 2018-02-21 01:07:17 +01:00
udeved
a88f196217 commitpkh: clean up 2018-02-21 01:06:48 +01:00
udeved
c0e8ef4c26 buildiso: default to linux kernel 2018-02-19 23:59:39 +01:00
artoo
02b28e82ef Merge pull request #53 from artix-linux/devel
upd missing build deps
2018-02-17 21:58:53 +01:00
udeved
fb6d1d4c1b upd missing build deps 2018-02-17 21:58:09 +01:00
artoo
9fc3fbd14d Merge pull request #52 from artix-linux/devel
Devel
2018-02-17 21:57:15 +01:00
udeved
72f2781cb9 buildtree: fix new imports that don't exist 2018-02-17 21:54:59 +01:00
udeved
9ddd73c8b4 buildtree: use find_tree() to determine the git repo 2018-02-17 12:59:17 +01:00
udeved
3c92d5c87a mkchrootpkg: place comments for workarounds 2018-02-17 12:58:31 +01:00
artoo
bc8f17cc86 Merge pull request #51 from artix-linux/devel
commitpkg: revert to pull before push if rebase default
2018-02-17 03:18:58 +01:00
udeved
1ceb6926e9 commitpkg: revert to pull before push if rebase default 2018-02-17 03:17:46 +01:00
artoo
4d3a993a72 Merge pull request #50 from artix-linux/devel
Devel
2018-02-17 02:56:20 +01:00
udeved
a52bdc9799 commitpkg: fix git_tree display 2018-02-17 02:38:27 +01:00
udeved
b62e90f778 mkchroot & chroot-run: set chroot version with makefile 2018-02-17 02:19:51 +01:00
udeved
5d2fda793d mkchroot: set static chroot version 2018-02-17 02:08:15 +01:00
udeved
550663cfd1 commitpkg, buildtree: clean up code 2018-02-17 02:05:13 +01:00
artoo
6c117fb97d Merge pull request #49 from artix-linux/devel
Devel
2018-02-17 00:23:00 +01:00
udeved
7e6d832314 commitpkg: improve git_tree handling; add error handling 2018-02-17 00:16:34 +01:00
udeved
6fc7b124fc update missing pkgs list 2018-02-16 20:56:59 +01:00
udeved
a011005901 deploypkg: check per pkg & sig 2018-02-16 20:56:41 +01:00
udeved
5da4fea263 chroot-run: bind mount /etc/hosts 2018-02-16 20:19:30 +01:00
udeved
e1b8a0493b commitpkg: add a check to pull if changes before push 2018-02-15 23:22:22 +01:00
84 changed files with 3772 additions and 3576 deletions

2
.gitignore vendored
View File

@@ -4,3 +4,5 @@
.kateproject.d
data/schemas/*.conf
.project
iso-profiles
live-services

313
Makefile
View File

@@ -1,50 +1,48 @@
Version=0.7
VERSION=0.12
PREFIX = /usr/local
CHROOT_VERSION=0.9
TOOLS = artools
PREFIX ?= /usr
SYSCONFDIR = /etc
BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/lib
DATADIR = $(PREFIX)/share
CPIODIR = $(SYSCONFDIR)/initcpio
SYSCONF = \
CONF = \
data/artools.conf
BIN_BASE = \
bin/mkchroot \
bin/basestrap \
bin/artools-chroot \
bin/fstabgen \
bin/signfile \
bin/chroot-run
BASE_BIN = \
bin/base/signfile \
bin/base/chroot-run \
bin/base/mkchroot \
bin/base/basestrap \
bin/base/artools-chroot \
bin/base/fstabgen
LIBS_BASE = \
lib/util.sh \
lib/util-msg.sh \
lib/util-mount.sh \
lib/util-chroot.sh \
lib/util-fstab.sh
BASE_LIBS = \
$(wildcard lib/base/*.sh)
SHARED_BASE = \
$(wildcard data/pacman*.conf)
BASE_UTIL = lib/util-base.sh
BIN_PKG = \
bin/checkpkg \
bin/lddd \
bin/finddeps \
bin/find-libdeps \
bin/mkchrootpkg \
bin/buildpkg \
bin/buildtree \
bin/deploypkg \
bin/commitpkg
BASE_DATA = \
$(wildcard data/base/pacman*.conf)
LIBS_PKG = \
$(wildcard lib/util-pkg*.sh)
PKG_BIN = \
bin/pkg/buildpkg \
bin/pkg/deploypkg \
bin/pkg/commitpkg \
bin/pkg/comparepkg \
bin/pkg/checkpkg \
bin/pkg/mkchrootpkg \
bin/pkg/pkg2yaml \
bin/pkg/buildtree \
bin/pkg/lddd \
bin/pkg/finddeps \
bin/pkg/find-libdeps
SHARED_PKG = \
data/makepkg.conf
PATCHES = \
$(wildcard data/patches/*.patch)
COMMITPKG_SYMS = \
LN_COMMITPKG = \
extrapkg \
corepkg \
testingpkg \
@@ -54,164 +52,157 @@ COMMITPKG_SYMS = \
community-stagingpkg \
multilibpkg \
multilib-testingpkg \
multilib-stagingpkg
multilib-stagingpkg \
kde-unstablepkg \
gnome-unstablepkg
BIN_ISO = \
bin/buildiso \
bin/deployiso
LN_BUILDPKG = \
buildpkg-system \
buildpkg-world \
buildpkg-gremlins \
buildpkg-goblins \
buildpkg-galaxy \
buildpkg-galaxy-gremlins \
buildpkg-galaxy-goblins \
buildpkg-lib32 \
buildpkg-lib32-gremlins \
buildpkg-lib32-goblins \
buildpkg-kde-wobble \
buildpkg-gnome-wobble
LIBS_ISO = \
$(wildcard lib/util-iso*.sh)
LN_DEPLOYPKG = \
deploypkg-system \
deploypkg-world \
deploypkg-gremlins \
deploypkg-goblins \
deploypkg-galaxy \
deploypkg-galaxy-gremlins \
deploypkg-galaxy-goblins \
deploypkg-lib32 \
deploypkg-lib32-gremlins \
deploypkg-lib32-goblins \
deploypkg-kde-wobble \
deploypkg-gnome-wobble
SHARED_ISO = \
data/mkinitcpio.conf
PKG_LIBS = \
$(wildcard lib/pkg/*)
CPIOHOOKS = \
$(wildcard initcpio/hooks/*)
PKG_LISTS = \
$(wildcard data/pkglists/*.list)
CPIOINST = \
$(wildcard initcpio/install/*)
PKG_UTIL = lib/util-pkg.sh
CPIO = \
initcpio/script/artix_shutdown
PKG_DATA = \
data/pkg/makepkg.conf
BASE = \
$(wildcard data/base/Packages-*) \
data/base/profile.conf
PATCHES = \
$(wildcard data/patches/*.patch)
LIVE_ETC = \
data/base/live-overlay/etc/issue \
data/base/live-overlay/etc/fstab
ISO_BIN = \
bin/iso/buildiso \
bin/iso/deployiso
LIVE_ETC_DEFAULT = \
$(wildcard data/base/live-overlay/etc/default/*)
LN_BUILDISO = \
buildiso-gremlins \
buildiso-goblins
LIVE_ETC_PAM = \
$(wildcard data/base/live-overlay/etc/pam.d/*)
ISO_LIBS = \
$(wildcard lib/iso/*.sh)
LIVE_ETC_SUDOERS = \
$(wildcard data/base/live-overlay/etc/sudoers.d/*)
ISO_UTIL = lib/util-iso.sh
all: $(BIN_BASE) $(BIN_PKG) $(BIN_ISO)
ISO_DATA = \
data/iso/mkinitcpio.conf
edit = sed -e "s|@datadir[@]|$(DESTDIR)$(PREFIX)/share/artools|g" \
-e "s|@sysconfdir[@]|$(DESTDIR)$(SYSCONFDIR)/artools|g" \
-e "s|@libdir[@]|$(DESTDIR)$(PREFIX)/lib/artools|g" \
-e "s|@version@|${Version}|"
DIRMODE = -dm0755
FILEMODE = -m0644
MODE = -m0755
LN = ln -sf
RM = rm -f
M4 = m4 -P
CHMODAW = chmod a-w
CHMODX = chmod +x
%: %.in Makefile
BIN = $(BASE_BIN) $(PKG_BIN) $(ISO_BIN)
UTIL = $(BASE_UTIL) $(PKG_UTIL) $(ISO_UTIL)
all: $(BIN) $(UTIL)
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_BIN = sed -e "s|@libdir[@]|$(LIBDIR)|g"
$(UTIL): %: %.in Makefile
@echo "GEN $@"
@$(RM) "$@"
@m4 -P $@.in | $(edit) >$@
@chmod a-w "$@"
@chmod +x "$@"
@$(M4) $@.in | $(EDIT_UTIL) >$@
@$(CHMODAW) "$@"
$(BIN): %: %.in Makefile
@echo "GEN $@"
@$(RM) "$@"
@$(M4) $@.in | $(EDIT_BIN) >$@
@$(CHMODAW) "$@"
@$(CHMODX) "$@"
clean:
rm -f $(BIN_BASE) ${BIN_PKG} ${BIN_ISO}
$(RM) $(BIN) $(UTIL)
install_base:
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/artools
install -m0644 ${SYSCONF} $(DESTDIR)$(SYSCONFDIR)/artools
install $(DIRMODE) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install $(FILEMODE) $(CONF) $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)
install -dm0755 $(DESTDIR)$(PREFIX)/bin
install -m0755 ${BIN_BASE} $(DESTDIR)$(PREFIX)/bin
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(BASE_BIN) $(DESTDIR)$(BINDIR)
install -dm0755 $(DESTDIR)$(PREFIX)/lib/artools
install -m0644 ${LIBS_BASE} $(DESTDIR)$(PREFIX)/lib/artools
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install $(FILEMODE) $(BASE_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(BASE_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/base
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools
install -m0644 ${SHARED_BASE} $(DESTDIR)$(PREFIX)/share/artools
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(BASE_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install_pkg:
install -dm0755 $(DESTDIR)$(PREFIX)/bin
install -m0755 ${BIN_PKG} $(DESTDIR)$(PREFIX)/bin
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(PKG_BIN) $(DESTDIR)$(BINDIR)
ln -sf find-libdeps $(DESTDIR)$(PREFIX)/bin/find-libprovides
$(LN) find-libdeps $(DESTDIR)$(BINDIR)/find-libprovides
for l in ${COMMITPKG_SYMS}; do ln -sf commitpkg $(DESTDIR)$(PREFIX)/bin/$$l; done
for l in $(LN_COMMITPKG); do $(LN) commitpkg $(DESTDIR)$(BINDIR)/$$l; done
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 -dm0755 $(DESTDIR)$(PREFIX)/lib/artools
install -m0644 ${LIBS_PKG} $(DESTDIR)$(PREFIX)/lib/artools
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install $(FILEMODE) $(PKG_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(PKG_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/pkg
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools
install -m0644 ${SHARED_PKG} $(DESTDIR)$(PREFIX)/share/artools
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(PKG_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/patches
install -m0644 ${PATCHES} $(DESTDIR)$(PREFIX)/share/artools/patches
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install $(FILEMODE) $(PATCHES) $(DESTDIR)$(DATADIR)/$(TOOLS)/patches
install_isobase:
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base
install -m0644 ${BASE} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)/pkglists
install $(FILEMODE) $(PKG_LISTS) $(DESTDIR)$(DATADIR)/$(TOOLS)/pkglists
install_cpio:
+make CPIODIR=$(CPIODIR) DESTDIR=$(DESTDIR) -C initcpio install
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc
install -m0644 ${LIVE_ETC} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc
install_iso: install_cpio
install $(DIRMODE) $(DESTDIR)$(BINDIR)
install $(MODE) $(ISO_BIN) $(DESTDIR)$(BINDIR)
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/default
install -m0644 ${LIVE_ETC_DEFAULT} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/default
for l in $(LN_BUILDISO); do $(LN) buildiso $(DESTDIR)$(BINDIR)/$$l; done
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/pam.d
install -m0644 ${LIVE_ETC_PAM} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/pam.d
install $(DIRMODE) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install $(FILEMODE) $(ISO_UTIL) $(DESTDIR)$(LIBDIR)/$(TOOLS)
install $(FILEMODE) $(ISO_LIBS) $(DESTDIR)$(LIBDIR)/$(TOOLS)/iso
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/sudoers.d
install -m0644 ${LIVE_ETC_SUDOERS} $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/sudoers.d
install $(DIRMODE) $(DESTDIR)$(DATADIR)/$(TOOLS)
install $(FILEMODE) $(ISO_DATA) $(DESTDIR)$(DATADIR)/$(TOOLS)
install_iso:
install -dm0755 $(DESTDIR)$(PREFIX)/bin
install -m0755 ${BIN_ISO} $(DESTDIR)$(PREFIX)/bin
install: install_base install_pkg install_iso
ln -sf buildiso $(DESTDIR)$(PREFIX)/bin/buildiso-gremlins
install -dm0755 $(DESTDIR)$(PREFIX)/lib/artools
install -m0644 ${LIBS_ISO} $(DESTDIR)$(PREFIX)/lib/artools
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/initcpio/hooks
install -m0755 ${CPIOHOOKS} $(DESTDIR)$(SYSCONFDIR)/initcpio/hooks
install -dm0755 $(DESTDIR)$(SYSCONFDIR)/initcpio/install
install -m0755 ${CPIOINST} $(DESTDIR)$(SYSCONFDIR)/initcpio/install
install -m0755 ${CPIO} $(DESTDIR)$(SYSCONFDIR)/initcpio
install -dm0755 $(DESTDIR)$(PREFIX)/share/artools
install -m0644 ${SHARED_ISO} $(DESTDIR)$(PREFIX)/share/artools
uninstall_base:
for f in ${SYSCONF}; do rm -f $(DESTDIR)$(SYSCONFDIR)/artools/$$f; done
for f in ${BIN_BASE}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
for f in ${SHARED_BASE}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/$$f; done
for f in ${LIBS_BASE}; do rm -f $(DESTDIR)$(PREFIX)/lib/artools/$$f; done
uninstall_pkg:
for f in ${BIN_PKG}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
rm -f $(DESTDIR)$(PREFIX)/bin/find-libprovides
for l in ${COMMITPKG_SYMS}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$l; done
for f in ${SHARED_PKG}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/$$f; done
for f in ${PATCHES}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/patches/$$f; done
for f in ${LIBS_PKG}; do rm -f $(DESTDIR)$(PREFIX)/lib/artools/$$f; done
uninstall_isobase:
for f in ${BASE}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/$$f; done
for f in ${LIVE_ETC}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/$$f; done
for f in ${LIVE_ETC_DEFAULT}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/default/$$f; done
for f in ${LIVE_ETC_PAM}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/pam.d/$$f; done
for f in ${LIVE_ETC_SUDOERS}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/iso-profiles/base/live-overlay/etc/sudoers.d/$$f; done
uninstall_iso:
for f in ${BIN_ISO}; do rm -f $(DESTDIR)$(PREFIX)/bin/$$f; done
rm -f $(DESTDIR)$(PREFIX)/bin/buildiso-gremlins
for f in ${SHARED_ISO}; do rm -f $(DESTDIR)$(PREFIX)/share/artools/$$f; done
for f in ${LIBS_ISO}; do rm -f $(DESTDIR)$(PREFIX)/lib/artools/$$f; done
for f in ${CPIOHOOKS}; do rm -f $(DESTDIR)$(SYSCONFDIR)/initcpio/hooks/$$f; done
for f in ${CPIOINST}; do rm -f $(DESTDIR)$(SYSCONFDIR)/initcpio/install/$$f; done
for f in ${CPIO}; do rm -f $(DESTDIR)$(SYSCONFDIR)/initcpio/$$f; done
install: install_base install_pkg install_iso install_isobase
uninstall: uninstall_base uninstall_pkg uninstall_iso uninstall_isobase
dist:
git archive --format=tar --prefix=artools-$(Version)/ $(Version) | gzip -9 > artools-$(Version).tar.gz
gpg --detach-sign --use-agent artools-$(Version).tar.gz
.PHONY: all clean install uninstall dist
.PHONY: all clean install install_base install_pkg install_iso

View File

@@ -1,42 +1,66 @@
artools
=============
User manual
#### Make flags
### 1. artools.conf
* PREFIX=/usr
* SYSCONFDIR=/etc
#### Dependencies
##### Buildtime:
* make
* git
* m4
##### Runtime:
- base:
* openssh
* rsync
* haveged
* os-prober
* gnupg
* pacman
- pkg:
* namcap
* git-subrepo
- iso:
* dosfstools
* libisoburn
* squashfs-tools
* mkinitcpio
* grub
#### Configuration
artools.conf is the central configuration file for artools.
By default, the config is installed in
~~~
/etc/artools/artools.conf
~~~
/etc/artools/artools.conf
A user artools.conf can be placed in
~~~
$HOME/.config/artools/artools.conf
~~~
$HOME/.config/artools/artools.conf
If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide
~~~
/etc/artools/artools.conf
~~~
these values take precedence over the userconfig.
These values take precedence over the userconfig.
Best practise is to leave systemwide file untouched.
By default it is commented and shows just initialization values done in code.
Tools configuration is done in artools.conf or by args.
Specifying args will override artools.conf settings.
~~~
$HOME/.config/artools/import.list.d
~~~
Both, pacman.conf and makepkg.conf for chroots are loaded from
overriding
/usr/share/artools/{makepkg,pacman-*}.conf
~~~
/etc/artools/import.list.d
~~~
and can be overridden dropping them in
$HOME/.config/artools/

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,40 +12,49 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
shopt -s extglob
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
. @libdir@/artools/util-base.sh
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-mount.sh
display_settings(){
show_version
show_config
msg "ARGS:"
msg2 "automount: %s" "${automount}"
msg2 "run_args: %s" "${run_args[*]}"
msg "PATHS:"
msg2 "chrootdir: %s" "${chrootdir}"
select_os(){
local os_list=( $(detect) ) count=${#os_list[@]}
if [[ ${count} > 1 ]];then
msg "Detected systems:"
local i=0
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)) ;;
esac
done
i=0
msg "Select system to mount [0-%s] : " "$((count-1))"
read select
else
select=0
fi
local os_str=${os_list[$select]} type
type=$os_str
root=${os_str%%:*}
type=${type##*:}
if [[ "${type##*:}" == 'linux' ]];then
msg "Mounting (%s) [%s]" "$(get_os_name $os_str)" "$root"
mount_os "$1" "$root"
else
die "You can't mount %s!" "$select"
fi
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
automount=false
pretend=false
usage() {
echo "usage: ${0##*/} -a [or] ${0##*/} chroot-dir [command]"
echo ' -a Automount detected linux system'
echo ' -q Query settings and pretend'
echo ' -h Print this help message'
echo ''
echo " If 'command' is unspecified, ${0##*/} will launch /bin/sh."
@@ -56,12 +68,11 @@ usage() {
orig_argv=("$0" "$@")
opts=':haq'
opts=':ha'
while getopts ${opts} arg; do
case "${arg}" in
a) automount=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument ${arg}"; usage 1 ;;
esac
@@ -74,8 +85,6 @@ if ${automount};then
chrootdir=/mnt
run_args=/bin/bash
${pretend} && display_settings && exit 1
select_os "${chrootdir}"
else
chrootdir=$1
@@ -84,10 +93,8 @@ else
[[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}"
${pretend} && display_settings && exit 1
chroot_api_efi_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}"
chroot_mount /etc/resolv.conf "${chrootdir}/etc/resolv.conf" --bind
chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}"
chroot_add_resolv_conf "${chrootdir}"
fi
SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" ${run_args[*]}

View File

@@ -1,4 +1,16 @@
#!/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.
#
# Assumptions:
@@ -8,17 +20,26 @@
# 4) A valid mirror appears in /etc/pacman.d/mirrorlist
#
version=@version@
shopt -s extglob
DATADIR='@datadir@'
LIBDIR='@libdir@'
. @libdir@/artools/util-base.sh
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-mount.sh
import ${LIBDIR}/util-chroot.sh
copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
}
copy_keyring(){
if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/"
fi
}
create_min_fs(){
msg "Creating install root at %s" "$1"
mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,etc}
mkdir -m 1777 -p $1/{tmp,run}
mkdir -m 0555 -p $1/{sys,proc}
}
newroot=/mnt

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,18 +12,12 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
chroot_version=0.9
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
import ${LIBDIR}/util-mount.sh
. @libdir@/artools/util-base.sh
working_dir=''
files=()
keep_mirrors=false
nosetarch=false
usage() {
@@ -91,8 +88,9 @@ copy_hostconf () {
}
chroot_extra_mount() {
chroot_mount "/etc/resolv.conf" "$1/etc/resolv.conf" -B
chroot_mount_conditional "[[ -e $1/etc/machine-id ]]" "/etc/machine-id" "$1/etc/machine-id" -B
chroot_add_resolv_conf "$1"
chroot_mount "/etc/hosts" "$1/etc/hosts" -B
# chroot_mount_conditional "[[ -e $1/etc/machine-id ]]" "/etc/machine-id" "$1/etc/machine-id" -B
chroot_mount "${cache_dirs[0]}" "$1${cache_dirs[0]}" -B
for cache_dir in ${cache_dirs[@]:1}; do
@@ -113,8 +111,8 @@ 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") != $version ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "$version"
elif [[ $(cat "$working_dir/.artools") != ${CHROOTVERSION} ]]; then
die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}"
fi
chroot_api_mount "${working_dir}" || die "failed to setup API filesystems in chroot %s" "${working_dir}"

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,14 +12,9 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
shopt -s extglob
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util-fstab.sh
. @libdir@/artools/util-base.sh
write_source() {
local src=$1 spec= label= uuid= comment=()
@@ -73,17 +71,17 @@ optstring_apply_quirks() {
case $fstype in
f2fs)
# These are Kconfig options for f2fs. Kernels supporting the options will
# only provide the negative versions of these (e.g. noacl), and vice versa
# for kernels without support.
optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr
# These are Kconfig options for f2fs. Kernels supporting the options will
# only provide the negative versions of these (e.g. noacl), and vice versa
# for kernels without support.
optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr
;;
vfat)
# Before Linux v3.8, "cp" is prepended to the value of the codepage.
if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then
optstring_remove_option "$varname" codepage
optstring_append_option "$varname" "codepage=${codepage#cp}"
fi
# Before Linux v3.8, "cp" is prepended to the value of the codepage.
if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then
optstring_remove_option "$varname" codepage
optstring_append_option "$varname" "codepage=${codepage#cp}"
fi
;;
esac
}
@@ -93,6 +91,7 @@ usage() {
usage: ${0##*/} [options] root
Options:
-f FILTER Restrict output to mountpoints matching the prefix FILTER
-L Use labels for source identifiers (shortcut for -t LABEL)
-p Exclude pseudofs mounts (default behavior)
-P Include printing mounts
@@ -108,14 +107,15 @@ EOF
}
if [[ -z $1 || $1 = @(-h|--help) ]]; then
usage
exit $(( $# ? 0 : 1 ))
usage
exit $(( $# ? 0 : 1 ))
fi
while getopts ':LPpt:U' flag; do
while getopts ':f:LPpt:U' flag; do
case $flag in
L) bytag=LABEL ;;
U) bytag=UUID ;;
f) prefixfilter=$OPTARG ;;
P) pseudofs=1 ;;
p) pseudofs=0 ;;
t) bytag=${OPTARG^^} ;;
@@ -139,6 +139,8 @@ while read -r src target fstype opts fsroot; do
continue
fi
[[ $target = "$prefixfilter"* ]] || continue
# default 5th and 6th columns
dump=0 pass=2
@@ -158,20 +160,20 @@ while read -r src target fstype opts fsroot; do
if [[ $fsroot != / ]]; then
if [[ $fstype = btrfs ]]; then
opts+=,subvol=${fsroot#/}
opts+=,subvol=${fsroot#/}
else
# it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot
if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it,
# because this won't actually be a valid mount. Worst case, the user
# just re-adds it.
continue
fi
fstype=none
opts+=,bind
pass=0
# it's a bind mount
src=$(findmnt -funcevo TARGET "$src")$fsroot
if [[ $src -ef $target ]]; then
# hrmm, this is weird. we're probably looking at a file or directory
# that was bound into a chroot from the host machine. Ignore it,
# because this won't actually be a valid mount. Worst case, the user
# just re-adds it.
continue
fi
fstype=none
opts+=,bind
pass=0
fi
fi
@@ -205,22 +207,22 @@ done
while read -r device type _ _ prio; do
options=defaults
if [[ $prio != -1 ]]; then
options+=,pri=$prio
if (( prio >= 0 )); then
options+=,pri=$prio
fi
# skip files marked deleted by the kernel
[[ $device = *'\040(deleted)' ]] && continue
if [[ $type = file ]]; then
printf '%-20s' "$device"
printf '%-20s' "$device"
elif [[ $device = /dev/dm-+([0-9]) ]]; then
# device mapper doesn't allow characters we need to worry
# about being mangled, and it does the escaping of dashes
# for us in sysfs.
write_source "$(dm_name_for_devnode "$device")"
# device mapper doesn't allow characters we need to worry
# about being mangled, and it does the escaping of dashes
# for us in sysfs.
write_source "$(dm_name_for_devnode "$device")"
else
write_source "$(unmangle "$device")"
write_source "$(unmangle "$device")"
fi
printf '\t%-10s\t%-10s\t%-10s\t0 0\n\n' 'none' 'swap' "$options"

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,30 +12,23 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
. @libdir@/artools/util-base.sh
working_dir=''
files=()
build_locales=false
keep_mirrors=false
keep_flag=''
nosetarch=false
copy_mirrorlist=true
basestrap_args=(-Gc)
usage() {
echo "Usage: ${0##*/} [options] working-dir package-list..."
echo ' options:'
echo ' -C <file> Location of a pacman config file'
echo ' -M <file> Location of a makepkg config file'
echo ' -U <url> Set a specific mirror'
echo ' -c <dir> Set pacman cache'
echo ' -f <file> Copy file from the host to the chroot'
echo ' -m Do not copy mirrorlist to the chroot'
echo ' -s Do not run setarch'
echo ' -h This message'
exit 1
@@ -40,16 +36,16 @@ usage() {
orig_argv=("$0" "$@")
opts='hC:M:U:c:f:s'
opts='hC:M:c:f:sm'
while getopts ${opts} arg; do
case "${arg}" in
C) pacman_conf="$OPTARG" ;;
M) makepkg_conf="$OPTARG" ;;
U) mirror="$OPTARG" ;;
c) cache_dir="$OPTARG" ;;
f) files+=("$OPTARG") ;;
s) nosetarch=true ;;
m) copy_mirrorlist=false; basestrap_args+=(-M) ;;
h|?) usage ;;
*) error "invalid argument '%s'" "$arg"; usage ;;
esac
@@ -71,9 +67,6 @@ else
cache_dirs=(${cache_dir})
fi
basestrap_args=(-Gc ${pacman_conf:+-C "$pacman_conf"})
[[ -n ${mirror} ]] && basestrap_args+=(-M)
umask 0022
#[[ -e $working_dir ]] && die "Working directory '%s' already exists" "$working_dir"
@@ -102,17 +95,21 @@ while read -r varname; do
_env+=("$varname=${!varname}")
done < <(declare -x | sed -r 's/^declare -x ([^=]*)=.*/\1/' | grep -i '_proxy$')
env -i "${_env[@]}" \
basestrap "${basestrap_args[@]}" "$working_dir" ${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages'
basestrap "${basestrap_args[@]}" ${pacman_conf:+-C "$pacman_conf"} "$working_dir" ${cache_dirs[@]/#/--cachedir=} "$@" || die 'Failed to install all packages'
echo "$version" > "$working_dir/.artools"
echo "${CHROOTVERSION}" > "$working_dir/.artools"
default_locale "set" "$working_dir"
if [[ ! -f "$working_dir/etc/locale.gen.orig" ]];then
mv "$working_dir/etc/locale.gen" "$working_dir/etc/locale.gen.orig"
fi
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"
dbus-uuidgen --ensure="$working_dir"/etc/machine-id
chroot_args=(${pacman_conf:+-C "$pacman_conf"} ${makepkg_conf:+-M "$makepkg_conf"} ${cache_dir:+-c "$cache_dir"})
${nosetarch} && chroot_args+=(${nosetarch:+-s})
[[ -n ${mirror} ]] && default_mirror "$working_dir" "$mirror"
exec chroot-run \
"${chroot_args[@]}" \
"$working_dir" locale-gen

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,16 +12,11 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
. @libdir@/artools/util-base.sh
load_user_info
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
file_to_sign="$1"
@@ -28,9 +26,10 @@ if [ ! -e "$1" ]; then
exit 1
fi
msg2 "Signing [%s] with key %s" "${file_to_sign##*/}" "${GPGKEY}..."
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

@@ -1,150 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
shopt -s nullglob
LIBDIR='@libdir@'
DATADIR='@datadir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
show_pkg(){
source PKGBUILD
for n in ${pkgname[@]}; do
msg2 "%s" "$n"
done
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "chroots_pkg: %s" "${chroots_pkg}"
msg2 "repository: %s" "${repository}"
msg "ARGS:"
msg2 "create_first: %s" "${create_first}"
msg2 "makepkg_args: %s" "${makepkg_args[*]}"
msg2 "mkchrootpkg_args: %s" "${mkchrootpkg_args[*]}"
msg "BUILD:"
show_pkg
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
create_first=false
pretend=false
mkchroot_args=()
mkchrootpkg_args=(-c -n)
repository='default'
prepare_build(){
local pac_file= mp_file='makepkg.conf'
base_devel=('base-devel')
case ${repository} in
'system'|'world'|'galaxy') repository='default' ;;
lib32*) base_devel+=('multilib-devel') ;;
galaxy-gremlins|galaxy-goblins) repository=${repository#*-} ;;
esac
local pac_file="pacman-${repository}.conf"
local pacman_conf="${DATADIR}/$pac_file"
[[ -f $AT_USERCONFDIR/$pac_file ]] && pacman_conf="$AT_USERCONFDIR/$pac_file"
work_dir="${chroots_pkg}/${repository}-${target_arch}"
local makepkg_conf="${DATADIR}/$mp_file"
[[ -f $AT_USERCONFDIR/$mp_file ]] && makepkg_conf="$AT_USERCONFDIR/$mp_file"
mkchroot_args+=(-C "${pacman_conf}" -M "${makepkg_conf}" "${work_dir}/root")
mkchrootpkg_args+=(-r "${work_dir}" "${makepkg_args[@]}")
}
build(){
local timer_start=$(get_timer)
exec mkchrootpkg "${mkchrootpkg_args[@]}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
usage() {
echo "Usage: ${0##*/} [options] -- [makepkg_args]"
echo " -r <dir> Repository [default: ${repository}]"
echo ' -c Create root chroot'
echo ' -q Query settings and pretend build'
echo ' -h This help'
echo ''
echo "Default makepkg_args args: ${makepkg_args[*]}"
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='r:cqh'
while getopts "${opts}" arg; do
case "${arg}" in
r) repository="$OPTARG" ;;
c) create_first=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac
done
makepkg_args+=("${@:$OPTIND}")
check_root
prepare_build
${pretend} && display_settings && exit
if ${create_first} || [[ ! -d ${work_dir}/root ]];then
msg "Creating chroot for [%s] (%s)..." "${repository}" "${target_arch}"
for copy in "${work_dir}"/*; do
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")"
lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy"
subvolume_delete_recursive "${copy}"
rm -rf --one-file-system "${copy}"
done
lock_close 9
rm -rf --one-file-system "${work_dir}"
mkdir -p "${work_dir}"
setarch "${target_arch}" mkchroot \
"${mkchroot_args[@]}" "${base_devel[@]}" || abort
else
lock 9 "${work_dir}/root.lock" "Locking clean chroot"
chroot-run "${mkchroot_args[@]}" \
pacman -Syu --noconfirm || abort
fi
build

View File

@@ -1,282 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
DATADIR='@datadir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-pkg.sh
pull_tree(){
local branch="master" tree="$1"
local local_head=$(get_local_head "$branch")
local remote_head=$(get_remote_head "$branch")
local timer=$(get_timer)
msg "Checking [%s] ..." "$tree"
msg2 "local: %s" "${local_head}"
msg2 "remote: %s" "${remote_head}"
if [[ "${local_head}" == "${remote_head}" ]]; then
info "nothing to do"
else
info "needs pull"
git pull origin $branch
fi
msg "Done [%s]" "$tree"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
clone_tree(){
local timer=$(get_timer) tree="$1" host_tree="$2"
msg "Preparing [%s] ..." "$tree"
info "clone"
git clone $host_tree.git
msg "Done [%s]" "$tree"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
pull_tree_arch(){
cd ${tree_dir_arch}
for tree in packages community;do
if [[ -d ${tree} ]];then
cd ${tree}
pull_tree "${tree}"
cd ..
else
clone_tree "${tree}" "${host_tree_arch}/${tree}"
fi
done
}
pull_tree_artix(){
cd ${tree_dir_artix}
for tree in packages packages-galaxy;do
if [[ -d ${tree} ]];then
cd ${tree}
git config --bool pull.rebase true
pull_tree "${tree}"
cd ..
else
clone_tree "${tree}" "${host_tree_artix}/${tree}"
fi
done
}
show_version_table(){
msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version"
for tree in packages packages-galaxy;do
local git=$(find ${tree_dir_artix}/$tree/ -mindepth 1 -maxdepth 1 -type d)
for pkg_path in ${git[@]}; do
local artixrepo=$(find_repo "$pkg_path")
if [[ -d $pkg_path/repos/$artixrepo ]];then
source $pkg_path/trunk/PKGBUILD 2>/dev/null
local pkg=${pkg_path##*/}
local artixver=$(get_full_version $pkg)
local src=$(get_import_path "$tree" "$pkg")
local archrepo=$(find_repo "$src/$pkg")
if [[ -d $src/$pkg/repos/$archrepo ]];then
source $src/$pkg/trunk/PKGBUILD 2>/dev/null
local archver=$(get_full_version $pkg)
fi
if [ $(vercmp $artixver $archver) -lt 0 ];then
local ar=$(arch_to_artix_repo "$artixrepo")
${upgrades} && msg_row_upgrade "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
fi
if [ $(vercmp $artixver $archver) -gt 0 ];then
local ar=$(arch_to_artix_repo "$artixrepo")
if [[ -n $archver ]] && [[ -n $archrepo ]];then
${downgrades} && msg_row_downgrade "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
fi
fi
unset pkgver epoch pkgrel artixver archver _package
fi
done
done
}
show_artix_table(){
msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version"
for tree in packages packages-galaxy;do
local git=$(find ${tree_dir_artix}/$tree/ -mindepth 1 -maxdepth 1 -type d)
for pkg_path in ${git[@]}; do
local artixrepo=$(find_repo "$pkg_path")
if [[ -d $pkg_path/repos/$artixrepo ]];then
source $pkg_path/repos/$artixrepo/PKGBUILD 2>/dev/null
local pkg=${pkg_path##*/}
local artixver=$(get_full_version $pkg)
local src=$(get_import_path "$tree" "$pkg")
local archrepo=$(find_repo "$src/$pkg")
if [[ -d $src/$pkg/repos/$archrepo ]];then
source $src/$pkg/repos/$archrepo/PKGBUILD 2>/dev/null
local archver=$(get_full_version $pkg)
fi
if [ $(vercmp $artixver $archver) -eq 0 ] || [ $(vercmp $artixver $archver) -gt 0 ];then
local ar=$(arch_to_artix_repo "$artixrepo")
case $ar in
*goblins)
if [[ $archrepo == $artixrepo ]];then
msg_row "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
else
msg_row_notify "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
fi
;;
*gremlins)
if [[ $archrepo == $artixrepo ]];then
msg_row "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
else
msg_row_notify "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver"
fi
;;
# system|world|galaxy|lib32) msg_row "%-20s %-20s %-25s %-30s %-30s" "${archrepo%-*}" "${ar}" "$pkg" "$archver" "$artixver" ;;
esac
fi
unset pkgver epoch pkgrel artixver archver _package
fi
done
done
}
from_arch(){
local pkg="$1" archtree="$2" artixtree="$3" src= dest=
src=${tree_dir_arch}/$archtree/$pkg/trunk
dest=${tree_dir_artix}/$artixtree/$pkg/trunk
source $src/PKGBUILD 2>/dev/null
cd ${tree_dir_arch}/$archtree
msg "Package: %s" "$pkg"
local archver=$(get_full_version $pkg)
msg2 "Arch Version: %s" "$archver"
if [[ -d $dest ]];then
source $dest/PKGBUILD 2>/dev/null
cd ${tree_dir_artix}/$artixtree
local artixver=$(get_full_version $pkg)
msg2 "Artix Version: %s" "$artixver"
if [ $(vercmp $artixver $archver) -lt 0 ];then
info "Importing from archlinux (%s)" "$archtree"
rsync "${rsync_args[@]}" $src/ $dest/
patch_pkg "$pkg" "$tree"
else
warning "Versions match! Nothing to do!"
fi
else
cd ${tree_dir_artix}/$artixtree
info "Importing from archlinux (%s)" "$archtree"
mkdir $pkg
rsync "${rsync_args[@]}" $src/ $dest/
patch_pkg "$pkg" "$tree"
fi
}
sync_repos(){
pull_tree_arch
pull_tree_artix
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "package: %s" "${package}"
msg "ARGS:"
msg2 "sync: %s" "${sync}"
msg2 "compare: %s" "${compare}"
msg2 "upgrades: %s" "${upgrades}"
msg2 "downgrades: %s" "${downgrades}"
msg2 "artix: %s" "${artix}"
msg2 "import_packages: %s" "${import_packages}"
msg2 "import_community: %s" "${import_community}"
msg "PATHS:"
msg2 "tree_dir_artix: %s" "${tree_dir_artix}"
msg2 "tree_dir_arch: %s" "${tree_dir_arch}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
pretend=false
sync=false
compare=false
upgrades=true
downgrades=false
artix=false
import_packages=false
import_community=false
package=''
git_artix='packages'
git_arch='packages'
rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
usage() {
echo "Usage: ${0##*/} [options]"
echo ' -p <pkg> Package name'
echo " -s Clone or pull repos"
echo ' -c Compare packages'
echo ' -u Show upgrade packages'
echo ' -d Show downgrade packages'
echo ' -a Show artix specific packages'
echo ' -i Import from arch packages'
echo ' -j Import from arch community'
echo ' -q Query settings'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:csudaijqh'
while getopts "${opts}" arg; do
case "${arg}" in
p) package="$OPTARG" ;;
s) sync=true ;;
c) compare=true ;;
u) upgrades=false ;;
d) downgrades=true ;;
a) artix=true ;;
i) import_packages=true ;;
j) import_community=true; git_artix='packages-galaxy'; git_arch='community' ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${tree_dir_artix}"
prepare_dir "${tree_dir_arch}"
${pretend} && display_settings && exit 1
${sync} && sync_repos
${compare} && show_version_table
${artix} && show_artix_table
${import_packages} && from_arch "${package}" "${git_arch}" "${git_artix}"
${import_community} && from_arch "${package}" "${git_arch}" "${git_artix}"

View File

@@ -1,149 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
DATADIR='@datadir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
commit_pkg(){
cd ${tree_dir_artix}/${git_tree}/${package}
source trunk/PKGBUILD
local ver=$(get_full_version ${package})
if ${remove};then
local action='remove'
local pkg=${package}-$ver
if [[ "${source_repo}" == 'trunk' ]];then
pkg=${package}
info "[%s] '%s' %s" "${source_repo}" "$pkg" "${action}"
git rm -r trunk
else
info "[%s] '%s' %s" "${source_repo}" "$pkg" "${action}"
git rm -r repos/${source_repo}-$CARCH
fi
git commit -m "[${source_repo}] '$pkg' ${action}"
${push} && git push origin master
else
local action='modify'
info "[%s] '%s' %s" "${source_repo}" "${package}-$ver" "${action}"
git add .
git commit -m "[${source_repo}] '${package}-$ver' ${action}"
${push} && git push origin master
fi
}
release_pkg(){
if [[ -d ${tree_dir_artix}/${git_tree}/${package} ]];then
cd ${tree_dir_artix}/${git_tree}/${package}
source trunk/PKGBUILD
[[ $arch == 'any' ]] && CARCH=any
if [[ ${source_repo} != 'trunk' ]];then
cd repos
dest=${target_repo}-$CARCH
action='move'
[[ -d $dest ]] && git rm -r $dest
git mv ${source_repo}-$CARCH $dest
cd ..
else
dest=${target_repo}-$CARCH
action='add'
[[ ! -d repos ]] && mkdir repos
cd repos
[[ -d repos/$dest ]] && git rm -r repos/$dest
cd ..
cp -r trunk repos/$dest
fi
local ver=$(get_full_version ${package})
info "[%s] -> [%s] '%s' %s" "${source_repo}" "${target_repo}" "${package}-$ver" "${action}"
git add .
git commit -m "[${source_repo}] -> [${target_repo}] '${package}-$ver' ${action}"
${push} && git push origin master
fi
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "git_tree: %s" "${git_tree}"
msg2 "source_repo: %s" "${source_repo}"
msg2 "target_repo: %s" "${target_repo}"
msg2 "package: %s" "${package}"
msg "ARGS:"
msg2 "remove: %s" "${remove}"
msg2 "push: %s" "${push}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
source_repo='trunk'
package=''
remove=false
push=false
pretend=false
git_tree='packages'
cmd=${0##*/}
target_repo=${cmd%pkg}
case ${target_repo} in
community*|multilib*) git_tree='packages-galaxy' ;;
esac
usage() {
echo "Usage: ${0##*/} [options]"
echo " -s <name> Source repository [default:${source_repo}]"
echo ' -p <pkg> Package name'
echo ' -r Delete from repo'
echo ' -u Push'
echo ' -q Query settings and pretend'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:s:urqh'
while getopts "${opts}" arg; do
case "${arg}" in
s) source_repo="$OPTARG" ;;
p) package="$OPTARG" ;;
r) remove=true ;;
u) push=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
${pretend} && display_settings && exit 1
if [[ "${cmd}" == 'commitpkg' ]];then
commit_pkg
else
release_pkg
fi

View File

@@ -1,101 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-iso-publish.sh
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "profile: %s" "${profile}"
msg2 "uplimit: %s kB/s" "${uplimit}"
msg "ARGS:"
msg2 "update: %s" "${update}"
msg2 "verbose: %s" "${verbose}"
msg2 "torrent: %s" "${torrent}"
if ${torrent};then
msg2 "tracker_url: %s" "${tracker_url}"
msg2 "piece_size: %s" "${piece_size}"
msg2 "host_mirrors: %s" "${host_mirrors[*]}"
msg2 "torrent_meta: %s" "${torrent_meta}"
fi
msg "REMOTE:"
msg2 "account: %s" "${account}"
msg2 "file_host: %s" "${file_host}"
msg2 "project: %s" "${project}"
msg "UPLOAD:"
msg2 "src_dir: ${src_dir}"
msg2 "target_dir: ${target_dir}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
pretend=false
update=false
verbose=false
torrent=false
rsync_args=(-aP --progress -e ssh)
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 ' -t Create iso torrent'
echo ' -q Query settings and pretend upload'
echo ' -v Verbose output'
echo ' -h This help'
echo ''
echo ''
exit $1
}
opts='p:l:uvtqh'
while getopts "${opts}" arg; do
case "${arg}" in
p) profile="$OPTARG" ;;
l) uplimit="$OPTARG" ;;
u) update=true; rsync_args+=(-u) ;;
t) torrent=true ;;
v) verbose=true; rsync_args+=(-v --stats) ;;
q) pretend=true; rsync_args+=(-n) ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
timer_start=$(get_timer)
rsync_args+=(--bwlimit=${uplimit})
prepare_transfer
${pretend} && display_settings #&& exit 1
sync_dir

View File

@@ -1,121 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-pkg.sh
del_from_repo(){
local ver
local repo="$1"
local repo_path=${repos_root}/$repo/os/${target_arch}
source PKGBUILD
for name in ${pkgname[@]};do
[[ $arch == any ]] && CARCH=any
ver=$(get_full_version $name)
if pkgfile=$(find_cached_package "$name" "$ver" "$CARCH");then
info "pkgfile: %s" "${pkgfile##*/}"
repo-remove -R $repo_path/$repo.db.tar.xz $name
[[ -f $repo_path/${pkgfile##*/}{,.sig} ]] && rm -v $repo_path/${pkgfile##*/}{,.sig}
fi
done
}
add_to_repo(){
local ver pkgfile=
local repo="$1"
local repo_path=${repos_root}/$repo/os/${target_arch}
source PKGBUILD
for name in ${pkgname[@]};do
[[ $arch == any ]] && CARCH=any
ver=$(get_full_version $name)
if pkgfile=$(find_cached_package "$name" "$ver" "$CARCH"); then
info "pkgfile: %s" "${pkgfile##*/}"
if ${sign_pkg};then
[[ -e ${pkgfile}.sig ]] && rm ${pkgfile}.sig
signfile ${pkgfile}
fi
ln -sf ${pkgfile}{,.sig} $repo_path/
repo-add -R $repo_path/$repo.db.tar.xz $pkgfile
fi
done
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "repository: %s" "${repository}"
msg "ARGS:"
msg2 "add_pkg: %s" "${add_pkg}"
msg2 "del_pkg: %s" "${del_pkg}"
msg2 "sign_pkg: %s" "${sign_pkg}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
pretend=false
add_pkg=false
del_pkg=false
repository=
sign_pkg=false
usage() {
echo "Usage: ${0##*/} [options]"
echo " -d Destination repository [default:${repository}]"
echo ' -a Add package to repository'
echo ' -r Remove package from repository'
echo ' -s Sign package'
echo ' -q Query settings and pretend upload'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='d:arsqh'
while getopts "${opts}" arg; do
case "${arg}" in
d) repository="$OPTARG" ;;
a) add_pkg=true ;;
r) del_pkg=true ;;
s) sign_pkg=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${repos_root}"
${pretend} && display_settings && exit 1
${del_pkg} && del_from_repo "${repository}"
${add_pkg} && add_to_repo "${repository}"
exit 0

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,88 +12,54 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
DATADIR='@datadir@'
SYSCONFDIR='@sysconfdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-iso.sh
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-iso.sh
prepare_build(){
timer_start=$(get_timer)
load_profile "${profile}"
netgroups=${netgroups_url}/netgroups-${initsys}.yaml
load_profile "${PROFILE}"
local pacman_conf pac_file="pacman-default.conf"
case "${stablility}" in
'gremlins') pac_file="pacman-${stablility}.conf" ;;
case "${REPOSITORY}" in
'gremlins'|'goblins') pac_file="pacman-${REPOSITORY}.conf" ;;
esac
pacman_conf="${DATADIR}/$pac_file"
[[ -f $AT_USERCONFDIR/$pac_file ]] && pacman_conf="$AT_USERCONFDIR/$pac_file"
[[ -f ${USERCONFDIR}/artools/$pac_file ]] && pacman_conf="${USERCONFDIR}/artools/$pac_file"
iso_file=$(gen_iso_fn).iso
mkchroot_args+=(-C ${pacman_conf})
work_dir=${chroots_iso}/${profile}/${target_arch}
iso_label="ARTIX_$(date +%Y%m)"
iso_dir="${iso_pool}/${profile}"
mkchroot_args+=(-C ${pacman_conf} -m)
work_dir=${CHROOTS_ISO}/${PROFILE}/${ARCH}
iso_root=${chroots_iso}/${profile}/iso
mnt_dir=${chroots_iso}/${profile}/mnt
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}"
}
show_profile(){
msg2 "iso_file: %s" "${iso_file}"
if ${verbose};then
msg2 "autologin: %s" "${autologin}"
msg2 "netgroups: %s" "${netgroups}"
msg2 "hostname: %s" "${hostname}"
msg2 "username: %s" "${username}"
msg2 "password: %s" "${password}"
msg2 "addgroups: %s" "${addgroups}"
msg2 "services_live: %s" "${services_live[*]}"
msg2 "services: %s" "${services[*]}"
fi
prepare_dir "${iso_root}"
}
display_settings(){
show_version
show_config
msg "OPTIONS:"
msg2 "profile: %s" "${profile}"
msg2 "initsys: %s" "${initsys}"
msg2 "kernel: %s" "${kernel}"
[[ -n ${gpgkey} ]] && msg2 "gpgkey: %s" "${gpgkey}"
msg2 "stablility: %s" "${stablility}"
msg "ARGS:"
msg2 "clean_first: %s" "${clean_first}"
msg2 "images_only: %s" "${images_only}"
msg2 "iso_only: %s" "${iso_only}"
msg2 "persist: %s" "${persist}"
msg2 "PROFILE: %s" "${PROFILE}"
msg2 "INITSYS: %s" "${INITSYS}"
[[ -n ${GPG_KEY} ]] && msg2 "GPG_KEY: %s" "${GPG_KEY}"
msg "ISO SETTINGS:"
msg2 "iso_version: %s" "${iso_version}"
msg2 "ISO_VERSION: %s" "${ISO_VERSION}"
msg "BUILD:"
show_profile
}
build(){
msg "Start building [%s]" "${profile}"
msg "Start building [%s]" "${PROFILE}"
if ${clean_first};then
for copy in "${work_dir}"/*; do
[[ -d $copy ]] || continue
@@ -108,56 +77,55 @@ build(){
fi
if ${iso_only}; then
[[ ! -d ${work_dir} ]] && die "Create images: buildiso -p %s -x" "${profile}"
[[ ! -d ${work_dir} ]] && die "Create images: %s -p %s -x" "${cmd}" "${PROFILE}"
compress_images
exit 1
fi
if ${images_only}; then
prepare_images
warning "Continue compress: buildiso -p %s -zc ..." "${profile}"
warning "Continue compress: %s -p %s -zc ..." "${cmd}" "${PROFILE}"
exit 1
else
prepare_images
compress_images
fi
msg "Finished building [%s]" "${profile}"
msg "Finished building [%s]" "${PROFILE}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
load_user_info
load_config "${AT_USERCONFDIR}/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
clean_first=true
pretend=false
images_only=false
iso_only=false
verbose=false
log=false
persist=false
mkchroot_args=()
cmd=${0##*/}
stablility=${cmd##*-}
REPOSITORY=${cmd##*-}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -p <profile> Profile [default: ${profile}]"
echo "Usage: ${cmd} [options]"
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 ' -k <name> Kernel to use'
echo " [default: ${kernel}]"
echo " [default: ${ISO_POOL}]"
echo ' -i <name> Init system to use'
echo " [default: ${initsys}]"
echo " [default: ${INITSYS}]"
echo ' -g <key> The gpg key for sfs signing'
echo " [default: ${gpgkey}]"
echo " [default: ${GPG_KEY}]"
echo ' -m Set SquashFS image mode to persistence'
echo ' -c Disable clean work dir'
echo ' -x Build images only'
echo ' -z Generate iso only'
echo ' Requires pre built images (-x)'
echo ' -v Verbose output to log file, show profile detail (-q)'
echo ' -l Log to file'
echo ' -q Query settings and pretend build'
echo ' -h This help'
echo ''
@@ -167,21 +135,20 @@ usage() {
orig_argv=("$0" "$@")
opts='p:r:t:k:i:g:czxmvqh'
opts='p:r:t:i:g:czxmlqh'
while getopts "${opts}" arg; do
case "${arg}" in
p) profile="$OPTARG" ;;
r) chroots_iso="$OPTARG" ;;
t) iso_pool="$OPTARG" ;;
k) kernel="$OPTARG" ;;
i) initsys="$OPTARG" ;;
g) gpgkey="$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 ;;
z) iso_only=true ;;
m) persist=true ;;
v) verbose=true ;;
l) log=true ;;
q) pretend=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
@@ -190,12 +157,12 @@ done
shift $(($OPTIND - 1))
${pretend} && display_settings && exit 1
check_root
prepare_traps
prepare_build
${pretend} && display_settings && exit 1
build

75
bin/iso/deployiso.in Normal file
View File

@@ -0,0 +1,75 @@
#!/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
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}"
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
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

110
bin/pkg/buildpkg.in Normal file
View File

@@ -0,0 +1,110 @@
#!/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
. @libdir@/artools/util-pkg.sh
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
create_first=false
mkchrootpkg_args=(-c -n)
cmd=${0##*/}
repo=${cmd#*-}
base_devel=('base-devel')
case ${repo} in
system|world|galaxy) repo='default' ;;
lib32*) base_devel+=('multilib-devel') ;;
galaxy-gremlins|galaxy-goblins) repo=${repo#*-} ;;
esac
pacman_conf="${DATADIR}/pacman-${repo}.conf"
[[ -f ${USERCONFDIR}/artools/pacman-${repo}.conf ]] && pacman_conf="${USERCONFDIR}/artools/pacman-${repo}.conf"
makepkg_conf="${DATADIR}/makepkg.conf"
[[ -f ${USERCONFDIR}/artools/makepkg.conf ]] && makepkg_conf="${USERCONFDIR}/artools/makepkg.conf"
usage() {
echo "Usage: ${0##*/} [options] -- [mkchrootpkg_args]"
echo " -r <dir> Create chroots in this directory"
echo ' -c Recreate the chroot before building'
echo ' -h This help'
echo ''
echo "Default mkchrootpkg_args args: ${mkchrootpkg_args[*]}"
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='hcr:'
while getopts "${opts}" arg; do
case "${arg}" in
r) CHROOTS_PKG="$OPTARG" ;;
c) create_first=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '%s'" "${arg}"; usage 1 ;;
esac
done
check_root SOURCE_DATE_EPOCH
mkchrootpkg_args+=("${@:$OPTIND}")
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
[[ -d $copy ]] || continue
msg2 "Deleting chroot copy '%s'..." "$(basename "${copy}")"
lock 9 "$copy.lock" "Locking chroot copy '%s'" "$copy"
subvolume_delete_recursive "${copy}"
rm -rf --one-file-system "${copy}"
done
lock_close 9
rm -rf --one-file-system "${CHROOTS_PKG}/${repo}-${ARCH}"
mkdir -p "${CHROOTS_PKG}/${repo}-${ARCH}"
setarch "${ARCH}" mkchroot \
-C "${pacman_conf}" \
-M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \
"${base_devel[@]}" || abort
else
lock 9 "${CHROOTS_PKG}/${repo}-${ARCH}/root.lock" "Locking clean chroot"
chroot-run \
-C "${pacman_conf}" \
-M "${makepkg_conf}" \
"${CHROOTS_PKG}/${repo}-${ARCH}/root" \
pacman -Syu --noconfirm || abort
fi
# Always build official packages reproducibly
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}"

197
bin/pkg/buildtree.in Normal file
View File

@@ -0,0 +1,197 @@
#!/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
. @libdir@/artools/util-pkg.sh
pull_tree_arch(){
cd ${TREE_DIR_ARCH}
for tree in ${TREE_NAMES_ARCH[@]};do
if [[ -d ${tree} ]];then
cd ${tree}
pull_tree "${tree}"
cd ..
else
clone_tree "${HOST_TREE_ARCH}" "${tree}"
fi
done
}
pull_tree_artix(){
cd ${TREE_DIR_ARTIX}
for tree in ${TREE_NAMES_ARTIX[@]};do
if [[ -d ${tree} ]];then
config_tree "${tree}"
cd ${tree}
pull_tree "${tree}"
cd ..
else
clone_tree "${HOST_TREE_ARTIX}" "${tree}"
config_tree "${tree}"
fi
done
}
sync_pkg(){
local rsync_args=(-aWxvci --progress --delete-before --no-R --no-implied-dirs)
local src="$1" dest="$2"
rsync "${rsync_args[@]}" $src/ $dest/
}
show_deps(){
local src="$1" repo="$2"
. $src/PKGBUILD 2>/dev/null
[[ $arch == 'any' ]] && CARCH=any
local archver=$(get_full_version $pkg)
msg "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[@]}"
}
from_arch(){
local pkg="$1" src= dest=
local git_tree_arch=$(find_tree "${TREE_DIR_ARCH}" "$pkg")
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
local package=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
local repo=$(find_repo "$package")
src=$package/repos/$repo
local git_tree_artix=$(find_tree "${TREE_DIR_ARTIX}" "$pkg")
local tree_dir=$(get_artix_tree "$pkg" "$git_tree_artix" "$git_tree_arch")
dest=${TREE_DIR_ARTIX}/$tree_dir/$pkg/trunk
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 $pkg)
msg2 "Artix Version: %s" "$artixver"
else
subrepo_new "$pkg" "$tree_dir" "$git_tree_arch"
fi
msg "Sync (%s) from [%s] to [%s]" "$pkg" "$git_tree_arch" "$tree_dir"
sync_pkg "$src" "$dest"
patch_pkg "$pkg"
}
view_build(){
local pkg="$1" src=
local git_tree_arch=$(find_tree "${TREE_DIR_ARCH}" "$pkg")
[[ -z $git_tree_arch ]] && die "Package '%s' does not exist!" "$pkg"
local pkg_path=${TREE_DIR_ARCH}/$git_tree_arch/$pkg
local repo=$(find_repo "$pkg_path")
src=$pkg_path/repos/$repo
show_deps "$src" "$repo"
}
sync_repos(){
${sync_arch} && pull_tree_arch
pull_tree_artix
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
sync=false
sync_arch=true
import=false
view=false
createnew=false
conf=false
PACKAGE=''
TEAM=${TREE_NAMES[0]}
SUBORG=''
usage() {
echo "Usage: ${0##*/} [options]"
echo ' -p <pkg> Package name'
echo ' -t <team> Team name (only with -n)'
echo " [default: ${TEAM}]"
echo ' -o <org> Org of subrepo (only with -c)'
echo " -s Clone or pull repos"
echo " -z Don't clone or pull arch repos"
echo ' -i Import a package from arch repos'
echo ' -n Make new remote subrepo and clone it'
echo ' -c Configure subrepo url'
echo ' -v View package depends'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:t:o:csinzvh'
while getopts "${opts}" arg; do
case "${arg}" in
p) PACKAGE="$OPTARG" ;;
t) TEAM="$OPTARG" ;;
o) SUBORG="$OPTARG" ;;
s) sync=true ;;
z) sync_arch=false ;;
i) import=true ;;
n) createnew=true ;;
v) view=true ;;
c) conf=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${TREE_DIR_ARTIX}"
prepare_dir "${TREE_DIR_ARCH}"
${sync} && sync_repos
${view} && view_build "${PACKAGE}"
${import} && from_arch "${PACKAGE}"
${createnew} && subrepo_new "${PACKAGE}" "${TEAM}"
${conf} && subrepo_config "${PACKAGE}" "${SUBORG}"

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,19 +12,14 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-pkg.sh
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
shopt -s extglob
load_user_info
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
if [[ ! -f PKGBUILD ]]; then

177
bin/pkg/commitpkg.in Normal file
View File

@@ -0,0 +1,177 @@
#!/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
. @libdir@/artools/util-pkg.sh
commit_pkg(){
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
if [[ -n ${git_tree} ]];then
cd ${TREE_DIR_ARTIX}/${git_tree}
local head=$(get_local_head)
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
. trunk/PKGBUILD
[[ $arch == 'any' ]] && CARCH=any
local ver=$(get_full_version "${PACKAGE}")
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}-$ver"
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}-$ver' ${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}"
fi
}
symlink_commit_pkg(){
local git_tree=$(find_tree "${TREE_DIR_ARTIX}" "${PACKAGE}")
if [[ -n ${git_tree} ]];then
cd ${TREE_DIR_ARTIX}/${git_tree}
local head=$(get_local_head)
cd ${TREE_DIR_ARTIX}/${git_tree}/${PACKAGE}
. trunk/PKGBUILD
[[ $arch == 'any' ]] && CARCH=any
local ver=$(get_full_version "${PACKAGE}")
if [[ ${REPO_SRC} == 'trunk' ]];then
local action='add'
local dest="${REPO_DEST}-$CARCH"
[[ -d repos/$dest ]] && git rm -r repos/$dest
[[ ! -d repos ]] && mkdir repos
[[ ! -d repos/$dest ]] && mkdir repos/$dest
cp trunk/* repos/$dest/
else
local action='move'
local src="${REPO_SRC}-$CARCH" dest="${REPO_DEST}-$CARCH"
[[ ! -f repos/$src/PKGBUILD ]] && die "%s does not exist!" "repos/$src/PKGBUILD"
[[ -d repos/$dest ]] && git rm -r repos/$dest
[[ ! -d repos ]] && mkdir repos
[[ ! -d repos/$dest ]] && mkdir repos/$dest
cp repos/$src/* repos/$dest/
git rm -r repos/$src
fi
local commit_msg="[${REPO_SRC}] -> [${REPO_DEST}] '${PACKAGE}-$ver' ${action}"
msg "Action: %s" "$commit_msg"
git add .
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}"
fi
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
REPO_SRC='trunk'
PACKAGE=''
remove=false
push=false
cmd=${0##*/}
REPO_DEST=${cmd%pkg}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -s <name> Source repository [default:${REPO_SRC}]"
echo ' -p <pkg> Package name'
echo ' -r Delete from repo (commitpkg only)'
echo ' -u Push'
echo ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='p:s:urh'
while getopts "${opts}" arg; do
case "${arg}" in
s) REPO_SRC="$OPTARG" ;;
p) PACKAGE="$OPTARG" ;;
r) remove=true ;;
u) push=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
if $(is_valid_repo "${REPO_SRC}");then
if [[ "${cmd}" == 'commitpkg' ]];then
commit_pkg
else
symlink_commit_pkg
fi
else
error "source repository '%s' is not valid!" "${REPO_SRC}"
fi

133
bin/pkg/comparepkg.in Normal file
View File

@@ -0,0 +1,133 @@
#!/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
. @libdir@/artools/util-pkg.sh
show_version_table(){
msg_table_header "%-20s %-20s %-25s %-30s %-30s" "Arch Repo" "Artix Repo" "Package" "Arch version" "Artix version"
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
local pkg=${package##*/}
local artixrepo=$(find_repo "$package" "${staging}" "${unstable}")
local artixshow=${artixrepo%-*}
local pkgbuild=$package/repos/$artixrepo/PKGBUILD
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local artixver=$(get_full_version $pkg)
local archpath=$(get_import_path $pkg)
local archrepo=$(find_repo "$archpath" "${staging}" "${unstable}")
local archshow=${archrepo%-*}
pkgbuild=$archpath/repos/$archrepo/PKGBUILD
if [[ -f $pkgbuild ]];then
. $pkgbuild 2>/dev/null
local archver=$(get_full_version $pkg)
fi
local result=$(vercmp "$artixver" "$archver")
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 "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
else
msg_row_notify "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
fi
;;
esac
fi
elif ${upgrades};then
if [ $result -eq -1 ];then
msg_row_upgrade "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
fi
elif ${downgrades};then
if [ $result -eq 1 ];then
if [[ -n $archver ]] && [[ -n $archrepo ]];then
msg_row_downgrade "%-20s %-20s %-25s %-30s %-30s" "$archshow" "$artixshow" "$pkg" "$archver" "$artixver"
fi
fi
fi
unset pkgver epoch pkgrel artixver archver pkgbuild archpath
fi
done
done
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
unstable=false
staging=true
upgrades=false
downgrades=false
move=false
usage() {
echo "Usage: ${0##*/} [options]"
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 ' -h This help'
echo ''
echo ''
exit $1
}
orig_argv=("$0" "$@")
opts='udmxyh'
while getopts "${opts}" arg; do
case "${arg}" in
u) upgrades=true ;;
d) downgrades=true ;;
m) move=true ;;
x) staging=false ;;
y) unstable=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
show_version_table

92
bin/pkg/deploypkg.in Normal file
View File

@@ -0,0 +1,92 @@
#!/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
. @libdir@/artools/util-pkg.sh
update_repo(){
local repo="$1" pkgfile ver ext=db.tar.xz
local repo_path=${REPOS_ROOT}/$repo/os/${ARCH} packages=()
. PKGBUILD
for name in ${pkgname[@]};do
pkgarch=$(get_pkg_arch "$name")
ver=$(get_full_version "$name")
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")
# checkpkg "${pkgfile}" || return 2
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
done
cd $repo_path
[[ -n $action ]] && repo-$action -R $repo.$ext ${packages[@]}
return 0
}
load_user_info
load_config "${USERCONFDIR}/artools/artools.conf" || load_config "${SYSCONFDIR}/artools.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
add_pkg=false
del_pkg=false
sign_pkg=false
cmd=${0##*/}
dest_repo=${cmd#*-}
usage() {
echo "Usage: ${cmd} [options]"
echo ' -a Add package(s) to repository'
echo ' -r Remove package(s) from repository'
echo ' -s Sign package(s)'
echo ' -h This help'
echo ''
echo ''
exit $1
}
opts='arsh'
while getopts "${opts}" arg; do
case "${arg}" in
a) add_pkg=true; del_pkg=false ;;
r) del_pkg=true; add_pkg=false ;;
s) sign_pkg=true ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(($OPTIND - 1))
prepare_dir "${REPOS_ROOT}"
update_repo "${dest_repo}"

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,12 +12,25 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
. @libdir@/artools/util-base.sh
. @libdir@/artools/util-pkg.sh
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util-pkg.sh
# $1: sofile
# $2: soarch
process_sofile() {
# extract the library name: libfoo.so
local soname="${1%.so?(+(.+([0-9])))}".so
# extract the major version: 1
soversion="${1##*\.so\.}"
if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then
return
fi
if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then
# libfoo.so=1-64
msg "${soname}=${soversion}-$2"
soobjects+=("${soname}=${soversion}-$2")
fi
}
set -e
shopt -s extglob

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,11 +12,8 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
. @libdir@/artools/util-base.sh
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
match=$1
if [[ -z $match ]]; then

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,11 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
. @libdir@/artools/util-base.sh
ifs=$IFS
IFS="${IFS}:"

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,13 +12,7 @@
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
version=@version@
LIBDIR='@libdir@'
[[ -r ${LIBDIR}/util-msg.sh ]] && source ${LIBDIR}/util-msg.sh
import ${LIBDIR}/util.sh
import ${LIBDIR}/util-chroot.sh
. @libdir@/artools/util-base.sh
shopt -s nullglob
@@ -58,35 +55,39 @@ usage() {
exit 1
}
sync_chroot() {
local chrootdir=$1
local copy=$2
local copydir=''
if [[ ${copy:0:1} = / ]]; then
copydir=$copy
else
copydir="$chrootdir/$copy"
fi
# {{{ functions
if [[ "$chrootdir/root" -ef "$copydir" ]]; then
# Usage: sync_chroot $rootdir $copydir [$copy]
sync_chroot() {
local rootdir=$1
local copydir=$2
local copy=${3:-$2}
if [[ "$rootdir" -ef "$copydir" ]]; then
error 'Cannot sync copy with itself: %s' "$copydir"
return 1
fi
# Get a read lock on the root chroot to make
# sure we don't clone a half-updated chroot
slock 8 "$chrootdir/root.lock" \
"Locking clean chroot [%s]" "$chrootdir/root"
slock 8 "$rootdir.lock" \
"Locking clean chroot [%s]" "$rootdir"
stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copydir"
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
btrfs subvolume snapshot "$chrootdir/root" "$copydir" >/dev/null ||
stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$rootdir" "$copy"
if is_subvolume "$rootdir" && is_same_fs "$rootdir" "$(dirname -- "$copydir")" && ! mountpoint -q "$copydir"; then
if is_subvolume "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
else
# avoid change of filesystem in case of an umount failure
rm --recursive --force --one-file-system "$copydir" ||
die "Unable to delete %s" "$copydir"
fi
btrfs subvolume snapshot "$rootdir" "$copydir" >/dev/null ||
die "Unable to create subvolume %s" "$copydir"
else
mkdir -p "$copydir"
rsync -a --delete -q -W -x "$chrootdir/root/" "$copydir"
rsync -a --delete -q -W -x "$rootdir/" "$copydir"
fi
stat_done
@@ -103,7 +104,7 @@ delete_chroot() {
local copy=${1:-$2}
stat_busy "Removing chroot copy [%s]" "$copy"
if is_btrfs "$chrootdir" && ! mountpoint -q "$copydir"; then
if is_subvolume "$copydir" && ! mountpoint -q "$copydir"; then
subvolume_delete_recursive "$copydir" ||
die "Unable to delete subvolume %s" "$copydir"
else
@@ -128,7 +129,10 @@ install_packages() {
pkgnames=("${install_pkgs[@]##*/}")
cp -- "${install_pkgs[@]}" "$copydir/root/"
chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
chroot-run \
-r "${bindmounts_ro[@]}" \
-r "${bindmounts_rw[@]}" \
"$copydir" \
pacman -U --noconfirm -- "${pkgnames[@]/#//root/}"
ret=$?
rm -- "${pkgnames[@]/#/$copydir/root/}"
@@ -148,24 +152,21 @@ prepare_chroot() {
[[ $keepbuilddir = true ]] || rm -rf "$copydir/build"
local builduser_uid="${SUDO_UID:-$UID}"
local builduser_gid="$(id -g "$builduser_uid")"
local builduser_uid builduser_gid
builduser_uid="${SUDO_UID:-$UID}"
builduser_gid="$(id -g "$builduser_uid")"
local install="install -o $builduser_uid -g $builduser_gid"
local x
# We can't use useradd without chrooting, otherwise it invokes PAM modules
# which we might not be able to load (i.e. when building i686 packages on
# an x86_64 host).
sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,group}
printf >>"$copydir/etc/group" 'builduser:x:%d:\n' $builduser_gid
printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' $builduser_uid $builduser_gid
sed -e '/^builduser:/d' -i "$copydir"/etc/{passwd,shadow,group}
printf >>"$copydir/etc/group" 'builduser:x:%d:\n' "$builduser_gid"
printf >>"$copydir/etc/passwd" 'builduser:x:%d:%d:builduser:/build:/bin/bash\n' "$builduser_uid" "$builduser_gid"
printf >>"$copydir/etc/shadow" 'builduser:!!:%d::::::\n' "$(( $(date -u +%s) / 86400 ))"
$install -d "$copydir"/{build,build/.gnupg,startdir,{pkg,srcpkg,src,log}dest}
for x in .gnupg/pubring.{kbx,gpg}; do
[[ -r $USER_HOME/$x ]] || continue
$install -m 644 "$USER_HOME/$x" "$copydir/build/$x"
done
$install -d "$copydir"/{build,startdir,{pkg,srcpkg,src,log}dest}
sed -e '/^MAKEFLAGS=/d' -e '/^PACKAGER=/d' -i "$copydir/etc/makepkg.conf"
for x in BUILDDIR=/build PKGDEST=/pkgdest SRCPKGDEST=/srcpkgdest SRCDEST=/srcdest LOGDEST=/logdest \
@@ -202,14 +203,23 @@ _chrootbuild() {
# No coredumps
ulimit -c 0
exec </dev/console
. /etc/locale.conf
# shellcheck source=/dev/null
. /etc/profile
export LANG=en_US.UTF-8
locale-gen &> /dev/null
# Beware, there are some stupid arbitrary rules on how you can
# use "$" in arguments to commands with "sudo -i". ${foo} or
# ${1} is OK, but $foo or $1 isn't.
# https://bugzilla.sudo.ws/show_bug.cgi?id=765
sudo --preserve-env=SOURCE_DATE_EPOCH -iu builduser bash -c 'cd /startdir; makepkg "$@"' -bash "$@"
ret=$?
case $ret in
0|14)
return 0;;
*)
return $ret;;
esac
}
_chrootnamcap() {
@@ -220,31 +230,35 @@ _chrootnamcap() {
done
}
# Usage: download_sources $copydir $src_owner
# Usage: download_sources $copydir $makepkg_user
# Globals:
# - SRCDEST
# - USER
download_sources() {
local copydir=$1
local makepkg_user=$2
local builddir
builddir="$(mktemp -d)"
chmod 1777 "$builddir"
# local builddir
# builddir="$(mktemp -d)"
# chown "$makepkg_user:" "$builddir"
setup_workdir
chown "$makepkg_user:" "$WORKDIR"
# Ensure sources are downloaded
sudo -u "$makepkg_user" env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
sudo -u "$makepkg_user" --preserve-env=GNUPGHOME \
env SRCDEST="$SRCDEST" BUILDDIR="$WORKDIR" \
makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o ||
die "Could not download sources."
# Clean up garbage from verifysource
rm -rf "$builddir"
# rm -rf "$builddir"
}
# Usage: move_products $copydir $owner
# Globals:
# - PKGDEST
# - LOGDEST
# - SRCPKGDEST
move_products() {
local copydir=$1
local src_owner=$2
@@ -292,8 +306,8 @@ main() {
chrootdir=
passeddir=
makepkg_user=
declare -ga install_pkgs
declare -gi ret=0
declare -a install_pkgs
declare -i ret=0
bindmounts_ro=()
bindmounts_rw=()
@@ -305,7 +319,7 @@ main() {
local opts='hcur:I:l:nTD:d:U:'
while getopts ${opts} arg; do
while getopts "${opts}" arg; do
case "$arg" in
c) clean_first=true ;;
D) bindmounts_ro+=("$OPTARG") ;;
@@ -325,7 +339,7 @@ main() {
[[ -n $makepkg_user && -z $(id -u "$makepkg_user") ]] && die 'Invalid makepkg user.'
makepkg_user=${makepkg_user:-${SUDO_USER:-$USER}}
check_root
check_root SOURCE_DATE_EPOCH,SRCDEST,SRCPKGDEST,PKGDEST,LOGDEST,MAKEFLAGS,PACKAGER,GNUPGHOME
# Canonicalize chrootdir, getting rid of trailing /
chrootdir=$(readlink -e "$passeddir")
@@ -355,7 +369,7 @@ main() {
umask 0022
load_vars "${PAC_USERCONFDIR}/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars "${USERCONFDIR}/pacman/makepkg.conf" || load_vars "$USER_HOME/.makepkg.conf"
load_vars /etc/makepkg.conf
# Use PKGBUILD directory if these don't exist
@@ -368,11 +382,14 @@ main() {
lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
if [[ ! -d $copydir ]] || $clean_first; then
sync_chroot "$chrootdir" "$copy"
sync_chroot "$chrootdir/root" "$copydir" "$copy"
fi
$update_first && chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
pacman -Syu --noconfirm
$update_first && chroot-run \
-r "${bindmounts_ro[@]}" \
-w "${bindmounts_rw[@]}" \
"$copydir" \
pacman -Syu --noconfirm
if [[ -n ${install_pkgs[*]:-} ]]; then
install_packages "$copydir" "${install_pkgs[@]}"
@@ -386,14 +403,18 @@ main() {
exit 1
fi
download_sources "$copydir" "$src_owner"
download_sources "$copydir" "$makepkg_user"
prepare_chroot "$copydir" "$USER_HOME" "$keepbuilddir" "$run_namcap"
bindmounts_rw+=("${PWD}:/startdir" "${SRCDEST}:/srcdest")
if chroot-run -r "${bindmounts_ro[*]}" -w "${bindmounts_rw[*]}" "$copydir" \
/chrootbuild "${makepkg_args[@]}"; then
if chroot-run \
-r "${bindmounts_ro[*]}" \
-w "${bindmounts_rw[*]}" \
"$copydir" \
/chrootbuild "${makepkg_args[@]}"
then
move_products "$copydir" "$src_owner"
else
(( ret += 1 ))

139
bin/pkg/pkg2yaml.in Normal file
View File

@@ -0,0 +1,139 @@
#!/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
write_attr(){
local ident1="$1" ident2="$2" ident3="$3"
local attrname=$4 attrvalues=("${@:5}")
# normalize whitespace, strip leading and trailing
attrvalues=("${attrvalues[@]//+([[:space:]])/ }")
attrvalues=("${attrvalues[@]#[[:space:]]}")
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")
done
;;
*)
for v in ${attrvalues[@]};do
Yaml+=$(write_yaml_map $ident3 "$attrname" "$v")
done
;;
esac
}
extract_info() {
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[@]}"
fi
}
write_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
for attr in "${singlevalued[@]}"; do
extract_info "$1" "$attr" 0
done
for attr in "${multivalued[@]}"; do
extract_info "$1" "$attr" 1
done
get_pkgbuild_attribute "$1" 'arch' 1 'package_arch'
for a in "${package_arch[@]}"; do
# 'any' is special. there's no support for, e.g. depends_any.
[[ $a = any ]] && continue
for attr in "${multivalued_arch_attrs[@]}"; do
extract_info "$1" "${attr}_$a" 1
done
done
}
write_pkg_yaml(){
local pkgfile=$(print_all_package_names)
Yaml=$(write_yaml_header)
Yaml+=$(write_empty_line)
Yaml+=$(write_yaml_map 0 "pkgbase")
Yaml+=$(write_yaml_map 2 "pkgname" "${pkgbase:-$pkgname}")
${details} && write_details ''
Yaml+=$(write_empty_line)
Yaml+=$(write_yaml_map 0 "package")
for pkg in "${pkgname[@]}"; do
Yaml+=$(write_yaml_seq_map 2 "pkgname" "$pkg")
${details} && write_details "$pkg"
done
Yaml+=$(write_empty_line)
Yaml+=$(write_yaml_map 0 "pkgfile")
for f in ${pkgfile[@]};do
Yaml+=$(write_yaml_seq 2 "${f##*/}")
done
Yaml+=$(write_empty_line)
printf '%s' "${Yaml}"
}
usage() {
echo "Usage: ${0##*/} [options]"
echo " -d Don't include details"
echo ' -h This help'
echo ''
exit $1
}
details=true
opts='dh'
while getopts "${opts}" arg; do
case "${arg}" in
d) details=false ;;
h|?) usage 0 ;;
*) echo "invalid argument '${arg}'"; usage 1 ;;
esac
done
shift $(( $OPTIND - 1 ))
[[ -f "$1"/PKGBUILD ]] || die "%s/PKGBUILD does not exist!" "$1"
PACKAGE="$1"/PKGBUILD; shift
. "$PACKAGE"
write_pkg_yaml

View File

@@ -1,274 +0,0 @@
def ADD_REPO = ''
def RM_REPO = ''
def IS_ADD = 'false'
def IS_REMOVE = 'false'
def IS_BUILD = 'false'
def PKG_TRUNK = ''
def PKG_PATH = ''
pipeline {
agent any
options {
skipDefaultCheckout()
timestamps()
}
stages {
stage('Checkout') {
steps {
script {
checkout scm
def currentCommit = sh(returnStdout: true, script: 'git rev-parse @').trim()
echo "currentCommit: ${currentCommit}"
def changedFilesStatus = sh(returnStdout: true, script: "git show --pretty=format: --name-status ${currentCommit}").tokenize('\n')
def changedPkgStatus = []
def pkgPath = []
int entryCount = 0
for ( int i = 0; i < changedFilesStatus.size(); i++ ) {
def entry = changedFilesStatus[i].split()
def fileStatus = entry[0]
entryCount = entry.size()
for ( int j = 1; j < entry.size(); j++ ) {
if ( entry[j].contains('/PKGBUILD') && entry[j].contains('/repos') ){
changedPkgStatus << "${fileStatus} " + entry[j].minus('/PKGBUILD')
pkgPath << entry[j].minus('/PKGBUILD')
}
}
}
int pkgCount = changedPkgStatus.size()
int pkgPathCount = pkgPath.size()
echo "pkgCount: ${pkgCount}"
echo "entryCount: ${entryCount}"
echo "pkgPathCount: ${pkgPathCount}"
echo "changedPkgStatus: ${changedPkgStatus}"
if ( pkgCount > 0 ) {
if ( entryCount == 2 && pkgCount == 2 ) {
def pkgEntry1 = changedPkgStatus[0].split()
def pkgEntry2 = changedPkgStatus[1].split()
def srcPath = []
def pkgStatus = []
srcPath << pkgEntry1[1]
srcPath << pkgEntry2[1]
pkgStatus << pkgEntry1[0]
pkgStatus << pkgEntry2[0]
def buildInfo1 = srcPath[0].tokenize('/')
def buildInfo2 = srcPath[1].tokenize('/')
if ( pkgStatus[0] == "M" ) {
IS_ADD = 'true'
if ( srcPath[0].contains('community-testing') ) {
ADD_REPO = 'galaxy-gremlins'
} else if ( srcPath[0].contains('community-x86_64') || srcPath[0].contains('community-any') ) {
ADD_REPO = 'galaxy'
}
if ( srcPath[0].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
} else if ( srcPath[0].contains('multilib-x86_64') ) {
ADD_REPO = 'lib32'
}
} else if ( pkgStatus[1] == "M" ) {
IS_ADD = 'true'
if ( srcPath[1].contains('community-testing') ) {
ADD_REPO = 'galaxy-gremlins'
} else if ( srcPath[1].contains('community-x86_64') || srcPath[1].contains('community-any') ) {
ADD_REPO = 'galaxy'
}
if ( srcPath[1].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
} else if ( srcPath[1].contains('multilib-x86_64') ) {
ADD_REPO = 'lib32'
}
}
if ( pkgStatus[0] == "D" ) {
IS_REMOVE = 'true'
if ( srcPath[0].contains('community-testing') ) {
RM_REPO = 'galaxy-gremlins'
} else if ( srcPath[0].contains('community-x86_64') || srcPath[0].contains('community-any') ) {
RM_REPO = 'galaxy'
}
if ( srcPath[0].contains('multilib-testing') ) {
RM_REPO = 'lib32-gremlins'
} else if ( srcPath[0].contains('multilib-x86_64') ) {
RM_REPO = 'lib32'
}
} else if ( pkgStatus[1] == "D" ) {
IS_REMOVE = 'true'
if ( srcPath[1].contains('community-testing') ) {
RM_REPO = 'galaxy-gremlins'
} else if ( srcPath[1].contains('community-x86_64') || srcPath[1].contains('community-any') ) {
RM_REPO = 'galaxy'
}
if ( srcPath[1].contains('multilib-testing') ) {
RM_REPO = 'lib32-gremlins'
} else if ( srcPath[1].contains('multilib-x86_64') ) {
RM_REPO = 'lib32'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( entryCount == 3 && pkgCount == 2 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def buildInfo1 = pkgPath[0].tokenize('/')
def buildInfo2 = pkgPath[1].tokenize('/')
if ( pkgStatus.contains('R') ) {
IS_ADD = 'true'
IS_REMOVE = 'true'
if ( pkgPath[0].contains('community-staging') && pkgPath[1].contains('community-testing') ) {
ADD_REPO = 'galaxy-gremlins'
RM_REPO = 'galaxy-goblins'
} else if ( pkgPath[0].contains('community-testing') && pkgPath[1].contains('community-staging') ) {
ADD_REPO = 'galaxy-goblins'
RM_REPO = 'galaxy-gremlins'
}
if ( pkgPath[0].contains('community-testing') && pkgPath[1].contains('community-x86_64') || pkgPath[0].contains('community-any') ) {
ADD_REPO = 'galaxy-gremlins'
RM_REPO = 'galaxy'
} else if ( pkgPath[0].contains('community-x86_64') || pkgPath[0].contains('community-any') && pkgPath[1].contains('community-testing') ) {
ADD_REPO = 'galaxy'
RM_REPO = 'galaxy-gremlins'
}
if ( pkgPath[0].contains('multilib-staging') && pkgPath[1].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
RM_REPO = 'lib32-goblins'
} else if ( pkgPath[0].contains('multilib-testing') && pkgPath[1].contains('multilib-staging') ) {
ADD_REPO = 'lib32-goblins'
RM_REPO = 'lib32-gremlins'
}
if ( pkgPath[0].contains('multilib-testing') && pkgPath[1].contains('multilib-x86_64') ) {
ADD_REPO = 'lib32'
RM_REPO = 'lib32-gremlins'
} else if ( pkgPath[0].contains('multilib-x86_64') && pkgPath[1].contains('multilib-testing') ) {
ADD_REPO = 'lib32-gremlins'
RM_REPO = 'lib32'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( pkgCount == 1 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def srcPath = pkgEntry[1]
def buildInfo = srcPath.tokenize('/')
if ( srcPath.contains('community-staging') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'galaxy-goblins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('community-testing') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'galaxy-gremlins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('community-x86_64') || srcPath.contains('community-any') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'galaxy'
RM_REPO = ADD_REPO
}
if ( srcPath.contains('multilib-staging') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'lib32-goblins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('multilib-testing') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'lib32-gremlins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('multilib-x86_64') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'lib32'
RM_REPO = ADD_REPO
}
PKG_PATH = srcPath
PKG_TRUNK = buildInfo[0] + '/trunk'
}
}
}
}
}
stage('Build') {
environment {
BUILDBOT_GPGP = credentials('BUILDBOT_GPGP')
}
when {
expression { return IS_BUILD == 'true' }
}
steps {
dir("${PKG_PATH}") {
sh "buildpkg -r ${ADD_REPO}"
}
}
post {
success {
dir("${PKG_PATH}") {
sh "deploypkg -a -d ${ADD_REPO} -s"
}
}
}
}
stage('Add') {
when {
expression { return IS_ADD == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -a -d ${ADD_REPO}"
}
}
}
stage('Remove') {
when {
expression { return IS_REMOVE == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -r -d ${RM_REPO}"
}
}
}
}
}

View File

@@ -1,241 +0,0 @@
def ADD_REPO = ''
def RM_REPO = ''
def IS_ADD = 'false'
def IS_REMOVE = 'false'
def IS_BUILD = 'false'
def PKG_TRUNK = ''
def PKG_PATH = ''
pipeline {
agent any
options {
skipDefaultCheckout()
timestamps()
}
stages {
stage('Checkout') {
steps {
script {
checkout scm
def currentCommit = sh(returnStdout: true, script: 'git rev-parse @').trim()
echo "currentCommit: ${currentCommit}"
def changedFilesStatus = sh(returnStdout: true, script: "git show --pretty=format: --name-status ${currentCommit}").tokenize('\n')
def changedPkgStatus = []
def pkgPath = []
int entryCount = 0
for ( int i = 0; i < changedFilesStatus.size(); i++ ) {
def entry = changedFilesStatus[i].split()
def fileStatus = entry[0]
entryCount = entry.size()
for ( int j = 1; j < entry.size(); j++ ) {
if ( entry[j].contains('/PKGBUILD') && entry[j].contains('/repos') ){
changedPkgStatus << "${fileStatus} " + entry[j].minus('/PKGBUILD')
pkgPath << entry[j].minus('/PKGBUILD')
}
}
}
int pkgCount = changedPkgStatus.size()
int pkgPathCount = pkgPath.size()
echo "pkgCount: ${pkgCount}"
echo "entryCount: ${entryCount}"
echo "pkgPathCount: ${pkgPathCount}"
echo "changedPkgStatus: ${changedPkgStatus}"
if ( pkgCount > 0 ) {
if ( entryCount == 2 && pkgCount == 2 ) {
def pkgEntry1 = changedPkgStatus[0].split()
def pkgEntry2 = changedPkgStatus[1].split()
def srcPath = []
def pkgStatus = []
srcPath << pkgEntry1[1]
srcPath << pkgEntry2[1]
pkgStatus << pkgEntry1[0]
pkgStatus << pkgEntry2[0]
def buildInfo1 = srcPath[0].tokenize('/')
def buildInfo2 = srcPath[1].tokenize('/')
if ( pkgStatus[0] == 'M' ) {
IS_ADD = 'true'
if ( srcPath[0].contains('testing') ) {
ADD_REPO = 'gremlins'
} else if ( srcPath[0].contains('core') ) {
ADD_REPO = 'system'
} else if ( srcPath[0].contains('extra') ) {
ADD_REPO = 'world'
}
} else if ( pkgStatus[1] == 'M' ) {
IS_ADD = 'true'
if ( srcPath[1].contains('testing') ) {
ADD_REPO = 'gremlins'
} else if ( srcPath[1].contains('core') ) {
ADD_REPO = ''
} else if ( srcPath[1].contains('extra') ) {
ADD_REPO = 'world'
}
}
if ( pkgStatus[0] == 'D' ) {
IS_REMOVE = 'true'
if ( srcPath[0].contains('testing') ) {
RM_REPO = 'gremlins'
} else if ( srcPath[0].contains('core') ) {
RM_REPO = 'system'
} else if ( srcPath[0].contains('extra') ) {
RM_REPO = 'world'
}
} else if ( pkgStatus[1] == 'D' ) {
IS_REMOVE = 'true'
if ( srcPath[1].contains('testing') ) {
RM_REPO = 'gremlins'
} else if ( srcPath[1].contains('core') ) {
RM_REPO = 'system'
} else if ( srcPath[1].contains('extra') ) {
RM_REPO = 'world'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( entryCount == 3 && pkgCount == 2 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def buildInfo1 = pkgPath[0].tokenize('/')
def buildInfo2 = pkgPath[1].tokenize('/')
if ( pkgStatus.contains('R') ) {
IS_ADD = 'true'
IS_REMOVE = 'true'
if ( pkgPath[0].contains('staging') && pkgPath[1].contains('testing') ) {
ADD_REPO = 'gremlins'
RM_REPO = 'goblins'
} else if ( pkgPath[0].contains('testing') && pkgPath[1].contains('staging') ) {
ADD_REPO = 'goblins'
RM_REPO = 'gremlins'
}
if ( pkgPath[0].contains('core') && pkgPath[1].contains('testing')) {
ADD_REPO = 'gremlins'
RM_REPO = 'system'
} else if ( pkgPath[0].contains('testing') && pkgPath[1].contains('core')) {
ADD_REPO = 'system'
RM_REPO = 'gremlins'
}
if ( pkgPath[0].contains('extra') && pkgPath[1].contains('testing')) {
ADD_REPO = 'gremlins'
RM_REPO = 'world'
} else if ( pkgPath[0].contains('testing') && pkgPath[1].contains('extra')) {
ADD_REPO = 'world'
RM_REPO = 'gremlins'
}
if ( pkgPath[0].contains('core') && pkgPath[1].contains('extra')) {
ADD_REPO = 'world'
RM_REPO = 'system'
} else if ( pkgPath[0].contains('extra') && pkgPath[1].contains('core')) {
ADD_REPO = 'system'
RM_REPO = 'world'
}
}
PKG_TRUNK = buildInfo1[0] + '/trunk'
}
if ( pkgCount == 1 ) {
def pkgEntry = changedPkgStatus[0].split()
def pkgStatus = pkgEntry[0]
def srcPath = pkgEntry[1]
def buildInfo = srcPath.tokenize('/')
if ( srcPath.contains('staging') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'goblins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('testing') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'gremlins'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('core') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'system'
RM_REPO = ADD_REPO
} else if ( srcPath.contains('extra') ) {
if ( pkgStatus == 'A' || pkgStatus == 'M' ) {
IS_BUILD = 'true'
}
if ( pkgStatus == 'D' ) {
IS_REMOVE = 'true'
}
ADD_REPO = 'world'
RM_REPO = ADD_REPO
}
PKG_PATH = srcPath
PKG_TRUNK = buildInfo[0] + '/trunk'
}
}
}
}
}
stage('Build') {
environment {
BUILDBOT_GPGP = credentials('BUILDBOT_GPGP')
}
when {
expression { return IS_BUILD == 'true' }
}
steps {
dir("${PKG_PATH}") {
sh "buildpkg -r ${ADD_REPO}"
}
}
post {
success {
dir("${PKG_PATH}") {
sh "deploypkg -a -d ${ADD_REPO} -s"
}
}
}
}
stage('Add') {
when {
expression { return IS_ADD == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -a -d ${ADD_REPO}"
}
}
}
stage('Remove') {
when {
expression { return IS_REMOVE == 'true' }
}
steps {
dir("${PKG_TRUNK}") {
sh "deploypkg -r -d ${RM_REPO}"
}
}
}
}
}

View File

@@ -3,60 +3,43 @@
#############################################
# build dir where buildpkg or buildiso chroots are created
# chroots_dir=/var/lib/artools
# CHROOTS_DIR=/var/lib/artools
# the workspace directory
# workspace_dir="/home/${OWNER}/artools-workspace"
# WORKSPACE_DIR="/home/${OWNER}/artools-workspace"
#############################################
################ artools-pkg ################
#############################################
# host_tree_artix='https://github.com/artix-linux'
# gitea user access token
# GIT_TOKEN=''
# host_tree_arch=git://projects.archlinux.org/svntogit
# HOST_TREE_ARTIX='gitea@gitea.artixlinux.org:artix'
# HOST_TREE_ARCH=git://git.archlinux.org/svntogit
# default repos root
# repos_root=${workspace_dir}/repos
# REPOS_ROOT=${WORKSPACE_DIR}/repos
#############################################
################ artools-iso ################
#############################################
# the iso storage directory
# iso_pool="${workspace_dir}/iso"
# ISO_POOL="${WORKSPACE_DIR}/iso"
# the dist release; default: auto
# iso_version=$(date +%Y%m%d)
# ISO_VERSION=$(date +%Y%m%d)
# possible values: openrc, (s6, runit) not yet supported
# initsys="openrc"
# unset defaults to given value
# kernel="linux-lts"
# custom additional kernel args
# kernel_args=""
# possible values: openrc, runit (s6 not yet supported)
# INITSYS="openrc"
# gpg key; leave empty or commented to skip sfs signing
# gpgkey=""
# GPG_KEY=""
# set upload bandwidth limit in kB/s
# uplimit=100
# the torrent tracker urls, comma separated
# tracker_url='udp://mirror.strits.dk:6969'
# file_host="sourceforge.net"
# UPLIMIT=1000
# the server user
# account=[SetUser]
# the server project
# project="artix-linux"
# host mirrors
# host_mirrors=('netcologne' 'freefr' 'netix' 'kent' '10gbps-io')
# Piece size, 2^n
# piece_size=21
# ACCOUNT=[SetUser]

View File

@@ -1,8 +0,0 @@
mkinitcpio-nfs-utils
nbd
>openrc artix-live-openrc
squashfs-tools
artix-live-portable-efi
virtualbox-guest-modules-artix
virtualbox-guest-utils
linux-lts-headers

View File

@@ -1,84 +0,0 @@
acpi
b43-fwcutter
bash
btrfs-progs
bzip2
coreutils
crda
dhclient
diffutils
dmraid
dnsmasq
dosfstools
e2fsprogs
ecryptfs-utils
exfat-utils
f2fs-tools
file
filesystem
findutils
gawk
gcc-libs
gettext
glibc
grep
grub
gzip
inetutils
#intel-ucode
iproute2
iptables
iputils
ipw2100-fw
ipw2200-fw
jfsutils
KERNEL
less
licenses
linux-firmware
logrotate
lsb-release
man-db
man-pages
memtest86+
mkinitcpio-openswap
nano
net-tools
ntfs-3g
>openrc acpid-openrc
>openrc cronie-openrc
>openrc cryptsetup-openrc
>openrc dbus-openrc
>openrc device-mapper-openrc
>openrc dhcpcd-openrc
>openrc elogind-openrc
>openrc haveged-openrc
>openrc lvm2-openrc
>openrc mdadm-openrc
>openrc netifrc
>openrc nfs-utils-openrc
>openrc rsync-openrc
>openrc wpa_supplicant-openrc
>openrc opentmpfiles
os-prober
pacman
pciutils
pcmciautils
perl
procps-ng
psmisc
reiserfsprogs
sed
shadow
s-nail
sudo
sysfsutils
tar
texinfo
usbutils
util-linux
which
efibootmgr
xfsprogs
zd1211-firmware
zsh

View File

@@ -1,49 +0,0 @@
GRUB_DEFAULT=saved
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Artix"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""
# If you want to enable the save default function, uncomment the following
# line, and set GRUB_DEFAULT to saved.
GRUB_SAVEDEFAULT=true
# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos"
# Uncomment to enable Hidden Menu, and optionally hide the timeout count
#GRUB_HIDDEN_TIMEOUT=5
#GRUB_HIDDEN_TIMEOUT_QUIET=true
# Uncomment to use basic console
GRUB_TERMINAL_INPUT=console
# Uncomment to disable graphical terminal
#GRUB_TERMINAL_OUTPUT=console
# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE=auto
# Uncomment to allow the kernel use the same resolution used by grub
GRUB_GFXPAYLOAD_LINUX=keep
# Uncomment if you want GRUB to pass to the Linux kernel the old parameter
# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx"
#GRUB_DISABLE_LINUX_UUID=true
# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY=true
# Uncomment and set to the desired menu colors. Used by normal and wallpaper
# modes only. Entries specified as foreground/background.
GRUB_COLOR_NORMAL="light-gray/black"
GRUB_COLOR_HIGHLIGHT="cyan/black"
# Uncomment one of them for the gfx desired, a image background or a gfxtheme
GRUB_BACKGROUND="/usr/share/grub/background.png"
#GRUB_THEME="/path/to/gfxtheme"
# Uncomment to get a beep at GRUB start
#GRUB_INIT_TUNE="480 440 1"

View File

@@ -1,5 +0,0 @@
#
# /etc/fstab: static file system information
#
# <file system> <dir> <type> <options> <dump> <pass>
/dev/mapper/root-image / auto defaults 0 0

View File

@@ -1,13 +0,0 @@

Artix Live ISO (\l) - \s-\r \m
# Welcome to Artix #
login for the live environment:
user 'artix'
password 'artix'

View File

@@ -1,6 +0,0 @@
#%PAM-1.0
auth sufficient pam_rootok.so
auth sufficient pam_wheel.so trust use_uid
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so

View File

@@ -1 +0,0 @@
%wheel ALL=(ALL) NOPASSWD: ALL

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# 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 cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,9 +63,14 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
[gremlins]
Include = /etc/pacman.d/mirrorlist
# 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.
#[gremlins]
#Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
@@ -73,24 +78,45 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
Include = /etc/pacman.d/mirrorlist
#[galaxy-gremlins]
#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-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[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
#
[testing]
Include = /etc/pacman.d/mirrorlist-arch
#[testing]
#Include = /etc/pacman.d/mirrorlist-arch
[extra]
Include = /etc/pacman.d/mirrorlist-arch
[community-testing]
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,146 @@
#
# /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 -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# 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.
[gnome-wobble]
Include = /etc/pacman.d/mirrorlist
[goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
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-goblins]
#Include = /etc/pacman.d/mirrorlist
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[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
#
[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

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# 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 cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,17 @@ LocalFileSigLevel = Optional
#
# 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.
[goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
@@ -70,15 +81,60 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
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-goblins]
#Include = /etc/pacman.d/mirrorlist
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[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
#
[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

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# 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 cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,9 +63,11 @@ LocalFileSigLevel = Optional
#
# The header [repo-name] is crucial - it must be present and
# uncommented to enable the repo.
#
[goblins]
Include = /etc/pacman.d/mirrorlist
# 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.
[gremlins]
Include = /etc/pacman.d/mirrorlist
@@ -76,33 +78,45 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
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-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[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
#
[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-testing]
#Include = /etc/pacman.d/mirrorlist-arch
#[multilib]
#Include = /etc/pacman.d/mirrorlist-arch

View File

@@ -0,0 +1,146 @@
#
# /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 -C - -f %u > %o
#XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u
#CleanMethod = KeepInstalled
#UseDelta = 0.7
Architecture = auto
# Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup
#IgnorePkg =
#IgnoreGroup =
#NoUpgrade =
#NoExtract =
# 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.
[kde-wobble]
Include = /etc/pacman.d/mirrorlist
[goblins]
Include = /etc/pacman.d/mirrorlist
[gremlins]
Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
[galaxy-goblins]
Include = /etc/pacman.d/mirrorlist
[galaxy-gremlins]
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-goblins]
#Include = /etc/pacman.d/mirrorlist
#[lib32-gremlins]
#Include = /etc/pacman.d/mirrorlist
#[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
#
[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

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# 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 cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,11 @@ LocalFileSigLevel = Optional
#
# 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.
[goblins]
Include = /etc/pacman.d/mirrorlist
@@ -85,6 +90,9 @@ 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-goblins]
Include = /etc/pacman.d/mirrorlist
@@ -94,7 +102,13 @@ Include = /etc/pacman.d/mirrorlist
[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
#

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# 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 cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,11 @@ LocalFileSigLevel = Optional
#
# 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.
[gremlins]
Include = /etc/pacman.d/mirrorlist
@@ -79,13 +84,22 @@ 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-gremlins]
Include = /etc/pacman.d/mirrorlist
[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
#

View File

@@ -44,7 +44,7 @@ LocalFileSigLevel = Optional
# 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 cromnix`.
# packagers with `pacman-key --populate archlinux artix`.
#
# REPOSITORIES
@@ -63,6 +63,14 @@ LocalFileSigLevel = Optional
#
# 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.
#[gremlins]
#Include = /etc/pacman.d/mirrorlist
[system]
Include = /etc/pacman.d/mirrorlist
@@ -70,21 +78,45 @@ Include = /etc/pacman.d/mirrorlist
[world]
Include = /etc/pacman.d/mirrorlist
#[galaxy-gremlins]
#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-gremlins]
#Include = /etc/pacman.d/mirrorlist
[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
#
#[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

@@ -1,27 +0,0 @@
################ install ################
# default displaymanager: none
# supported; lightdm, sddm, gdm, lxdm, mdm
# displaymanager="none"
# Set to false to disable autologin in the livecd
# autologin="true"
# service runlevels
# services=('acpid' 'bluetooth' 'cronie' 'cupsd' 'dbus' 'syslog-ng' 'NetworkManager')
# default values
# addgroups="video,power,storage,optical,network,lp,scanner,wheel,users"
# netgroups_url="https://raw.githubusercontent.com/artix-linux/netgroups/master"
################# live-session #################
# default value
# hostname="artix"
# default value
# username="artix"
# default value
# password="artix"

View File

@@ -1,5 +1,5 @@
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 pcmcia filesystems keyboard keymap)
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

@@ -1,20 +0,0 @@
extra/speexdsp
extra/spandsp
extra/soundtouch
extra/sbc
extra/neon
extra/mjpegtools
extra/libmp4v2
extra/js
extra/gst-plugins-bad
extra/faac
extra/enchant
extra/chromaprint
extra/python-appdirs
extra/python-beaker
extra/python-mako
extra/python-markupsafe
extra/python-packaging
extra/python-pyparsing
extra/ttf-liberation
extra/appstream-glib

View File

@@ -1,3 +1,4 @@
#!/hint/bash
#
# /etc/makepkg.conf
#
@@ -8,9 +9,10 @@
#
#-- The download utilities that makepkg should use to acquire sources
# Format: 'protocol::agent'
DLAGENTS=('ftp::/usr/bin/curl -fC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -fLC - --retry 3 --retry-delay 3 -o %o %u'
DLAGENTS=('file::/usr/bin/curl -gqC - -o %o %u'
'ftp::/usr/bin/curl -gqfC - --ftp-pasv --retry 3 --retry-delay 3 -o %o %u'
'http::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'https::/usr/bin/curl -gqb "" -fLC - --retry 3 --retry-delay 3 -o %o %u'
'rsync::/usr/bin/rsync --no-motd -z %u %o'
'scp::/usr/bin/scp -C %u %o')
@@ -34,8 +36,6 @@ CARCH="x86_64"
CHOST="x86_64-pc-linux-gnu"
#-- Compiler and Linker Flags
# -march (or -mcpu) builds exclusively for an architecture
# -mtune optimizes for an architecture, but builds for whole processor family
CPPFLAGS="-D_FORTIFY_SOURCE=2"
CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
CXXFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fstack-protector-strong -fno-plt"
@@ -50,7 +50,7 @@ DEBUG_CXXFLAGS="-g -fvar-tracking-assignments"
# BUILD ENVIRONMENT
#########################################################################
#
# Defaults: BUILDENV=(!distcc color !ccache check !sign)
# Defaults: BUILDENV=(!distcc !color !ccache check !sign)
# A negated environment option will do the opposite of the comments below.
#
#-- distcc: Use the Distributed C/C++/ObjC compiler
@@ -73,7 +73,7 @@ BUILDENV=(!distcc color !ccache check !sign)
# These are default values for the options=() settings
#########################################################################
#
# Default: OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
# Default: OPTIONS=(!strip docs libtool staticlibs emptydirs !zipman !purge !debug)
# A negated option will do the opposite of the comments below.
#
#-- strip: Strip symbols from binaries/libraries
@@ -83,11 +83,9 @@ BUILDENV=(!distcc color !ccache check !sign)
#-- emptydirs: Leave empty directories in packages
#-- zipman: Compress manual (man and info) pages in MAN_DIRS with gzip
#-- purge: Remove files specified by PURGE_TARGETS
#-- upx: Compress binary executable files using UPX
#-- optipng: Optimize PNG images with optipng
#-- debug: Add debugging flags as specified in DEBUG_* variables
#
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !optipng !upx !debug)
OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug)
#-- File integrity checks to use. Valid: md5, sha1, sha256, sha384, sha512
INTEGRITY_CHECK=(md5)
@@ -103,6 +101,8 @@ MAN_DIRS=({usr{,/local}{,/share},opt/*}/{man,info})
DOC_DIRS=(usr/{,local/}{,share/}{doc,gtk-doc} opt/*/{doc,gtk-doc})
#-- Files to be removed from all packages (if purge is specified)
PURGE_TARGETS=(usr/{,share}/info/dir .packlist *.pod)
#-- Directory to store source code in for debug packages
DBGSRCDIR="/usr/src/debug"
#########################################################################
# PACKAGE OUTPUT
@@ -143,5 +143,3 @@ COMPRESSZ=(compress -c -f)
#
PKGEXT='.pkg.tar.xz'
SRCEXT='.src.tar.gz'
# vim: set ft=sh ts=2 sw=2 et:

View File

@@ -0,0 +1,63 @@
accountsservice
cairo
colord
cppunit
dbus
dbus-glib
dbus-python
desktop-file-utils
fontconfig
geoclue2
glu
gst-plugins-bad
gst-plugins-base
gst-plugins-good
gst-plugins-ugly
gstreamer
harfbuzz
hicolor-icon-theme
libatasmart
libbsd
libdrm
libevdev
libinput
libmbim
libnice
libqmi
libvdpau
libxcb
libxft
libxi
media-player-info
mesa
modemmanager
networkmanager
orc
p11-kit
polkit
poppler
poppler-data
pulseaudio
pyxdg
r
sdl
shared-mime-info
sound-theme-freedesktop
startup-notification
systemdcompat
telepathy-glib
ttf-dejavu
udisks2
upower
wayland
wayland-protocols
webrtc-audio-processing
xcb-proto
xcb-util
xcb-util-cursor
xcb-util-image
xcb-util-keysyms
xcb-util-renderutil
xcb-util-wm
xdg-user-dirs
xdg-utils

63
data/pkglists/gnome.list Normal file
View File

@@ -0,0 +1,63 @@
adwaita-icon-theme
atk
at-spi2-atk
at-spi2-core
babl
cantarell-fonts
cogl
dconf
flatpak
gamin
gcab
gconf
gcr
gdk-pixbuf2
gegl02
git
glade
glib2
glib-networking
gnome-common
gnome-keyring
gobject-introspection
gsettings-desktop-schemas
gssdp
gtk2
gtk3
gtk-doc
gtksourceview3
gupnp
gupnp-igd
gvfs
json-glib
libcloudproviders
libcroco
libgee
libglade
libgnome-keyring
libgudev
libnotify
librsvg
libsecret
libsoup
libxml2
libxslt
meld
mobile-broadband-provider-info
modemmanager
networkmanager
network-manager-applet
orca
ostree
pango
pyatspi
pygobject
pygobject2
pygtk
rest
ttf-bitstream-vera
vala
vte
vte3
yelp-tools
yelp-xsl

4
data/pkglists/kde.list Normal file
View File

@@ -0,0 +1,4 @@
phonon-gstreamer
polkit-qt
extra-cmake-modules
phonon

16
data/pkglists/kernel.list Normal file
View File

@@ -0,0 +1,16 @@
linux
nvidia
acpi_call
bbswitch
broadcom-wl
tp_smapi
r8168
virtualbox-modules-artix
linux-lts
nvidia-lts
acpi_call-lts
bbswitch-lts
broadcom-wl-lts
tp_smapi-lts
r8168-lts
linux-firmware

37
data/pkglists/xorg.list Normal file
View File

@@ -0,0 +1,37 @@
libdmx
libfontenc
libice
libpciaccess
libsm
libx11
libxau
libxaw
libxcomposite
libxcursor
libxdamage
libxdmcp
libxext
libxfixes
libxfont2
libxi|libxft
libxinerama
libxkbfile
libxkbui
libxmu
libxpm
libxrandr
libxrender
libxres
libxshmfence
libxss
libxt
libxtst
libxv
libxvmc
libxxf86vm
pixman
xbitmaps
xkeyboard-config
xorgproto
xterm
xtrans

View File

@@ -1,45 +0,0 @@
qt5-base
qt5-xmlpatterns
qt5-x11extras
qt5-script
qt5-svg
qt5-serialport
qt5-serialbus
qt5-networkauth
qt5-imageformats
qt5-declarative
qt5-wayland
qt5-sensors
qt5-scxml
qt5-connectivity
qt5-graphicaleffects
qt5-gamepad
qt5-3d
qt5-canvas3d
qt5-datavis3d
qt5-charts
qt5-virtualkeyboard
qt5-location
qt5-multimedia
qt5-speech
qt5-quickcontrols
qt5-quickcontrols2
qt5-remoteobjects
qt5-webchannel
qt5-websockets
qt5-webglplugin
qt5-tools
qt5-translations
qt5-doc
qt5-examples
qt5-webengine
qt5-webview
qt5-webkit
python2-pyqt5
python-pyqt5
pyqt5-common

23
initcpio/Makefile Normal file
View File

@@ -0,0 +1,23 @@
DIRMODE = -dm0755
MODE = -m0755
CPIOHOOKS = \
$(wildcard hooks/*)
CPIOINST = \
$(wildcard install/*)
SCRIPT = \
$(wildcard script/*)
install_initcpio:
install $(DIRMODE) $(DESTDIR)$(CPIODIR)/hooks
install $(MODE) $(CPIOHOOKS) $(DESTDIR)$(CPIODIR)/hooks
install $(DIRMODE) $(DESTDIR)$(CPIODIR)/install
install $(MODE) $(CPIOINST) $(DESTDIR)$(CPIODIR)/install
install $(MODE) $(SCRIPT) $(DESTDIR)$(CPIODIR)
install: install_initcpio
.PHONY: install

View File

@@ -32,6 +32,10 @@ _mnt_dmsnapshot() {
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"
fi
_mnt_dev "/dev/mapper/${dm_snap_name}" "${mnt}" "-w" "defaults"
echo $(readlink -f /dev/mapper/${dm_snap_name}) >> /run/artix/used_block_devices
}

View File

@@ -7,16 +7,6 @@ build() {
add_module "via-agp"
add_module "sis-agp"
add_module "intel-agp"
if [[ $(uname -m) == i686 ]]; then
add_module "amd64-agp"
add_module "ati-agp"
add_module "sworks-agp"
add_module "ali-agp"
add_module "amd-k7-agp"
add_module "nvidia-agp"
add_module "efficeon-agp"
fi
}
help() {

View File

@@ -1,38 +0,0 @@
#!/bin/ash
# /oldroot depends on things inside /oldroot/run/miso...
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/miso/bootmnt") print $3}' | sort -r)
# Remove all dm-snapshot devices.
dmsetup remove_all
# Remove all loopback devices.
for _lup in $(grep ^/dev/loop /oldrun/miso/used_block_devices | tac); do
if ! losetup -d ${_lup} 2> /dev/null; then
umount -d ${_lup}
fi
done
# Unmount the space used to store *.cow.
umount /oldrun/miso/cowspace
# Unmount boot device if needed (no copytoram=y used)
if [[ ! -d /oldrun/miso/copytoram ]]; then
if [[ -d /oldrun/miso/img_dev ]]; then
umount /oldrun/miso/img_dev
else
umount /oldrun/miso/bootmnt
fi
fi
# reboot / poweroff / halt, depending on the argument passed by init
# if something invalid is passed, we halt
case "$1" in
reboot|poweroff|halt) "$1" -f ;;
*) halt -f;;
esac

60
lib/base/chroot.sh Normal file
View File

@@ -0,0 +1,60 @@
#!/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.
is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
}
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 "$1")" ]]
}
subvolume_delete_recursive() {
local subvol
is_subvolume "$1" || return 0
while IFS= read -d $'\0' -r subvol; do
if ! subvolume_delete_recursive "$subvol"; then
return 1
fi
done < <(find "$1" -mindepth 1 -xdev -depth -inum 256 -print0)
if ! btrfs subvolume delete "$1" &>/dev/null; then
error "Unable to delete subvolume %s" "$subvol"
return 1
fi
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
}

View File

@@ -1,4 +1,8 @@
#!/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.
@@ -11,6 +15,7 @@
declare -A pseudofs_types=([anon_inodefs]=1
[autofs]=1
[bdev]=1
[bpf]=1
[binfmt_misc]=1
[cgroup]=1
[cgroup2]=1
@@ -21,6 +26,7 @@ declare -A pseudofs_types=([anon_inodefs]=1
[devpts]=1
[devtmpfs]=1
[dlmfs]=1
[efivarfs]=1
[fuse.gvfs-fuse-daemon]=1
[fusectl]=1
[hugetlbfs]=1

View File

@@ -1,4 +1,8 @@
#!/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.
@@ -11,8 +15,6 @@
# export LC_MESSAGES=C
export LANG=C
source /usr/share/makepkg/util.sh
if [[ -t 2 ]]; then
colorize
else
@@ -62,8 +64,30 @@ slock() {
fi
}
_setup_workdir=false
setup_workdir() {
[[ -z ${WORKDIR:-} ]] && WORKDIR=$(mktemp -d --tmpdir "${0##*/}.XXXXXXXXXX")
_setup_workdir=true
trap 'trap_abort' INT QUIT TERM HUP
trap 'trap_exit' EXIT
}
trap_abort() {
trap - EXIT INT QUIT TERM HUP
abort
}
trap_exit() {
local r=$?
trap - EXIT INT QUIT TERM HUP
cleanup $r
}
cleanup() {
exit ${1:-0}
if [[ -n ${WORKDIR:-} ]] && $_setup_workdir; then
rm -rf "$WORKDIR"
fi
exit "${1:-0}"
}
abort() {
@@ -100,11 +124,3 @@ msg_row_upgrade(){
local mesg=$1; shift
printf "${RED}${RED} ${mesg} ${ALL_OFF}\n" "$@" >&2
}
import(){
if [[ -r "$1" ]];then
source "$1"
else
die 'Could not import %s' "$1"
fi
}

148
lib/base/mount.sh Normal file
View File

@@ -0,0 +1,148 @@
#!/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.
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
}
chroot_mount() {
# info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
}
chroot_add_resolv_conf() {
local chrootdir=$1 resolv_conf=$1/etc/resolv.conf
[[ -e /etc/resolv.conf ]] || return 0
# Handle resolv.conf as a symlink to somewhere else.
if [[ -L $chrootdir/etc/resolv.conf ]]; then
# readlink(1) should always give us *something* since we know at this point
# it's a symlink. For simplicity, ignore the case of nested symlinks.
resolv_conf=$(readlink "$chrootdir/etc/resolv.conf")
if [[ $resolv_conf = /* ]]; then
resolv_conf=$chrootdir$resolv_conf
else
resolv_conf=$chrootdir/etc/$resolv_conf
fi
# ensure file exists to bind mount over
if [[ ! -f $resolv_conf ]]; then
install -Dm644 /dev/null "$resolv_conf" || return 1
fi
elif [[ ! -e $chrootdir/etc/resolv.conf ]]; then
# The chroot might not have a resolv.conf.
return 0
fi
chroot_mount /etc/resolv.conf "$resolv_conf" --bind
}
chroot_mount_conditional() {
local cond=$1; shift
if eval "$cond"; then
chroot_mount "$@"
fi
}
chroot_setup(){
local mnt="$1" os="$2" run_args='-t tmpfs -o nosuid,nodev,mode=0755'
$os && run_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 &&
ignore_error chroot_mount_conditional "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \
efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
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 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
chroot_setup "$1" false
}
chroot_api_umount() {
if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then
# info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
fi
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
}

182
lib/base/util.sh Normal file
View File

@@ -0,0 +1,182 @@
#!/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)"
}
load_vars() {
local var
[[ -f $1 ]] || return 1
for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER CARCH GPGKEY; do
[[ -z ${!var:-} ]] && eval "$(grep -a "^${var}=" "$1")"
done
return 0
}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p $1
}
get_disturl(){
. /usr/lib/os-release
echo "${HOME_URL}"
}
get_osname(){
. /usr/lib/os-release
echo "${NAME}"
}
init_artools_base(){
ARCH=$(uname -m)
CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'}
WORKSPACE_DIR=${WORKSPACE_DIR:-"/home/${OWNER}/artools-workspace"}
prepare_dir "${WORKSPACE_DIR}"
}
init_artools_pkg(){
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-qt5
packages-ruby
# packages-desktop
# packages-kde
# packages-gnome
)
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"}
}
init_artools_iso(){
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'}
}
load_config(){
local conf="$1"
[[ -f "$conf" ]] || return 1
[[ -r "$conf" ]] && . "$conf"
init_artools_base
init_artools_pkg
init_artools_iso
return 0
}
user_own(){
local flag=$2
chown ${flag} "${OWNER}:$(id --group ${OWNER})" "$1"
}
user_run(){
su ${OWNER} -c "$@"
}
load_user_info(){
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}"
prepare_dir "${USERCONFDIR}"
}
# 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
}

36
lib/base/yaml.sh Normal file
View File

@@ -0,0 +1,36 @@
#!/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.
write_yaml_header(){
printf '%s' '---'
}
write_empty_line(){
printf '\n%s\n' ' '
}
write_yaml_map(){
local ident="$1" key="$2" val="$3"
printf "\n%${ident}s%s: %s\n" '' "$key" "$val"
}
write_yaml_seq(){
local ident="$1" val="$2"
printf "\n%${ident}s- %s\n" '' "$val"
}
write_yaml_seq_map(){
local ident="$1" key="$2" val="$3"
printf "\n%${ident}s- %s: %s\n" '' "$key" "$val"
}

160
lib/iso/chrootcfg.sh Normal file
View File

@@ -0,0 +1,160 @@
#!/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_rc(){
local mnt="$1" name="$2" rlvl="$3"
if [[ -f $mnt/etc/init.d/$name ]];then
msg2 "Setting %s ..." "$name"
chroot $mnt rc-update add $name $rlvl &>/dev/null
fi
}
add_svc_runit(){
local mnt="$1" name="$2"
if [[ -d $mnt/etc/runit/sv/$name ]]; then
msg2 "Setting %s ..." "$name"
chroot $mnt ln -s /etc/runit/sv/$name /etc/runit/runsvdir/default &>/dev/null
fi
}
set_xdm(){
if [[ -f $1/etc/conf.d/xdm ]];then
local conf='DISPLAYMANAGER="'${DISPLAYMANAGER}'"'
sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm
fi
}
configure_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]" "${INITSYS}"
case ${INITSYS} in
'openrc')
for svc in ${SERVICES[@]}; do
[[ $svc == "xdm" ]] && set_xdm "$mnt"
add_svc_rc "$mnt" "$svc" "default"
done
for svc in ${SERVICES_LIVE[@]}; do
add_svc_rc "$mnt" "$svc" "default"
done
;;
'runit')
for svc in ${SERVICES[@]}; do
add_svc_runit "$mnt" "$svc"
done
for svc in ${SERVICES_LIVE[@]}; do
add_svc_runit "$mnt" "$svc"
done
;;
esac
info "Done configuring [%s]" "${INITSYS}"
}
configure_system(){
local mnt="$1"
case ${INITSYS} in
'openrc' | 'runit')
configure_logind "$mnt" "elogind"
;;
esac
echo ${HOST_NAME} > $mnt/etc/hostname
}
write_users_conf(){
local yaml=$(write_yaml_header)
yaml+=$(write_empty_line)
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_servicescfg_conf(){
local yaml=$(write_yaml_header)
yaml+=$(write_empty_line)
case "${INITSYS}" in
'runit')
yaml+=$(write_yaml_map 0 'svDir' '/etc/runit/sv')
yaml+=$(write_yaml_map 0 'runsvDir' '/etc/runit/runsvdir')
yaml+=$(write_yaml_map 0 'services')
yaml+=$(write_yaml_map 2 'enabled')
for svc in ${SERVICES[@]};do
yaml+=$(write_yaml_seq_map 4 'name' "$svc")
yaml+=$(write_yaml_map 6 'runlevel' 'default')
done
;;
'openrc')
yaml+=$(write_yaml_map 0 'initdDir' '/etc/init.d')
yaml+=$(write_yaml_map 0 'runlevelsDir' '/etc/runlevels')
yaml+=$(write_yaml_map 0 'services')
for svc in ${SERVICES[@]};do
yaml+=$(write_yaml_seq_map 2 'name' "$svc")
yaml+=$(write_yaml_map 4 'runlevel' 'default')
done
;;
esac
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_servicescfg_conf > "$mods"/services-"${INITSYS}".conf
sed -e "s|openrc|${INITSYS}|" -i "$mods"/postcfg.conf
sed -e "s|services-openrc|services-${INITSYS}|" -i "$1"/etc/calamares/settings.conf
fi
}
configure_live_image(){
local fs="$1"
msg "Configuring [livefs]"
configure_hosts "$fs"
configure_system "$fs"
configure_services "$fs"
configure_calamares "$fs"
[[ ! -d "$fs/etc/artools" ]] && mkdir -p "$fs/etc/artools"
write_live_session_conf > "$fs/etc/artools/live.conf"
msg "Done configuring [livefs]"
}

View File

@@ -1,12 +1,15 @@
#!/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
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
prepare_initcpio(){
@@ -19,46 +22,50 @@ prepare_initcpio(){
prepare_initramfs(){
local mnt="$1"
cp ${DATADIR}/mkinitcpio.conf $mnt/etc/mkinitcpio-${iso_name}.conf
if [[ -n ${gpgkey} ]]; then
user_run "gpg --export ${gpgkey} >${AT_USERCONFDIR}/gpgkey"
exec 17<>${AT_USERCONFDIR}/gpgkey
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
user_run "gpg --export ${GPG_KEY} >${USERCONFDIR}/artools/gpgkey"
exec 17<>${USERCONFDIR}/artools/GPG_KEY
fi
local _kernel=$(cat $mnt/usr/lib/modules/*/version)
ARTIX_GNUPG_FD=${gpgkey:+17} chroot-run $mnt \
ARTIX_GNUPG_FD=${GPG_KEY:+17} chroot-run $mnt \
/usr/bin/mkinitcpio -k ${_kernel} \
-c /etc/mkinitcpio-${iso_name}.conf \
-c /etc/mkinitcpio-artix.conf \
-g /boot/initramfs.img
if [[ -n ${gpgkey} ]]; then
if [[ -n ${GPG_KEY} ]]; then
exec 17<&-
fi
if [[ -f ${AT_USERCONFDIR}/gpgkey ]]; then
rm ${AT_USERCONFDIR}/gpgkey
if [[ -f ${USERCONFDIR}/artools/GPG_KEY ]]; then
rm ${USERCONFDIR}/artools/GPG_KEY
fi
}
prepare_boot_extras(){
local src="$1" dest="$2"
# cp $src/boot/intel-ucode.img $dest/intel_ucode.img
# cp $src/usr/share/licenses/intel-ucode/LICENSE $dest/intel_ucode.LICENSE
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
}
configure_grub(){
local conf="$1"
sed -e "s|@arch@|${target_arch}|g" \
-e "s|@iso_label@|${iso_label}|" \
-e "s|@iso_name@|${iso_name}|g" \
-e "s|@kernel_args@|${kernel_args}|g" \
-i $conf
local conf="$1/boot/grub/kernels.cfg"
sed -e "s|@iso_label@|${iso_label}|" -i $conf
}
prepare_grub(){
local platform=i386-pc img='core.img' grub=$3/boot/grub efi=$3/efi/boot \
lib=$1/usr/lib/grub prefix=/boot/grub theme=$2/usr/share/grub data=$1/usr/share/grub
lib=$1/usr/lib/grub prefix=/boot/grub theme=$2/usr/share/grub
prepare_dir ${grub}/${platform}
@@ -72,16 +79,8 @@ prepare_grub(){
cat ${grub}/${platform}/cdboot.img ${grub}/${platform}/${img} > ${grub}/${platform}/eltorito.img
case ${target_arch} in
'i686')
platform=i386-efi
img=bootia32.efi
;;
'x86_64')
platform=x86_64-efi
img=bootx64.efi
;;
esac
platform=x86_64-efi
img=bootx64.efi
prepare_dir ${efi}
prepare_dir ${grub}/${platform}
@@ -93,10 +92,17 @@ prepare_grub(){
grub-mkimage -d ${grub}/${platform} -o ${efi}/${img} -O ${platform} -p ${prefix} iso9660
prepare_dir ${grub}/themes
cp -r ${theme}/themes/${iso_name} ${grub}/themes/
cp ${data}/unicode.pf2 ${grub}
cp -r ${theme}/themes/artix ${grub}/themes/
cp -r ${theme}/{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
else
msg2 "Creating %s ..." "unicode.pf2"
grub-mkfont -o ${grub}/unicode.pf2 /usr/share/fonts/misc/unifont.bdf
fi
local size=4M mnt="${mnt_dir}/efiboot" efi_img="$3/efi.img"
msg2 "Creating fat image of %s ..." "${size}"
truncate -s ${size} "${efi_img}"

147
lib/iso/iso.sh Normal file
View File

@@ -0,0 +1,147 @@
#!/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.
gen_iso_fn(){
local vars=("artix") name
vars+=("${PROFILE}")
vars+=("${INITSYS}")
case "${REPOSITORY}" in
'gremlins'|'goblins') vars+=("${REPOSITORY}") ;;
esac
vars+=("${ISO_VERSION}")
vars+=("${ARCH}")
for n in ${vars[@]};do
name=${name:-}${name:+-}${n}
done
echo $name
}
clean_iso_root(){
local dest="$1"
msg "Deleting isoroot [%s] ..." "${dest##*/}"
rm -rf --one-file-system "$dest"
}
make_sig () {
local idir="$1" file="$2"
msg2 "Creating signature file..."
cd "$idir"
user_own "$idir"
user_run "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}"
}
assemble_iso(){
msg "Creating ISO image..."
local mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
xorriso -as mkisofs \
--modification-date=${mod_date} \
--protective-msdos-label \
-volid "${iso_label}" \
-appid "$(get_osname) Live/Rescue CD" \
-publisher "$(get_osname) <$(get_disturl)>" \
-preparer "Prepared by artools/${0##*/}" \
-r -graft-points -no-pad \
--sort-weight 0 / \
--sort-weight 1 /boot \
--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 \
-e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \
-no-emul-boot \
-iso-level 3 \
-o ${iso_dir}/${iso_file} \
${iso_root}/
}

68
lib/iso/mount.sh Normal file
View File

@@ -0,0 +1,68 @@
#!/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.
track_img() {
info "mount: [%s]" "$2"
mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}")
}
mount_img() {
IMG_ACTIVE_MOUNTS=()
mkdir -p "$2"
track_img "$1" "$2"
}
umount_img() {
if [[ -n ${IMG_ACTIVE_MOUNTS[@]} ]];then
info "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}"
umount "${IMG_ACTIVE_MOUNTS[@]}"
unset IMG_ACTIVE_MOUNTS
rm -r "$1"
fi
}
track_fs() {
info "overlayfs mount: [%s]" "$5"
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
}
mount_overlay(){
FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2" pkglist="$3"
local fs=${upper##*/}
local rootfs="$work/rootfs" desktopfs="$work/desktopfs" livefs="$work/livefs"
mkdir -p "${mnt_dir}/work"
mkdir -p "$upper"
case $fs in
desktopfs) lower="$rootfs" ;;
livefs)
lower="$rootfs"
[[ -f $pkglist ]] && lower="$desktopfs":"$rootfs"
;;
bootfs)
lower="$livefs":"$rootfs"
[[ -f $pkglist ]] && lower="$livefs":"$desktopfs":"$rootfs"
;;
esac
track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
}
umount_overlay(){
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
}

119
lib/iso/profile.sh Normal file
View File

@@ -0,0 +1,119 @@
#!/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.
init_profile(){
local profdir="$1" prof="$2"
ROOT_LIST="$profdir/base/Packages-Root"
ROOT_OVERLAY="$profdir/base/root-overlay"
LIVE_LIST="$profdir/base/Packages-Live"
LIVE_OVERLAY="$profdir/base/live-overlay"
[[ -f "$profdir/$prof/Packages-Root" ]] && ROOT_LIST="$profdir/$prof/Packages-Root"
[[ -d "$profdir/$prof/root-overlay" ]] && ROOT_OVERLAY="$profdir/$prof/root-overlay"
[[ -f "$profdir/$prof/Packages-Desktop" ]] && DESKTOP_LIST="$profdir/$prof/Packages-Desktop"
[[ -d "$profdir/$prof/desktop-overlay" ]] && DESKTOP_OVERLAY="$profdir/$prof/desktop-overlay"
[[ -f "$profdir/$prof/Packages-Live" ]] && LIVE_LIST="$profdir/$prof/Packages-Live"
[[ -d "$profdir/$prof/live-overlay" ]] && LIVE_OVERLAY="$profdir/$prof/live-overlay"
}
show_profile(){
msg2 "iso_file: %s" "${iso_file}"
msg2 "AUTOLOGIN: %s" "${AUTOLOGIN}"
msg2 "HOST_NAME: %s" "${HOST_NAME}"
msg2 "USER_NAME: %s" "${USER_NAME}"
msg2 "PASSWORD: %s" "${PASSWORD}"
msg2 "ADDGROUPS: %s" "${ADDGROUPS}"
msg2 "SERVICES_LIVE: %s" "${SERVICES_LIVE[*]}"
msg2 "SERVICES: %s" "${SERVICES[*]}"
}
load_profile(){
local prof="$1"
local profdir="${DATADIR}/iso-profiles"
[[ -d ${WORKSPACE_DIR}/iso-profiles ]] && profdir=${WORKSPACE_DIR}/iso-profiles
init_profile "$profdir" "$prof"
[[ -f $profdir/$prof/profile.conf ]] || return 1
[[ -r $profdir/$prof/profile.conf ]] && . $profdir/$prof/profile.conf
DISPLAYMANAGER=${DISPLAYMANAGER:-'none'}
AUTOLOGIN=${AUTOLOGIN:-"true"}
[[ ${DISPLAYMANAGER} == 'none' ]] && AUTOLOGIN="false"
HOST_NAME=${HOST_NAME:-'artix'}
USER_NAME=${USER_NAME:-'artix'}
PASSWORD=${PASSWORD:-'artix'}
ADDGROUPS=${ADDGROUPS:-"video,power,cdrom,network,lp,scanner,wheel,users,log"}
if [[ -z ${SERVICES[@]} ]];then
SERVICES=('acpid' 'bluetooth' 'cronie' 'cupsd' 'syslog-ng' 'NetworkManager')
fi
if [[ ${DISPLAYMANAGER} != "none" ]];then
case "${INITSYS}" in
'openrc') SERVICES+=('xdm') ;;
'runit') SERVICES+=("${DISPLAYMANAGER}") ;;
esac
fi
if [[ -z ${SERVICES_LIVE[@]} ]];then
SERVICES_LIVE=('artix-live' 'pacman-init')
fi
return 0
}
write_live_session_conf(){
msg2 "Writing live.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##*/}"
local _init="s|@$init||g"
case "$init" in
'openrc') _init_rm1="s|@runit.*||g"; _init_rm2="s|@s6*||g" ;;
's6') _init_rm1="s|@runit.*||g"; _init_rm2="s|@openrc.*||g" ;;
'runit') _init_rm1="s|@s6.*||g"; _init_rm2="s|@openrc.*||g" ;;
esac
local _space="s| ||g" \
_clean=':a;N;$!ba;s/\n/ /g' \
_com_rm="s|#.*||g"
packages=($(sed "$_com_rm" "$pkglist" \
| sed "$_space" \
| sed "$_purge" \
| sed "$_init" \
| sed "$_init_rm1" \
| sed "$_init_rm2" \
| sed "$_clean"))
}

282
lib/iso/util.sh Normal file
View File

@@ -0,0 +1,282 @@
#!/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() {
if [[ -p $logpipe ]]; then
rm "$logpipe"
fi
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
}
# $1: function
run_log(){
local func="$1" log_dir='/var/log/artools'
[[ ! -d $log_dir ]] && mkdir -p $log_dir
local logfile=${log_dir}/$(gen_iso_fn).$func.log
logpipe=$(mktemp -u "/tmp/$func.pipe.XXXXXXXX")
mkfifo "$logpipe"
tee "$logfile" < "$logpipe" &
local teepid=$!
$func &> "$logpipe"
wait $teepid
rm "$logpipe"
}
run_safe() {
local restoretrap func="$1"
set -e
set -E
restoretrap=$(trap -p ERR)
trap 'error_function $func' ERR
if ${log};then
run_log "$func"
else
"$func"
fi
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]"
}
install_packages(){
local fs="$1"
setarch "${ARCH}" mkchroot \
"${mkchroot_args[@]}" "${fs}" "${packages[@]}"
}
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##*/}"
if [[ -f "$mnt/etc/locale.gen.orig" ]];then
mv "$mnt/etc/locale.gen.orig" "$mnt/etc/locale.gen"
rm "$mnt/etc/locale.conf"
fi
path=$mnt/boot
if [[ -d "$path" ]]; then
find "$path" -name 'initramfs*.img' -delete &> /dev/null
fi
path=$mnt/var/lib/pacman/sync
if [[ -d $path ]];then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/cache/pacman/pkg
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/log
if [[ -d $path ]]; then
find "$path" -type f -delete &> /dev/null
fi
path=$mnt/var/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
path=$mnt/tmp
if [[ -d $path ]];then
find "$path" -mindepth 1 -delete &> /dev/null
fi
if [[ ${mnt##*/} == 'livefs' ]];then
rm -rf "$mnt/etc/pacman.d/gnupg"
fi
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}"
install_packages "${rootfs}"
copy_overlay "${ROOT_OVERLAY}" "${rootfs}"
clean_up_image "${rootfs}"
msg "Done [Base installation] (rootfs)"
fi
}
make_desktopfs() {
if [[ ! -e ${work_dir}/desktopfs.lock ]]; then
msg "Prepare [Desktop installation] (desktopfs)"
local desktopfs="${work_dir}/desktopfs"
prepare_dir "${desktopfs}"
mount_overlay "${desktopfs}" "${work_dir}"
install_packages "${desktopfs}"
copy_overlay "${DESKTOP_OVERLAY}" "${desktopfs}"
umount_overlay
clean_up_image "${desktopfs}"
msg "Done [Desktop installation] (desktopfs)"
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}" "${DESKTOP_LIST}"
install_packages "${livefs}"
copy_overlay "${LIVE_OVERLAY}" "${livefs}"
configure_live_image "${livefs}"
umount_overlay
clean_up_image "${livefs}"
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}" "${DESKTOP_LIST}"
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]"
prepare_grub "${work_dir}/rootfs" "${work_dir}/livefs" "${iso_root}"
configure_grub "${iso_root}"
: > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
compress_images(){
local timer=$(get_timer)
run_safe "make_iso"
user_own "${iso_dir}" "-R"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
prepare_images(){
local timer=$(get_timer)
load_pkgs "${ROOT_LIST}" "${INITSYS}"
run_safe "make_rootfs"
if [[ -f "${DESKTOP_LIST}" ]] ; then
load_pkgs "${DESKTOP_LIST}" "${INITSYS}"
run_safe "make_desktopfs"
fi
if [[ -f ${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}"
}

60
lib/pkg/gitea.sh Normal file
View File

@@ -0,0 +1,60 @@
#!/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"
}
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")
msg2 "Adding package repo [%s] to team (%s)" "$pkg" "$team"
curl -s -X PUT "${GIT_URL}/api/v1/teams/$id/repos/$org/$pkg?access_token=${GIT_TOKEN}" \
-H "accept: application/json"
}

171
lib/pkg/subrepo.sh Normal file
View File

@@ -0,0 +1,171 @@
#!/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=${pkg:0:6}; sub="${org:5}"; echo "packagesRuby" ;;
perl-*) org=${pkg:0:6}; sub="${org:5}"; echo "packagesPerl" ;;
python-*) org=${pkg:0:8}; sub="${org:7}"; echo "packagesPython" ;;
python2-*) org=${pkg:0:9}; sub="${org:8}"; echo "packagesPython" ;;
lib32*) org=${pkg:0:7}; sub="${org:6}"; echo "packagesL" ;; #"packages${sub^^}" ;;
# lib*) org=${pkg:0:4}; sub="${org:3}"; echo "packagesLib${sub^^}" ;;
*) org=${pkg:0:1}; echo "packages${org^^}" ;;
esac
}
subrepo_push(){
local pkg="$1"
msg2 "Push (%s)" "$pkg"
git subrepo push "$pkg"
}
subrepo_config(){
local pkg="$1" org="$2"
local gitname=$(get_compliant_name "$pkg")
local url=gitea@"${GIT_DOMAIN}":"$org"/"$gitname".git
msg2 "Update .gitrepo (%s) [%s]" "$pkg" "$url"
git subrepo config "$pkg" remote "$url"
}
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"
msg "Cloning (%s) ..." "$tree"
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 local_head=${2:-$(get_local_head)}
local remote_head=$(get_remote_head)
msg "Checking (%s)" "${tree}"
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 ..
}
subrepo_new(){
local pkg="$1" tree="$2" team="${3:-$2}"
local dest=${TREE_DIR_ARTIX}/$tree/$pkg/trunk
cd ${TREE_DIR_ARTIX}/$tree
local org=$(get_pkg_org "$pkg")
create_repo "$pkg" "$org"
add_repo_to_team "$pkg" "$org" "$team"
subrepo_clone "$pkg" "$org"
prepare_dir "$dest"
commit_jenkins_files "$pkg"
}

View File

@@ -1,5 +1,8 @@
#!/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.
@@ -9,33 +12,23 @@
# 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/$1^ | head -n 1)
}
get_remote_head(){
echo $(git ls-remote origin -h refs/heads/$1 | cut -f1)
}
is_dirty() {
[[ $(git diff --shortstat 2> /dev/null | tail -n1) != "" ]] || return 1
return 0
}
is_untracked(){
[[ $(git ls-files --others --exclude-standard) != "" ]] || return 1
return 0
get_compliant_name(){
local gitname="$1"
case $gitname in
*+) gitname=${gitname//+/plus}
esac
echo $gitname
}
patch_pkg(){
local pkg="$1" repo="$2"
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
;;
'tp_smapi'|'acpi_call'|'r8168'|'bbswitch')
'tp_smapi'|'acpi_call'|'r8168'|'bbswitch'|'broadcom-wl')
sed -e 's|-ARCH|-ARTIX|g' -i $pkg/trunk/PKGBUILD
;;
'nvidia')
@@ -45,8 +38,8 @@ patch_pkg(){
;;
'linux')
sed -e 's|-ARCH|-ARTIX|g' -i $pkg/trunk/PKGBUILD
sed -e 's|CONFIG_LOCALVERSION=.*|CONFIG_LOCALVERSION="-ARTIX"|' \
-e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \
-e 's|CONFIG_CRYPTO_SPECK=.*|CONFIG_CRYPTO_SPECK=n|' \
-i $pkg/trunk/config
cd $pkg/trunk
updpkgsums
@@ -68,110 +61,73 @@ patch_pkg(){
updpkgsums
cd ../..
;;
gstreamer|gst-plugins-*)
sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \
-e 's|(Arch Linux)|(Artix Linux)|' \
-i $pkg/trunk/PKGBUILD
;;
esac
}
get_import_path(){
local tree="$1" import_path=
case $tree in
packages) import_path=${tree_dir_arch}/packages ;;
packages-galaxy) import_path=${tree_dir_arch}/community ;;
esac
echo $import_path
find_tree(){
local tree="$1" pkg="$2"
local result=$(find $tree -mindepth 2 -maxdepth 2 -type d -name "$pkg")
result=${result%/*}
echo ${result##*/}
}
find_repo(){
local pkg="$1" repo=
local pkg="$1" stag="$2" unst="$3" repo=
local repos=(core extra testing community community-testing multilib multilib-testing)
if [[ -d $pkg/repos/core-x86_64 ]];then
repo=core-x86_64
elif [[ -d $pkg/repos/core-any ]];then
repo=core-any
fi
if [[ -d $pkg/repos/extra-x86_64 ]];then
repo=extra-x86_64
elif [[ -d $pkg/repos/extra-any ]];then
repo=extra-any
fi
if [[ -d $pkg/repos/testing-x86_64 ]];then
repo=testing-x86_64
elif [[ -d $pkg/repos/testing-any ]];then
repo=testing-any
fi
if [[ -d $pkg/repos/staging-x86_64 ]];then
repo=staging-x86_64
elif [[ -d $pkg/repos/staging-any ]];then
repo=staging-any
fi
if [[ -d $pkg/repos/community-x86_64 ]];then
repo=community-x86_64
elif [[ -d $pkg/repos/community-any ]];then
repo=community-any
fi
if [[ -d $pkg/repos/community-testing-x86_64 ]];then
repo=community-testing-x86_64
elif [[ -d $pkg/repos/community-testing-any ]];then
repo=community-testing-any
fi
if [[ -d $pkg/repos/community-staging-x86_64 ]];then
repo=community-staging-x86_64
elif [[ -d $pkg/repos/community-staging-any ]];then
repo=community-staging-any
fi
if [[ -d $pkg/repos/multilib-x86_64 ]];then
repo=multilib-x86_64
fi
if [[ -d $pkg/repos/multilib-testing-x86_64 ]];then
repo=multilib-testing-x86_64
fi
if [[ -d $pkg/repos/multilib-staging-x86_64 ]];then
repo=multilib-staging-x86_64
fi
$stag && repos+=(staging community-staging multilib-staging)
$unst && repos+=(gnome-unstable kde-unstable)
for r in ${repos[@]};do
[[ -f $pkg/repos/$r-x86_64/PKGBUILD ]] && repo=$r-x86_64
[[ -f $pkg/repos/$r-any/PKGBUILD ]] && repo=$r-any
done
echo $repo
}
arch_to_artix_repo(){
local repo="$1"
case $repo in
core-*) repo=system ;;
extra-*) repo=world ;;
community-x86_64|community-any) repo=galaxy ;;
multilib-x86_64) repo=lib32 ;;
testing-*) repo=gremlins ;;
staging-*) repo=goblins ;;
multilib-testing-x86_64) repo=lib32-gremlins ;;
multilib-staging-x86_64) repo=lib32-goblins ;;
community-testing-*) repo=galaxy-gremlins ;;
community-staging-*) repo=galaxy-goblins ;;
get_cases(){
local pkglist="${DATADIR}/pkglists/$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=${p:+}${p:-|}${p}
done
echo $cases
}
get_artix_tree(){
local pkg="$1" artix_tree="${2:-$3}" tree
case $pkg in
$(get_cases kernel)) tree=packages-kernel ;;
python-*|python2-*) tree=packages-python ;;
perl-*) tree=packages-perl ;;
ruby-*) tree=packages-ruby ;;
xorg*|xf86*|$(get_cases xorg)) tree=packages-xorg ;;
*-openrc) tree=packages-openrc ;;
*-runit) tree=packages-runit ;;
qt5-*) tree=packages-qt5 ;;
# $(get_cases freedesktop)) tree=packages-desktop ;;
# $(get_cases kde)) tree=packages-kde ;;
# $(get_cases gnome)) tree=packages-gnome ;;
*) tree=$artix_tree
esac
echo $repo
echo $tree
}
# $1: sofile
# $2: soarch
process_sofile() {
# extract the library name: libfoo.so
local soname="${1%.so?(+(.+([0-9])))}".so
# extract the major version: 1
soversion="${1##*\.so\.}"
if [[ "$soversion" = "$1" ]] && (($IGNORE_INTERNAL)); then
continue
fi
if ! in_array "${soname}=${soversion}-$2" ${soobjects[@]}; then
# libfoo.so=1-64
msg "${soname}=${soversion}-$2"
soobjects+=("${soname}=${soversion}-$2")
fi
get_import_path(){
local pkg="$1" import_path=
for tree in ${TREE_NAMES_ARCH[@]};do
[[ -d ${TREE_DIR_ARCH}/$tree/$pkg ]] && import_path=${TREE_DIR_ARCH}/$tree/$pkg
done
echo $import_path
}
pkgver_equal() {
@@ -184,6 +140,14 @@ pkgver_equal() {
fi
}
is_valid_repo(){
local src="$1"
case $src in
core|extra|community|multilib|testing|staging|community-testing|community-staging|multilib-testing|multilib-staging|trunk) return 0 ;;
*) return 1 ;;
esac
}
find_cached_package() {
local searchdirs=("$PKGDEST" "$PWD") results=()
local targetname=$1 targetver=$2 targetarch=$3

25
lib/util-base.sh.in Normal file
View File

@@ -0,0 +1,25 @@
#!/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

View File

@@ -1,89 +0,0 @@
#!/bin/bash
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
copy_mirrorlist(){
cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/"
}
copy_keyring(){
if [[ -d /etc/pacman.d/gnupg ]] && [[ ! -d $1/etc/pacman.d/gnupg ]]; then
cp -a /etc/pacman.d/gnupg "$1/etc/pacman.d/"
fi
}
create_min_fs(){
msg "Creating install root at %s" "$1"
mkdir -m 0755 -p $1/var/{cache/pacman/pkg,lib/pacman,log} $1/{dev,etc}
mkdir -m 1777 -p $1/{tmp,run}
mkdir -m 0555 -p $1/{sys,proc}
if [[ ! -f $1/etc/machine-id ]];then
touch $1/etc/machine-id
fi
}
is_btrfs() {
[[ -e "$1" && "$(stat -f -c %T "$1")" == btrfs ]]
}
subvolume_delete_recursive() {
local subvol
is_btrfs "$1" || return 0
while IFS= read -d $'\0' -r subvol; do
if ! btrfs subvolume delete "$subvol" &>/dev/null; then
error "Unable to delete subvolume %s" "$subvol"
return 1
fi
done < <(find "$1" -xdev -depth -inum 256 -print0)
return 0
}
default_locale(){
local action="$1" mnt="$2"
if [[ $action == "set" ]];then
if [[ ! -f "$mnt/etc/locale.gen.bak" ]];then
info "Setting locale ..."
mv "$mnt/etc/locale.gen" "$mnt/etc/locale.gen.bak"
printf '%s.UTF-8 UTF-8\n' en_US de_DE > "$mnt/etc/locale.gen"
echo 'LANG=en_US.UTF-8.UTF-8' > "$mnt/etc/locale.conf"
fi
elif [[ $action == "reset" ]];then
if [[ -f "$mnt/etc/locale.gen.bak" ]];then
info "Resetting locale ..."
mv "$mnt/etc/locale.gen.bak" "$mnt/etc/locale.gen"
rm "$mnt/etc/locale.conf"
fi
fi
}
default_mirror(){
local mnt="$1" mirror="$2"'/$repo/os/$arch'
[[ -f $mnt/etc/pacman.d/mirrorlist ]] && mv "$mnt"/etc/pacman.d/mirrorlist "$mnt"/etc/pacman.d/mirrorlist.bak
echo "Server = $mirror" > $mnt/etc/pacman.d/mirrorlist
}
# $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
}

View File

@@ -1,111 +0,0 @@
#!/bin/bash
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
load_profile(){
local prof="$1"
local profdir="${DATADIR}/iso-profiles/$prof"
[[ "$prof" != 'base' ]] && profdir=${workspace_dir}/iso-profiles/$prof
root_list="${DATADIR}/iso-profiles/base/Packages-Root"
[[ -f "$profdir/Packages-Root" ]] && root_list="$profdir/Packages-Root"
root_overlay="${DATADIR}/iso-profiles/base/root-overlay"
[[ -d "$profdir/root-overlay" ]] && root_overlay="$profdir/root-overlay"
[[ -f "$profdir/Packages-Desktop" ]] && desktop_list="$profdir/Packages-Desktop"
[[ -d "$profdir/desktop-overlay" ]] && desktop_overlay="$profdir/desktop-overlay"
live_list="${DATADIR}/iso-profiles/base/Packages-Live"
[[ -f "$profdir/Packages-Live" ]] && live_list="$profdir/Packages-Live"
live_overlay="${DATADIR}/iso-profiles/base/live-overlay"
[[ -d "$profdir/live-overlay" ]] && live_overlay="$profdir/live-overlay"
[[ -f $profdir/profile.conf ]] || return 1
[[ -r $profdir/profile.conf ]] && source $profdir/profile.conf
[[ -z ${displaymanager} ]] && displaymanager="none"
[[ -z ${autologin} ]] && autologin="true"
[[ ${displaymanager} == 'none' ]] && autologin="false"
[[ -z ${hostname} ]] && hostname="artix"
[[ -z ${username} ]] && username="artix"
[[ -z ${password} ]] && password="artix"
if [[ -z ${addgroups} ]];then
addgroups="video,power,storage,optical,network,lp,scanner,wheel,users,audio"
fi
if [[ -z ${services[@]} ]];then
services=('acpid' 'bluetooth' 'cronie' 'cupsd' 'dbus' 'syslog-ng' 'NetworkManager')
fi
[[ ${displaymanager} != "none" ]] && services+=('xdm')
if [[ -z ${services_live[@]} ]];then
services_live=('artix-live' 'pacman-init')
fi
[[ -z ${netgroups_url} ]] && netgroups_url="https://raw.githubusercontent.com/artix-linux/netgroups/master"
return 0
}
write_live_session_conf(){
local path=$1${SYSCONFDIR}
[[ ! -d $path ]] && mkdir -p "$path"
local conf=$path/live.conf
msg2 "Writing %s" "${conf##*/}"
echo '# live session configuration' > ${conf}
echo '' >> ${conf}
echo '# autologin' >> ${conf}
echo "autologin=${autologin}" >> ${conf}
echo '' >> ${conf}
echo '# live username' >> ${conf}
echo "username=${username}" >> ${conf}
echo '' >> ${conf}
echo '# live password' >> ${conf}
echo "password=${password}" >> ${conf}
echo '' >> ${conf}
echo '# live group membership' >> ${conf}
echo "addgroups='${addgroups}'" >> ${conf}
}
load_pkgs(){
local pkglist="$1" init="$2" _kv="$3"
info "Loading Packages: [%s] ..." "${pkglist##*/}"
local _init="s|>$init||g"
case "$init" in
'openrc') _init_rm1="s|>runit.*||g"; _init_rm2="s|>s6*||g" ;;
's6') _init_rm1="s|>runit.*||g"; _init_rm2="s|>openrc.*||g" ;;
'runit') _init_rm1="s|>s6.*||g"; _init_rm2="s|>openrc.*||g" ;;
esac
local _blacklist="s|>blacklist.*||g" \
_kernel="s|KERNEL|$_kv|g" \
_space="s| ||g" \
_clean=':a;N;$!ba;s/\n/ /g' \
_com_rm="s|#.*||g"
packages=($(sed "$_com_rm" "$pkglist" \
| sed "$_space" \
| sed "$_blacklist" \
| sed "$_purge" \
| sed "$_init" \
| sed "$_init_rm1" \
| sed "$_init_rm2" \
| sed "$_kernel" \
| sed "$_clean"))
}

View File

@@ -1,51 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
connect(){
local home="/home/frs/project/${project}"
echo "${account},${project}@frs.${file_host}:${home}"
}
gen_webseed(){
local webseed seed="$1"
for mirror in ${host_mirrors[@]};do
webseed=${webseed:-}${webseed:+,}"https://${mirror}.dl.${seed}"
done
echo ${webseed}
}
make_torrent(){
find ${src_dir} -type f -name "*.torrent" -delete
if [[ -n $(find ${src_dir} -type f -name "*.iso") ]]; then
for iso in $(ls ${src_dir}/*.iso);do
local seed=${file_host}/project/${project}${target_dir}${iso##*/}
local mktorrent_args=(-c "${torrent_meta}" -p -l ${piece_size} -a ${tracker_url} -w $(gen_webseed ${seed}))
${verbose} && mktorrent_args+=(-v)
info "mktorrent_args: %s" "${mktorrent_args[@]}"
msg2 "Creating (%s) ..." "${iso##*/}.torrent"
mktorrent ${mktorrent_args[*]} -o ${iso}.torrent ${iso}
done
fi
}
prepare_transfer(){
target_dir="/iso/${profile}/"
src_dir="${iso_pool}/${profile}/"
${torrent} && make_torrent
}
sync_dir(){
msg "Start upload [%s] ..." "${profile}"
rsync "${rsync_args[@]}" ${src_dir} $(connect)${target_dir}
msg "Done upload [%s]" "${profile}"
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}

View File

@@ -1,104 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
write_bootloader_conf(){
local conf="$1/bootloader.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo '---' > "$conf"
echo "efiBootLoader: \"grub\"" >> "$conf"
echo "kernel: \"/vmlinuz-$kernel-${target_arch}\"" >> "$conf"
echo "img: \"/initramfs-$kernel-${target_arch}.img\"" >> "$conf"
echo "fallback: \"/initramfs-$kernel-${target_arch}-fallback.img\"" >> "$conf"
echo 'timeout: "10"' >> "$conf"
echo "kernelLine: \", with ${kernel}\"" >> "$conf"
echo "fallbackKernelLine: \", with ${kernel} (fallback initramfs)\"" >> "$conf"
echo 'grubInstall: "grub-install"' >> "$conf"
echo 'grubMkconfig: "grub-mkconfig"' >> "$conf"
echo 'grubCfg: "/boot/grub/grub.cfg"' >> "$conf"
echo '#efiBootloaderId: "dirname"' >> "$conf"
}
write_servicescfg_conf(){
local conf="$1/servicescfg.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo '---' > "$conf"
echo '' >> "$conf"
echo 'services:' >> "$conf"
echo ' enabled:' >> "$conf"
for s in ${services[@]};do
echo " - name: $s" >> "$conf"
echo ' runlevel: default' >> "$conf"
done
}
write_initcpio_conf(){
local conf="$1/initcpio.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "kernel: ${kernel}" >> "$conf"
}
write_users_conf(){
local conf="$1/users.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "defaultGroups:" >> "$conf"
local IFS=','
for g in ${addgroups[@]};do
echo " - $g" >> "$conf"
done
unset IFS
echo "autologinGroup: autologin" >> "$conf"
echo "doAutologin: false" >> "$conf"
echo "sudoersGroup: wheel" >> "$conf"
echo "setRootPassword: true" >> "$conf"
echo "doReusePassword: false" >> "$conf" # only used in old 'users' module
echo "availableShells: /bin/bash, /bin/zsh" >> "$conf" # only used in new 'users' module
echo "avatarFilePath: ~/.face" >> "$conf"
}
write_netinstall_conf(){
local conf="$1/netinstall.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "groupsUrl: ${netgroups}" >> "$conf"
}
write_unpack_conf(){
local conf="$1/unpackfs.conf"
msg2 "Writing %s ..." "${conf##*/}"
echo "---" > "$conf"
echo "unpack:" >> "$conf"
echo " - source: \"/run/${iso_name}/bootmnt/${iso_name}/${target_arch}/rootfs.sfs\"" >> "$conf"
echo " sourcefs: \"squashfs\"" >> "$conf"
echo " destination: \"\"" >> "$conf"
if [[ -f "${desktop_list}" ]] ; then
echo " - source: \"/run/${iso_name}/bootmnt/${iso_name}/${target_arch}/desktopfs.sfs\"" >> "$conf"
echo " sourcefs: \"squashfs\"" >> "$conf"
echo " destination: \"\"" >> "$conf"
fi
}
configure_calamares(){
local dest="$1" mods="$1/etc/calamares/modules"
if [[ -d $dest/etc/calamares/modules ]];then
info "Configuring [Calamares]"
write_netinstall_conf "$mods"
write_unpack_conf "$mods"
write_users_conf "$mods"
write_initcpio_conf "$mods"
case ${initsys} in
'openrc') write_servicescfg_conf "$mods" ;;
esac
write_bootloader_conf "$mods"
info "Done configuring [Calamares]"
fi
}

View File

@@ -1,538 +0,0 @@
#!/bin/bash
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
import ${LIBDIR}/util-chroot.sh
import ${LIBDIR}/util-iso-grub.sh
import ${LIBDIR}/util-iso-yaml.sh
import ${LIBDIR}/util-iso-profile.sh
track_img() {
info "mount: [%s]" "$2"
mount "$@" && IMG_ACTIVE_MOUNTS=("$2" "${IMG_ACTIVE_MOUNTS[@]}")
}
mount_img() {
IMG_ACTIVE_MOUNTS=()
mkdir -p "$2"
track_img "$1" "$2"
}
umount_img() {
if [[ -n ${IMG_ACTIVE_MOUNTS[@]} ]];then
info "umount: [%s]" "${IMG_ACTIVE_MOUNTS[@]}"
umount "${IMG_ACTIVE_MOUNTS[@]}"
unset IMG_ACTIVE_MOUNTS
rm -r "$1"
fi
}
track_fs() {
info "overlayfs mount: [%s]" "$5"
mount "$@" && FS_ACTIVE_MOUNTS=("$5" "${FS_ACTIVE_MOUNTS[@]}")
}
mount_overlay(){
FS_ACTIVE_MOUNTS=()
local lower= upper="$1" work="$2" pkglist="$3"
local fs=${upper##*/}
local rootfs="$work/rootfs" desktopfs="$work/desktopfs" livefs="$work/livefs"
mkdir -p "${mnt_dir}/work"
mkdir -p "$upper"
case $fs in
desktopfs) lower="$rootfs" ;;
livefs)
lower="$rootfs"
[[ -f $pkglist ]] && lower="$desktopfs":"$rootfs"
;;
bootfs)
lower="$livefs":"$rootfs"
[[ -f $pkglist ]] && lower="$livefs":"$desktopfs":"$rootfs"
;;
esac
track_fs -t overlay overlay -olowerdir="$lower",upperdir="$upper",workdir="${mnt_dir}/work" "$upper"
}
umount_overlay(){
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
}
error_function() {
if [[ -p $logpipe ]]; then
rm "$logpipe"
fi
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
}
# $1: function
run_log(){
local func="$1" log_dir='/var/log/artools'
local logfile=${log_dir}/$(gen_iso_fn).$func.log
logpipe=$(mktemp -u "/tmp/$func.pipe.XXXXXXXX")
mkfifo "$logpipe"
tee "$logfile" < "$logpipe" &
local teepid=$!
$func &> "$logpipe"
wait $teepid
rm "$logpipe"
}
run_safe() {
local restoretrap func="$1"
set -e
set -E
restoretrap=$(trap -p ERR)
trap 'error_function $func' ERR
if ${verbose};then
run_log "$func"
else
"$func"
fi
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
}
add_svc_rc(){
local mnt="$1" name="$2" rlvl="$3"
if [[ -f $mnt/etc/init.d/$name ]];then
msg2 "Setting %s ..." "$name"
chroot $mnt rc-update add $name $rlvl &>/dev/null
fi
}
set_xdm(){
if [[ -f $1/etc/conf.d/xdm ]];then
local conf='DISPLAYMANAGER="'${displaymanager}'"'
sed -i -e "s|^.*DISPLAYMANAGER=.*|${conf}|" $1/etc/conf.d/xdm
fi
}
configure_hosts(){
sed -e "s|localhost.localdomain|localhost.localdomain ${hostname}|" -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]" "${initsys}"
case ${initsys} in
'openrc')
for svc in ${services[@]}; do
[[ $svc == "xdm" ]] && set_xdm "$mnt"
add_svc_rc "$mnt" "$svc" "default"
done
for svc in ${services_live[@]}; do
add_svc_rc "$mnt" "$svc" "default"
done
;;
esac
info "Done configuring [%s]" "${initsys}"
}
configure_system(){
local mnt="$1"
case ${initsys} in
'openrc')
configure_logind "$mnt" "elogind"
;;
esac
echo ${hostname} > $mnt/etc/hostname
}
clean_iso_root(){
local dest="$1"
msg "Deleting isoroot [%s] ..." "${dest##*/}"
rm -rf --one-file-system "$dest"
}
clean_up_image(){
local path mnt="$1"
msg2 "Cleaning [%s]" "${mnt##*/}"
default_locale "reset" "$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
if [[ ${mnt##*/} == 'livefs' ]];then
rm -rf "$mnt/etc/pacman.d/gnupg"
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
}
configure_live_image(){
local fs="$1"
msg "Configuring [livefs]"
configure_hosts "$fs"
configure_system "$fs"
configure_services "$fs"
configure_calamares "$fs"
write_live_session_conf "$fs"
msg "Done configuring [livefs]"
}
make_sig () {
local idir="$1" file="$2"
msg2 "Creating signature file..."
cd "$idir"
user_own "$idir"
user_run "gpg --detach-sign --default-key ${gpgkey} $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}/${iso_name}/${target_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=()
${verbose} && ext4_args+=(-q)
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})
if ${verbose};then
mksquashfs "${mksfs_args[@]}" >/dev/null
else
mksquashfs "${mksfs_args[@]}"
fi
make_checksum "${dest}" "${name}"
${persist} && rm "${src}.img"
if [[ -n ${gpgkey} ]];then
make_sig "${dest}" "${name}"
fi
show_elapsed_time "${FUNCNAME}" "${timer_start}"
}
assemble_iso(){
msg "Creating ISO image..."
local mod_date=$(date -u +%Y-%m-%d-%H-%M-%S-00 | sed -e s/-//g)
xorriso -as mkisofs \
--modification-date=${mod_date} \
--protective-msdos-label \
-volid "${iso_label}" \
-appid "$(get_osname) Live/Rescue CD" \
-publisher "$(get_osname) <$(get_disturl)>" \
-preparer "Prepared by artools/${0##*/}" \
-r -graft-points -no-pad \
--sort-weight 0 / \
--sort-weight 1 /boot \
--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 \
-e --interval:appended_partition_2:all:: -iso_mbr_part_type 0x00 \
-no-emul-boot \
-iso-level 3 \
-o ${iso_dir}/${iso_file} \
${iso_root}/
}
# 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]"
}
gen_iso_fn(){
local vars=() name
vars+=("${iso_name}")
vars+=("${profile}")
vars+=("${iso_version}")
vars+=("${target_arch}")
for n in ${vars[@]};do
name=${name:-}${name:+-}${n}
done
echo $name
}
install_packages(){
local fs="$1"
setarch "${target_arch}" mkchroot \
"${mkchroot_args[@]}" "${fs}" "${packages[@]}"
}
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}"
install_packages "${rootfs}"
copy_overlay "${root_overlay}" "${rootfs}"
clean_up_image "${rootfs}"
msg "Done [Base installation] (rootfs)"
fi
}
make_desktopfs() {
if [[ ! -e ${work_dir}/desktopfs.lock ]]; then
msg "Prepare [Desktop installation] (desktopfs)"
local desktopfs="${work_dir}/desktopfs"
prepare_dir "${desktopfs}"
mount_overlay "${desktopfs}" "${work_dir}"
install_packages "${desktopfs}"
copy_overlay "${desktop_overlay}" "${desktopfs}"
umount_overlay
clean_up_image "${desktopfs}"
msg "Done [Desktop installation] (desktopfs)"
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}" "${desktop_list}"
install_packages "${livefs}"
copy_overlay "${live_overlay}" "${livefs}"
configure_live_image "${livefs}"
pacman -Qr "${livefs}" > ${iso_dir}/$(gen_iso_fn)-pkgs.txt
umount_overlay
clean_up_image "${livefs}"
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-${target_arch}
local bootfs="${work_dir}/bootfs"
mount_overlay "${bootfs}" "${work_dir}" "${desktop_list}"
prepare_initcpio "${bootfs}"
prepare_initramfs "${bootfs}"
cp ${bootfs}/boot/initramfs.img ${boot}/initramfs-${target_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]"
prepare_grub "${work_dir}/rootfs" "${work_dir}/livefs" "${iso_root}"
configure_grub "${iso_root}/boot/grub/kernels.cfg"
: > ${work_dir}/grub.lock
msg "Done [/iso/boot/grub]"
fi
}
compress_images(){
local timer=$(get_timer)
run_safe "make_iso"
user_own "${iso_dir}" "-R"
show_elapsed_time "${FUNCNAME}" "${timer}"
}
prepare_images(){
local timer=$(get_timer)
load_pkgs "${root_list}" "${initsys}" "${kernel}"
run_safe "make_rootfs"
if [[ -f "${desktop_list}" ]] ; then
load_pkgs "${desktop_list}" "${initsys}" "${kernel}"
run_safe "make_desktopfs"
fi
if [[ -f ${live_list} ]]; then
load_pkgs "${live_list}" "${initsys}" "${kernel}"
run_safe "make_livefs"
fi
run_safe "make_bootfs"
run_safe "make_grub"
show_elapsed_time "${FUNCNAME}" "${timer}"
}

17
lib/util-iso.sh.in Normal file
View File

@@ -0,0 +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.
for isolib in ${LIBDIR}/iso/*.sh; do
. $isolib
done

View File

@@ -1,186 +0,0 @@
#!/bin/bash
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
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"
}
get_chroot_arch(){
local elf=$(file $1/usr/bin/file)
elf=${elf//*executable,}
echo ${elf%%,*}
}
chroot_part_mount() {
info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_PART_MOUNTS=("$2" "${CHROOT_ACTIVE_PART_MOUNTS[@]}")
}
select_os(){
local os_list=( $(detect) ) count=${#os_list[@]}
if [[ ${count} > 1 ]];then
msg "Detected systems:"
local i=0
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)) ;;
esac
done
i=0
msg "Select system to mount [0-%s] : " "$((count-1))"
read select
else
select=0
fi
local os_str=${os_list[$select]} type
type=$os_str
root=${os_str%%:*}
type=${type##*:}
if [[ "${type##*:}" == 'linux' ]];then
msg "Mounting (%s) [%s]" "$(get_os_name $os_str)" "$root"
chroot_mount_partitions "$1" "$root"
else
die "You can't mount %s!" "$select"
fi
}
chroot_mount_partitions(){
CHROOT_ACTIVE_PART_MOUNTS=()
CHROOT_ACTIVE_MOUNTS=()
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap 'trap_handler' EXIT
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
local chroot_arch=$(get_chroot_arch $1)
[[ ${chroot_arch} == x86-64 ]] && chroot_arch=${chroot_arch/-/_}
case ${target_arch} in
i686)
if [[ ${chroot_arch} == x86_64 ]];then
die "You can't chroot from %s host into %s!" "${target_arch}" "${chroot_arch}"
fi
;;
esac
chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind &&
chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_mount_conditional "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
chroot_mount /etc/resolv.conf "$1/etc/resolv.conf" --bind
}
chroot_mount() {
#info "mount: [%s]" "$2"
mount "$@" && CHROOT_ACTIVE_MOUNTS=("$2" "${CHROOT_ACTIVE_MOUNTS[@]}")
}
chroot_mount_conditional() {
local cond=$1; shift
if eval "$cond"; then
chroot_mount "$@"
fi
}
chroot_api_efi_mount() {
CHROOT_ACTIVE_MOUNTS=()
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap 'chroot_api_efi_umount' EXIT
chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind &&
chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
ignore_error chroot_mount_conditional "[[ -d '$1/sys/firmware/efi/efivars' ]]" \
efivarfs "$1/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev &&
chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
chroot_api_mount() {
CHROOT_ACTIVE_MOUNTS=()
[[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap'
trap 'chroot_api_umount' EXIT
chroot_mount_conditional "! mountpoint -q '$1'" "$1" "$1" --bind &&
chroot_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev &&
chroot_mount sys "$1/sys" -t sysfs -o nosuid,noexec,nodev,ro &&
chroot_mount udev "$1/dev" -t devtmpfs -o mode=0755,nosuid &&
chroot_mount devpts "$1/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec &&
chroot_mount shm "$1/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev &&
chroot_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 &&
chroot_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid
}
chroot_part_umount() {
info "umount: [%s]" "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_PART_MOUNTS[@]}"
unset CHROOT_ACTIVE_PART_MOUNTS
}
chroot_api_umount() {
#info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
unset CHROOT_ACTIVE_MOUNTS
}
chroot_api_efi_umount() {
#info "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}"
umount "${CHROOT_ACTIVE_MOUNTS[@]}"
unset CHROOT_ACTIVE_MOUNTS
}
trap_handler(){
chroot_api_umount
chroot_part_umount
}

17
lib/util-pkg.sh.in Normal file
View File

@@ -0,0 +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.
for pkglib in ${LIBDIR}/pkg/*.sh; do
. $pkglib
done

View File

@@ -1,189 +0,0 @@
#!/bin/bash
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
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)"
}
load_vars() {
local var
[[ -f $1 ]] || return 1
for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER CARCH GPGKEY; do
[[ -z ${!var:-} ]] && eval "$(grep -a "^${var}=" "$1")"
done
return 0
}
prepare_dir(){
[[ ! -d $1 ]] && mkdir -p $1
}
get_disturl(){
source /usr/lib/os-release
echo "${HOME_URL}"
}
get_osname(){
source /usr/lib/os-release
echo "${NAME}"
}
get_osid(){
source /usr/lib/os-release
echo "${ID}"
}
init_artools_base(){
target_arch=$(uname -m)
[[ -z ${chroots_dir} ]] && chroots_dir='/var/lib/artools'
[[ -z ${workspace_dir} ]] && workspace_dir=/home/${OWNER}/artools-workspace
prepare_dir "${workspace_dir}"
}
init_artools_pkg(){
[[ -z ${tree_dir_artix} ]] && tree_dir_artix=${workspace_dir}/artix
[[ -z ${host_tree_artix} ]] && host_tree_artix='https://github.com/artix-linux'
[[ -z ${tree_dir_arch} ]] && tree_dir_arch=${workspace_dir}/archlinux
[[ -z ${host_tree_arch} ]] && host_tree_arch='git://projects.archlinux.org/svntogit'
chroots_pkg="${chroots_dir}/buildpkg"
[[ -z ${repos_root} ]] && repos_root="${workspace_dir}/repos"
}
init_artools_iso(){
chroots_iso="${chroots_dir}/buildiso"
[[ -z ${iso_pool} ]] && iso_pool="${workspace_dir}/iso"
prepare_dir "${iso_pool}"
profile='base'
[[ -z ${iso_version} ]] && iso_version=$(date +%Y%m%d)
iso_name=$(get_osid)
iso_label="ARTIX_$(date +%Y%m)"
[[ -z ${initsys} ]] && initsys="openrc"
[[ -z ${kernel} ]] && kernel="linux-lts"
[[ -z ${kernel_args} ]] && kernel_args=""
[[ -z ${gpgkey} ]] && gpgkey=''
[[ -z ${uplimit} ]] && uplimit=100
[[ -z ${tracker_url} ]] && tracker_url='udp://mirror.strits.dk:6969'
[[ -z ${piece_size} ]] && piece_size=21
[[ -z ${file_host} ]] && file_host="sourceforge.net"
[[ -z ${project} ]] && project="artix-linux"
[[ -z ${account} ]] && account="[SetUser]"
[[ -z ${host_mirrors[@]} ]] && host_mirrors=('netcologne' 'freefr' 'netix' 'kent' '10gbps-io')
torrent_meta="$(get_osname)"
}
load_config(){
[[ -f $1 ]] || return 1
artools_conf="$1"
[[ -r ${artools_conf} ]] && source ${artools_conf}
init_artools_base
init_artools_pkg
init_artools_iso
return 0
}
user_own(){
local flag=$2
chown ${flag} "${OWNER}:$(id --group ${OWNER})" "$1"
}
user_run(){
su ${OWNER} -c "$@"
}
clean_dir(){
if [[ -d $1 ]]; then
msg "Cleaning [%s] ..." "$1"
rm -r $1/*
fi
}
load_user_info(){
OWNER=${SUDO_USER:-$USER}
if [[ -n $SUDO_USER ]]; then
eval "USER_HOME=~$SUDO_USER"
else
USER_HOME=$HOME
fi
AT_USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools"
PAC_USERCONFDIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/pacman"
prepare_dir "${AT_USERCONFDIR}"
}
show_version(){
msg "artools"
msg2 "version: %s" "${version}"
}
show_config(){
if [[ -f ${AT_USERCONFDIR}/artools.conf ]]; then
msg2 "config: %s" "~/.config/artools/artools.conf"
else
msg2 "config: %s" "${artools_conf}"
fi
}
check_root() {
(( EUID == 0 )) && return
if type -P sudo >/dev/null; then
exec sudo -- "${orig_argv[@]}"
else
exec su root -c "$(printf ' %q' "${orig_argv[@]}")"
fi
}