Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Z
Zope
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
Zope
Commits
58435909
Commit
58435909
authored
May 12, 2000
by
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
untabify
parent
f4a65b80
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
1193 additions
and
1193 deletions
+1193
-1193
ZServer/medusa/asyncore.py
ZServer/medusa/asyncore.py
+404
-404
ZServer/medusa/m_syslog.py
ZServer/medusa/m_syslog.py
+118
-118
lib/python/OFS/Image.py
lib/python/OFS/Image.py
+6
-6
lib/python/ThreadedAsync.py
lib/python/ThreadedAsync.py
+2
-2
lib/python/ZLogger/syslog.py
lib/python/ZLogger/syslog.py
+118
-118
lib/python/ZServer/medusa/asyncore.py
lib/python/ZServer/medusa/asyncore.py
+404
-404
lib/python/ZServer/medusa/m_syslog.py
lib/python/ZServer/medusa/m_syslog.py
+118
-118
z2.py
z2.py
+23
-23
No files found.
ZServer/medusa/asyncore.py
View file @
58435909
# -*- Mode: Python; tab-width: 4 -*-
#
Id: asyncore.py,v 2.49 2000/05/04 06:06:04 jim Exp
#
$Id: asyncore.py,v 1.9 2000/05/05 17:28:57 jim
Exp $
#
Author: Sam Rushing <rushing@nightmare.com>
#
Id: asyncore.py,v 2.49 2000/05/04 06:06:04 jim Exp
#
$Id: asyncore.py,v 1.10 2000/05/12 19:43:07 brian
Exp $
#
Author: Sam Rushing <rushing@nightmare.com>
# ======================================================================
# Copyright 1996 by Sam Rushing
...
...
@@ -34,347 +34,347 @@ import sys
import
os
if
os
.
name
==
'nt'
:
EWOULDBLOCK
=
10035
EINPROGRESS
=
10036
EALREADY
=
10037
ECONNRESET
=
10054
ENOTCONN
=
10057
ESHUTDOWN
=
10058
EWOULDBLOCK
=
10035
EINPROGRESS
=
10036
EALREADY
=
10037
ECONNRESET
=
10054
ENOTCONN
=
10057
ESHUTDOWN
=
10058
else
:
from
errno
import
EALREADY
,
EINPROGRESS
,
EWOULDBLOCK
,
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
from
errno
import
EALREADY
,
EINPROGRESS
,
EWOULDBLOCK
,
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
try
:
socket_map
socket_map
except
NameError
:
socket_map
=
{}
socket_map
=
{}
class
ExitNow
(
exceptions
.
Exception
):
pass
pass
DEBUG
=
0
def
poll
(
timeout
=
0.0
,
map
=
None
):
global
DEBUG
if
map
is
None
:
map
=
socket_map
if
map
:
r
=
[];
w
=
[];
e
=
[]
for
fd
,
obj
in
map
.
items
():
if
obj
.
readable
():
r
.
append
(
fd
)
if
obj
.
writable
():
w
.
append
(
fd
)
r
,
w
,
e
=
select
.
select
(
r
,
w
,
e
,
timeout
)
if
DEBUG
:
print
r
,
w
,
e
for
fd
in
r
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_read_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
for
fd
in
w
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
global
DEBUG
if
map
is
None
:
map
=
socket_map
if
map
:
r
=
[];
w
=
[];
e
=
[]
for
fd
,
obj
in
map
.
items
():
if
obj
.
readable
():
r
.
append
(
fd
)
if
obj
.
writable
():
w
.
append
(
fd
)
r
,
w
,
e
=
select
.
select
(
r
,
w
,
e
,
timeout
)
if
DEBUG
:
print
r
,
w
,
e
for
fd
in
r
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_read_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
for
fd
in
w
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
def
poll2
(
timeout
=
0.0
,
map
=
None
):
import
poll
if
map
is
None
:
map
=
socket_map
# timeout is in milliseconds
timeout
=
int
(
timeout
*
1000
)
if
map
:
l
=
[]
for
fd
,
obj
in
map
.
items
():
flags
=
0
if
obj
.
readable
():
flags
=
poll
.
POLLIN
if
obj
.
writable
():
flags
=
flags
|
poll
.
POLLOUT
if
flags
:
l
.
append
((
fd
,
flags
))
r
=
poll
.
poll
(
l
,
timeout
)
for
fd
,
flags
in
r
:
try
:
obj
=
map
[
fd
]
try
:
if
(
flags
&
poll
.
POLLIN
):
obj
.
handle_read_event
()
if
(
flags
&
poll
.
POLLOUT
):
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
import
poll
if
map
is
None
:
map
=
socket_map
# timeout is in milliseconds
timeout
=
int
(
timeout
*
1000
)
if
map
:
l
=
[]
for
fd
,
obj
in
map
.
items
():
flags
=
0
if
obj
.
readable
():
flags
=
poll
.
POLLIN
if
obj
.
writable
():
flags
=
flags
|
poll
.
POLLOUT
if
flags
:
l
.
append
((
fd
,
flags
))
r
=
poll
.
poll
(
l
,
timeout
)
for
fd
,
flags
in
r
:
try
:
obj
=
map
[
fd
]
try
:
if
(
flags
&
poll
.
POLLIN
):
obj
.
handle_read_event
()
if
(
flags
&
poll
.
POLLOUT
):
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
def
loop
(
timeout
=
30.0
,
use_poll
=
0
,
map
=
None
):
if
use_poll
:
poll_fun
=
poll2
else
:
poll_fun
=
poll
if
use_poll
:
poll_fun
=
poll2
else
:
poll_fun
=
poll
if
map
is
None
:
map
=
socket_map
map
=
socket_map
while
map
:
poll_fun
(
timeout
,
map
)
while
map
:
poll_fun
(
timeout
,
map
)
class
dispatcher
:
debug
=
0
connected
=
0
accepting
=
0
closing
=
0
addr
=
None
def
__init__
(
self
,
sock
=
None
,
map
=
None
):
if
sock
:
self
.
set_socket
(
sock
,
map
)
# I think it should inherit this anyway
self
.
socket
.
setblocking
(
0
)
self
.
connected
=
1
def
__repr__
(
self
):
try
:
status
=
[]
if
self
.
accepting
and
self
.
addr
:
status
.
append
(
'listening'
)
elif
self
.
connected
:
status
.
append
(
'connected'
)
if
self
.
addr
:
status
.
append
(
'%s:%d'
%
self
.
addr
)
return
'<%s %s at %x>'
%
(
self
.
__class__
.
__name__
,
string
.
join
(
status
,
' '
),
id
(
self
)
)
except
:
try
:
ar
=
repr
(
self
.
addr
)
except
:
ar
=
'no self.addr!'
return
'<__repr__ (self) failed for object at %x (addr=%s)>'
%
(
id
(
self
),
ar
)
def
add_channel
(
self
,
map
=
None
):
#self.log_info ('adding channel %s' % self)
if
map
is
None
:
map
=
socket_map
map
[
self
.
_fileno
]
=
self
def
del_channel
(
self
,
map
=
None
):
fd
=
self
.
_fileno
if
map
is
None
:
map
=
socket_map
if
map
.
has_key
(
fd
):
#self.log_info ('closing channel %d:%s' % (fd, self))
del
map
[
fd
]
def
create_socket
(
self
,
family
,
type
):
self
.
family_and_type
=
family
,
type
self
.
socket
=
socket
.
socket
(
family
,
type
)
self
.
socket
.
setblocking
(
0
)
self
.
_fileno
=
self
.
socket
.
fileno
()
self
.
add_channel
()
def
set_socket
(
self
,
sock
,
map
=
None
):
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
:
pass
# ==================================================
# predicates for select()
# these are used as filters for the lists of sockets
# to pass to select().
# ==================================================
def
readable
(
self
):
return
1
if
os
.
name
==
'mac'
:
# The macintosh will select a listening socket for
# write if you let it. What might this mean?
def
writable
(
self
):
return
not
self
.
accepting
else
:
def
writable
(
self
):
return
1
# ==================================================
# socket object methods.
# ==================================================
def
listen
(
self
,
num
):
self
.
accepting
=
1
if
os
.
name
==
'nt'
and
num
>
5
:
num
=
1
return
self
.
socket
.
listen
(
num
)
def
bind
(
self
,
addr
):
self
.
addr
=
addr
return
self
.
socket
.
bind
(
addr
)
def
connect
(
self
,
address
):
self
.
connected
=
0
try
:
self
.
socket
.
connect
(
address
)
except
socket
.
error
,
why
:
if
why
[
0
]
in
(
EINPROGRESS
,
EALREADY
,
EWOULDBLOCK
):
return
else
:
raise
socket
.
error
,
why
self
.
connected
=
1
self
.
handle_connect
()
def
accept
(
self
):
try
:
conn
,
addr
=
self
.
socket
.
accept
()
return
conn
,
addr
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
pass
else
:
raise
socket
.
error
,
why
def
send
(
self
,
data
):
try
:
result
=
self
.
socket
.
send
(
data
)
return
result
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
return
0
else
:
raise
socket
.
error
,
why
return
0
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 throws ENOTCONN
if
why
[
0
]
in
[
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
]:
self
.
handle_close
()
return
''
else
:
raise
socket
.
error
,
why
def
close
(
self
):
self
.
del_channel
()
self
.
socket
.
close
()
# cheap inheritance, used to pass all other attribute
# references to the underlying socket object.
def
__getattr__
(
self
,
attr
):
return
getattr
(
self
.
socket
,
attr
)
# log and log_info maybe overriden to provide more sophisitcated
# 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
__debug__
or
type
!=
'info'
:
print
'%s: %s'
%
(
type
,
message
)
def
handle_read_event
(
self
):
if
self
.
accepting
:
# for an accepting socket, getting a read implies
# that we are connected
if
not
self
.
connected
:
self
.
connected
=
1
self
.
handle_accept
()
elif
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_read
()
else
:
self
.
handle_read
()
def
handle_write_event
(
self
):
# getting a write implies that we are connected
if
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_write
()
def
handle_expt_event
(
self
):
self
.
handle_expt
()
def
handle_error
(
self
):
(
file
,
fun
,
line
),
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
.
close
()
def
handle_expt
(
self
):
self
.
log_info
(
'unhandled exception'
,
'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
()
debug
=
0
connected
=
0
accepting
=
0
closing
=
0
addr
=
None
def
__init__
(
self
,
sock
=
None
,
map
=
None
):
if
sock
:
self
.
set_socket
(
sock
,
map
)
# I think it should inherit this anyway
self
.
socket
.
setblocking
(
0
)
self
.
connected
=
1
def
__repr__
(
self
):
try
:
status
=
[]
if
self
.
accepting
and
self
.
addr
:
status
.
append
(
'listening'
)
elif
self
.
connected
:
status
.
append
(
'connected'
)
if
self
.
addr
:
status
.
append
(
'%s:%d'
%
self
.
addr
)
return
'<%s %s at %x>'
%
(
self
.
__class__
.
__name__
,
string
.
join
(
status
,
' '
),
id
(
self
)
)
except
:
try
:
ar
=
repr
(
self
.
addr
)
except
:
ar
=
'no self.addr!'
return
'<__repr__ (self) failed for object at %x (addr=%s)>'
%
(
id
(
self
),
ar
)
def
add_channel
(
self
,
map
=
None
):
#self.log_info ('adding channel %s' % self)
if
map
is
None
:
map
=
socket_map
map
[
self
.
_fileno
]
=
self
def
del_channel
(
self
,
map
=
None
):
fd
=
self
.
_fileno
if
map
is
None
:
map
=
socket_map
if
map
.
has_key
(
fd
):
#self.log_info ('closing channel %d:%s' % (fd, self))
del
map
[
fd
]
def
create_socket
(
self
,
family
,
type
):
self
.
family_and_type
=
family
,
type
self
.
socket
=
socket
.
socket
(
family
,
type
)
self
.
socket
.
setblocking
(
0
)
self
.
_fileno
=
self
.
socket
.
fileno
()
self
.
add_channel
()
def
set_socket
(
self
,
sock
,
map
=
None
):
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
:
pass
# ==================================================
# predicates for select()
# these are used as filters for the lists of sockets
# to pass to select().
# ==================================================
def
readable
(
self
):
return
1
if
os
.
name
==
'mac'
:
# The macintosh will select a listening socket for
# write if you let it. What might this mean?
def
writable
(
self
):
return
not
self
.
accepting
else
:
def
writable
(
self
):
return
1
# ==================================================
# socket object methods.
# ==================================================
def
listen
(
self
,
num
):
self
.
accepting
=
1
if
os
.
name
==
'nt'
and
num
>
5
:
num
=
1
return
self
.
socket
.
listen
(
num
)
def
bind
(
self
,
addr
):
self
.
addr
=
addr
return
self
.
socket
.
bind
(
addr
)
def
connect
(
self
,
address
):
self
.
connected
=
0
try
:
self
.
socket
.
connect
(
address
)
except
socket
.
error
,
why
:
if
why
[
0
]
in
(
EINPROGRESS
,
EALREADY
,
EWOULDBLOCK
):
return
else
:
raise
socket
.
error
,
why
self
.
connected
=
1
self
.
handle_connect
()
def
accept
(
self
):
try
:
conn
,
addr
=
self
.
socket
.
accept
()
return
conn
,
addr
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
pass
else
:
raise
socket
.
error
,
why
def
send
(
self
,
data
):
try
:
result
=
self
.
socket
.
send
(
data
)
return
result
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
return
0
else
:
raise
socket
.
error
,
why
return
0
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 throws ENOTCONN
if
why
[
0
]
in
[
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
]:
self
.
handle_close
()
return
''
else
:
raise
socket
.
error
,
why
def
close
(
self
):
self
.
del_channel
()
self
.
socket
.
close
()
# cheap inheritance, used to pass all other attribute
# references to the underlying socket object.
def
__getattr__
(
self
,
attr
):
return
getattr
(
self
.
socket
,
attr
)
# log and log_info maybe overriden to provide more sophisitcated
# 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
__debug__
or
type
!=
'info'
:
print
'%s: %s'
%
(
type
,
message
)
def
handle_read_event
(
self
):
if
self
.
accepting
:
# for an accepting socket, getting a read implies
# that we are connected
if
not
self
.
connected
:
self
.
connected
=
1
self
.
handle_accept
()
elif
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_read
()
else
:
self
.
handle_read
()
def
handle_write_event
(
self
):
# getting a write implies that we are connected
if
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_write
()
def
handle_expt_event
(
self
):
self
.
handle_expt
()
def
handle_error
(
self
):
(
file
,
fun
,
line
),
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
.
close
()
def
handle_expt
(
self
):
self
.
log_info
(
'unhandled exception'
,
'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.
...
...
@@ -382,63 +382,63 @@ class dispatcher:
# ---------------------------------------------------------------------------
class
dispatcher_with_send
(
dispatcher
):
def
__init__
(
self
,
sock
=
None
):
dispatcher
.
__init__
(
self
,
sock
)
self
.
out_buffer
=
''
def
__init__
(
self
,
sock
=
None
):
dispatcher
.
__init__
(
self
,
sock
)
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
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
handle_write
(
self
):
self
.
initiate_send
()
def
writable
(
self
):
return
(
not
self
.
connected
)
or
len
(
self
.
out_buffer
)
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
()
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
=
[]
while
1
:
tbinfo
.
append
((
tb
.
tb_frame
.
f_code
.
co_filename
,
tb
.
tb_frame
.
f_code
.
co_name
,
str
(
tb
.
tb_lineno
)
))
tb
=
tb
.
tb_next
if
not
tb
:
break
# just to be safe
del
tb
file
,
function
,
line
=
tbinfo
[
-
1
]
info
=
'['
+
string
.
join
(
map
(
lambda
x
:
string
.
join
(
x
,
'|'
),
tbinfo
),
'] ['
)
+
']'
return
(
file
,
function
,
line
),
t
,
v
,
info
t
,
v
,
tb
=
sys
.
exc_info
()
tbinfo
=
[]
while
1
:
tbinfo
.
append
((
tb
.
tb_frame
.
f_code
.
co_filename
,
tb
.
tb_frame
.
f_code
.
co_name
,
str
(
tb
.
tb_lineno
)
))
tb
=
tb
.
tb_next
if
not
tb
:
break
# just to be safe
del
tb
file
,
function
,
line
=
tbinfo
[
-
1
]
info
=
'['
+
string
.
join
(
map
(
lambda
x
:
string
.
join
(
x
,
'|'
),
tbinfo
),
'] ['
)
+
']'
return
(
file
,
function
,
line
),
t
,
v
,
info
def
close_all
(
map
=
None
):
if
map
is
None
:
map
=
socket_map
for
x
in
map
.
values
():
x
.
socket
.
close
()
map
.
clear
()
if
map
is
None
:
map
=
socket_map
for
x
in
map
.
values
():
x
.
socket
.
close
()
map
.
clear
()
# Asynchronous File I/O:
#
...
...
@@ -455,39 +455,39 @@ def close_all (map=None):
import
os
if
os
.
name
==
'posix'
:
import
fcntl
import
FCNTL
class
file_wrapper
:
# here we override just enough to make a file
# look like a socket for the purposes of asyncore.
def
__init__
(
self
,
fd
):
self
.
fd
=
fd
def
recv
(
self
,
*
args
):
return
apply
(
os
.
read
,
(
self
.
fd
,)
+
args
)
def
write
(
self
,
*
args
):
return
apply
(
os
.
write
,
(
self
.
fd
,)
+
args
)
def
close
(
self
):
return
os
.
close
(
self
.
fd
)
def
fileno
(
self
):
return
self
.
fd
class
file_dispatcher
(
dispatcher
):
def
__init__
(
self
,
fd
):
dispatcher
.
__init__
(
self
)
self
.
connected
=
1
# set it to non-blocking mode
flags
=
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_GETFL
,
0
)
flags
=
flags
|
FCNTL
.
O_NONBLOCK
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_SETFL
,
flags
)
self
.
set_file
(
fd
)
def
set_file
(
self
,
fd
):
self
.
_fileno
=
fd
self
.
socket
=
file_wrapper
(
fd
)
self
.
add_channel
()
import
fcntl
import
FCNTL
class
file_wrapper
:
# here we override just enough to make a file
# look like a socket for the purposes of asyncore.
def
__init__
(
self
,
fd
):
self
.
fd
=
fd
def
recv
(
self
,
*
args
):
return
apply
(
os
.
read
,
(
self
.
fd
,)
+
args
)
def
write
(
self
,
*
args
):
return
apply
(
os
.
write
,
(
self
.
fd
,)
+
args
)
def
close
(
self
):
return
os
.
close
(
self
.
fd
)
def
fileno
(
self
):
return
self
.
fd
class
file_dispatcher
(
dispatcher
):
def
__init__
(
self
,
fd
):
dispatcher
.
__init__
(
self
)
self
.
connected
=
1
# set it to non-blocking mode
flags
=
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_GETFL
,
0
)
flags
=
flags
|
FCNTL
.
O_NONBLOCK
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_SETFL
,
flags
)
self
.
set_file
(
fd
)
def
set_file
(
self
,
fd
):
self
.
_fileno
=
fd
self
.
socket
=
file_wrapper
(
fd
)
self
.
add_channel
()
ZServer/medusa/m_syslog.py
View file @
58435909
...
...
@@ -68,144 +68,144 @@ Usage:
#
# priorities (these are ordered)
LOG_EMERG
=
0
# system is unusable
LOG_ALERT
=
1
# action must be taken immediately
LOG_CRIT
=
2
# critical conditions
LOG_ERR
=
3
# error conditions
LOG_WARNING
=
4
# warning conditions
LOG_NOTICE
=
5
# normal but significant condition
LOG_INFO
=
6
# informational
LOG_DEBUG
=
7
# debug-level messages
LOG_EMERG
=
0
# system is unusable
LOG_ALERT
=
1
# action must be taken immediately
LOG_CRIT
=
2
# critical conditions
LOG_ERR
=
3
# error conditions
LOG_WARNING
=
4
# warning conditions
LOG_NOTICE
=
5
# normal but significant condition
LOG_INFO
=
6
# informational
LOG_DEBUG
=
7
# debug-level messages
# facility codes
LOG_KERN
=
0
# kernel messages
LOG_USER
=
1
# random user-level messages
LOG_MAIL
=
2
# mail system
LOG_DAEMON
=
3
# system daemons
LOG_AUTH
=
4
# security/authorization messages
LOG_SYSLOG
=
5
# messages generated internally by syslogd
LOG_LPR
=
6
# line printer subsystem
LOG_NEWS
=
7
# network news subsystem
LOG_UUCP
=
8
# UUCP subsystem
LOG_CRON
=
9
# clock daemon
LOG_AUTHPRIV
=
10
# security/authorization messages (private)
LOG_KERN
=
0
# kernel messages
LOG_USER
=
1
# random user-level messages
LOG_MAIL
=
2
# mail system
LOG_DAEMON
=
3
# system daemons
LOG_AUTH
=
4
# security/authorization messages
LOG_SYSLOG
=
5
# messages generated internally by syslogd
LOG_LPR
=
6
# line printer subsystem
LOG_NEWS
=
7
# network news subsystem
LOG_UUCP
=
8
# UUCP subsystem
LOG_CRON
=
9
# clock daemon
LOG_AUTHPRIV
=
10
# security/authorization messages (private)
# other codes through 15 reserved for system use
LOG_LOCAL0
=
16
# reserved for local use
LOG_LOCAL1
=
17
# reserved for local use
LOG_LOCAL2
=
18
# reserved for local use
LOG_LOCAL3
=
19
# reserved for local use
LOG_LOCAL4
=
20
# reserved for local use
LOG_LOCAL5
=
21
# reserved for local use
LOG_LOCAL6
=
22
# reserved for local use
LOG_LOCAL7
=
23
# reserved for local use
LOG_LOCAL0
=
16
# reserved for local use
LOG_LOCAL1
=
17
# reserved for local use
LOG_LOCAL2
=
18
# reserved for local use
LOG_LOCAL3
=
19
# reserved for local use
LOG_LOCAL4
=
20
# reserved for local use
LOG_LOCAL5
=
21
# reserved for local use
LOG_LOCAL6
=
22
# reserved for local use
LOG_LOCAL7
=
23
# reserved for local use
priority_names
=
{
"alert"
:
LOG_ALERT
,
"crit"
:
LOG_CRIT
,
"debug"
:
LOG_DEBUG
,
"emerg"
:
LOG_EMERG
,
"err"
:
LOG_ERR
,
"error"
:
LOG_ERR
,
# DEPRECATED
"info"
:
LOG_INFO
,
"notice"
:
LOG_NOTICE
,
"panic"
:
LOG_EMERG
,
# DEPRECATED
"warn"
:
LOG_WARNING
,
# DEPRECATED
"warning"
:
LOG_WARNING
,
}
"alert"
:
LOG_ALERT
,
"crit"
:
LOG_CRIT
,
"debug"
:
LOG_DEBUG
,
"emerg"
:
LOG_EMERG
,
"err"
:
LOG_ERR
,
"error"
:
LOG_ERR
,
# DEPRECATED
"info"
:
LOG_INFO
,
"notice"
:
LOG_NOTICE
,
"panic"
:
LOG_EMERG
,
# DEPRECATED
"warn"
:
LOG_WARNING
,
# DEPRECATED
"warning"
:
LOG_WARNING
,
}
facility_names
=
{
"auth"
:
LOG_AUTH
,
"authpriv"
:
LOG_AUTHPRIV
,
"cron"
:
LOG_CRON
,
"daemon"
:
LOG_DAEMON
,
"kern"
:
LOG_KERN
,
"lpr"
:
LOG_LPR
,
"mail"
:
LOG_MAIL
,
"news"
:
LOG_NEWS
,
"security"
:
LOG_AUTH
,
# DEPRECATED
"syslog"
:
LOG_SYSLOG
,
"user"
:
LOG_USER
,
"uucp"
:
LOG_UUCP
,
"local0"
:
LOG_LOCAL0
,
"local1"
:
LOG_LOCAL1
,
"local2"
:
LOG_LOCAL2
,
"local3"
:
LOG_LOCAL3
,
"local4"
:
LOG_LOCAL4
,
"local5"
:
LOG_LOCAL5
,
"local6"
:
LOG_LOCAL6
,
"local7"
:
LOG_LOCAL7
,
}
"auth"
:
LOG_AUTH
,
"authpriv"
:
LOG_AUTHPRIV
,
"cron"
:
LOG_CRON
,
"daemon"
:
LOG_DAEMON
,
"kern"
:
LOG_KERN
,
"lpr"
:
LOG_LPR
,
"mail"
:
LOG_MAIL
,
"news"
:
LOG_NEWS
,
"security"
:
LOG_AUTH
,
# DEPRECATED
"syslog"
:
LOG_SYSLOG
,
"user"
:
LOG_USER
,
"uucp"
:
LOG_UUCP
,
"local0"
:
LOG_LOCAL0
,
"local1"
:
LOG_LOCAL1
,
"local2"
:
LOG_LOCAL2
,
"local3"
:
LOG_LOCAL3
,
"local4"
:
LOG_LOCAL4
,
"local5"
:
LOG_LOCAL5
,
"local6"
:
LOG_LOCAL6
,
"local7"
:
LOG_LOCAL7
,
}
import
socket
class
syslog_client
:
def
__init__
(
self
,
address
=
'/dev/log'
):
self
.
address
=
address
if
type
(
address
)
==
type
(
''
):
try
:
# APUE 13.4.2 specifes /dev/log as datagram socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
def
__init__
(
self
,
address
=
'/dev/log'
):
self
.
address
=
address
if
type
(
address
)
==
type
(
''
):
try
:
# APUE 13.4.2 specifes /dev/log as datagram socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_DGRAM
)
self
.
socket
.
connect
(
address
)
except
:
# older linux may create as stream socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
self
.
socket
.
connect
(
address
)
except
:
# older linux may create as stream socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_STREAM
)
self
.
socket
.
connect
(
address
)
self
.
unix
=
1
else
:
self
.
socket
=
socket
.
socket
(
socket
.
AF_INET
self
.
socket
.
connect
(
address
)
self
.
unix
=
1
else
:
self
.
socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
self
.
unix
=
0
# curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if
# necessary.
log_format_string
=
'<%d>%s
\
000
'
def
log
(
self
,
message
,
facility
=
LOG_USER
,
priority
=
LOG_INFO
):
message
=
self
.
log_format_string
%
(
self
.
encode_priority
(
facility
,
priority
),
message
)
if
self
.
unix
:
self
.
socket
.
send
(
message
)
else
:
self
.
socket
.
sendto
(
message
,
self
.
address
)
def
encode_priority
(
self
,
facility
,
priority
):
if
type
(
facility
)
==
type
(
''
):
facility
=
facility_names
[
facility
]
if
type
(
priority
)
==
type
(
''
):
priority
=
priority_names
[
priority
]
return
(
facility
<<
3
)
|
priority
def
close
(
self
):
if
self
.
unix
:
self
.
socket
.
close
()
self
.
unix
=
0
# curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if
# necessary.
log_format_string
=
'<%d>%s
\
000
'
def
log
(
self
,
message
,
facility
=
LOG_USER
,
priority
=
LOG_INFO
):
message
=
self
.
log_format_string
%
(
self
.
encode_priority
(
facility
,
priority
),
message
)
if
self
.
unix
:
self
.
socket
.
send
(
message
)
else
:
self
.
socket
.
sendto
(
message
,
self
.
address
)
def
encode_priority
(
self
,
facility
,
priority
):
if
type
(
facility
)
==
type
(
''
):
facility
=
facility_names
[
facility
]
if
type
(
priority
)
==
type
(
''
):
priority
=
priority_names
[
priority
]
return
(
facility
<<
3
)
|
priority
def
close
(
self
):
if
self
.
unix
:
self
.
socket
.
close
()
if
__name__
==
'__main__'
:
"""
Unit test for syslog_client. Set up for the test by:
* tail -f /var/log/allstuf (to see the "normal" log messages).
* tail -f /var/log/allstuf (to see the "normal" log messages).
* Running the test_logger.py script with a junk file name (which
will be opened as a Unix-domain socket). "Custom" log messages
will go here.
will be opened as a Unix-domain socket). "Custom" log messages
will go here.
* Run this script, passing the same junk file name.
* Run this script, passing the same junk file name.
* Check that the "bogus" test throws, and that none of the rest do.
* Check that the "bogus" test throws, and that none of the rest do.
* Check that the 'default' and 'UDP' messages show up in the tail.
* Check that the 'default' and 'UDP' messages show up in the tail.
* Check that the 'non-std' message shows up in the test_logger
console.
* Check that the 'non-std' message shows up in the test_logger
console.
* Finally, kill off the tail and test_logger, and clean up the
socket file.
* Finally, kill off the tail and test_logger, and clean up the
socket file.
"""
import
sys
,
traceback
...
...
@@ -215,14 +215,14 @@ if __name__ == '__main__':
def
test_client
(
desc
,
address
=
None
):
try
:
if
address
:
client
=
syslog_client
(
address
)
else
:
client
=
syslog_client
()
if
address
:
client
=
syslog_client
(
address
)
else
:
client
=
syslog_client
()
except
:
print
'syslog_client() [%s] ctor threw'
%
desc
print
'syslog_client() [%s] ctor threw'
%
desc
traceback
.
print_exc
()
return
return
try
:
client
.
log
(
'testing syslog_client() [%s]'
%
desc
...
...
lib/python/OFS/Image.py
View file @
58435909
...
...
@@ -84,7 +84,7 @@
##############################################################################
"""Image object"""
__version__
=
'$Revision: 1.10
1
$'
[
11
:
-
2
]
__version__
=
'$Revision: 1.10
2
$'
[
11
:
-
2
]
import
Globals
,
string
,
struct
,
content_types
from
OFS.content_types
import
guess_content_type
...
...
@@ -194,12 +194,12 @@ class File(Persistent,Implicit,PropertyManager,
if
header
is
not
None
:
header
=
string
.
split
(
header
,
';'
)[
0
]
mod_since
=
int
(
DateTime
(
header
).
timeTime
())
if
self
.
_p_mtime
:
if
self
.
_p_mtime
:
last_mod
=
int
(
self
.
_p_mtime
)
else
:
last_mod
=
0
else
:
last_mod
=
0
if
last_mod
>
0
and
last_mod
<=
mod_since
:
RESPONSE
.
setStatus
(
304
)
return
RESPONSE
...
...
lib/python/ThreadedAsync.py
View file @
58435909
...
...
@@ -84,7 +84,7 @@
##############################################################################
"""Utility module to help manage the asyncore mainloop in a multi-threaded app
"""
__version__
=
'$Revision: 1.
1
$'
[
11
:
-
2
]
__version__
=
'$Revision: 1.
2
$'
[
11
:
-
2
]
import
thread
import
asyncore
...
...
@@ -105,7 +105,7 @@ def _start_loop(map):
try
:
global
_looping
_looping
=
1
while
_loop_callbacks
:
while
_loop_callbacks
:
cb
,
args
,
kw
=
_loop_callbacks
.
pop
()
apply
(
cb
,
(
map
,)
+
args
,
kw
or
{})
...
...
lib/python/ZLogger/syslog.py
View file @
58435909
...
...
@@ -68,144 +68,144 @@ Usage:
#
# priorities (these are ordered)
LOG_EMERG
=
0
# system is unusable
LOG_ALERT
=
1
# action must be taken immediately
LOG_CRIT
=
2
# critical conditions
LOG_ERR
=
3
# error conditions
LOG_WARNING
=
4
# warning conditions
LOG_NOTICE
=
5
# normal but significant condition
LOG_INFO
=
6
# informational
LOG_DEBUG
=
7
# debug-level messages
LOG_EMERG
=
0
# system is unusable
LOG_ALERT
=
1
# action must be taken immediately
LOG_CRIT
=
2
# critical conditions
LOG_ERR
=
3
# error conditions
LOG_WARNING
=
4
# warning conditions
LOG_NOTICE
=
5
# normal but significant condition
LOG_INFO
=
6
# informational
LOG_DEBUG
=
7
# debug-level messages
# facility codes
LOG_KERN
=
0
# kernel messages
LOG_USER
=
1
# random user-level messages
LOG_MAIL
=
2
# mail system
LOG_DAEMON
=
3
# system daemons
LOG_AUTH
=
4
# security/authorization messages
LOG_SYSLOG
=
5
# messages generated internally by syslogd
LOG_LPR
=
6
# line printer subsystem
LOG_NEWS
=
7
# network news subsystem
LOG_UUCP
=
8
# UUCP subsystem
LOG_CRON
=
9
# clock daemon
LOG_AUTHPRIV
=
10
# security/authorization messages (private)
LOG_KERN
=
0
# kernel messages
LOG_USER
=
1
# random user-level messages
LOG_MAIL
=
2
# mail system
LOG_DAEMON
=
3
# system daemons
LOG_AUTH
=
4
# security/authorization messages
LOG_SYSLOG
=
5
# messages generated internally by syslogd
LOG_LPR
=
6
# line printer subsystem
LOG_NEWS
=
7
# network news subsystem
LOG_UUCP
=
8
# UUCP subsystem
LOG_CRON
=
9
# clock daemon
LOG_AUTHPRIV
=
10
# security/authorization messages (private)
# other codes through 15 reserved for system use
LOG_LOCAL0
=
16
# reserved for local use
LOG_LOCAL1
=
17
# reserved for local use
LOG_LOCAL2
=
18
# reserved for local use
LOG_LOCAL3
=
19
# reserved for local use
LOG_LOCAL4
=
20
# reserved for local use
LOG_LOCAL5
=
21
# reserved for local use
LOG_LOCAL6
=
22
# reserved for local use
LOG_LOCAL7
=
23
# reserved for local use
LOG_LOCAL0
=
16
# reserved for local use
LOG_LOCAL1
=
17
# reserved for local use
LOG_LOCAL2
=
18
# reserved for local use
LOG_LOCAL3
=
19
# reserved for local use
LOG_LOCAL4
=
20
# reserved for local use
LOG_LOCAL5
=
21
# reserved for local use
LOG_LOCAL6
=
22
# reserved for local use
LOG_LOCAL7
=
23
# reserved for local use
priority_names
=
{
"alert"
:
LOG_ALERT
,
"crit"
:
LOG_CRIT
,
"debug"
:
LOG_DEBUG
,
"emerg"
:
LOG_EMERG
,
"err"
:
LOG_ERR
,
"error"
:
LOG_ERR
,
# DEPRECATED
"info"
:
LOG_INFO
,
"notice"
:
LOG_NOTICE
,
"panic"
:
LOG_EMERG
,
# DEPRECATED
"warn"
:
LOG_WARNING
,
# DEPRECATED
"warning"
:
LOG_WARNING
,
}
"alert"
:
LOG_ALERT
,
"crit"
:
LOG_CRIT
,
"debug"
:
LOG_DEBUG
,
"emerg"
:
LOG_EMERG
,
"err"
:
LOG_ERR
,
"error"
:
LOG_ERR
,
# DEPRECATED
"info"
:
LOG_INFO
,
"notice"
:
LOG_NOTICE
,
"panic"
:
LOG_EMERG
,
# DEPRECATED
"warn"
:
LOG_WARNING
,
# DEPRECATED
"warning"
:
LOG_WARNING
,
}
facility_names
=
{
"auth"
:
LOG_AUTH
,
"authpriv"
:
LOG_AUTHPRIV
,
"cron"
:
LOG_CRON
,
"daemon"
:
LOG_DAEMON
,
"kern"
:
LOG_KERN
,
"lpr"
:
LOG_LPR
,
"mail"
:
LOG_MAIL
,
"news"
:
LOG_NEWS
,
"security"
:
LOG_AUTH
,
# DEPRECATED
"syslog"
:
LOG_SYSLOG
,
"user"
:
LOG_USER
,
"uucp"
:
LOG_UUCP
,
"local0"
:
LOG_LOCAL0
,
"local1"
:
LOG_LOCAL1
,
"local2"
:
LOG_LOCAL2
,
"local3"
:
LOG_LOCAL3
,
"local4"
:
LOG_LOCAL4
,
"local5"
:
LOG_LOCAL5
,
"local6"
:
LOG_LOCAL6
,
"local7"
:
LOG_LOCAL7
,
}
"auth"
:
LOG_AUTH
,
"authpriv"
:
LOG_AUTHPRIV
,
"cron"
:
LOG_CRON
,
"daemon"
:
LOG_DAEMON
,
"kern"
:
LOG_KERN
,
"lpr"
:
LOG_LPR
,
"mail"
:
LOG_MAIL
,
"news"
:
LOG_NEWS
,
"security"
:
LOG_AUTH
,
# DEPRECATED
"syslog"
:
LOG_SYSLOG
,
"user"
:
LOG_USER
,
"uucp"
:
LOG_UUCP
,
"local0"
:
LOG_LOCAL0
,
"local1"
:
LOG_LOCAL1
,
"local2"
:
LOG_LOCAL2
,
"local3"
:
LOG_LOCAL3
,
"local4"
:
LOG_LOCAL4
,
"local5"
:
LOG_LOCAL5
,
"local6"
:
LOG_LOCAL6
,
"local7"
:
LOG_LOCAL7
,
}
import
socket
class
syslog_client
:
def
__init__
(
self
,
address
=
'/dev/log'
):
self
.
address
=
address
if
type
(
address
)
==
type
(
''
):
try
:
# APUE 13.4.2 specifes /dev/log as datagram socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
def
__init__
(
self
,
address
=
'/dev/log'
):
self
.
address
=
address
if
type
(
address
)
==
type
(
''
):
try
:
# APUE 13.4.2 specifes /dev/log as datagram socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_DGRAM
)
self
.
socket
.
connect
(
address
)
except
:
# older linux may create as stream socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
self
.
socket
.
connect
(
address
)
except
:
# older linux may create as stream socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_STREAM
)
self
.
socket
.
connect
(
address
)
self
.
unix
=
1
else
:
self
.
socket
=
socket
.
socket
(
socket
.
AF_INET
self
.
socket
.
connect
(
address
)
self
.
unix
=
1
else
:
self
.
socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
self
.
unix
=
0
# curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if
# necessary.
log_format_string
=
'<%d>%s
\
000
'
def
log
(
self
,
message
,
facility
=
LOG_USER
,
priority
=
LOG_INFO
):
message
=
self
.
log_format_string
%
(
self
.
encode_priority
(
facility
,
priority
),
message
)
if
self
.
unix
:
self
.
socket
.
send
(
message
)
else
:
self
.
socket
.
sendto
(
message
,
self
.
address
)
def
encode_priority
(
self
,
facility
,
priority
):
if
type
(
facility
)
==
type
(
''
):
facility
=
facility_names
[
facility
]
if
type
(
priority
)
==
type
(
''
):
priority
=
priority_names
[
priority
]
return
(
facility
<<
3
)
|
priority
def
close
(
self
):
if
self
.
unix
:
self
.
socket
.
close
()
self
.
unix
=
0
# curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if
# necessary.
log_format_string
=
'<%d>%s
\
000
'
def
log
(
self
,
message
,
facility
=
LOG_USER
,
priority
=
LOG_INFO
):
message
=
self
.
log_format_string
%
(
self
.
encode_priority
(
facility
,
priority
),
message
)
if
self
.
unix
:
self
.
socket
.
send
(
message
)
else
:
self
.
socket
.
sendto
(
message
,
self
.
address
)
def
encode_priority
(
self
,
facility
,
priority
):
if
type
(
facility
)
==
type
(
''
):
facility
=
facility_names
[
facility
]
if
type
(
priority
)
==
type
(
''
):
priority
=
priority_names
[
priority
]
return
(
facility
<<
3
)
|
priority
def
close
(
self
):
if
self
.
unix
:
self
.
socket
.
close
()
if
__name__
==
'__main__'
:
"""
Unit test for syslog_client. Set up for the test by:
* tail -f /var/log/allstuf (to see the "normal" log messages).
* tail -f /var/log/allstuf (to see the "normal" log messages).
* Running the test_logger.py script with a junk file name (which
will be opened as a Unix-domain socket). "Custom" log messages
will go here.
will be opened as a Unix-domain socket). "Custom" log messages
will go here.
* Run this script, passing the same junk file name.
* Run this script, passing the same junk file name.
* Check that the "bogus" test throws, and that none of the rest do.
* Check that the "bogus" test throws, and that none of the rest do.
* Check that the 'default' and 'UDP' messages show up in the tail.
* Check that the 'default' and 'UDP' messages show up in the tail.
* Check that the 'non-std' message shows up in the test_logger
console.
* Check that the 'non-std' message shows up in the test_logger
console.
* Finally, kill off the tail and test_logger, and clean up the
socket file.
* Finally, kill off the tail and test_logger, and clean up the
socket file.
"""
import
sys
,
traceback
...
...
@@ -215,14 +215,14 @@ if __name__ == '__main__':
def
test_client
(
desc
,
address
=
None
):
try
:
if
address
:
client
=
syslog_client
(
address
)
else
:
client
=
syslog_client
()
if
address
:
client
=
syslog_client
(
address
)
else
:
client
=
syslog_client
()
except
:
print
'syslog_client() [%s] ctor threw'
%
desc
print
'syslog_client() [%s] ctor threw'
%
desc
traceback
.
print_exc
()
return
return
try
:
client
.
log
(
'testing syslog_client() [%s]'
%
desc
...
...
lib/python/ZServer/medusa/asyncore.py
View file @
58435909
# -*- Mode: Python; tab-width: 4 -*-
#
Id: asyncore.py,v 2.49 2000/05/04 06:06:04 jim Exp
#
$Id: asyncore.py,v 1.9 2000/05/05 17:28:57 jim
Exp $
#
Author: Sam Rushing <rushing@nightmare.com>
#
Id: asyncore.py,v 2.49 2000/05/04 06:06:04 jim Exp
#
$Id: asyncore.py,v 1.10 2000/05/12 19:43:07 brian
Exp $
#
Author: Sam Rushing <rushing@nightmare.com>
# ======================================================================
# Copyright 1996 by Sam Rushing
...
...
@@ -34,347 +34,347 @@ import sys
import
os
if
os
.
name
==
'nt'
:
EWOULDBLOCK
=
10035
EINPROGRESS
=
10036
EALREADY
=
10037
ECONNRESET
=
10054
ENOTCONN
=
10057
ESHUTDOWN
=
10058
EWOULDBLOCK
=
10035
EINPROGRESS
=
10036
EALREADY
=
10037
ECONNRESET
=
10054
ENOTCONN
=
10057
ESHUTDOWN
=
10058
else
:
from
errno
import
EALREADY
,
EINPROGRESS
,
EWOULDBLOCK
,
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
from
errno
import
EALREADY
,
EINPROGRESS
,
EWOULDBLOCK
,
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
try
:
socket_map
socket_map
except
NameError
:
socket_map
=
{}
socket_map
=
{}
class
ExitNow
(
exceptions
.
Exception
):
pass
pass
DEBUG
=
0
def
poll
(
timeout
=
0.0
,
map
=
None
):
global
DEBUG
if
map
is
None
:
map
=
socket_map
if
map
:
r
=
[];
w
=
[];
e
=
[]
for
fd
,
obj
in
map
.
items
():
if
obj
.
readable
():
r
.
append
(
fd
)
if
obj
.
writable
():
w
.
append
(
fd
)
r
,
w
,
e
=
select
.
select
(
r
,
w
,
e
,
timeout
)
if
DEBUG
:
print
r
,
w
,
e
for
fd
in
r
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_read_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
for
fd
in
w
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
global
DEBUG
if
map
is
None
:
map
=
socket_map
if
map
:
r
=
[];
w
=
[];
e
=
[]
for
fd
,
obj
in
map
.
items
():
if
obj
.
readable
():
r
.
append
(
fd
)
if
obj
.
writable
():
w
.
append
(
fd
)
r
,
w
,
e
=
select
.
select
(
r
,
w
,
e
,
timeout
)
if
DEBUG
:
print
r
,
w
,
e
for
fd
in
r
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_read_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
for
fd
in
w
:
try
:
obj
=
map
[
fd
]
try
:
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
def
poll2
(
timeout
=
0.0
,
map
=
None
):
import
poll
if
map
is
None
:
map
=
socket_map
# timeout is in milliseconds
timeout
=
int
(
timeout
*
1000
)
if
map
:
l
=
[]
for
fd
,
obj
in
map
.
items
():
flags
=
0
if
obj
.
readable
():
flags
=
poll
.
POLLIN
if
obj
.
writable
():
flags
=
flags
|
poll
.
POLLOUT
if
flags
:
l
.
append
((
fd
,
flags
))
r
=
poll
.
poll
(
l
,
timeout
)
for
fd
,
flags
in
r
:
try
:
obj
=
map
[
fd
]
try
:
if
(
flags
&
poll
.
POLLIN
):
obj
.
handle_read_event
()
if
(
flags
&
poll
.
POLLOUT
):
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
import
poll
if
map
is
None
:
map
=
socket_map
# timeout is in milliseconds
timeout
=
int
(
timeout
*
1000
)
if
map
:
l
=
[]
for
fd
,
obj
in
map
.
items
():
flags
=
0
if
obj
.
readable
():
flags
=
poll
.
POLLIN
if
obj
.
writable
():
flags
=
flags
|
poll
.
POLLOUT
if
flags
:
l
.
append
((
fd
,
flags
))
r
=
poll
.
poll
(
l
,
timeout
)
for
fd
,
flags
in
r
:
try
:
obj
=
map
[
fd
]
try
:
if
(
flags
&
poll
.
POLLIN
):
obj
.
handle_read_event
()
if
(
flags
&
poll
.
POLLOUT
):
obj
.
handle_write_event
()
except
ExitNow
:
raise
ExitNow
except
:
obj
.
handle_error
()
except
KeyError
:
pass
def
loop
(
timeout
=
30.0
,
use_poll
=
0
,
map
=
None
):
if
use_poll
:
poll_fun
=
poll2
else
:
poll_fun
=
poll
if
use_poll
:
poll_fun
=
poll2
else
:
poll_fun
=
poll
if
map
is
None
:
map
=
socket_map
map
=
socket_map
while
map
:
poll_fun
(
timeout
,
map
)
while
map
:
poll_fun
(
timeout
,
map
)
class
dispatcher
:
debug
=
0
connected
=
0
accepting
=
0
closing
=
0
addr
=
None
def
__init__
(
self
,
sock
=
None
,
map
=
None
):
if
sock
:
self
.
set_socket
(
sock
,
map
)
# I think it should inherit this anyway
self
.
socket
.
setblocking
(
0
)
self
.
connected
=
1
def
__repr__
(
self
):
try
:
status
=
[]
if
self
.
accepting
and
self
.
addr
:
status
.
append
(
'listening'
)
elif
self
.
connected
:
status
.
append
(
'connected'
)
if
self
.
addr
:
status
.
append
(
'%s:%d'
%
self
.
addr
)
return
'<%s %s at %x>'
%
(
self
.
__class__
.
__name__
,
string
.
join
(
status
,
' '
),
id
(
self
)
)
except
:
try
:
ar
=
repr
(
self
.
addr
)
except
:
ar
=
'no self.addr!'
return
'<__repr__ (self) failed for object at %x (addr=%s)>'
%
(
id
(
self
),
ar
)
def
add_channel
(
self
,
map
=
None
):
#self.log_info ('adding channel %s' % self)
if
map
is
None
:
map
=
socket_map
map
[
self
.
_fileno
]
=
self
def
del_channel
(
self
,
map
=
None
):
fd
=
self
.
_fileno
if
map
is
None
:
map
=
socket_map
if
map
.
has_key
(
fd
):
#self.log_info ('closing channel %d:%s' % (fd, self))
del
map
[
fd
]
def
create_socket
(
self
,
family
,
type
):
self
.
family_and_type
=
family
,
type
self
.
socket
=
socket
.
socket
(
family
,
type
)
self
.
socket
.
setblocking
(
0
)
self
.
_fileno
=
self
.
socket
.
fileno
()
self
.
add_channel
()
def
set_socket
(
self
,
sock
,
map
=
None
):
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
:
pass
# ==================================================
# predicates for select()
# these are used as filters for the lists of sockets
# to pass to select().
# ==================================================
def
readable
(
self
):
return
1
if
os
.
name
==
'mac'
:
# The macintosh will select a listening socket for
# write if you let it. What might this mean?
def
writable
(
self
):
return
not
self
.
accepting
else
:
def
writable
(
self
):
return
1
# ==================================================
# socket object methods.
# ==================================================
def
listen
(
self
,
num
):
self
.
accepting
=
1
if
os
.
name
==
'nt'
and
num
>
5
:
num
=
1
return
self
.
socket
.
listen
(
num
)
def
bind
(
self
,
addr
):
self
.
addr
=
addr
return
self
.
socket
.
bind
(
addr
)
def
connect
(
self
,
address
):
self
.
connected
=
0
try
:
self
.
socket
.
connect
(
address
)
except
socket
.
error
,
why
:
if
why
[
0
]
in
(
EINPROGRESS
,
EALREADY
,
EWOULDBLOCK
):
return
else
:
raise
socket
.
error
,
why
self
.
connected
=
1
self
.
handle_connect
()
def
accept
(
self
):
try
:
conn
,
addr
=
self
.
socket
.
accept
()
return
conn
,
addr
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
pass
else
:
raise
socket
.
error
,
why
def
send
(
self
,
data
):
try
:
result
=
self
.
socket
.
send
(
data
)
return
result
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
return
0
else
:
raise
socket
.
error
,
why
return
0
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 throws ENOTCONN
if
why
[
0
]
in
[
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
]:
self
.
handle_close
()
return
''
else
:
raise
socket
.
error
,
why
def
close
(
self
):
self
.
del_channel
()
self
.
socket
.
close
()
# cheap inheritance, used to pass all other attribute
# references to the underlying socket object.
def
__getattr__
(
self
,
attr
):
return
getattr
(
self
.
socket
,
attr
)
# log and log_info maybe overriden to provide more sophisitcated
# 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
__debug__
or
type
!=
'info'
:
print
'%s: %s'
%
(
type
,
message
)
def
handle_read_event
(
self
):
if
self
.
accepting
:
# for an accepting socket, getting a read implies
# that we are connected
if
not
self
.
connected
:
self
.
connected
=
1
self
.
handle_accept
()
elif
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_read
()
else
:
self
.
handle_read
()
def
handle_write_event
(
self
):
# getting a write implies that we are connected
if
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_write
()
def
handle_expt_event
(
self
):
self
.
handle_expt
()
def
handle_error
(
self
):
(
file
,
fun
,
line
),
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
.
close
()
def
handle_expt
(
self
):
self
.
log_info
(
'unhandled exception'
,
'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
()
debug
=
0
connected
=
0
accepting
=
0
closing
=
0
addr
=
None
def
__init__
(
self
,
sock
=
None
,
map
=
None
):
if
sock
:
self
.
set_socket
(
sock
,
map
)
# I think it should inherit this anyway
self
.
socket
.
setblocking
(
0
)
self
.
connected
=
1
def
__repr__
(
self
):
try
:
status
=
[]
if
self
.
accepting
and
self
.
addr
:
status
.
append
(
'listening'
)
elif
self
.
connected
:
status
.
append
(
'connected'
)
if
self
.
addr
:
status
.
append
(
'%s:%d'
%
self
.
addr
)
return
'<%s %s at %x>'
%
(
self
.
__class__
.
__name__
,
string
.
join
(
status
,
' '
),
id
(
self
)
)
except
:
try
:
ar
=
repr
(
self
.
addr
)
except
:
ar
=
'no self.addr!'
return
'<__repr__ (self) failed for object at %x (addr=%s)>'
%
(
id
(
self
),
ar
)
def
add_channel
(
self
,
map
=
None
):
#self.log_info ('adding channel %s' % self)
if
map
is
None
:
map
=
socket_map
map
[
self
.
_fileno
]
=
self
def
del_channel
(
self
,
map
=
None
):
fd
=
self
.
_fileno
if
map
is
None
:
map
=
socket_map
if
map
.
has_key
(
fd
):
#self.log_info ('closing channel %d:%s' % (fd, self))
del
map
[
fd
]
def
create_socket
(
self
,
family
,
type
):
self
.
family_and_type
=
family
,
type
self
.
socket
=
socket
.
socket
(
family
,
type
)
self
.
socket
.
setblocking
(
0
)
self
.
_fileno
=
self
.
socket
.
fileno
()
self
.
add_channel
()
def
set_socket
(
self
,
sock
,
map
=
None
):
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
:
pass
# ==================================================
# predicates for select()
# these are used as filters for the lists of sockets
# to pass to select().
# ==================================================
def
readable
(
self
):
return
1
if
os
.
name
==
'mac'
:
# The macintosh will select a listening socket for
# write if you let it. What might this mean?
def
writable
(
self
):
return
not
self
.
accepting
else
:
def
writable
(
self
):
return
1
# ==================================================
# socket object methods.
# ==================================================
def
listen
(
self
,
num
):
self
.
accepting
=
1
if
os
.
name
==
'nt'
and
num
>
5
:
num
=
1
return
self
.
socket
.
listen
(
num
)
def
bind
(
self
,
addr
):
self
.
addr
=
addr
return
self
.
socket
.
bind
(
addr
)
def
connect
(
self
,
address
):
self
.
connected
=
0
try
:
self
.
socket
.
connect
(
address
)
except
socket
.
error
,
why
:
if
why
[
0
]
in
(
EINPROGRESS
,
EALREADY
,
EWOULDBLOCK
):
return
else
:
raise
socket
.
error
,
why
self
.
connected
=
1
self
.
handle_connect
()
def
accept
(
self
):
try
:
conn
,
addr
=
self
.
socket
.
accept
()
return
conn
,
addr
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
pass
else
:
raise
socket
.
error
,
why
def
send
(
self
,
data
):
try
:
result
=
self
.
socket
.
send
(
data
)
return
result
except
socket
.
error
,
why
:
if
why
[
0
]
==
EWOULDBLOCK
:
return
0
else
:
raise
socket
.
error
,
why
return
0
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 throws ENOTCONN
if
why
[
0
]
in
[
ECONNRESET
,
ENOTCONN
,
ESHUTDOWN
]:
self
.
handle_close
()
return
''
else
:
raise
socket
.
error
,
why
def
close
(
self
):
self
.
del_channel
()
self
.
socket
.
close
()
# cheap inheritance, used to pass all other attribute
# references to the underlying socket object.
def
__getattr__
(
self
,
attr
):
return
getattr
(
self
.
socket
,
attr
)
# log and log_info maybe overriden to provide more sophisitcated
# 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
__debug__
or
type
!=
'info'
:
print
'%s: %s'
%
(
type
,
message
)
def
handle_read_event
(
self
):
if
self
.
accepting
:
# for an accepting socket, getting a read implies
# that we are connected
if
not
self
.
connected
:
self
.
connected
=
1
self
.
handle_accept
()
elif
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_read
()
else
:
self
.
handle_read
()
def
handle_write_event
(
self
):
# getting a write implies that we are connected
if
not
self
.
connected
:
self
.
handle_connect
()
self
.
connected
=
1
self
.
handle_write
()
def
handle_expt_event
(
self
):
self
.
handle_expt
()
def
handle_error
(
self
):
(
file
,
fun
,
line
),
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
.
close
()
def
handle_expt
(
self
):
self
.
log_info
(
'unhandled exception'
,
'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.
...
...
@@ -382,63 +382,63 @@ class dispatcher:
# ---------------------------------------------------------------------------
class
dispatcher_with_send
(
dispatcher
):
def
__init__
(
self
,
sock
=
None
):
dispatcher
.
__init__
(
self
,
sock
)
self
.
out_buffer
=
''
def
__init__
(
self
,
sock
=
None
):
dispatcher
.
__init__
(
self
,
sock
)
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
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
handle_write
(
self
):
self
.
initiate_send
()
def
writable
(
self
):
return
(
not
self
.
connected
)
or
len
(
self
.
out_buffer
)
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
()
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
=
[]
while
1
:
tbinfo
.
append
((
tb
.
tb_frame
.
f_code
.
co_filename
,
tb
.
tb_frame
.
f_code
.
co_name
,
str
(
tb
.
tb_lineno
)
))
tb
=
tb
.
tb_next
if
not
tb
:
break
# just to be safe
del
tb
file
,
function
,
line
=
tbinfo
[
-
1
]
info
=
'['
+
string
.
join
(
map
(
lambda
x
:
string
.
join
(
x
,
'|'
),
tbinfo
),
'] ['
)
+
']'
return
(
file
,
function
,
line
),
t
,
v
,
info
t
,
v
,
tb
=
sys
.
exc_info
()
tbinfo
=
[]
while
1
:
tbinfo
.
append
((
tb
.
tb_frame
.
f_code
.
co_filename
,
tb
.
tb_frame
.
f_code
.
co_name
,
str
(
tb
.
tb_lineno
)
))
tb
=
tb
.
tb_next
if
not
tb
:
break
# just to be safe
del
tb
file
,
function
,
line
=
tbinfo
[
-
1
]
info
=
'['
+
string
.
join
(
map
(
lambda
x
:
string
.
join
(
x
,
'|'
),
tbinfo
),
'] ['
)
+
']'
return
(
file
,
function
,
line
),
t
,
v
,
info
def
close_all
(
map
=
None
):
if
map
is
None
:
map
=
socket_map
for
x
in
map
.
values
():
x
.
socket
.
close
()
map
.
clear
()
if
map
is
None
:
map
=
socket_map
for
x
in
map
.
values
():
x
.
socket
.
close
()
map
.
clear
()
# Asynchronous File I/O:
#
...
...
@@ -455,39 +455,39 @@ def close_all (map=None):
import
os
if
os
.
name
==
'posix'
:
import
fcntl
import
FCNTL
class
file_wrapper
:
# here we override just enough to make a file
# look like a socket for the purposes of asyncore.
def
__init__
(
self
,
fd
):
self
.
fd
=
fd
def
recv
(
self
,
*
args
):
return
apply
(
os
.
read
,
(
self
.
fd
,)
+
args
)
def
write
(
self
,
*
args
):
return
apply
(
os
.
write
,
(
self
.
fd
,)
+
args
)
def
close
(
self
):
return
os
.
close
(
self
.
fd
)
def
fileno
(
self
):
return
self
.
fd
class
file_dispatcher
(
dispatcher
):
def
__init__
(
self
,
fd
):
dispatcher
.
__init__
(
self
)
self
.
connected
=
1
# set it to non-blocking mode
flags
=
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_GETFL
,
0
)
flags
=
flags
|
FCNTL
.
O_NONBLOCK
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_SETFL
,
flags
)
self
.
set_file
(
fd
)
def
set_file
(
self
,
fd
):
self
.
_fileno
=
fd
self
.
socket
=
file_wrapper
(
fd
)
self
.
add_channel
()
import
fcntl
import
FCNTL
class
file_wrapper
:
# here we override just enough to make a file
# look like a socket for the purposes of asyncore.
def
__init__
(
self
,
fd
):
self
.
fd
=
fd
def
recv
(
self
,
*
args
):
return
apply
(
os
.
read
,
(
self
.
fd
,)
+
args
)
def
write
(
self
,
*
args
):
return
apply
(
os
.
write
,
(
self
.
fd
,)
+
args
)
def
close
(
self
):
return
os
.
close
(
self
.
fd
)
def
fileno
(
self
):
return
self
.
fd
class
file_dispatcher
(
dispatcher
):
def
__init__
(
self
,
fd
):
dispatcher
.
__init__
(
self
)
self
.
connected
=
1
# set it to non-blocking mode
flags
=
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_GETFL
,
0
)
flags
=
flags
|
FCNTL
.
O_NONBLOCK
fcntl
.
fcntl
(
fd
,
FCNTL
.
F_SETFL
,
flags
)
self
.
set_file
(
fd
)
def
set_file
(
self
,
fd
):
self
.
_fileno
=
fd
self
.
socket
=
file_wrapper
(
fd
)
self
.
add_channel
()
lib/python/ZServer/medusa/m_syslog.py
View file @
58435909
...
...
@@ -68,144 +68,144 @@ Usage:
#
# priorities (these are ordered)
LOG_EMERG
=
0
# system is unusable
LOG_ALERT
=
1
# action must be taken immediately
LOG_CRIT
=
2
# critical conditions
LOG_ERR
=
3
# error conditions
LOG_WARNING
=
4
# warning conditions
LOG_NOTICE
=
5
# normal but significant condition
LOG_INFO
=
6
# informational
LOG_DEBUG
=
7
# debug-level messages
LOG_EMERG
=
0
# system is unusable
LOG_ALERT
=
1
# action must be taken immediately
LOG_CRIT
=
2
# critical conditions
LOG_ERR
=
3
# error conditions
LOG_WARNING
=
4
# warning conditions
LOG_NOTICE
=
5
# normal but significant condition
LOG_INFO
=
6
# informational
LOG_DEBUG
=
7
# debug-level messages
# facility codes
LOG_KERN
=
0
# kernel messages
LOG_USER
=
1
# random user-level messages
LOG_MAIL
=
2
# mail system
LOG_DAEMON
=
3
# system daemons
LOG_AUTH
=
4
# security/authorization messages
LOG_SYSLOG
=
5
# messages generated internally by syslogd
LOG_LPR
=
6
# line printer subsystem
LOG_NEWS
=
7
# network news subsystem
LOG_UUCP
=
8
# UUCP subsystem
LOG_CRON
=
9
# clock daemon
LOG_AUTHPRIV
=
10
# security/authorization messages (private)
LOG_KERN
=
0
# kernel messages
LOG_USER
=
1
# random user-level messages
LOG_MAIL
=
2
# mail system
LOG_DAEMON
=
3
# system daemons
LOG_AUTH
=
4
# security/authorization messages
LOG_SYSLOG
=
5
# messages generated internally by syslogd
LOG_LPR
=
6
# line printer subsystem
LOG_NEWS
=
7
# network news subsystem
LOG_UUCP
=
8
# UUCP subsystem
LOG_CRON
=
9
# clock daemon
LOG_AUTHPRIV
=
10
# security/authorization messages (private)
# other codes through 15 reserved for system use
LOG_LOCAL0
=
16
# reserved for local use
LOG_LOCAL1
=
17
# reserved for local use
LOG_LOCAL2
=
18
# reserved for local use
LOG_LOCAL3
=
19
# reserved for local use
LOG_LOCAL4
=
20
# reserved for local use
LOG_LOCAL5
=
21
# reserved for local use
LOG_LOCAL6
=
22
# reserved for local use
LOG_LOCAL7
=
23
# reserved for local use
LOG_LOCAL0
=
16
# reserved for local use
LOG_LOCAL1
=
17
# reserved for local use
LOG_LOCAL2
=
18
# reserved for local use
LOG_LOCAL3
=
19
# reserved for local use
LOG_LOCAL4
=
20
# reserved for local use
LOG_LOCAL5
=
21
# reserved for local use
LOG_LOCAL6
=
22
# reserved for local use
LOG_LOCAL7
=
23
# reserved for local use
priority_names
=
{
"alert"
:
LOG_ALERT
,
"crit"
:
LOG_CRIT
,
"debug"
:
LOG_DEBUG
,
"emerg"
:
LOG_EMERG
,
"err"
:
LOG_ERR
,
"error"
:
LOG_ERR
,
# DEPRECATED
"info"
:
LOG_INFO
,
"notice"
:
LOG_NOTICE
,
"panic"
:
LOG_EMERG
,
# DEPRECATED
"warn"
:
LOG_WARNING
,
# DEPRECATED
"warning"
:
LOG_WARNING
,
}
"alert"
:
LOG_ALERT
,
"crit"
:
LOG_CRIT
,
"debug"
:
LOG_DEBUG
,
"emerg"
:
LOG_EMERG
,
"err"
:
LOG_ERR
,
"error"
:
LOG_ERR
,
# DEPRECATED
"info"
:
LOG_INFO
,
"notice"
:
LOG_NOTICE
,
"panic"
:
LOG_EMERG
,
# DEPRECATED
"warn"
:
LOG_WARNING
,
# DEPRECATED
"warning"
:
LOG_WARNING
,
}
facility_names
=
{
"auth"
:
LOG_AUTH
,
"authpriv"
:
LOG_AUTHPRIV
,
"cron"
:
LOG_CRON
,
"daemon"
:
LOG_DAEMON
,
"kern"
:
LOG_KERN
,
"lpr"
:
LOG_LPR
,
"mail"
:
LOG_MAIL
,
"news"
:
LOG_NEWS
,
"security"
:
LOG_AUTH
,
# DEPRECATED
"syslog"
:
LOG_SYSLOG
,
"user"
:
LOG_USER
,
"uucp"
:
LOG_UUCP
,
"local0"
:
LOG_LOCAL0
,
"local1"
:
LOG_LOCAL1
,
"local2"
:
LOG_LOCAL2
,
"local3"
:
LOG_LOCAL3
,
"local4"
:
LOG_LOCAL4
,
"local5"
:
LOG_LOCAL5
,
"local6"
:
LOG_LOCAL6
,
"local7"
:
LOG_LOCAL7
,
}
"auth"
:
LOG_AUTH
,
"authpriv"
:
LOG_AUTHPRIV
,
"cron"
:
LOG_CRON
,
"daemon"
:
LOG_DAEMON
,
"kern"
:
LOG_KERN
,
"lpr"
:
LOG_LPR
,
"mail"
:
LOG_MAIL
,
"news"
:
LOG_NEWS
,
"security"
:
LOG_AUTH
,
# DEPRECATED
"syslog"
:
LOG_SYSLOG
,
"user"
:
LOG_USER
,
"uucp"
:
LOG_UUCP
,
"local0"
:
LOG_LOCAL0
,
"local1"
:
LOG_LOCAL1
,
"local2"
:
LOG_LOCAL2
,
"local3"
:
LOG_LOCAL3
,
"local4"
:
LOG_LOCAL4
,
"local5"
:
LOG_LOCAL5
,
"local6"
:
LOG_LOCAL6
,
"local7"
:
LOG_LOCAL7
,
}
import
socket
class
syslog_client
:
def
__init__
(
self
,
address
=
'/dev/log'
):
self
.
address
=
address
if
type
(
address
)
==
type
(
''
):
try
:
# APUE 13.4.2 specifes /dev/log as datagram socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
def
__init__
(
self
,
address
=
'/dev/log'
):
self
.
address
=
address
if
type
(
address
)
==
type
(
''
):
try
:
# APUE 13.4.2 specifes /dev/log as datagram socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_DGRAM
)
self
.
socket
.
connect
(
address
)
except
:
# older linux may create as stream socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
self
.
socket
.
connect
(
address
)
except
:
# older linux may create as stream socket
self
.
socket
=
socket
.
socket
(
socket
.
AF_UNIX
,
socket
.
SOCK_STREAM
)
self
.
socket
.
connect
(
address
)
self
.
unix
=
1
else
:
self
.
socket
=
socket
.
socket
(
socket
.
AF_INET
self
.
socket
.
connect
(
address
)
self
.
unix
=
1
else
:
self
.
socket
=
socket
.
socket
(
socket
.
AF_INET
,
socket
.
SOCK_DGRAM
)
self
.
unix
=
0
# curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if
# necessary.
log_format_string
=
'<%d>%s
\
000
'
def
log
(
self
,
message
,
facility
=
LOG_USER
,
priority
=
LOG_INFO
):
message
=
self
.
log_format_string
%
(
self
.
encode_priority
(
facility
,
priority
),
message
)
if
self
.
unix
:
self
.
socket
.
send
(
message
)
else
:
self
.
socket
.
sendto
(
message
,
self
.
address
)
def
encode_priority
(
self
,
facility
,
priority
):
if
type
(
facility
)
==
type
(
''
):
facility
=
facility_names
[
facility
]
if
type
(
priority
)
==
type
(
''
):
priority
=
priority_names
[
priority
]
return
(
facility
<<
3
)
|
priority
def
close
(
self
):
if
self
.
unix
:
self
.
socket
.
close
()
self
.
unix
=
0
# curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if
# necessary.
log_format_string
=
'<%d>%s
\
000
'
def
log
(
self
,
message
,
facility
=
LOG_USER
,
priority
=
LOG_INFO
):
message
=
self
.
log_format_string
%
(
self
.
encode_priority
(
facility
,
priority
),
message
)
if
self
.
unix
:
self
.
socket
.
send
(
message
)
else
:
self
.
socket
.
sendto
(
message
,
self
.
address
)
def
encode_priority
(
self
,
facility
,
priority
):
if
type
(
facility
)
==
type
(
''
):
facility
=
facility_names
[
facility
]
if
type
(
priority
)
==
type
(
''
):
priority
=
priority_names
[
priority
]
return
(
facility
<<
3
)
|
priority
def
close
(
self
):
if
self
.
unix
:
self
.
socket
.
close
()
if
__name__
==
'__main__'
:
"""
Unit test for syslog_client. Set up for the test by:
* tail -f /var/log/allstuf (to see the "normal" log messages).
* tail -f /var/log/allstuf (to see the "normal" log messages).
* Running the test_logger.py script with a junk file name (which
will be opened as a Unix-domain socket). "Custom" log messages
will go here.
will be opened as a Unix-domain socket). "Custom" log messages
will go here.
* Run this script, passing the same junk file name.
* Run this script, passing the same junk file name.
* Check that the "bogus" test throws, and that none of the rest do.
* Check that the "bogus" test throws, and that none of the rest do.
* Check that the 'default' and 'UDP' messages show up in the tail.
* Check that the 'default' and 'UDP' messages show up in the tail.
* Check that the 'non-std' message shows up in the test_logger
console.
* Check that the 'non-std' message shows up in the test_logger
console.
* Finally, kill off the tail and test_logger, and clean up the
socket file.
* Finally, kill off the tail and test_logger, and clean up the
socket file.
"""
import
sys
,
traceback
...
...
@@ -215,14 +215,14 @@ if __name__ == '__main__':
def
test_client
(
desc
,
address
=
None
):
try
:
if
address
:
client
=
syslog_client
(
address
)
else
:
client
=
syslog_client
()
if
address
:
client
=
syslog_client
(
address
)
else
:
client
=
syslog_client
()
except
:
print
'syslog_client() [%s] ctor threw'
%
desc
print
'syslog_client() [%s] ctor threw'
%
desc
traceback
.
print_exc
()
return
return
try
:
client
.
log
(
'testing syslog_client() [%s]'
%
desc
...
...
z2.py
View file @
58435909
...
...
@@ -368,7 +368,7 @@ def server_info(old, v, offset=0):
if
v
==
'-'
:
v
=
''
l
=
string
.
find
(
v
,
':'
)
if
l
>=
0
:
a
=
v
[:
l
]
a
=
v
[:
l
]
v
=
v
[
l
+
1
:]
else
:
a
=
IP_ADDRESS
...
...
@@ -592,24 +592,24 @@ else:
if
HTTP_PORT
:
if
type
(
HTTP_PORT
)
is
type
(
0
):
HTTP_PORT
=
((
IP_ADDRESS
,
HTTP_PORT
),)
for
address
,
port
in
HTTP_PORT
:
hs
=
zhttp_server
(
ip
=
address
,
port
=
port
,
resolver
=
rs
,
logger_object
=
lg
)
# Handler for a published module. zhttp_handler takes 3 arguments:
# The name of the module to publish, and optionally the URI base
# which is basically the SCIRPT_NAME, and optionally a dictionary
# with CGI environment variables which override default
# settings. The URI base setting is useful when you want to
# publish more than one module with the same HTTP server. The CGI
# environment setting is useful when you want to proxy requests
# from another web server to ZServer, and would like the CGI
# environment to reflect the CGI environment of the other web
# server.
zh
=
zhttp_handler
(
MODULE
,
''
,
HTTP_ENV
)
hs
.
install_handler
(
zh
)
hs
=
zhttp_server
(
ip
=
address
,
port
=
port
,
resolver
=
rs
,
logger_object
=
lg
)
# Handler for a published module. zhttp_handler takes 3 arguments:
# The name of the module to publish, and optionally the URI base
# which is basically the SCIRPT_NAME, and optionally a dictionary
# with CGI environment variables which override default
# settings. The URI base setting is useful when you want to
# publish more than one module with the same HTTP server. The CGI
# environment setting is useful when you want to proxy requests
# from another web server to ZServer, and would like the CGI
# environment to reflect the CGI environment of the other web
# server.
zh
=
zhttp_handler
(
MODULE
,
''
,
HTTP_ENV
)
hs
.
install_handler
(
zh
)
# FTP Server
...
...
@@ -618,7 +618,7 @@ if FTP_PORT:
for
address
,
port
in
FTP_PORT
:
FTPServer
(
module
=
MODULE
,
ip
=
address
,
ip
=
address
,
port
=
port
,
resolver
=
rs
,
logger_object
=
lg
)
...
...
@@ -659,8 +659,8 @@ if MONITOR_PORT:
from
AccessControl.User
import
super
monitor
=
secure_monitor_server
(
password
=
super
.
_getPassword
(),
hostname
=
address
,
port
=
port
)
hostname
=
address
,
port
=
port
)
# Try to set uid to "-u" -provided uid.
# Try to set gid to "-u" user's primary group.
...
...
@@ -675,7 +675,7 @@ try:
elif
type
(
UID
)
==
type
(
1
):
uid
=
pwd
.
getpwuid
(
UID
)[
2
]
gid
=
pwd
.
getpwuid
(
UID
)[
3
]
else
:
else
:
raise
KeyError
try
:
if
gid
is
not
None
:
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment