/
usr
/
lib
/
python3
/
dist-packages
/
/usr/lib/python3/dist-packages
mkdir
upload
Name
Size
Mode
Actions
acme/
-
0755
rm
acme-1.21.0.egg-info/
-
0755
rm
apport/
-
0755
rm
apt/
-
0755
rm
aptsources/
-
0755
rm
apt_inst-stubs/
-
0755
rm
apt_pkg-stubs/
-
0755
rm
attr/
-
0755
rm
attrs-21.2.0.egg-info/
-
0755
rm
automat/
-
0755
rm
Automat-20.2.0.egg-info/
-
0755
rm
babel/
-
0755
rm
Babel-2.8.0.egg-info/
-
0755
rm
bcrypt/
-
0755
rm
bcrypt-3.2.0.egg-info/
-
0755
rm
beautifulsoup4-4.10.0.egg-info/
-
0755
rm
blinker/
-
0755
rm
boost/
-
0755
rm
bs4/
-
0755
rm
certbot/
-
0755
rm
certbot-1.21.0.egg-info/
-
0755
rm
certbot_apache/
-
0755
rm
certbot_apache-1.21.0.egg-info/
-
0755
rm
certbot_dns_cloudflare/
-
0755
rm
certbot_dns_cloudflare-1.18.0.egg-info/
-
0755
rm
certbot_nginx/
-
0755
rm
certbot_nginx-1.21.0.egg-info/
-
0755
rm
certifi/
-
0755
rm
certifi-2020.6.20.egg-info/
-
0755
rm
chardet/
-
0755
rm
chardet-4.0.0.egg-info/
-
0755
rm
click/
-
0755
rm
click-8.0.3.egg-info/
-
0755
rm
CloudFlare/
-
0755
rm
cloudflare-2.8.14.egg-info/
-
0755
rm
cloudinit/
-
0755
rm
cloud_init-25.3.egg-info/
-
0755
rm
colorama/
-
0755
rm
colorama-0.4.4.egg-info/
-
0755
rm
CommandNotFound/
-
0755
rm
ConfigArgParse-1.5.3.egg-info/
-
0755
rm
configobj-5.0.6.egg-info/
-
0755
rm
constantly/
-
0755
rm
constantly-15.1.0.egg-info/
-
0755
rm
cryptography/
-
0755
rm
cryptography-3.4.8.egg-info/
-
0755
rm
dbus/
-
0755
rm
dbus_python-1.2.18.egg-info/
-
0755
rm
debian/
-
0755
rm
debian_bundle/
-
0755
rm
distro/
-
0755
rm
distro-1.7.0.egg-info/
-
0755
rm
distro_info-1.1+ubuntu0.2.egg-info/
-
0755
rm
DistUpgrade/
-
0755
rm
fail2ban/
-
0755
rm
fail2ban-0.11.2.egg-info/
-
0755
rm
gi/
-
0755
rm
hamcrest/
-
0755
rm
html5lib/
-
0755
rm
html5lib-1.1.egg-info/
-
0755
rm
httplib2/
-
0755
rm
httplib2-0.20.2.egg-info/
-
0755
rm
HweSupportStatus/
-
0755
rm
hyperlink/
-
0755
rm
hyperlink-21.0.0.egg-info/
-
0755
rm
icu/
-
0755
rm
idna/
-
0755
rm
idna-3.3.egg-info/
-
0755
rm
importlib_metadata/
-
0755
rm
importlib_metadata-4.6.4.egg-info/
-
0755
rm
incremental/
-
0755
rm
incremental-21.3.0.egg-info/
-
0755
rm
janitor/
-
0755
rm
jeepney/
-
0755
rm
jeepney-0.7.1.dist-info/
-
0755
rm
jinja2/
-
0755
rm
Jinja2-3.0.3.egg-info/
-
0755
rm
josepy/
-
0755
rm
josepy-1.10.0.egg-info/
-
0755
rm
jsonpatch-1.32.egg-info/
-
0755
rm
jsonpointer-2.0.egg-info/
-
0755
rm
jsonschema/
-
0755
rm
jsonschema-3.2.0.egg-info/
-
0755
rm
jwt/
-
0755
rm
keyring/
-
0755
rm
keyring-23.5.0.egg-info/
-
0755
rm
landscape/
-
0755
rm
launchpadlib/
-
0755
rm
launchpadlib-1.10.16.egg-info/
-
0755
rm
lazr/
-
0755
rm
lazr.restfulclient-0.14.4.egg-info/
-
0755
rm
lazr.uri-1.0.6.egg-info/
-
0755
rm
lxml/
-
0755
rm
lxml-4.8.0.egg-info/
-
0755
rm
magic/
-
0755
rm
markupsafe/
-
0755
rm
MarkupSafe-2.0.1.egg-info/
-
0755
rm
more_itertools/
-
0755
rm
more_itertools-8.10.0.egg-info/
-
0755
rm
nacl/
-
0755
rm
netifaces-0.11.0.egg-info/
-
0755
rm
oauthlib/
-
0755
rm
oauthlib-3.2.0.egg-info/
-
0755
rm
OpenSSL/
-
0755
rm
packaging/
-
0755
rm
packaging-21.3.egg-info/
-
0755
rm
parsedatetime/
-
0755
rm
parsedatetime-2.6.egg-info/
-
0755
rm
pexpect/
-
0755
rm
pkg_resources/
-
0755
rm
ptyprocess/
-
0755
rm
ptyprocess-0.7.0.dist-info/
-
0755
rm
pyasn1/
-
0755
rm
pyasn1-0.4.8.egg-info/
-
0755
rm
pyasn1_modules/
-
0755
rm
PyGObject-3.42.1.egg-info/
-
0755
rm
pygtkcompat/
-
0755
rm
PyHamcrest-2.0.2.egg-info/
-
0755
rm
PyICU-2.8.1.egg-info/
-
0755
rm
PyJWT-2.3.0.egg-info/
-
0755
rm
pymacaroons/
-
0755
rm
pymacaroons-0.13.0.egg-info/
-
0755
rm
PyNaCl-1.5.0.dist-info/
-
0755
rm
pyOpenSSL-21.0.0.egg-info/
-
0755
rm
pyparsing-2.4.7.egg-info/
-
0755
rm
pyrfc3339/
-
0755
rm
pyRFC3339-1.1.egg-info/
-
0755
rm
pyrsistent/
-
0755
rm
pyrsistent-0.18.1.egg-info/
-
0755
rm
pyserial-3.5.egg-info/
-
0755
rm
python_apt-2.4.0+ubuntu4.1.egg-info/
-
0755
rm
python_debian-0.1.43+ubuntu1.1.egg-info/
-
0755
rm
python_magic-0.4.24.egg-info/
-
0755
rm
pytz/
-
0755
rm
pytz-2022.1.egg-info/
-
0755
rm
PyYAML-5.4.1.egg-info/
-
0755
rm
requests/
-
0755
rm
requests-2.25.1.egg-info/
-
0755
rm
requests_toolbelt/
-
0755
rm
requests_toolbelt-0.9.1.egg-info/
-
0755
rm
secretstorage/
-
0755
rm
SecretStorage-3.3.1.egg-info/
-
0755
rm
serial/
-
0755
rm
service_identity/
-
0755
rm
service_identity-18.1.0.egg-info/
-
0755
rm
setuptools/
-
0755
rm
setuptools-59.6.0.egg-info/
-
0755
rm
six-1.16.0.egg-info/
-
0755
rm
softwareproperties/
-
0755
rm
sos/
-
0755
rm
sos-4.10.2.egg-info/
-
0755
rm
soupsieve/
-
0755
rm
soupsieve-2.3.1.egg-info/
-
0755
rm
ssh_import_id/
-
0755
rm
ssh_import_id-5.11.egg-info/
-
0755
rm
systemd/
-
0755
rm
twisted/
-
0755
rm
Twisted-22.1.0.egg-info/
-
0755
rm
uaclient/
-
0755
rm
ubuntu_pro_client-8001.egg-info/
-
0755
rm
ufw/
-
0755
rm
unattended_upgrades-0.1.egg-info/
-
0755
rm
UpdateManager/
-
0755
rm
urllib3/
-
0755
rm
urllib3-1.26.5.egg-info/
-
0755
rm
wadllib/
-
0755
rm
wadllib-1.3.6.egg-info/
-
0755
rm
webencodings/
-
0755
rm
webencodings-0.5.1.egg-info/
-
0755
rm
yaml/
-
0755
rm
zipp-1.0.0.egg-info/
-
0755
rm
zope/
-
0755
rm
zope.component-4.3.0.egg-info/
-
0755
rm
zope.event-4.4.egg-info/
-
0755
rm
zope.hookable-5.1.0.egg-info/
-
0755
rm
zope.interface-5.4.0.egg-info/
-
0755
rm
_distutils_hack/
-
0755
rm
_yaml/
-
0755
rm
__pycache__/
-
0755
rm
apport_python_hook.py
8063
0644
edit
dl
rm
apt_inst.cpython-310-x86_64-linux-gnu.so
60064
0644
edit
dl
rm
apt_pkg.cpython-310-x86_64-linux-gnu.so
347096
0644
edit
dl
rm
augeas.py
23555
0644
edit
dl
rm
blinker-1.4.egg-info
3901
0644
edit
dl
rm
command_not_found-0.3.egg-info
189
0644
edit
dl
rm
configargparse.py
49875
0644
edit
dl
rm
configobj.py
89613
0644
edit
dl
rm
deb822.py
273
0644
edit
dl
rm
debconf.py
6769
0644
edit
dl
rm
distro_info.py
12528
0644
edit
dl
rm
jsonpatch.py
28813
0644
edit
dl
rm
jsonpointer.py
9796
0644
edit
dl
rm
lsb_release.py
14901
0644
edit
dl
rm
netifaces.cpython-310-x86_64-linux-gnu.so
23232
0644
edit
dl
rm
pexpect-4.8.0.egg-info
2285
0644
edit
dl
rm
problem_report.py
26867
0644
edit
dl
rm
pvectorc.cpython-310-x86_64-linux-gnu.so
37552
0644
edit
dl
rm
pyasn1_modules-0.2.1.egg-info
1722
0644
edit
dl
rm
pyinotify-0.9.6.egg-info
1421
0644
edit
dl
rm
pyinotify.py
89010
0644
edit
dl
rm
pyparsing.py
273365
0644
edit
dl
rm
python_augeas-0.5.0.egg-info
238
0644
edit
dl
rm
six.py
34549
0644
edit
dl
rm
snack.py
31134
0644
edit
dl
rm
systemd_python-234.egg-info
586
0644
edit
dl
rm
ufw-0.36.1.egg-info
263
0644
edit
dl
rm
validate.py
47243
0644
edit
dl
rm
zipp.py
6914
0644
edit
dl
rm
zope.component-4.3.0-nspkg.pth
529
0644
edit
dl
rm
zope.event-4.4-nspkg.pth
529
0644
edit
dl
rm
zope.hookable-5.1.0-nspkg.pth
529
0644
edit
dl
rm
zope.interface-5.4.0-nspkg.pth
529
0644
edit
dl
rm
_cffi_backend.cpython-310-x86_64-linux-gnu.so
194472
0644
edit
dl
rm
_dbus_bindings.cpython-310-x86_64-linux-gnu.so
168152
0644
edit
dl
rm
_dbus_glib_bindings.cpython-310-x86_64-linux-gnu.so
23040
0644
edit
dl
rm
_pyrsistent_version.py
23
0644
edit
dl
rm
_snack.cpython-310-x86_64-linux-gnu.so
47888
0644
edit
dl
rm
_version.py
21
0644
edit
dl
rm
Edit:
/usr/share/pyshared/lsb_release.py
(14901B)
#!/usr/bin/python # LSB release detection module for Debian # (C) 2005-10 Chris Lawrence <lawrencc@debian.org> # (C) 2018 Didier Raboud <odyx@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 /usr/lib/os-release by derivatives def get_os_release(): distinfo = {} os_release = os.environ.get('LSB_OS_RELEASE', '/usr/lib/os-release') if os.path.exists(os_release): try: with open(os_release) as os_release_file: for line in os_release_file: line = line.strip() if not line: continue # Skip invalid lines if not '=' in line: continue var, arg = line.split('=', 1) if arg.startswith('"') and arg.endswith('"'): arg = arg[1:-1] if arg: # Ignore empty arguments # Concert os-release to lsb-release-style if var == 'VERSION_ID': # It'll ignore point-releases distinfo['RELEASE'] = arg.strip() elif var == 'VERSION_CODENAME': distinfo['CODENAME'] = arg.strip() elif var == 'ID': # ID=debian distinfo['ID'] = arg.strip().title() elif var == 'PRETTY_NAME': distinfo['DESCRIPTION'] = arg.strip() except IOError as msg: print('Unable to open ' + os_release + ':', str(msg), file=sys.stderr) return distinfo def get_distro_information(): lsbinfo = get_os_release() # 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()
Save
cmd:
run