303

The http://stappers.it/do303/ service is a lookup table. Give it a package name and it returns a download URL. With wget as query tool you have also have a fetch tool.

It is like apt-get download without edits on /etc/apt/sources.list And the apt-get update part is done at server side.

Demo

See it in action to get the idea.

Non-free firmware

You have a new computer. With all libre software. But some firmware is in non-free.

$ wget http://stappers.it/do303/firmware-iwlwifi.deb
--2016-07-17 09:24:49--  http://stappers.it/do303/firmware-iwlwifi.deb
Resolving stappers.it (stappers.it)... 77.72.145.78
Connecting to stappers.it (stappers.it)|77.72.145.78|:80... connected.
HTTP request sent, awaiting response... 303 See other
Location: http://stappers.it/do303/debian/unstable/non-free/all/firmware-iwlwifi.deb [following]
--2016-07-17 09:24:49--  http://stappers.it/do303/debian/unstable/non-free/all/firmware-iwlwifi.deb
Connecting to stappers.it (stappers.it)|77.72.145.78|:80... connected.
HTTP request sent, awaiting response... 303 See Other
Location: http://ftp.nl.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-iwlwifi_20160110-1_all.deb [following]
--2016-07-17 09:24:49--  http://ftp.nl.debian.org/debian/pool/non-free/f/firmware-nonfree/firmware-iwlwifi_20160110-1_all.deb
Resolving ftp.nl.debian.org (ftp.nl.debian.org)... 2001:67c:2564:a120::21, 130.89.149.21
Connecting to ftp.nl.debian.org (ftp.nl.debian.org)|2001:67c:2564:a120::21|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3799032 (3.6M) [application/x-debian-package]
Saving to: ‘firmware-iwlwifi.deb’

100%[============================================================>] 3,799,032   1.25MB/s   in 2.9s   

2016-07-17 09:24:52 (1.25 MB/s) - ‘firmware-iwlwifi.deb’ saved [3799032/3799032]

$ sudo dpkg --install firmware-iwlwifi.deb
Selecting previously unselected package firmware-iwlwifi.
(Reading database ... 230700 files and directories currently installed.)
Preparing to unpack firmware-iwlwifi.deb ...
Unpacking firmware-iwlwifi (20160110-1) ...
Setting up firmware-iwlwifi (20160110-1) ...
$ rm firmware-iwlwifi.deb

So no changes on /etc/apt/sources.list, no risc of more non-free packages slipping in.

Newer in unstable

Example given with ansible

$ wget http://stappers.it/do303/ansible.deb
--2016-07-12 20:20:48--  http://stappers.it/do303/ansible.deb
Resolving stappers.it (stappers.it)... 77.72.145.78
Connecting to stappers.it (stappers.it)|77.72.145.78|:80... connected.
HTTP request sent, awaiting response... 303 See other
Location: http://stappers.it/do303/debian/unstable/main/all/ansible.deb [following]
--2016-07-12 20:20:49--  http://stappers.it/do303/debian/unstable/main/all/ansible.deb
Reusing existing connection to stappers.it:80.
HTTP request sent, awaiting response... No data received.
Retrying.

--2016-07-12 20:20:50--  (try: 2)  http://stappers.it/do303/debian/unstable/main/all/ansible.deb
Connecting to stappers.it (stappers.it)|77.72.145.78|:80... connected.
HTTP request sent, awaiting response... 303 See Other
Location: http://ftp.nl.debian.org/debian/pool/main/a/ansible/ansible_2.1.0.0-1_all.deb [following]
--2016-07-12 20:20:50--  http://ftp.nl.debian.org/debian/pool/main/a/ansible/ansible_2.1.0.0-1_all.deb
Resolving ftp.nl.debian.org (ftp.nl.debian.org)... 130.89.149.21, 2001:67c:2564:a120::21
Connecting to ftp.nl.debian.org (ftp.nl.debian.org)|130.89.149.21|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1284428 (1.2M) [application/x-debian-package]
Saving to: ‘ansible.deb’

100%[==============================================>] 1,284,428    969KB/s   in 1.3s

2016-07-12 20:20:51 (969 KB/s) - ‘ansible.deb’ saved [1284428/1284428]

$ sudo dpkg --install ansible.deb
(Reading database ... 229798 files and directories currently installed.)
Preparing to unpack ansible.deb ...
Unpacking ansible (2.1.0.0-1) over (1.7.2+dfsg-2) ...
Setting up ansible (2.1.0.0-1) ...
Installing new version of config file /etc/ansible/ansible.cfg ...
Processing triggers for man-db (2.6.7.1-1) ...
$ rm ansible.deb

More examples

By typing more, you get more.

Previous examples were using short format, packagename.type.

Long format is distro/suite/component/architecture/packagename.type.

Backport

letsencrypt:

wget http://stappers.it/do303/debian/jessie-backports/main/arm64/letsencrypt.deb

Other Distros

Yes, see Distro and repository website. Example given:

wget http://stappers.it/do303/zorin-os/wily/main/amd64/base-files.deb

Script what should be downloaded

To see what will be downloaded, replace .deb with .scr. As in:

wget http://stappers.it/do303/ansible.scr

Now you have a script ansible.scr with download URL and content like

# shell commands
wget -O ansible_2.1.0.0-1_all.deb --progress=dot:mega \
  http://ftp.nl.debian.org/debian/pool/main/a/ansible/ansible_2.1.0.0-1_all.deb
echo "1ee339605187310c0aab47656c956990e38ab716d8b248a4397c52732b804158  sha256 sum should match"
sha256sum ansible_2.1.0.0-1_all.deb
echo sudo dpkg -i ansible_2.1.0.0-1_all.deb

Next step could be bash ansible.scr. Output to expect.

--2016-07-17 16:09:31--  http://ftp.nl.debian.org/debian/pool/main/a/ansible/ansible_2.1.0.0-1_all.deb
Resolving ftp.nl.debian.org (ftp.nl.debian.org)... 2001:67c:2564:a120::21, 130.89.149.21
Connecting to ftp.nl.debian.org (ftp.nl.debian.org)|2001:67c:2564:a120::21|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 1284428 (1.2M) [application/x-debian-package]
Saving to: ‘ansible_2.1.0.0-1_all.deb’

     0K ........ ........ ...                                100%  782K=1.6s

2016-07-17 16:09:32 (782 KB/s) - ‘ansible_2.1.0.0-1_all.deb’ saved [1284428/1284428]

1ee339605187310c0aab47656c956990e38ab716d8b248a4397c52732b804158  sha256 sum should match
1ee339605187310c0aab47656c956990e38ab716d8b248a4397c52732b804158  ansible_2.1.0.0-1_all.deb
sudo dpkg -i ansible_2.1.0.0-1_all.deb

It is up to you to do sudo dpkg --install PACKAGE or not.