Commit 58435909 authored by 's avatar

untabify

parent f4a65b80
This diff is collapsed.
...@@ -68,144 +68,144 @@ Usage: ...@@ -68,144 +68,144 @@ Usage:
# #
# priorities (these are ordered) # priorities (these are ordered)
LOG_EMERG = 0 # system is unusable LOG_EMERG = 0 # system is unusable
LOG_ALERT = 1 # action must be taken immediately LOG_ALERT = 1 # action must be taken immediately
LOG_CRIT = 2 # critical conditions LOG_CRIT = 2 # critical conditions
LOG_ERR = 3 # error conditions LOG_ERR = 3 # error conditions
LOG_WARNING = 4 # warning conditions LOG_WARNING = 4 # warning conditions
LOG_NOTICE = 5 # normal but significant condition LOG_NOTICE = 5 # normal but significant condition
LOG_INFO = 6 # informational LOG_INFO = 6 # informational
LOG_DEBUG = 7 # debug-level messages LOG_DEBUG = 7 # debug-level messages
# facility codes # facility codes
LOG_KERN = 0 # kernel messages LOG_KERN = 0 # kernel messages
LOG_USER = 1 # random user-level messages LOG_USER = 1 # random user-level messages
LOG_MAIL = 2 # mail system LOG_MAIL = 2 # mail system
LOG_DAEMON = 3 # system daemons LOG_DAEMON = 3 # system daemons
LOG_AUTH = 4 # security/authorization messages LOG_AUTH = 4 # security/authorization messages
LOG_SYSLOG = 5 # messages generated internally by syslogd LOG_SYSLOG = 5 # messages generated internally by syslogd
LOG_LPR = 6 # line printer subsystem LOG_LPR = 6 # line printer subsystem
LOG_NEWS = 7 # network news subsystem LOG_NEWS = 7 # network news subsystem
LOG_UUCP = 8 # UUCP subsystem LOG_UUCP = 8 # UUCP subsystem
LOG_CRON = 9 # clock daemon LOG_CRON = 9 # clock daemon
LOG_AUTHPRIV = 10 # security/authorization messages (private) LOG_AUTHPRIV = 10 # security/authorization messages (private)
# other codes through 15 reserved for system use # other codes through 15 reserved for system use
LOG_LOCAL0 = 16 # reserved for local use LOG_LOCAL0 = 16 # reserved for local use
LOG_LOCAL1 = 17 # reserved for local use LOG_LOCAL1 = 17 # reserved for local use
LOG_LOCAL2 = 18 # reserved for local use LOG_LOCAL2 = 18 # reserved for local use
LOG_LOCAL3 = 19 # reserved for local use LOG_LOCAL3 = 19 # reserved for local use
LOG_LOCAL4 = 20 # reserved for local use LOG_LOCAL4 = 20 # reserved for local use
LOG_LOCAL5 = 21 # reserved for local use LOG_LOCAL5 = 21 # reserved for local use
LOG_LOCAL6 = 22 # reserved for local use LOG_LOCAL6 = 22 # reserved for local use
LOG_LOCAL7 = 23 # reserved for local use LOG_LOCAL7 = 23 # reserved for local use
priority_names = { priority_names = {
"alert": LOG_ALERT, "alert": LOG_ALERT,
"crit": LOG_CRIT, "crit": LOG_CRIT,
"debug": LOG_DEBUG, "debug": LOG_DEBUG,
"emerg": LOG_EMERG, "emerg": LOG_EMERG,
"err": LOG_ERR, "err": LOG_ERR,
"error": LOG_ERR, # DEPRECATED "error": LOG_ERR, # DEPRECATED
"info": LOG_INFO, "info": LOG_INFO,
"notice": LOG_NOTICE, "notice": LOG_NOTICE,
"panic": LOG_EMERG, # DEPRECATED "panic": LOG_EMERG, # DEPRECATED
"warn": LOG_WARNING, # DEPRECATED "warn": LOG_WARNING, # DEPRECATED
"warning": LOG_WARNING, "warning": LOG_WARNING,
} }
facility_names = { facility_names = {
"auth": LOG_AUTH, "auth": LOG_AUTH,
"authpriv": LOG_AUTHPRIV, "authpriv": LOG_AUTHPRIV,
"cron": LOG_CRON, "cron": LOG_CRON,
"daemon": LOG_DAEMON, "daemon": LOG_DAEMON,
"kern": LOG_KERN, "kern": LOG_KERN,
"lpr": LOG_LPR, "lpr": LOG_LPR,
"mail": LOG_MAIL, "mail": LOG_MAIL,
"news": LOG_NEWS, "news": LOG_NEWS,
"security": LOG_AUTH, # DEPRECATED "security": LOG_AUTH, # DEPRECATED
"syslog": LOG_SYSLOG, "syslog": LOG_SYSLOG,
"user": LOG_USER, "user": LOG_USER,
"uucp": LOG_UUCP, "uucp": LOG_UUCP,
"local0": LOG_LOCAL0, "local0": LOG_LOCAL0,
"local1": LOG_LOCAL1, "local1": LOG_LOCAL1,
"local2": LOG_LOCAL2, "local2": LOG_LOCAL2,
"local3": LOG_LOCAL3, "local3": LOG_LOCAL3,
"local4": LOG_LOCAL4, "local4": LOG_LOCAL4,
"local5": LOG_LOCAL5, "local5": LOG_LOCAL5,
"local6": LOG_LOCAL6, "local6": LOG_LOCAL6,
"local7": LOG_LOCAL7, "local7": LOG_LOCAL7,
} }
import socket import socket
class syslog_client: class syslog_client:
def __init__ (self, address='/dev/log'): def __init__ (self, address='/dev/log'):
self.address = address self.address = address
if type (address) == type(''): if type (address) == type(''):
try: # APUE 13.4.2 specifes /dev/log as datagram socket try: # APUE 13.4.2 specifes /dev/log as datagram socket
self.socket = socket.socket( socket.AF_UNIX self.socket = socket.socket( socket.AF_UNIX
, socket.SOCK_DGRAM) , socket.SOCK_DGRAM)
self.socket.connect (address) self.socket.connect (address)
except: # older linux may create as stream socket except: # older linux may create as stream socket
self.socket = socket.socket( socket.AF_UNIX self.socket = socket.socket( socket.AF_UNIX
, socket.SOCK_STREAM) , socket.SOCK_STREAM)
self.socket.connect (address) self.socket.connect (address)
self.unix = 1 self.unix = 1
else: else:
self.socket = socket.socket( socket.AF_INET self.socket = socket.socket( socket.AF_INET
, socket.SOCK_DGRAM) , socket.SOCK_DGRAM)
self.unix = 0 self.unix = 0
# curious: when talking to the unix-domain '/dev/log' socket, a # curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed # zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if # into a class variable so that it can be overridden if
# necessary. # necessary.
log_format_string = '<%d>%s\000' log_format_string = '<%d>%s\000'
def log (self, message, facility=LOG_USER, priority=LOG_INFO): def log (self, message, facility=LOG_USER, priority=LOG_INFO):
message = self.log_format_string % ( message = self.log_format_string % (
self.encode_priority (facility, priority), self.encode_priority (facility, priority),
message message
) )
if self.unix: if self.unix:
self.socket.send (message) self.socket.send (message)
else: else:
self.socket.sendto (message, self.address) self.socket.sendto (message, self.address)
def encode_priority (self, facility, priority): def encode_priority (self, facility, priority):
if type(facility) == type(''): if type(facility) == type(''):
facility = facility_names[facility] facility = facility_names[facility]
if type(priority) == type(''): if type(priority) == type(''):
priority = priority_names[priority] priority = priority_names[priority]
return (facility<<3) | priority return (facility<<3) | priority
def close (self): def close (self):
if self.unix: if self.unix:
self.socket.close() self.socket.close()
if __name__ == '__main__': if __name__ == '__main__':
""" """
Unit test for syslog_client. Set up for the test by: 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 * Running the test_logger.py script with a junk file name (which
will be opened as a Unix-domain socket). "Custom" log messages will be opened as a Unix-domain socket). "Custom" log messages
will go here. 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 * Check that the 'non-std' message shows up in the test_logger
console. console.
* Finally, kill off the tail and test_logger, and clean up the * Finally, kill off the tail and test_logger, and clean up the
socket file. socket file.
""" """
import sys, traceback import sys, traceback
...@@ -215,14 +215,14 @@ if __name__ == '__main__': ...@@ -215,14 +215,14 @@ if __name__ == '__main__':
def test_client( desc, address=None ): def test_client( desc, address=None ):
try: try:
if address: if address:
client = syslog_client( address ) client = syslog_client( address )
else: else:
client = syslog_client() client = syslog_client()
except: except:
print 'syslog_client() [%s] ctor threw' % desc print 'syslog_client() [%s] ctor threw' % desc
traceback.print_exc() traceback.print_exc()
return return
try: try:
client.log( 'testing syslog_client() [%s]' % desc client.log( 'testing syslog_client() [%s]' % desc
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
############################################################################## ##############################################################################
"""Image object""" """Image object"""
__version__='$Revision: 1.101 $'[11:-2] __version__='$Revision: 1.102 $'[11:-2]
import Globals, string, struct, content_types import Globals, string, struct, content_types
from OFS.content_types import guess_content_type from OFS.content_types import guess_content_type
...@@ -194,12 +194,12 @@ class File(Persistent,Implicit,PropertyManager, ...@@ -194,12 +194,12 @@ class File(Persistent,Implicit,PropertyManager,
if header is not None: if header is not None:
header=string.split(header, ';')[0] header=string.split(header, ';')[0]
mod_since=int(DateTime(header).timeTime()) mod_since=int(DateTime(header).timeTime())
if self._p_mtime: if self._p_mtime:
last_mod = int(self._p_mtime) last_mod = int(self._p_mtime)
else: else:
last_mod = 0 last_mod = 0
if last_mod > 0 and last_mod <= mod_since: if last_mod > 0 and last_mod <= mod_since:
RESPONSE.setStatus(304) RESPONSE.setStatus(304)
return RESPONSE return RESPONSE
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
############################################################################## ##############################################################################
"""Utility module to help manage the asyncore mainloop in a multi-threaded app """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 thread
import asyncore import asyncore
...@@ -105,7 +105,7 @@ def _start_loop(map): ...@@ -105,7 +105,7 @@ def _start_loop(map):
try: try:
global _looping global _looping
_looping=1 _looping=1
while _loop_callbacks: while _loop_callbacks:
cb, args, kw = _loop_callbacks.pop() cb, args, kw = _loop_callbacks.pop()
apply(cb, (map,)+args, kw or {}) apply(cb, (map,)+args, kw or {})
......
...@@ -68,144 +68,144 @@ Usage: ...@@ -68,144 +68,144 @@ Usage:
# #
# priorities (these are ordered) # priorities (these are ordered)
LOG_EMERG = 0 # system is unusable LOG_EMERG = 0 # system is unusable
LOG_ALERT = 1 # action must be taken immediately LOG_ALERT = 1 # action must be taken immediately
LOG_CRIT = 2 # critical conditions LOG_CRIT = 2 # critical conditions
LOG_ERR = 3 # error conditions LOG_ERR = 3 # error conditions
LOG_WARNING = 4 # warning conditions LOG_WARNING = 4 # warning conditions
LOG_NOTICE = 5 # normal but significant condition LOG_NOTICE = 5 # normal but significant condition
LOG_INFO = 6 # informational LOG_INFO = 6 # informational
LOG_DEBUG = 7 # debug-level messages LOG_DEBUG = 7 # debug-level messages
# facility codes # facility codes
LOG_KERN = 0 # kernel messages LOG_KERN = 0 # kernel messages
LOG_USER = 1 # random user-level messages LOG_USER = 1 # random user-level messages
LOG_MAIL = 2 # mail system LOG_MAIL = 2 # mail system
LOG_DAEMON = 3 # system daemons LOG_DAEMON = 3 # system daemons
LOG_AUTH = 4 # security/authorization messages LOG_AUTH = 4 # security/authorization messages
LOG_SYSLOG = 5 # messages generated internally by syslogd LOG_SYSLOG = 5 # messages generated internally by syslogd
LOG_LPR = 6 # line printer subsystem LOG_LPR = 6 # line printer subsystem
LOG_NEWS = 7 # network news subsystem LOG_NEWS = 7 # network news subsystem
LOG_UUCP = 8 # UUCP subsystem LOG_UUCP = 8 # UUCP subsystem
LOG_CRON = 9 # clock daemon LOG_CRON = 9 # clock daemon
LOG_AUTHPRIV = 10 # security/authorization messages (private) LOG_AUTHPRIV = 10 # security/authorization messages (private)
# other codes through 15 reserved for system use # other codes through 15 reserved for system use
LOG_LOCAL0 = 16 # reserved for local use LOG_LOCAL0 = 16 # reserved for local use
LOG_LOCAL1 = 17 # reserved for local use LOG_LOCAL1 = 17 # reserved for local use
LOG_LOCAL2 = 18 # reserved for local use LOG_LOCAL2 = 18 # reserved for local use
LOG_LOCAL3 = 19 # reserved for local use LOG_LOCAL3 = 19 # reserved for local use
LOG_LOCAL4 = 20 # reserved for local use LOG_LOCAL4 = 20 # reserved for local use
LOG_LOCAL5 = 21 # reserved for local use LOG_LOCAL5 = 21 # reserved for local use
LOG_LOCAL6 = 22 # reserved for local use LOG_LOCAL6 = 22 # reserved for local use
LOG_LOCAL7 = 23 # reserved for local use LOG_LOCAL7 = 23 # reserved for local use
priority_names = { priority_names = {
"alert": LOG_ALERT, "alert": LOG_ALERT,
"crit": LOG_CRIT, "crit": LOG_CRIT,
"debug": LOG_DEBUG, "debug": LOG_DEBUG,
"emerg": LOG_EMERG, "emerg": LOG_EMERG,
"err": LOG_ERR, "err": LOG_ERR,
"error": LOG_ERR, # DEPRECATED "error": LOG_ERR, # DEPRECATED
"info": LOG_INFO, "info": LOG_INFO,
"notice": LOG_NOTICE, "notice": LOG_NOTICE,
"panic": LOG_EMERG, # DEPRECATED "panic": LOG_EMERG, # DEPRECATED
"warn": LOG_WARNING, # DEPRECATED "warn": LOG_WARNING, # DEPRECATED
"warning": LOG_WARNING, "warning": LOG_WARNING,
} }
facility_names = { facility_names = {
"auth": LOG_AUTH, "auth": LOG_AUTH,
"authpriv": LOG_AUTHPRIV, "authpriv": LOG_AUTHPRIV,
"cron": LOG_CRON, "cron": LOG_CRON,
"daemon": LOG_DAEMON, "daemon": LOG_DAEMON,
"kern": LOG_KERN, "kern": LOG_KERN,
"lpr": LOG_LPR, "lpr": LOG_LPR,
"mail": LOG_MAIL, "mail": LOG_MAIL,
"news": LOG_NEWS, "news": LOG_NEWS,
"security": LOG_AUTH, # DEPRECATED "security": LOG_AUTH, # DEPRECATED
"syslog": LOG_SYSLOG, "syslog": LOG_SYSLOG,
"user": LOG_USER, "user": LOG_USER,
"uucp": LOG_UUCP, "uucp": LOG_UUCP,
"local0": LOG_LOCAL0, "local0": LOG_LOCAL0,
"local1": LOG_LOCAL1, "local1": LOG_LOCAL1,
"local2": LOG_LOCAL2, "local2": LOG_LOCAL2,
"local3": LOG_LOCAL3, "local3": LOG_LOCAL3,
"local4": LOG_LOCAL4, "local4": LOG_LOCAL4,
"local5": LOG_LOCAL5, "local5": LOG_LOCAL5,
"local6": LOG_LOCAL6, "local6": LOG_LOCAL6,
"local7": LOG_LOCAL7, "local7": LOG_LOCAL7,
} }
import socket import socket
class syslog_client: class syslog_client:
def __init__ (self, address='/dev/log'): def __init__ (self, address='/dev/log'):
self.address = address self.address = address
if type (address) == type(''): if type (address) == type(''):
try: # APUE 13.4.2 specifes /dev/log as datagram socket try: # APUE 13.4.2 specifes /dev/log as datagram socket
self.socket = socket.socket( socket.AF_UNIX self.socket = socket.socket( socket.AF_UNIX
, socket.SOCK_DGRAM) , socket.SOCK_DGRAM)
self.socket.connect (address) self.socket.connect (address)
except: # older linux may create as stream socket except: # older linux may create as stream socket
self.socket = socket.socket( socket.AF_UNIX self.socket = socket.socket( socket.AF_UNIX
, socket.SOCK_STREAM) , socket.SOCK_STREAM)
self.socket.connect (address) self.socket.connect (address)
self.unix = 1 self.unix = 1
else: else:
self.socket = socket.socket( socket.AF_INET self.socket = socket.socket( socket.AF_INET
, socket.SOCK_DGRAM) , socket.SOCK_DGRAM)
self.unix = 0 self.unix = 0
# curious: when talking to the unix-domain '/dev/log' socket, a # curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed # zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if # into a class variable so that it can be overridden if
# necessary. # necessary.
log_format_string = '<%d>%s\000' log_format_string = '<%d>%s\000'
def log (self, message, facility=LOG_USER, priority=LOG_INFO): def log (self, message, facility=LOG_USER, priority=LOG_INFO):
message = self.log_format_string % ( message = self.log_format_string % (
self.encode_priority (facility, priority), self.encode_priority (facility, priority),
message message
) )
if self.unix: if self.unix:
self.socket.send (message) self.socket.send (message)
else: else:
self.socket.sendto (message, self.address) self.socket.sendto (message, self.address)
def encode_priority (self, facility, priority): def encode_priority (self, facility, priority):
if type(facility) == type(''): if type(facility) == type(''):
facility = facility_names[facility] facility = facility_names[facility]
if type(priority) == type(''): if type(priority) == type(''):
priority = priority_names[priority] priority = priority_names[priority]
return (facility<<3) | priority return (facility<<3) | priority
def close (self): def close (self):
if self.unix: if self.unix:
self.socket.close() self.socket.close()
if __name__ == '__main__': if __name__ == '__main__':
""" """
Unit test for syslog_client. Set up for the test by: 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 * Running the test_logger.py script with a junk file name (which
will be opened as a Unix-domain socket). "Custom" log messages will be opened as a Unix-domain socket). "Custom" log messages
will go here. 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 * Check that the 'non-std' message shows up in the test_logger
console. console.
* Finally, kill off the tail and test_logger, and clean up the * Finally, kill off the tail and test_logger, and clean up the
socket file. socket file.
""" """
import sys, traceback import sys, traceback
...@@ -215,14 +215,14 @@ if __name__ == '__main__': ...@@ -215,14 +215,14 @@ if __name__ == '__main__':
def test_client( desc, address=None ): def test_client( desc, address=None ):
try: try:
if address: if address:
client = syslog_client( address ) client = syslog_client( address )
else: else:
client = syslog_client() client = syslog_client()
except: except:
print 'syslog_client() [%s] ctor threw' % desc print 'syslog_client() [%s] ctor threw' % desc
traceback.print_exc() traceback.print_exc()
return return
try: try:
client.log( 'testing syslog_client() [%s]' % desc client.log( 'testing syslog_client() [%s]' % desc
......
This diff is collapsed.
...@@ -68,144 +68,144 @@ Usage: ...@@ -68,144 +68,144 @@ Usage:
# #
# priorities (these are ordered) # priorities (these are ordered)
LOG_EMERG = 0 # system is unusable LOG_EMERG = 0 # system is unusable
LOG_ALERT = 1 # action must be taken immediately LOG_ALERT = 1 # action must be taken immediately
LOG_CRIT = 2 # critical conditions LOG_CRIT = 2 # critical conditions
LOG_ERR = 3 # error conditions LOG_ERR = 3 # error conditions
LOG_WARNING = 4 # warning conditions LOG_WARNING = 4 # warning conditions
LOG_NOTICE = 5 # normal but significant condition LOG_NOTICE = 5 # normal but significant condition
LOG_INFO = 6 # informational LOG_INFO = 6 # informational
LOG_DEBUG = 7 # debug-level messages LOG_DEBUG = 7 # debug-level messages
# facility codes # facility codes
LOG_KERN = 0 # kernel messages LOG_KERN = 0 # kernel messages
LOG_USER = 1 # random user-level messages LOG_USER = 1 # random user-level messages
LOG_MAIL = 2 # mail system LOG_MAIL = 2 # mail system
LOG_DAEMON = 3 # system daemons LOG_DAEMON = 3 # system daemons
LOG_AUTH = 4 # security/authorization messages LOG_AUTH = 4 # security/authorization messages
LOG_SYSLOG = 5 # messages generated internally by syslogd LOG_SYSLOG = 5 # messages generated internally by syslogd
LOG_LPR = 6 # line printer subsystem LOG_LPR = 6 # line printer subsystem
LOG_NEWS = 7 # network news subsystem LOG_NEWS = 7 # network news subsystem
LOG_UUCP = 8 # UUCP subsystem LOG_UUCP = 8 # UUCP subsystem
LOG_CRON = 9 # clock daemon LOG_CRON = 9 # clock daemon
LOG_AUTHPRIV = 10 # security/authorization messages (private) LOG_AUTHPRIV = 10 # security/authorization messages (private)
# other codes through 15 reserved for system use # other codes through 15 reserved for system use
LOG_LOCAL0 = 16 # reserved for local use LOG_LOCAL0 = 16 # reserved for local use
LOG_LOCAL1 = 17 # reserved for local use LOG_LOCAL1 = 17 # reserved for local use
LOG_LOCAL2 = 18 # reserved for local use LOG_LOCAL2 = 18 # reserved for local use
LOG_LOCAL3 = 19 # reserved for local use LOG_LOCAL3 = 19 # reserved for local use
LOG_LOCAL4 = 20 # reserved for local use LOG_LOCAL4 = 20 # reserved for local use
LOG_LOCAL5 = 21 # reserved for local use LOG_LOCAL5 = 21 # reserved for local use
LOG_LOCAL6 = 22 # reserved for local use LOG_LOCAL6 = 22 # reserved for local use
LOG_LOCAL7 = 23 # reserved for local use LOG_LOCAL7 = 23 # reserved for local use
priority_names = { priority_names = {
"alert": LOG_ALERT, "alert": LOG_ALERT,
"crit": LOG_CRIT, "crit": LOG_CRIT,
"debug": LOG_DEBUG, "debug": LOG_DEBUG,
"emerg": LOG_EMERG, "emerg": LOG_EMERG,
"err": LOG_ERR, "err": LOG_ERR,
"error": LOG_ERR, # DEPRECATED "error": LOG_ERR, # DEPRECATED
"info": LOG_INFO, "info": LOG_INFO,
"notice": LOG_NOTICE, "notice": LOG_NOTICE,
"panic": LOG_EMERG, # DEPRECATED "panic": LOG_EMERG, # DEPRECATED
"warn": LOG_WARNING, # DEPRECATED "warn": LOG_WARNING, # DEPRECATED
"warning": LOG_WARNING, "warning": LOG_WARNING,
} }
facility_names = { facility_names = {
"auth": LOG_AUTH, "auth": LOG_AUTH,
"authpriv": LOG_AUTHPRIV, "authpriv": LOG_AUTHPRIV,
"cron": LOG_CRON, "cron": LOG_CRON,
"daemon": LOG_DAEMON, "daemon": LOG_DAEMON,
"kern": LOG_KERN, "kern": LOG_KERN,
"lpr": LOG_LPR, "lpr": LOG_LPR,
"mail": LOG_MAIL, "mail": LOG_MAIL,
"news": LOG_NEWS, "news": LOG_NEWS,
"security": LOG_AUTH, # DEPRECATED "security": LOG_AUTH, # DEPRECATED
"syslog": LOG_SYSLOG, "syslog": LOG_SYSLOG,
"user": LOG_USER, "user": LOG_USER,
"uucp": LOG_UUCP, "uucp": LOG_UUCP,
"local0": LOG_LOCAL0, "local0": LOG_LOCAL0,
"local1": LOG_LOCAL1, "local1": LOG_LOCAL1,
"local2": LOG_LOCAL2, "local2": LOG_LOCAL2,
"local3": LOG_LOCAL3, "local3": LOG_LOCAL3,
"local4": LOG_LOCAL4, "local4": LOG_LOCAL4,
"local5": LOG_LOCAL5, "local5": LOG_LOCAL5,
"local6": LOG_LOCAL6, "local6": LOG_LOCAL6,
"local7": LOG_LOCAL7, "local7": LOG_LOCAL7,
} }
import socket import socket
class syslog_client: class syslog_client:
def __init__ (self, address='/dev/log'): def __init__ (self, address='/dev/log'):
self.address = address self.address = address
if type (address) == type(''): if type (address) == type(''):
try: # APUE 13.4.2 specifes /dev/log as datagram socket try: # APUE 13.4.2 specifes /dev/log as datagram socket
self.socket = socket.socket( socket.AF_UNIX self.socket = socket.socket( socket.AF_UNIX
, socket.SOCK_DGRAM) , socket.SOCK_DGRAM)
self.socket.connect (address) self.socket.connect (address)
except: # older linux may create as stream socket except: # older linux may create as stream socket
self.socket = socket.socket( socket.AF_UNIX self.socket = socket.socket( socket.AF_UNIX
, socket.SOCK_STREAM) , socket.SOCK_STREAM)
self.socket.connect (address) self.socket.connect (address)
self.unix = 1 self.unix = 1
else: else:
self.socket = socket.socket( socket.AF_INET self.socket = socket.socket( socket.AF_INET
, socket.SOCK_DGRAM) , socket.SOCK_DGRAM)
self.unix = 0 self.unix = 0
# curious: when talking to the unix-domain '/dev/log' socket, a # curious: when talking to the unix-domain '/dev/log' socket, a
# zero-terminator seems to be required. this string is placed # zero-terminator seems to be required. this string is placed
# into a class variable so that it can be overridden if # into a class variable so that it can be overridden if
# necessary. # necessary.
log_format_string = '<%d>%s\000' log_format_string = '<%d>%s\000'
def log (self, message, facility=LOG_USER, priority=LOG_INFO): def log (self, message, facility=LOG_USER, priority=LOG_INFO):
message = self.log_format_string % ( message = self.log_format_string % (
self.encode_priority (facility, priority), self.encode_priority (facility, priority),
message message
) )
if self.unix: if self.unix:
self.socket.send (message) self.socket.send (message)
else: else:
self.socket.sendto (message, self.address) self.socket.sendto (message, self.address)
def encode_priority (self, facility, priority): def encode_priority (self, facility, priority):
if type(facility) == type(''): if type(facility) == type(''):
facility = facility_names[facility] facility = facility_names[facility]
if type(priority) == type(''): if type(priority) == type(''):
priority = priority_names[priority] priority = priority_names[priority]
return (facility<<3) | priority return (facility<<3) | priority
def close (self): def close (self):
if self.unix: if self.unix:
self.socket.close() self.socket.close()
if __name__ == '__main__': if __name__ == '__main__':
""" """
Unit test for syslog_client. Set up for the test by: 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 * Running the test_logger.py script with a junk file name (which
will be opened as a Unix-domain socket). "Custom" log messages will be opened as a Unix-domain socket). "Custom" log messages
will go here. 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 * Check that the 'non-std' message shows up in the test_logger
console. console.
* Finally, kill off the tail and test_logger, and clean up the * Finally, kill off the tail and test_logger, and clean up the
socket file. socket file.
""" """
import sys, traceback import sys, traceback
...@@ -215,14 +215,14 @@ if __name__ == '__main__': ...@@ -215,14 +215,14 @@ if __name__ == '__main__':
def test_client( desc, address=None ): def test_client( desc, address=None ):
try: try:
if address: if address:
client = syslog_client( address ) client = syslog_client( address )
else: else:
client = syslog_client() client = syslog_client()
except: except:
print 'syslog_client() [%s] ctor threw' % desc print 'syslog_client() [%s] ctor threw' % desc
traceback.print_exc() traceback.print_exc()
return return
try: try:
client.log( 'testing syslog_client() [%s]' % desc client.log( 'testing syslog_client() [%s]' % desc
......
...@@ -368,7 +368,7 @@ def server_info(old, v, offset=0): ...@@ -368,7 +368,7 @@ def server_info(old, v, offset=0):
if v == '-': v='' if v == '-': v=''
l=string.find(v, ':') l=string.find(v, ':')
if l >= 0: if l >= 0:
a=v[:l] a=v[:l]
v=v[l+1:] v=v[l+1:]
else: else:
a=IP_ADDRESS a=IP_ADDRESS
...@@ -592,24 +592,24 @@ else: ...@@ -592,24 +592,24 @@ else:
if HTTP_PORT: if HTTP_PORT:
if type(HTTP_PORT) is type(0): HTTP_PORT=((IP_ADDRESS, HTTP_PORT),) if type(HTTP_PORT) is type(0): HTTP_PORT=((IP_ADDRESS, HTTP_PORT),)
for address, port in HTTP_PORT: for address, port in HTTP_PORT:
hs = zhttp_server( hs = zhttp_server(
ip=address, ip=address,
port=port, port=port,
resolver=rs, resolver=rs,
logger_object=lg) logger_object=lg)
# Handler for a published module. zhttp_handler takes 3 arguments: # Handler for a published module. zhttp_handler takes 3 arguments:
# The name of the module to publish, and optionally the URI base # The name of the module to publish, and optionally the URI base
# which is basically the SCIRPT_NAME, and optionally a dictionary # which is basically the SCIRPT_NAME, and optionally a dictionary
# with CGI environment variables which override default # with CGI environment variables which override default
# settings. The URI base setting is useful when you want to # settings. The URI base setting is useful when you want to
# publish more than one module with the same HTTP server. The CGI # publish more than one module with the same HTTP server. The CGI
# environment setting is useful when you want to proxy requests # environment setting is useful when you want to proxy requests
# from another web server to ZServer, and would like the CGI # from another web server to ZServer, and would like the CGI
# environment to reflect the CGI environment of the other web # environment to reflect the CGI environment of the other web
# server. # server.
zh = zhttp_handler(MODULE, '', HTTP_ENV) zh = zhttp_handler(MODULE, '', HTTP_ENV)
hs.install_handler(zh) hs.install_handler(zh)
# FTP Server # FTP Server
...@@ -618,7 +618,7 @@ if FTP_PORT: ...@@ -618,7 +618,7 @@ if FTP_PORT:
for address, port in FTP_PORT: for address, port in FTP_PORT:
FTPServer( FTPServer(
module=MODULE, module=MODULE,
ip=address, ip=address,
port=port, port=port,
resolver=rs, resolver=rs,
logger_object=lg) logger_object=lg)
...@@ -659,8 +659,8 @@ if MONITOR_PORT: ...@@ -659,8 +659,8 @@ if MONITOR_PORT:
from AccessControl.User import super from AccessControl.User import super
monitor=secure_monitor_server( monitor=secure_monitor_server(
password=super._getPassword(), password=super._getPassword(),
hostname=address, hostname=address,
port=port) port=port)
# Try to set uid to "-u" -provided uid. # Try to set uid to "-u" -provided uid.
# Try to set gid to "-u" user's primary group. # Try to set gid to "-u" user's primary group.
...@@ -675,7 +675,7 @@ try: ...@@ -675,7 +675,7 @@ try:
elif type(UID) == type(1): elif type(UID) == type(1):
uid = pwd.getpwuid(UID)[2] uid = pwd.getpwuid(UID)[2]
gid = pwd.getpwuid(UID)[3] gid = pwd.getpwuid(UID)[3]
else: else:
raise KeyError raise KeyError
try: try:
if gid is not None: if gid is not None:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment