The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

instopt - Download and install software

VERSION

This document describes version 0.000 of instopt (from Perl distribution App-instopt), released on 2018-09-13.

SYNOPSIS

 # List all installed software in /opt
 % instopt list-installed
 % instopt list-installed -l

 # Download a software (e.g. firefox), will be put in $ARCHIVE/f/firefox/<VERSION>/<ARCH>/
 % instopt download firefox

 # List downloaded versions/archs of a software
 % instopt list-downloaded firefox

 # Update (download + install) a software in /opt
 % instopt update firefox

 # Update all software in /opt
 % instopt update-all

DESCRIPTION

STATUS: Early release. Most things are not yet implemented.

instopt is an opinionated tool to automate downloading and installing software binaries (by default to /opt, hence the name: "install to /opt"). To describe how it works, I'll describe how I install my software to /opt.

Normally, I depend on the package manager of my OS (Linux distribution) to install software. But some software need to be updated more often. Let's take as example firefox, where the OS version is usually too old for my taste. I'll usually do this:

  1. Go to the Mozilla download page and download the latest firefox binary, let's say firefox-99.1.2.tar.bz2.

  2. Save this file to ~/software/f/firefox/99.1.2/linux-x86_64/, so I can share this with my other laptops and PC, to avoid redownloading the same stuff.

  3. To install, I do the rest of the steps as root. I extract the tarball to /opt/firefox-99.1.2/.

  4. I create (or update) symlink /opt/firefox to point to /opt/firefox-99.1.2.

  5. I create (or update) symlink /usr/local/bin/firefox to /opt/firefox/firefox.

When a new version of Firefox comes out, I do the following:

  1. Go to the Mozilla website. Download the latest Firefox tarball, e.g. firefox-99.1.3.tar.bz2.

  2. Save it to ~/software/f/firefox/99.1.3/linux-x86_64/.

  3. Extract the tarball to /opt/firefox-99.1.3.

  4. Update the symlink /opt/firefox to point to /opt/firefox-99.1.3.

  5. Optionally delete /opt/firefox-99.1.2.

instopt is the tool I wrote to automate the above tasks. Now I only need to do:

 # instopt update firefox

This will download the latest firefox, save the tarball to the appropriate location, extract it to /opt, and create/update the symlinks.

You can customize the target directory (/opt) and the software archive directory (~/software).

To start using instopt, first install it from CPAN. Also install the catalog module for the software that you want/need, e.g. for firefox Software::Catalog::SW::firefox. This module tells instopt how to find out the latest version, where the download URL is, and so on.

You might also want to create a configuration file ~/.config/instopt.conf containing:

 # if not the default ~/software
 archive_dir = /mnt/shared/software

 # if not the default /opt
 target_dir = /usr/local/opt

After that, install away.

SUBCOMMANDS

download

Download latest version of software.

list-downloaded

List all downloaded software.

list-installed

List all installed software.

update

Update a software to latest version.

update_all

Update all installed software.

OPTIONS

* marks required options.

Common options

--arch=s
--archive-dir=s
--config-path=filename, -c

Set path to configuration file.

--config-profile=s, -P

Set configuration profile to use.

--debug

Shortcut for --log-level=debug.

--format=s

Choose output format, e.g. json, text.

Default value:

 undef
--help, -h, -?

Display help message and exit.

--json

Set output format to json.

--log-level=s

Set log level.

--naked-res

When outputing as JSON, strip result envelope.

Default value:

 0

By default, when outputing as JSON, the full enveloped result is returned, e.g.:

    [200,"OK",[1,2,3],{"func.extra"=>4}]

The reason is so you can get the status (1st element), status message (2nd element) as well as result metadata/extra result (4th element) instead of just the result (3rd element). However, sometimes you want just the result, e.g. when you want to pipe the result for more post-processing. In this case you can use `--naked-res` so you just get:

    [1,2,3]
--no-config, -C

Do not use any configuration file.

--no-env

Do not read environment for default options.

--quiet

Shortcut for --log-level=error.

--subcommands

List available subcommands.

--trace

Shortcut for --log-level=trace.

--verbose

Shortcut for --log-level=info.

--version, -v

Display program's version and exit.

Options for subcommand download

--software=s*

Options for subcommand list-downloaded

--detail, -l
--software=s*

Options for subcommand update

--software=s*

COMPLETION

This script has shell tab completion capability with support for several shells.

bash

To activate bash completion for this script, put:

 complete -C instopt instopt

in your bash startup (e.g. ~/.bashrc). Your next shell session will then recognize tab completion for the command. Or, you can also directly execute the line above in your shell to activate immediately.

It is recommended, however, that you install modules using cpanm-shcompgen which can activate shell completion for scripts immediately.

tcsh

To activate tcsh completion for this script, put:

 complete instopt 'p/*/`instopt`/'

in your tcsh startup (e.g. ~/.tcshrc). Your next shell session will then recognize tab completion for the command. Or, you can also directly execute the line above in your shell to activate immediately.

It is also recommended to install shcompgen (see above).

other shells

For fish and zsh, install shcompgen as described above.

CONFIGURATION FILE

This script can read configuration files. Configuration files are in the format of IOD, which is basically INI with some extra features.

By default, these names are searched for configuration filenames (can be changed using --config-path): ~/.config/instopt.conf, ~/instopt.conf, or /etc/instopt.conf.

All found files will be read and merged.

To disable searching for configuration files, pass --no-config.

To put configuration for a certain subcommand only, use a section name like [subcommand=NAME] or [SOMESECTION subcommand=NAME].

You can put multiple profiles in a single file by using section names like [profile=SOMENAME] or [SOMESECTION profile=SOMENAME] or [subcommand=SUBCOMMAND_NAME profile=SOMENAME] or [SOMESECTION subcommand=SUBCOMMAND_NAME profile=SOMENAME]. Those sections will only be read if you specify the matching --config-profile SOMENAME.

You can also put configuration for multiple programs inside a single file, and use filter program=NAME in section names, e.g. [program=NAME ...] or [SOMESECTION program=NAME]. The section will then only be used when the reading program matches.

Finally, you can filter a section by environment variable using the filter env=CONDITION in section names. For example if you only want a section to be read if a certain environment variable is true: [env=SOMEVAR ...] or [SOMESECTION env=SOMEVAR ...]. If you only want a section to be read when the value of an environment variable has value equals something: [env=HOSTNAME=blink ...] or [SOMESECTION env=HOSTNAME=blink ...]. If you only want a section to be read when the value of an environment variable does not equal something: [env=HOSTNAME!=blink ...] or [SOMESECTION env=HOSTNAME!=blink ...]. If you only want a section to be read when an environment variable contains something: [env=HOSTNAME*=server ...] or [SOMESECTION env=HOSTNAME*=server ...]. Note that currently due to simplistic parsing, there must not be any whitespace in the value being compared because it marks the beginning of a new section filter or section name.

List of available configuration parameters:

Common for all subcommands

 arch (see --arch)
 archive_dir (see --archive-dir)
 format (see --format)
 log_level (see --log-level)
 naked_res (see --naked-res)

Configuration for subcommand download

 software (see --software)

Configuration for subcommand list-downloaded

 detail (see --detail)
 software (see --software)

Configuration for subcommand list-installed

Configuration for subcommand update

 software (see --software)

Configuration for subcommand update_all

ENVIRONMENT

INSTOPT_OPT => str

Specify additional command-line options.

FILES

~/.config/instopt.conf

~/instopt.conf

/etc/instopt.conf

HOMEPAGE

Please visit the project's homepage at https://metacpan.org/release/App-instopt.

SOURCE

Source repository is at https://github.com/perlancar/perl-App-instopt.

BUGS

Please report any bugs or feature requests on the bugtracker website https://rt.cpan.org/Public/Dist/Display.html?Name=App-instopt

When submitting a bug or request, please include a test-file or a patch to an existing test-file that illustrates the bug or desired feature.

SEE ALSO

swcat from App::swcat

AUTHOR

perlancar <perlancar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2018 by perlancar@cpan.org.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.