OXIESEC PANEL
- Current Dir:
/
/
usr
/
lib
/
python3
/
dist-packages
Server IP: 139.59.38.164
Upload:
Create Dir:
Name
Size
Modified
Perms
📁
..
-
10/21/2019 03:48:35 PM
rwxr-xr-x
📁
Automat-0.6.0.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
CommandNotFound
-
05/09/2024 07:14:56 AM
rwxr-xr-x
📁
ConfigArgParse-0.11.0.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
Crypto
-
05/09/2024 06:57:58 AM
rwxr-xr-x
📁
DistUpgrade
-
05/09/2024 07:15:53 AM
rwxr-xr-x
📁
HweSupportStatus
-
10/28/2024 08:41:33 AM
rwxr-xr-x
📁
Jinja2-2.10.egg-info
-
10/21/2019 03:49:31 PM
rwxr-xr-x
📁
LanguageSelector
-
10/21/2019 03:50:05 PM
rwxr-xr-x
📁
MarkupSafe-1.0.egg-info
-
10/21/2019 03:49:31 PM
rwxr-xr-x
📁
OpenSSL
-
10/21/2019 03:50:02 PM
rwxr-xr-x
📄
PAM-0.4.2.egg-info
193 bytes
08/04/2017 04:59:28 AM
rw-r--r--
📄
PAM.cpython-36m-x86_64-linux-gnu.so
19.42 KB
08/04/2017 04:59:28 AM
rw-r--r--
📄
PyICU-1.9.8.egg-info
10.32 KB
11/09/2017 07:22:14 AM
rw-r--r--
📄
PyICU.py
1.43 KB
02/08/2016 11:30:00 PM
rw-r--r--
📁
PyJWT-1.5.3.egg-info
-
07/20/2022 06:59:45 AM
rwxr-xr-x
📄
PyYAML-3.12.egg-info
1.48 KB
08/05/2017 04:28:08 PM
rw-r--r--
📄
README.txt
119 bytes
03/10/2023 04:46:00 PM
rw-r--r--
📁
SecretStorage-2.3.1.egg-info
-
05/09/2024 06:57:57 AM
rwxr-xr-x
📁
Twisted-17.9.0.egg-info
-
03/31/2022 06:22:38 AM
rwxr-xr-x
📁
UpdateManager
-
10/28/2024 08:41:33 AM
rwxr-xr-x
📁
__pycache__
-
11/10/2024 09:42:49 AM
rwxr-xr-x
📄
_cffi_backend.cpython-36m-x86_64-linux-gnu.so
165.56 KB
02/27/2018 07:34:07 PM
rw-r--r--
📄
_dbus_bindings.cpython-36m-x86_64-linux-gnu.so
155.67 KB
01/29/2018 07:57:57 PM
rw-r--r--
📄
_dbus_glib_bindings.cpython-36m-x86_64-linux-gnu.so
18.7 KB
01/29/2018 07:57:57 PM
rw-r--r--
📄
_icu.cpython-36m-x86_64-linux-gnu.so
710.82 KB
11/09/2017 07:22:14 AM
rw-r--r--
📄
_snack.cpython-36m-x86_64-linux-gnu.so
42.59 KB
01/12/2018 04:42:24 PM
rw-r--r--
📄
_version.py
21 bytes
08/26/2014 01:11:36 AM
rw-r--r--
📄
_yaml.cpython-36m-x86_64-linux-gnu.so
220.16 KB
08/05/2017 04:28:08 PM
rw-r--r--
📁
acme
-
07/12/2020 04:36:20 PM
rwxr-xr-x
📁
acme-0.31.0.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
apport
-
05/09/2024 07:15:23 AM
rwxr-xr-x
📄
apport_python_hook.py
7.87 KB
05/13/2020 10:12:14 PM
rw-r--r--
📁
apt
-
05/09/2024 07:14:28 AM
rwxr-xr-x
📄
apt_inst.cpython-36m-x86_64-linux-gnu.so
50.37 KB
12/01/2022 12:36:29 PM
rw-r--r--
📄
apt_inst.pyi
227 bytes
12/01/2022 12:36:29 PM
rw-r--r--
📄
apt_pkg.cpython-36m-x86_64-linux-gnu.so
338.66 KB
12/01/2022 12:36:29 PM
rw-r--r--
📄
apt_pkg.pyi
8.69 KB
12/01/2022 12:36:29 PM
rw-r--r--
📁
aptsources
-
05/09/2024 07:14:28 AM
rwxr-xr-x
📁
asn1crypto
-
10/21/2019 03:49:46 PM
rwxr-xr-x
📁
asn1crypto-0.24.0.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
attr
-
10/21/2019 03:49:50 PM
rwxr-xr-x
📁
attrs-17.4.0.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
automat
-
10/21/2019 03:49:51 PM
rwxr-xr-x
📁
blinker
-
10/21/2019 03:49:46 PM
rwxr-xr-x
📄
blinker-1.4.egg-info
3.81 KB
01/11/2018 02:57:15 PM
rw-r--r--
📁
certbot
-
05/25/2021 01:14:26 PM
rwxr-xr-x
📁
certbot-0.31.0.egg-info
-
05/25/2021 01:14:26 PM
rwxr-xr-x
📁
certbot_dns_digitalocean
-
05/25/2021 01:14:28 PM
rwxr-xr-x
📁
certbot_dns_digitalocean-0.23.0.egg-info
-
05/25/2021 01:14:26 PM
rwxr-xr-x
📁
certifi
-
10/21/2019 03:49:43 PM
rwxr-xr-x
📁
certifi-2018.1.18.egg-info
-
10/21/2019 03:49:19 PM
rwxr-xr-x
📁
chardet
-
10/21/2019 03:49:47 PM
rwxr-xr-x
📁
chardet-3.0.4.egg-info
-
10/21/2019 03:49:15 PM
rwxr-xr-x
📁
click
-
10/21/2019 03:49:53 PM
rwxr-xr-x
📁
click-6.7.egg-info
-
10/21/2019 03:49:31 PM
rwxr-xr-x
📁
cloud_init-23.1.2.egg-info
-
05/09/2024 07:14:27 AM
rwxr-xr-x
📁
cloudinit
-
05/09/2024 07:15:07 AM
rwxr-xr-x
📁
colorama
-
10/21/2019 03:49:43 PM
rwxr-xr-x
📁
colorama-0.3.7.egg-info
-
10/21/2019 03:49:31 PM
rwxr-xr-x
📄
command_not_found-0.3.egg-info
189 bytes
02/14/2022 05:26:36 PM
rw-r--r--
📄
configargparse.py
40.35 KB
09/05/2016 01:22:39 AM
rw-r--r--
📁
configobj-5.0.6.egg-info
-
05/09/2024 07:14:03 AM
rwxr-xr-x
📄
configobj.py
87.51 KB
02/05/2018 01:01:15 PM
rw-r--r--
📁
constantly
-
10/21/2019 03:49:41 PM
rwxr-xr-x
📁
constantly-15.1.0.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
cryptography
-
11/05/2020 06:02:51 AM
rwxr-xr-x
📁
cryptography-2.1.4.egg-info
-
11/05/2020 06:02:51 AM
rwxr-xr-x
📄
cv2.cpython-36m-x86_64-linux-gnu.so
2.78 MB
09/20/2018 09:28:13 AM
rw-r--r--
📁
dbus
-
10/21/2019 03:48:44 PM
rwxr-xr-x
📄
deb822.py
146 bytes
02/17/2018 05:37:18 AM
rw-r--r--
📄
debconf.py
6.61 KB
05/06/2019 04:30:30 PM
rw-r--r--
📁
debian
-
10/21/2019 03:49:51 PM
rwxr-xr-x
📁
debian_bundle
-
10/21/2019 03:49:51 PM
rwxr-xr-x
📁
digitalocean
-
05/25/2021 01:14:28 PM
rwxr-xr-x
📁
distro_info-0.18ubuntu0.18.04.1.egg-info
-
10/21/2019 03:49:16 PM
rwxr-xr-x
📄
distro_info.py
10.68 KB
03/07/2019 07:33:56 PM
rw-r--r--
📁
distro_info_test
-
10/21/2019 03:49:40 PM
rwxr-xr-x
📄
easy_install.py
126 bytes
03/18/2018 02:41:50 PM
rw-r--r--
📁
future
-
07/12/2020 04:36:17 PM
rwxr-xr-x
📁
future-0.15.2.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
gi
-
10/21/2019 03:49:07 PM
rwxr-xr-x
📁
httplib2
-
05/09/2024 07:15:03 AM
rwxr-xr-x
📄
httplib2-0.9.2.egg-info
2.22 KB
12/15/2020 08:09:40 PM
rw-r--r--
📁
hyperlink
-
10/21/2019 03:49:51 PM
rwxr-xr-x
📁
hyperlink-17.3.1.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
icu
-
07/12/2020 04:36:17 PM
rwxr-xr-x
📁
idna
-
10/21/2019 03:49:42 PM
rwxr-xr-x
📁
idna-2.6.egg-info
-
10/21/2019 03:49:19 PM
rwxr-xr-x
📁
incremental
-
10/21/2019 03:49:40 PM
rwxr-xr-x
📁
incremental-16.10.1.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
janitor
-
10/28/2024 08:41:33 AM
rwxr-xr-x
📁
jinja2
-
10/21/2019 03:49:48 PM
rwxr-xr-x
📁
josepy
-
07/12/2020 04:36:18 PM
rwxr-xr-x
📁
josepy-1.1.0.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
jsonpatch-1.16.egg-info
-
10/21/2019 03:49:31 PM
rwxr-xr-x
📄
jsonpatch.py
26.19 KB
06/15/2017 03:41:06 PM
rw-r--r--
📁
jsonpickle
-
05/25/2021 01:14:27 PM
rwxr-xr-x
📄
jsonpickle-0.9.5.egg-info
1.01 KB
08/21/2017 09:29:37 AM
rw-r--r--
📁
jsonpointer-1.10.egg-info
-
10/21/2019 03:49:31 PM
rwxr-xr-x
📄
jsonpointer.py
9.15 KB
10/28/2015 07:06:37 PM
rw-r--r--
📁
jsonschema
-
10/21/2019 03:49:46 PM
rwxr-xr-x
📁
jsonschema-2.6.0.egg-info
-
10/21/2019 03:49:31 PM
rwxr-xr-x
📁
jwt
-
07/20/2022 06:59:45 AM
rwxr-xr-x
📁
keyring
-
05/09/2024 06:58:01 AM
rwxr-xr-x
📁
keyring-10.6.0.egg-info
-
05/09/2024 06:57:57 AM
rwxr-xr-x
📁
keyrings
-
05/09/2024 06:57:57 AM
rwxr-xr-x
📁
keyrings.alt-3.0.egg-info
-
05/09/2024 06:57:57 AM
rwxr-xr-x
📁
landscape
-
05/09/2024 07:14:55 AM
rwxr-xr-x
📁
language_selector-0.1.egg-info
-
10/21/2019 03:49:13 PM
rwxr-xr-x
📄
language_support_pkgs.py
9.89 KB
11/16/2017 08:34:16 PM
rw-r--r--
📁
libfuturize
-
07/12/2020 04:36:17 PM
rwxr-xr-x
📁
libpasteurize
-
07/12/2020 04:36:18 PM
rwxr-xr-x
📄
lsb_release.py
14.09 KB
08/07/2017 09:55:07 PM
rw-r--r--
📁
markupsafe
-
10/21/2019 03:49:45 PM
rwxr-xr-x
📁
mock
-
07/12/2020 04:36:16 PM
rwxr-xr-x
📁
mock-2.0.0.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
ndg
-
07/12/2020 04:36:18 PM
rwxr-xr-x
📁
ndg_httpsclient-0.4.4.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
netifaces-0.10.4.egg-info
-
10/21/2019 03:49:07 PM
rwxr-xr-x
📄
netifaces.cpython-36m-x86_64-linux-gnu.so
18.59 KB
08/04/2017 06:49:42 AM
rw-r--r--
📁
numpy
-
10/28/2024 08:45:52 AM
rwxr-xr-x
📁
numpy-1.13.3.egg-info
-
10/28/2024 08:45:52 AM
rwxr-xr-x
📁
oauthlib
-
10/21/2019 03:49:53 PM
rwxr-xr-x
📁
oauthlib-2.0.6.egg-info
-
10/21/2019 03:49:32 PM
rwxr-xr-x
📁
parsedatetime
-
07/12/2020 04:36:19 PM
rwxr-xr-x
📁
parsedatetime-2.4.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
past
-
07/12/2020 04:36:18 PM
rwxr-xr-x
📁
pbr
-
07/12/2020 04:36:16 PM
rwxr-xr-x
📁
pbr-3.1.1.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
pexpect
-
09/28/2022 06:45:12 AM
rwxr-xr-x
📄
pexpect-4.2.1.egg-info
2.23 KB
12/12/2016 02:59:09 PM
rw-r--r--
📁
pip
-
05/09/2024 06:58:02 AM
rwxr-xr-x
📁
pip-9.0.1.egg-info
-
05/09/2024 06:57:57 AM
rwxr-xr-x
📁
pkg_resources
-
05/09/2024 06:58:00 AM
rwxr-xr-x
📄
problem_report.py
26.28 KB
11/11/2019 09:57:56 PM
rw-r--r--
📁
ptyprocess
-
09/28/2022 06:45:11 AM
rwxr-xr-x
📁
pyOpenSSL-17.5.0.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
pyRFC3339-1.0.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
pyasn1
-
10/21/2019 03:49:47 PM
rwxr-xr-x
📁
pyasn1-0.4.2.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
pyasn1_modules
-
10/21/2019 03:49:49 PM
rwxr-xr-x
📄
pyasn1_modules-0.2.1.egg-info
1.68 KB
01/02/2018 11:18:24 AM
rw-r--r--
📄
pycrypto-2.6.1.egg-info
666 bytes
04/03/2018 01:26:21 PM
rw-r--r--
📄
pygobject-3.26.1.egg-info
1013 bytes
01/29/2019 12:46:03 PM
rw-r--r--
📁
pygtkcompat
-
10/21/2019 03:49:07 PM
rwxr-xr-x
📁
pyrfc3339
-
07/12/2020 04:36:19 PM
rwxr-xr-x
📄
pyserial-3.4.egg-info
1.62 KB
04/09/2018 11:57:25 AM
rw-r--r--
📄
python_apt-1.6.6.egg-info
226 bytes
12/01/2022 12:36:29 PM
rw-r--r--
📁
python_debian-0.1.32.egg-info
-
10/21/2019 03:49:15 PM
rwxr-xr-x
📁
python_digitalocean-1.13.2.egg-info
-
05/25/2021 01:14:26 PM
rwxr-xr-x
📁
pytz
-
07/12/2020 04:36:19 PM
rwxr-xr-x
📁
pytz-2018.3.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📄
pyxdg-0.25.egg-info
576 bytes
01/07/2021 02:49:21 AM
rw-r--r--
📁
requests
-
10/21/2019 03:49:53 PM
rwxr-xr-x
📁
requests-2.18.4.egg-info
-
10/21/2019 03:49:19 PM
rwxr-xr-x
📁
requests_toolbelt
-
07/12/2020 04:36:15 PM
rwxr-xr-x
📁
requests_toolbelt-0.8.0.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📁
requests_unixsocket
-
10/21/2019 03:50:04 PM
rwxr-xr-x
📁
requests_unixsocket-0.1.5.egg-info
-
10/21/2019 03:49:19 PM
rwxr-xr-x
📁
secretstorage
-
05/09/2024 06:58:01 AM
rwxr-xr-x
📁
serial
-
10/21/2019 03:49:40 PM
rwxr-xr-x
📁
service_identity
-
10/21/2019 03:50:02 PM
rwxr-xr-x
📁
service_identity-16.0.0.egg-info
-
10/21/2019 03:49:23 PM
rwxr-xr-x
📁
setuptools
-
05/09/2024 06:58:03 AM
rwxr-xr-x
📁
setuptools-39.0.1.egg-info
-
05/09/2024 06:57:58 AM
rwxr-xr-x
📁
six-1.11.0.egg-info
-
10/21/2019 03:49:15 PM
rwxr-xr-x
📄
six.py
30.16 KB
09/17/2017 06:46:32 PM
rw-r--r--
📄
snack.py
30.4 KB
01/12/2018 04:42:24 PM
rw-r--r--
📁
softwareproperties
-
05/09/2024 07:14:38 AM
rwxr-xr-x
📁
sos
-
03/17/2025 09:32:20 AM
rwxr-xr-x
📄
sos-4.4.egg-info
312 bytes
11/21/2024 02:52:56 PM
rw-r--r--
📁
ssh_import_id
-
10/21/2019 03:50:07 PM
rwxr-xr-x
📁
ssh_import_id-5.7.egg-info
-
10/21/2019 03:49:39 PM
rwxr-xr-x
📁
systemd
-
10/21/2019 03:49:48 PM
rwxr-xr-x
📄
systemd_python-234.egg-info
586 bytes
08/05/2017 04:28:04 PM
rw-r--r--
📁
twisted
-
03/31/2022 06:22:38 AM
rwxr-xr-x
📁
uaclient
-
10/28/2024 08:41:34 AM
rwxr-xr-x
📁
ubuntu_pro_client-8001.egg-info
-
10/28/2024 08:41:32 AM
rwxr-xr-x
📁
ufw
-
05/09/2024 07:15:19 AM
rwxr-xr-x
📄
ufw-0.36.egg-info
261 bytes
10/25/2021 05:30:24 PM
rw-r--r--
📁
unattended_upgrades-0.1.egg-info
-
05/09/2024 07:14:27 AM
rwxr-xr-x
📁
urllib3
-
10/07/2020 06:14:10 AM
rwxr-xr-x
📁
urllib3-1.22.egg-info
-
10/07/2020 06:14:10 AM
rwxr-xr-x
📄
validate.py
46.13 KB
08/26/2014 01:11:36 AM
rw-r--r--
📁
wheel
-
05/09/2024 06:58:00 AM
rwxr-xr-x
📁
wheel-0.30.0.egg-info
-
05/09/2024 06:57:58 AM
rwxr-xr-x
📁
xdg
-
05/09/2024 06:57:59 AM
rwxr-xr-x
📁
yaml
-
10/21/2019 03:48:44 PM
rwxr-xr-x
📁
zope
-
05/09/2024 07:14:32 AM
rwxr-xr-x
📄
zope.component-4.3.0-nspkg.pth
529 bytes
02/05/2018 01:00:17 PM
rw-r--r--
📁
zope.component-4.3.0.egg-info
-
07/12/2020 04:36:15 PM
rwxr-xr-x
📄
zope.event-4.2.0-nspkg.pth
299 bytes
03/25/2016 05:44:58 PM
rw-r--r--
📁
zope.event-4.2.0.egg-info
-
07/12/2020 04:36:15 PM
rwxr-xr-x
📄
zope.hookable-4.0.4-nspkg.pth
529 bytes
02/05/2018 12:24:34 PM
rw-r--r--
📁
zope.hookable-4.0.4.egg-info
-
07/12/2020 04:36:14 PM
rwxr-xr-x
📄
zope.interface-4.3.2-nspkg.pth
529 bytes
02/04/2018 09:30:45 AM
rw-r--r--
📁
zope.interface-4.3.2.egg-info
-
05/09/2024 07:14:26 AM
rwxr-xr-x
Editing: lsb_release.py
Close
#!/usr/bin/python # LSB release detection module for Debian # (C) 2005-10 Chris Lawrence <lawrencc@debian.org> # This package 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; version 2 dated June, 1991. # This package 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 package; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA # 02110-1301 USA # Python3-compatible print() function from __future__ import print_function import sys import subprocess import os import re import warnings import csv def get_distro_info(origin='Debian'): try: FileNotFoundException = FileNotFoundError except NameError: # There is no FileNotFoundError in python2 FileNotFoundException = IOError try: csvfile = open('/usr/share/distro-info/%s.csv' % origin.lower()) except FileNotFoundException: # Unknown distro, fallback to Debian csvfile = open('/usr/share/distro-info/debian.csv') reader = csv.DictReader(csvfile) global RELEASE_CODENAME_LOOKUP, RELEASES_ORDER, TESTING_CODENAME RELEASE_CODENAME_LOOKUP = { r['version']: r['series'] for r in reader if r['version']} RELEASES_ORDER = list(RELEASE_CODENAME_LOOKUP.items()) RELEASES_ORDER.sort(key=lambda n: float(n[0])) RELEASES_ORDER = list(list(zip(*RELEASES_ORDER))[1]) if origin.lower() == 'debian': TESTING_CODENAME = 'unknown.new.testing' RELEASES_ORDER.extend(['stable', 'proposed-updates', 'testing', 'testing-proposed-updates', 'unstable', 'sid']) csvfile.close() # Populate default distro info get_distro_info() def lookup_codename(release, unknown=None): m = re.match(r'(\d+)\.(\d+)(r(\d+))?', release) if not m: return unknown if int(m.group(1)) < 7: shortrelease = '%s.%s' % m.group(1,2) else: shortrelease = '%s' % m.group(1) return RELEASE_CODENAME_LOOKUP.get(shortrelease, unknown) # LSB compliance packages... may grow eventually PACKAGES = 'lsb-core lsb-cxx lsb-graphics lsb-desktop lsb-languages lsb-multimedia lsb-printing lsb-security' modnamere = re.compile(r'lsb-(?P<module>[a-z0-9]+)-(?P<arch>[^ ]+)(?: \(= (?P<version>[0-9.]+)\))?') def valid_lsb_versions(version, module): # If a module is ever released that only appears in >= version, deal # with that here if version == '3.0': return ['2.0', '3.0'] elif version == '3.1': if module in ('desktop', 'qt4'): return ['3.1'] elif module == 'cxx': return ['3.0', '3.1'] else: return ['2.0', '3.0', '3.1'] elif version == '3.2': if module == 'desktop': return ['3.1', '3.2'] elif module == 'qt4': return ['3.1'] elif module in ('printing', 'languages', 'multimedia'): return ['3.2'] elif module == 'cxx': return ['3.0', '3.1', '3.2'] else: return ['2.0', '3.0', '3.1', '3.2'] elif version == '4.0': if module == 'desktop': return ['3.1', '3.2', '4.0'] elif module == 'qt4': return ['3.1'] elif module in ('printing', 'languages', 'multimedia'): return ['3.2', '4.0'] elif module == 'security': return ['4.0'] elif module == 'cxx': return ['3.0', '3.1', '3.2', '4.0'] else: return ['2.0', '3.0', '3.1', '3.2', '4.0'] elif version == '4.1': if module == 'desktop': return ['3.1', '3.2', '4.0', '4.1'] elif module == 'qt4': return ['3.1'] elif module in ('printing', 'languages', 'multimedia'): return ['3.2', '4.0', '4.1'] elif module == 'security': return ['4.0', '4.1'] elif module == 'cxx': return ['3.0', '3.1', '3.2', '4.0', '4.1'] else: return ['2.0', '3.0', '3.1', '3.2', '4.0', '4.1'] return [version] try: set # introduced in 2.4 except NameError: import sets set = sets.Set # This is Debian-specific at present def check_modules_installed(): # Find which LSB modules are installed on this system C_env = os.environ.copy(); C_env['LC_ALL'] = 'C' output = subprocess.Popen(['dpkg-query','-f',"${Version} ${Provides}\n",'-W'] + PACKAGES.split(), env=C_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True).communicate()[0].decode('utf-8') if not output: return [] modules = set() for line in output.split(os.linesep): if not line: break version, provides = line.split(' ', 1) # Debian package versions can be 3.2-$REV, 3.2+$REV or 3.2~$REV. version = re.split('[-+~]', version, 1)[0] for pkg in provides.split(','): mob = modnamere.search(pkg) if not mob: continue mgroups = mob.groupdict() # If no versioned provides... if mgroups.get('version'): module = '%(module)s-%(version)s-%(arch)s' % mgroups modules.add(module) else: module = mgroups['module'] for v in valid_lsb_versions(version, module): mgroups['version'] = v module = '%(module)s-%(version)s-%(arch)s' % mgroups modules.add(module) modules = list(modules) modules.sort() return modules longnames = {'v' : 'version', 'o': 'origin', 'a': 'suite', 'c' : 'component', 'l': 'label'} def parse_policy_line(data): retval = {} bits = data.split(',') for bit in bits: kv = bit.split('=', 1) if len(kv) > 1: k, v = kv[:2] if k in longnames: retval[longnames[k]] = v return retval def release_index(x): suite = x[1].get('suite') if suite: if suite in RELEASES_ORDER: return int(len(RELEASES_ORDER) - RELEASES_ORDER.index(suite)) else: try: return float(suite) except ValueError: return 0 return 0 def compare_release(x, y): warnings.warn('compare_release(x,y) is deprecated; please use the release_index(x) as key for sort() instead.', DeprecationWarning, stacklevel=2) suite_x_i = release_index(x) suite_y_i = release_index(y) try: return suite_x_i - suite_y_i except TypeError: return (suite_x_i > suite_y_i) - (suite_x_i < suite_y_i) def parse_apt_policy(): data = [] C_env = os.environ.copy(); C_env['LC_ALL'] = 'C.UTF-8' policy = subprocess.Popen(['apt-cache','policy'], env=C_env, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True).communicate()[0].decode('utf-8') for line in policy.split('\n'): line = line.strip() m = re.match(r'(-?\d+)', line) if m: priority = int(m.group(1)) if line.startswith('release'): bits = line.split(' ', 1) if len(bits) > 1: data.append( (priority, parse_policy_line(bits[1])) ) return data def guess_release_from_apt(origin='Debian', component='main', ignoresuites=('experimental'), label='Debian', alternate_olabels={'Debian Ports': ('ftp.ports.debian.org', 'ftp.debian-ports.org')}): releases = parse_apt_policy() if not releases: return None # We only care about the specified origin, component, and label releases = [x for x in releases if ( x[1].get('origin', '') == origin and x[1].get('suite', '') not in ignoresuites and x[1].get('component', '') == component and x[1].get('label', '') == label) or ( x[1].get('origin', '') in alternate_olabels and x[1].get('label', '') in alternate_olabels.get(x[1].get('origin', '')))] # Check again to make sure we didn't wipe out all of the releases if not releases: return None releases.sort(key=lambda tuple: tuple[0],reverse=True) # We've sorted the list by descending priority, so the first entry should # be the "main" release in use on the system max_priority = releases[0][0] releases = [x for x in releases if x[0] == max_priority] releases.sort(key=release_index) return releases[0][1] def guess_debian_release(): distinfo = {} distinfo['ID'] = 'Debian' # Use /etc/dpkg/origins/default to fetch the distribution name etc_dpkg_origins_default = os.environ.get('LSB_ETC_DPKG_ORIGINS_DEFAULT','/etc/dpkg/origins/default') if os.path.exists(etc_dpkg_origins_default): try: with open(etc_dpkg_origins_default) as dpkg_origins_file: for line in dpkg_origins_file: try: (header, content) = line.split(': ', 1) header = header.lower() content = content.strip() if header == 'vendor': distinfo['ID'] = content except ValueError: pass except IOError as msg: print('Unable to open ' + etc_dpkg_origins_default + ':', str(msg), file=sys.stderr) # Populate RELEASES_ORDER for the correct distro get_distro_info(distinfo['ID']) kern = os.uname()[0] if kern in ('Linux', 'Hurd', 'NetBSD'): distinfo['OS'] = 'GNU/'+kern elif kern == 'FreeBSD': distinfo['OS'] = 'GNU/k'+kern elif kern in ('GNU/Linux', 'GNU/kFreeBSD'): distinfo['OS'] = kern else: distinfo['OS'] = 'GNU' distinfo['DESCRIPTION'] = '%(ID)s %(OS)s' % distinfo etc_debian_version = os.environ.get('LSB_ETC_DEBIAN_VERSION','/etc/debian_version') if os.path.exists(etc_debian_version): try: with open(etc_debian_version) as debian_version: release = debian_version.read().strip() except IOError as msg: print('Unable to open ' + etc_debian_version + ':', str(msg), file=sys.stderr) release = 'unknown' if not release[0:1].isalpha(): # /etc/debian_version should be numeric codename = lookup_codename(release, 'n/a') distinfo.update({ 'RELEASE' : release, 'CODENAME' : codename }) elif release.endswith('/sid'): if release.rstrip('/sid').lower() != 'testing': global TESTING_CODENAME TESTING_CODENAME = release.rstrip('/sid') distinfo['RELEASE'] = 'testing/unstable' else: distinfo['RELEASE'] = release # Only use apt information if we did not get the proper information # from /etc/debian_version or if we don't have a codename # (which will happen if /etc/debian_version does not contain a # number but some text like 'testing/unstable' or 'lenny/sid') # # This is slightly faster and less error prone in case the user # has an entry in his /etc/apt/sources.list but has not actually # upgraded the system. if not distinfo.get('CODENAME'): rinfo = guess_release_from_apt() if rinfo: release = rinfo.get('version') # Special case Debian-Ports as their Release file has 'version': '1.0' if release == '1.0' and rinfo.get('origin') == 'Debian Ports' and rinfo.get('label') in ('ftp.ports.debian.org', 'ftp.debian-ports.org'): release = None rinfo.update({'suite': 'unstable'}) if release: codename = lookup_codename(release, 'n/a') else: release = rinfo.get('suite', 'unstable') if release == 'testing': # Would be nice if I didn't have to hardcode this. codename = TESTING_CODENAME else: codename = 'sid' distinfo.update({ 'RELEASE' : release, 'CODENAME' : codename }) if distinfo.get('RELEASE'): distinfo['DESCRIPTION'] += ' %(RELEASE)s' % distinfo if distinfo.get('CODENAME'): distinfo['DESCRIPTION'] += ' (%(CODENAME)s)' % distinfo return distinfo # Whatever is guessed above can be overridden in /etc/lsb-release def get_lsb_information(): distinfo = {} etc_lsb_release = os.environ.get('LSB_ETC_LSB_RELEASE','/etc/lsb-release') if os.path.exists(etc_lsb_release): try: with open(etc_lsb_release) as lsb_release_file: for line in lsb_release_file: line = line.strip() if not line: continue # Skip invalid lines if not '=' in line: continue var, arg = line.split('=', 1) if var.startswith('DISTRIB_'): var = var[8:] if arg.startswith('"') and arg.endswith('"'): arg = arg[1:-1] if arg: # Ignore empty arguments distinfo[var] = arg.strip() except IOError as msg: print('Unable to open ' + etc_lsb_release + ':', str(msg), file=sys.stderr) return distinfo def get_distro_information(): lsbinfo = get_lsb_information() # OS is only used inside guess_debian_release anyway for key in ('ID', 'RELEASE', 'CODENAME', 'DESCRIPTION',): if key not in lsbinfo: distinfo = guess_debian_release() distinfo.update(lsbinfo) return distinfo else: return lsbinfo def test(): print(get_distro_information()) print(check_modules_installed()) if __name__ == '__main__': test()