Linux tsuru-no-tsurugi 5.15.0-186-generic #196-Ubuntu SMP Sat Jun 20 16:09:34 UTC 2026 x86_64
Apache/2.4.52 (Ubuntu)
Server IP : 192.168.0.18 & Your IP : 216.73.216.68
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
lib /
python3 /
dist-packages /
Delete
Unzip
Name
Size
Permission
Date
Action
Automat-20.2.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
Babel-2.8.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
CommandNotFound
[ DIR ]
drwxr-xr-x
2024-02-17 03:50
ConfigArgParse-1.5.3.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
DistUpgrade
[ DIR ]
drwxr-xr-x
2024-10-14 20:22
HweSupportStatus
[ DIR ]
drwxr-xr-x
2025-12-31 20:42
Jinja2-3.0.3.egg-info
[ DIR ]
drwxr-xr-x
2025-03-13 06:42
Markdown-3.3.6.egg-info
[ DIR ]
drwxr-xr-x
2024-09-07 23:28
MarkupSafe-2.0.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
NvidiaDetector
[ DIR ]
drwxr-xr-x
2026-05-02 01:35
OpenSSL
[ DIR ]
drwxr-xr-x
2026-03-24 06:23
PyGObject-3.42.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
PyHamcrest-2.0.2.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
PyICU-2.8.1.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
PyJWT-2.3.0.egg-info
[ DIR ]
drwxr-xr-x
2026-04-02 06:36
PyYAML-5.4.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
Pygments-2.11.2.egg-info
[ DIR ]
drwxr-xr-x
2024-11-28 06:27
Quirks
[ DIR ]
drwxr-xr-x
2026-05-02 01:35
SecretStorage-3.3.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
Twisted-22.1.0.egg-info
[ DIR ]
drwxr-xr-x
2026-06-05 06:15
UbuntuDrivers
[ DIR ]
drwxr-xr-x
2026-05-02 01:35
UpdateManager
[ DIR ]
drwxr-xr-x
2025-12-31 20:42
__pycache__
[ DIR ]
drwxr-xr-x
2025-08-05 06:05
_distutils_hack
[ DIR ]
drwxr-xr-x
2025-05-31 06:21
_yaml
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
acme
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
acme-1.21.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
apport
[ DIR ]
drwxr-xr-x
2025-08-05 06:05
apt
[ DIR ]
drwxr-xr-x
2025-12-31 20:41
apt_inst-stubs
[ DIR ]
drwxr-xr-x
2025-12-31 20:36
apt_pkg-stubs
[ DIR ]
drwxr-xr-x
2025-12-31 20:36
aptsources
[ DIR ]
drwxr-xr-x
2025-12-31 20:41
asgiref
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
asgiref-3.5.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
attr
[ DIR ]
drwxr-xr-x
2025-12-31 20:38
attrs-21.2.0.egg-info
[ DIR ]
drwxr-xr-x
2025-12-31 20:37
automat
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
babel
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
bcrypt
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
bcrypt-3.2.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
blinker
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
certbot
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
certbot-1.21.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
certbot_apache
[ DIR ]
drwxr-xr-x
2024-08-28 22:15
certbot_apache-1.21.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 22:15
certifi
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
certifi-2020.6.20.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
chardet
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
chardet-4.0.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
click
[ DIR ]
drwxr-xr-x
2024-02-17 03:46
click-8.0.3.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
cloud_init-26.1.egg-info
[ DIR ]
drwxr-xr-x
2026-06-23 20:31
cloudinit
[ DIR ]
drwxr-xr-x
2026-06-23 20:32
colorama
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
colorama-0.4.4.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
configobj-5.0.6.egg-info
[ DIR ]
drwxr-xr-x
2024-09-28 06:05
constantly
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
constantly-15.1.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
cryptography
[ DIR ]
drwxr-xr-x
2026-03-18 06:24
cryptography-3.4.8.egg-info
[ DIR ]
drwxr-xr-x
2026-03-18 06:24
dbus
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
dbus_python-1.2.18.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
debian
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
debian_bundle
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
distro
[ DIR ]
drwxr-xr-x
2024-02-17 03:46
distro-1.7.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
distro_info-1.1+ubuntu0.2.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
dns
[ DIR ]
drwxr-xr-x
2024-09-07 23:28
dnspython-2.1.0.egg-info
[ DIR ]
drwxr-xr-x
2024-09-07 23:28
elftools
[ DIR ]
drwxr-xr-x
2024-08-21 22:43
firewall
[ DIR ]
drwxr-xr-x
2024-08-29 14:24
gi
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
gpg
[ DIR ]
drwxr-xr-x
2024-09-07 23:28
h11
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
h11-0.13.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
hamcrest
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
httplib2
[ DIR ]
drwxr-xr-x
2026-07-16 06:20
httplib2-0.20.2.egg-info
[ DIR ]
drwxr-xr-x
2026-07-16 06:20
hyperlink
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
hyperlink-21.0.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
icu
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
idna
[ DIR ]
drwxr-xr-x
2026-07-17 06:48
idna-3.3.egg-info
[ DIR ]
drwxr-xr-x
2026-07-17 06:48
importlib_metadata
[ DIR ]
drwxr-xr-x
2024-02-17 03:46
importlib_metadata-4.6.4.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
incremental
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
incremental-21.3.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
janitor
[ DIR ]
drwxr-xr-x
2025-12-31 20:42
jeepney
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
jeepney-0.7.1.dist-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
jinja2
[ DIR ]
drwxr-xr-x
2025-03-13 06:42
josepy
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
josepy-1.10.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
jsonpatch-1.32.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
jsonpointer-2.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
jsonschema
[ DIR ]
drwxr-xr-x
2024-02-17 03:46
jsonschema-3.2.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
jwt
[ DIR ]
drwxr-xr-x
2026-04-02 06:36
keyring
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
keyring-23.5.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
landscape
[ DIR ]
drwxr-xr-x
2025-12-31 20:41
launchpadlib
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
launchpadlib-1.10.16.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
lazr
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
lazr.restfulclient-0.14.4.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
lazr.uri-1.0.6.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
magic
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
markdown
[ DIR ]
drwxr-xr-x
2024-09-07 23:28
markupsafe
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
more_itertools
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
more_itertools-8.10.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
netifaces-0.11.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
netplan
[ DIR ]
drwxr-xr-x
2026-06-23 20:30
nftables
[ DIR ]
drwxr-xr-x
2026-05-02 01:34
oauthlib
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
oauthlib-3.2.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
ovs
[ DIR ]
drwxr-xr-x
2026-06-23 20:31
ovs-2.17.9.egg-info
[ DIR ]
drwxr-xr-x
2026-06-23 20:31
packaging
[ DIR ]
drwxr-xr-x
2025-02-27 13:15
packaging-21.3.egg-info
[ DIR ]
drwxr-xr-x
2025-02-27 13:13
parsedatetime
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
parsedatetime-2.6.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
pexpect
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
pip
[ DIR ]
drwxr-xr-x
2025-12-31 20:39
pip-22.0.2.dist-info
[ DIR ]
drwxr-xr-x
2025-12-31 20:37
pkg_resources
[ DIR ]
drwxr-xr-x
2025-05-31 06:21
ptyprocess
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
ptyprocess-0.7.0.dist-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
pyOpenSSL-21.0.0.egg-info
[ DIR ]
drwxr-xr-x
2026-03-24 06:23
pyRFC3339-1.1.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
pyasn1
[ DIR ]
drwxr-xr-x
2026-03-31 06:50
pyasn1-0.4.8.egg-info
[ DIR ]
drwxr-xr-x
2026-03-31 06:50
pyasn1_modules
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
pyelftools-0.27.egg-info
[ DIR ]
drwxr-xr-x
2024-08-21 22:43
pygments
[ DIR ]
drwxr-xr-x
2024-11-28 06:27
pygtkcompat
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
pyparsing-2.4.7.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
pyrfc3339
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
pyrsistent
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
pyrsistent-0.18.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
pyserial-3.5.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
python_apt-2.4.0+ubuntu4.1.egg-info
[ DIR ]
drwxr-xr-x
2025-12-31 20:36
python_debian-0.1.43+ubuntu1.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
python_magic-0.4.24.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
pytz
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
pytz-2022.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
requests
[ DIR ]
drwxr-xr-x
2025-06-17 06:46
requests-2.25.1.egg-info
[ DIR ]
drwxr-xr-x
2025-06-17 06:46
requests_toolbelt
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
requests_toolbelt-0.9.1.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
samba
[ DIR ]
drwxr-xr-x
2026-05-28 07:00
secretstorage
[ DIR ]
drwxr-xr-x
2024-02-17 03:46
serial
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
service_identity
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
service_identity-18.1.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
setuptools
[ DIR ]
drwxr-xr-x
2025-05-31 06:21
setuptools-59.6.0.egg-info
[ DIR ]
drwxr-xr-x
2025-05-31 06:21
six-1.16.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:44
softwareproperties
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
sortedcontainers
[ DIR ]
drwxr-xr-x
2024-08-21 22:43
sortedcontainers-2.1.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-21 22:43
sos
[ DIR ]
drwxr-xr-x
2026-05-02 01:34
sos-4.10.2.egg-info
[ DIR ]
drwxr-xr-x
2026-05-02 01:33
speedtest_cli-2.1.3.egg-info
[ DIR ]
drwxr-xr-x
2025-03-14 22:12
ssh_import_id
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
ssh_import_id-5.11.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
supervisor
[ DIR ]
drwxr-xr-x
2025-02-27 19:58
supervisor-4.2.1.egg-info
[ DIR ]
drwxr-xr-x
2025-02-27 19:58
systemd
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
twisted
[ DIR ]
drwxr-xr-x
2026-06-05 06:15
uaclient
[ DIR ]
drwxr-xr-x
2026-07-18 06:45
ubuntu_drivers_common-0.0.0.egg-info
[ DIR ]
drwxr-xr-x
2026-05-02 01:32
ubuntu_pro_client-8001.egg-info
[ DIR ]
drwxr-xr-x
2026-07-18 06:45
ufw
[ DIR ]
drwxr-xr-x
2024-02-17 03:50
unattended_upgrades-0.1.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
urllib3
[ DIR ]
drwxr-xr-x
2026-06-05 06:15
urllib3-1.26.5.egg-info
[ DIR ]
drwxr-xr-x
2026-06-05 06:15
uvicorn
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
uvicorn-0.15.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
wadllib
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
wadllib-1.3.6.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
wheel
[ DIR ]
drwxr-xr-x
2025-02-27 13:31
wheel-0.37.1.egg-info
[ DIR ]
drwxr-xr-x
2025-02-27 13:31
wsproto
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
wsproto-1.0.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-30 00:22
xkit
[ DIR ]
drwxr-xr-x
2024-02-17 03:45
yaml
[ DIR ]
drwxr-xr-x
2024-02-17 03:53
zipp-1.0.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-21 00:25
zope
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
zope.component-4.3.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
zope.event-4.4.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
zope.hookable-5.1.0.egg-info
[ DIR ]
drwxr-xr-x
2024-08-28 00:25
zope.interface-5.4.0.egg-info
[ DIR ]
drwxr-xr-x
2024-02-17 03:51
_capng.cpython-310-x86_64-linux-gnu.so
45.24
KB
-rw-r--r--
2022-01-14 04:33
_cffi_backend.cpython-310-x86_64-linux-gnu.so
189.91
KB
-rw-r--r--
2022-03-25 18:57
_dbus_bindings.cpython-310-x86_64-linux-gnu.so
164.21
KB
-rw-r--r--
2022-03-18 02:50
_dbus_glib_bindings.cpython-310-x86_64-linux-gnu.so
22.5
KB
-rw-r--r--
2022-03-18 02:50
_ldb_text.py
3.45
KB
-rw-r--r--
2020-08-28 22:28
_pyrsistent_version.py
23
B
-rw-r--r--
2022-01-15 04:50
_snack.cpython-310-x86_64-linux-gnu.so
46.77
KB
-rw-r--r--
2022-03-18 04:30
_tdb_text.py
3.27
KB
-rw-r--r--
2020-01-21 23:09
_version.py
21
B
-rw-r--r--
2014-08-26 10:11
apport_python_hook.py
7.87
KB
-rw-r--r--
2024-07-10 20:56
apt_inst.cpython-310-x86_64-linux-gnu.so
58.66
KB
-rw-r--r--
2025-12-06 02:18
apt_pkg.cpython-310-x86_64-linux-gnu.so
338.96
KB
-rw-r--r--
2025-12-06 02:18
augeas.py
23
KB
-rw-r--r--
2014-09-01 02:18
blinker-1.4.egg-info
3.81
KB
-rw-r--r--
2021-10-26 02:42
capng.py
6.09
KB
-rw-r--r--
2022-01-14 04:33
command_not_found-0.3.egg-info
189
B
-rw-r--r--
2021-12-08 19:53
configargparse.py
48.71
KB
-rw-r--r--
2021-10-03 09:15
configobj.py
87.51
KB
-rw-r--r--
2024-09-20 20:44
deb822.py
273
B
-rw-r--r--
2022-01-16 17:42
debconf.py
6.61
KB
-rw-r--r--
2022-02-20 23:42
distro_info.py
12.23
KB
-rw-r--r--
2023-11-28 21:16
gpg-1.16.0-py3.10.egg-info
2.21
KB
-rw-r--r--
2023-09-28 09:17
jsonpatch.py
28.14
KB
-rw-r--r--
2021-03-14 04:14
jsonpointer.py
9.57
KB
-rw-r--r--
2018-01-17 00:18
ldb.cpython-310-x86_64-linux-gnu.so
102.24
KB
-rw-r--r--
2023-03-30 21:16
lsb_release.py
14.55
KB
-rw-r--r--
2019-08-26 06:11
netifaces.cpython-310-x86_64-linux-gnu.so
22.69
KB
-rw-r--r--
2022-03-25 01:20
nftables-0.1-py3.10.egg-info
623
B
-rw-r--r--
2026-02-24 17:38
pexpect-4.8.0.egg-info
2.23
KB
-rw-r--r--
2021-08-09 19:01
problem_report.py
26.24
KB
-rw-r--r--
2024-07-10 20:56
pvectorc.cpython-310-x86_64-linux-gnu.so
36.67
KB
-rw-r--r--
2022-03-18 04:43
pyasn1_modules-0.2.1.egg-info
1.68
KB
-rw-r--r--
2020-04-05 09:09
pyparsing.py
266.96
KB
-rw-r--r--
2020-03-31 11:48
python_augeas-0.5.0.egg-info
238
B
-rw-r--r--
2019-10-17 11:17
six.py
33.74
KB
-rw-r--r--
2021-05-05 23:17
snack.py
30.4
KB
-rw-r--r--
2022-03-18 04:30
speedtest.py
63.6
KB
-rw-r--r--
2021-04-08 22:45
systemd_python-234.egg-info
586
B
-rw-r--r--
2022-03-18 05:07
talloc.cpython-310-x86_64-linux-gnu.so
15.63
KB
-rw-r--r--
2022-01-14 05:34
tdb.cpython-310-x86_64-linux-gnu.so
36.29
KB
-rw-r--r--
2022-01-14 05:34
ufw-0.36.1.egg-info
263
B
-rw-r--r--
2023-07-17 22:55
validate.py
46.14
KB
-rw-r--r--
2024-09-20 20:44
xkit-0.0.0.egg-info
266
B
-rw-r--r--
2022-03-24 17:20
zipp.py
6.75
KB
-rw-r--r--
2024-07-21 23:26
zope.component-4.3.0-nspkg.pth
529
B
-rw-r--r--
2019-09-21 21:28
zope.event-4.4-nspkg.pth
529
B
-rw-r--r--
2020-06-15 06:11
zope.hookable-5.1.0-nspkg.pth
529
B
-rw-r--r--
2022-03-18 05:18
zope.interface-5.4.0-nspkg.pth
529
B
-rw-r--r--
2022-03-18 02:51
Save
Rename
# coding: utf-8 from __future__ import division import io import sys import posixpath import zipfile import functools import itertools import re import more_itertools __metaclass__ = type def _parents(path): """ Given a path with elements separated by posixpath.sep, generate all parents of that path. >>> list(_parents('b/d')) ['b'] >>> list(_parents('/b/d/')) ['/b'] >>> list(_parents('b/d/f/')) ['b/d', 'b'] >>> list(_parents('b')) [] >>> list(_parents('')) [] """ return itertools.islice(_ancestry(path), 1, None) def _ancestry(path): """ Given a path with elements separated by posixpath.sep, generate all elements of that path >>> list(_ancestry('b/d')) ['b/d', 'b'] >>> list(_ancestry('/b/d/')) ['/b/d', '/b'] >>> list(_ancestry('b/d/f/')) ['b/d/f', 'b/d', 'b'] >>> list(_ancestry('b')) ['b'] >>> list(_ancestry('')) [] """ path = path.rstrip(posixpath.sep) while path and path != posixpath.sep: yield path path, tail = posixpath.split(path) class SanitizedNames: """ ZipFile mix-in to ensure names are sanitized. """ def namelist(self): return list(map(self._sanitize, super().namelist())) @staticmethod def _sanitize(name): r""" Ensure a relative path with posix separators and no dot names. Modeled after https://github.com/python/cpython/blob/bcc1be39cb1d04ad9fc0bd1b9193d3972835a57c/Lib/zipfile/__init__.py#L1799-L1813 but provides consistent cross-platform behavior. >>> san = SanitizedNames._sanitize >>> san('/foo/bar') 'foo/bar' >>> san('//foo.txt') 'foo.txt' >>> san('foo/.././bar.txt') 'foo/bar.txt' >>> san('foo../.bar.txt') 'foo../.bar.txt' >>> san('\\foo\\bar.txt') 'foo/bar.txt' >>> san('D:\\foo.txt') 'D/foo.txt' >>> san('\\\\server\\share\\file.txt') 'server/share/file.txt' >>> san('\\\\?\\GLOBALROOT\\Volume3') '?/GLOBALROOT/Volume3' >>> san('\\\\.\\PhysicalDrive1\\root') 'PhysicalDrive1/root' Retain any trailing slash. >>> san('abc/') 'abc/' Raises a ValueError if the result is empty. >>> san('../..') Traceback (most recent call last): ... ValueError: Empty filename """ def allowed(part): return part and part not in {'..', '.'} # Remove the drive letter. # Don't use ntpath.splitdrive, because that also strips UNC paths bare = re.sub('^([A-Z]):', r'\1', name, flags=re.IGNORECASE) clean = bare.replace('\\', '/') parts = clean.split('/') joined = '/'.join(filter(allowed, parts)) if not joined: raise ValueError("Empty filename") return joined + '/' * name.endswith('/') class Path: """ A pathlib-compatible interface for zip files. Consider a zip file with this structure:: . ├── a.txt └── b ├── c.txt └── d └── e.txt >>> data = io.BytesIO() >>> zf = zipfile.ZipFile(data, 'w') >>> zf.writestr('a.txt', 'content of a') >>> zf.writestr('b/c.txt', 'content of c') >>> zf.writestr('b/d/e.txt', 'content of e') >>> zf.filename = 'abcde.zip' Path accepts the zipfile object itself or a filename >>> root = Path(zf) From there, several path operations are available. Directory iteration (including the zip file itself): >>> a, b = root.iterdir() >>> a Path('abcde.zip', 'a.txt') >>> b Path('abcde.zip', 'b/') name property: >>> b.name 'b' join with divide operator: >>> c = b / 'c.txt' >>> c Path('abcde.zip', 'b/c.txt') >>> c.name 'c.txt' Read text: >>> c.read_text() 'content of c' existence: >>> c.exists() True >>> (b / 'missing.txt').exists() False Coercion to string: >>> str(c) 'abcde.zip/b/c.txt' """ __repr = "{self.__class__.__name__}({self.root.filename!r}, {self.at!r})" def __init__(self, root, at=""): self.root = ( root if isinstance(root, zipfile.ZipFile) else zipfile.ZipFile(self._pathlib_compat(root)) ) self.at = at @staticmethod def _pathlib_compat(path): """ For path-like objects, convert to a filename for compatibility on Python 3.6.1 and earlier. """ try: return path.__fspath__() except AttributeError: return str(path) @property def open(self): return functools.partial(self.root.open, self.at) @property def name(self): return posixpath.basename(self.at.rstrip("/")) def read_text(self, *args, **kwargs): with self.open() as strm: return io.TextIOWrapper(strm, *args, **kwargs).read() def read_bytes(self): with self.open() as strm: return strm.read() def _is_child(self, path): return posixpath.dirname(path.at.rstrip("/")) == self.at.rstrip("/") def _next(self, at): return Path(self.root, at) def is_dir(self): return not self.at or self.at.endswith("/") def is_file(self): return not self.is_dir() def exists(self): return self.at in self._names() def iterdir(self): if not self.is_dir(): raise ValueError("Can't listdir a file") subs = map(self._next, self._names()) return filter(self._is_child, subs) def __str__(self): return posixpath.join(self.root.filename, self.at) def __repr__(self): return self.__repr.format(self=self) def joinpath(self, add): add = self._pathlib_compat(add) next = posixpath.join(self.at, add) next_dir = posixpath.join(self.at, add, "") names = self._names() return self._next(next_dir if next not in names and next_dir in names else next) __truediv__ = joinpath @staticmethod def _implied_dirs(names): return more_itertools.unique_everseen( parent + "/" for name in names for parent in _parents(name) if parent + "/" not in names ) @classmethod def _add_implied_dirs(cls, names): return names + list(cls._implied_dirs(names)) @property def parent(self): parent_at = posixpath.dirname(self.at.rstrip('/')) if parent_at: parent_at += '/' return self._next(parent_at) def _names(self): return self._add_implied_dirs(list(map(SanitizedNames._sanitize, self.root.namelist()))) if sys.version_info < (3,): __div__ = __truediv__