Linux vps-61133.fhnet.fr 4.9.0-19-amd64 #1 SMP Debian 4.9.320-2 (2022-06-30) x86_64
Apache/2.4.25 (Debian)
Server IP : 93.113.207.21 & Your IP : 216.73.216.35
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
usr /
lib /
python2.7 /
Delete
Unzip
Name
Size
Permission
Date
Action
bsddb
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
compiler
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
config-x86_64-linux-gnu
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
ctypes
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
curses
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
dist-packages
[ DIR ]
drwxrwxrwx
2022-03-20 10:38
distutils
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
email
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
encodings
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
ensurepip
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
hotshot
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
importlib
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
json
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
lib-dynload
[ DIR ]
drwxrwxrwx
2022-03-20 10:35
lib-tk
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
lib2to3
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
logging
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
multiprocessing
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
plat-x86_64-linux-gnu
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
pydoc_data
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
sqlite3
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
test
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
unittest
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
wsgiref
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
xml
[ DIR ]
drwxrwxrwx
2022-03-20 10:36
BaseHTTPServer.py
22.21
KB
-rw-r--r--
2022-02-06 21:16
BaseHTTPServer.pyc
21.17
KB
-rw-r--r--
2022-03-20 10:36
Bastion.py
5.61
KB
-rw-r--r--
2022-02-06 21:16
Bastion.pyc
6.47
KB
-rw-r--r--
2022-03-20 10:36
CGIHTTPServer.py
12.78
KB
-rw-r--r--
2022-02-06 21:16
CGIHTTPServer.pyc
10.73
KB
-rw-r--r--
2022-03-20 10:36
ConfigParser.py
27.1
KB
-rw-r--r--
2022-02-06 21:16
ConfigParser.pyc
24.51
KB
-rw-r--r--
2022-03-20 10:36
Cookie.py
25.92
KB
-rw-r--r--
2022-02-06 21:16
Cookie.pyc
22.05
KB
-rw-r--r--
2022-03-20 10:36
DocXMLRPCServer.py
10.52
KB
-rw-r--r--
2022-02-06 21:16
DocXMLRPCServer.pyc
9.92
KB
-rw-r--r--
2022-03-20 10:36
HTMLParser.py
16.73
KB
-rw-r--r--
2022-02-06 21:16
HTMLParser.pyc
13.34
KB
-rw-r--r--
2022-03-20 10:36
LICENSE.txt
12.47
KB
-rw-r--r--
2022-02-06 21:16
MimeWriter.py
6.33
KB
-rw-r--r--
2022-02-06 21:16
MimeWriter.pyc
7.17
KB
-rw-r--r--
2022-03-20 10:36
Queue.py
8.38
KB
-rw-r--r--
2022-02-06 21:16
Queue.pyc
9.15
KB
-rw-r--r--
2022-03-20 10:36
SimpleHTTPServer.py
7.81
KB
-rw-r--r--
2022-02-06 21:16
SimpleHTTPServer.pyc
7.8
KB
-rw-r--r--
2022-03-20 10:36
SimpleXMLRPCServer.py
25.21
KB
-rw-r--r--
2022-02-06 21:16
SimpleXMLRPCServer.pyc
22.26
KB
-rw-r--r--
2022-03-20 10:36
SocketServer.py
23.24
KB
-rw-r--r--
2022-02-06 21:16
SocketServer.pyc
23.39
KB
-rw-r--r--
2022-03-20 10:36
StringIO.py
10.41
KB
-rw-r--r--
2022-02-06 21:16
StringIO.pyc
11.17
KB
-rw-r--r--
2022-03-20 10:36
UserDict.py
6.89
KB
-rw-r--r--
2022-02-06 21:16
UserDict.pyc
9.4
KB
-rw-r--r--
2022-03-20 10:36
UserList.py
3.56
KB
-rw-r--r--
2022-02-06 21:16
UserList.pyc
6.36
KB
-rw-r--r--
2022-03-20 10:36
UserString.py
9.46
KB
-rwxr-xr-x
2022-02-06 21:16
UserString.pyc
14.38
KB
-rw-r--r--
2022-03-20 10:36
_LWPCookieJar.py
6.4
KB
-rw-r--r--
2022-02-06 21:16
_LWPCookieJar.pyc
5.29
KB
-rw-r--r--
2022-03-20 10:36
_MozillaCookieJar.py
5.66
KB
-rw-r--r--
2022-02-06 21:16
_MozillaCookieJar.pyc
4.35
KB
-rw-r--r--
2022-03-20 10:36
__future__.py
4.28
KB
-rw-r--r--
2022-02-06 21:16
__future__.pyc
4.11
KB
-rw-r--r--
2022-03-20 10:36
__phello__.foo.py
64
B
-rw-r--r--
2022-02-06 21:16
__phello__.foo.pyc
123
B
-rw-r--r--
2022-03-20 10:36
_abcoll.py
18.18
KB
-rw-r--r--
2022-02-06 21:16
_abcoll.pyc
24.88
KB
-rw-r--r--
2022-03-20 10:36
_osx_support.py
18.65
KB
-rw-r--r--
2022-02-06 21:16
_osx_support.pyc
11.45
KB
-rw-r--r--
2022-03-20 10:36
_pyio.py
67.96
KB
-rw-r--r--
2022-02-06 21:16
_pyio.pyc
62.82
KB
-rw-r--r--
2022-03-20 10:36
_strptime.py
20.24
KB
-rw-r--r--
2022-02-06 21:16
_strptime.pyc
14.77
KB
-rw-r--r--
2022-03-20 10:36
_sysconfigdata.py
126
B
-rw-r--r--
2022-02-06 21:16
_sysconfigdata.pyc
279
B
-rw-r--r--
2022-03-20 10:36
_threading_local.py
7.28
KB
-rw-r--r--
2022-02-06 21:16
_threading_local.pyc
6.4
KB
-rw-r--r--
2022-03-20 10:36
_weakrefset.py
5.77
KB
-rw-r--r--
2022-02-06 21:16
_weakrefset.pyc
9.36
KB
-rw-r--r--
2022-03-20 10:36
abc.py
6.98
KB
-rw-r--r--
2022-02-06 21:16
abc.pyc
5.98
KB
-rw-r--r--
2022-03-20 10:36
aifc.py
33.49
KB
-rw-r--r--
2022-02-06 21:16
aifc.pyc
29.5
KB
-rw-r--r--
2022-03-20 10:36
antigravity.py
60
B
-rw-r--r--
2022-02-06 21:16
antigravity.pyc
201
B
-rw-r--r--
2022-03-20 10:36
anydbm.py
2.6
KB
-rw-r--r--
2022-02-06 21:16
anydbm.pyc
2.73
KB
-rw-r--r--
2022-03-20 10:36
argparse.egg-info
217
B
-rw-r--r--
2022-02-06 21:16
argparse.py
87.04
KB
-rw-r--r--
2022-02-06 21:16
argparse.pyc
62.54
KB
-rw-r--r--
2022-03-20 10:36
ast.py
11.53
KB
-rw-r--r--
2022-02-06 21:16
ast.pyc
12.59
KB
-rw-r--r--
2022-03-20 10:36
asynchat.py
11.33
KB
-rw-r--r--
2022-02-06 21:16
asynchat.pyc
8.55
KB
-rw-r--r--
2022-03-20 10:36
asyncore.py
20.36
KB
-rw-r--r--
2022-02-06 21:16
asyncore.pyc
18.28
KB
-rw-r--r--
2022-03-20 10:36
atexit.py
1.67
KB
-rw-r--r--
2022-02-06 21:16
atexit.pyc
2.14
KB
-rw-r--r--
2022-03-20 10:36
audiodev.py
7.42
KB
-rw-r--r--
2022-02-06 21:16
audiodev.pyc
8.22
KB
-rw-r--r--
2022-03-20 10:36
base64.py
11.53
KB
-rwxr-xr-x
2022-02-06 21:16
base64.pyc
11
KB
-rw-r--r--
2022-03-20 10:36
bdb.py
21.21
KB
-rw-r--r--
2022-02-06 21:16
bdb.pyc
18.53
KB
-rw-r--r--
2022-03-20 10:36
binhex.py
14.35
KB
-rw-r--r--
2022-02-06 21:16
binhex.pyc
15
KB
-rw-r--r--
2022-03-20 10:36
bisect.py
2.53
KB
-rw-r--r--
2022-02-06 21:16
bisect.pyc
2.99
KB
-rw-r--r--
2022-03-20 10:36
cProfile.py
6.36
KB
-rwxr-xr-x
2022-02-06 21:16
cProfile.pyc
6.13
KB
-rw-r--r--
2022-03-20 10:36
calendar.py
22.84
KB
-rw-r--r--
2022-02-06 21:16
calendar.pyc
27.1
KB
-rw-r--r--
2022-03-20 10:36
cgi.py
34.35
KB
-rwxr-xr-x
2022-02-06 21:16
cgi.pyc
31.92
KB
-rw-r--r--
2022-03-20 10:36
cgitb.py
11.89
KB
-rw-r--r--
2022-02-06 21:16
cgitb.pyc
11.85
KB
-rw-r--r--
2022-03-20 10:36
chunk.py
5.29
KB
-rw-r--r--
2022-02-06 21:16
chunk.pyc
5.45
KB
-rw-r--r--
2022-03-20 10:36
cmd.py
14.67
KB
-rw-r--r--
2022-02-06 21:16
cmd.pyc
13.67
KB
-rw-r--r--
2022-03-20 10:36
code.py
9.95
KB
-rw-r--r--
2022-02-06 21:16
code.pyc
10.06
KB
-rw-r--r--
2022-03-20 10:36
codecs.py
35.25
KB
-rw-r--r--
2022-02-06 21:16
codecs.pyc
35.8
KB
-rw-r--r--
2022-03-20 10:36
codeop.py
5.86
KB
-rw-r--r--
2022-02-06 21:16
codeop.pyc
6.42
KB
-rw-r--r--
2022-03-20 10:36
collections.py
27.15
KB
-rw-r--r--
2022-02-06 21:16
collections.pyc
25.45
KB
-rw-r--r--
2022-03-20 10:36
colorsys.py
3.6
KB
-rw-r--r--
2022-02-06 21:16
colorsys.pyc
3.88
KB
-rw-r--r--
2022-03-20 10:36
commands.py
2.49
KB
-rw-r--r--
2022-02-06 21:16
commands.pyc
2.4
KB
-rw-r--r--
2022-03-20 10:36
compileall.py
7.58
KB
-rw-r--r--
2022-02-06 21:16
compileall.pyc
6.84
KB
-rw-r--r--
2022-03-20 10:36
contextlib.py
4.32
KB
-rw-r--r--
2022-02-06 21:16
contextlib.pyc
4.33
KB
-rw-r--r--
2022-03-20 10:36
cookielib.py
63.74
KB
-rw-r--r--
2022-02-06 21:16
cookielib.pyc
53.1
KB
-rw-r--r--
2022-03-20 10:36
copy.py
11.26
KB
-rw-r--r--
2022-02-06 21:16
copy.pyc
11.83
KB
-rw-r--r--
2022-03-20 10:36
copy_reg.py
6.64
KB
-rw-r--r--
2022-02-06 21:16
copy_reg.pyc
4.95
KB
-rw-r--r--
2022-03-20 10:36
csv.py
16.32
KB
-rw-r--r--
2022-02-06 21:16
csv.pyc
13.14
KB
-rw-r--r--
2022-03-20 10:36
dbhash.py
498
B
-rw-r--r--
2022-02-06 21:16
dbhash.pyc
714
B
-rw-r--r--
2022-03-20 10:36
decimal.py
216.73
KB
-rw-r--r--
2022-02-06 21:16
decimal.pyc
167.62
KB
-rw-r--r--
2022-03-20 10:36
difflib.py
80.4
KB
-rw-r--r--
2022-02-06 21:16
difflib.pyc
60.34
KB
-rw-r--r--
2022-03-20 10:36
dircache.py
1.1
KB
-rw-r--r--
2022-02-06 21:16
dircache.pyc
1.53
KB
-rw-r--r--
2022-03-20 10:36
dis.py
6.35
KB
-rw-r--r--
2022-02-06 21:16
dis.pyc
6.07
KB
-rw-r--r--
2022-03-20 10:36
doctest.py
102.75
KB
-rw-r--r--
2022-02-06 21:16
doctest.pyc
81.49
KB
-rw-r--r--
2022-03-20 10:36
dumbdbm.py
8.93
KB
-rw-r--r--
2022-02-06 21:16
dumbdbm.pyc
6.55
KB
-rw-r--r--
2022-03-20 10:36
dummy_thread.py
4.31
KB
-rw-r--r--
2022-02-06 21:16
dummy_thread.pyc
5.24
KB
-rw-r--r--
2022-03-20 10:36
dummy_threading.py
2.74
KB
-rw-r--r--
2022-02-06 21:16
dummy_threading.pyc
1.25
KB
-rw-r--r--
2022-03-20 10:36
filecmp.py
9.36
KB
-rw-r--r--
2022-02-06 21:16
filecmp.pyc
9.36
KB
-rw-r--r--
2022-03-20 10:36
fileinput.py
13.42
KB
-rw-r--r--
2022-02-06 21:16
fileinput.pyc
14.1
KB
-rw-r--r--
2022-03-20 10:36
fnmatch.py
3.24
KB
-rw-r--r--
2022-02-06 21:16
fnmatch.pyc
3.52
KB
-rw-r--r--
2022-03-20 10:36
formatter.py
14.56
KB
-rw-r--r--
2022-02-06 21:16
formatter.pyc
18.58
KB
-rw-r--r--
2022-03-20 10:36
fpformat.py
4.59
KB
-rw-r--r--
2022-02-06 21:16
fpformat.pyc
4.55
KB
-rw-r--r--
2022-03-20 10:36
fractions.py
21.87
KB
-rw-r--r--
2022-02-06 21:16
fractions.pyc
19.17
KB
-rw-r--r--
2022-03-20 10:36
ftplib.py
37.23
KB
-rw-r--r--
2022-02-06 21:16
ftplib.pyc
33.81
KB
-rw-r--r--
2022-03-20 10:36
functools.py
4.37
KB
-rw-r--r--
2022-02-06 21:16
functools.pyc
5.86
KB
-rw-r--r--
2022-03-20 10:36
genericpath.py
3.13
KB
-rw-r--r--
2022-02-06 21:16
genericpath.pyc
3.41
KB
-rw-r--r--
2022-03-20 10:36
getopt.py
7.15
KB
-rw-r--r--
2022-02-06 21:16
getopt.pyc
6.48
KB
-rw-r--r--
2022-03-20 10:36
getpass.py
5.43
KB
-rw-r--r--
2022-02-06 21:16
getpass.pyc
4.62
KB
-rw-r--r--
2022-03-20 10:36
gettext.py
22.06
KB
-rw-r--r--
2022-02-06 21:16
gettext.pyc
17.45
KB
-rw-r--r--
2022-03-20 10:36
glob.py
3.04
KB
-rw-r--r--
2022-02-06 21:16
glob.pyc
2.86
KB
-rw-r--r--
2022-03-20 10:36
gzip.py
18.58
KB
-rw-r--r--
2022-02-06 21:16
gzip.pyc
14.78
KB
-rw-r--r--
2022-03-20 10:36
hashlib.py
7.66
KB
-rw-r--r--
2022-02-06 21:16
hashlib.pyc
6.73
KB
-rw-r--r--
2022-03-20 10:36
heapq.py
17.87
KB
-rw-r--r--
2022-02-06 21:16
heapq.pyc
14.19
KB
-rw-r--r--
2022-03-20 10:36
hmac.py
4.48
KB
-rw-r--r--
2022-02-06 21:16
hmac.pyc
4.42
KB
-rw-r--r--
2022-03-20 10:36
htmlentitydefs.py
17.63
KB
-rw-r--r--
2022-02-06 21:16
htmlentitydefs.pyc
6.22
KB
-rw-r--r--
2022-03-20 10:36
htmllib.py
12.57
KB
-rw-r--r--
2022-02-06 21:16
htmllib.pyc
19.66
KB
-rw-r--r--
2022-03-20 10:36
httplib.py
50.26
KB
-rw-r--r--
2022-02-06 21:16
httplib.pyc
35.86
KB
-rw-r--r--
2022-03-20 10:36
ihooks.py
18.54
KB
-rw-r--r--
2022-02-06 21:16
ihooks.pyc
20.74
KB
-rw-r--r--
2022-03-20 10:36
imaplib.py
47.28
KB
-rw-r--r--
2022-02-06 21:16
imaplib.pyc
44.07
KB
-rw-r--r--
2022-03-20 10:36
imghdr.py
3.46
KB
-rw-r--r--
2022-02-06 21:16
imghdr.pyc
4.69
KB
-rw-r--r--
2022-03-20 10:36
imputil.py
25.16
KB
-rw-r--r--
2022-02-06 21:16
imputil.pyc
15.18
KB
-rw-r--r--
2022-03-20 10:36
inspect.py
41.62
KB
-rw-r--r--
2022-02-06 21:16
inspect.pyc
38.97
KB
-rw-r--r--
2022-03-20 10:36
io.py
3.24
KB
-rw-r--r--
2022-02-06 21:16
io.pyc
3.5
KB
-rw-r--r--
2022-03-20 10:36
keyword.py
1.95
KB
-rwxr-xr-x
2022-02-06 21:16
keyword.pyc
2.05
KB
-rw-r--r--
2022-03-20 10:36
linecache.py
3.93
KB
-rw-r--r--
2022-02-06 21:16
linecache.pyc
3.18
KB
-rw-r--r--
2022-03-20 10:36
locale.py
97.19
KB
-rw-r--r--
2022-02-06 21:16
locale.pyc
53.69
KB
-rw-r--r--
2022-03-20 10:36
macpath.py
6.14
KB
-rw-r--r--
2022-02-06 21:16
macpath.pyc
7.46
KB
-rw-r--r--
2022-03-20 10:36
macurl2path.py
2.67
KB
-rw-r--r--
2022-02-06 21:16
macurl2path.pyc
2.18
KB
-rw-r--r--
2022-03-20 10:36
mailbox.py
79.34
KB
-rw-r--r--
2022-02-06 21:16
mailbox.pyc
74.49
KB
-rw-r--r--
2022-03-20 10:36
mailcap.py
7.25
KB
-rw-r--r--
2022-02-06 21:16
mailcap.pyc
6.89
KB
-rw-r--r--
2022-03-20 10:36
markupbase.py
14.3
KB
-rw-r--r--
2022-02-06 21:16
markupbase.pyc
9.02
KB
-rw-r--r--
2022-03-20 10:36
md5.py
358
B
-rw-r--r--
2022-02-06 21:16
md5.pyc
376
B
-rw-r--r--
2022-03-20 10:36
mhlib.py
32.65
KB
-rw-r--r--
2022-02-06 21:16
mhlib.pyc
32.83
KB
-rw-r--r--
2022-03-20 10:36
mimetools.py
7
KB
-rw-r--r--
2022-02-06 21:16
mimetools.pyc
7.97
KB
-rw-r--r--
2022-03-20 10:36
mimetypes.py
20.45
KB
-rw-r--r--
2022-02-06 21:16
mimetypes.pyc
17.96
KB
-rw-r--r--
2022-03-20 10:36
mimify.py
14.67
KB
-rwxr-xr-x
2022-02-06 21:16
mimify.pyc
11.69
KB
-rw-r--r--
2022-03-20 10:36
modulefinder.py
23.89
KB
-rw-r--r--
2022-02-06 21:16
modulefinder.pyc
18.61
KB
-rw-r--r--
2022-03-20 10:36
multifile.py
4.71
KB
-rw-r--r--
2022-02-06 21:16
multifile.pyc
5.26
KB
-rw-r--r--
2022-03-20 10:36
mutex.py
1.83
KB
-rw-r--r--
2022-02-06 21:16
mutex.pyc
2.44
KB
-rw-r--r--
2022-03-20 10:36
netrc.py
5.73
KB
-rw-r--r--
2022-02-06 21:16
netrc.pyc
4.54
KB
-rw-r--r--
2022-03-20 10:36
new.py
610
B
-rw-r--r--
2022-02-06 21:16
new.pyc
860
B
-rw-r--r--
2022-03-20 10:36
nntplib.py
20.97
KB
-rw-r--r--
2022-02-06 21:16
nntplib.pyc
20.46
KB
-rw-r--r--
2022-03-20 10:36
ntpath.py
18.97
KB
-rw-r--r--
2022-02-06 21:16
ntpath.pyc
12.78
KB
-rw-r--r--
2022-03-20 10:36
nturl2path.py
2.36
KB
-rw-r--r--
2022-02-06 21:16
nturl2path.pyc
1.77
KB
-rw-r--r--
2022-03-20 10:36
numbers.py
10.08
KB
-rw-r--r--
2022-02-06 21:16
numbers.pyc
13.56
KB
-rw-r--r--
2022-03-20 10:36
opcode.py
5.35
KB
-rw-r--r--
2022-02-06 21:16
opcode.pyc
5.99
KB
-rw-r--r--
2022-03-20 10:36
optparse.py
59.77
KB
-rw-r--r--
2022-02-06 21:16
optparse.pyc
52.36
KB
-rw-r--r--
2022-03-20 10:36
os.py
25.3
KB
-rw-r--r--
2022-02-06 21:16
os.pyc
24.98
KB
-rw-r--r--
2022-03-20 10:36
os2emxpath.py
4.53
KB
-rw-r--r--
2022-02-06 21:16
os2emxpath.pyc
4.4
KB
-rw-r--r--
2022-03-20 10:36
pdb.doc
7.73
KB
-rw-r--r--
2022-02-06 21:16
pdb.py
45.02
KB
-rwxr-xr-x
2022-02-06 21:16
pdb.pyc
42.42
KB
-rw-r--r--
2022-03-20 10:36
pickle.py
44.42
KB
-rw-r--r--
2022-02-06 21:16
pickle.pyc
37.45
KB
-rw-r--r--
2022-03-20 10:36
pickletools.py
72.79
KB
-rw-r--r--
2022-02-06 21:16
pickletools.pyc
55.64
KB
-rw-r--r--
2022-03-20 10:36
pipes.py
9.36
KB
-rw-r--r--
2022-02-06 21:16
pipes.pyc
9.06
KB
-rw-r--r--
2022-03-20 10:36
pkgutil.py
19.87
KB
-rw-r--r--
2022-02-06 21:16
pkgutil.pyc
18.42
KB
-rw-r--r--
2022-03-20 10:36
platform.py
51.38
KB
-rwxr-xr-x
2022-02-06 21:16
platform.pyc
36.84
KB
-rw-r--r--
2022-03-20 10:36
plistlib.py
14.83
KB
-rw-r--r--
2022-02-06 21:16
plistlib.pyc
18.67
KB
-rw-r--r--
2022-03-20 10:36
popen2.py
8.22
KB
-rw-r--r--
2022-02-06 21:16
popen2.pyc
8.78
KB
-rw-r--r--
2022-03-20 10:36
poplib.py
12.52
KB
-rw-r--r--
2022-02-06 21:16
poplib.pyc
12.97
KB
-rw-r--r--
2022-03-20 10:36
posixfile.py
7.82
KB
-rw-r--r--
2022-02-06 21:16
posixfile.pyc
7.45
KB
-rw-r--r--
2022-03-20 10:36
posixpath.py
13.61
KB
-rw-r--r--
2022-02-06 21:16
posixpath.pyc
11.12
KB
-rw-r--r--
2022-03-20 10:36
pprint.py
11.5
KB
-rw-r--r--
2022-02-06 21:16
pprint.pyc
9.92
KB
-rw-r--r--
2022-03-20 10:36
profile.py
22.25
KB
-rwxr-xr-x
2022-02-06 21:16
profile.pyc
15.99
KB
-rw-r--r--
2022-03-20 10:36
pstats.py
26.09
KB
-rw-r--r--
2022-02-06 21:16
pstats.pyc
24.31
KB
-rw-r--r--
2022-03-20 10:36
pty.py
4.94
KB
-rw-r--r--
2022-02-06 21:16
pty.pyc
4.83
KB
-rw-r--r--
2022-03-20 10:36
py_compile.py
6.14
KB
-rw-r--r--
2022-02-06 21:16
py_compile.pyc
6.46
KB
-rw-r--r--
2022-03-20 10:36
pyclbr.py
13.07
KB
-rw-r--r--
2022-02-06 21:16
pyclbr.pyc
9.4
KB
-rw-r--r--
2022-03-20 10:36
pydoc.py
93.56
KB
-rwxr-xr-x
2022-02-06 21:16
pydoc.pyc
89.91
KB
-rw-r--r--
2022-03-20 10:36
quopri.py
6.8
KB
-rwxr-xr-x
2022-02-06 21:16
quopri.pyc
6.4
KB
-rw-r--r--
2022-03-20 10:36
random.py
31.57
KB
-rw-r--r--
2022-02-06 21:16
random.pyc
24.89
KB
-rw-r--r--
2022-03-20 10:36
re.py
13.11
KB
-rw-r--r--
2022-02-06 21:16
re.pyc
13.06
KB
-rw-r--r--
2022-03-20 10:36
repr.py
4.2
KB
-rw-r--r--
2022-02-06 21:16
repr.pyc
5.23
KB
-rw-r--r--
2022-03-20 10:36
rexec.py
19.68
KB
-rw-r--r--
2022-02-06 21:16
rexec.pyc
23.13
KB
-rw-r--r--
2022-03-20 10:36
rfc822.py
32.76
KB
-rw-r--r--
2022-02-06 21:16
rfc822.pyc
30.95
KB
-rw-r--r--
2022-03-20 10:36
rlcompleter.py
5.85
KB
-rw-r--r--
2022-02-06 21:16
rlcompleter.pyc
5.92
KB
-rw-r--r--
2022-03-20 10:36
robotparser.py
7.41
KB
-rw-r--r--
2022-02-06 21:16
robotparser.pyc
7.73
KB
-rw-r--r--
2022-03-20 10:36
runpy.py
10.82
KB
-rw-r--r--
2022-02-06 21:16
runpy.pyc
8.56
KB
-rw-r--r--
2022-03-20 10:36
sched.py
4.97
KB
-rw-r--r--
2022-02-06 21:16
sched.pyc
4.86
KB
-rw-r--r--
2022-03-20 10:36
sets.py
18.6
KB
-rw-r--r--
2022-02-06 21:16
sets.pyc
16.39
KB
-rw-r--r--
2022-03-20 10:36
sgmllib.py
17.46
KB
-rw-r--r--
2022-02-06 21:16
sgmllib.pyc
14.98
KB
-rw-r--r--
2022-03-20 10:36
sha.py
393
B
-rw-r--r--
2022-02-06 21:16
sha.pyc
419
B
-rw-r--r--
2022-03-20 10:36
shelve.py
7.99
KB
-rw-r--r--
2022-02-06 21:16
shelve.pyc
9.96
KB
-rw-r--r--
2022-03-20 10:36
shlex.py
10.9
KB
-rw-r--r--
2022-02-06 21:16
shlex.pyc
7.36
KB
-rw-r--r--
2022-03-20 10:36
shutil.py
18.63
KB
-rw-r--r--
2022-02-06 21:16
shutil.pyc
18.12
KB
-rw-r--r--
2022-03-20 10:36
site.py
19.48
KB
-rw-r--r--
2022-02-06 21:16
site.pyc
19.08
KB
-rw-r--r--
2022-03-20 10:36
sitecustomize.py
155
B
-rw-r--r--
2017-11-24 18:33
sitecustomize.pyc
232
B
-rw-r--r--
2022-03-20 10:36
smtpd.py
18.11
KB
-rwxr-xr-x
2022-02-06 21:16
smtpd.pyc
15.45
KB
-rw-r--r--
2022-03-20 10:36
smtplib.py
31.35
KB
-rwxr-xr-x
2022-02-06 21:16
smtplib.pyc
29.47
KB
-rw-r--r--
2022-03-20 10:36
sndhdr.py
5.83
KB
-rw-r--r--
2022-02-06 21:16
sndhdr.pyc
7.16
KB
-rw-r--r--
2022-03-20 10:36
socket.py
20.13
KB
-rw-r--r--
2022-02-06 21:16
socket.pyc
15.71
KB
-rw-r--r--
2022-03-20 10:36
sre.py
384
B
-rw-r--r--
2022-02-06 21:16
sre.pyc
517
B
-rw-r--r--
2022-03-20 10:36
sre_compile.py
19.35
KB
-rw-r--r--
2022-02-06 21:16
sre_compile.pyc
12.24
KB
-rw-r--r--
2022-03-20 10:36
sre_constants.py
7.03
KB
-rw-r--r--
2022-02-06 21:16
sre_constants.pyc
6.04
KB
-rw-r--r--
2022-03-20 10:36
sre_parse.py
28.23
KB
-rw-r--r--
2022-02-06 21:16
sre_parse.pyc
19.48
KB
-rw-r--r--
2022-03-20 10:36
ssl.py
36.92
KB
-rw-r--r--
2022-02-06 21:16
ssl.pyc
31.47
KB
-rw-r--r--
2022-03-20 10:36
stat.py
1.8
KB
-rw-r--r--
2022-02-06 21:16
stat.pyc
2.67
KB
-rw-r--r--
2022-03-20 10:36
statvfs.py
898
B
-rw-r--r--
2022-02-06 21:16
statvfs.pyc
618
B
-rw-r--r--
2022-03-20 10:36
string.py
21.04
KB
-rw-r--r--
2022-02-06 21:16
string.pyc
19.88
KB
-rw-r--r--
2022-03-20 10:36
stringold.py
12.16
KB
-rw-r--r--
2022-02-06 21:16
stringold.pyc
12.2
KB
-rw-r--r--
2022-03-20 10:36
stringprep.py
13.21
KB
-rw-r--r--
2022-02-06 21:16
stringprep.pyc
14.11
KB
-rw-r--r--
2022-03-20 10:36
struct.py
82
B
-rw-r--r--
2022-02-06 21:16
struct.pyc
237
B
-rw-r--r--
2022-03-20 10:36
subprocess.py
48.26
KB
-rw-r--r--
2022-02-06 21:16
subprocess.pyc
30.8
KB
-rw-r--r--
2022-03-20 10:36
sunau.py
16.82
KB
-rw-r--r--
2022-02-06 21:16
sunau.pyc
17.87
KB
-rw-r--r--
2022-03-20 10:36
sunaudio.py
1.37
KB
-rw-r--r--
2022-02-06 21:16
sunaudio.pyc
1.93
KB
-rw-r--r--
2022-03-20 10:36
symbol.py
2.01
KB
-rwxr-xr-x
2022-02-06 21:16
symbol.pyc
2.95
KB
-rw-r--r--
2022-03-20 10:36
symtable.py
7.26
KB
-rw-r--r--
2022-02-06 21:16
symtable.pyc
11.41
KB
-rw-r--r--
2022-03-20 10:36
sysconfig.py
24.61
KB
-rw-r--r--
2022-02-06 21:16
sysconfig.pyc
18.19
KB
-rw-r--r--
2022-03-20 10:36
tabnanny.py
11.07
KB
-rwxr-xr-x
2022-02-06 21:16
tabnanny.pyc
8.01
KB
-rw-r--r--
2022-03-20 10:36
tarfile.py
88.53
KB
-rw-r--r--
2022-02-06 21:16
tarfile.pyc
74.07
KB
-rw-r--r--
2022-03-20 10:36
telnetlib.py
26.41
KB
-rw-r--r--
2022-02-06 21:16
telnetlib.pyc
22.54
KB
-rw-r--r--
2022-03-20 10:36
tempfile.py
19.09
KB
-rw-r--r--
2022-02-06 21:16
tempfile.pyc
19.76
KB
-rw-r--r--
2022-03-20 10:36
textwrap.py
16.81
KB
-rw-r--r--
2022-02-06 21:16
textwrap.pyc
11.72
KB
-rw-r--r--
2022-03-20 10:36
this.py
1002
B
-rw-r--r--
2022-02-06 21:16
this.pyc
1.19
KB
-rw-r--r--
2022-03-20 10:36
threading.py
46.03
KB
-rw-r--r--
2022-02-06 21:16
threading.pyc
41.44
KB
-rw-r--r--
2022-03-20 10:36
timeit.py
12.49
KB
-rwxr-xr-x
2022-02-06 21:16
timeit.pyc
11.87
KB
-rw-r--r--
2022-03-20 10:36
toaiff.py
3.07
KB
-rw-r--r--
2022-02-06 21:16
toaiff.pyc
3.03
KB
-rw-r--r--
2022-03-20 10:36
token.py
2.85
KB
-rw-r--r--
2022-02-06 21:16
token.pyc
3.72
KB
-rw-r--r--
2022-03-20 10:36
tokenize.py
17.07
KB
-rw-r--r--
2022-02-06 21:16
tokenize.pyc
14.13
KB
-rw-r--r--
2022-03-20 10:36
trace.py
29.19
KB
-rwxr-xr-x
2022-02-06 21:16
trace.pyc
22.19
KB
-rw-r--r--
2022-03-20 10:36
traceback.py
11.02
KB
-rw-r--r--
2022-02-06 21:16
traceback.pyc
11.37
KB
-rw-r--r--
2022-03-20 10:36
tty.py
879
B
-rw-r--r--
2022-02-06 21:16
tty.pyc
1.28
KB
-rw-r--r--
2022-03-20 10:36
types.py
2.04
KB
-rw-r--r--
2022-02-06 21:16
types.pyc
2.65
KB
-rw-r--r--
2022-03-20 10:36
urllib.py
58.68
KB
-rw-r--r--
2022-02-06 21:16
urllib.pyc
49.75
KB
-rw-r--r--
2022-03-20 10:36
urllib2.py
51.28
KB
-rw-r--r--
2022-02-06 21:16
urllib2.pyc
45.92
KB
-rw-r--r--
2022-03-20 10:36
urlparse.py
16.06
KB
-rw-r--r--
2022-02-06 21:16
urlparse.pyc
15.07
KB
-rw-r--r--
2022-03-20 10:36
user.py
1.59
KB
-rw-r--r--
2022-02-06 21:16
user.pyc
1.68
KB
-rw-r--r--
2022-03-20 10:36
uu.py
6.4
KB
-rwxr-xr-x
2022-02-06 21:16
uu.pyc
4.2
KB
-rw-r--r--
2022-03-20 10:36
uuid.py
22.08
KB
-rw-r--r--
2022-02-06 21:16
uuid.pyc
21.95
KB
-rw-r--r--
2022-03-20 10:36
warnings.py
14.4
KB
-rw-r--r--
2022-02-06 21:16
warnings.pyc
13.12
KB
-rw-r--r--
2022-03-20 10:36
wave.py
18.15
KB
-rw-r--r--
2022-02-06 21:16
wave.pyc
19.44
KB
-rw-r--r--
2022-03-20 10:36
weakref.py
13.28
KB
-rw-r--r--
2022-02-06 21:16
weakref.pyc
15.37
KB
-rw-r--r--
2022-03-20 10:36
webbrowser.py
22.25
KB
-rwxr-xr-x
2022-02-06 21:16
webbrowser.pyc
19.26
KB
-rw-r--r--
2022-03-20 10:36
whichdb.py
3.3
KB
-rw-r--r--
2022-02-06 21:16
whichdb.pyc
2.18
KB
-rw-r--r--
2022-03-20 10:36
wsgiref.egg-info
187
B
-rw-r--r--
2022-02-06 21:16
xdrlib.py
5.93
KB
-rw-r--r--
2022-02-06 21:16
xdrlib.pyc
9.59
KB
-rw-r--r--
2022-03-20 10:36
xmllib.py
34.05
KB
-rw-r--r--
2022-02-06 21:16
xmllib.pyc
26.11
KB
-rw-r--r--
2022-03-20 10:36
xmlrpclib.py
50.91
KB
-rw-r--r--
2022-02-06 21:16
xmlrpclib.pyc
42.8
KB
-rw-r--r--
2022-03-20 10:36
zipfile.py
57.64
KB
-rw-r--r--
2022-02-06 21:16
zipfile.pyc
40.52
KB
-rw-r--r--
2022-03-20 10:36
Save
Rename
# -*- Mode: Python -*- # Id: asyncore.py,v 2.51 2000/09/07 22:29:26 rushing Exp # Author: Sam Rushing <rushing@nightmare.com> # ====================================================================== # Copyright 1996 by Sam Rushing # # All Rights Reserved # # Permission to use, copy, modify, and distribute this software and # its documentation for any purpose and without fee is hereby # granted, provided that the above copyright notice appear in all # copies and that both that copyright notice and this permission # notice appear in supporting documentation, and that the name of Sam # Rushing not be used in advertising or publicity pertaining to # distribution of the software without specific, written prior # permission. # # SAM RUSHING DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, # INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN # NO EVENT SHALL SAM RUSHING BE LIABLE FOR ANY SPECIAL, INDIRECT OR # CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS # OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, # NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN # CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. # ====================================================================== """Basic infrastructure for asynchronous socket service clients and servers. There are only two ways to have a program on a single processor do "more than one thing at a time". Multi-threaded programming is the simplest and most popular way to do it, but there is another very different technique, that lets you have nearly all the advantages of multi-threading, without actually using multiple threads. it's really only practical if your program is largely I/O bound. If your program is CPU bound, then pre-emptive scheduled threads are probably what you really need. Network servers are rarely CPU-bound, however. If your operating system supports the select() system call in its I/O library (and nearly all do), then you can use it to juggle multiple communication channels at once; doing other work while your I/O is taking place in the "background." Although this strategy can seem strange and complex, especially at first, it is in many ways easier to understand and control than multi-threaded programming. The module documented here solves many of the difficult problems for you, making the task of building sophisticated high-performance network servers and clients a snap. """ import select import socket import sys import time import warnings import os from errno import EALREADY, EINPROGRESS, EWOULDBLOCK, ECONNRESET, EINVAL, \ ENOTCONN, ESHUTDOWN, EINTR, EISCONN, EBADF, ECONNABORTED, EPIPE, EAGAIN, \ errorcode _DISCONNECTED = frozenset((ECONNRESET, ENOTCONN, ESHUTDOWN, ECONNABORTED, EPIPE, EBADF)) try: socket_map except NameError: socket_map = {} def _strerror(err): try: return os.strerror(err) except (ValueError, OverflowError, NameError): if err in errorcode: return errorcode[err] return "Unknown error %s" %err class ExitNow(Exception): pass _reraised_exceptions = (ExitNow, KeyboardInterrupt, SystemExit) def read(obj): try: obj.handle_read_event() except _reraised_exceptions: raise except: obj.handle_error() def write(obj): try: obj.handle_write_event() except _reraised_exceptions: raise except: obj.handle_error() def _exception(obj): try: obj.handle_expt_event() except _reraised_exceptions: raise except: obj.handle_error() def readwrite(obj, flags): try: if flags & select.POLLIN: obj.handle_read_event() if flags & select.POLLOUT: obj.handle_write_event() if flags & select.POLLPRI: obj.handle_expt_event() if flags & (select.POLLHUP | select.POLLERR | select.POLLNVAL): obj.handle_close() except socket.error, e: if e.args[0] not in _DISCONNECTED: obj.handle_error() else: obj.handle_close() except _reraised_exceptions: raise except: obj.handle_error() def poll(timeout=0.0, map=None): if map is None: map = socket_map if map: r = []; w = []; e = [] for fd, obj in map.items(): is_r = obj.readable() is_w = obj.writable() if is_r: r.append(fd) # accepting sockets should not be writable if is_w and not obj.accepting: w.append(fd) if is_r or is_w: e.append(fd) if [] == r == w == e: time.sleep(timeout) return try: r, w, e = select.select(r, w, e, timeout) except select.error, err: if err.args[0] != EINTR: raise else: return for fd in r: obj = map.get(fd) if obj is None: continue read(obj) for fd in w: obj = map.get(fd) if obj is None: continue write(obj) for fd in e: obj = map.get(fd) if obj is None: continue _exception(obj) def poll2(timeout=0.0, map=None): # Use the poll() support added to the select module in Python 2.0 if map is None: map = socket_map if timeout is not None: # timeout is in milliseconds timeout = int(timeout*1000) pollster = select.poll() if map: for fd, obj in map.items(): flags = 0 if obj.readable(): flags |= select.POLLIN | select.POLLPRI # accepting sockets should not be writable if obj.writable() and not obj.accepting: flags |= select.POLLOUT if flags: # Only check for exceptions if object was either readable # or writable. flags |= select.POLLERR | select.POLLHUP | select.POLLNVAL pollster.register(fd, flags) try: r = pollster.poll(timeout) except select.error, err: if err.args[0] != EINTR: raise r = [] for fd, flags in r: obj = map.get(fd) if obj is None: continue readwrite(obj, flags) poll3 = poll2 # Alias for backward compatibility def loop(timeout=30.0, use_poll=False, map=None, count=None): if map is None: map = socket_map if use_poll and hasattr(select, 'poll'): poll_fun = poll2 else: poll_fun = poll if count is None: while map: poll_fun(timeout, map) else: while map and count > 0: poll_fun(timeout, map) count = count - 1 class dispatcher: debug = False connected = False accepting = False connecting = False closing = False addr = None ignore_log_types = frozenset(['warning']) def __init__(self, sock=None, map=None): if map is None: self._map = socket_map else: self._map = map self._fileno = None if sock: # Set to nonblocking just to make sure for cases where we # get a socket from a blocking source. sock.setblocking(0) self.set_socket(sock, map) self.connected = True # The constructor no longer requires that the socket # passed be connected. try: self.addr = sock.getpeername() except socket.error, err: if err.args[0] in (ENOTCONN, EINVAL): # To handle the case where we got an unconnected # socket. self.connected = False else: # The socket is broken in some unknown way, alert # the user and remove it from the map (to prevent # polling of broken sockets). self.del_channel(map) raise else: self.socket = None def __repr__(self): status = [self.__class__.__module__+"."+self.__class__.__name__] if self.accepting and self.addr: status.append('listening') elif self.connected: status.append('connected') if self.addr is not None: try: status.append('%s:%d' % self.addr) except TypeError: status.append(repr(self.addr)) return '<%s at %#x>' % (' '.join(status), id(self)) __str__ = __repr__ def add_channel(self, map=None): #self.log_info('adding channel %s' % self) if map is None: map = self._map map[self._fileno] = self def del_channel(self, map=None): fd = self._fileno if map is None: map = self._map if fd in map: #self.log_info('closing channel %d:%s' % (fd, self)) del map[fd] self._fileno = None def create_socket(self, family, type): self.family_and_type = family, type sock = socket.socket(family, type) sock.setblocking(0) self.set_socket(sock) def set_socket(self, sock, map=None): self.socket = sock ## self.__dict__['socket'] = sock self._fileno = sock.fileno() self.add_channel(map) def set_reuse_addr(self): # try to re-use a server port if possible try: self.socket.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR) | 1 ) except socket.error: pass # ================================================== # predicates for select() # these are used as filters for the lists of sockets # to pass to select(). # ================================================== def readable(self): return True def writable(self): return True # ================================================== # socket object methods. # ================================================== def listen(self, num): self.accepting = True if os.name == 'nt' and num > 5: num = 5 return self.socket.listen(num) def bind(self, addr): self.addr = addr return self.socket.bind(addr) def connect(self, address): self.connected = False self.connecting = True err = self.socket.connect_ex(address) if err in (EINPROGRESS, EALREADY, EWOULDBLOCK) \ or err == EINVAL and os.name in ('nt', 'ce'): self.addr = address return if err in (0, EISCONN): self.addr = address self.handle_connect_event() else: raise socket.error(err, errorcode[err]) def accept(self): # XXX can return either an address pair or None try: conn, addr = self.socket.accept() except TypeError: return None except socket.error as why: if why.args[0] in (EWOULDBLOCK, ECONNABORTED, EAGAIN): return None else: raise else: return conn, addr def send(self, data): try: result = self.socket.send(data) return result except socket.error, why: if why.args[0] == EWOULDBLOCK: return 0 elif why.args[0] in _DISCONNECTED: self.handle_close() return 0 else: raise def recv(self, buffer_size): try: data = self.socket.recv(buffer_size) if not data: # a closed connection is indicated by signaling # a read condition, and having recv() return 0. self.handle_close() return '' else: return data except socket.error, why: # winsock sometimes raises ENOTCONN if why.args[0] in _DISCONNECTED: self.handle_close() return '' else: raise def close(self): self.connected = False self.accepting = False self.connecting = False self.del_channel() try: self.socket.close() except socket.error, why: if why.args[0] not in (ENOTCONN, EBADF): raise # cheap inheritance, used to pass all other attribute # references to the underlying socket object. def __getattr__(self, attr): try: retattr = getattr(self.socket, attr) except AttributeError: raise AttributeError("%s instance has no attribute '%s'" %(self.__class__.__name__, attr)) else: msg = "%(me)s.%(attr)s is deprecated. Use %(me)s.socket.%(attr)s " \ "instead." % {'me': self.__class__.__name__, 'attr':attr} warnings.warn(msg, DeprecationWarning, stacklevel=2) return retattr # log and log_info may be overridden to provide more sophisticated # logging and warning methods. In general, log is for 'hit' logging # and 'log_info' is for informational, warning and error logging. def log(self, message): sys.stderr.write('log: %s\n' % str(message)) def log_info(self, message, type='info'): if type not in self.ignore_log_types: print '%s: %s' % (type, message) def handle_read_event(self): if self.accepting: # accepting sockets are never connected, they "spawn" new # sockets that are connected self.handle_accept() elif not self.connected: if self.connecting: self.handle_connect_event() self.handle_read() else: self.handle_read() def handle_connect_event(self): err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) if err != 0: raise socket.error(err, _strerror(err)) self.handle_connect() self.connected = True self.connecting = False def handle_write_event(self): if self.accepting: # Accepting sockets shouldn't get a write event. # We will pretend it didn't happen. return if not self.connected: if self.connecting: self.handle_connect_event() self.handle_write() def handle_expt_event(self): # handle_expt_event() is called if there might be an error on the # socket, or if there is OOB data # check for the error condition first err = self.socket.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR) if err != 0: # we can get here when select.select() says that there is an # exceptional condition on the socket # since there is an error, we'll go ahead and close the socket # like we would in a subclassed handle_read() that received no # data self.handle_close() else: self.handle_expt() def handle_error(self): nil, t, v, tbinfo = compact_traceback() # sometimes a user repr method will crash. try: self_repr = repr(self) except: self_repr = '<__repr__(self) failed for object at %0x>' % id(self) self.log_info( 'uncaptured python exception, closing channel %s (%s:%s %s)' % ( self_repr, t, v, tbinfo ), 'error' ) self.handle_close() def handle_expt(self): self.log_info('unhandled incoming priority event', 'warning') def handle_read(self): self.log_info('unhandled read event', 'warning') def handle_write(self): self.log_info('unhandled write event', 'warning') def handle_connect(self): self.log_info('unhandled connect event', 'warning') def handle_accept(self): self.log_info('unhandled accept event', 'warning') def handle_close(self): self.log_info('unhandled close event', 'warning') self.close() # --------------------------------------------------------------------------- # adds simple buffered output capability, useful for simple clients. # [for more sophisticated usage use asynchat.async_chat] # --------------------------------------------------------------------------- class dispatcher_with_send(dispatcher): def __init__(self, sock=None, map=None): dispatcher.__init__(self, sock, map) self.out_buffer = '' def initiate_send(self): num_sent = 0 num_sent = dispatcher.send(self, self.out_buffer[:512]) self.out_buffer = self.out_buffer[num_sent:] def handle_write(self): self.initiate_send() def writable(self): return (not self.connected) or len(self.out_buffer) def send(self, data): if self.debug: self.log_info('sending %s' % repr(data)) self.out_buffer = self.out_buffer + data self.initiate_send() # --------------------------------------------------------------------------- # used for debugging. # --------------------------------------------------------------------------- def compact_traceback(): t, v, tb = sys.exc_info() tbinfo = [] if not tb: # Must have a traceback raise AssertionError("traceback does not exist") while tb: tbinfo.append(( tb.tb_frame.f_code.co_filename, tb.tb_frame.f_code.co_name, str(tb.tb_lineno) )) tb = tb.tb_next # just to be safe del tb file, function, line = tbinfo[-1] info = ' '.join(['[%s|%s|%s]' % x for x in tbinfo]) return (file, function, line), t, v, info def close_all(map=None, ignore_all=False): if map is None: map = socket_map for x in map.values(): try: x.close() except OSError, x: if x.args[0] == EBADF: pass elif not ignore_all: raise except _reraised_exceptions: raise except: if not ignore_all: raise map.clear() # Asynchronous File I/O: # # After a little research (reading man pages on various unixen, and # digging through the linux kernel), I've determined that select() # isn't meant for doing asynchronous file i/o. # Heartening, though - reading linux/mm/filemap.c shows that linux # supports asynchronous read-ahead. So _MOST_ of the time, the data # will be sitting in memory for us already when we go to read it. # # What other OS's (besides NT) support async file i/o? [VMS?] # # Regardless, this is useful for pipes, and stdin/stdout... if os.name == 'posix': import fcntl class file_wrapper: # Here we override just enough to make a file # look like a socket for the purposes of asyncore. # The passed fd is automatically os.dup()'d def __init__(self, fd): self.fd = os.dup(fd) def recv(self, *args): return os.read(self.fd, *args) def send(self, *args): return os.write(self.fd, *args) def getsockopt(self, level, optname, buflen=None): if (level == socket.SOL_SOCKET and optname == socket.SO_ERROR and not buflen): return 0 raise NotImplementedError("Only asyncore specific behaviour " "implemented.") read = recv write = send def close(self): os.close(self.fd) def fileno(self): return self.fd class file_dispatcher(dispatcher): def __init__(self, fd, map=None): dispatcher.__init__(self, None, map) self.connected = True try: fd = fd.fileno() except AttributeError: pass self.set_file(fd) # set it to non-blocking mode flags = fcntl.fcntl(fd, fcntl.F_GETFL, 0) flags = flags | os.O_NONBLOCK fcntl.fcntl(fd, fcntl.F_SETFL, flags) def set_file(self, fd): self.socket = file_wrapper(fd) self._fileno = self.socket.fileno() self.add_channel()