Compare commits

...

146 Commits

Author SHA1 Message Date
Daniele Rondina 938f64f1e3 sabayon-brokenlinks: Add /usr/lib /lib in default analysis 2020-03-25 23:35:05 +01:00
Daniele Rondina 2478662e00 builder: fix pkg version regex 2019-11-06 14:38:15 +01:00
Daniele Rondina 3e2a148a0b dynlink-scanner: qfile -e option is now -v 2019-10-27 13:38:51 +01:00
Daniele Rondina e569b59699 builder: Use last version or matching version for deps 2019-10-20 00:32:45 +02:00
Daniele Rondina 9f16462453 builder: Support previous implementation when dep_ignore_versions is disable 2019-10-07 17:33:50 +02:00
Daniele Rondina 8f5578b7f3 builder: review dependencies calculation
* Add support for env DEPENDENCY_IGNORE_VERSIONS for
  discard version of the packages to install as dependencies

* Add debugging log of installed equo repositories
2019-10-06 23:59:59 +02:00
Ettore Di Giacinto 46204e0562 Merge pull request #21 from Sabayon/broken-links
Add sabayon-brokenlinks script
2019-09-11 20:30:15 +02:00
Daniele Rondina 460101a985 sabayon-brokenlinks: Use FORCE/--force instead of --force-manual 2019-09-11 11:45:37 +02:00
Daniele Rondina e7aade22a0 sabayon-brokenlinks: Use USE_EQUO instead of GENTOO_TOOL env 2019-08-23 23:12:32 +02:00
Daniele Rondina d72e8c220b sabayon-brokenlinks: Minor fix on message 2019-08-23 15:02:25 +02:00
Daniele Rondina 280a665707 sabayon-brokenlinks: Add support for libs *.a 2019-08-23 14:59:19 +02:00
Daniele Rondina 631072d2a5 sabayon-brokenlinks: Use equo by default as tool 2019-08-21 18:41:32 +02:00
Daniele Rondina 4839c818de sabayon-brokenlinks: Review with cli arguments support 2019-08-13 15:33:11 +02:00
Daniele Rondina 11977d3afd sabayon-brokenlinks: Integrate automatic remove of broken links 2019-08-12 17:09:30 +02:00
Daniele Rondina 5972c0137f sabayon-brokenlinks: WIP 2019-08-09 19:45:05 +02:00
Daniele Rondina 286533e74e builder: Use rsync instead of cp on copy git portage 2019-04-03 18:16:43 +02:00
Daniele Rondina a3f9796c6d builder: Add support for git portage tarball 2019-03-22 22:06:29 +01:00
Ettore Di Giacinto 1921cae295 Extract common func to setup perms, fix git3 perms 2018-09-26 20:14:13 +02:00
Ettore Di Giacinto 3322c5aa17 Make non fatal equo install deps 2018-07-28 18:14:35 +02:00
Ettore Di Giacinto 95ffe4d49d Add hook script function 2018-07-22 17:24:36 +02:00
Ettore Di Giacinto 59855f3bb1 Be quiet also on emerge --sync 2018-07-22 16:46:25 +02:00
Ettore Di Giacinto d151a77e51 Prefer long syntax option 2018-07-22 15:47:43 +02:00
Ettore Di Giacinto 8fda356c53 Also include summary in injected_targets 2018-07-21 21:38:42 +02:00
Ettore Di Giacinto 69ee6dfefa Add LICENSE 2018-07-21 18:33:06 +02:00
Ettore Di Giacinto 9be88688bc Do not die on failed enman commands
- Also print a short summary of compilation result
- Add KEEP_GOING env variable,
  if disabled a failure in split install makes the build fail
2018-07-21 18:33:06 +02:00
Ettore Di Giacinto 47aa0c3cbf Merge pull request #18 from Sabayon/fix-enman-add
Tuning enman repos management and add debug stuff
2018-06-24 12:40:26 +02:00
Geaaru 09f618043d Tuning enman repos management and add debug stuff 2018-06-15 10:28:23 +02:00
Ettore Di Giacinto 66284024a2 Use new eit options 2018-06-02 13:38:31 +02:00
Ettore Di Giacinto 64f8ee54a3 functions: make /opt/sabayon-build/ configurable 2018-02-15 00:07:41 +01:00
Ettore Di Giacinto 6cc8d3d7ae switch default profile 2018-02-03 22:56:16 +01:00
Ettore Di Giacinto 7512a7f184 push experimental sabayon-commit 2018-01-23 21:51:28 +01:00
Ettore Di Giacinto bdd6ffac8c Merge pull request #17 from geaaru/fix_builder_debug
[builder] Fix print of $remove_layman_overlay
2018-01-17 17:52:22 +01:00
Geaaru b42ef2feb7 [builder] Fix print of $remove_layman_overlay 2018-01-17 09:31:13 +01:00
Ettore Di Giacinto cf77609a7b Merge pull request #16 from geaaru/documentation
Add documentation
2018-01-15 18:42:33 +01:00
Geaaru dc05aace0b Add documentation 2018-01-15 15:45:13 +01:00
Ettore Di Giacinto 928d6da693 Refactorize and quote package when getting deps of package 2017-07-30 01:43:17 +02:00
Ettore Di Giacinto 5c927a25c6 Refactorizations 2017-07-30 01:26:11 +02:00
Ettore Di Giacinto 813148303c Add support for new options exposed in builder
- INTERNAL_BUILDER: swaps the builder supplied in the env var with the one executed in the container
- BUILDER_VERBOSE: enable verbose mode
- SHARE_WORKSPACE: enable sharing of the build directory with the container
- PRE_SCRIPT/POST_SCRIPT: absolute paths of scripts that have to be executed in the container
2017-07-30 01:18:37 +02:00
Ettore Di Giacinto 5a3be7c0f1 Add support for pre_script and post_script, executed before and after the build
Also add support for package major/minor syntax and verbose option
2017-07-30 01:17:03 +02:00
Ettore Di Giacinto 6fbd3f4f22 functions: remove sudo calls 2017-07-09 11:25:46 +02:00
Ettore Di Giacinto 0be7f76824 sabayon-buildpackages: add support for INTERNAL_BUILDER, swap the builder image with the local installed one 2017-07-09 11:25:28 +02:00
Ettore Di Giacinto 7b2adad931 builder: include also injected_packages in overlays detection 2017-06-18 12:58:21 +02:00
Ettore Di Giacinto 6283b34be8 builder: parse overlays also from package list 2017-06-18 12:26:07 +02:00
Ettore Di Giacinto 11812ff1a2 move QA checks on the bottom, enhance output display and fix depchecking when package contain overlay name 2017-06-05 21:13:30 +02:00
Ettore Di Giacinto e31a06cee3 add gitignore 2017-05-21 14:33:36 +02:00
Ettore Di Giacinto b91870c72d sabayon-buildpackages: add support for DETECT_OBSOLETE and TARGET_OVERLAY 2017-05-21 14:16:04 +02:00
Ettore Di Giacinto b1726fdb4d builder: add DETECT_OBSOLETE 2017-05-21 14:13:59 +02:00
Ettore Di Giacinto 6d0f26ceb7 sabayon-detectobsolete: more perlish 2017-03-29 14:46:34 +02:00
Ettore Di Giacinto 49ba945b63 builder: running emerge -C anyway 2017-03-29 14:19:39 +02:00
Ettore Di Giacinto f55338b552 sabayon-detectobsolete: utility to list possible obsolete packages in overlays 2017-03-29 14:19:39 +02:00
Ettore Di Giacinto 0c964e4b64 builder: PRETEND changes
move up the adjustment of emerge/equo arguments, avoid to copy artifacts when PRETEND mode is on
2017-03-22 14:40:27 +01:00
Ettore Di Giacinto 5f75f6e64b builder: do not emerge preserved rebuild if PRETEND is set 2017-03-20 11:19:17 +01:00
Ettore Di Giacinto 9fd7ce2582 builder: PRETEND avoids also package removals. 2017-03-20 11:17:59 +01:00
Ettore Di Giacinto a62baaf0ea builder: PRETEND, add -p to equo/emerge arguments 2017-03-19 11:50:09 +01:00
Ettore Di Giacinto bf78080418 Revert "builder: add PRETEND environment variable"
This reverts commit 575ec04147.
2017-03-18 13:54:12 +01:00
Ettore Di Giacinto 218dfa9dcd sabayon-buildpackages: add PRETEND support 2017-03-15 14:12:12 +01:00
Ettore Di Giacinto 575ec04147 builder: add PRETEND environment variable 2017-03-15 11:50:41 +01:00
Ben Roberts 903aa0fa0d add SYS_PTRACE capability to docker build, to prevent sandbox ptrace errors 2016-11-02 11:21:03 +00:00
Ettore Di Giacinto ada5793612 sabayondevkit-functions: set -e and make non-fatal commands return always true 2016-11-02 12:11:47 +01:00
Ettore Di Giacinto af32293577 fix syntax errors 2016-10-27 01:42:26 +02:00
Ben Roberts 411c142f00 Fixup perlisms 2016-10-24 10:48:36 +01:00
Ben Roberts 9446715e1a Attempt to only add/remove enman repos that need action
Since enman was changed to provide exit status 1 [1] if the requested
operation failed, builder attempting to re-add an already existing repo
caused the entire build to fail. Rather than run the command and hope
for the best, this commit changes builder to obtain a list of already
installed repositories, and only add/remove the requested repos that
aren't already in the correct state.

[1] Sabayon/enman@7f3a6c88
2016-10-24 09:16:35 +01:00
Ettore Di Giacinto 890206ba80 sabayondevkit-functions.sh: add -u as default emerge option to build_category_installed and build_obsolete 2016-10-11 14:48:01 +02:00
mudler 79567a647b sabayon-maint-helper: acquire lock before execution 2016-10-10 16:44:47 +02:00
Ettore Di Giacinto 0769169cc6 sabayondevkit-functions.sh: fix typo 2016-10-10 14:14:07 +02:00
mudler 03b7b4fd18 sabayon-maint-helper: fixes 2016-10-10 12:06:56 +02:00
mudler 39f437f0aa adding sabayon-maint-helper 2016-10-10 12:01:33 +02:00
Ben Roberts 4747e43752 Enable RSS feeds and changelogs on repos 2016-10-02 18:36:46 +01:00
Ettore Di Giacinto 2d1c16e76e builder: EQUO_SPLIT_INSTALL default is now 0 2016-09-22 00:05:52 +02:00
Ben Roberts 4dbbc6b34a Strip out package itself from package_deps
Package_deps returned the target package in the output which is not
strictly true (the package is not a dependency of itself really).
In calcuate_missing also means we install the package once using entropy
(if available), and then immediately replace it with portage,
which just wastes effort.

It breaks installation in the cases where the older equo version blocks the
new portage version (e.g. change of slot).

This should remove the target package from the list of packages to be
installed with entropy.
2016-09-13 22:08:43 +01:00
Ettore Di Giacinto 36999309c2 builder: adding checks to fix a broken layman configuration 2016-09-13 10:06:05 +02:00
Ettore Di Giacinto 1ef3938a96 builder: enhance debug of profile setting 2016-09-12 13:17:29 +02:00
Ben Roberts 9119c8c973 Merge branch 'prune_virtual_fixes' 2016-09-11 17:41:08 +01:00
Ben Roberts 632053fc2f Print the builder docker commandline to aid in debugging 2016-09-11 17:19:11 +01:00
Ben Roberts 6fc14f7605 Expose /vagrant from the buildbox into the docker container to aid in debugging 2016-09-11 17:18:49 +01:00
Ben Roberts 4268b06305 Fix virtual pruning by switching from state to global variable for package_deps cache 2016-09-11 17:18:20 +01:00
mudler a66dc7bb23 builder: added check for missing DEPEND/RDEPEND in QA phase 2016-09-10 15:00:09 +02:00
mudler 1c4389a8aa Makefile: cleanup 2016-09-10 14:49:24 +02:00
mudler c2a14afdf9 dynlink-scanner: add original author to the file 2016-09-10 14:42:30 +02:00
mudler 2e7c359b8c add dynlink scanner 2016-09-10 14:41:06 +02:00
mudler e86c134e61 add depcheck 2016-09-10 12:40:45 +02:00
mudler b34388c259 Merge branch 'dev' 2016-08-15 15:13:45 +02:00
mudler a1957a0587 [builder] fixes 2016-08-15 15:12:26 +02:00
mudler fcfb218a17 [builder] turn on split_install by default 2016-08-15 14:56:46 +02:00
mudler bac150a267 [builder] enhancing output 2016-08-15 14:48:18 +02:00
mudler 350e3d1000 [builder] split up into functions 2016-08-13 13:04:45 +02:00
mudler 10ef5244e3 [builder] allow to specify custom use flags per-package in the lists instead of in custom.use
* if emerge_split_install is enabled, then build.targets can contain useflags. (e.g. media-tv/kodi[-avahi] )
* for injected packages, this feature is always on
2016-08-13 12:40:36 +02:00
mudler 4b2cf1141c [sabayon-buildpackages] add support for ETP_NOCACHE 2016-08-04 11:25:21 +02:00
Ettore Di Giacinto 6e3ae4db29 builder: cleanup 2016-07-23 18:33:13 +02:00
Ettore Di Giacinto d3e174eb10 sabayon-buildpackages: add support for REMOTE_PORTDIR and REMOTE_CONF_PORTDIR 2016-07-23 18:30:43 +02:00
Ettore Di Giacinto 4c4279e707 builder: add support for remote portdir and portage configurations 2016-07-23 18:30:03 +02:00
mudler 0e33e0d75f builder: enable more verbosity to debug QA_CHECKS 2016-07-21 10:23:16 +02:00
mudler cd19f3b85b [builder] add equo args (multifetch && co.) 2016-07-21 10:20:06 +02:00
Ettore Di Giacinto b899a21852 [sabayon-buildpackages] support mounting of /etc/portage/env 2016-07-18 22:36:00 +02:00
Ettore Di Giacinto c9ad172bd4 [sabayon-buildpackages] mount packages.env instead populating packages.env/ 2016-07-18 22:26:33 +02:00
Ettore Di Giacinto cdac817e59 sabayondevkit-functions: trying softly to start docker daemon 2016-07-16 15:36:57 +02:00
Ettore Di Giacinto b33b4aa619 [builder] print qa checks if we are doing et 2016-07-16 10:27:54 +02:00
mudler c8cd58df4b [builder, sabayon-buildpackages] add QA_CHECKS env variable 2016-07-08 00:28:18 +02:00
Ettore Di Giacinto 44d7510792 [builder] removing append to make.conf, now the env variable is set and working also on the entropy side 2016-07-03 14:48:44 +02:00
Ettore Di Giacinto c7891958ea [functions] add --noreplace to default args 2016-05-28 12:56:52 +02:00
mudler c8a1ece37c [functions] build() and build_installed() echoing packages being installed 2016-05-28 12:33:09 +02:00
Ettore Di Giacinto fb745c8ed8 [builder] use ACCEPT_LICENSE with wildcard since Entropy 302 2016-05-26 12:17:07 +02:00
mudler 36fc5a6656 [sabayon-buildpackages] adding support for REMOVE_REMOTE_OVERLAY REMOVE_LAYMAN_OVERLAY 2016-05-17 19:31:52 +02:00
mudler a65f1acdca [builder] add support for REMOVE_REMOTE_OVERLAY and REMOVE_LAYMAN_OVERLAY 2016-05-17 19:30:40 +02:00
mudler 02fd49a321 [builder] better output for logs 2016-05-17 19:23:27 +02:00
mudler 868dfb767d [builder] clone user defined local_portage only if dir exists 2016-05-17 19:20:20 +02:00
mudler 5855d12d75 [builder] allow to pass to remote overlay the name and the sync-type 2016-05-17 19:18:24 +02:00
mudler 44aa54b031 [builder] removing dots from repository name 2016-05-16 11:12:02 +02:00
mudler 6bcf4abfee [builder] changing namespace allocation 2016-05-16 00:18:34 +02:00
mudler 31d3bca34b [builder] guessing sync_type from url 2016-05-13 22:45:30 +02:00
mudler 869f6a4363 [builder] url must be given in absolute form 2016-05-13 22:12:21 +02:00
mudler 3709d50006 [builder] default masters = gentoo https://github.com/Sabayon/community-buildspec/issues/9 2016-05-13 21:59:05 +02:00
mudler 939acad797 [builder] fixes and enhancement to add_portage_repository() https://github.com/Sabayon/community-buildspec/issues/9 2016-05-13 21:56:09 +02:00
mudler d9042cc4b5 [sabayon-buildpackages] TEMPDIR now is useless https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:16:30 +02:00
mudler 64d7085cb6 [builder/sabayon-buildpackages] passing REMOTE_OVERLAY to builder and adding repos as listed https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:09:44 +02:00
mudler 795aab5d24 [builder] don't re-add the repository if already there, sync instead. name of overlay now will be in the form namespace-name https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 12:04:34 +02:00
mudler b57f8905fe [builder] adding add_portage_repository() https://github.com/Sabayon/community-buildspec/issues/9 2016-05-12 11:58:14 +02:00
mudler 93a1093560 [builder] set ETP_NONINTERACTIVE to 1 2016-05-11 10:43:30 +02:00
mudler 84e62c332b [builder/buildpackages] adding EMERGE_REMOVE env 2016-05-10 11:40:08 +02:00
mudler 4430495086 [builder] printing what package we are compiling 2016-05-09 10:25:02 +02:00
mudler 70a7542692 [builder] remove workaround no longer needed 2016-05-03 23:55:27 +02:00
Ettore Di Giacinto 8aed3a00fa [builder] ENMAN_ADD_SELF defaults to 0 2016-05-03 10:47:29 +02:00
mudler 35f27e7b3b [builder/buildpackages] adding REMOVE_ENMAN_REPOSITORIES 2016-05-02 14:11:50 +02:00
Ettore Di Giacinto 6b1d8377b6 Update README.md 2016-04-30 14:33:34 +02:00
mudler db91098e92 [sabayon-createrepo-*] fixup typo 2016-04-22 17:42:35 +02:00
mudler 6fcccf99b8 [builder] do not check if string is contained in append_to_file if doesn't exists 2016-04-22 11:13:34 +02:00
mudler 67781838d3 [builder/sabayon-buildpackages] safe copy /usr/local/portage 2016-04-21 22:01:22 +02:00
mudler 69d8e28ac1 [builder] fixing permissions on local overlay 2016-04-21 21:52:41 +02:00
mudler b491ffccae [builder] check if the content is already there before appending content to file 2016-04-21 21:30:09 +02:00
mudler 066fb07d72 [builder] typo fixes 2016-04-17 19:47:01 +02:00
mudler c89721ab2e [builder] dropping equo (un)mask call, writing directly to packages.(un)mask files 2016-04-16 16:20:28 +02:00
mudler ea3d87a48a [sabayon-createrepo-*] adding gpg key support 2016-04-14 23:28:25 +02:00
mudler d1481e915f [builder] equo (s)mask should be done before installing any packages 2016-04-13 16:08:36 +02:00
mudler b185a1536b [sabayon-buildpackages] typo fix 2016-04-11 21:35:19 +02:00
mudler b089771d17 [builder/sabayon-buildpackages] adding support for equo (un)mask 2016-04-11 21:27:33 +02:00
mudler f81e90d555 [builder] don't exit if no args are given, allowing creating up-to-dated container with all set-up for compilation also if no args are given. adding --help 2016-04-08 19:20:20 +02:00
mudler fb930cdeb3 [builder] add support for BUILD_INJECTED_ARGS 2016-04-08 19:09:06 +02:00
mudler a904bbcbe1 [sabayon-createrepo] adding information output of repo creation phases 2016-04-08 00:51:08 +02:00
mudler ccd4a760f4 [sabayon-createrepo] fixing eit key signing 2016-04-08 00:47:59 +02:00
mudler 0944d27ce9 [sabayon-createrepo] fixing typo 2016-04-08 00:17:42 +02:00
mudler d248206aaa [sabayon-createrepo] push after repository initialization 2016-04-07 22:11:55 +02:00
mudler 65c62a3d8a [sabayon-*] executables 2016-04-07 21:06:13 +02:00
mudler 3be8ff13d1 [sabayon-help-info] adding script to collect system information to allow easy sharing for assistance 2016-04-07 21:05:59 +02:00
mudler 99cae9c7d1 [sabayon-createrepo] don't import keys if already exists 2016-04-07 16:09:09 +02:00
mudler d0df62c8f6 [sabayon-createrepo] signing old packages before injecting new ones 2016-04-06 21:48:28 +02:00
mudler 6ee7ef7845 [builder] show in logs the devkit version 2016-03-29 19:07:48 +02:00
24 changed files with 2203 additions and 180 deletions
+1
View File
@@ -0,0 +1 @@
*.bak
+6
View File
@@ -0,0 +1,6 @@
Copyright authors:
------
Ettore Di Giacinto <mudler@gentoo.org> ( original author )
Ben Roberts <optiz0r@sabayon.org>
Daniele Rondina <geaaru@sabayon.org>
+178
View File
@@ -0,0 +1,178 @@
# Scripts
Devkit contains a list of scripts used by Sabayon for building process and
for manage package injection to repositories.
## List of files
* `depcheck`: a tool to report both undeclared and potentially-unused
runtime dependencies.
* `dynlink-scanner`: a tool for retrieve list of linked libraries used
by a package. Use try_dlopen execute binary.
* `sabayon-brokenlibs`: a tool for retrieve list of all dependencies
of a binary through equo and equery tools. Print list of dependencies.
This script depends on:
- equo
- equery
- sabayondevkit-functions.sh
* `sabayon-buildpackages`: Script for Spawning the package builder container.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-bz2brokenlibs`: Unpack bz2 tarball and execute sabayon-brokenlibs
to every files unpacked.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-createrepo`: Script for spawning container for commit packages to
a repository and create it if doesn't exists.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-createrepo-cleanup`: Script for spawning container for cleanup
expired packages from a repository.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-createrepo-remove`: Script for spawning container for remove a list
of packages from a repository.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-detectobsolete`: Perl script for found obsolete packages in an
overlay. Possible options are: --arch, --overlay and --verbose.
This script depends on:
- querypkg
* `sabayon-entropypreservedlibs`: Perl script for retrieve list of packages that has
dependencies to old libraries.
See also [here](https://wiki.sabayon.org/index.php?title=En:Sabayon_Devkit#sabayon-entropypreservedlibs)
* `sabayon-help-info`: Bash script for grabbing system information and post to
sabayon pastebin.
This script depends on:
- pastebunz
* `sabayon-maint-helper`: Script for builder boxes maintenance.
Possible options are:
- `--installed`: For upgrades all the packages installed in the box.
- `--obsolete`: Upgrade ONLY the packages that are listed obsolete
- `--all`: Tries to upgrade all packages
- `--category`: Tries to upgrade/install all packages present in a specified category.
This script depends on:
- sabayondevkit-functions.sh
* `sabayon-tbz2extract`: Python script for extract tbz2 package.
* `sabayon-tbz2truncate`: Python script for truncate tbz2 package
* `sabayon-xpakextract`: Python script for convert tbz2 in .xpak file
* `builder`: Perl script for build packages.
## Scripts Variables
### sabayon-createrepo
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| REPOSITORY_NAME | default | Name of the repository to create. |
| REPOSITORY_DESCRIPTION | My Sabayon repository | Description of the repository to create. |
| DOCKER_IMAGE | sabayon/eit-amd64 | Docker image to use on create repository |
| PORTAGE_ARTIFACTS | $SAB_WORKSPACE/portage_artifacts | Directory of the artifacts to insert on repository |
| OUTPUT_DIR | $SAB_WORKSPACE/entropy_artifacts | Output directory of the repository |
| DOCKER_OPTS | --ti --rm | Docker options to pass on run container. |
| PUBKEY | - | Define file to mount as volume to /etc/entropy/mykeys/key.pub |
| PRIVATEKEY | - | Define file to mount as volume to /etc/entropy/mykeys/private.key |
### sabayon-createrepo-cleanup
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| REPOSITORY_NAME | default | Name of the repository to clean. |
| REPOSITORY_DESCRIPTION | My Sabayon repository | Description of the repository to clean. |
| DOCKER_IMAGE | sabayon/eit-amd64 | Docker image to use on clean repository |
| OUTPUT_DIR | $SAB_WORKSPACE/entropy_artifacts | Directory of the repository |
| DOCKER_OPTS | --ti --rm | Docker options to pass on run container. |
| PUBKEY | - | Define file to mount as volume to /etc/entropy/mykeys/key.pub |
| PRIVATEKEY | - | Define file to mount as volume to /etc/entropy/mykeys/private.key |
### sabayon-createrepo-remove
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| REPOSITORY_NAME | default | Name of the repository where remove packages. |
| REPOSITORY_DESCRIPTION | My Sabayon repository | Description of the repository. |
| DOCKER_IMAGE | sabayon/eit-amd64 | Docker image to use on clean repository |
| OUTPUT_DIR | $SAB_WORKSPACE/entropy_artifacts | Directory of the repository |
| DOCKER_OPTS | --ti --rm | Docker options to pass on run container. |
| PUBKEY | - | Define file to mount as volume to /etc/entropy/mykeys/key.pub |
| PRIVATEKEY | - | Define file to mount as volume to /etc/entropy/mykeys/private.key |
### sabayon-buildpackages
| Env Variable | Default | Description |
|--------------|---------|-------------|
| SAB_WORKSPACE | $PWD | Workspace directory |
| DOCKER_IMAGE | sabayon/builder-amd64 | Docker image to use for compilation |
| SAB_ARCH | intel | Name of arch to use defined on build Sabayon project |
| DOCKER_PULL_IMAGE | 0 | If try to pull last image (1) or use local version |
| MAKE_CONF | $SAB_WORKSPACE/specs/make.conf | Path of make.conf custom to supply on compilation |
| OUTPUT_DIR | $SAB_WORKSPACE/portage_artifacts/ | Where are written portage artifacts compiled |
| LOCAL_OVERLAY | $SAB_WORKSPACE/local_overlay/ | Directory to use for supply local overlay as volume of the image on compilation |
| ENTROPY_REPOSITORY | main | Sabayon repository to use: weekly, main or testing |
| DOCKER_OPTS | --ti --rm --cap-add=SYS_PTRACE | Options to use on running Docker image |
| PORTAGE_CACHE | - | If present permit to supply host portage directory to container |
| BUILDER_PROFILE | - | Permit to choice Gentoo Profile to use |
| EMERGE_SPLIT_INSTALL | - | Possible values are 0/1. |
| BUILDER_JOBS | 1 | Define number of jobs for emerge phase. |
| USE_EQUO | 1 | Use equo for install and align compilation environment. |
| PRESERVED_REBUILD | 0 | Execute (emerge @preserve-rebuild) |
| EQUO_INSTALL_ATOMS | 1 | Try to install existing dependencies from equo repositories |
| DEPENDENCY_SCAN_DEPTH | 2 | Define depth level for dependencies calculation |
| FEATURES | "parallel-fetch protect-owned compressdebug splitdebug -userpriv" | Override Gentoo FEATURES variable |
| EMERGE_DEFAULTS_ARGS | "--accept-properties=-interactive --verbose --oneshot --complete-graph --buildpkg" | Override default emerge options |
| EQUO_INSTALL_VERSION | 0 | |
| EQUO_SPLIT_INSTALL | 0 | |
| ARTIFACTS_DIR | - | Additional directory where copy artifacts |
| ENTROPY_REPOSITORY | main | Choice repository to use. Values: main, weekly, testing |
| SKIP_PORTAGE_SYNC | 0 | Skip portage sync before compilation |
| EQUO_MIRRORSORT | 1 | Execute equo mirrorsort before compilation |
| WEBRSYNC | 0 | Use webrsync instead of defult rsync |
| ENMAN_REPOSITORIES | - | Define list of enman repositories to add |
| REMOVE_ENMAN_REPOSITORIES | - | Define list of enman repositories to remove |
| DISTFILES | - | Permit to mount volume to /usr/portage/distfiles directory and speedup download phase if packages are already available |
| INTERNAL_BUILDER | - | Define a host builder to use instead of docker builder binary |
| ENTROPY_DOWNLOADED_PACKAGES | - | Mount volume to /var/lib/entropy/client/packages to use caching on download equo packages |
| DISTCC_HOSTS | - | Override Gentoo DISTCC_HOSTS variable to use DISTCC |
| PRUNE_VIRTUALS | 0 | Prune virtuals packages to avoid conflicts. |
| REPOSITORY_NAME | - | Add single enman repository (for compilation of scr repository itself) |
| ENMAN_ADD_SELF | 0 | If add with enman repository define on REPOSITORY_NAME variable |
| EQUO_MASKS | - | Define a list of packages to mask with equo mask command |
| EQUO_UNMASKS | - | Define a list of packages to unmask with equo unmask command |
| EMERGE_REMOVE | - | Define a list of packages to remove with emerge -C command before compilation |
| REMOTE_OVERLAY | - | Define a list of overlay to add before compilation |
| REMOVE_LAYMAN_OVERLAY | - | Define a list of overlays to remove before compilation |
| REMOTE_REMOTE_OVERLAY | - | Define a list of files under /etc/portage to remove |
| QA_CHECKS | - | Execute quality check on packages. repoman, dynlink-scanner and depcheck |
| REMOTE_CONF_PORTDIR | - | If defined permit to define a git repository to clone under /etc/portage directory. |
| REMOTE_PORTDIR | - | If defined permit to define a git repository to clone under /usr/portage directory. |
| ETP_NOCACHE | - | Define ETP_NOCACHE variable on environment |
| PRETEND | 0 | If set to 1 append -p option to emerge commands. |
| BUILDER_VERBOSE | 0 | If set to 1 add verbose to builder program. |
| DETECT_OBSOLETE | 0 | Execute script sabayon-detectobsolete to target overlay to found obsolete ebuilds. |
| TARGET_OVERLAY | - | Define overlay where execute sabayon-detectobsolete script. Require DETECT_OBSOLETE variable set to 1. |
| LOCAL_OVERLAY | - | Define a directory to mount as volume to /usr/local/local_portage |
| SHARE_WORKSPACE | - | If defined mount volume defined on SAB_WORKSPACE variable to /devkit-workspace |
| PRE_SCRIPT | - | Mount a custom script to /pre-script execute before compilation |
| POST_SCRIPT | - | Mount a custom script to /post-script execute after packages compilation |
| MAKE_CONF | - | If defined mount defined file to /etc/portage/make.conf.custom and define variable MAKE_CONF to bet to mounted path. |
+4
View File
@@ -25,4 +25,8 @@ install:
install -m 0755 builder $(DESTDIR)/$(USBINDIR)/
install -d $(DESTDIR)/$(UBINDIR)
install -m 0755 depcheck $(DESTDIR)/$(UBINDIR)/
install -m 0755 dynlink-scanner $(DESTDIR)/$(UBINDIR)/
gcc try_dlopen.c -o try_dlopen -ldl
install -m 0755 try_dlopen $(DESTDIR)/$(UBINDIR)/
install -m 0755 sabayon-* $(DESTDIR)/$(UBINDIR)/
+3 -1
View File
@@ -11,7 +11,7 @@ sudo equo i sabayon-devkit
## Prerequisites
* docker installed in the machine (`sudo equo i docker`), and the daemon started (`sudo systemctl start docker`)
* if you don't want to run that as root, the user where are you running the script must be in the docker group (`sudo gpasswd -a $USER docker`)
* if you don't want to run that as root, the user where are you running the script must be in the docker group (`sudo gpasswd -a $USER docker`), or granting permission to yourself adding your user to the sudoer file.
Packages can be built in a clean environment with docker by running `sabayon-buildpackages`.
@@ -92,6 +92,8 @@ you can override the Architecture folder in which files are placed specifying in
- DOCKER_PULL_IMAGE -- tells the script to update the docker image before compiling, enable it with 1, disable with 0
- OUTPUT_DIR -- optional, default to "portage_artifacts" in your current working directory, it is the path where emerge generated tbz2 are stored (absolute path)
- LOCAL_OVERLAY -- optional, you can specify the path to your local overlay (absolute path)
- REMOTE_OVERLAY -- optional, a space separated list of overlays that can be cloned with git.
The arguments are the packages that you want compile, they can be also in the complete form *e.g. =foo-bar/misc-1.2*
+653 -83
View File
@@ -1,15 +1,33 @@
#!/usr/bin/env perl
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
use URI;
use Getopt::Long;
use v5.10;
no feature "say";
use Storable 'dclone';
use Sort::Versions;
my $profile = $ENV{BUILDER_PROFILE} // 3;
my $profile = $ENV{BUILDER_PROFILE} // 16;
my $jobs = $ENV{BUILDER_JOBS} // 1;
my $use_equo = $ENV{USE_EQUO} // 1;
my $preserved_rebuild = $ENV{PRESERVED_REBUILD} // 0;
my $emerge_defaults_args = $ENV{EMERGE_DEFAULTS_ARGS}
// "--accept-properties=-interactive --verbose --oneshot --complete-graph --buildpkg";
// "--accept-properties=-interactive --quiet --oneshot --complete-graph --buildpkg";
$ENV{FEATURES} = $ENV{FEATURES}
// "parallel-fetch protect-owned compressdebug splitdebug -userpriv";
@@ -21,56 +39,264 @@ my $entropy_repository = $ENV{ENTROPY_REPOSITORY}
// "main"; # Can be weekly, main, testing
my $artifacts_folder = $ENV{ARTIFACTS_DIR};
my $dep_scan_depth = $ENV{DEPENDENCY_SCAN_DEPTH} // 2;
my $dep_ignore_versions = $ENV{DEPENDENCY_IGNORE_VERSIONS} // 0;
my $skip_portage_sync = $ENV{SKIP_PORTAGE_SYNC} // 0;
my $emerge_split_install = $ENV{EMERGE_SPLIT_INSTALL} // 0;
my $webrsync = $ENV{WEBRSYNC} // 0;
# Define git tarball url to use instead of webrsync or emerge --sync
my $portage_git_url = $ENV{PORTAGE_GIT_URL} // "";
# Define supported tarball types: github|gitlab
my $portage_git_service = $ENV{PORTAGE_GIT_SRV} // "github";
my $portage_git_branch = $ENV{PORTAGE_GIT_BRANCH} // "master";
my $enman_repositories = $ENV{ENMAN_REPOSITORIES};
my $emerge_remove = $ENV{EMERGE_REMOVE};
my $remove_enman_repositories = $ENV{REMOVE_ENMAN_REPOSITORIES};
my $remove_remote_overlay = $ENV{REMOVE_REMOTE_OVERLAY};
my $remove_layman_overlay = $ENV{REMOVE_LAYMAN_OVERLAY};
my $prune_virtuals = $ENV{PRUNE_VIRTUALS} // 0;
my $repository_name = $ENV{REPOSITORY_NAME};
my $enman_add_self = $ENV{ENMAN_ADD_SELF} // 1;
my $enman_add_self = $ENV{ENMAN_ADD_SELF} // 0;
my $build_injected_args = $ENV{BUILD_INJECTED_ARGS};
my $equo_masks = $ENV{EQUO_MASKS};
my $equo_unmasks = $ENV{EQUO_UNMASKS};
my $equo_install_args = $ENV{EQUO_INSTALL_ARGS} // "--multifetch=10";
my $remote_overlay = $ENV{REMOTE_OVERLAY};
my $qualityassurance_checks = $ENV{QA_CHECKS} // 0;
my $remote_conf_portdir = $ENV{REMOTE_CONF_PORTDIR};
my $remote_portdir = $ENV{REMOTE_PORTDIR};
my $pretend = $ENV{PRETEND} // 0;
my $obsoleted = $ENV{DETECT_OBSOLETE} // 0;
my $target_overlay = $ENV{TARGET_OVERLAY};
my $verbose = $ENV{BUILDER_VERBOSE} // 0;
my $keep_going = $ENV{KEEP_GOING} // 1;
my $make_conf = $ENV{MAKE_CONF};
my @overlays;
my $help = 0;
GetOptions(
'layman|overlay:s{,}' => \@overlays,
'equo|install:s{,}' => \@equo_install,
'equorm|remove:s{,}' => \@equo_remove
'equorm|remove:s{,}' => \@equo_remove,
'help|?' => \$help
);
if ( @ARGV == 0 ) {
help();
die();
}
help() if $help;
$ENV{LC_ALL} = "en_US.UTF-8"; #here be dragons
$ENV{ETP_NONINTERACTIVE} = 1;
$ENV{ACCEPT_LICENSE} = "*"; # we can use wildcard since entropy 302
# A barely print replacement
sub say { print join( "\n", @_ ) . "\n"; }
sub loud {
say;
say "===" x 4;
say "===" x 4;
say @_;
say "===" x 4;
say "===" x 4;
say;
}
sub safe_call {
my $cmd = shift;
my $rt = system($cmd);
my $rt = _system($cmd);
my $return = $rt >> 8;
exit($return) if ($rt);
}
sub _system {
say "Executing: @_" if $verbose;
return system(@_);
}
sub append_to_file {
my ( $file_name, $package ) = @_;
if ( -f $file_name ) {
# Check that the package was not already there
open my $fh_ro, '<:encoding(UTF-8)', $file_name
or die("Cannot open: $file_name");
while ( my $line = <$fh_ro> ) {
return if $line eq $package . "\n";
}
close $fh_ro;
}
open( my $fh_a, '>>', $file_name )
or die "Could not open file '$filename' $!";
print $fh_a $package . "\n";
close $fh_a;
}
sub parse_overlays {
map { $_ =~ s/.*?\:\://g; $_ } grep {/\:\:/} @{ dclone( \@_ ) };
}
sub hook_script {
my $s = shift;
_system("chmod +x ${s};${s}") if -e $s;
}
sub add_portage_repository {
my $repo = $_[0];
my $reponame;
my $sync_type;
my @repodef = split( /\|/, $repo );
( $reponame, $repo ) = @repodef if ( @repodef == 2 );
( $reponame, $sync_type, $repo ) = @repodef if ( @repodef == 3 );
# try to detect sync-type
if ( !$sync_type ) {
$sync_type = ( split( /\:/, $repo ) )[0];
$sync_type = "git"
if $repo =~ /github|bitbucket/
or $sync_type eq "https"
or $sync_type eq "http";
$sync_type = "svn" if $repo =~ /\/svn\//;
}
$reponame = ( split( /\//, $repo ) )[-1] if !$reponame;
$reponame =~ s/\.|//g; #clean
_system("mkdir -p /etc/portage/repos.conf/")
if ( !-d "/etc/portage/repos.conf/" );
say "==== Adding $reponame ====";
qx{
echo '[$reponame]
location = /usr/local/overlay/$reponame
sync-type = $sync_type
sync-uri = $repo
auto-sync = yes' > /etc/portage/repos.conf/$reponame.conf
}; # Declaring the repo and giving priority
_system("emaint sync -r $reponame");
}
# Input: package, depth, and atom. Package: sys-fs/foobarfs, Depth: 1 (depth of the package tree) , Atom: 1/0 (enable disable atom output)
sub package_deps {
my $package = shift;
my $depth = shift // 1; # defaults to 1 level of depthness of the tree
my $atom = shift // 0;
my %package_dep_cache;
# Since we expect this sub to be called multiple times with the same arguments, cache the results
state %cache;
$cache_key = "${package}:${depth}:${atom}";
sub parse_package_str {
my ($pkg, $p, $cat, $v) = @_;
my @parts = split '/', $pkg;
$p = $parts[1];
$cat = $parts[0];
if ( !exists $cache{$cache_key} ) {
@dependencies =
qx/equery -C -q g --depth=$depth $package/; #depth=0 it's all
chomp @dependencies;
$regex = '[-]r[\d]$';
$regex .= '|_p[\d]+[-]r[\d]$';
$regex .= '|_p[\d]+$';
$regex .= '|_alpha[\d]*$';
$regex .= '|_beta[\d]*$';
$regex .= '|_pre[\d]*$';
$regex .= '|_pre[\d]*[-]r[\d]$';
$regex .= '|_rc[\d]*$';
# Drop extra version suffix for now.
$p =~ s/($regex)//g;
$v = $p; # Version regex
# 1.1
$version_regex = "[0-9]+[.][0-9]+[a-z]*";
# 1
$version_regex .= "|[0-9]+[a-z]*";
# 1.1.1
$version_regex .= "|[0-9]+[.][0-9]+[.][0-9]+[a-z]*";
# 1.1.1.1
$version_regex .= "|[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+[a-z]*";
# 1.1.1.1.1
$version_regex .= "|[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+[.][0-9]+[a-z]*";
# 1.1.1.1.1.1
$version_regex .= "|[0-9]+[.][0-9]+[.][0-9]+[.][0-9]+[.][0-9]+[.][0-9]+[a-z]*";
$p =~ m/[-]($version_regex)*$/;
$v = $&; $v = substr $v, 1 if length($v) > 1;
$p =~ s/-[\d.]*$//g;
return $cat, $p, $v;
}
sub parse_package_version {
my ($cat, $p, $v) = parse_package_str(@_);
return $v;
}
sub simplify_package {
my ($cat, $p, $v) = parse_package_str(@_);
$ans = $cat . "/" . $p ;
return $ans;
}
sub sanitize_deps {
my ($pkg, $atom, $dref, $verion) = @_;
my @dependencies = @{ $dref };
my $prev_key = undef;
my %revs = ();
if ($dep_ignore_versions) {
for (@dependencies) {
chomp($_);
if (length($_) > 0) {
if ($_ =~ m/\[\s+\d\]/) {
my $pkgs = $revs{$prev_key};
push(@$pkgs, $_);
} else {
$prev_key = substr $_, 0, length($_)-1
unless substr($_, -1) cmp ":";
my ($pkg, $p, $v) = parse_package_str($prev_key);
$revs{$v} = [];
$prev_key = $v;
}
}
}
# revs dictionary contains as keys versions of the package
# and as values an array ref with list of dependencies + itself
# Ex:
# %revs = (
# '1.8.5' => [
# ' [ 0] dev-lang/spidermonkey-1.8.5-r9 ',
# ' [ 1] dev-libs/nspr-4.22 ',
# ' [ 1] sys-libs/readline-7.0_p5 ',
# ' [ 1] dev-libs/jemalloc-3.6.0 ',
# ' [ 1] dev-lang/python-2.7.16 ',
# ' [ 1] app-arch/zip-3.0-r3 ',
# ' [ 1] virtual/pkgconfig-1 ',
# ' [ 1] app-portage/elt-patches-20170815 ',
# ' [ 1] sys-devel/automake-1.16.1-r1 ',
# ' [ 1] sys-devel/automake-1.15.1-r2 ',
# ' [ 1] sys-devel/autoconf-2.13-r1 ',
# ' [ 1] sys-devel/libtool-2.4.6-r3 '
# ],
# )
$v = parse_package_version($pkg);
if (length($v) > 0 && defined %revs{$v}) {
$version = $v;
} else {
@versions = sort { &Sort::Versions::versioncmp($a,$b) } keys %revs;
$version = $versions[scalar(@versions)-1];
}
$ref = $revs{$version};
loud("For package $pkg use version $version with deps: ", @$ref)
if $verbose;
@dependencies = uniq(
grep {$_}
map {
$_ =~ s/\[.*\]|\s//g;
$_ =~ s/[:]$//g; # drop : at the end
&abs_atom($_) if $atom;
$_
}
@$ref
);
} else {
# Merge all versions dependencies as previous implementation.
#
# If an unversioned atom is given, equery returns results for all versions in the portage tree
# leading to duplicates. The sanest thing to do is dedup the list. This gives the superset of all
# possible dependencies, which isn't perfectly accurate but should be good enough. For completely
@@ -78,14 +304,39 @@ sub package_deps {
@dependencies = uniq(
sort
grep {$_}
map { $_ =~ s/\[.*\]|\s//g; &atom($_) if $atom; $_ }
map {
$_ =~ s/\[.*\]|\s//g;
$_ =~ s/[:]$//g; # drop : at the end
&abs_atom($_) if $atom;
$_
}
@dependencies
);
$cache{$cache_key} = \@dependencies;
}
return @{ $cache{$cache_key} };
return sort(@dependencies);
}
sub package_deps {
my $package = shift;
my $depth = shift // 1; # defaults to 1 level of depthness of the tree
my $atom = shift // 0;
# Since we expect this sub to be called multiple times with the same arguments, cache the results
$cache_key = "${package}:${depth}:${atom}";
if ( !exists $package_dep_cache{$cache_key} ) {
my @dependencies =
qx/equery -C -q g --depth=$depth '$package'/; #depth=0 it's all
chomp @dependencies;
# Get dependencies only of major version
@dependencies = sanitize_deps($package, $atom, \@dependencies);
$package_dep_cache{$cache_key} = \@dependencies;
}
return @{ $package_dep_cache{$cache_key} };
}
#Input: nothing
@@ -112,18 +363,26 @@ sub calculate_missing {
my @dependencies = package_deps( $package, $depth, 1 );
if ($prune_virtuals) {
say "[$package] Pruning dependencies of virtual packages";
my %install_dependencies = map { $_ => 1 } @dependencies;
# Look for any virtuals and remove its immediate dependencies to avoid
# installing multiple conflicting packages one by one
my @virtual_deps;
my @virtual_deps = ();
for my $dep (@dependencies) {
push( @virtual_deps, package_deps( $dep, 1, 1 ) )
if ( $dep =~ /^virtual\// );
if ( $dep =~ /^virtual\// ) {
my @child_deps = package_deps( $dep, 1, 1 );
push( @virtual_deps, @child_deps );
}
}
# Deduplicate the list
@virtual_deps = uniq(@virtual_deps);
# Prune the dependencies of the virtual packages from the dependencies list
for my $dep (@virtual_deps) {
$install_dependencies{$dep} = 0 if ( $dep !~ /^virtual\// );
if ( $dep !~ /^virtual\// ) {
$install_dependencies{$dep} = 0;
}
}
@dependencies = grep { $install_dependencies{$_} } @dependencies;
}
@@ -137,22 +396,124 @@ sub calculate_missing {
my @to_install = grep( defined $available_packs{$_},
uniq( grep( !defined $installed_packs{$_}, @dependencies ) ) );
@to_install = grep {length} @to_install;
# Strip out the target package from the dependency list
@to_install = grep { to_atom($_) ne to_atom($package) } @to_install;
say "[$package] packages that will be installed with equo: @to_install"
if @to_install > 0;
return @to_install;
}
sub portage_perms {
my $dir = shift;
_system("chown -R portage:portage $dir");
_system("chmod -R ug+w,a+rX $dir");
}
# Input : complete gentoo package (sys-fs/foobarfs-1.9.2)
# Output: atom form (sys-fs/foobarfs)
sub atom { s/-[0-9]{1,}.*$//; }
sub abs_atom { atom; s/^(\<|\>|=)+// }
# Same again as a function
sub to_atom { my $p = shift; local $_ = $p; atom; return $_; }
sub to_abs_atom { my $p = shift; local $_ = $p; abs_atom; return $_; }
# Input: Array
# Output: array with unique elements
sub uniq {
keys %{ { map { $_ => 1 } @_ } };
}
# Detect useflags defined as [-alsa,avahi] in atom,
# and fill $hash within the $target sub-hash
sub detect_useflags {
my ( $target, $packages ) = @_;
my @packs = @{$packages};
for my $i ( 0 .. $#packs ) {
if ( $packages->[$i] =~ /\[(.*?)\]/ ) {
my $flags = $1;
$packages->[$i] =~ s/\[.*?\]//g;
$per_package_useflags->{$target}->[$i] =
[ +split( /,/, $flags ) ];
}
}
}
sub compile_packs {
my ( $target, @packages ) = @_;
my $extra_arg;
my $compiled = {};
$extra_arg = "-B" if $target eq "injected_targets";
my $package_counter = 0;
for my $pack (@packages) {
my $tmp_rt;
say "\n" x 2, "==== Compiling $pack ====", "\n" x 2;
if ( defined $per_package_useflags->{$target}->[$package_counter]
and @{ $per_package_useflags->{$target}->[$package_counter] }
> 0 )
{
say "USEFLAGS: "
. join( " ",
@{ $per_package_useflags->{$target}->[$package_counter] } );
$tmp_rt = _system(
"USE=\""
. join(
" ",
@{ $per_package_useflags->{$target}->[$package_counter]
}
)
. "\" emerge $emerge_defaults_args -j $jobs $extra_arg '$pack'"
);
}
else {
$tmp_rt =
_system(
"emerge $emerge_defaults_args -j $jobs $extra_arg '$pack'");
}
$package_counter++;
$compiled->{$pack} = $tmp_rt;
}
return $compiled;
}
sub fetch_portage_from_git {
my ( $url, $srv, $branch ) = @_;
$url = substr($url, 0, length($url)-1) unless substr($url, -1) cmp "/";
my $uri = URI->new($url);
my $base = ( $uri->path_segments )[-1];
say "==== Fetching $srv Portage for branch $branch ====";
if ( $srv and $srv eq "gitlab" ) {
$url .= "/-/archive/$branch/$base-$branch.tar.gz";
} else {
$url .= "/archive/$branch.tar.gz";
}
_system( "wget -O /tmp/portage.tar.gz $url" );
_system( "mkdir /tmp/portage ; tar xzf /tmp/portage.tar.gz -C /tmp/portage" );
# Avoid to remove /usr/portage for use case where I have already
# files under /usr/portage/distfiles or /usr/portage/packages to use.
my @excluded_dirs = (
"'distfiles'",
"'packages'"
);
my $rsync_opts = "-a --delete --delete-during --recursive -d -A -H";
$rsync_opts .= " --exclude $_" foreach @excluded_dirs;
_system( "rsync $rsync_opts /tmp/portage/$base-$branch/ /usr/portage/" );
_system( "rm -rf /tmp/portage " );
}
sub help {
say "-> You should feed me with something", "", "Examples:", "",
"\t$0 app-text/tree", "\t$0 plasma-meta --layman kde", "",
@@ -161,10 +522,22 @@ sub help {
"You can supply multiple overlays as well: $0 plasma-meta --layman kde plab",
"The documentation is available at https://github.com/Sabayon/devkit",
"";
exit 0;
}
say "****************************************************";
my $per_package_useflags;
my @packages = @ARGV;
my @injected_packages =
$build_injected_args ? split( / /, $build_injected_args ) : ();
my @parsed_overlays =
grep { $_ !~ /gentoo/i } parse_overlays( @packages, @injected_packages );
say "Detected overlays: @parsed_overlays" if @parsed_overlays;
@overlays = uniq( @overlays, @parsed_overlays );
if ( @overlays > 0 ) {
say "Overlay(s) to add";
foreach my $overlay (@overlays) {
@@ -172,31 +545,57 @@ if ( @overlays > 0 ) {
}
}
say "[*] Installing:";
say "[*] Compiling:";
say "\t* " . $_ for @ARGV;
say "[*] Syncing configurations files, Layman and Portage";
loud "Setup phase start";
if ($pretend) {
say "[*] PRETEND enabled, no real action will be performed.";
say " Bear in mind that in such way the list of packages";
say " that emerge will try to compile will be bigger";
$equo_install_args .= " -p";
$emerge_defaults_args .= " -p";
}
# Syncronizing portage configuration and adding overlays
system("echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen"); #be sure about that.
system("cd /etc/portage/;git checkout master; git stash; git pull");
if ( `uname -m` eq "x86_64\n" ) {
system(
"cd /etc/portage/;rm -rfv make.conf;ln -s make.conf.amd64 make.conf");
# If defined, fetch a remote /etc/portage
if ( $remote_conf_portdir ne "" ) {
_system("rm -rf /etc/portage");
_system("git clone $remote_conf_portdir /etc/portage");
portage_perms('/etc/portage');
}
else {
_system("cd /etc/portage/;git checkout master; git stash; git pull");
}
system("echo 'y' | layman -f -a $_") for @overlays;
# If defined, fetch a remote /usr/portage
if ( $remote_portdir ne "" ) {
_system("rm -rf /usr/portage");
_system("git clone $remote_portdir /usr/portage");
}
_system("mkdir /var/lib/layman") if ( !-d "/var/lib/layman" );
_system("touch /var/lib/layman/make.conf && layman-updater -R")
if ( !-e "/var/lib/layman/make.conf" );
_system("echo 'y' | layman -f -a $_") for @overlays;
my $reponame = "LocalOverlay";
# Setting up a local overlay if doesn't exists
_system(
"rm -rf /usr/local/portage;cp -rf /usr/local/local_portage /usr/local/portage"
) if ( -d "/usr/local/local_portage" );
if ( !-f "/usr/local/portage/profiles/repo_name" ) {
system("mkdir -p /usr/local/portage/{metadata,profiles}");
system("echo 'LocalOverlay' > /usr/local/portage/profiles/repo_name");
system("echo 'masters = gentoo' > /usr/local/portage/metadata/layout.conf");
system("chown -R portage:portage /usr/local/portage");
_system("mkdir -p /usr/local/portage/{metadata,profiles}");
_system("echo 'LocalOverlay' > /usr/local/portage/profiles/repo_name");
_system(
"echo 'masters = gentoo' > /usr/local/portage/metadata/layout.conf");
}
else {
open FILE, "</usr/local/portage/profiles/repo_name";
@@ -205,6 +604,7 @@ else {
chomp(@FILE);
$reponame = $FILE[0];
}
portage_perms('/usr/local/portage');
qx{
echo '[$reponame]
@@ -214,54 +614,163 @@ priority=9999
auto-sync = no' > /etc/portage/repos.conf/local.conf
}; # Declaring the repo and giving priority
system("mkdir -p /usr/portage/distfiles/git3-src");
if ( $remote_overlay and $remote_overlay ne "" ) {
add_portage_repository($_) for ( split( / /, $remote_overlay ) );
}
if ( $remove_layman_overlay and $remove_layman_overlay ne "" ) {
say "===== Removing overlays: $remove_layman_overlay =====";
_system("layman -d $_") for ( split( / /, $remove_layman_overlay ) );
}
if ( $remove_remote_overlay and $remove_remote_overlay ne "" ) {
say "===== Removing overlays: $remove_remote_overlay =====";
_system( "rm -rfv /etc/portage/" . $_ . ".conf" )
for ( split( / /, $remote_overlay ) );
}
_system("mkdir -p /usr/portage/distfiles/git3-src");
portage_perms('/usr/portage');
unless ( $skip_portage_sync == 1 ) {
# sync portage and overlays
system("layman -S");
if ( $webrsync == 1 ) {
system("emerge-webrsync");
_system("layman -S");
if ( $portage_git_url ne "" and $portage_git_branch ne "" ) {
fetch_portage_from_git( $portage_git_url, $portage_git_service,
$portage_git_branch );
}
elsif ( $webrsync == 1 ) {
_system("emerge-webrsync");
}
else {
system("emerge --sync");
_system("emerge --sync --quiet");
}
}
# preparing for MOAR automation
qx|eselect profile set $profile|;
qx{ls /usr/portage/licenses -1 | xargs -0 > /etc/entropy/packages/license.accept}
; #HAHA
say "Setting new profile to $profile" if defined $profile;
_system("eselect profile set $profile") if defined $profile;
_system("eselect profile list") if defined $profile;
if ( $use_equo && $entropy_repository eq "weekly" ) {
qx|equo repo disable sabayonlinux.org|;
qx|equo repo enable sabayon-weekly|;
_system("equo repo disable sabayonlinux.org");
_system("equo repo enable sabayon-weekly");
}
elsif ( $use_equo && $entropy_repository eq "testing" ) {
qx|equo repo disable sabayon-weekly|;
qx|equo repo enable sabayonlinux.org|;
qx|equo repo enable sabayon-limbo|;
_system("equo repo disable sabayon-weekly");
_system("equo repo enable sabayonlinux.org");
_system("equo repo enable sabayon-limbo");
}
if ($use_equo) {
say "Devkit version:";
_system("equo s -vq app-misc/sabayon-devkit");
_system("equo repo mirrorsort sabayonlinux.org") if $equo_mirrorsort;
# Try to use last enman version
_system("equo up && equo i enman --relaxed");
_system("enman list --installed -q");
my $enman_list_output = qx|enman list --installed -q|;
chomp($enman_list_output);
my @installed_enman_repos;
if ( $enman_list_output eq "No repositories were installed with enman" ) {
@installed_enman_repos = ();
}
else {
@installed_enman_repos = split( / /, $enman_list_output );
}
if ( $enman_repositories and $enman_repositories ne "" ) {
my @enman_toadd = split( / /, $enman_repositories );
safe_call("enman add $_") for @enman_toadd;
say "==================================";
my @enman_toadd;
if ( index( $enman_repositories, "\n" ) != -1 ) {
@enman_toadd = split( /\n/, $enman_repositories );
}
else {
@enman_toadd = split( / /, $enman_repositories );
}
system("enman add $repository_name")
if ( $enman_add_self and $repository_name and $repository_name ne "" );
system("equo repo mirrorsort sabayonlinux.org") if $equo_mirrorsort;
system("equo up && equo u");
for my $enman_add (@enman_toadd) {
say "Check enman " . $enman_add;
if ( !grep ( $enman_add, @installed_enman_repos ) ) {
say "Try to install " . $enman_add;
_system("enman add $enman_add");
}
else {
say "Already present: " . $enman_add;
}
}
say "==================================";
}
system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
if ( $remove_enman_repositories and $remove_enman_repositories ne "" ) {
say "==================================";
my @enman_toremove;
if ( index( $remove_enman_repositories, "\n" ) != -1 ) {
@enman_toremove = split( /\n/, $remove_enman_repositories );
}
else {
@enman_toremove = split( / /, $remove_enman_repositories );
}
qx|echo 'ACCEPT_LICENSE="*"' >> /etc/portage/make.conf|; #just plain evil
for my $enman_remove (@enman_toremove) {
if ( grep ( $enman_remove, @installed_enman_repos ) ) {
say "Try to remove enamn repository " . $enman_remove;
_system("enman remove $enman_remove");
}
else {
say "Enman repository $enman_remove is not present.";
}
}
say "==================================";
}
my @packages = @ARGV;
_system("enman add $repository_name")
if ($enman_add_self
and $repository_name
and $repository_name ne "" );
_system("equo up && equo u");
}
_system("cp -rf $make_conf /etc/portage/make.conf") if $make_conf;
if (@injected_packages) {
say "[*] Injected installs:";
say "\t* " . $_ for @injected_packages;
}
# Allow users to specify atoms as: media-tv/kodi[-alsa,avahi]
if ($emerge_split_install)
{ # For targets this will be available only if split_install is enabled
detect_useflags( "targets", \@packages );
}
else {
map { $_ =~ s/\[.*?\]//g; $_; }
@packages
; # Clean up [] if user didn't specified split_install, but specified a useflag combination
}
detect_useflags( "injected_targets", \@injected_packages );
if ($use_equo) {
# best effort mask
if ($equo_masks) {
append_to_file( "/etc/entropy/packages/package.mask", $_ )
for ( split( / /, $equo_masks ) );
}
# best effort unmask
if ($equo_unmasks) {
append_to_file( "/etc/entropy/packages/package.unmask", $_ )
for ( split( / /, $equo_unmasks ) );
}
my @packages_deps;
my @Installed_Packages = qx/equo q list installed --quiet/;
my @Available_Packages = available_packages();
@@ -291,52 +800,113 @@ if ($use_equo) {
say "", "[install] Those dependencies will be installed with equo :",
@packages_deps, "";
if ($equo_split_install) {
safe_call("equo i --bdeps $_")
_system("equo i $equo_install_args --bdeps '$_'")
for ( @packages_deps, @equo_install )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
if ( @equo_remove > 0 ) {
system("equo rm --nodeps $_") for (@equo_remove);
if ( @equo_remove > 0 and !$pretend ) {
say "Removing with equo: @equo_remove";
_system("equo rm --nodeps '$_'") for (@equo_remove);
}
}
else {
safe_call("equo i --bdeps @packages_deps @equo_install")
if ( @packages_deps > 0 or @equo_install > 0 )
my @p = map {"'$_'"} ( @packages_deps, @equo_install );
my @r = map {"'$_'"} @equo_remove;
_system("equo i $equo_install_args --bdeps @p")
if ( @p > 0 )
; ## bail out here, if installs fails. emerge will compile a LOT of stuff
system("equo rm --nodeps @equo_remove") if ( @equo_remove > 0 );
_system("equo rm --nodeps @r") if ( @r > 0 );
}
}
say "*** Ready to compile, finger crossed ***";
loud "Pre-compilation phase start";
system("emerge --info")
_system("emerge --info")
; #always give detailed information about the building environment, helpful to debug
my $rt;
_system("equo repo list")
; #always give list of repo installed to for reproduce conflicts install issues.
if ($emerge_split_install) {
for my $pack (@packages) {
my $tmp_rt = system("emerge $emerge_defaults_args -j $jobs $pack");
# $rt=$tmp_rt if ($? == -1 or $? & 127 or !$rt); # if one fails, the build should be considered failed!
if ( $emerge_remove and $emerge_remove ne "" ) {
say "Removing with emerge: $emerge_remove";
_system("emerge -C '$_'") for split( / /, $emerge_remove );
}
$rt = 0; #consider the build good anyway, like a "keep-going"
hook_script("./pre-script");
hook_script("/pre-script");
loud "Compilation phase start";
my $return = 0;
if ($emerge_split_install) {
my $res = compile_packs( "targets", @packages );
loud "Compilation summary";
foreach my $k ( keys %{$res} ) {
my $c = $res->{$k} >> 8;
if ( $c != 0 ) {
say "$k : build failed ( Exit: $c )";
$return = 1 unless $keep_going;
}
else {
$rt = system("emerge $emerge_defaults_args -j $jobs @packages");
say "$k : build succeeded";
}
}
}
else {
my @p = map {"'$_'"} @packages;
my $rt = _system("emerge $emerge_defaults_args -j $jobs @p");
$return = $rt >> 8;
}
my $return = $rt >> 8;
if ( @injected_packages > 0 ) {
my $res = compile_packs( "injected_targets", @injected_packages );
loud "Compilation summary for injected_targets";
foreach my $k ( keys %{$res} ) {
my $c = $res->{$k} >> 8;
if ( $c != 0 ) {
say "$k : build failed ( Exit: $c )";
$return = 1 unless $keep_going;
}
else {
say "$k : build succeeded";
}
}
}
if ($preserved_rebuild) {
loud "Compilation phase end (Exit: $return)";
system("emerge -j $jobs --buildpkg \@preserved-rebuild");
system("revdep-rebuild");
hook_script("./post-script");
hook_script("/post-script");
if ( $preserved_rebuild and !$pretend ) {
_system("emerge -j $jobs --buildpkg \@preserved-rebuild");
_system("revdep-rebuild");
}
if ( $qualityassurance_checks == 1 ) {
loud "Quality assurance checks";
foreach my $pn ( map { abs_atom; $_ } ( @packages, @injected_packages ) )
{
say ">> Running repoman on $pn";
_system(
"pushd \$(dirname \$(equery which '$pn' 2>/dev/null)); repoman; popd"
);
$pn =~ s/\:\:.*//g;
say ">> Detecting missing dependencies for $pn";
_system("dynlink-scanner '$pn'");
_system("depcheck '$pn'");
}
}
if ( $obsoleted and $target_overlay ) {
loud "Obsoletes detection";
_system("sabayon-detectobsolete --overlay ${target_overlay}");
}
# Copy files to artifacts folder
system(
"mkdir -p $artifacts_folder;cp -rfv /usr/portage/packages $artifacts_folder"
) if ( $artifacts_folder and !$return );
) if ( $artifacts_folder and !$return and !$pretend );
exit($return);
+303
View File
@@ -0,0 +1,303 @@
#!/bin/bash
# PODNAME: depcheck
#
# Copyright (c) 2014 Michael Palimaka <kensington@gentoo.org>
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# A tool to report both undeclared and potentially-unused runtime dependencies.
#
# Depends on app-misc/pax-utils, app-portage/portage-utils and
# sys-apps/gentoo-functions.
DEBUG=FALSE
IGNORE_DEPS=( "sys-libs/glibc" "sys-devel/gcc" )
IGNORE_LINKS=( "/lib64/libgcc_s.so.1" )
PKG_DIR="/var/db/pkg/"
. /lib/gentoo/functions.sh
bold() {
echo $@
return
local bold=$(tput bold)
local normal=$(tput sgr0)
echo "${bold}${@}${normal}"
}
debug() {
if [ $DEBUG = TRUE ]; then
# write to stderr so as not to interfere with function returns
echo "$@" 1>&2
fi
}
# app-foo/bar-1.2.3-r1 -> app-foo/bar
remove_atom_version() {
local atom=`qatom "${1}" | cut -d " " -f 1-2 | tr " " /`
echo $atom
}
virtualcheck() {
debug Checking if ${libowner_pn} is provided by a virtual
for virtual in $(qdepends --nocolor --name-only --${1} --query ${libowner_pn} | grep ^virtual/)
do
debug Checking if ${virtual} is in dependencies
local isvirtualdep=$(qdepends --${1} ${atom} | grep ${virtual})
if [ $? -eq 0 ]; then
used_virtuals+=( ${virtual} )
continue 2
fi
done
if [ "${1}" = "depend" ]; then
eerror "${obj} links to ${link}"
fi
eindent
eerror Missing ${1^^} on $(bold ${libowner_pn})
eoutdent
errors=1
}
check_atom() {
local errors=0
local atom=$1
local checked=()
local rdepends=()
local used_virtuals=()
local objects=`qlist -qo ${atom}`
if [ ! "${objects}" ]; then
einfo ${atom} does not have any objects installed, skipping...
echo
return
fi
if [ -z "${INSIDE_PORTAGE}" ]; then
einfo Checking ${atom} for undeclared dependencies
eindent
fi
local obj
for obj in $objects
do
debug "Checking ${obj}"
readelf -h ${obj} > /dev/null 2>&1
# can it have stuff linked to it?
if [ $? -ne 0 ]; then
debug "It can't have links, skipping"
continue
fi
local elf=`scanelf --format "#f%n" --nobanner --use-ldpath ${obj} 2>&1`
local links=`echo ${elf} | tr "," " "`
# get a list of everything that it's linked to
local link
for link in $links
do
local ignore
for ignore in "${IGNORE_LINKS[@]}"; do
if [ "${ignore}" = "${link}" ]; then
debug "Ignoring ${link} due to blacklist"
continue 2
fi
done
# only check a library once per atom for performance reasons
local check
for check in "${checked[@]}"; do
if [ "${check}" = "${link}" ]; then
debug "Already checked ${link} for this atom, skipping"
continue 2
fi
done
checked=( "${checked[@]}" "${link}" )
debug "Found ${link}"
local libowner=`qfile -vqC ${link} | uniq`
if [ ! "${libowner}" ]; then
ewarn "Warning: installed file ${obj} is linked to ${link} which is not owned by any installed atom."
continue
fi
debug "Owning package for ${link} is ${libowner}"
local libowner_pn=$(remove_atom_version ${libowner})
local my_pn=$(remove_atom_version ${atom})
rdepends+=( "${libowner_pn}" )
if [ "${libowner_pn}" = "${my_pn}" ]; then
debug "Owning package is self, ignoring"
continue
fi
local ignorelib
for ignorelib in "${IGNORE_DEPS[@]}"
do
if [ "${libowner_pn}" = "${ignorelib}" ]; then
debug "Ignoring objects belonging to ${ignorelib}"
continue 2
fi
done
debug "Checking if ${libowner_pn} is in the [R]DEPEND list of ${atom}"
local isdep
isdep=`qdepends -d ${atom} | grep ${libowner_pn}`
if [ $? -ne 0 ]; then
virtualcheck depend
fi
local isrdep
isrdep=`qdepends -r ${atom} | grep ${libowner_pn}`
if [ $? -ne 0 ]; then
virtualcheck rdepend
fi
done
done
local ebuild_rdepends=()
for rdepend in $(qdepends --nocolor --quiet --rdepend ${atom} | sed -e "s/\[[^]]*\]//g" | cut -d : -f 2-)
do
if [[ ${rdepend} = !* ]] ; then
debug Skipping blocker: ${rdepend}
continue
elif [[ ${rdepend} = virtual/* ]] ; then
for virtual in "${used_virtuals[@]}"
do
if [[ ${virtual} == $(remove_atom_version ${rdepend}) ]]; then
debug Skipping virtual: ${rdepend}
continue 2
fi
done
fi
ebuild_rdepends+=( $(remove_atom_version $rdepend) )
done
debug "Ebuild RDEPENDS: ${ebuild_rdepends[@]}"
debug "Linked RDEPENDS: ${rdepends[@]}"
local suspect_rdepends=$(comm -13 <(echo ${rdepends[@]} | sed 's/ /\n/g' | sort -u) <(echo ${ebuild_rdepends[@]} | sed 's/ /\n/g' | sort -u))
if [ "${suspect_rdepends}" ]; then
ewarn "Suspect RDEPEND: $(bold ${suspect_rdepends})"
fi
if [ -z "${INSIDE_PORTAGE}" ]; then
eoutdent
if [ -n "${CAT}" ]; then
echo
fi
fi
return $errors
}
check_package() {
local package=$1
local atoms=`qlist -IcCS ${package} | tr ' ' '-' | cut -d : -f1`
debug Package ${package} own atoms: ${atoms}
if [ ! "${atoms}" ]; then
eerror ERROR: ${package} is not a valid atom
exit 1
fi
for atom in ${atoms}; do
check_atom ${atom}
done
}
check_category() {
local errors=0
for package in `ls "${PKG_DIR}/${1}"`; do
check_package "${1}/${package}"
if [ $? -ne 0 ]; then
errors=1
fi
done;
return $errors
}
BINNAME=`basename ${0}`
if [ -z $1 ]; then
echo "Checks emerged package(s) for undeclared depedencies"
echo
echo "Usage: ${BINNAME} [ atom | -c category | -a ]"
echo
echo "Examples:"
echo "Check a single package: ${BINNAME} app-foo/bar-1.2.3"
echo "Check a category: ${BINNAME} -c app-foo"
echo "Check everything: ${BINNAME} -a"
exit 1
fi
# check a particular category
if [ "$1" = "-c" ]; then
CAT=$2
if [ ! -d "${PKG_DIR}/${CAT}" ]; then
eerror ERROR: No packages from the category ${CAT} have been emerged yet
exit 1
fi
check_category $CAT
# check everything
elif [ "$1" = "-a" ]; then
for category in `ls ${PKG_DIR}`; do
check_category $category
done;
else
check_package $1
fi
if [ $DEBUG = TRUE ]; then
if [ $? -eq 0 ]; then
einfo Checking complete, no errors found
else
eerror Checking complete, errors found
fi
fi
+50
View File
@@ -0,0 +1,50 @@
#!/bin/bash
# Maciej Mrozowski <reavertm@gentoo.org>
# Returns colon separated list of linking dependencies
get_link_deps()
{
KEY=
for dep in `scanelf --use-ldpath -yBF '%f %n' "$1"`; do
if [[ -z $KEY ]]; then
KEY="$dep"
continue
fi
echo $dep
done
}
# Print linking deps for given executable or shared object in alphabetical order.
# Also try to dlopen shared objects in order to detect missing/broken dependencies.
if [[ "$1" = --linking-deps ]]; then
# Sanity check, file-5.12 is broken, bail out early
if [[ `file --version | grep --color=never file- | cut -d'-' -f2` == '5.12' ]]; then
echo "file-5.12 is broken, bailing out"
exit 1
fi
mime=`file -b --mime-type "$2"`
if [[ "$mime" == 'application/x-executable' ]] || [[ "${mime}" == 'application/x-sharedlib' ]]; then
LINK=`get_link_deps "$2"`
[[ "$mime" == 'application/x-sharedlib' ]] && /usr/bin/try_dlopen "$2"
[[ -n $LINK ]] && echo -e ${LINK//,/\\n} | sort -u
exit 0
fi
exit 1
fi
[[ -z $* ]] && echo "usage: `basename $0` <package>" && exit 0
# Check whether package is installed
if ! portageq has_version $ROOT/ $1; then
echo "$1 is not installed"
exit 1
fi
# For each installed slot
for cpv in `portageq match $ROOT/ $1`; do
echo "Processing $cpv"
# For each file that belongs to package
# run dynlink-scanner --linking-deps <file> to obtain its linking dependencies
# Assign all linking deps to packages and print package names
qfile -vR $ROOT `portageq contents $ROOT/ $cpv | xargs -r -L 1 "$0" --linking-deps` | cut -f1 -d' ' | sort -u
done
+14
View File
@@ -1,4 +1,18 @@
#!/bin/bash
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
PACKAGES=()
bin=$1
+465
View File
@@ -0,0 +1,465 @@
#!/bin/bash
# Authors: Sabayon Team 2019
set -e
# Accepted values: x86_64, armv7l
export SAB_ARCH="${SAB_ARCH:-}"
export DRY_RUN=${DRY_RUN:-0}
export DEBUG="${DEBUG:-}"
export FORCE="${FORCE:-0}"
export USE_EQUO="${USE_EQUO:-1}"
declare -a MANUALLY_REMOVED_LINKS
declare -a BROKEN_LINKS2REMOVE
log() {
local with_dashes=$1
shift || true
[ "$with_dashes" != 1 ] || \
echo "==============================================================="
echo "$@"
[ "$with_dashes" != 1 ] || \
echo "==============================================================="
}
summary() {
local msg="SAB_ARCH = ${SAB_ARCH}
EXAMINED_LIBDIRS = ${EXAMINED_LIBDIRS}
DRY_RUN = ${DRY_RUN}
USE_EQUO = ${USE_EQUO}
FORCE = ${FORCE}"
log 1 "$msg"
}
check_arch() {
if [ -z "${SAB_ARCH}" ] ; then
SAB_ARCH=$(uname -m)
fi
[[ "${SAB_ARCH}" != "x86_64" && "${SAB_ARCH}" != "armv7l" ]] && {
log 1 "Unsupported arch ${SAB_ARCH}."
exit 1
}
export SAB_ARCH
}
search_pkg() {
local basename=$1
# passed by reference
local -n p="$2"
local -n libdir="$3"
local lib="$4"
local l=""
local ll=""
# Try to search for package
if [ "${USE_EQUO}" = "0" ] ; then
p=$(equery -N -q -C belongs ${lib}/$basename --early-out || true)
else
p=$(equo q belongs ${lib}/${basename} -q || true)
fi
if [ -z "$p" ] ; then
for l in "/usr/lib64" "/usr/lib32" "/usr/lib" ; do
if [ "$lib" = "$l" ] ; then
ll="${l/\/usr\///}"
break
fi
done
if [ -n "${ll}" ] ; then
if [ "${USE_EQUO}" = "0" ] ; then
p=$(equery -N -q -C belongs ${ll}/$basename --early-out || true)
else
p=$(equo q belongs ${ll}/${basename} -q || true)
fi
fi
fi
if [ -z "$p" ] ; then
libdir=""
fi
}
detect_libs_dir() {
local libs=""
if [ -n "$SCANDIR" ] ; then
libs=$SCANDIR
else
if [ "${SAB_ARCH}" = "x86_64" ] ; then
if [ -d "/usr/lib32" ] ; then
libs="/usr/lib32 /lib32"
fi
if [ -d "/usr/lib64" ] ; then
libs="$libs /usr/lib64 /lib64"
fi
if [ -d "/usr/lib" ] ; then
libs="$libs /usr/lib /lib"
fi
else
if [ -d "/usr/lib" ] ; then
libs="/usr/lib /lib"
fi
fi
if [ -z "$libs" ] ; then
log 0 "Error on detect libraries directories."
exit 1
fi
fi
EXAMINED_LIBDIRS=$libs
export EXAMINED_LIBDIRS
}
examine_libs() {
local lib=""
local file=""
local broken_files=""
log 1 "The exam could be long sorry for the wait."
for lib in ${EXAMINED_LIBDIRS} ; do
broken_files=""
log 1 "Checking directory $lib..."
broken_files=$(find $lib -type l -and -xtype l -and -name *.so* -or -name *.a -and -type l -and -xtype l 2>/dev/null || true )
[ -z "$DEBUG" ] || {
find $lib -type l -and -xtype l -and -name *.so* -or -name *.a -and -type l -and -xtype l || true
}
for file in ${broken_files} ; do
examine_file "${file}" "${lib}"
done
done
}
examine_file() {
local f=$1
local res=""
local libdir=$2
local is_present_pkg=1
local pkg=""
[ -z "$DEBUG" ] || log 1 "Analyze file $f"
local base=$(basename $1)
local targetlink=$(readlink $f)
local link2remove=false
local link2fix=false
local newlibdir=""
local tmp=""
local current_link=""
log 1 "Broken link $f => $targetlink"
# Check if file is without revision (es. libudev.so)
res=$(perl -e "if ('$base' =~ /(.so|.a$)/) { print '1' }")
if [ -n "$res" ] ; then
#
#echo "BASE = $base"
search_pkg "$base" pkg newlibdir "$lib"
if [ -z "$pkg" ] ; then
MANUALLY_REMOVED_LINKS+=( "$f" )
return
else
if [ -n "$newlibdir" ] ; then
log 0 "Link $base available under $newlibdir. I remove it."
link2remove=true
fi
fi
if [ "${USE_EQUO}" = "0" ] ; then
res=$(qlist -IC $pkg 2>/dev/null | grep $f | wc -l)
else
res=$(equo q files $pkg -q | grep $f | wc -l)
fi
if [ "$res" = 1 ] ; then
link2fix=true
echo "Link $f related to existing package. Try to reinstall $pkg."
else
MANUALLY_REMOVED_LINKS+=( "$f" )
fi
log 0 "Link $f of the package $pkg"
else
# Check if file has only one revision number (es. libudev.so.0)
res=$(perl -e "if ('$base' =~ /(.so[.][\d]+$)/) { print '1' }")
if [ -n "$res" ] ; then
search_pkg "$base" pkg newlibdir "$lib"
if [ -z "$pkg" ] ; then
# Try to search package with .so
base=$(echo "$base" | awk 'match($0, /.so/) { print substr($0, 0, RSTART+2) }')
search_pkg "$base" pkg newlibdir "$lib"
if [ -z "$pkg" ] ; then
log 0 "No package found for link $f."
MANUALLY_REMOVED_LINKS+=( "$f" )
return
fi
if [ -n "$newlibdir" ] ; then
log 0 "Link $base available under $newlibdir. I remove it."
link2remove=true
else
# POST: we have a broken link or old link
current_link=$(readlink $lib/$base)
log 0 "Link $f related to package $pkg (with an updated version $current_link). I remove it."
link2remove=true
fi
else
log 0 "Link $f of the package $pkg"
if [ -n "$newlibdir" ] ; then
log 0 "Link $base available under $newlibdir. I remove it."
link2remove=true
else
# Check new
if [ "${USE_EQUO}" = "0" ] ; then
res=$(qlist -IC $pkg 2>/dev/null | grep $f | wc -l)
else
res=$(equo q files $pkg -q | grep $f | wc -l)
fi
if [ "$res" = 1 ] ; then
link2fix=true
echo "Link $f related to existing package. Try to reinstall $pkg."
else
MANUALLY_REMOVED_LINKS+=( "$f" )
fi
fi
fi
else
# Check if file has only one revision number (es. libudev.so.0.63)
res=$(perl -e "if ('$base' =~ /(.so[.][\d]+[.][\d]+$)/) { print '1' }")
if [ -n "$res" ] ; then
search_pkg "$base" pkg newlibdir "$lib"
if [ -z "$pkg" ] ; then
base=$(echo "$base" | awk 'match($0, /.so[.][0-9]+/) { print substr($0, 0, RSTART+RLENGTH-1) }')
search_pkg "$base" pkg newlibdir "$lib"
if [ -z "$pkg" ] ; then
log 0 "No package found for link $f."
MANUALLY_REMOVED_LINKS+=( "$f" )
return
fi
if [ -n "$newlibdir" ] ; then
log 0 "Link $base available under $newlibdir. I remove it."
link2remove=true
else
current_link=$(readlink $lib/$base)
log 0 "Link $f related to package $pkg (with an updated version $current_link). I remove it."
link2remove=true
fi
else
log 0 "Link $f of the package $pkg"
if [ -n "$newlibdir" ] ; then
log 0 "Link $base available under $newlibdir. I remove it."
link2remove=true
else
# Check new
if [ "${USE_EQUO}" = "0" ] ; then
res=$(qlist -IC $pkg 2>/dev/null | grep $f | wc -l)
else
res=$(equo q files $pkg -q | grep $f | wc -l)
fi
if [ "$res" = 1 ] ; then
link2fix=true
echo "Link $f related to existing package. Try to reinstall $pkg."
else
MANUALLY_REMOVED_LINKS+=( "$f" )
fi
fi
fi
else
echo "Link $f not supported".
MANUALLY_REMOVED_LINKS+=( "$f" )
fi
fi
fi
if [ $link2remove = true ] ; then
BROKEN_LINKS2REMOVE+=( "$f" )
fi
}
rm_broken_links() {
for l in ${BROKEN_LINKS2REMOVE[@]} ; do
if [ "$DRY_RUN" = 0 ]; then
rm -vf ${l}
else
echo "rm -vf ${l}"
fi
done
}
print_links2remove() {
for l in ${MANUALLY_REMOVED_LINKS[@]} ; do
if [ "$FORCE" = 1 ] ; then
if [ "$DRY_RUN" = 0 ] ; then
rm -vf ${l}
else
echo "force: rm -vf ${l}"
fi
else
echo "rm -vf ${l}"
fi
done
}
parse_args() {
help_message() {
echo "Sabayon Broken Links analyzer.
Sabayon Team (2019)
$0 [opts]
Available options:
-h|--help This message.
--dry-run Dry run execution.
--force Force remove of the links to remove manually.
--scandir Define a specific directory to analyze
--gentoo Use gentoo tool instead of equo.
-d|--debug Enable debug stuff.
Environment variables:
DRY_RUN To use instead of --dry-run option. Values: 0 or 1.
DEBUG Enable debug output.
USE_EQUO To use instead of --gentoo option.
FORCE To use instead of --force.
"
}
local short_opts="hd"
local long_opts="help dry-run force debug scandir: gentoo"
$(set -- $(getopt -u -q -a -o "$short_opts" -l "$long_opts" -- "$@"))
while [ $# -gt 0 ] ; do
case "$1" in
-h|--help)
help_message
exit 1
;;
-d|--debug)
DEBUG=1
;;
--force)
FORCE=1
;;
--dry-run)
DRY_RUN=1
;;
--scandir)
SCANDIR="$2"
shift
;;
--gentoo)
USE_EQUO=0
;;
--)
;;
*)
echo "Invalid parameter $1."
exit 1
;;
esac
shift
done
unset -f help_message
}
main() {
parse_args "$@"
log 1 "sabayon-brokenlinks: Examine system broken links"
check_arch
detect_libs_dir
summary
if [[ "$(id -u)" != "0" && "${DRY_RUN}" != "1" ]]; then
echo "This script must be run as root" 1>&2
exit 1
fi
parse_args
unset -f parse_args
if [ "${USE_EQUO}" = "0" ] ; then
which equery 2>&1 >/dev/null || {
echo "equery tool is needed. Please install app-portage/gentoolkit."
exit 1
}
which qlist 2>&1 >/dev/null || {
echo "qlist tool is needed. Please install app-portage/portage-utils."
exit 1
}
fi
examine_libs
if [ ${#BROKEN_LINKS2REMOVE[@]} -gt 0 ] ; then
log 1 "Remove Broken Links!"
rm_broken_links
fi
if [ ${#MANUALLY_REMOVED_LINKS[@]} -gt 0 ] ; then
if [ "${FORCE}" = 1 ] ; then
log 1 "Hereinafter, links removed with force:"
else
log 1 "Hereinafter, links to manually remove:"
fi
print_links2remove
fi
echo "All Done."
}
main $@
+42 -18
View File
@@ -1,4 +1,20 @@
#!/bin/bash
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
SAB_WORKSPACE="${SAB_WORKSPACE:-$PWD}"
DOCKER_IMAGE="${DOCKER_IMAGE:-sabayon/builder-amd64}"
@@ -8,8 +24,7 @@ MAKE_CONF="${MAKE_CONF:-$SAB_WORKSPACE/specs/make.conf}"
OUTPUT_DIR="${OUTPUT_DIR:-$SAB_WORKSPACE/portage_artifacts/}"
LOCAL_OVERLAY="${LOCAL_OVERLAY:-$SAB_WORKSPACE/local_overlay}"
ENTROPY_REPOSITORY="${ENTROPY_REPOSITORY:-main}" # Can be weekly, main, testing
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm}"
TEMPDIR=$(mktemp -d)
DOCKER_OPTS="${DOCKER_OPTS:--ti --rm --cap-add=SYS_PTRACE}"
. /sbin/sabayondevkit-functions.sh
@@ -40,25 +55,32 @@ docker_volumes=( -v "$OUTPUT_DIR:/usr/portage/packages" )
[ -z "$EQUO_MIRRORSORT" ] || docker_env+=(-e "EQUO_MIRRORSORT=$EQUO_MIRRORSORT")
[ -z "$WEBRSYNC" ] || docker_env+=(-e "WEBRSYNC=$WEBRSYNC")
[ -z "$ENMAN_REPOSITORIES" ] || docker_env+=(-e "ENMAN_REPOSITORIES=$ENMAN_REPOSITORIES")
[ -z "$REMOVE_ENMAN_REPOSITORIES" ] || docker_env+=(-e "REMOVE_ENMAN_REPOSITORIES=$REMOVE_ENMAN_REPOSITORIES")
[ -z "$DISTFILES" ] || docker_volumes+=(-v "$DISTFILES:/usr/portage/distfiles")
[ -z "$INTERNAL_BUILDER" ] || docker_volumes+=(-v "$INTERNAL_BUILDER:/usr/sbin/builder")
[ -z "$ENTROPY_DOWNLOADED_PACKAGES" ] || docker_volumes+=(-v "$ENTROPY_DOWNLOADED_PACKAGES:/var/lib/entropy/client/packages")
[ -z "$DISTCC_HOSTS" ] || docker_env+=(-e "DISTCC_HOSTS=$DISTCC_HOSTS")
[ -z "${PRUNE_VIRTUALS}" ] || docker_env+=(-e "PRUNE_VIRTUALS=$PRUNE_VIRTUALS")
[ -z "$REPOSITORY_NAME" ] || docker_env+=(-e "REPOSITORY_NAME=$REPOSITORY_NAME")
[ -z "$ENMAN_ADD_SELF" ] || docker_env+=(-e "ENMAN_ADD_SELF=$ENMAN_ADD_SELF")
if [ -n "$REMOTE_OVERLAY" ]; then
git clone "$REMOTE_OVERLAY" "$TEMPDIR"
LOCAL_OVERLAY=$TEMPDIR
fi
function cleanup {
rm -rf "$TEMPDIR"
}
trap cleanup EXIT
[ -d "$LOCAL_OVERLAY" ] && docker_volumes+=(-v "$LOCAL_OVERLAY:/usr/local/portage")
[ -z "$EQUO_MASKS" ] || docker_env+=(-e "EQUO_MASKS=$EQUO_MASKS")
[ -z "$EQUO_UNMASKS" ] || docker_env+=(-e "EQUO_UNMASKS=$EQUO_UNMASKS")
[ -z "$EMERGE_REMOVE" ] || docker_env+=(-e "EMERGE_REMOVE=$EMERGE_REMOVE")
[ -z "$REMOTE_OVERLAY" ] || docker_env+=(-e "REMOTE_OVERLAY=$REMOTE_OVERLAY")
[ -z "$REMOVE_LAYMAN_OVERLAY" ] || docker_env+=(-e "REMOVE_LAYMAN_OVERLAY=$REMOVE_LAYMAN_OVERLAY")
[ -z "$REMOVE_REMOTE_OVERLAY" ] || docker_env+=(-e "REMOVE_REMOTE_OVERLAY=$REMOVE_REMOTE_OVERLAY")
[ -z "$QA_CHECKS" ] || docker_env+=(-e "QA_CHECKS=$QA_CHECKS")
[ -z "$REMOTE_CONF_PORTDIR" ] || docker_env+=(-e "REMOTE_CONF_PORTDIR=$REMOTE_CONF_PORTDIR")
[ -z "$REMOTE_PORTDIR" ] || docker_env+=(-e "REMOTE_PORTDIR=$REMOTE_PORTDIR")
[ -z "$ETP_NOCACHE" ] || docker_env+=(-e "ETP_NOCACHE=$ETP_NOCACHE")
[ -z "$PRETEND" ] || docker_env+=(-e "PRETEND=$PRETEND")
[ -z "$BUILDER_VERBOSE" ] || docker_env+=(-e "BUILDER_VERBOSE=$BUILDER_VERBOSE")
[ -z "$DETECT_OBSOLETE" ] || docker_env+=(-e "DETECT_OBSOLETE=$DETECT_OBSOLETE")
[ -z "$TARGET_OVERLAY" ] || docker_env+=(-e "TARGET_OVERLAY=$TARGET_OVERLAY")
[ -d "$LOCAL_OVERLAY" ] && docker_volumes+=(-v "$LOCAL_OVERLAY:/usr/local/local_portage")
[ -z "$SHARE_WORKSPACE" ] || docker_volumes+=(-v "$SAB_WORKSPACE:/devkit-workspace")
[ -z "$PRE_SCRIPT" ] || docker_volumes+=(-v "$PRE_SCRIPT:/pre-script")
[ -z "$POST_SCRIPT" ] || docker_volumes+=(-v "$POST_SCRIPT:/post-script")
if [ -e $MAKE_CONF ]; then
echo "You specified a make.conf. I hope you know what are you doing"
@@ -75,13 +97,15 @@ if [ -d "$SAB_WORKSPACE"/specs ]; then
[ -e "$SAB_WORKSPACE"/specs/custom.mask ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.mask:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.mask/99-custom.mask")
[ -e "$SAB_WORKSPACE"/specs/custom.unmask ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.unmask:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.unmask/99-custom.unmask")
[ -e "$SAB_WORKSPACE"/specs/custom.use ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.use:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.use/99-custom.use")
[ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env/99-custom.env")
[ -e "$SAB_WORKSPACE"/specs/custom.env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.env:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.env")
[ -e "$SAB_WORKSPACE"/specs/custom.keywords ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/custom.keywords:/opt/sabayon-build/conf/$SAB_ARCH/portage/package.keywords/99-custom.keywords")
[ -d "$SAB_WORKSPACE"/specs/env ] && docker_volumes+=(-v "$SAB_WORKSPACE/specs/env/:/opt/sabayon-build/conf/$SAB_ARCH/portage/env/")
[ -d "/vagrant" ] && docker_volumes+=(-v "/vagrant:/vagrant")
fi
echo "Spawning the package builder container for '$@'."
echo ""
#echo "docker run $DOCKER_OPTS ${docker_env[@]} ${docker_volumes[@]} $DOCKER_IMAGE $@"
echo "docker run $DOCKER_OPTS \"${docker_env[@]}\" \"${docker_volumes[@]}\" $DOCKER_IMAGE $@"
docker run $DOCKER_OPTS "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE $@
docker run $DOCKER_OPTS "${docker_env[@]}" "${docker_volumes[@]}" $DOCKER_IMAGE "$@"
+15
View File
@@ -1,5 +1,20 @@
#!/bin/bash
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
. /sbin/sabayondevkit-functions.sh
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+95
View File
@@ -0,0 +1,95 @@
#!/usr/bin/perl
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
use feature 'say';
use Cwd;
use File::Temp;
my $current_git_directory = qx|git rev-parse --show-toplevel 2>/dev/null|;
chomp $current_git_directory;
my $cwd = getcwd;
chdir($current_git_directory);
my $commit_message_tmpfile = File::Temp->new();
my @changed_files = qx|git status -s|;
my $n_changed_files = scalar @changed_files;
die "No files changed. Exiting." if $n_changed_files <= 0;
my %atoms = ();
sub _build_git_repo {
my ($file_name) = @_;
my $commit_message;
if ( $file_name
=~ /conf\/(home|intel|arm(arch|hfp|v6l|vtl))\/(entropy|portage|repo)\/(.*)/
)
{
$commit_message = "$1/$4: ";
}
elsif ( $filename eq
"conf/noarch/entropy/packages/packages.server.dep_blacklist" )
{
$commit_message = "dep_blacklist: ";
}
elsif ( $filename eq
"conf/noarch/entropy/packages/packages.server.dep_rewrite" )
{
$commit_message = "dep_rewrite: ";
}
if ($commit_message) {
print $commit_message_tmpfile $commit_message;
system( "git commit -eF " . $commit_message_tmpfile->filename );
unlink($commit_message_tmpfile) if -e $commit_message_tmpfile;
}
}
sub _overlay_git_repo {
die "If you are in the overlay, call me in the ebuild dir"
if $current_git_directory eq getcwd;
chdir($cwd);
die "I'm not pleased.. but you could force with --force"
if ( _system("repoman") && $ARGV[0] ne "--force" );
_system("repoman commit $ARGV[0]");
}
sub _system {
my $prog = shift;
my $rv = system( {$prog} $prog => @_ );
if ( $rv == -1 ) { say("Can't launch $prog: $!"); return 1; }
elsif ( my $s = $rv & 127 ) {
say("$prog died from signal $s");
return 1;
}
elsif ( my $e = $rv >> 8 ) { say("$prog exited with code $e"); return 1; }
return 0;
}
foreach my $file (@changed_files) {
chomp $file;
my @words = split( ' ', $file, 2 );
next if $words[0] eq "??"; # allow "dangling" files
my $file_name = $words[1];
if ( $file_name =~ /conf\/(intel|arm|noarch)/ ) {
_build_git_repo($file_name);
}
elsif ( $file_name =~ /\.ebuild/ ) {
_overlay_git_repo($file_name);
}
}
+27 -6
View File
@@ -1,4 +1,20 @@
#!/bin/bash
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
. /sbin/sabayondevkit-functions.sh
@@ -54,19 +70,24 @@ mkdir -p /sabayon/artifacts
[[ -z "\${built_pkgs}" ]] && echo "ERROR: no tbz2s found" && exit 2
if [ -d "/sabayon/artifacts/standard" ]; then
echo "=== Repository already exists, syncronizing ==="
eit unlock \$repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "=== Repository is empty, intializing ==="
echo "Yes" | eit init --quick \$repo
eit push --quick --force
fi
echo "Yes" | eit inject \${built_pkgs} || { echo "ouch unable to inject" && exit 3; }
echo "Yes Yes Yes" | eit commit --quick
[ -f "/etc/entropy/mykeys/key.pub" ] && [ -f "/etc/entropy/mykeys/private.key" ] && { ! eit key status \$repo; } && \
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; } && { echo "=== Repository key imported successfully ==="; }
[ -f "/etc/entropy/mykeys/key.pub" ] && [ -f "/etc/entropy/mykeys/private.key" ] &&\
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; }
echo "=== Injecting packages ==="
eit inject --quick \${built_pkgs} || { echo "ouch unable to inject" && exit 3; }
eit commit --quick
echo "=== Pushing built packages locally ==="
eit push --quick --force
EOF
@@ -83,8 +104,8 @@ database-format = bz2
# disabled-eapis = 1,2
# expiration-based-scope = disable
# nonfree-packages-directory-support = disable
rss-feed = disable
changelog = disable
rss-feed = enable
changelog = enable
rss-name = packages.rss
rss-base-url = http://packages.sabayon.org/?quicksearch=
rss-website-url = http://www.sabayon.org/
+22 -1
View File
@@ -1,4 +1,20 @@
#!/bin/bash
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
. /sbin/sabayondevkit-functions.sh
@@ -25,6 +41,8 @@ docker_volumes=(
-v "$entropysrv:/etc/entropy/server.conf"
-v "$PORTAGE_ARTIFACTS:/usr/portage/packages" )
[ -z "$PUBKEY" ] || docker_volumes+=(-v "$PUBKEY:/etc/entropy/mykeys/key.pub")
[ -z "$PRIVATEKEY" ] || docker_volumes+=(-v "$PRIVATEKEY:/etc/entropy/mykeys/private.key")
check_docker_requirements
@@ -40,12 +58,15 @@ repo="\${REPOSITORY:-default}"
if [ -d "/sabayon/artifacts/standard" ]; then
eit unlock \$repo || true
eit pull --quick $repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "ouch no repository there" && exit 3;
fi
[ -f "/etc/entropy/mykeys/key.pub" ] && [ -f "/etc/entropy/mykeys/private.key" ] && { ! eit key status \$repo; } && \
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; } && { echo "=== Repository key imported successfully ==="; }
eit clean --quick || { echo "ouch unable to remove" && exit 3; }
eit vacuum --quick || { echo "ouch unable to remove" && exit 3; }
+22 -2
View File
@@ -1,4 +1,20 @@
#!/bin/bash
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
. /sbin/sabayondevkit-functions.sh
@@ -24,7 +40,8 @@ docker_volumes=(
-v "$createrepo:/sabayon/bin/create_repo.sh"
-v "$entropysrv:/etc/entropy/server.conf"
-v "$PORTAGE_ARTIFACTS:/usr/portage/packages" )
[ -z "$PUBKEY" ] || docker_volumes+=(-v "$PUBKEY:/etc/entropy/mykeys/key.pub")
[ -z "$PRIVATEKEY" ] || docker_volumes+=(-v "$PRIVATEKEY:/etc/entropy/mykeys/private.key")
check_docker_requirements
@@ -40,12 +57,15 @@ repo="\${REPOSITORY:-default}"
if [ -d "/sabayon/artifacts/standard" ]; then
eit unlock \$repo || true
eit pull --quick $repo || true
eit pull --quick \$repo || true
#eit sync \$repo
else
echo "ouch no repository there" && exit 3;
fi
[ -f "/etc/entropy/mykeys/key.pub" ] && [ -f "/etc/entropy/mykeys/private.key" ] && { ! eit key status \$repo; } && \
eit key import \$repo /etc/entropy/mykeys/private.key /etc/entropy/mykeys/key.pub && { eit key sign \$repo || true; } && { echo "=== Repository key imported successfully ==="; }
echo "Yes" | eit rm --from \$repo ${args[@]} || { echo "ouch unable to remove" && exit 3; }
echo "Yes Yes Yes" | eit commit --quick
eit push --quick --force
+65
View File
@@ -0,0 +1,65 @@
#!/usr/bin/perl
# mudler <mudler@sabayon.org>
# this tool requires querypkg
use Getopt::Long;
use strict;
use warnings;
my $arch;
my $verbose;
my $overlay;
GetOptions(
"arch=s" => \$arch,
"overlay=s" => \$overlay,
"verbose" => \$verbose
) or die("Error in command line arguments\n");
die("You should at least supply an overlay with --overlay") if !$overlay;
# Input: Overlay absolute path
# Output: array with package names (category/name)
sub get_packages {
keys %{
{ map {
s/$overlay\/|\.ebuild//g;
$_ = join( '/', ( split( /\//, $_ ) )[ 0, 1 ] );
$_ => 1
} glob( $_[0] . "/*/*/*.ebuild" )
}
};
}
# Input: package (category/name)
# Output: returns 1 if obsolete and can be removed
sub obsolete_package($$) {
my $package = $_[0];
my $arch = $_[1];
my $l_arch = ( defined $arch and $arch ne "" ? "--arch $arch" : "" );
print "querypkg -q $l_arch $package --show spm_repo\n" if $verbose;
my @out = `querypkg -q $l_arch $package --show spm_repo`;
chomp(@out);
return 1 if "@out" eq "";
foreach my $l (@out) {
print " >> $l\n" if $verbose;
return 1 if ( $l =~ /$package.*\{spm_repo\:gent.*/ );
}
return 0;
}
my @packages = get_packages($overlay);
my @obsoletes;
foreach my $p (@packages) {
print "[$p] Checking if there is a version in the repositories.... ";
print "\n" if $verbose;
if ( obsolete_package( $p, $arch ) ) {
print " OBSOLETE! \n";
push( @obsoletes, $p );
}
else {
print " ok \n";
}
}
print "\n";
print "Obsoletes found:\n\n";
print "$_\n" for @obsoletes;
+6
View File
@@ -0,0 +1,6 @@
#!/bin/bash
sudo bash << EOF
echo "Grabbing system informations, the url to share will happear in a minute"
(echo 'lspci'; lspci; echo 'network'; ifconfig -a; echo 'drivers'; lsmod; find /lib/modules; echo 'kernel'; uname -a) | pastebunz
EOF
+110
View File
@@ -0,0 +1,110 @@
#!/bin/bash
# Copyright 2016-2018 See AUTHORS file
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
. /sbin/sabayondevkit-functions.sh
help_msg() {
echo "
sabayon-maint-helper:
Script for builder boxes maintenance.
-h|--help This message.
--installed Upgrades all the packages installed in the box.
--obsolete Upgrades ONLY the packages that are listed obsolete in eix-test-obsolete.
--all Tries to upgrade all package without any euristics
--category Tries to upgrade/install all the packages in the specified category
e.g. sabayon-maint-helper 'app-office'
Some options could be set also as environment variables:
EMERGE_DEFAULT_ARGS Default emerge options
NOTE: This script MUST be execute as root.
"
}
parse_args() {
local short_opts="h"
local long_opts="help arch: host-arch: unprivileged stagingdir: image-descr: image:"
$(set -- $(getopt -u -q -a -o "$short_opts" -l "$long_opts" -- "$@"))
while [ $# -gt 0 ] ; do
case "$1" in
-h|--help)
help_msg
exit 1
;;
--installed)
echo "Trying to upgrade all the installed packages"
rebuild_all
;;
--obsolete)
echo "Upgrading the packages that are marked as obsolete"
build_obsolete
;;
--all)
echo "Upgrading/Installing everything available to install"
build_all_availables
;;
--category)
echo "Upgrading/Installing everything inside the '$2' category"
build_category_installed "$2"
shift
;;
--)
help_msg
exit 1
;;
*)
echo "Invalid parameter $1."
exit 1
;;
esac
shift
done
return 0
}
main() {
if [ "$(id -u)" != "0" ]; then
echo "This script must be run as root" 1>&2
exit 1
fi
[ -z "$@" ] && help_msg && exit 1
(
echo "Acquiring lock"
flock -x -w 10 200 || ( echo "Failed acquiring lock in 10 seconds" && exit 1 )
parse_args "$@"
) 200>/var/lock/.repomaint
}
main "$@"
Regular → Executable
View File
Regular → Executable
View File
Regular → Executable
View File
+53 -23
View File
@@ -1,58 +1,88 @@
#!/bin/bash
set -e
export BUILD_DIR="${BUILD_DIR:-/opt/sabayon-build/}"
check_docker_requirements(){
if [ "$(id -u)" != "0" ]; then
groups | grep -q docker || echo "--> If you are not running the script as root, your user should be in the docker group to use it. (sudo gpasswd -a $USER docker)"
fi
ps aux | grep -q '[d]ocker' || echo "--> Be sure to have the docker daemon running (sudo systemctl start docker) of configure it to run on boot (sudo systemctl enable docker). Trying to start it anyway" && sudo systemctl start docker
ps aux | grep -q '[d]ocker' || echo "--> Be sure to have the docker daemon running (sudo systemctl start docker) of configure it to run on boot (sudo systemctl enable docker). Trying to start it anyway" && systemctl start docker || true
}
die() { echo "$@" 1>&2 ; exit 1; }
build() {
build_sync() {
layman -S
emerge --sync
eix-update
pushd "${BUILD_DIR}"
git stash
git fetch --all || true
git checkout master || true
git reset --hard origin/master || true
popd
}
build_category() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
build_sync
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
emerge $EMERGE_DEFAULT_ARGS -o $i && \
emerge $EMERGE_DEFAULT_ARGS $i
echo "Building $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive --verbose --oneshot --nospinner --noreplace --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg} $i || true
done
}
build_installed() {
local SEARCH=$1
local EMERGE_DEFAULT_ARGS=${2:---accept-properties=-interactive --newuse --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg}
build_obsolete() {
build_sync
for i in $(EIX_LIMIT=0 eix-test-obsolete | grep '\[U\]' | awk '{ print $2 }' | xargs echo | uniq);
do
echo "Build $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive -u --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg --noreplace} $i || true
done
}
build_category_installed() {
local SEARCH=$1
build_sync
for i in $(EIX_LIMIT=0 eix -I --only-names --pure-packages "$SEARCH/" | xargs echo | uniq);
do
#emerge $EMERGE_DEFAULT_ARGS -o $i && \
emerge $EMERGE_DEFAULT_ARGS $i
echo "Building $i"
emerge ${EMERGE_DEFAULT_ARGS:---accept-properties=-interactive -u --newuse --noreplace --changed-use --update --verbose --oneshot --nospinner --quiet-build=y --quiet-fail --fail-clean=y --complete-graph --buildpkg} $i || true
done
}
build_all_availables() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build "$i/"
build_category "$i/"
done
}
rebuild_all() {
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
build_installed "$i/"
build_category_installed "$i/"
done
}
build_sync() {
emerge-webrsync || exit 1
emerge --sync
layman -S
eix-update || exit 1
pushd /opt/sabayon-build/
git stash
git fetch --all
git checkout master
git reset --heard origin/master
popd
get_category() {
local CATEGORY=$1
local PACKS
for i in $(EIX_LIMIT=0 eix --only-names --pure-packages "$CATEGORY/" | xargs echo | uniq);
do
PACKS+="$i "
done
echo $PACKS
}
get_all_availables() {
local RES
for i in $(cat /usr/portage/profiles/categories | xargs echo | uniq);
do
RES+="$(get_category $i) "
done
echo $RES
}
+23
View File
@@ -0,0 +1,23 @@
#include <stdio.h>
#include <dlfcn.h>
/**
* Attempts to load shared libraries
* @param argc
* @param argv files to check (pass only shared libs)
* @return 0 - all shared libs loaded, 1 - error occured (invalid or broken files passed)
*/
int main(int argc, char* argv[])
{
int i;
for (i = 1; i < argc; ++i) {
void* handle = dlopen(argv[i], RTLD_NOW);
if (!handle) {
fprintf(stderr, "%s\n", dlerror());
return 1;
} else {
dlclose(handle);
}
}
return 0;
}