forked from artix/artools
		
	Compare commits
	
		
			24 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 87f7efa2f7 | |||
| c335cab68c | |||
| e744e80c57 | |||
| 06bcd79858 | |||
| dbb63dcd5e | |||
| 4e510b2f1e | |||
| f06ac2c369 | |||
| 736bac6dd7 | |||
| 1fd3b796c5 | |||
| 4c534f87b8 | |||
| 38284c5c14 | |||
| 5e7decee42 | |||
| dc606af137 | |||
| 5253f81f0a | |||
| 00ed72f96e | |||
| 70839d8609 | |||
| 65a29f73cc | |||
| d72df66e99 | |||
| 221cc796c0 | |||
| 3ed0c310a3 | |||
| b1213d5c2c | |||
| 26dffde972 | |||
| 915eca6c2e | |||
| a52e32d740 | 
							
								
								
									
										28
									
								
								.github/workflows/lint.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								.github/workflows/lint.yaml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| name: Artools shellcheck | ||||
| run-name: ${{ gitea.actor }} | ||||
| on: | ||||
|   push: | ||||
|     branches: | ||||
|       - artools/0.32.x | ||||
|       - master | ||||
|     tags: | ||||
|       - 0.* | ||||
|   pull_request: | ||||
|     types: [opened, reopened] | ||||
|  | ||||
| jobs: | ||||
|   lint: | ||||
|     runs-on: ubuntu-latest | ||||
|     steps: | ||||
|       - name: checkout repo | ||||
|         uses: actions/checkout@main | ||||
|       - name: build artools | ||||
|         run: make | ||||
|       - name: shellcheck artools | ||||
|         uses: ludeeus/action-shellcheck@master | ||||
|         env: | ||||
|           SHELLCHECK_OPTS: -x -e SC2034 | ||||
|         with: | ||||
|           scandir: './build/bin' | ||||
|           format: tty | ||||
|  | ||||
							
								
								
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -12,3 +12,5 @@ PKGBUILD | ||||
| contrib/artixlinux | ||||
| build/ | ||||
| tmp/ | ||||
| checks/ | ||||
| check.sh | ||||
|   | ||||
							
								
								
									
										6
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								Makefile
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| SHELL=/bin/bash | ||||
|  | ||||
| V=0.31 | ||||
| V=0.32 | ||||
| BUILDTOOLVER ?= $(V) | ||||
|  | ||||
| CHROOTVER=0.12 | ||||
| @@ -32,7 +32,6 @@ MAKEPKG_CONFIGS=$(wildcard config/makepkg/*) | ||||
| PACMAN_CONFIGS=$(wildcard config/pacman/*) | ||||
| SETARCH_ALIASES = $(wildcard config/setarch-aliases.d/*) | ||||
|  | ||||
| TOOLS_CONFIGS_BASE=$(wildcard config/conf/*base*) | ||||
| TOOLS_CONFIGS_PKG=$(wildcard config/conf/*pkg*) | ||||
| TOOLS_CONFIGS_ISO=$(wildcard config/conf/*iso*) | ||||
|  | ||||
| @@ -73,7 +72,6 @@ $(eval $(call buildInScript,build/lib,src/lib/,,644)) | ||||
| conf_base: | ||||
| 	@install -d $(BUILDDIR)/pacman.conf.d $(BUILDDIR)/artools | ||||
| 	@cp -a $(PACMAN_CONFIGS) $(BUILDDIR)/pacman.conf.d | ||||
| 	@cp -a $(TOOLS_CONFIGS_BASE) $(BUILDDIR)/artools | ||||
|  | ||||
| conf_pkg: | ||||
| 	@install -d $(BUILDDIR)/makepkg.conf.d $(BUILDDIR)/artools | ||||
| @@ -95,8 +93,6 @@ install_base: binprogs_base | ||||
| 	install -dm0755 $(DESTDIR)$(LIBDIR) | ||||
| 	cp -ra $(BUILDDIR)/lib/base $(DESTDIR)$(LIBDIR) | ||||
|  | ||||
| 	for conf in $(notdir $(TOOLS_CONFIGS_BASE)); do install -Dm0644 $(BUILDDIR)/$(TOOLS)/$$conf $(DESTDIR)$(SYSCONFDIR)/$(TOOLS)/$${conf##*/}; done | ||||
|  | ||||
| 	for conf in $(notdir $(PACMAN_CONFIGS)); do install -Dm0644 $(BUILDDIR)/pacman.conf.d/$$conf $(DESTDIR)$(DATADIR)/pacman.conf.d/$${conf##*/}; done | ||||
|  | ||||
| install_pkg: binprogs_pkg | ||||
|   | ||||
							
								
								
									
										13
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								README.md
									
									
									
									
									
								
							| @@ -45,21 +45,22 @@ artools | ||||
|   * libisoburn | ||||
|   * mtools | ||||
|   * squashfs-tools | ||||
|   * go-yq | ||||
|  | ||||
|  | ||||
| #### Configuration | ||||
|  | ||||
| artools-{base,pkg,iso}.conf are the configuration files for artools. | ||||
| artools-{pkg,iso}.conf are the configuration files for artools. | ||||
| By default, the config files are installed in | ||||
|  | ||||
| ```bash | ||||
| /etc/artools/artools-{base,pkg,iso}.conf | ||||
| /etc/artools/artools-{pkg,iso}.conf | ||||
| ``` | ||||
|  | ||||
| A user artools-{base,pkg,iso}.conf can be placed in | ||||
| A user artools-{pkg,iso}.conf can be placed in | ||||
|  | ||||
| ```bash | ||||
| $HOME/.config/artools/artools-{base,pkg,iso}.conf | ||||
| $HOME/.config/artools/artools-{pkg,iso}.conf | ||||
| ``` | ||||
|  | ||||
| If the userconfig is present, artools will load the userconfig values, however, if variables have been set in the systemwide | ||||
| @@ -68,8 +69,8 @@ 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-{base,pkg,iso}.conf or by args. | ||||
| Specifying args will override artools-{base,pkg,iso}.conf settings. | ||||
| Tools configuration is done in artools-{pkg,iso}.conf or by args. | ||||
| Specifying args will override artools-{pkg,iso}.conf settings. | ||||
|  | ||||
| Both, pacman.conf and makepkg.conf for chroots are loaded from | ||||
|  | ||||
|   | ||||
| @@ -1,20 +0,0 @@ | ||||
| #!/hint/bash | ||||
| # shellcheck disable=2034 | ||||
|  | ||||
| ############################################# | ||||
| ################ artools-base ############### | ||||
| ############################################# | ||||
|  | ||||
| # build dir where buildpkg or buildiso chroots are created | ||||
| # CHROOTS_DIR=/var/lib/artools | ||||
|  | ||||
| # the workspace directory | ||||
| # WORKSPACE_DIR="${USER_HOME}/artools-workspace" | ||||
|  | ||||
| # the arch to build | ||||
| # ARCH=$(uname -m) | ||||
|  | ||||
| # default pacman.conf repos to include | ||||
| # possible buildpkg values: {system,world,galaxy,lib32}{-gremlins,-goblins} | ||||
| # possible buildiso values: {world,galaxy}{-gremlins,-goblins} | ||||
| # REPO="world" | ||||
| @@ -5,20 +5,33 @@ | ||||
| ################ artools-iso ################ | ||||
| ############################################# | ||||
|  | ||||
| # the iso storage directory | ||||
| # default chroots dir where buildiso chroots are created | ||||
| # CHROOTS_DIR=/var/lib/artools | ||||
|  | ||||
| # default workspace directory | ||||
| # WORKSPACE_DIR="${USER_HOME}/artools-workspace" | ||||
|  | ||||
| # default arch to build | ||||
| # ARCH=$(uname -m) | ||||
|  | ||||
| # default pacman.conf to include | ||||
| # possible values: {stable,gremlins,goblins} | ||||
| # STABILITY="stable" | ||||
|  | ||||
| # default iso storage directory | ||||
| # ISO_POOL="${WORKSPACE_DIR}/iso" | ||||
|  | ||||
| # the dist release; default: auto | ||||
| # default dist release; default: auto | ||||
| # ISO_VERSION=$(date +%Y%m%d) | ||||
|  | ||||
| # possible values: openrc, runit, s6, suite66, dinit | ||||
| # default init system, possible values: openrc, runit, s6, suite66, dinit | ||||
| # INITSYS="openrc" | ||||
|  | ||||
| # gpg key; leave empty or commented to skip img signing | ||||
| # GPG_KEY="" | ||||
|  | ||||
| # possible values: zstd (default), xz | ||||
| # default compression, possible values: zstd (default), xz | ||||
| # COMPRESSION="zstd" | ||||
|  | ||||
| # zstd only: range 1..22 | ||||
| # default compression level, zstd only: range 1..22 | ||||
| # COMPRESSION_LEVEL=15 | ||||
|   | ||||
| @@ -5,9 +5,23 @@ | ||||
| ################ artools-pkg ################ | ||||
| ############################################# | ||||
|  | ||||
| # gitea user access token for buildtree | ||||
| # default chroots dir where buildpkg chroots are created | ||||
| # CHROOTS_DIR=/var/lib/artools | ||||
|  | ||||
| # default workspace directory | ||||
| # WORKSPACE_DIR="${USER_HOME}/artools-workspace" | ||||
|  | ||||
| # default arch to build | ||||
| # ARCH=$(uname -m) | ||||
|  | ||||
| # default pacman.conf repos to include | ||||
| # possible values: {system,world,galaxy,lib32}{-gremlins,-goblins} | ||||
| # REPO="world" | ||||
|  | ||||
| # gitea user access token for gitea api | ||||
| # GIT_TOKEN='' | ||||
|  | ||||
| # default workspace dir for artixpkg | ||||
| # TREE_DIR_ARTIX=${WORKSPACE_DIR}/artixlinux | ||||
|  | ||||
| # default repos root for deploypkg | ||||
|   | ||||
| @@ -44,7 +44,7 @@ CFLAGS="-march=x86-64 -mtune=generic -O2 -pipe -fno-plt -fexceptions \ | ||||
|         -Wp,-D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security \ | ||||
|         -fstack-clash-protection -fcf-protection" | ||||
| CXXFLAGS="$CFLAGS -Wp,-D_GLIBCXX_ASSERTIONS" | ||||
| LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now" | ||||
| LDFLAGS="-Wl,-O1,--sort-common,--as-needed,-z,relro,-z,now,-z,pack-relative-relocs" | ||||
| LTOFLAGS="-flto=auto" | ||||
| RUSTFLAGS="" | ||||
| #-- Make Flags: change this for DistCC/SMP systems | ||||
|   | ||||
							
								
								
									
										115
									
								
								config/pacman/iso-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										115
									
								
								config/pacman/iso-goblins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,115 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| Color | ||||
| #NoProgressBar | ||||
| CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 10 | ||||
|  | ||||
| # 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 artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| [system-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-goblins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-gremlins] | ||||
| 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 | ||||
							
								
								
									
										103
									
								
								config/pacman/iso-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								config/pacman/iso-gremlins-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| Color | ||||
| #NoProgressBar | ||||
| CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 10 | ||||
|  | ||||
| # 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 artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| [system-gremlins] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [world-gremlins] | ||||
| 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 | ||||
							
								
								
									
										103
									
								
								config/pacman/iso-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								config/pacman/iso-x86_64.conf
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| # | ||||
| # /etc/pacman.conf | ||||
| # | ||||
| # See the pacman.conf(5) manpage for option and repository directives | ||||
|  | ||||
| # | ||||
| # GENERAL OPTIONS | ||||
| # | ||||
| [options] | ||||
| # The following paths are commented out with their default values listed. | ||||
| # If you wish to use different paths, uncomment and update the paths. | ||||
| #RootDir     = / | ||||
| #DBPath      = /var/lib/pacman/ | ||||
| #CacheDir    = /var/cache/pacman/pkg/ | ||||
| #LogFile     = /var/log/pacman.log | ||||
| #GPGDir      = /etc/pacman.d/gnupg/ | ||||
| #HookDir     = /etc/pacman.d/hooks/ | ||||
| HoldPkg     = pacman glibc | ||||
| #XferCommand = /usr/bin/curl -L -C - -f -o %o %u | ||||
| #XferCommand = /usr/bin/wget --passive-ftp -c -O %o %u | ||||
| #CleanMethod = KeepInstalled | ||||
| Architecture = auto | ||||
|  | ||||
| # Pacman won't upgrade packages listed in IgnorePkg and members of IgnoreGroup | ||||
| #IgnorePkg   = | ||||
| #IgnoreGroup = | ||||
|  | ||||
| #NoUpgrade   = | ||||
| #NoExtract   = | ||||
|  | ||||
| # Misc options | ||||
| #UseSyslog | ||||
| Color | ||||
| #NoProgressBar | ||||
| CheckSpace | ||||
| VerbosePkgLists | ||||
| ParallelDownloads = 10 | ||||
|  | ||||
| # 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 artix`. | ||||
|  | ||||
| # | ||||
| # REPOSITORIES | ||||
| #   - can be defined here or included from another file | ||||
| #   - pacman will search repositories in the order defined here | ||||
| #   - local/custom mirrors can be added here or in separate files | ||||
| #   - repositories listed first will take precedence when packages | ||||
| #     have identical names, regardless of version number | ||||
| #   - URLs will have $repo replaced by the name of the current repo | ||||
| #   - URLs will have $arch replaced by the name of the architecture | ||||
| # | ||||
| # Repository entries are of the format: | ||||
| #       [repo-name] | ||||
| #       Server = ServerName | ||||
| #       Include = IncludePath | ||||
| # | ||||
| # The header [repo-name] is crucial - it must be present and | ||||
| # uncommented to enable the repo. | ||||
| # | ||||
|  | ||||
| # The gremlins repositories are disabled by default. To enable, uncomment the | ||||
| # repo name header and Include lines. You can add preferred servers immediately | ||||
| # after the header, and they will be used before the default mirrors. | ||||
|  | ||||
| # [system-gremlins] | ||||
| # Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| [system] | ||||
| Include = /etc/pacman.d/mirrorlist | ||||
|  | ||||
| # [world-gremlins] | ||||
| # 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 | ||||
							
								
								
									
										17
									
								
								contrib/iso/profile.conf.example
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								contrib/iso/profile.conf.example
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| ################ install ################ | ||||
|  | ||||
| # start services | ||||
| # bluetoothd, cupsd, DM are added to the pkglist dynamicly | ||||
| # metalog or syslog-ng is added to the pkglist dynamicly | ||||
| # connmand or NetworkManager is added to the pkglist dynamicly | ||||
| # only added if in array, these pkgs have no list entry | ||||
|  | ||||
| SERVICES=('acpid' 'bluetoothd' 'cronie' 'cupsd' 'metalog' 'connmand') | ||||
|  | ||||
| ################# live-session ################# | ||||
|  | ||||
| # default value | ||||
| # PASSWORD="artix" | ||||
|  | ||||
| # Set to false to disable autologin in the live session | ||||
| AUTOLOGIN="false" | ||||
| @@ -8,40 +8,81 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/base/mount.sh | ||||
| source "${LIBDIR}"/base/mount.sh | ||||
| # shellcheck source=src/lib/base/unshare-mount.sh | ||||
| source "${LIBDIR}"/base/unshare-mount.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
|  | ||||
|  | ||||
| artix-chroot() { | ||||
|     check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| #     (( EUID == 0 )) || die 'This script must be run with root privileges' | ||||
|  | ||||
|     [[ -d $chrootdir ]] || die "Can't create chroot on non-directory %s" "$chrootdir" | ||||
|  | ||||
|     "$setup" "$chrootdir" || die "failed to setup chroot %s" "$chrootdir" | ||||
|     if (( ! keepresolvconf )); then | ||||
|         chroot_add_resolv_conf "$chrootdir" || die "failed to setup resolv.conf" | ||||
|     fi | ||||
|  | ||||
|     if ! mountpoint -q "$chrootdir"; then | ||||
|         warning "$chrootdir is not a mountpoint. This may have undesirable side effects." | ||||
|     fi | ||||
|  | ||||
|     chroot_args=() | ||||
|     [[ $userspec ]] && chroot_args+=(--userspec "$userspec") | ||||
|  | ||||
|     SHELL=/bin/bash $pid_unshare chroot "${chroot_args[@]}" -- "$chrootdir" "${args[@]}" | ||||
| } | ||||
|  | ||||
| usage() { | ||||
|     printf 'usage: %s chroot-dir [command]\n' "${0##*/}" | ||||
|     printf '    -h             Print this help message\n' | ||||
|     printf '\n' | ||||
|     printf "    If 'command' is unspecified, %s will launch /bin/sh.\n" "${0##*/}" | ||||
|     printf '\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
|     cat <<EOF | ||||
| usage: ${0##*/} chroot-dir [command] [arguments...] | ||||
|  | ||||
|     -h                  Print this help message | ||||
|     -N                  Run in unshare mode as a regular user | ||||
|     -u <user>[:group]   Specify non-root user and optional group to use | ||||
|     -r                  Do not change the resolv.conf within the chroot | ||||
|  | ||||
| If 'command' is unspecified, ${0##*/} will launch /bin/bash. | ||||
|  | ||||
| Note that when using artix-chroot, the target chroot directory *should* be a | ||||
| mountpoint. This ensures that tools such as pacman(8) or findmnt(8) have an | ||||
| accurate hierarchy of the mounted filesystems within the chroot. | ||||
|  | ||||
| If your chroot target is not a mountpoint, you can bind mount the directory on | ||||
| itself to make it a mountpoint, i.e. 'mount --bind /your/chroot /your/chroot'. | ||||
|  | ||||
| EOF | ||||
| } | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts=':h' | ||||
| opts=':hNu:r' | ||||
|  | ||||
| while getopts ${opts} arg; do | ||||
|     case "${arg}" in | ||||
|         h|?) usage 0 ;; | ||||
|         h) usage; exit 0 ;; | ||||
|         N) unshare=1 ;; | ||||
|         u) userspec=$OPTARG ;; | ||||
|         r) keepresolvconf=1 ;; | ||||
|         :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|         ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|     esac | ||||
| done | ||||
| shift $(( OPTIND - 1 )) | ||||
|  | ||||
| check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| (( $# )) || die 'No chroot directory specified' | ||||
|  | ||||
| chrootdir=$1 | ||||
| chrootdir="$1" | ||||
| shift | ||||
|  | ||||
| [[ -d ${chrootdir} ]] || die "Can't create chroot on non-directory %s" "${chrootdir}" | ||||
|  | ||||
| chroot_api_mount "${chrootdir}" || die "failed to setup API filesystems in chroot %s" "${chrootdir}" | ||||
| chroot_add_resolv_conf "${chrootdir}" | ||||
|  | ||||
| SHELL=/bin/sh unshare --fork --pid chroot "${chrootdir}" "$@" | ||||
| args=("$@") | ||||
| if (( unshare )); then | ||||
|     setup=unshare_setup | ||||
|     "$mount_unshare" bash -c "$(declare_all); artix-chroot" | ||||
| else | ||||
|     setup=chroot_setup | ||||
|     artix-chroot | ||||
| fi | ||||
|   | ||||
| @@ -18,26 +18,50 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/mount.sh | ||||
| source "${LIBDIR}"/base/mount.sh | ||||
| # shellcheck source=src/lib/base/unshare-mount.sh | ||||
| source "${LIBDIR}"/base/unshare-mount.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
|  | ||||
|  | ||||
| #{{{ functions | ||||
|  | ||||
| copy_mirrorlist(){ | ||||
|     cp -a /etc/pacman.d/mirrorlist "$1/etc/pacman.d/" | ||||
| } | ||||
| basestrap() { | ||||
|     check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
| #     (( EUID == 0 )) || die 'This script must be run with root privileges' | ||||
|  | ||||
| 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/" | ||||
|     # create obligatory directories | ||||
|     msg "Creating install root at %s" "$newroot" | ||||
|     install -d -m755 "$newroot"/var/{cache/pacman/pkg,lib/pacman,log} | ||||
|     install -d -m755 "$newroot"/{dev,run,etc/pacman.d} | ||||
|     install -d -m1777 "$newroot"/tmp | ||||
|     install -d -m555 "$newroot"/{sys,proc} | ||||
|  | ||||
|     # mount API filesystems | ||||
|     "$setup" "$newroot" || die "failed to setup chroot %s" "$newroot" | ||||
|  | ||||
|     if [[ ! -d $newroot/etc/pacman.d/gnupg ]]; then | ||||
|         if (( initkeyring )); then | ||||
|             pacman-key --gpgdir "$newroot"/etc/pacman.d/gnupg --init | ||||
|         elif (( copykeyring )) && [[ -d /etc/pacman.d/gnupg ]]; then | ||||
|             # if there's a keyring on the host, copy it into the new root | ||||
|             cp -a --no-preserve=ownership /etc/pacman.d/gnupg "$newroot/etc/pacman.d/" | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
| create_min_fs(){ | ||||
|     msg "Creating install root at %s" "$1" | ||||
|     mkdir -m 0755 -p "$1"/var/{cache/pacman/pkg,lib/pacman,log} "$1"/{dev,run,etc/pacman.d} | ||||
|     mkdir -m 1777 -p "$1"/tmp | ||||
|     mkdir -m 0555 -p "$1"/{sys,proc} | ||||
|     msg 'Installing packages to %s' "$newroot" | ||||
|     if ! $pid_unshare pacman -r "$newroot" "${pacman_args[@]}"; then | ||||
|         die 'Failed to install packages to new root' | ||||
|     fi | ||||
|  | ||||
|     if (( copymirrorlist )); then | ||||
|         # install the host's mirrorlist onto the new root | ||||
|         cp -a /etc/pacman.d/mirrorlist "$newroot/etc/pacman.d/" | ||||
|     fi | ||||
|  | ||||
|     if (( copyconf )); then | ||||
|         cp -a "$pacman_config" "$newroot/etc/pacman.conf" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -46,48 +70,67 @@ newroot=/mnt | ||||
|  | ||||
| hostcache=0 | ||||
| copykeyring=1 | ||||
| initkeyring=0 | ||||
| copymirrorlist=1 | ||||
| pacmode=-Sy | ||||
| pacman_args=() | ||||
| unshare=0 | ||||
| copyconf=0 | ||||
| pacman_config=/etc/pacman.conf | ||||
|  | ||||
| usage() { | ||||
|     printf "usage: %s [options] root [packages...]\n" "${0##*/}" | ||||
|     printf " -C <config>      Use an alternate config file for pacman\n" | ||||
|     printf " -c               Use the package cache on the host, rather than the target\n" | ||||
|     printf " -G               Avoid copying the host's pacman keyring to the target\n" | ||||
|     printf " -i               Avoid auto-confirmation of package selections\n" | ||||
|     printf " -M               Avoid copying the host's mirrorlist to the target\n" | ||||
|     printf ' -U               Use pacman -U to install packages\n' | ||||
|     printf " -h               Print this help message\n" | ||||
|     printf '\n' | ||||
|     printf ' basestrap installs packages to the specified new root directory.\n' | ||||
|     printf ' If no packages are given, basestrap defaults to the "base" group.\n' | ||||
|     printf '\n' | ||||
|     printf '\n' | ||||
|     exit "$1" | ||||
|   cat <<EOF | ||||
| usage: ${0##*/} [options] root [packages...] | ||||
|  | ||||
|   Options: | ||||
|     -C <config>    Use an alternate config file for pacman | ||||
|     -c             Use the package cache on the host, rather than the target | ||||
|     -D             Skip pacman dependency checks | ||||
|     -G             Avoid copying the host's pacman keyring to the target | ||||
|     -i             Prompt for package confirmation when needed (run interactively) | ||||
|     -K             Initialize an empty pacman keyring in the target (implies '-G') | ||||
|     -M             Avoid copying the host's mirrorlist to the target | ||||
|     -N             Run in unshare mode as a regular user | ||||
|     -P             Copy the host's pacman config to the target | ||||
|     -U             Use pacman -U to install packages | ||||
|  | ||||
|     -h             Print this help message | ||||
|  | ||||
| basestrap installs packages to the specified new root directory. If no packages | ||||
| are given, basestrap defaults to the "base" group. | ||||
|  | ||||
| EOF | ||||
| } | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts=':C:cGiMU' | ||||
| opts=':C:cDGiKMNPU' | ||||
|  | ||||
| while getopts ${opts} arg; do | ||||
|     case "${arg}" in | ||||
|         C) pacman_conf=$OPTARG ;; | ||||
|         C) pacman_config=$OPTARG ;; | ||||
|         D) pacman_args+=(-dd) ;; | ||||
|         c) hostcache=1 ;; | ||||
|         i) interactive=1 ;; | ||||
|         G) copykeyring=0 ;; | ||||
|         K) initkeyring=1 ;; | ||||
|         M) copymirrorlist=0 ;; | ||||
|         N) unshare=1 ;; | ||||
|         P) copyconf=1 ;; | ||||
|         U) pacmode=-U ;; | ||||
|         h|?) usage 0 ;; | ||||
|         :) die '%s: option requires an argument -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|         ?) die '%s: invalid option -- '\''%s'\' "${0##*/}" "$OPTARG" ;; | ||||
|     esac | ||||
| done | ||||
| shift $(( OPTIND - 1 )) | ||||
|  | ||||
| check_root "" "${BASH_SOURCE[0]}" "${orig_args[@]}" | ||||
|  | ||||
| (( $# )) || die "No root directory specified" | ||||
| newroot=$1; shift | ||||
| pacman_args=("${@:-base}") | ||||
|  | ||||
| [[ -d $newroot ]] || die "%s is not a directory" "$newroot" | ||||
|  | ||||
| pacman_args+=("$pacmode" "${@:-base}" --config="$pacman_config") | ||||
|  | ||||
| if (( ! hostcache )); then | ||||
|   pacman_args+=(--cachedir="$newroot/var/cache/pacman/pkg") | ||||
| @@ -97,26 +140,10 @@ if (( ! interactive )); then | ||||
|   pacman_args+=(--noconfirm) | ||||
| fi | ||||
|  | ||||
| [[ -n $pacman_conf ]] && pacman_args+=(--config="$pacman_conf") | ||||
|  | ||||
| [[ -d $newroot ]] || die "%s is not a directory" "$newroot" | ||||
|  | ||||
| # create obligatory directories | ||||
| create_min_fs "$newroot" | ||||
|  | ||||
| # mount API filesystems | ||||
| chroot_api_mount "$newroot" || die "failed to setup API filesystems in new root" | ||||
|  | ||||
| if (( copykeyring ));then | ||||
|     copy_keyring "$newroot" | ||||
| fi | ||||
|  | ||||
| msg2 'Installing packages to %s' "$newroot" | ||||
| if ! unshare --fork --pid pacman -r "$newroot" $pacmode "${pacman_args[@]}"; then | ||||
|     die 'Failed to install packages to new root' | ||||
| fi | ||||
|  | ||||
|  | ||||
| if (( copymirrorlist ));then | ||||
|     copy_mirrorlist "$newroot" | ||||
| if (( unshare )); then | ||||
|     setup=unshare_setup | ||||
|     "$mount_unshare" bash -c "$(declare_all); basestrap" | ||||
| else | ||||
|     setup=chroot_setup | ||||
|     basestrap | ||||
| fi | ||||
|   | ||||
| @@ -12,10 +12,12 @@ source "${LIBDIR}"/base/message.sh | ||||
| #{{{ filesystems | ||||
|  | ||||
| declare -A pseudofs_types=([anon_inodefs]=1 | ||||
|                         [apparmorfs]=1 | ||||
|                         [autofs]=1 | ||||
|                         [bdev]=1 | ||||
|                         [bpf]=1 | ||||
|                         [binder]=1 | ||||
|                         [binfmt_misc]=1 | ||||
|                         [bpf]=1 | ||||
|                         [cgroup]=1 | ||||
|                         [cgroup2]=1 | ||||
|                         [configfs]=1 | ||||
| @@ -25,31 +27,55 @@ declare -A pseudofs_types=([anon_inodefs]=1 | ||||
|                         [devpts]=1 | ||||
|                         [devtmpfs]=1 | ||||
|                         [dlmfs]=1 | ||||
|                         [dmabuf]=1 | ||||
|                         [drm]=1 | ||||
|                         [efivarfs]=1 | ||||
|                         [fuse]=1 | ||||
|                         [fuse.archivemount]=1 | ||||
|                         [fuse.avfsd]=1 | ||||
|                         [fuse.dumpfs]=1 | ||||
|                         [fuse.encfs]=1 | ||||
|                         [fuse.gvfs-fuse-daemon]=1 | ||||
|                         [fuse.gvfsd-fuse]=1 | ||||
|                         [fuse.lxcfs]=1 | ||||
|                         [fuse.rofiles-fuse]=1 | ||||
|                         [fuse.vmware-vmblock]=1 | ||||
|                         [fuse.xwmfs]=1 | ||||
|                         [fusectl]=1 | ||||
|                         [hugetlbfs]=1 | ||||
|                         [ipathfs]=1 | ||||
|                         [mqueue]=1 | ||||
|                         [nfsd]=1 | ||||
|                         [none]=1 | ||||
|                         [nsfs]=1 | ||||
|                         [overlay]=1 | ||||
|                         [pipefs]=1 | ||||
|                         [proc]=1 | ||||
|                         [pstore]=1 | ||||
|                         [ramfs]=1 | ||||
|                         [resctrl]=1 | ||||
|                         [rootfs]=1 | ||||
|                         [rpc_pipefs]=1 | ||||
|                         [securityfs]=1 | ||||
|                         [selinuxfs]=1 | ||||
|                         [smackfs]=1 | ||||
|                         [sockfs]=1 | ||||
|                         [spufs]=1 | ||||
|                         [sysfs]=1 | ||||
|                         [tmpfs]=1) | ||||
|                         [tmpfs]=1 | ||||
|                         [tracefs]=1 | ||||
|                         [vboxsf]=1 | ||||
|                         [virtiofs]=1) | ||||
|  | ||||
| declare -A fsck_types=([cramfs]=1 | ||||
| declare -A fsck_types=([btrfs]=0    # btrfs doesn't need a regular fsck utility | ||||
|                     [cramfs]=1 | ||||
|                     [erofs]=1 | ||||
|                     [exfat]=1 | ||||
|                     [ext2]=1 | ||||
|                     [ext3]=1 | ||||
|                     [ext4]=1 | ||||
|                     [ext4dev]=1 | ||||
|                     [f2fs]=1 | ||||
|                     [fat]=1 | ||||
|                     [jfs]=1 | ||||
|                     [minix]=1 | ||||
|                     [msdos]=1 | ||||
| @@ -69,11 +95,15 @@ fstype_has_fsck() { | ||||
|     (( fsck_types["$1"] )) | ||||
| } | ||||
|  | ||||
| try_cast() ( | ||||
|     _=$(( $1#$2 )) | ||||
| ) 2>/dev/null | ||||
|  | ||||
| valid_number_of_base() { | ||||
|     local base=$1 len=${#2} i | ||||
|     local base="$1" len=${#2} i | ||||
|  | ||||
|     for (( i = 0; i < len; i++ )); do | ||||
|         { _=$(( $base#${2:i:1} )) || return 1; } 2>/dev/null | ||||
|         try_cast "$base" "${2:i:1}" || return 1 | ||||
|     done | ||||
|  | ||||
|     return 0 | ||||
| @@ -81,7 +111,6 @@ valid_number_of_base() { | ||||
|  | ||||
| mangle() { | ||||
|     local i chr out | ||||
|  | ||||
|     local {a..f}= {A..F}= | ||||
|  | ||||
|     for (( i = 0; i < ${#1}; i++ )); do | ||||
| @@ -100,7 +129,6 @@ mangle() { | ||||
|  | ||||
| unmangle() { | ||||
|     local i chr out len=$(( ${#1} - 4 )) | ||||
|  | ||||
|     local {a..f}= {A..F}= | ||||
|  | ||||
|     for (( i = 0; i < len; i++ )); do | ||||
| @@ -127,7 +155,6 @@ dm_name_for_devnode() { | ||||
|     else | ||||
|         # don't leave the caller hanging, just print the original name | ||||
|         # along with the failure. | ||||
|         print '%s' "$1" | ||||
|         error 'Failed to resolve device mapper name for: %s' "$1" | ||||
|     fi | ||||
| } | ||||
| @@ -185,19 +212,11 @@ optstring_append_option() { | ||||
|     optstring_normalize "$1" | ||||
| } | ||||
|  | ||||
| optstring_prepend_option() { | ||||
|     if ! optstring_has_option "$1" "$2"; then | ||||
|         declare -g "$1=$2,${!1}" | ||||
|     fi | ||||
|  | ||||
|     optstring_normalize "$1" | ||||
| } | ||||
|  | ||||
| optstring_get_option() { | ||||
|     local opts o | ||||
|     local _opts o | ||||
|  | ||||
|     IFS=, read -ra opts <<<"${!1}" | ||||
|     for o in "${opts[@]}"; do | ||||
|     IFS=, read -ra _opts <<<"${!1}" | ||||
|     for o in "${_opts[@]}"; do | ||||
|         if optstring_match_option "$2" "$o"; then | ||||
|             declare -g "$o" | ||||
|             return 0 | ||||
| @@ -214,7 +233,7 @@ optstring_has_option() { | ||||
| } | ||||
|  | ||||
| write_source() { | ||||
|     local src=$1 spec label uuid comment=() | ||||
|     local src="$1" spec label uuid comment=() | ||||
|  | ||||
|     label=$(lsblk -rno LABEL "$1" 2>/dev/null) | ||||
|     uuid=$(lsblk -rno UUID "$1" 2>/dev/null) | ||||
| @@ -242,7 +261,7 @@ write_source() { | ||||
|         ;; | ||||
|     esac | ||||
|  | ||||
|     [[ -n "${comment[*]}" ]] && printf '# %s\n' "${comment[*]}" | ||||
|     [[ -n ${comment[*]} ]] && printf '# %s\n' "${comment[*]}" | ||||
|  | ||||
|     if [[ $spec ]]; then | ||||
|         printf '%-20s' "$bytag=$(mangle "$spec")" | ||||
| @@ -267,15 +286,27 @@ optstring_apply_quirks() { | ||||
|     fi | ||||
|  | ||||
|     case $fstype in | ||||
|         btrfs) | ||||
|             # Having only one of subvol= and subvolid= is enough for mounting a btrfs subvolume | ||||
|             # And having subvolid= set prevents things like 'snapper rollback' to work, as it | ||||
|             # updates the subvolume in-place, leaving subvol= unchanged with a different subvolid. | ||||
|             if optstring_has_option "$varname" subvol; then | ||||
|                 optstring_remove_option "$varname" subvolid | ||||
|             fi | ||||
|         ;; | ||||
|         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 | ||||
|             # These are build-time or runtime-unchangeable options for f2fs. | ||||
|             # The former means that 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 | ||||
|             # The latter means that the options can only be specified/changed | ||||
|             # during the initial mount but not remount. | ||||
|             optstring_remove_option "$varname" noacl,acl,nouser_xattr,user_xattr,atgc | ||||
|         ;; | ||||
|         vfat) | ||||
|             # Before Linux v3.8, "cp" is prepended to the value of the codepage. | ||||
|             if optstring_get_option "$varname" codepage && [[ "$codepage" = cp* ]]; then | ||||
|             # shellcheck disable=SC2154 | ||||
|             if optstring_get_option "$varname" codepage && [[ $codepage = cp* ]]; then | ||||
|                 optstring_remove_option "$varname" codepage | ||||
|                 optstring_append_option "$varname" "codepage=${codepage#cp}" | ||||
|             fi | ||||
| @@ -290,11 +321,12 @@ usage() { | ||||
| usage: ${0##*/} [options] root | ||||
|  | ||||
|   Options: | ||||
|     -f FILTER      Restrict output to mountpoints matching the prefix FILTER | ||||
|     -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 | ||||
|     -t TAG         Use TAG for source identifiers | ||||
|     -P             Include pseudofs mounts | ||||
|     -t <tag>       Use TAG for source identifiers (TAG should be one of: LABEL, | ||||
|                       UUID, PARTLABEL, PARTUUID) | ||||
|     -U             Use UUIDs for source identifiers (shortcut for -t UUID) | ||||
|  | ||||
|     -h             Print this help message | ||||
| @@ -332,7 +364,6 @@ if ! mountpoint -q "$root"; then | ||||
| fi | ||||
|  | ||||
| # handle block devices | ||||
| findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root" | | ||||
| while read -r src target fstype opts fsroot; do | ||||
|     if (( !pseudofs )) && fstype_is_pseudofs "$fstype"; then | ||||
|         continue | ||||
| @@ -360,6 +391,7 @@ while read -r src target fstype opts fsroot; do | ||||
|     if [[ $fsroot != / && $fstype != btrfs ]]; then | ||||
|         # it's a bind mount | ||||
|         src=$(findmnt -funcevo TARGET "$src")$fsroot | ||||
|         src="/${src#"$root"/}" | ||||
|         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, | ||||
| @@ -393,7 +425,7 @@ while read -r src target fstype opts fsroot; do | ||||
|     printf '\t%-10s' "/$(mangle "${target#/}")" "$fstype" "$opts" | ||||
|     printf '\t%s %s' "$dump" "$pass" | ||||
|     printf '\n\n' | ||||
| done | ||||
| done < <(findmnt -Recvruno SOURCE,TARGET,FSTYPE,OPTIONS,FSROOT "$root") | ||||
|  | ||||
| # handle swaps devices | ||||
| { | ||||
| @@ -409,6 +441,9 @@ done | ||||
|         # skip files marked deleted by the kernel | ||||
|         [[ $device = *'\040(deleted)' ]] && continue | ||||
|  | ||||
|         # skip devices not part of the prefix | ||||
|         [[ $device = "$prefixfilter"* ]] || continue | ||||
|  | ||||
|         if [[ $type = file ]]; then | ||||
|             printf '%-20s' "${device#"${root%/}"}" | ||||
|         elif [[ $device = /dev/dm-+([0-9]) ]]; then | ||||
|   | ||||
| @@ -6,20 +6,16 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/iso/util.sh | ||||
| source "${LIBDIR}"/iso/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/base/mount.sh | ||||
| # shellcheck source=src/lib/iso/mount.sh | ||||
| source "${LIBDIR}"/iso/mount.sh | ||||
| # shellcheck source=src/lib/iso/services.sh | ||||
| source "${LIBDIR}"/iso/services.sh | ||||
| # shellcheck source=src/lib/base/yaml.sh | ||||
| source "${LIBDIR}"/base/yaml.sh | ||||
| # shellcheck source=src/lib/iso/calamares.sh | ||||
| source "${LIBDIR}"/iso/calamares.sh | ||||
| # shellcheck source=src/lib/iso/config.sh | ||||
| @@ -92,9 +88,15 @@ make_rootfs() { | ||||
|         msg "Prepare [Base installation] (rootfs)" | ||||
|         local rootfs="${work_dir}/rootfs" | ||||
|  | ||||
|         load_pkgs "${root_list}" | ||||
|  | ||||
|         prepare_dir "${rootfs}" | ||||
|  | ||||
|         basestrap "${basestrap_args[@]}" "${rootfs}" "${packages[@]}" | ||||
|         local args=() | ||||
|         if "${copy_pacconf}"; then | ||||
|             args+=(-P) | ||||
|         fi | ||||
|         basestrap "${basestrap_args[@]}" "${args[@]}" "${rootfs}" "${packages[@]}" | ||||
|  | ||||
|         copy_overlay "${root_overlay}" "${rootfs}" | ||||
|  | ||||
| @@ -113,6 +115,8 @@ make_livefs() { | ||||
|         msg "Prepare [Live installation] (livefs)" | ||||
|         local livefs="${work_dir}/livefs" | ||||
|  | ||||
|         load_pkgs "${live_list}" | ||||
|  | ||||
|         prepare_dir "${livefs}" | ||||
|  | ||||
|         mount_overlayfs "${livefs}" "${work_dir}" | ||||
| @@ -137,6 +141,8 @@ make_bootfs() { | ||||
|     if [[ ! -e ${work_dir}/bootfs.lock ]]; then | ||||
|         msg "Prepare [/iso/boot]" | ||||
|  | ||||
|         load_pkgs "${common_dir}/Packages-boot" | ||||
|  | ||||
|         prepare_dir "${iso_root}/boot" | ||||
|  | ||||
|         cp "${work_dir}"/rootfs/boot/vmlinuz* "${iso_root}"/boot/vmlinuz-"${arch}" | ||||
| @@ -148,6 +154,7 @@ make_bootfs() { | ||||
|         if "${use_dracut}"; then | ||||
|             prepare_initramfs_dracut "${bootfs}" | ||||
|         else | ||||
|             basestrap "${basestrap_args[@]}" "${bootfs}" "${packages[@]}" | ||||
|             prepare_initramfs_mkinitcpio "${bootfs}" | ||||
|         fi | ||||
|  | ||||
| @@ -183,8 +190,8 @@ gen_iso_fn(){ | ||||
|     local vars=("artix") name | ||||
|     vars+=("${profile}") | ||||
|     vars+=("${INITSYS}") | ||||
|     case "${repo}" in | ||||
|         *-gremlins|*-goblins) vars+=("${repo#*-}") ;; | ||||
|     case "${STABILITY}" in | ||||
|         gremlins|goblins) vars+=("${STABILITY}") ;; | ||||
|     esac | ||||
|     vars+=("${ISO_VERSION}") | ||||
|     vars+=("${arch}") | ||||
| @@ -194,12 +201,22 @@ gen_iso_fn(){ | ||||
|     printf "%s\n" "$name" | ||||
| } | ||||
|  | ||||
| export_gpg_publickey() { | ||||
|     key_export="${WORKSPACE_DIR}"/pubkey.gpg | ||||
|     gpg --batch  --no-armor --output "${key_export}" --export "${GPG_KEY}" | ||||
| } | ||||
|  | ||||
| prepare_build(){ | ||||
|     load_profile | ||||
|     local pac_conf | ||||
|  | ||||
|     pacman_conf="${DATADIR}/pacman.conf.d/${repo}-${arch}.conf" | ||||
|     if [[ -f "${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf" ]]; then | ||||
|         pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${repo}-${arch}.conf" | ||||
|     pac_conf=iso-${arch}.conf | ||||
|     if [[ "${STABILITY}" != 'stable' ]]; then | ||||
|         pac_conf=iso-${STABILITY}-${arch}.conf | ||||
|     fi | ||||
|     pacman_conf="${DATADIR}/pacman.conf.d/${pac_conf}" | ||||
|     if [[ -f "${USER_CONF_DIR}/pacman.conf.d/${pac_conf}" ]]; then | ||||
|         pacman_conf="${USER_CONF_DIR}/pacman.conf.d/${pac_conf}" | ||||
|     fi | ||||
|  | ||||
|     iso_file=$(gen_iso_fn).iso | ||||
| @@ -262,10 +279,8 @@ mk_boot(){ | ||||
| } | ||||
|  | ||||
| mk_chroots(){ | ||||
|     load_pkgs "${root_list}" | ||||
|     run_safe "make_rootfs" | ||||
|     if [[ -n ${live_list} ]]; then | ||||
|         load_pkgs "${live_list}" | ||||
|         run_safe "make_livefs" | ||||
|     fi | ||||
| } | ||||
| @@ -322,11 +337,11 @@ persist=false | ||||
| use_dracut=false | ||||
| squash_only=false | ||||
| boot_only=false | ||||
| copy_pacconf=false | ||||
|  | ||||
| basestrap_args=(-GMc) | ||||
| cmd=${0##*/} | ||||
|  | ||||
| repo=${REPO} | ||||
| owner=${SUDO_USER:-$USER} | ||||
| profile='base' | ||||
| chroots_iso="${CHROOTS_DIR}/buildiso" | ||||
| @@ -337,8 +352,8 @@ usage() { | ||||
|     printf '    -p <profile>       Profile [default: %s]\n' "${profile}" | ||||
|     printf '    -r <dir>           Chroots directory\n' | ||||
|     printf '                       [default: %s]\n' "${chroots_iso}" | ||||
|     printf '    -R <repo>          Build repo\n' | ||||
|     printf '                       [default: %s]\n' "${repo}" | ||||
|     printf '    -R <stability>     Build stability\n' | ||||
|     printf '                       [default: %s]\n' "${STABILITY}" | ||||
|     printf '    -a <arch>          Build arch\n' | ||||
|     printf '                       [default: %s]\n' "${arch}" | ||||
|     printf '    -t <dir>           Target directory\n' | ||||
| @@ -355,6 +370,7 @@ usage() { | ||||
|     printf '    -z                 Generate iso only\n' | ||||
|     printf '                       Requires pre built images (-x)\n' | ||||
|     printf '    -d                 Use dracut instead of mkinitcpio for iso initramfs\n' | ||||
|     printf '    -w                 Copy the pacman.conf used to the rootfs\n' | ||||
|     printf '    -q                 Query settings and pretend build\n' | ||||
|     printf '    -h                 This help\n' | ||||
|     printf '\n' | ||||
| @@ -364,13 +380,13 @@ usage() { | ||||
|  | ||||
| orig_args=("$@") | ||||
|  | ||||
| opts='p:r:R:t:i:g:a:czsbxmdqh' | ||||
| opts='p:r:R:t:i:g:a:czsbxwmdqh' | ||||
|  | ||||
| while getopts "${opts}" arg; do | ||||
|     case "${arg}" in | ||||
|         p) profile="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         R) repo="$OPTARG" ;; | ||||
|         R) STABILITY="$OPTARG" ;; | ||||
|         r) chroots_iso="$OPTARG" ;; | ||||
|         t) ISO_POOL="$OPTARG" ;; | ||||
|         i) INITSYS="$OPTARG" ;; | ||||
| @@ -382,6 +398,7 @@ while getopts "${opts}" arg; do | ||||
|         b) boot_only=true ;; | ||||
|         m) persist=true ;; | ||||
|         d) use_dracut=true ;; | ||||
|         w) copy_pacconf=true ;; | ||||
|         q) pretend=true ;; | ||||
|         h|?) usage 0 ;; | ||||
|     esac | ||||
|   | ||||
| @@ -81,7 +81,7 @@ trap_abort() { | ||||
| trap_exit() { | ||||
|     local r=$? | ||||
|     trap - EXIT INT QUIT TERM HUP | ||||
|     cleanup $r | ||||
|     cleanup "$r" | ||||
| } | ||||
|  | ||||
| cleanup() { | ||||
|   | ||||
| @@ -9,73 +9,39 @@ ignore_error() { | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| trap_setup(){ | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap "$1" EXIT | ||||
| } | ||||
|  | ||||
| chroot_mount() { | ||||
| chroot_add_mount() { | ||||
| #     msg2 "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() { | ||||
| chroot_maybe_add_mount() { | ||||
|     local cond=$1; shift | ||||
|     if eval "$cond"; then | ||||
|         chroot_mount "$@" | ||||
|         chroot_add_mount "$@" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| chroot_setup(){ | ||||
|     local mnt="$1" | ||||
|     local tmpfs_opts="${2:-mode=1777,strictatime,nodev,nosuid}" | ||||
|     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" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}" | ||||
| } | ||||
|  | ||||
| chroot_api_mount() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     trap_setup chroot_api_umount | ||||
|     chroot_setup "$1" "$2" | ||||
|     [[ $(trap -p EXIT) ]] && die 'Error! Attempting to overwrite existing EXIT trap' | ||||
|     trap 'chroot_teardown' EXIT | ||||
|  | ||||
|     #chroot_maybe_add_mount "! mountpoint -q '$mnt'" "$mnt" "$mnt" --bind && | ||||
|     chroot_add_mount proc "$mnt/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_add_mount sys "$mnt/sys" -t sysfs -o nosuid,noexec,nodev,ro && | ||||
|     ignore_error chroot_maybe_add_mount "[[ -d '$mnt/sys/firmware/efi/efivars' ]]" \ | ||||
|         efivarfs "$mnt/sys/firmware/efi/efivars" -t efivarfs -o nosuid,noexec,nodev && | ||||
|     chroot_add_mount udev "$mnt/dev" -t devtmpfs -o mode=0755,nosuid && | ||||
|     chroot_add_mount devpts "$mnt/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec && | ||||
|     chroot_add_mount shm "$mnt/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev && | ||||
|     chroot_add_mount /run "$mnt/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_add_mount tmp "$mnt/tmp" -t tmpfs -o "${tmpfs_opts}" | ||||
| } | ||||
|  | ||||
| chroot_api_umount() { | ||||
| chroot_teardown() { | ||||
|     if (( ${#CHROOT_ACTIVE_MOUNTS[@]} )); then | ||||
| #         msg2 "umount: [%s]" "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
|         umount "${CHROOT_ACTIVE_MOUNTS[@]}" | ||||
| @@ -83,4 +49,40 @@ chroot_api_umount() { | ||||
|     unset CHROOT_ACTIVE_MOUNTS | ||||
| } | ||||
|  | ||||
| resolve_link() { | ||||
|     local target=$1 | ||||
|     local root=$2 | ||||
|  | ||||
|     # If a root was given, make sure it ends in a slash. | ||||
|     [[ -n $root && $root != */ ]] && root=$root/ | ||||
|  | ||||
|     while [[ -L $target ]]; do | ||||
|         target=$(readlink -m "$target") | ||||
|         # If a root was given, make sure the target is under it. | ||||
|         # Make sure to strip any leading slash from target first. | ||||
|         [[ -n $root && $target != $root* ]] && target=$root${target#/} | ||||
|     done | ||||
|  | ||||
|     printf %s "$target" | ||||
| } | ||||
|  | ||||
| chroot_add_resolv_conf() { | ||||
|     local chrootdir=$1 | ||||
|     local src | ||||
|     local dest="$chrootdir/etc/resolv.conf" | ||||
|  | ||||
|     src=$(resolve_link /etc/resolv.conf) | ||||
|  | ||||
|     # If we don't have a source resolv.conf file, there's nothing useful we can do. | ||||
|     [[ -e $src ]] || return 0 | ||||
|  | ||||
|     if [[ ! -e "$dest" && ! -h "$dest" ]]; then | ||||
|             # There may be no resolv.conf in the chroot. In this case, we'll just exit. | ||||
|             # The chroot environment must not be concerned with DNS resolution. | ||||
|             return 0 | ||||
|     fi | ||||
|  | ||||
|     chroot_add_mount "$src" "$dest" -c --bind | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
							
								
								
									
										78
									
								
								src/lib/base/unshare-mount.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								src/lib/base/unshare-mount.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,78 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #{{{ mount | ||||
|  | ||||
| chroot_add_mount_lazy() { | ||||
|     mount "$@" && CHROOT_ACTIVE_LAZY=("$2" "${CHROOT_ACTIVE_LAZY[@]}") | ||||
| } | ||||
|  | ||||
| chroot_bind_device() { | ||||
|     touch "$2" && CHROOT_ACTIVE_FILES=("$2" "${CHROOT_ACTIVE_FILES[@]}") | ||||
|     chroot_add_mount "$1" "$2" --bind | ||||
| } | ||||
|  | ||||
| chroot_add_link() { | ||||
|     ln -sf "$1" "$2" && CHROOT_ACTIVE_FILES=("$2" "${CHROOT_ACTIVE_FILES[@]}") | ||||
| } | ||||
|  | ||||
| unshare_setup() { | ||||
|     CHROOT_ACTIVE_MOUNTS=() | ||||
|     CHROOT_ACTIVE_LAZY=() | ||||
|     CHROOT_ACTIVE_FILES=() | ||||
|     [[ $(trap -p EXIT) ]] && die '(BUG): attempting to overwrite existing EXIT trap' | ||||
|     trap 'unshare_teardown' EXIT | ||||
|  | ||||
|     chroot_add_mount_lazy "$1" "$1" --bind && | ||||
|     chroot_add_mount proc "$1/proc" -t proc -o nosuid,noexec,nodev && | ||||
|     chroot_add_mount_lazy /sys "$1/sys" --rbind && | ||||
|     chroot_add_link /proc/self/fd "$1/dev/fd" && | ||||
|     chroot_add_link /proc/self/fd/0 "$1/dev/stdin" && | ||||
|     chroot_add_link /proc/self/fd/1 "$1/dev/stdout" && | ||||
|     chroot_add_link /proc/self/fd/2 "$1/dev/stderr" && | ||||
|     chroot_bind_device /dev/full "$1/dev/full" && | ||||
|     chroot_bind_device /dev/null "$1/dev/null" && | ||||
|     chroot_bind_device /dev/random "$1/dev/random" && | ||||
|     chroot_bind_device /dev/tty "$1/dev/tty" && | ||||
|     chroot_bind_device /dev/urandom "$1/dev/urandom" && | ||||
|     chroot_bind_device /dev/zero "$1/dev/zero" && | ||||
|     chroot_add_mount run "$1/run" -t tmpfs -o nosuid,nodev,mode=0755 && | ||||
|     chroot_add_mount tmp "$1/tmp" -t tmpfs -o mode=1777,strictatime,nodev,nosuid | ||||
| } | ||||
|  | ||||
| unshare_teardown() { | ||||
|     chroot_teardown | ||||
|  | ||||
|     if (( ${#CHROOT_ACTIVE_LAZY[@]} )); then | ||||
|         umount --lazy "${CHROOT_ACTIVE_LAZY[@]}" | ||||
|     fi | ||||
|     unset CHROOT_ACTIVE_LAZY | ||||
|  | ||||
|     if (( ${#CHROOT_ACTIVE_FILES[@]} )); then | ||||
|         rm "${CHROOT_ACTIVE_FILES[@]}" | ||||
|     fi | ||||
|     unset CHROOT_ACTIVE_FILES | ||||
| } | ||||
|  | ||||
| pid_unshare="unshare --fork --pid" | ||||
| mount_unshare="$pid_unshare --mount --map-auto --map-root-user --setuid 0 --setgid 0" | ||||
|  | ||||
| # This outputs code for declaring all variables to stdout. For example, if | ||||
| # FOO=BAR, then running | ||||
| #     declare -p FOO | ||||
| # will result in the output | ||||
| #     declare -- FOO="bar" | ||||
| # This function may be used to re-declare all currently used variables and | ||||
| # functions in a new shell. | ||||
| declare_all() { | ||||
|   # Remove read-only variables to avoid warnings. Unfortunately, declare +r -p | ||||
|   # doesn't work like it looks like it should (declaring only read-write | ||||
|   # variables). However, declare -rp will print out read-only variables, which | ||||
|   # we can then use to remove those definitions. | ||||
|   declare -p | grep -Fvf <(declare -rp) | ||||
|   # Then declare functions | ||||
|   declare -pf | ||||
| } | ||||
|  | ||||
| #}}} | ||||
| @@ -1,48 +0,0 @@ | ||||
| #!/hint/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| #{{{ base conf | ||||
|  | ||||
| prepare_dir(){ | ||||
|     [[ ! -d $1 ]] && mkdir -p "$1" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| if [[ -n $SUDO_USER ]]; then | ||||
|     eval "USER_HOME=~$SUDO_USER" | ||||
| else | ||||
|     USER_HOME=$HOME | ||||
| fi | ||||
|  | ||||
| USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" | ||||
|  | ||||
| prepare_dir "${USER_CONF_DIR}" | ||||
|  | ||||
| load_base_config(){ | ||||
|  | ||||
|     local conf="$1/artools-base.conf" | ||||
|  | ||||
|     [[ -f "$conf" ]] || return 1 | ||||
|  | ||||
|     # shellcheck source=config/conf/artools-base.conf | ||||
|     [[ -r "$conf" ]] && source "$conf" | ||||
|  | ||||
|     CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} | ||||
|  | ||||
|     WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} | ||||
|  | ||||
|     ARCH=${ARCH:-"$(uname -m)"} | ||||
|  | ||||
|     REPO=${REPO:-'world'} | ||||
|  | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|  | ||||
|  | ||||
| load_base_config "${USER_CONF_DIR}" || load_base_config "${SYSCONFDIR}" | ||||
|  | ||||
| prepare_dir "${WORKSPACE_DIR}" | ||||
|  | ||||
| @@ -4,53 +4,29 @@ | ||||
|  | ||||
| #{{{ calamares | ||||
|  | ||||
| write_services_conf(){ | ||||
|     local key1="$1" val1="$2" key2="$3" val2="$4" | ||||
|     local yaml | ||||
|     yaml=$(write_yaml_header) | ||||
|     yaml+=$(write_yaml_map 0 "$key1" "$val1") | ||||
|     yaml+=$(write_yaml_map 0 "$key2" "$val2") | ||||
|     yaml+=$(write_yaml_map 0 'services') | ||||
|     for svc in "${SERVICES[@]}"; do | ||||
|         yaml+=$(write_yaml_seq 2 "$svc") | ||||
| yaml_array() { | ||||
|     local array yaml | ||||
|  | ||||
|     for entry in "$@"; do | ||||
|         yaml="{name: ${entry}, action: enable, alias: add, target: default}" | ||||
|         array="${array:-}${array:+,} ${yaml}" | ||||
|     done | ||||
|     yaml+=$(write_empty_line) | ||||
|     printf '%s\n' "${yaml}" | ||||
| } | ||||
|  | ||||
| write_services_openrc_conf(){ | ||||
|     local conf="$1"/services-openrc.conf | ||||
|     write_services_conf 'initdDir' '/etc/init.d' 'runlevelsDir' '/etc/runlevels' > "$conf" | ||||
| } | ||||
|  | ||||
| write_services_runit_conf(){ | ||||
|     local conf="$1"/services-runit.conf | ||||
|     write_services_conf 'svDir' '/etc/runit/sv' 'runsvDir' '/etc/runit/runsvdir' > "$conf" | ||||
| } | ||||
|  | ||||
| write_services_s6_conf(){ | ||||
|     local conf="$1"/services-s6.conf | ||||
|     write_services_conf 'svDir' '/etc/s6/sv' 'dbDir' '/etc/s6/rc/compiled' > "$conf" | ||||
|     printf '%s\n' "defaultBundle: default" >> "$conf" | ||||
| } | ||||
|  | ||||
| write_services_suite66_conf(){ | ||||
|     local conf="$1"/services-suite66.conf | ||||
|     write_services_conf 'svDir' '/etc/66/service' 'runsvDir' '/var/lib/66/system' > "$conf" | ||||
| } | ||||
|  | ||||
| write_services_dinit_conf(){ | ||||
|     local conf="$1"/services-dinit.conf | ||||
|     write_services_conf 'initdDir' '/etc/dinit.d' 'runsvDir' '/etc/dinit.d/boot.d' > "$conf" | ||||
|     printf "%s\n" "[${array}]" | ||||
| } | ||||
|  | ||||
| configure_calamares(){ | ||||
|     local mods="$1/etc/calamares/modules" | ||||
|     if [[ -d "$mods" ]];then | ||||
|         msg2 "Configuring: Calamares" | ||||
|         write_services_"${INITSYS}"_conf "$mods" | ||||
|         sed -e "s|services-openrc|services-${INITSYS}|" \ | ||||
|             -i "$1"/etc/calamares/settings.conf | ||||
|  | ||||
|         if [[ -f "$mods"/services-artix.conf ]]; then | ||||
|             local svc init | ||||
|             init="${INITSYS}" svc=$(yaml_array "${SERVICES[@]}") \ | ||||
|                 yq -P 'with(.; | ||||
|                         .manager = env(init) | | ||||
|                         .services = env(svc) )' \ | ||||
|                     -i "$mods"/services-artix.conf | ||||
|         fi | ||||
|     fi | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -13,7 +13,6 @@ prepare_boot_extras(){ | ||||
|     done | ||||
|  | ||||
|     cp "$src"/boot/memtest86+/memtest.bin "$dest"/memtest | ||||
|     cp "$src"/usr/share/licenses/common/GPL2/license.txt "$dest"/memtest.COPYING | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -4,41 +4,15 @@ | ||||
|  | ||||
| #{{{ initcpio | ||||
|  | ||||
| make_checksum(){ | ||||
|     local file="$1" | ||||
|     msg2 "Creating md5sum ..." | ||||
|     cd "${iso_root}${live_dir}" | ||||
|     md5sum "$file" > "$file".md5 | ||||
|     cd "${OLDPWD}" | ||||
| } | ||||
|  | ||||
| make_sig () { | ||||
|     local file="$1" | ||||
|     msg2 "Creating signature file..." | ||||
|     chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" | ||||
|     su "${owner}" -c "gpg --detach-sign --output $file.sig --default-key ${GPG_KEY} $file" | ||||
|     chown "root:root" "${iso_root}${live_dir}" | ||||
| } | ||||
|  | ||||
| export_gpg_publickey() { | ||||
|     key_export=${WORKSPACE_DIR}/pubkey.gpg | ||||
|     if [[ ! -e "${key_export}" ]]; then | ||||
|         gpg --batch --output "${key_export}" --export "${GPG_KEY}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| prepare_initramfs_mkinitcpio() { | ||||
|     local mnt="$1" packages=() mkinitcpio_conf k | ||||
|     local mnt="$1" mkinitcpio_conf k | ||||
|  | ||||
|     mkinitcpio_conf=mkinitcpio-default.conf | ||||
|     [[ "${profile}" == 'base' ]] && mkinitcpio_conf=mkinitcpio-pxe.conf | ||||
|     k=$(<"$mnt"/usr/src/linux/version) | ||||
|  | ||||
|     packages+=($(read_from_list "${common_dir}/Packages-boot")) | ||||
|     basestrap "${basestrap_args[@]}" "$mnt" "${packages[@]}" | ||||
|  | ||||
|     if [[ -n "${GPG_KEY}" ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<>"${key_export}" | ||||
|     if [[ -v key_export ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<"${key_export}" | ||||
|         export ARTIX_GNUPG_FD | ||||
|     fi | ||||
|  | ||||
| @@ -46,13 +20,11 @@ prepare_initramfs_mkinitcpio() { | ||||
|         -c /etc/"$mkinitcpio_conf" \ | ||||
|         -g /boot/initramfs.img | ||||
|  | ||||
|     if [[ -n "${GPG_KEY}" ]]; then | ||||
|     if [[ -v key_export ]]; then | ||||
|         exec {ARTIX_GNUPG_FD}<&- | ||||
|         unset ARTIX_GNUPG_FD | ||||
|     fi | ||||
|     if [[ -f "${key_export}" ]]; then | ||||
|         rm "${key_export}" | ||||
|     fi | ||||
|     rm -rf -- "${key_export}" | ||||
|     cp "$mnt"/boot/initramfs.img "${iso_root}"/boot/initramfs-"${arch}".img | ||||
|     prepare_boot_extras "$mnt" | ||||
| } | ||||
|   | ||||
| @@ -5,13 +5,13 @@ | ||||
| #{{{ iso | ||||
|  | ||||
| get_disturl(){ | ||||
|     # shellcheck disable=1091 | ||||
|     # shellcheck disable=SC2034 | ||||
|     . /usr/lib/os-release | ||||
|     printf "%s\n" "${HOME_URL}" | ||||
| } | ||||
|  | ||||
| get_osname(){ | ||||
|     # shellcheck disable=1091 | ||||
|     # shellcheck disable=SC2034 | ||||
|     . /usr/lib/os-release | ||||
|     printf "%s\n" "${NAME}" | ||||
| } | ||||
|   | ||||
| @@ -26,7 +26,7 @@ load_profile(){ | ||||
|  | ||||
|     [[ -f $profile_dir/${profile}/profile.conf ]] || return 1 | ||||
|  | ||||
|     # shellcheck disable=1090 | ||||
|     # shellcheck source=contrib/iso/profile.conf.example | ||||
|     [[ -r "$profile_dir/${profile}"/profile.conf ]] && . "$profile_dir/${profile}"/profile.conf | ||||
|  | ||||
|     AUTOLOGIN=${AUTOLOGIN:-true} | ||||
| @@ -43,20 +43,35 @@ load_profile(){ | ||||
| read_from_list() { | ||||
|     local list="$1" | ||||
|     local _space="s| ||g" | ||||
|     local _clean=':a;N;$!ba;s/\n/ /g' | ||||
|     #local _clean=':a;N;$!ba;s/\n/ /g' | ||||
|     local _clean='/^$/d' | ||||
|     local _com_rm="s|#.*||g" | ||||
|     local _init="s|@initsys@|${INITSYS}|g" | ||||
|     local pkgs | ||||
|  | ||||
|     mapfile -t pkgs < <(sed "$_com_rm" "$list" \ | ||||
|             | sed "$_space" \ | ||||
|             | sed "$_init" \ | ||||
|             | sed "$_clean") | ||||
|  | ||||
|     printf "%s\n" "${pkgs[@]}" | ||||
|             | sed "$_clean" | sort -u) | ||||
| } | ||||
|  | ||||
| read_from_services() { | ||||
| load_pkgs(){ | ||||
|     local pkglist="$1" | ||||
|     packages=() | ||||
|  | ||||
|     if [[ "${pkglist##*/}" == "Packages-Root" ]]; then | ||||
|         for l in base apps "${INITSYS}"; do | ||||
|             msg2 "Loading Packages: [%s] ..." "Packages-${l}" | ||||
|             read_from_list "${common_dir}/Packages-${l}" | ||||
|             packages+=("${pkgs[@]}") | ||||
|  | ||||
|         done | ||||
|  | ||||
|         if [[ -n "${live_list}" ]]; then | ||||
|             msg2 "Loading Packages: [Packages-xorg] ..." | ||||
|             read_from_list "${common_dir}/Packages-xorg" | ||||
|             packages+=("${pkgs[@]}") | ||||
|         fi | ||||
|  | ||||
|         for svc in "${SERVICES[@]}"; do | ||||
|             case "$svc" in | ||||
|                 sddm|gdm|lightdm|mdm|greetd|lxdm|xdm) | ||||
| @@ -68,28 +83,11 @@ read_from_services() { | ||||
|                 syslog-ng|metalog) packages+=("$svc-${INITSYS}") ;; | ||||
|             esac | ||||
|         done | ||||
| } | ||||
|  | ||||
| load_pkgs(){ | ||||
|     local pkglist="$1" | ||||
|     packages=() | ||||
|  | ||||
|     if [[ "${pkglist##*/}" == "Packages-Root" ]]; then | ||||
|         for l in base apps "${INITSYS}"; do | ||||
|             msg2 "Loading Packages: [%s] ..." "Packages-${l}" | ||||
|             packages+=($(read_from_list "${common_dir}/Packages-${l}")) | ||||
|         done | ||||
|         if [[ -n "${live_list}" ]]; then | ||||
|             msg2 "Loading Packages: [%s] ..." "Packages-xorg" | ||||
|             packages+=($(read_from_list "${common_dir}/Packages-xorg")) | ||||
|     fi | ||||
|     msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" | ||||
|         packages+=($(read_from_list "${pkglist}")) | ||||
|         read_from_services | ||||
|     else | ||||
|         msg2 "Loading Packages: [%s] ..." "${pkglist##*/}" | ||||
|         packages+=($(read_from_list "${pkglist}")) | ||||
|     fi | ||||
|     read_from_list "${pkglist}" | ||||
|     packages+=("${pkgs[@]}") | ||||
| } | ||||
|  | ||||
| #}}} | ||||
|   | ||||
| @@ -4,6 +4,24 @@ | ||||
|  | ||||
| #{{{ squash | ||||
|  | ||||
| make_checksum(){ | ||||
|     local file="$1" | ||||
|     msg2 "Creating md5sum ..." | ||||
|     cd "${iso_root}${live_dir}" | ||||
|     md5sum "$file" > "$file".md5 | ||||
|     cd "${OLDPWD}" | ||||
| } | ||||
|  | ||||
| make_sig () { | ||||
|     local file="$1" | ||||
|     msg2 "Creating signature file..." | ||||
|  | ||||
|     chown "${owner}:$(id --group "${owner}")" "${iso_root}${live_dir}" | ||||
|     su "${owner}" -c "gpg --batch --no-armor --no-include-key-block --output $file.sig  --detach-sign \ | ||||
|         --default-key ${GPG_KEY} ${gpg_options[@]} $file" | ||||
|     chown "root:root" "${iso_root}${live_dir}" | ||||
| } | ||||
|  | ||||
| make_ext_img(){ | ||||
|     local src="$1" | ||||
|     local size=32G | ||||
|   | ||||
| @@ -4,6 +4,21 @@ | ||||
|  | ||||
| #{{{ iso conf | ||||
|  | ||||
| prepare_dir(){ | ||||
|     [[ ! -d $1 ]] && mkdir -p "$1" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| if [[ -n $SUDO_USER ]]; then | ||||
|     eval "USER_HOME=~$SUDO_USER" | ||||
| else | ||||
|     USER_HOME=$HOME | ||||
| fi | ||||
|  | ||||
| USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" | ||||
|  | ||||
| prepare_dir "${USER_CONF_DIR}" | ||||
|  | ||||
| load_iso_config(){ | ||||
|  | ||||
|     local conf="$1/artools-iso.conf" | ||||
| @@ -13,6 +28,14 @@ load_iso_config(){ | ||||
|     # shellcheck source=config/conf/artools-iso.conf | ||||
|     [[ -r "$conf" ]] && source "$conf" | ||||
|  | ||||
|     CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} | ||||
|  | ||||
|     WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} | ||||
|  | ||||
|     ARCH=${ARCH:-"$(uname -m)"} | ||||
|  | ||||
|     STABILITY=${STABILITY:-'stable'} | ||||
|  | ||||
|     ISO_POOL=${ISO_POOL:-"${WORKSPACE_DIR}/iso"} | ||||
|  | ||||
|     ISO_VERSION=${ISO_VERSION:-"$(date +%Y%m%d)"} | ||||
|   | ||||
| @@ -15,6 +15,7 @@ artixpkg_admin_usage() { | ||||
|     COMMANDS | ||||
|         transfer          Transfer obsolete repository to landfill | ||||
|         query             Query maintainers and topics | ||||
|         topic             Manage topics | ||||
|  | ||||
|     OPTIONS | ||||
|         -h, --help     Show this help text | ||||
| @@ -55,6 +56,14 @@ artixpkg_admin() { | ||||
|             artixpkg_admin_query "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         topic) | ||||
|             _ARTOOLS_COMMAND+=" $1" | ||||
|             shift | ||||
|             # shellcheck source=src/lib/pkg/admin/query.sh | ||||
|             source "${LIBDIR}"/pkg/admin/topic.sh | ||||
|             artixpkg_admin_topic "$@" | ||||
|             exit 0 | ||||
|         ;; | ||||
|         -*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|   | ||||
| @@ -19,8 +19,8 @@ artixpkg_admin_query_usage() { | ||||
|         -h, --help                 Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} --maintainer maintainer-mynickname | ||||
|         $ ${COMMAND} --topic myopic | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic mytopic | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
|   | ||||
							
								
								
									
										139
									
								
								src/lib/pkg/admin/topic.sh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										139
									
								
								src/lib/pkg/admin/topic.sh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,139 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| [[ -z ${ARTOOLS_INCLUDE_ADMIN_TOPIC_SH:-} ]] || return 0 | ||||
| ARTOOLS_INCLUDE_ADMIN_TOPIC_SH=1 | ||||
|  | ||||
| set -e | ||||
|  | ||||
|  | ||||
| artixpkg_admin_topic_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
|     Usage: ${COMMAND} [OPTIONS] [PKGBASE]... | ||||
|  | ||||
|     OPTIONS | ||||
|         -a, --add              Add a topic | ||||
|         -d, --del              Delete a topic | ||||
|         -j, --jobs N           Run up to N jobs in parallel (default: $(nproc)) | ||||
|         -h, --help             Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} --add mytopic libfoo | ||||
|         $ ${COMMAND} --del mytopic libbar | ||||
|         $ ${COMMAND} --add mytopic libfoo libbar | ||||
|         $ ${COMMAND} --del mytopic libfoo libbar | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
| artixpkg_admin_topic() { | ||||
|     if (( $# < 1 )); then | ||||
|         artixpkg_admin_topic_usage | ||||
|         exit 0 | ||||
|     fi | ||||
|  | ||||
|     # options | ||||
|     local pkgbases=() | ||||
|     local pkgbase | ||||
|  | ||||
|     local ADD_TOPIC | ||||
|     local DEL_TOPIC | ||||
|     local ADD=0 | ||||
|     local DEL=0 | ||||
|     local jobs= | ||||
|     jobs=$(nproc) | ||||
|  | ||||
|     local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
|             -a|--add) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 ADD_TOPIC="$2" | ||||
|                 ADD=1 | ||||
|                 RUNCMD+=" -a ${ADD_TOPIC}" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --add=*) | ||||
|                 ADD_TOPIC="${1#*=}" | ||||
|                 ADD=1 | ||||
|                 RUNCMD+=" --add=${ADD_TOPIC}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -d|--del) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 DEL_TOPIC="$2" | ||||
|                 DEL=1 | ||||
|                 RUNCMD+=" -d ${DEL_TOPIC}" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --del=*) | ||||
|                 DEL_TOPIC="${1#*=}" | ||||
|                 DEL=1 | ||||
|                 RUNCMD+=" --del=${DEL_TOPIC}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -h|--help) | ||||
|                 artixpkg_admin_topic_usage | ||||
|                 exit 0 | ||||
|             ;; | ||||
|             -j|--jobs) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 jobs=$2 | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --) | ||||
|                 shift | ||||
|                 break | ||||
|             ;; | ||||
|             -*) | ||||
|                 die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|             *) | ||||
|                 break | ||||
|             ;; | ||||
|         esac | ||||
|     done | ||||
|  | ||||
|     pkgbases+=("$@") | ||||
|  | ||||
|     if [[ -n ${GIT_TOKEN} ]]; then | ||||
|  | ||||
|         # parallelization | ||||
|         if [[ ${jobs} != 1 ]] && (( ${#pkgbases[@]} > 1 )); then | ||||
|             if [[ -n ${BOLD} ]]; then | ||||
|                 export ARTOOLS_COLOR=always | ||||
|             fi | ||||
|             if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${pkgbases[@]}"; then | ||||
|                 die 'Failed to manage some topic, please check the output' | ||||
|                 exit 1 | ||||
|             fi | ||||
|             exit 0 | ||||
|         fi | ||||
|  | ||||
|         for pkgbase in "${pkgbases[@]}"; do | ||||
|  | ||||
|             # topics meta | ||||
|             if (( ADD )); then | ||||
|                 local gitname | ||||
|                 gitname=$(get_compliant_name "${pkgbase}") | ||||
|                 if ! add_topic "${gitname}" "${ADD_TOPIC}"; then | ||||
|                     warning "failed to add the topic: ${ADD_TOPIC}" | ||||
|                 fi | ||||
|             fi | ||||
|  | ||||
|             if (( DEL )); then | ||||
|                 local gitname | ||||
|                 gitname=$(get_compliant_name "${pkgbase}") | ||||
|                 if ! remove_topic "${gitname}" "${DEL_TOPIC}"; then | ||||
|                     warning "failed to delete the topic: ${DEL_TOPIC}" | ||||
|                 fi | ||||
|             fi | ||||
|  | ||||
|         done | ||||
|  | ||||
|     fi | ||||
| } | ||||
| @@ -137,7 +137,6 @@ update_yaml_base() { | ||||
|     local name | ||||
|     local pkgnames | ||||
|     local arches | ||||
|     local pkgbase | ||||
|  | ||||
|     pkgbase="${pkgbase:-${pkgname}}" | ||||
|     version="$(get_full_version)" | ||||
| @@ -273,8 +272,17 @@ update_yaml_move() { | ||||
|             -i "${REPO_DB}" | ||||
| } | ||||
|  | ||||
| show_agent() { | ||||
|     local agent="orion" | ||||
|     if grep @galaxy "${REPO_CI}" &>/dev/null; then | ||||
|         agent="taurus" | ||||
|     fi | ||||
|     msg2 "agent: %s" "$agent" | ||||
| } | ||||
|  | ||||
| show_db() { | ||||
|     if ! yq -r ${REPO_DB} 1>/dev/null 2>/dev/null; then | ||||
|     show_agent | ||||
|     if ! yq -r "${REPO_DB}" 1>/dev/null 2>/dev/null; then | ||||
|         die "${REPO_DB} invalid!" | ||||
|     fi | ||||
|     yq -rP '. | with_entries(select(.value.name))' "${REPO_DB}" | ||||
|   | ||||
| @@ -20,6 +20,8 @@ artixpkg_git_clone_usage() { | ||||
|         -m, --maintainer=NAME      Clone all packages of the named maintainer | ||||
|         --protocol https           Clone the repository over https | ||||
|         -t, --topic=NAME           Clone all packages of the named topic | ||||
|         -a, --agent=NAME           Set the CI agent (default: official) | ||||
|                                    Possible values: [official, galaxy] | ||||
|         -j, --jobs N               Run up to N jobs in parallel (default: $(nproc)) | ||||
|         --all                      Clone all existing packages, useful for cache warming | ||||
|         -h, --help                 Show this help text | ||||
| @@ -27,8 +29,9 @@ artixpkg_git_clone_usage() { | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo linux libbar | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --topic myopic | ||||
|         $ ${COMMAND} -j 8 --topic myopic | ||||
|         $ ${COMMAND} --topic mytopic | ||||
|         $ ${COMMAND} -j 8 --topic mytopic | ||||
|         $ ${COMMAND} --agent galaxy libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -90,6 +93,15 @@ artixpkg_git_clone() { | ||||
|                 TOPIC="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             -a|--agent) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 CONFIGURE_OPTIONS+=("$1" "$2") | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --agent=*) | ||||
|                 CONFIGURE_OPTIONS+=("${1}") | ||||
|                 shift | ||||
|             ;; | ||||
|             --all) | ||||
|                 CLONE_ALL=1 | ||||
|                 shift | ||||
|   | ||||
| @@ -13,7 +13,11 @@ set -e | ||||
|  | ||||
| commit_ci(){ | ||||
|     [[ -d .artixlinux ]] || mkdir .artixlinux | ||||
|     if [[ ${AGENT} == "${ARTIX_DB[11]}" ]]; then | ||||
|         printf "@Library('artix-ci@%s') import org.artixlinux.RepoPackage\n" "${AGENT}" > "${REPO_CI}" | ||||
|     else | ||||
|         printf "@Library('artix-ci') import org.artixlinux.RepoPackage\n" > "${REPO_CI}" | ||||
|     fi | ||||
|     { | ||||
|         printf '\n' | ||||
|         printf 'PackagePipeline(new RepoPackage(this))\n' | ||||
| @@ -30,14 +34,17 @@ artixpkg_git_config_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -m, --maintainer       Set the maintainer topic via gitea api | ||||
|         -u, --upstream         Add upstream arch remote | ||||
|         -d, --drop             Drop the maintainer topic via gitea api | ||||
|         -a, --agent NAME       Set the CI agent (default: official) | ||||
|                                Possible values: [official, galaxy] | ||||
|         --protocol https       Configure remote url to use https | ||||
|         -j, --jobs N           Run up to N jobs in parallel (default: $(nproc)) | ||||
|         -h, --help             Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} --maintainer tux | ||||
|         $ ${COMMAND} --upstream libfoo | ||||
|         $ ${COMMAND} --maintainer libfoo | ||||
|         $ ${COMMAND} --agent galaxy libfoo | ||||
|         $ ${COMMAND} --drop libfoo | ||||
|         $ ${COMMAND} * | ||||
| _EOF_ | ||||
| } | ||||
| @@ -101,10 +108,12 @@ artixpkg_git_config() { | ||||
|     local paths=() | ||||
|  | ||||
|     local SET_TOPIC=0 | ||||
|     local UPSTREAM=0 | ||||
|     local DROP_TOPIC=0 | ||||
|     local AGENT= | ||||
|     local CI_ADDED=0 | ||||
|  | ||||
|     # variables | ||||
|     local -r command=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local RUNCMD=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     local path realpath pkgbase | ||||
|     local PACKAGER GPGKEY packager_name packager_email | ||||
|  | ||||
| @@ -116,10 +125,23 @@ artixpkg_git_config() { | ||||
|         ;; | ||||
|         -m|--maintainer) | ||||
|             SET_TOPIC=1 | ||||
|             RUNCMD+=" -m" | ||||
|             shift | ||||
|         ;; | ||||
|         -u|--upstream) | ||||
|             UPSTREAM=1 | ||||
|         -d|--drop) | ||||
|             DROP_TOPIC=1 | ||||
|             RUNCMD+=" -d" | ||||
|             shift | ||||
|         ;; | ||||
|         -a|--agent) | ||||
|             (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|             AGENT="$2" | ||||
|             RUNCMD+=" -a ${AGENT}" | ||||
|             shift 2 | ||||
|         ;; | ||||
|         --agent=*) | ||||
|             AGENT="${1#*=}" | ||||
|             RUNCMD+=" -a ${AGENT}" | ||||
|             shift | ||||
|         ;; | ||||
|         --protocol=https) | ||||
| @@ -166,7 +188,7 @@ artixpkg_git_config() { | ||||
|  | ||||
|     # Load makepkg.conf variables to be available for packager identity | ||||
|     msg "Collecting packager identity from makepkg.conf" | ||||
|     # shellcheck disable=2119 | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     load_makepkg_config | ||||
|     if [[ -n ${PACKAGER} ]]; then | ||||
|         if ! packager_name=$(get_packager_name "${PACKAGER}") || \ | ||||
| @@ -199,7 +221,7 @@ artixpkg_git_config() { | ||||
|         if [[ -n ${BOLD} ]]; then | ||||
|             export ARTOOLS_COLOR=always | ||||
|         fi | ||||
|         if ! parallel --bar --jobs "${jobs}" "${command}" ::: "${paths[@]}"; then | ||||
|         if ! parallel --bar --jobs "${jobs}" "${RUNCMD}" ::: "${paths[@]}"; then | ||||
|             die 'Failed to configure some packages, please check the output' | ||||
|             exit 1 | ||||
|         fi | ||||
| @@ -253,17 +275,27 @@ artixpkg_git_config() { | ||||
|                     fi | ||||
|                 fi | ||||
|             fi | ||||
|             if (( UPSTREAM )); then | ||||
|                 local remote_url | ||||
|                 remote_url="${GIT_UPSTREAM_URL}/${pkgbase}".git | ||||
|                 if ! git remote add upstream "${remote_url}"; then | ||||
|                     warning "failed to set the upstream: ${remote_url}" | ||||
|  | ||||
|             if (( DROP_TOPIC )); then | ||||
|                 if [[ -n ${GIT_TOKEN} ]]; then | ||||
|                     local topic gitname | ||||
|                     topic="maintainer-${packager_name}" | ||||
|                     gitname=$(get_compliant_name "${pkgbase}") | ||||
|                     if ! remove_topic "${gitname}" "${topic}"; then | ||||
|                         warning "failed to drop the maintainer topic: ${topic}" | ||||
|                     fi | ||||
|                 fi | ||||
|             fi | ||||
|  | ||||
|             if [[ ! -f ${REPO_CI} ]]; then | ||||
|                 msg "Adding ci support ..." | ||||
|                 commit_ci | ||||
|                 CI_ADDED=1 | ||||
|             fi | ||||
|  | ||||
|             if [[ -n ${AGENT} ]] && (( ! CI_ADDED )); then | ||||
|                 msg "Switching ci support for [%s] ..." "${AGENT}" | ||||
|                 commit_ci | ||||
|             fi | ||||
|  | ||||
|             if [[ ! -f ${REPO_DB} ]]; then | ||||
|   | ||||
| @@ -20,7 +20,8 @@ artixpkg_git_create_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         -c, --clone           Clone the Git repository after creation | ||||
|         -t, --team=NAME       Assign team name [default: world] | ||||
|         -t, --team=NAME       Assign team name (default: world) | ||||
|                               Possible values: [system, world, lib32, galaxy] | ||||
|         -h, --help            Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
| @@ -34,9 +35,15 @@ artixpkg_git_create() { | ||||
|     local pkgbase | ||||
|     local clone=0 | ||||
|     local config=0 | ||||
|     local TEAM='world' | ||||
|     local TEAM="${ARTIX_DB[5]}" | ||||
|     local AGENT=() | ||||
|  | ||||
|     local TEAMS=(system world lib32) | ||||
|     local TEAMS=( | ||||
|         "${ARTIX_DB[2]}" | ||||
|         "${ARTIX_DB[5]}" | ||||
|         "${ARTIX_DB[8]}" | ||||
|         "${ARTIX_DB[11]}" | ||||
|         ) | ||||
|     # variables | ||||
|     local path | ||||
|  | ||||
| @@ -101,10 +108,13 @@ artixpkg_git_create() { | ||||
|             fi | ||||
|             msg_success "Successfully created ${pkgbase}" | ||||
|         fi | ||||
|         if [[ ${TEAM} == "${ARTIX_DB[11]}" ]]; then | ||||
|             AGENT+=(--agent="${TEAM}") | ||||
|         fi | ||||
|         if (( clone )); then | ||||
|             artixpkg_git_clone "${pkgbase}" | ||||
|             artixpkg_git_clone "${AGENT[@]}" "${pkgbase}" | ||||
|         elif (( config )); then | ||||
|             artixpkg_git_config | ||||
|             artixpkg_git_config "${AGENT[@]}" | ||||
|         fi | ||||
|  | ||||
|     done | ||||
|   | ||||
| @@ -124,7 +124,7 @@ artixpkg_git_pull() { | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|         if [[ -d ${pkgbase} ]]; then | ||||
|             ( cd ${pkgbase} || return | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Pulling ${pkgbase} ..." | ||||
|                 if ! git pull origin master; then | ||||
|   | ||||
| @@ -113,7 +113,7 @@ artixpkg_git_push() { | ||||
|  | ||||
|     for pkgbase in "${pkgbases[@]}"; do | ||||
|         if [[ -d ${pkgbase} ]]; then | ||||
|             ( cd ${pkgbase} || return | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Pushing ${pkgbase} ..." | ||||
|                 if ! git push origin master; then | ||||
|   | ||||
| @@ -11,31 +11,18 @@ source "${LIBDIR}"/pkg/db/db.sh | ||||
| set -e | ||||
|  | ||||
|  | ||||
| check_pkgbuild_validity() { | ||||
|     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|     . ./PKGBUILD | ||||
|  | ||||
|     # skip when there are no sources available | ||||
|     if (( ! ${#source[@]} )); then | ||||
|         return | ||||
|     fi | ||||
|  | ||||
|     # validate sources hash algo is at least > sha1 | ||||
|     local bad_algos=("cksums" "md5sums" "sha1sums") | ||||
|     local good_hash_algo=false | ||||
|  | ||||
|     # from makepkg libmakepkg/util/schema.sh | ||||
|     for integ in "${known_hash_algos[@]}"; do | ||||
|         local sumname="${integ}sums" | ||||
|         if [[ -n ${!sumname} ]] && ! in_array "${sumname}" "${bad_algos[@]}"; then | ||||
|             good_hash_algo=true | ||||
|             break | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     if ! $good_hash_algo; then | ||||
|         die "PKGBUILD lacks a secure cryptographic checksum, insecure algorithms: ${bad_algos[*]}" | ||||
| has_remote_changes() { | ||||
|     local status | ||||
|     msg "Checking for remote changes ..." | ||||
|     git fetch origin &>/dev/null | ||||
|     status=$(git status -sb --porcelain) | ||||
|     if [[ "$status" == *behind* ]]; then | ||||
|         msg2 "changes: yes" | ||||
|         error "Remote changes detected! Please pull (%s)" "${pkgbase}" | ||||
|         return 0 | ||||
|     fi | ||||
|     msg2 "changes: no" | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| artixpkg_repo_usage() { | ||||
|   | ||||
| @@ -8,6 +8,30 @@ ARTOOLS_INCLUDE_REPO_ADD_SH=1 | ||||
| set -e | ||||
|  | ||||
|  | ||||
| check_pkgbuild_validity() { | ||||
|     # skip when there are no sources available | ||||
|     if (( ! ${#source[@]} )); then | ||||
|         return | ||||
|     fi | ||||
|  | ||||
|     # validate sources hash algo is at least > sha1 | ||||
|     local bad_algos=("cksums" "md5sums" "sha1sums") | ||||
|     local good_hash_algo=false | ||||
|  | ||||
|     # from makepkg libmakepkg/util/schema.sh | ||||
|     for integ in "${known_hash_algos[@]}"; do | ||||
|         local sumname="${integ}sums" | ||||
|         if [[ -n ${!sumname} ]] && ! in_array "${sumname}" "${bad_algos[@]}"; then | ||||
|             good_hash_algo=true | ||||
|             break | ||||
|         fi | ||||
|     done | ||||
|  | ||||
|     if ! $good_hash_algo; then | ||||
|         die "PKGBUILD lacks a secure cryptographic checksum, insecure algorithms: ${bad_algos[*]}" | ||||
|     fi | ||||
| } | ||||
|  | ||||
| artixpkg_repo_add_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
| @@ -86,6 +110,8 @@ artixpkg_repo_add() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if ! has_remote_changes; then | ||||
|  | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
| @@ -93,12 +119,20 @@ artixpkg_repo_add() { | ||||
|                     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|                     source PKGBUILD | ||||
|  | ||||
|                     check_pkgbuild_validity | ||||
|  | ||||
|                     manage-pkgbuild-keys --export | ||||
|  | ||||
|                     update_yaml_base | ||||
|                     update_yaml_add "${REBUILD}" "${ADD}" "${NOCHECK}" "${DEST}" | ||||
|  | ||||
|                     local commit_msg | ||||
|                     commit_msg=$(get_commit_msg 'add' "${DEST}") | ||||
|  | ||||
|                     if [[ -f .SRCINFO ]]; then | ||||
|                         rm .SRCINFO | ||||
|                     fi | ||||
|  | ||||
|                     if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
|  | ||||
|                         stat_busy 'Staging files' | ||||
| @@ -126,6 +160,8 @@ artixpkg_repo_add() { | ||||
|                             warning "Could not query ${REPO_DB}" | ||||
|                         fi | ||||
|                     fi | ||||
|  | ||||
|                 fi | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -10,31 +10,22 @@ set -e | ||||
|  | ||||
| patch_pkgbase(){ | ||||
|     local name="$1" | ||||
|     local pkgbuild | ||||
|     pkgbuild=PKGBUILD | ||||
|  | ||||
|     sed -e 's|arch-meson|artix-meson|' -i "${pkgbuild}" | ||||
|  | ||||
|     case "${name}" in | ||||
|         glibc) | ||||
|             sed -e 's|{locale,systemd/system,tmpfiles.d}|{locale,tmpfiles.d}|' \ | ||||
|                 -e '/nscd.service/d' \ | ||||
|                 -i "${pkgbuild}" | ||||
|         ;; | ||||
|         linux|linux-lts|linux-zen|linux-hardened|linux-rt|linux-rt-lts) | ||||
|             sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i "${pkgbuild}" | ||||
|         linux|linux-lts|linux-zen|linux-hardened|linux-rt*) | ||||
|             sed -e 's|KBUILD_BUILD_HOST=.*|KBUILD_BUILD_HOST=artixlinux|' -i PKGBUILD | ||||
|             sed -e 's|CONFIG_DEFAULT_HOSTNAME=.*|CONFIG_DEFAULT_HOSTNAME="artixlinux"|' \ | ||||
|                 -i config | ||||
|         ;; | ||||
|         gstreamer|gst-plugins-*|licenses) | ||||
|         *) | ||||
|             sed -e 's|https://www.archlinux.org/|https://www.artixlinux.org/|' \ | ||||
|                 -e 's|(Arch Linux)|(Artix Linux)|' \ | ||||
|                 -i "${pkgbuild}" | ||||
|                 -e 's|arch-meson|artix-meson|' \ | ||||
|                 -i PKGBUILD | ||||
|         ;; | ||||
|     esac | ||||
|     git --no-pager diff PKGBUILD | ||||
| } | ||||
|  | ||||
|  | ||||
| artixpkg_repo_import_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
| @@ -42,11 +33,13 @@ artixpkg_repo_import_usage() { | ||||
|  | ||||
|     OPTIONS | ||||
|         --tag TAG          Switch the current workspace to a specified version tag | ||||
|         --del              Delete files before rsync import | ||||
|         -h, --help         Show this help text | ||||
|  | ||||
|     EXAMPLES | ||||
|         $ ${COMMAND} libfoo | ||||
|         $ ${COMMAND} libfoo --tag TAG | ||||
|         $ ${COMMAND} --tag TAG libfoo | ||||
|         $ ${COMMAND} --tag TAG --del libfoo | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| @@ -70,16 +63,26 @@ artixpkg_repo_import() { | ||||
|         --exclude '.gitignore' | ||||
|         --exclude 'README.md' | ||||
|         --exclude '*.service' | ||||
|         --exclude '*.timer' | ||||
|         --exclude '.SRCINFO' | ||||
|         --exclude '*.socket' | ||||
|         --exclude '*.timer' | ||||
|     ) | ||||
|  | ||||
|     while (( $# )); do | ||||
|         case $1 in | ||||
|             --tag) | ||||
|                 (( $# <= 1 )) && die "missing argument for %s" "$1" | ||||
|                 TAG="$2" | ||||
|                 shift 2 | ||||
|             ;; | ||||
|             --tag=*) | ||||
|                 TAG="${1#*=}" | ||||
|                 shift | ||||
|             ;; | ||||
|             --del) | ||||
|                 rsync_args+=(--delete-before) | ||||
|                 shift | ||||
|             ;; | ||||
|             -h|--help) | ||||
|                 artixpkg_repo_import_usage | ||||
|                 exit 0 | ||||
| @@ -111,9 +114,8 @@ artixpkg_repo_import() { | ||||
|                 fi | ||||
|                 stat_done | ||||
|  | ||||
|                 stat_busy "Fetching upstream tags" | ||||
|                 msg2 "Fetching upstream tags" | ||||
|                 git fetch --tags upstream main | ||||
|                 stat_done | ||||
|  | ||||
|                 local latest version | ||||
|                 latest=$(git describe --tags FETCH_HEAD) | ||||
| @@ -122,7 +124,11 @@ artixpkg_repo_import() { | ||||
|                     version="${TAG}" | ||||
|                 fi | ||||
|  | ||||
|                 stat_busy "Importing upstream changeset for ${version}" | ||||
|                 if ! has_remote_changes; then | ||||
|                     msg "Querying ${pkgbase} ..." | ||||
|                     if ! show_db; then | ||||
|                         warning "Could not query ${REPO_DB}" | ||||
|                     fi | ||||
|  | ||||
|                     git checkout "${version}" -b "${version}" &>/dev/null | ||||
|                     local temp | ||||
| @@ -132,11 +138,12 @@ artixpkg_repo_import() { | ||||
|                     git checkout master &>/dev/null | ||||
|                     git branch -D "${version}" &>/dev/null | ||||
|  | ||||
|                 stat_done | ||||
|  | ||||
|                     msg "Importing upstream changeset for ${version}" | ||||
|                     rsync "${rsync_args[@]}" "${temp}"/ "$(pwd)"/ #&>/dev/null | ||||
|  | ||||
|                     msg2 "Patching ${pkgbase} ..." | ||||
|                     patch_pkgbase "${pkgbase}" | ||||
|                 fi | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -80,15 +80,31 @@ artixpkg_repo_move() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if ! has_remote_changes; then | ||||
|  | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
|  | ||||
|                 local commit_msg | ||||
|                     local commit_msg src_version # dest_version | ||||
|                     commit_msg=$(get_commit_msg 'move' "${DEST}" "${SRC}") | ||||
|  | ||||
|                     src_version=$(version_from_yaml "${SRC}") | ||||
| #                     dest_version=$(version_from_yaml "${DEST}") | ||||
|  | ||||
|                     if [[ "$src_version" != null ]]; then | ||||
|  | ||||
| #                         local ret | ||||
| #                         ret=$(vercmp "$src_version" "$dest_version") | ||||
| # | ||||
| #                         if (( ret > 0 )); then | ||||
|  | ||||
|                             update_yaml_move "${SRC}" "${DEST}" | ||||
|  | ||||
|                             if [[ -f .SRCINFO ]]; then | ||||
|                                 rm .SRCINFO | ||||
|                             fi | ||||
|  | ||||
|                             if [[ -n $(git status --porcelain --untracked-files=no) ]]; then | ||||
|  | ||||
|                                 stat_busy 'Staging files' | ||||
| @@ -111,7 +127,24 @@ artixpkg_repo_move() { | ||||
|                                 if ! show_db; then | ||||
|                                     warning "Could not query ${REPO_DB}" | ||||
|                                 fi | ||||
|  | ||||
|                             fi | ||||
|  | ||||
| #                         elif (( ret < 0 )); then | ||||
| # | ||||
| #                             error "${pkgbase}: invalid move: version $src_version < $dest_version!" | ||||
| # | ||||
| #                         else | ||||
| #                             error "${pkgbase}: invalid move: version $src_version = $dest_version!" | ||||
| # | ||||
| #                         fi | ||||
|  | ||||
|                     else | ||||
|                         error "${pkgbase}: invalid move: version $src_version!" | ||||
|                     fi | ||||
|  | ||||
|                 fi | ||||
|  | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -73,6 +73,8 @@ artixpkg_repo_remove() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 if ! has_remote_changes; then | ||||
|  | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
| @@ -106,6 +108,8 @@ artixpkg_repo_remove() { | ||||
|                         fi | ||||
|  | ||||
|                     fi | ||||
|  | ||||
|                 fi | ||||
|             ) | ||||
|         fi | ||||
|  | ||||
|   | ||||
| @@ -8,18 +8,6 @@ ARTOOLS_INCLUDE_REPO_SHOW_SH=1 | ||||
| set -e | ||||
|  | ||||
|  | ||||
| has_changeset(){ | ||||
|     git fetch origin &>/dev/null | ||||
|  | ||||
|     if [[ $(git rev-parse HEAD) != $(git rev-parse @{u}) ]]; then | ||||
|         msg2 "changes: yes" | ||||
|         git status -sb | ||||
|         return 0 | ||||
|     fi | ||||
|     msg2 "changes: no" | ||||
|     return 1 | ||||
| } | ||||
|  | ||||
| artixpkg_repo_show_usage() { | ||||
|     local -r COMMAND=${_ARTOOLS_COMMAND:-${BASH_SOURCE[0]##*/}} | ||||
|     cat <<- _EOF_ | ||||
| @@ -84,11 +72,7 @@ artixpkg_repo_show() { | ||||
|             fi | ||||
|             ( cd "${pkgbase}" || return | ||||
|  | ||||
|                 msg "Checking origin for changes" | ||||
|                 if has_changeset; then | ||||
|                     warning "Remote changes detected! Please update (%s)" "${pkgbase}" | ||||
|                 fi | ||||
|  | ||||
|                 if ! has_remote_changes; then | ||||
|                     if [[ ! -f PKGBUILD ]]; then | ||||
|                         die "No PKGBUILD found in (%s)" "${pkgbase}" | ||||
|                     fi | ||||
| @@ -107,6 +91,7 @@ artixpkg_repo_show() { | ||||
|                         msg "Showing srcinfo pkgs ..." | ||||
|                         show_srcinfo_pkgs | ||||
|                     fi | ||||
|                 fi | ||||
|  | ||||
|             ) | ||||
|         fi | ||||
|   | ||||
| @@ -4,6 +4,21 @@ | ||||
|  | ||||
| #{{{ pkg conf | ||||
|  | ||||
| prepare_dir(){ | ||||
|     [[ ! -d $1 ]] && mkdir -p "$1" | ||||
|     return 0 | ||||
| } | ||||
|  | ||||
| if [[ -n $SUDO_USER ]]; then | ||||
|     eval "USER_HOME=~$SUDO_USER" | ||||
| else | ||||
|     USER_HOME=$HOME | ||||
| fi | ||||
|  | ||||
| USER_CONF_DIR="${XDG_CONFIG_HOME:-$USER_HOME/.config}/artools" | ||||
|  | ||||
| prepare_dir "${USER_CONF_DIR}" | ||||
|  | ||||
| load_pkg_config(){ | ||||
|  | ||||
|     local conf="$1/artools-pkg.conf" | ||||
| @@ -13,6 +28,14 @@ load_pkg_config(){ | ||||
|     # shellcheck source=config/conf/artools-pkg.conf | ||||
|     [[ -r "$conf" ]] && source "$conf" | ||||
|  | ||||
|     CHROOTS_DIR=${CHROOTS_DIR:-'/var/lib/artools'} | ||||
|  | ||||
|     WORKSPACE_DIR=${WORKSPACE_DIR:-"${USER_HOME}/artools-workspace"} | ||||
|  | ||||
|     ARCH=${ARCH:-"$(uname -m)"} | ||||
|  | ||||
|     REPO=${REPO:-'world'} | ||||
|  | ||||
|     local git_domain="gitea.artixlinux.org" | ||||
|  | ||||
|     GIT_HTTPS=${GIT_HTTPS:-"https://${git_domain}"} | ||||
|   | ||||
| @@ -37,8 +37,6 @@ fi | ||||
|  | ||||
| export _ARTOOLS_COMMAND='artixpkg' | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
|   | ||||
| @@ -6,12 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| create_first=false | ||||
| rebuild=false | ||||
| @@ -52,7 +52,7 @@ while getopts "${opts}" arg; do | ||||
|         d) repo="$OPTARG" ;; | ||||
|         a) arch="$OPTARG" ;; | ||||
|         c) create_first=true ;; | ||||
|         m) rebuild=true; repo=${repo%-*} ;; | ||||
|         m) rebuild=true ;; | ||||
|         C) mkchrootpkg_args+=(-C) ;; | ||||
|         N) mkchrootpkg_args+=(-N) ;; | ||||
|         n) mkchrootpkg_args+=(-n) ;; | ||||
| @@ -60,6 +60,10 @@ while getopts "${opts}" arg; do | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if "${rebuild}"; then | ||||
|     repo=${repo%-*} | ||||
| fi | ||||
|  | ||||
| if [[ "${repo}" == lib32* ]]; then | ||||
|     base_packages+=('multilib-devel') | ||||
| fi | ||||
|   | ||||
| @@ -57,7 +57,7 @@ while (( $# )); do | ||||
|             shift | ||||
|             break | ||||
|             ;; | ||||
|         -*|--*) | ||||
|         --*|-*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|             ;; | ||||
|         *) | ||||
| @@ -76,10 +76,10 @@ fi | ||||
|  | ||||
| # Source user-specific makepkg.conf overrides | ||||
| if [[ -r "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" ]]; then | ||||
|     # shellcheck source=/dev/null | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     source "${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" | ||||
| elif [[ -r "$HOME/.makepkg.conf" ]]; then | ||||
|     # shellcheck source=/dev/null | ||||
|     # shellcheck source=config/makepkg/x86_64.conf | ||||
|     source "$HOME/.makepkg.conf" | ||||
| fi | ||||
|  | ||||
| @@ -97,6 +97,8 @@ STARTDIR=$(pwd) | ||||
| (( RMDIR )) && trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT | ||||
| TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) | ||||
|  | ||||
| changed=0 | ||||
|  | ||||
| for _pkgname in "${pkgname[@]}"; do | ||||
|     comparepkg=$_pkgname | ||||
|     pkgurl= | ||||
| @@ -150,11 +152,21 @@ for _pkgname in "${pkgname[@]}"; do | ||||
|     find-libprovides "$pkgfile" 2>/dev/null | sort > "$TEMPDIR/libraries-$_pkgname" | ||||
|     if ! diff_output="$(sdiff -s "$TEMPDIR/libraries-$_pkgname-old" "$TEMPDIR/libraries-$_pkgname")"; then | ||||
|         message="Sonames differ in $_pkgname!" | ||||
|         (( WARN )) && warning "$message" || msg "$message" | ||||
|         printf "%s\n" "$diff_output" | ||||
|         if (( WARN )); then | ||||
|             warning "$message" | ||||
|         else | ||||
|             msg "$message" | ||||
|         fi | ||||
|         printf "%s\n" "$diff_output" 2>&1 | tee "${pkgfile##*/}-checkpkg.log" | ||||
|         changed=1 | ||||
|     else | ||||
|         msg "No soname differences for %s." "$_pkgname" | ||||
|     fi | ||||
| done | ||||
|  | ||||
| (( RMDIR )) || msg "Files saved to %s" "$TEMPDIR" | ||||
| if ! (( RMDIR )); then | ||||
|     msg "Files saved to %s" "$TEMPDIR" | ||||
| fi | ||||
|  | ||||
| exit "$changed" | ||||
|  | ||||
|   | ||||
| @@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| @@ -32,6 +30,7 @@ update_linksdb_cache(){ | ||||
|     local cachedir url | ||||
|     for repo in "${search[@]}"; do | ||||
|         cachedir=${db_cache_dir}/linksdb/$repo | ||||
|         # shellcheck disable=SC2153 | ||||
|         url=${REPOS_MIRROR}/$repo/os/${CARCH}/$repo.${linksdb_ext} | ||||
|         extract_db "$url" "$cachedir" | ||||
|     done | ||||
|   | ||||
| @@ -39,7 +39,7 @@ umask 0022 | ||||
| working_dir='' | ||||
| 
 | ||||
| files=() | ||||
| mount_args=("-B:/etc/hosts:/etc/hosts") | ||||
| mount_args="-B:/etc/hosts:/etc/hosts" | ||||
| 
 | ||||
| usage() { | ||||
|     printf "Usage: %s [options] working-dir [run arguments]\n" "${0##*/}" | ||||
| @@ -72,7 +72,7 @@ while getopts ${opts} arg; do | ||||
|         f) files+=("$OPTARG") ;; | ||||
|         s) nosetarch=1 ;; | ||||
|         t) tmpfs_opts="$OPTARG" ;; | ||||
|         b) bindmounts="$OPTARG"; mount_args+=(${bindmounts}) ;; | ||||
|         b) bindmounts="$OPTARG"; mount_args+=" ${bindmounts}" ;; | ||||
|         h|?) usage ;; | ||||
|         *) error "invalid argument '%s'" "$arg"; usage ;; | ||||
|     esac | ||||
| @@ -96,6 +96,7 @@ mapfile -t host_mirrors < <(pacman-conf --repo world Server 2> /dev/null | sed - | ||||
| 
 | ||||
| for host_mirror in "${host_mirrors[@]}"; do | ||||
|     if [[ $host_mirror == *file://* ]]; then | ||||
|         # shellcheck disable=SC2016 | ||||
|         host_mirror=$(echo "$host_mirror" | sed -r 's#file://(/.*)/\$repo/os/\$arch#\1#g') | ||||
|         for m in "$host_mirror"/pool/*/; do | ||||
|             in_array "$m" "${cache_dirs[@]}" || cache_dirs+=("$m") | ||||
| @@ -114,10 +115,10 @@ while read -r line; do | ||||
|     done | ||||
| done < <(pacman-conf --config "${pacman_conf:-$working_dir/etc/pacman.conf}" --repo-list) | ||||
| 
 | ||||
| mount_args+=("-B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}") | ||||
| mount_args+=" -B:${cache_dirs[0]//:/\\:}:${cache_dirs[0]//:/\\:}" | ||||
| 
 | ||||
| for cache_dir in "${cache_dirs[@]:1}"; do | ||||
|     mount_args+=("-Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}") | ||||
|     mount_args+=" -Br:${cache_dir//:/\\:}:${cache_dir//:/\\:}" | ||||
| done | ||||
| 
 | ||||
| # {{{ functions | ||||
| @@ -144,13 +145,13 @@ copy_hostconf () { | ||||
| chroot_extra_mount() { | ||||
|     chroot_add_resolv_conf "${working_dir}" | ||||
| 
 | ||||
|     for arg in "${mount_args[@]}"; do | ||||
|     for arg in ${mount_args}; do | ||||
|         local flag dest src | ||||
|         flag=${arg%%:*} | ||||
|         dest=${arg##*:} | ||||
|         src=${arg%:*} | ||||
|         src=${src#*:} | ||||
|         chroot_mount "${src}" "${working_dir}${dest}" "${flag}" | ||||
|         chroot_add_mount "${src}" "${working_dir}${dest}" "${flag}" | ||||
|     done | ||||
| } | ||||
| 
 | ||||
| @@ -165,7 +166,7 @@ elif [[ $(cat "$working_dir/.artix-chroot") != "${CHROOTVERSION}" ]]; then | ||||
|     die "chroot '%s' is not at version %s. Please rebuild." "$working_dir" "${CHROOTVERSION}" | ||||
| fi | ||||
| 
 | ||||
| chroot_api_mount "${working_dir}" "${tmpfs_opts}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" | ||||
| chroot_setup "${working_dir}" "${tmpfs_opts}" || die "failed to setup API filesystems in chroot %s" "${working_dir}" | ||||
| 
 | ||||
| chroot_extra_mount | ||||
| 
 | ||||
| @@ -4,12 +4,12 @@ | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| shopt -s nullglob | ||||
|  | ||||
| @@ -76,17 +76,17 @@ umask 0022 | ||||
|  | ||||
| ORIG_HOME=$HOME | ||||
| IFS=: read -r _ _ _ _ _ HOME _ < <(getent passwd "${SUDO_USER:-$USER}") | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
| HOME=$ORIG_HOME | ||||
|  | ||||
| msg "Running checkpkg" | ||||
| [[ -d $PKGDEST ]]    || PKGDEST=$PWD | ||||
| [[ -d $SRCDEST ]]    || SRCDEST=$PWD | ||||
| [[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD | ||||
| [[ -d $LOGDEST ]]    || LOGDEST=$PWD | ||||
|  | ||||
| if chroot-run \ | ||||
|     -b "-B:${PWD}:/startdir -B:${SRCDEST}:/srcdest" \ | ||||
|     "$copydir" true | ||||
| then | ||||
|     mapfile -t pkgnames < <(sudo -u "$makepkg_user" bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') | ||||
| fi | ||||
| msg "Running checkpkg" | ||||
| mapfile -t pkgnames < <(bash -c 'source PKGBUILD; printf "%s\n" "${pkgname[@]}"') | ||||
|  | ||||
| mapfile -t remotepkgs < <(pacman --config "$copydir"/etc/pacman.conf \ | ||||
|     --dbpath "$copydir"/var/lib/pacman \ | ||||
| @@ -109,15 +109,4 @@ for remotepkg in "${remotepkgs[@]}"; do | ||||
|     fi | ||||
| done | ||||
|  | ||||
| pkgfiles="${remotepkgs[@]/#file:\/\//}" | ||||
|  | ||||
| sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${pkgfiles[@]}" | ||||
|  | ||||
| msg "Running namcap" | ||||
| #msg2 "Checking %s\n" "PKGBUILD" | ||||
| sudo -u "$makepkg_user" namcap PKGBUILD 2>&1 | tee "PKGBUILD-namcap.log" | ||||
|  | ||||
| for pkgfile in "${pkgfiles[@]}"; do | ||||
|     #msg2 "Checking %s\n" "${pkgfile##*/}" | ||||
|     sudo -u "$makepkg_user" namcap "$pkgfile" 2>&1 | tee "${pkgfile##*/}-namcap.log" | ||||
| done | ||||
| sudo -u "$makepkg_user" checkpkg --rmdir --warn --makepkg-config "$copydir/etc/makepkg.conf" "${remotepkgs[@]/#file:\/\//}" | ||||
|   | ||||
| @@ -127,7 +127,7 @@ while (( $# )); do | ||||
|             shift | ||||
|             break | ||||
|         ;; | ||||
|         -*|--*) | ||||
|         --*|-*) | ||||
|             die "invalid argument: %s" "$1" | ||||
|         ;; | ||||
|         *) | ||||
|   | ||||
| @@ -1,73 +0,0 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
|  | ||||
| usage() { | ||||
|     cat <<- _EOF_ | ||||
|         Usage: ${BASH_SOURCE[0]##*/} | ||||
|  | ||||
|         Export the PGP keys from a PKGBUILDs validpgpkeys array into the keys/pgp/ | ||||
|         subdirectory. Useful for distributing packager validated source signing | ||||
|         keys alongside PKGBUILDs. | ||||
|  | ||||
|         OPTIONS | ||||
|             -h, --help      Show this help text | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| # option checking | ||||
| while (( $# )); do | ||||
|     case $1 in | ||||
|         -h|--help) usage; exit 0 ;; | ||||
|         *) die "invalid argument: %s" "$1" ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if [[ ! -f PKGBUILD ]]; then | ||||
|     die "This must be run a directory containing a PKGBUILD." | ||||
| fi | ||||
|  | ||||
| mapfile -t validpgpkeys < <( | ||||
|     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|     . ./PKGBUILD | ||||
|     if (( ${#validpgpkeys[@]} )); then | ||||
|         printf "%s\n" "${validpgpkeys[@]}" | ||||
|     fi | ||||
| ) | ||||
|  | ||||
| msg "Exporting ${#validpgpkeys[@]} PGP keys..." | ||||
| if (( ${#validpgpkeys[@]} == 0 )); then | ||||
|     exit 0 | ||||
| fi | ||||
|  | ||||
| trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT | ||||
| TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX) | ||||
|  | ||||
| mkdir -p keys/pgp | ||||
| error=0 | ||||
|  | ||||
| for key in "${validpgpkeys[@]}"; do | ||||
|     gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null | ||||
|  | ||||
|     # gpg does not give a non-zero return value if it fails to export... | ||||
|     if [[ -f $TEMPDIR/$key.asc ]]; then | ||||
|         msg2 "Exported $key" | ||||
|         mv "$TEMPDIR/$key.asc" "keys/pgp/$key.asc" | ||||
|     else | ||||
|         if [[ -f keys/pgp/$key.asc ]]; then | ||||
|             warning "Failed to update key: $key" | ||||
|         else | ||||
|             error "Key unavailable: $key" | ||||
|             error=1 | ||||
|         fi | ||||
|     fi | ||||
| done | ||||
|  | ||||
| if (( error )); then | ||||
|     die "Failed to export all \'validpgpkeys\' entries." | ||||
| fi | ||||
| @@ -10,12 +10,12 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/chroot.sh | ||||
| source "${LIBDIR}"/base/chroot.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
|  | ||||
| declare -A buildinfo | ||||
| declare -a buildenv buildopts installed installpkgs | ||||
| @@ -133,7 +133,7 @@ while getopts 'dM:c:l:h' arg; do | ||||
|         c) cache_dirs+=("$OPTARG") ;; | ||||
|         l) chroot="$OPTARG" ;; | ||||
|         h) usage; exit 0 ;; | ||||
|         *|?) usage; exit 1 ;; | ||||
|         ?|*) usage; exit 1 ;; | ||||
|     esac | ||||
| done | ||||
| shift $((OPTIND - 1)) | ||||
| @@ -222,10 +222,12 @@ TEMPDIR=$(mktemp -d --tmpdir makerepropkg.XXXXXXXXXX) | ||||
| makepkg_conf="${TEMPDIR}/makepkg.conf" | ||||
| # anything before buildtool support is pinned to the last none buildtool aware release | ||||
| if [[ -z "${BUILDTOOL}" ]]; then | ||||
|     get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
|     # shellcheck disable=SC2153 | ||||
|     get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
| # prefere to assume artools-pkg up until matching makepkg version so repository packages remain reproducible | ||||
| elif [[ "${BUILDTOOL}" = makepkg ]] && (( $(vercmp "${BUILDTOOLVER}" 6.0.1) <= 0 )); then | ||||
|     get_makepkg_conf "artools-pkg-0.28.2-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
|     # shellcheck disable=SC2153 | ||||
|     get_makepkg_conf "artools-pkg-0.31.7-1-any" "${CARCH}" "${makepkg_conf}" || exit 1 | ||||
| # all artools-pkg builds | ||||
| elif [[ "${BUILDTOOL}" = artools ]] && get_makepkg_conf "${BUILDTOOL}-${BUILDTOOLVER}" "${makepkg_conf}"; then | ||||
|     true | ||||
|   | ||||
							
								
								
									
										99
									
								
								src/pkg/manage-pkgbuild-keys.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								src/pkg/manage-pkgbuild-keys.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| #!/bin/bash | ||||
| # | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
|  | ||||
|  | ||||
| usage() { | ||||
|     cat <<- _EOF_ | ||||
|         Usage: ${BASH_SOURCE[0]##*/} | ||||
|  | ||||
|         Export or import the PGP keys from a PKGBUILDs validpgpkeys array into/from the keys/pgp/ | ||||
|         subdirectory. Useful for distributing packager validated source signing | ||||
|         keys alongside PKGBUILDs. | ||||
|  | ||||
|         OPTIONS | ||||
|             -i, --import    Import keys | ||||
|             -e, --export    Export keys | ||||
|             -h, --help      Show this help text | ||||
| _EOF_ | ||||
| } | ||||
|  | ||||
| action='' | ||||
| error=0 | ||||
|  | ||||
| # option checking | ||||
| while (( $# )); do | ||||
|     case $1 in | ||||
|         -i|--import) action="import"; shift ;; | ||||
|         -e|--export) action="export"; shift ;; | ||||
|         -h|--help) usage; exit 0 ;; | ||||
|         *) die "invalid argument: %s" "$1" ;; | ||||
|     esac | ||||
| done | ||||
|  | ||||
| if [[ ! -f PKGBUILD ]]; then | ||||
|     die "This must be run a directory containing a PKGBUILD." | ||||
| fi | ||||
|  | ||||
| mapfile -t validpgpkeys < <( | ||||
|     # shellcheck source=contrib/makepkg/PKGBUILD.proto | ||||
|     . ./PKGBUILD | ||||
|     if (( ${#validpgpkeys[@]} )); then | ||||
|         printf "%s\n" "${validpgpkeys[@]}" | ||||
|     fi | ||||
| ) | ||||
|  | ||||
| if [[ "$action" == 'export' ]]; then | ||||
|     msg "Exporting ${#validpgpkeys[@]} PGP keys..." | ||||
|     if (( ${#validpgpkeys[@]} == 0 )); then | ||||
|         exit 0 | ||||
|     fi | ||||
|  | ||||
|     trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT | ||||
|     TEMPDIR=$(mktemp -d --tmpdir export-pkgbuild-keys.XXXXXXXXXX) | ||||
|  | ||||
|     mkdir -p keys/pgp | ||||
|  | ||||
|     for key in "${validpgpkeys[@]}"; do | ||||
|         gpg --output "$TEMPDIR/$key.asc" --armor --export --export-options export-minimal "$key" 2>/dev/null | ||||
|  | ||||
|         # gpg does not give a non-zero return value if it fails to export... | ||||
|         if [[ -f $TEMPDIR/$key.asc ]]; then | ||||
|             msg2 "Exported $key" | ||||
|             mv "$TEMPDIR/$key.asc" "keys/pgp/$key.asc" | ||||
|         else | ||||
|             if [[ -f keys/pgp/$key.asc ]]; then | ||||
|                 warning "Failed to update key: $key" | ||||
|             else | ||||
|                 error "Key unavailable: $key" | ||||
|                 error=1 | ||||
|             fi | ||||
|         fi | ||||
|     done | ||||
| elif [[ "$action" == 'import' ]]; then | ||||
|  | ||||
|     msg "Ensuring required PGP keys are present..." | ||||
|     for key in "${validpgpkeys[@]}"; do | ||||
|         if ! gpg --list-keys "$key" &>/dev/null; then | ||||
|             msg2 "Checking for $key..." | ||||
|             if ! gpg --recv-keys "$key" || ! gpg --fingerprint "$key"; then | ||||
|                 if [[ -f keys/pgp/$key.asc ]]; then | ||||
|                     msg2 "Importing key from local..." | ||||
|                     gpg --import "keys/pgp/$key.asc" | ||||
|                 else | ||||
|                     error "Key unavailable: $key" | ||||
|                     error=1 | ||||
|                 fi | ||||
|             fi | ||||
|         fi | ||||
|     done | ||||
| fi | ||||
|  | ||||
| if (( error )); then | ||||
|     die "Failed to $action all \'validpgpkeys\' entries." | ||||
| fi | ||||
| @@ -20,6 +20,7 @@ umode='' | ||||
| 
 | ||||
| files=() | ||||
| chroot_args=() | ||||
| nosetarch=0 | ||||
| 
 | ||||
| usage() { | ||||
|     printf "Usage: %s [options] working-dir package-list...\n" "${0##*/}" | ||||
| @@ -177,7 +177,7 @@ prepare_chroot() { | ||||
|     done | ||||
|  | ||||
|     cat > "$copydir/etc/sudoers.d/builduser-pacman" <<EOF | ||||
| builduser ALL = NOPASSWD: /usr/bin/pacman | ||||
| builduser ALL=(ALL:ALL) NOPASSWD: /usr/bin/pacman | ||||
| EOF | ||||
|     chmod 440 "$copydir/etc/sudoers.d/builduser-pacman" | ||||
|  | ||||
| @@ -205,6 +205,7 @@ _chrootbuild() { | ||||
|     # No coredumps | ||||
|     ulimit -c 0 | ||||
|  | ||||
|     # shellcheck disable=SC1091 | ||||
|     . /etc/locale.conf | ||||
|  | ||||
|     # shellcheck source=/dev/null | ||||
| @@ -263,6 +264,7 @@ move_products() { | ||||
|  | ||||
|         # Fix broken symlink because of temporary chroot PKGDEST /pkgdest | ||||
|         if [[ "$PWD" != "$PKGDEST" && -L "$PWD/${pkgfile##*/}" ]]; then | ||||
|             # shellcheck disable=SC2226 | ||||
|             ln -sf "$PKGDEST/${pkgfile##*/}" | ||||
|         fi | ||||
|     done | ||||
| @@ -275,6 +277,7 @@ move_products() { | ||||
|  | ||||
|         # Fix broken symlink because of temporary chroot SRCPKGDEST /srcpkgdest | ||||
|         if [[ "$PWD" != "$SRCPKGDEST" && -L "$PWD/${s##*/}" ]]; then | ||||
|             # shellcheck disable=SC2226 | ||||
|             ln -sf "$SRCPKGDEST/${s##*/}" | ||||
|         fi | ||||
|     done | ||||
|   | ||||
| @@ -6,10 +6,12 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/base/yaml.sh | ||||
| source "${LIBDIR}"/base/yaml.sh | ||||
| # shellcheck source=src/lib/pkg/yaml.sh | ||||
| source "${LIBDIR}"/pkg/yaml.sh | ||||
|  | ||||
| # shellcheck disable=1091 | ||||
| source "${MAKEPKG_LIBRARY}"/util/pkgbuild.sh | ||||
| # shellcheck disable=1091 | ||||
| source "${MAKEPKG_LIBRARY}"/util/schema.sh | ||||
|  | ||||
| #{{{ functions | ||||
| @@ -121,6 +123,7 @@ usage() { | ||||
|     exit "$1" | ||||
| } | ||||
|  | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
|  | ||||
| opts='h' | ||||
|   | ||||
| @@ -6,8 +6,6 @@ LIBDIR=${LIBDIR:-'@libdir@'} | ||||
| DATADIR=${DATADIR:-'@datadir@'} | ||||
| SYSCONFDIR=${SYSCONFDIR:-'@sysconfdir@/artools'} | ||||
|  | ||||
| # shellcheck source=src/lib/base/util.sh | ||||
| source "${LIBDIR}"/base/util.sh | ||||
| # shellcheck source=src/lib/pkg/util.sh | ||||
| source "${LIBDIR}"/pkg/util.sh | ||||
| # shellcheck source=src/lib/base/message.sh | ||||
| @@ -34,6 +32,7 @@ remove(){ | ||||
|  | ||||
| repo_action() { | ||||
|     local repo_path | ||||
|     # shellcheck disable=SC2153 | ||||
|     repo_path=${REPOS_ROOT}/${dest_repo}/os/${CARCH} | ||||
|  | ||||
|     local packages=() action func="$1" | ||||
|   | ||||
| @@ -9,6 +9,7 @@ source "${LIBDIR}"/base/message.sh | ||||
| # shellcheck source=src/lib/pkg/deploy.sh | ||||
| source "${LIBDIR}"/pkg/deploy.sh | ||||
|  | ||||
| # shellcheck source=config/makepkg/x86_64.conf | ||||
| load_makepkg_config | ||||
|  | ||||
| passfiles=("$@") | ||||
| @@ -36,5 +37,10 @@ for pkg in "${passfiles[@]}"; do | ||||
|         msg2 "Found: %s" "${pkgfile}" | ||||
|         [[ -e "${pkgfile}".sig ]] && rm "${pkgfile}".sig | ||||
|         sign_pkg "${pkgfile}" | ||||
|         ret=0 | ||||
|     else | ||||
|         ret=1 | ||||
|     fi | ||||
| done | ||||
|  | ||||
| exit "$ret" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user