1
0
mirror of https://gitlab.com/fdroid/fdroidserver.git synced 2024-11-19 05:10:10 +01:00
Commit Graph

456 Commits

Author SHA1 Message Date
Hans-Christoph Steiner
adafd4560c
provision-android-sdk: ensure ANDROID_HOME parent dir is accessible by all
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/926#note_586778883
2021-05-28 10:24:55 +02:00
Hans-Christoph Steiner
7a1d236c8d
only support zipballs in NDK provisioning
Since I discovered there is an r10e zipball, this can now get all NDKs
in zipball form.
fdroid/android-sdk-transparency-log@447fea86e7

closes #902
2021-05-28 09:13:36 +02:00
Hans-Christoph Steiner
9f77044d0d
auto-detect NDKs installed in standard paths
'ndk_paths' will be automatically filled out from well known sources
like $ANDROID_HOME/ndk-bundle and $ANDROID_HOME/ndk/*.  If a required
version is missing in the buildserver VM, it will be automatically
downloaded and installed into the standard $ANDROID_HOME/ndk/
directory.  Manually setting it here will override the auto-detected
values.  The keys can either be the "release" (e.g. r21e) or the
"revision" (e.g. 21.4.7075529).

https://developer.android.com/studio/projects/configure-agp-ndk#agp_version_41
* sdkmanager installs "ndk;12.3.4567890" into $ANDROID_SDK_ROOT/ndk/
* sdkmanager installs "ndk-bundle" into $ANDROID_SDK_ROOT/ndk-bundle/
2021-05-28 09:13:34 +02:00
Hans-Christoph Steiner
93145a43fb buildserver: use standardized paths for the NDKs
This should help with reproducibility since some tools like Python still
include the build paths in the binaries.
https://gitlab.com/fdroid/fdroidserver/-/merge_requests/919#note_578180986

The default ANDROID_SDK_ROOT base dir of /opt/android-sdk is hard-coded in
buildserver/Vagrantfile.  The $ANDROID_HOME/ndk subdir is where Android
Studio will install the NDK into versioned subdirs.
https://developer.android.com/studio/projects/configure-agp-ndk#agp_version_41
2021-05-26 09:21:52 +02:00
Hans-Christoph Steiner
bb77d7a6d2 buildserver: standardize SDK install location /opt/android-sdk
_/opt/android-sdk_ was chosen for a number of reasons:
* _/opt_ is [standardized][1] for packages like the Android SDK, which has its own directory layout.
* _android-sdk_ is used rather than the upstream directory name from the ZIP (e.g. _android-sdk-linux_) so that the path is the same on all platforms.
* On platforms without official _/opt_ support ([macOS][2], [Windows][3], [FreeBSD][4], etc.), it does not conflict with any existing system directory.

[1]: https://refspecs.linuxfoundation.org/FHS_3.0/fhs/ch03s13.html
[2]: https://developer.apple.com/library/archive/documentation/FileManagement/Conceptual/FileSystemProgrammingGuide/FileSystemOverview/FileSystemOverview.html#//apple_ref/doc/uid/TP40010672-CH2-SW7
[3]: https://en.wikipedia.org/wiki/Directory_structure#Windows_10
[4]: https://www.freebsd.org/cgi/man.cgi?query=hier&sektion=7&format=html
2021-05-25 17:30:32 +02:00
Hans-Christoph Steiner
07da062a34 buildserver: fix ssh BatchMode config 2021-05-25 17:21:26 +02:00
Hans-Christoph Steiner
ec2cace222
buildserver: trim pre-installed NDK list down to the bare minimum
This keeps the Long Term Support release and the latest release installed.
r10e was kept in because it needs a special extraction method, since it is
a .bin file, not a .zip.  r12b is kept in because it is the old default.
Here is a survey of the NDK versions used in the most recent Builds entry
in each app that uses the NDK:

{'r10e': 6,
 'r12b': 93,
 'r13b': 4,
 'r14b': 5,
 'r15c': 7,
 'r16b': 14,
 'r17b': 4,
 'r17c': 7,
 'r18b': 9,
 'r19c': 17,
 'r20': 1,
 'r20b': 22,
 'r21': 3,
 'r21d': 56,
 'r21e': 65,
 'r22': 9,
 'r22b': 15,
 'r9b': 1}

#517


import glob
import os
import yaml

try:
    from yaml import CSafeLoader as SafeLoader
except ImportError:
    from yaml import SafeLoader

ndks = dict()
for f in glob.glob('metadata/*.yml'):
    with open(f) as fp:
        app = yaml.load(fp, Loader=SafeLoader)
        if app.get('Disable'):
            continue
        build = app.get('Builds', [])[-1]
        if build.get('disabled'):
            continue
        ndk = build.get('ndk')
        if ndk and ndk[1] == '9':
            print(f, build)
        elif ndk and int(ndk[2:3]) < 18:
            print(f, build)
        if ndk:
            print(f, ndk)
            if ndk not in ndks:
                ndks[ndk] = 0
            ndks[ndk] += 1

import pprint

pprint.pprint(ndks)
2021-05-25 17:06:28 +02:00
relan
6d9410597b Upgrade NDK r22 to r22b 2021-04-07 12:12:04 +03:00
Hans-Christoph Steiner
ee84eb762c buildserver: SharedFoldersEnableSymlinksCreate: false 2021-03-23 11:01:40 +01:00
Hans-Christoph Steiner
4b05854ffc buildserver: only install the latest gradle version
gradle checksums are now handled by gradlew-fdroid

refs #370 #517 #737
2021-03-11 08:40:34 +01:00
Licaon_Kter
d683a40f96 Add NDK 21e 2021-03-10 16:36:14 +02:00
Licaon_Kter
5396b79da7 Fix after https://gitlab.com/fdroid/fdroidserver/-/merge_requests/853 2021-02-12 09:14:27 +00:00
TacoTheDank
c88a3f56a1 Update NDK to r22 and add buildtools 30.0.3 2020-12-26 19:51:22 -05:00
Hans-Christoph Steiner
e927ed02a8
provision-apt-get-install: fix gpg from stretch-backports-sloppy
!822

The gpg dependencies are complicated.  The previous setup was always
failing with:
The following information may help to resolve the situation:
The following packages have unmet dependencies:
 gpg : Depends: gpgconf (= 2.2.20-1~bpo9+1)
       Depends: libassuan0 (>= 2.5.0) but 2.4.3-2 is to be installed
       Depends: libgpg-error0 (>= 1.35) but 1.26-2 is to be installed

Thanks to @izzysoft to spotting this.
2020-11-09 14:37:55 +01:00
Michael Pöhn
196dc75481 Merge branch 'yaml-config' into 'master'
move config.py to config.yml

See merge request fdroid/fdroidserver!571
2020-11-05 23:00:32 +00:00
Michael Pöhn
51a099cb3d Merge branch 'gpgaptfix' into 'master'
Use newer gpg from sloppy

See merge request fdroid/fdroidserver!822
2020-11-04 15:22:39 +00:00
licaon-kter
2fc0178972 Use newer gpg from sloppy 2020-11-01 14:02:48 +02:00
Hans-Christoph Steiner
a9fdb5b401 init: switch to config.yml as the default format 2020-10-23 14:20:49 +02:00
Hans-Christoph Steiner
fd41b70e27 purge common.use_androguard, it is now used by default
Up until now, the buildserver has not included androguard.  Since a
good version of androguard (v3.3.3+) is included in stretch-backports
and the buildserver is already setup to use stretch-backports, this
sets up the buildserver with androguard.

closes #627
2020-10-22 11:58:55 +02:00
Marcus Hoffmann
ba28d631b7 add now required packages to buildserver installation
Dependencies introduced in ffdroid/fdroidserver!798
2020-09-27 12:47:03 +02:00
Hans-Christoph Steiner
e659a5353d
provision-apt-get-install: gpg needs to come from stretch-backports
https://gitlab.com/eighthave/fdroiddata/-/jobs/611438997
Otherwise it fails to install:

```
  gpg : Depends: gpgconf (= 2.2.20-1~bpo9+1)
        Depends: libassuan0 (>= 2.5.0) but 2.4.3-2 is to be installed
        Depends: libgpg-error0 (>= 1.35) but 1.26-2 is to be installed
```

* 7e8c244473
* !769
2020-06-25 18:08:31 +02:00
Hans-Christoph Steiner
7e8c244473 provision-apt-get-install: ensure gpg is installed
The basebox installs gpg, but when this script is used to provision
a GitLab CI Runner, gpg was missing.  It is used in some builds.
2020-06-24 21:43:58 +02:00
TacoTheDank
0216513da6 Upgrade NDK r21c to r21d 2020-06-10 15:55:53 -04:00
Hans-Christoph Steiner
b1eb086259 Merge branch 'patch-2' into 'master'
Add NDK r21c

See merge request fdroid/fdroidserver!755
2020-06-02 19:59:38 +00:00
TacoTheDank
edd41b3c58 Upgrade NDK r21b to r21c 2020-05-29 16:23:20 -04:00
Hans-Christoph Steiner
1ed4ed61c7 buildserver: explicitly include sudo as a dependency
The basebox currently provides sudo, but that may not always be the case.
This makes the sudo dependency explicit, so that this provisioning script
can also be used in other settings, like GitLab CI.
2020-05-27 22:09:52 +02:00
relan
13ac46af07 makebuildserver: upgrade NDK r21 to r21b 2020-05-14 08:43:33 +03:00
Licaon_Kter
9e8aef6771 Add stretch-backports-sloppy repo too 2020-03-30 07:10:51 -04:00
relan
1b001cf1b5 provision-gradle: remove fake proxy configuration
The prohibition of HTTP causes connection errors on some builds:

    IOException: https://dl.google.com/android/repository/addons_list-3.xml
    java.net.ConnectException: Connection refused (Connection refused)
    IOException: https://dl.google.com/android/repository/addons_list-2.xml
    java.net.ConnectException: Connection refused (Connection refused)
    IOException: https://dl.google.com/android/repository/addons_list-1.xml
    java.net.ConnectException: Connection refused (Connection refused)
    Failed to download any source lists!

Partly revert a746917022.
2020-03-15 17:41:29 +03:00
Hans-Christoph Steiner
d9722f4453 buildserver: use long timeouts for gradle downloads
default is 30 seconds, this uses 10 minutes to avoid things like:

* What went wrong:
A problem occurred configuring root project 'org.fdroid.fdroid'.
> Could not resolve all files for configuration ':classpath'.
   > Could not download auto-value.jar (com.google.auto.value:auto-value:1.5.2)
      > Could not get resource 'https://repo.maven.apache.org/maven2/com/google/auto/value/auto-value/1.5.2/auto-value-1.5.2.jar'.
         > Read timed out

* https://stackoverflow.com/a/49646993
* https://github.com/gradle/gradle/issues/4629#issuecomment-393182135
* https://github.com/gradle/gradle/pull/3371/files
2020-02-13 22:32:51 +01:00
Hans-Christoph Steiner
bfe8f05de6
fix syntax error from ae86dc3d38
fdroid/fdroidserver!713

[skip ci]
2020-02-11 12:48:42 +01:00
Hans-Christoph Steiner
a746917022 provision-gradle: disable daemon and block HTTP repos
closes #624
#712
2020-02-05 20:36:25 +01:00
Hans-Christoph Steiner
ae86dc3d38 buildserver: set quiet options to stop apt-get spamming build logs
https://gitlab.com/fdroid/fdroidserver/issues/636#note_266483988
2020-02-05 20:36:25 +01:00
Marcus Hoffmann
fdcb1ad23f Revert "Revert "Merge branch 'ndk21' into 'master'""
This reverts commit 999b15a909.
2020-01-15 22:48:40 +01:00
Marcus Hoffmann
999b15a909 Revert "Merge branch 'ndk21' into 'master'"
This reverts commit 9b4cb8b76a, reversing
changes made to 3bdbbfd45b.
2020-01-15 22:09:41 +01:00
Licaon_Kter
3c3b3dbcf2 Add NDK21 2020-01-15 12:28:36 +00:00
Licaon_Kter
126f6bf839 Add NDK r20b 2019-12-16 00:07:03 +00:00
Marcus Hoffmann
bdf67784f5 makebuildserver: add ndk r20 2019-07-31 15:40:57 +02:00
Marcus
7272689ced Merge branch 'master' into 'master'
Added newer ndks, gradles, latest sdk-license, and update java 1.8 version

See merge request fdroid/fdroidserver!637
2019-04-11 11:42:18 +00:00
Michael Pöhn
67731470cc Revert "Merge branch 'write-yaml-overhaul' into 'master'"
This reverts merge request !630
2019-04-01 10:24:00 +00:00
Taco
457cf22361 Added newer ndks, gradles, latest sdk-license, and update java 1.8 version 2019-03-30 17:10:21 -04:00
Michael Pöhn
63afc0acb5 use pyyaml for writing metadata instead of ruamel 2019-03-18 22:45:35 +01:00
Marcus Hoffmann
daff6658c0 ndk r19b: missed a few places 2019-02-20 13:18:24 +01:00
Marcus Hoffmann
8d9f885b1c makebuildserver: add ndk r19b 2019-02-19 15:43:35 +01:00
Marcus Hoffmann
eee2cb03cf add ndk r19 2019-01-19 23:51:46 +01:00
Marcus Hoffmann
e1c547cfdf Revert "Revert "Merge branch 'random-fixes' into 'master'""
This reverts commit f6f2fb0b89.

Only one of the included commit should have been reverted.
2019-01-10 14:48:29 +01:00
Marcus
f6f2fb0b89 Revert "Merge branch 'random-fixes' into 'master'"
This reverts merge request !605
2019-01-10 13:46:49 +00:00
Hans-Christoph Steiner
4c5864c975 buildserver: add config option to use 'nfs' instead of '9p'
'9p' is not possible when running KVM in VMware.  Also, 'nfs' might provide
more reliably operation on systems that are properly setup for it.
2019-01-03 21:00:01 +01:00
Hans-Christoph Steiner
d6545732e4 buildserver: disable all automatic apt-get updates
Prevents errors due to:
dpkg: error: dpkg status database is locked by another process

closes #437
2018-12-12 17:38:26 +01:00
Hans-Christoph Steiner
fa7c59eea1 buildserver: include disorderfs to avoid sudo: in metadata
Right now, the only thing that Briar needs in sudo: in order to be built
reproducibly is `apt-get install disorderfs`.  This includes it in the
standard image to make it easy to spread that technique to many builds.

@grote
2018-12-06 21:55:02 +01:00
Marcus Hoffmann
b9dcfb43cf provision-sdk: don't install obolete stuff
This is probably still lying in the cache bu we explicitly don't want to
install it anymore.
2018-11-28 20:47:09 +01:00
Marcus Hoffmann
19076d1596 provision-ndk: set -x to see what it currently does 2018-11-28 20:46:44 +01:00
Marcus Hoffmann
13431fe54e provision-apt: don't run dist-upgrade
It might be a breaking operation with certain package configurations.
Package updates that require this (kernel) should come through the
basebox
2018-11-28 18:58:14 +01:00
Marcus Hoffmann
51accbd1d2 provision-apt: also run dist-upgrade
This ensures the kernel is upgraded as well with security fixes.
2018-11-27 18:14:50 +01:00
Marcus Hoffmann
0dcd034270 buildserver: always set DEBIAN_FRONTEND=noninteractive
closes #600
2018-11-27 18:14:05 +01:00
Marcus Hoffmann
ffb78afd0b provision-apt: add assumeyes config
closes #600
2018-11-27 18:13:33 +01:00
Marcus Hoffmann
2a2613520a provision-gradle: skip versions older than 2.2.1
These are almost never used now and still can be downloaded on-demand.
2018-11-27 17:34:53 +01:00
Marcus Hoffmann
e3a25ad3f2 buildserver: remove provision-pip
This was installing one python(2!) module. pip is installed in
provision-apt-get-install now.
2018-11-27 14:48:20 +01:00
Marcus Hoffmann
90a1703ccc makebuildserver: remove packages that should be installed per app
Or these are otherwise old cruft
2018-11-27 14:47:36 +01:00
Marcus Hoffmann
3c1a5873ab provision-apt: don't use automake/libtool from testing
This was set up when running jessie and shouldn;t be requried for now.
2018-11-27 14:47:17 +01:00
Marcus Hoffmann
85b90ee266 provision-apt: add DEBIAN_FRONTEND=noninteractive
This should fix #591 and related issues.
2018-11-27 14:47:08 +01:00
Michael Pöhn
201240e603 simplify debian mirror setup 2018-11-27 14:07:19 +01:00
Hans-Christoph Steiner
e2e63c9ac3 buildserver: include pip for both Python 2.x and 3.x
`pip install` is a relatively common thing for app builds to use in sudo=,
so it should be built into the buildserver.  This then builds in the trust
relationship to pypi, since it comes from Debian rather than some random
pip download/install process.
2018-11-20 12:10:40 +01:00
Marcus Hoffmann
10e3165e41 provisioners: work around apt-get update problem 2018-10-24 13:06:27 +02:00
Licaon_Kter
210c62f136 Add NDK r18b 2018-10-22 16:31:57 +00:00
Hans-Christoph Steiner
92bf9315e6 Merge branch 'verifiy-basebox' into 'master'
* verifiy-basebox:
  jenkins: switch to using auto-downloaded and verified basebox
  makebuildserver: verify stretch basebox

fdroid/fdroidserver!581
2018-10-17 17:04:16 +02:00
Hans-Christoph Steiner
3b0c8fe669 buildserver: only set disk_bus/nic_model_type if set in config file
This makes vagrant/KVM just use the default if these are not set in the
makebuildserver.config.py.

fdroid/fdroidserver!585
2018-10-11 12:11:15 +02:00
Michael Pöhn
d98d90ab90 makebuildserver: add config options for disk and network hardware emulation 2018-10-11 11:30:46 +02:00
Michael Pöhn
493a767d14 makebuildserver: verify stretch basebox 2018-10-11 09:56:46 +02:00
Hans-Christoph Steiner
ee509782a2 buildserver: apt-transport-https needs ca-certificates
ca-certificates is set as Recommends: but for our use cases it is required
since without it, standard CA-signed certs fail to validate.
2018-09-19 16:48:00 +02:00
Michael Pöhn
98806d7c01 configure headless openjdk to run without gtk accessability dependencies 2018-09-13 11:11:18 +02:00
Michael Pöhn
a5ef08f57d more general regex for updating debian repo urls in buildserver provisions 2018-09-13 11:11:18 +02:00
Michael Pöhn
aa86e56338 updated buildserver provisions to stretch 2018-09-13 11:11:18 +02:00
Hans-Christoph Steiner
cf4c9cb4ee buildserver now needs python3-defusedxml
4d13a904f3 means that defusedxml is required
to be installed on the buildserver guest.
2018-09-03 22:56:08 +02:00
Marcus Hoffmann
9889a98dea
build: improve gradle experience
This expands the gradle wrapper shell script used by the buildserver for
usage outside the buildserver environment. It also allows downloading
whitelisted versions of gradle if they are not yet deployed to the
buildserver by simply upsating the copy of fdroidserver (in contrast to
having to reprovision the whole buildserver).

We first move the buildserver/gradle shell script to the repo root
as gradlew-fdroid, as it's an fdroid specific gradle wrapper.
We also now sync it inside the build VM before each build.

We then add a list of whitelisted gradle distributions taken from the
makebuildserver script.

The script additionally now reads two env vars which tell it where to
expect installed versions of gradle and where it might store downloaded
gradle .zip files. Both of those are configurable from config.py. As the
first should normally just be a subdir of the second it's not exposed in
the example config.py but only used by the buildserver config.py.

Default config now uses this internal gradle wrapper but a path to a
custom wrapper or specific gradle distribution can still be set from
config.py.

Closes fdroid/fdroidserver#98
Ref: fdroid/fdroidserver#370
2018-07-11 11:49:46 +02:00
Marcus Hoffmann
a1ea29c86b
ndk17: add to extract whitelist 2018-07-04 14:30:15 +02:00
Marcus Hoffmann
2757bd2093
buildserver config: add ndk r17b entry 2018-06-27 16:45:42 +02:00
Marcus Hoffmann
297a1eb542
makebuildserver: add gradle 4.8.1
Closes fdroid/fdroidserver#506
2018-06-26 15:23:43 +02:00
relan
396ef24a4d makebuildserver: add Gradle 4.8 2018-06-14 20:37:54 +03:00
Marcus Hoffmann
a4fe2f711c
makebuildserver: add gradle 4.7 2018-04-20 17:55:51 +02:00
Marcus Hoffmann
970653bd92
add gradle plugin 3.1 which requires gradle 4.4 2018-04-05 14:12:35 +02:00
relan
64fad95fa1 makebuildserver: add Gradle 4.6 2018-03-16 07:39:44 +03:00
relan
2c0e430a2d makebuildserver: do not provision excessive NDKs
When a new minor version of an NDK is released, it replaces an older one,
e.g. r16 with r16b (see commit 6f295cb). But old NDK package remains in
the cache and provisioning script unpacks it too as it matches the mask.

Fix NDK provisioning to unzip only while-listed versions.
2018-02-14 09:11:40 +03:00
Hans-Christoph Steiner
ef9b89f4ec Merge branch 'remove-ndk-r9b' into 'master'
makebuildserver: remove NDK r9b to save 1.6 GB of disk space

See merge request fdroid/fdroidserver!459
2018-02-12 10:55:02 +00:00
Hans-Christoph Steiner
8326e62235 Merge branch 'ndk-r16b' into 'master'
makebuildserver: upgrade NDK r16 to r16b

See merge request fdroid/fdroidserver!458
2018-02-12 10:54:31 +00:00
relan
76da21f121 makebuildserver: remove NDK r9b to save 1.6 GB of disk space
NDK r9b is used by only one app (net.gorry.android.input.nicownng) that
was last updated in 2015.
2018-02-12 09:16:55 +03:00
relan
6f295cb3d3 makebuildserver: upgrade NDK r16 to r16b 2018-02-11 10:20:42 +03:00
relan
5387fe85a7 makebuildserver: add Gradle 4.5.1 2018-02-11 10:08:06 +03:00
Marcus Hoffmann
bf8dd8f6c9
makebuildserver: add gradle 4.5 2018-01-29 18:03:14 +01:00
Hans-Christoph Steiner
f0940540ee buildserver: include python3-git for future use
We should be replacing all our custom git shell commands with python3-git,
since it is a common library for doing that.  It will receive a lot more
attention and maintenance than our code for doing it.  For example, we
should not ever use shell=True, since that opens up a lot of security
risks.
2018-01-26 10:18:41 +01:00
Hans-Christoph Steiner
62ddab7edd buildserver: remove Qt installer, its huge, outdated, and being replaced
The currently included Qt has known security issues and is outdated.  This
can now be replaced by downloading and installing the Qt installer using
the sudo= build field.  @relan's provisioner system will also replace this
once that's done.  There are only two apps that currently use the Qt stuff:

* csd.qtproject.minesweeper
* org.openorienteering.mapper
2018-01-23 20:28:26 +01:00
Hans-Christoph Steiner
cd3e531731 buildserver: force no auto updates of package lists or upgrades 2018-01-22 13:49:10 +01:00
relan
70fba5d08c makebuildserver: add Gradle 4.4.1 2018-01-10 21:31:59 +03:00
relan
b16669b2a0 makebuildserver: add Gradle 4.4 2017-12-15 14:32:34 +03:00
Hans-Christoph Steiner
19af92c982 buildserver: include all Android SDK licenses in their exact format
I tried to clone the files I got from `sdkmanager --licenses`, byte for
byte.
2017-11-29 21:06:02 +01:00
Marcus Hoffmann
f9b853ab91 makebuildserver: add ndk r16 2017-11-26 17:17:55 +01:00
Hans-Christoph Steiner
09828f4a73 never wait for SSH prompts when running git commands
We never allow git via SSH or password/key access, and right now, this
causes things to hang forever.  This sets things up to fail quickly
with invalid ssh connections.

BatchMode=yes - passphrase/password querying will be disabled.

StrictHostKeyChecking=yes - never automatically prompt, or add host keys to
the ~/.ssh/known_hosts file, and refuse to connect to hosts whose host key
has changed.
2017-11-23 23:31:38 +01:00
Hans-Christoph Steiner
c45264b190 buildserver: use git from jessie-backports to get better workflow
A number of key features around username/password handling where added in
2.3, like GIT_SSH_COMMAND and GIT_TERMINAL_PROMPT.
2017-11-23 23:27:59 +01:00
Hans-Christoph Steiner
b72d6d7dbb Merge branch 'gradle-platform-install' into 'master'
Allow Gradle to install new platforms

See merge request fdroid/fdroidserver!373
2017-11-20 08:36:07 +00:00
relan
14f95f7750 buildserver: remove special sshd setup for Ubuntu 14.04
Now that fdroidserver requires Python 3, there's no need to tune sshd for
an old version of Paramiko because Ubuntu 14.04 does not have
python3-paramiko package in its repositories:

    https://packages.ubuntu.com/search?keywords=python3-paramiko

We can safely assume that Ubuntu 14.04 users have installed a more recent
version of Paramiko from PIP.
2017-11-17 21:15:18 +03:00