slackpkg+ plugin for third-party repositories

Slackpkg is a package manager for Slackware.

Slackpkg+ is a plugin for slackpkg.
   It adds support for third-party repositories.
   You can install, upgrade and search from multiple repositories.

Thanks to alienbob and phenixia2003 for contributing and all other submitted
suggestions and/or patches.

********************* DISCLAIMER **********************
This is NOT an official tool. Use it at your own risk.
The third party repositories are NOT official.
The authors of those repositories are not responsible
for any damage that may be caused to your computer.
*******************************************************

-----


CONFIGURATION

For the basic configuration:

* Edit /etc/slackpkg/slackpkgplus.conf
* Uncomment one or more mirrors and add them to the REPOPLUS list

Note that packages in these repository will not listed if they are present in
the official repositories (see below).

* Optionally, set PKGS_PRIORITY to give priority order for single packages 
  present in multiple repositories or to allow repositories to override
  official slackware packages

For a list of supported repositories see repositories.txt, but you can also
add others yourself.

If you configure repositories that do not support gpg, you may need to set
"CHECKGPG=off" in /etc/slackpkg/slackpkg.conf

Then launch
# slackpkg update gpg
# slackpkg update

To keep slackpkg+ updated, uncomment the 'slackpkgplus' repository, and then
# slackpkg upgrade-all
will upgrade slackpkg+ whenever a new version is released.

-----


MIRRORPLUS

The MIRRORPLUS array defines all mirrors. It accepts these protocols:

1) http/ftp/https: for example,

     MIRRORPLUS['slacky']=http://repository.slacky.eu/slackware64/

   The mirror must contains all metadata files (CHECKSUMS.md5 ...)
   You must run 'slackpkg update' after adding/removing a repository.

2) Local mirror: for example,

     MIRRORPLUS['alienlocal']=file://mirrors/alienbob/x86/14.0/

   The directory must contains all metadata files (CHECKSUMS.md5 ...)
   You must run 'slackpkg update' after adding/removing a repository.

3) Local packages directory: for example,

     MIRRORPLUS['mypackages']=dir://mypackages/

   All packages must be in a single directory (subdirectory not allowed).
   Note that 'slackpkg update' ignores these repositories. Every time you run
   slackpkg, it reads the directory contents.


-----


USAGE

See 'man slackpkg' :D

Use the command
# slackpkg upgrade-all
to keep your system up-to-date. This command searches for upgraded packages
spanning all configured repositories.

Use the command
# slackpkg install-new
(if you use Slackware -current) to check for new packages. This command
searches for new packages ONLY in the official Slackware repository.

The command
# slackpkg {install,upgrade,remove,reinstall}
accepts the following kinds of argument:

1) package-name (spanning all repositories), for example
   # slackpkg install bsd-games

2) part of package-name (spanning all repositories), for example
   # slackpkg install alsa

3) path of packages in repository (spanning all repositories), for example
   # slackpkg install xap

4) repository-name, for example
   # slackpkg upgrade alienbob
   upgrades all packages in the alienbob repository, and
   # slackpkg install ktown
   installs all packages in the ktown repository

5) repository-name:package-name, for example
   # slackpkg install slacky:openjdk
   installs openjdk from slacky even if there is another openjdk in another
   repository

6) file:local-file-name (txz/tgz), for example
   # slackpkg install file:mypackage-1.0-noarch-1my.txz
   installs mypackage even though not defined in slackpkgplus.conf
   (you can specify either a relative or an absolute path)

7) dir:directory, for example
   # slackpkg {install|upgrade} dir:/root/myrepo
   installs or upgrades all packages in /root/myrepo/
   (The final '/' is not strictly required.)
   Note: 'slackpkg install .' is an alias of 'slackpkg install dir:./', but
   'slackpkg install ./' is NOT the same alias; see FILE in man slackpkg

-----


PRIORITY CONFIGURATION

When a package is present in more than one repository, the package will be
searched for in the following order:

1) as listed in PKGS_PRIORITY (allow to override official packages)
2) as listed in an official Slackware repository
   (configured in /etc/slackpkg/mirrors)
3) as listed in REPOPLUS (deny to override official packages)
4) all others defined in MIRRORPLUS

PKGS_PRIORITY syntax:
  PKGS_PRIORITY=( <repository name>:<package name> ... )

for example:
  PKGS_PRIORITY=( alienbob:openjdk )

<package name> accepts a regular expression, so for example
  PKGS_PRIORITY=( restricted:.* )
means 'all packages in repository restricted'

-----


MULTILIB

If you want to use a multilib system, you can automatically configure the
multilib repository in slackpkgplus.conf and install multilib simply by running:
# /usr/doc/slackpkg+-1.2.0/setupmultilib.sh

To configure multilib manually (e.g. if you have installed multilib already),
uncomment the correct "MIRRORPLUS['multilib']=...",
and uncomment "PKGS_PRIORITY=( multilib:.* )",
and add multilib to the REPOPLUS list.

To install multilib manually, launch:
# slackpkg update gpg
# slackpkg update
# slackpkg upgrade-all
# slackpkg install multilib

After that, you can keep multilib up-to-date by launching:
# slackpkg update
# slackpkg upgrade-all
and re-running 'slackpkg install multilib' if 'slackpkg install-new' has found
any new packages.

To uninstall multilib, you must remove 'multilib:.*' from PKGS_PRIORITY and from
REPOPLUS (but do not delete the related MIRRORPLUS line), then launch:
# slackpkg update
# slackpkg remove multilib
Note: this does NOT remove the core multilib packages, because they affect the
64bit system. You must remove these by launching:
# slackpkg upgrade-all
then delete or comment the related MIRRORPLUS line, and finally launch
# slackpkg update

-----


KTOWN (LATEST KDE)

If you want to install the latest KDE packages from AlienBOB's ktown repository
(presently 4.11.1), add "PKGS_PRIORITY=( ktown:.* )" then launch:
# slackpkg update gpg
# slackpkg update
# slackpkg install ktown
# slackpkg upgrade-all
Do not forget to read the special instructions from
  http://taper.alienbase.nl/mirrors/alien-kde/current/latest/
because you may need to remove some Slackware KDE packages. At the time of
writing, these packages are:
# slackpkg remove kdeadmin kdenetwork kdesdk kdetoys

After that, you can keep the ktown KDE up-to-date by launching:
# slackpkg update
# slackpkg upgrade-all

To restore the Slackware KDE, remove 'ktown:.*' from PKGS_PRIORITY and from
REPOPLUS (but do not delete the related MIRRORPLUS line), then launch:
# slackpkg update
# slackpkg upgrade-all
# slackpkg install kde
# slackpkg remove ktown
then delete or comment the related MIRRORPLUS line and launch:
# slackpkg update

-----


PERSONAL PACKAGES

If you build some packages yourself, you can install these without
installpkg, by using slackpkg+. This helps you to track the install/upgrade,
and reduces the possibility of errors. You do NOT need to create a personal
repository with a gpg-key and metadata every time you build a package; also
you do NOT need to modify your slackpkgplus.conf file or launch 'slackpkg
update'.

You can:

1) install/upgrade/reinstall a single package by passing the full file name
   (optionally with absolute or relative path), for example
   # slackpkg install file:package-1.0-noarch-1my.txz
   or
   # slackpkg upgrade file:../repo/package-2.0-noarch-1my.txz

2) install/upgrade/reinstall all packages in a single directory (but not in a
   subtree) by passing a directory name (optionally with absolute or relative
   path), for example
   # slackpkg install dir:/myrep
   or
   # slackpkg upgrade dir:./test/package/
   or
   # slackpkg reinstall .

   Note: '.' is an alias of 'dir:./', but only that alias exists.
   'slackpkg install ./' (or /myrepo/ or ./package.txz) generates an error,
   because in standard slackpkg you can specify a FILE as input, so in
   'slackpkg install ./list.txt' list.txt must be a plain file containing a list
   of packages to install (see man slackpkg)

   If a directory contains the same package with two different versions,
   slackpkg shows the 'alphabetically' highest, so pkg-9.1 will be listed
   instead of pkg-8, but pkg-9 will be listed instead of pkg-10.
   Sorry... this is a slackpkg limitation!

   Tip: if you want to use dir:/myrepo to track your installations and you have
   lost the original txz/tgz file, you can simply create an empty file; this
   fools slackpkg+, which only searches for file name and not for contents
   (unless you run slackpkg reinstall on these packages ;))  So, by doing
   # touch mypkg1-1.0-noarch-1my.tgz
   # touch mysecondpkg-1.1-noarch-2my.txz
   (where mypkg1 and mysecondpkg are already installed packages),
   'slackpkg install .' (or upgrade) does not show you those packages, but
   'slackpkg reinstall .' DOES show them (so do not continue the installation)

NOTE: slackpkg+ will skip the gpg and md5 check for personal packages!!

-----


REMOTE PACKAGES WITHOUT METADATA

Some users share packages on their personal sites, but do not create metadata
files (particularly if they share only a few packages). To install one of these
packages, you could download it and install it manually. But now with slackpkg+
you can specify a direct URL for the package that will automatically download
and install/upgrade the package.

You can:

1) install/upgrade/reinstall a single package by specifying the complete url:
   # slackpkg install http://site/path/package-1.0-noarch-1my.txz
   For example, you may use this function to install a snapshot of slackpkg+
   (that is not available with 'slackpkg upgrade slackpkg+' because it is a beta
   version):
   # slackpkg upgrade http://www.slakfinder.org/slackpkg+/pkg/slackpkg+-20130905.2-noarch-1mt.txz

2) install/upgrade/reinstall all packages in a single remote directory (but not
   in a subtree) even if the site owner does not create metadata:
   # slackpkg install http://site/path/

   Note: this function requires lftp and may fail if the server does not support
   Directory Listing or if there is a index.html in the path.

NOTE: slackpkg+ will skip the gpg and md5 check for remote packages without
metadata!!

------


NOTIFICATIONS

Some package require special post-installation activity as upgrading a related
package or rebuilt kernel modules or change a custom configuration. A user may
forgot to do this, especially in large updates. The notification functionality
help the user to remember it. In /etc/slackpkg/notifymsg.conf you can define
some custom event. See documentation in that file. Events may be VERY custom
(on kde upgrde remember me to call my friends ;), or the more useful 
"on kernel upgrade remember to recompile all driver modules"

You may enable this function by setting "ENABLENOTIFY=on" in slackpkgplus.conf


-----

WGET Options

slackpkg+ uses wget to download packages and metadata.

You can use the WGETOPTS setting to pass options to wget.

By default when an url is unreachable wget - after a long timeout - retry to
download so if a repository is unreacheble you should remove it from your
configuration file.
As workaround you can add the options WGETOPTS="--timeout=5 --tries=1"
in slackpkgplus.conf

-----


ALLOW32BIT

By default slackpkg+ deny to install 32bit packages on a 64bit system.

Set ALLOW32BIT=on to allow slackpkg+ to install 32bit packages on a 64bit slackware 
installation (possibly unsafe). Please, do not install both 32 and 64bit of the same 
package to avoid problems, and NEVER upgrade exitant 64bit packages with relative 32bit
package.

Do not forget to install the multilibs.


-----

GREYLIST

Sometime you may want that slackpkg+ does not install some package in the upgrade-all
process. To do that you must uncheck the package everytime or add it in the
'blacklist' file. The first method may be onerous when you use upgrade-all frequently.
The second method does not allow you to know which package version is available.
A thirdy method is to put it in the 'graylist' file.
All packages listed in graylist will be available to install and listed in slackpkg
dialog, but they will be unchecked by default so you are sure to not install it
wrongly.
You may decide also to greylist one entire repository. A good idea is to greylist
all thirdy party repository so an upgrade-all automatically upgrade official
slackware packages but force you to review all other packages so to be sure on what
you install.

-----

INSTALL LOG

Slackpkg+ now create a log of all installed packages in /var/lib/slackpkg/install.log
and try to add in this log from which repository you have downloaded the file.
This help you to track your slackware installation.

You are encouraged to run '/usr/lib/slackpkg/makeinstlog.sh -t' (this may take a few)
to initialize the log (it will create /var/lib/slackpkg/install.log.tmp). The '-t' 
param add the repository name from which the packages was downloaded, but it may fails,
so you are encouraged to review the file before rename it in install.log.
Note that you can edit manually to modify or add informations.

At every slackpkg install/upgrade/remove invocation, a new log will be added.
At every slackpkg update invocation, a fast list rebuild will be done.

-----

CHECK-UPDATE IMPROVEMENT

the command "slackpkg check-updates" reports the repositories which have been changed since
the last update. For more details and some suggests how to use it in crontab see:
http://www.linuxquestions.org/questions/showthread.php?p=5146591

-----

FURTHER INFORMATION

The AlienBOB article about slackpkg+:
  http://alien.slackbook.org/blog/introducing-slackpkg-an-extension-to-slackpkg-for-3rd-party-repositories/

For questions, suggestions or contributions, you can email me at
zerouno@slacky.it or use the linuxquestions forum:
  http://www.linuxquestions.org/questions/showthread.php?p=4940074

You can find slackpkg+ on sourceforge:
  https://sourceforge.net/projects/slackpkgplus
