1
0
mirror of https://github.com/gryf/wicd.git synced 2026-01-30 20:45:46 +01:00

Convert from \r\n to \n

This commit is contained in:
David Paleino
2011-12-15 11:43:01 +01:00
parent 7702441003
commit b7e2e0a418

View File

@@ -1,186 +1,186 @@
#!/usr/bin/env python #!/usr/bin/env python
# #
# Copyright (C) 1999-2006 Keith Dart <keith@kdart.com> # Copyright (C) 1999-2006 Keith Dart <keith@kdart.com>
# Copyright (C) 2008-2009 Dan O'Reilly <oreilldf@gmail.com> # Copyright (C) 2008-2009 Dan O'Reilly <oreilldf@gmail.com>
# #
# This library is free software; you can redistribute it and/or # This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public # modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either # License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version. # version 2.1 of the License, or (at your option) any later version.
# #
# This library is distributed in the hope that it will be useful, # This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details. # Lesser General Public License for more details.
""" """
Managing logfile rotation. A ManagedLog object is a file-like object that Managing logfile rotation. A ManagedLog object is a file-like object that
rotates itself when a maximum size is reached. rotates itself when a maximum size is reached.
""" """
import sys import sys
import os import os
import time import time
class SizeError(IOError): class SizeError(IOError):
pass pass
class LogFile(file): class LogFile(file):
"""LogFile(name, [mode="w"], [maxsize=360000]) """LogFile(name, [mode="w"], [maxsize=360000])
Opens a new file object. After writing <maxsize> bytes a SizeError Opens a new file object. After writing <maxsize> bytes a SizeError
will be raised. will be raised.
""" """
def __init__(self, name, mode="a", maxsize=360000): def __init__(self, name, mode="a", maxsize=360000):
super(LogFile, self).__init__(name, mode) super(LogFile, self).__init__(name, mode)
self.maxsize = maxsize self.maxsize = maxsize
self.eol = True self.eol = True
try: try:
self.written = os.fstat(self.fileno())[6] self.written = os.fstat(self.fileno())[6]
except OSError: except OSError:
self.written = 0 self.written = 0
def write(self, data): def write(self, data):
self.written += len(data) self.written += len(data)
data = data.decode('utf-8').encode('utf-8') data = data.decode('utf-8').encode('utf-8')
if len(data) <= 0: return if len(data) <= 0: return
if self.eol: if self.eol:
super(LogFile, self).write(self.get_time() + ' :: ') super(LogFile, self).write(self.get_time() + ' :: ')
self.eol = False self.eol = False
if data[-1] == '\n': if data[-1] == '\n':
self.eol = True self.eol = True
data = data[:-1] data = data[:-1]
super(LogFile, self).write(data.replace( super(LogFile, self).write(data.replace(
'\n', '\n' + self.get_time() + ' :: ')) '\n', '\n' + self.get_time() + ' :: '))
if self.eol: if self.eol:
super(LogFile, self).write('\n') super(LogFile, self).write('\n')
self.flush() self.flush()
if self.written > self.maxsize: if self.written > self.maxsize:
raise SizeError raise SizeError
def get_time(self): def get_time(self):
""" Return a string with the current time nicely formatted. """ Return a string with the current time nicely formatted.
The format of the returned string is yyyy/mm/dd HH:MM:SS The format of the returned string is yyyy/mm/dd HH:MM:SS
""" """
x = time.localtime() x = time.localtime()
return ''.join([ return ''.join([
str(x[0]).rjust(4, '0'), '/', str(x[1]).rjust(2, '0'), '/', str(x[0]).rjust(4, '0'), '/', str(x[1]).rjust(2, '0'), '/',
str(x[2]).rjust(2, '0'), ' ', str(x[3]).rjust(2, '0'), ':', str(x[2]).rjust(2, '0'), ' ', str(x[3]).rjust(2, '0'), ':',
str(x[4]).rjust(2, '0'), ':', str(x[5]).rjust(2, '0')]) str(x[4]).rjust(2, '0'), ':', str(x[5]).rjust(2, '0')])
def rotate(self): def rotate(self):
return rotate(self) return rotate(self)
def note(self, text): def note(self, text):
"""Writes a specially formated note text to the file. """Writes a specially formated note text to the file.
The note starts with the string '\\n#*=' so you can easily filter them. The note starts with the string '\\n#*=' so you can easily filter them.
""" """
self.write("\n#*===== %s =====\n" % (text,)) self.write("\n#*===== %s =====\n" % (text,))
class ManagedLog(object): class ManagedLog(object):
"""ManagedLog(name, [maxsize=360000], [maxsave=9]) """ManagedLog(name, [maxsize=360000], [maxsave=9])
A ManagedLog instance is a persistent log object. Write data with the A ManagedLog instance is a persistent log object. Write data with the
write() method. The log size and rotation is handled automatically. write() method. The log size and rotation is handled automatically.
""" """
def __init__(self, name, maxsize=360000, maxsave=3): def __init__(self, name, maxsize=360000, maxsave=3):
if not os.path.exists(os.path.dirname(name)): if not os.path.exists(os.path.dirname(name)):
os.makedirs(os.path.dirname(name)) os.makedirs(os.path.dirname(name))
self._lf = LogFile(name, "a", maxsize) self._lf = LogFile(name, "a", maxsize)
self.maxsave = maxsave self.maxsave = maxsave
def __repr__(self): def __repr__(self):
return "%s(%r, %r, %r)" % (self.__class__.__name__, self._lf.name, return "%s(%r, %r, %r)" % (self.__class__.__name__, self._lf.name,
self._lf.maxsize, self.maxsave) self._lf.maxsize, self.maxsave)
def write(self, data): def write(self, data):
try: try:
self._lf.write(data) self._lf.write(data)
except SizeError: except SizeError:
self._lf = rotate(self._lf, self.maxsave) self._lf = rotate(self._lf, self.maxsave)
def note(self, data): def note(self, data):
try: try:
self._lf.note(data) self._lf.note(data)
except SizeError: except SizeError:
self._lf = rotate(self._lf, self.maxsave) self._lf = rotate(self._lf, self.maxsave)
def written(self): def written(self):
return self._lf.written return self._lf.written
def rotate(self): def rotate(self):
self._lf = rotate(self._lf, self.maxsave) self._lf = rotate(self._lf, self.maxsave)
# auto-delegate remaining methods (but you should not read or seek an open # auto-delegate remaining methods (but you should not read or seek an open
# log file). # log file).
def __getattr__(self, name): def __getattr__(self, name):
return getattr(self._lf, name) return getattr(self._lf, name)
# useful for logged stdout for daemon processes # useful for logged stdout for daemon processes
class ManagedStdio(ManagedLog): class ManagedStdio(ManagedLog):
def write(self, data): def write(self, data):
try: try:
self._lf.write(data) self._lf.write(data)
except SizeError: except SizeError:
sys.stdout.flush() sys.stdout.flush()
sys.stderr.flush() sys.stderr.flush()
self._lf = rotate(self._lf, self.maxsave) self._lf = rotate(self._lf, self.maxsave)
fd = self._lf.fileno() fd = self._lf.fileno()
os.dup2(fd, 1) os.dup2(fd, 1)
os.dup2(fd, 2) os.dup2(fd, 2)
sys.stdout = sys.stderr = self sys.stdout = sys.stderr = self
def rotate(fileobj, maxsave=9): def rotate(fileobj, maxsave=9):
name = fileobj.name name = fileobj.name
mode = fileobj.mode mode = fileobj.mode
maxsize = fileobj.maxsize maxsize = fileobj.maxsize
fileobj.close() fileobj.close()
shiftlogs(name, maxsave) shiftlogs(name, maxsave)
return LogFile(name, mode, maxsize) return LogFile(name, mode, maxsize)
# assumes basename logfile is closed. # assumes basename logfile is closed.
def shiftlogs(basename, maxsave): def shiftlogs(basename, maxsave):
topname = "%s.%d" % (basename, maxsave) topname = "%s.%d" % (basename, maxsave)
if os.path.isfile(topname): if os.path.isfile(topname):
os.unlink(topname) os.unlink(topname)
for i in range(maxsave, 0, -1): for i in range(maxsave, 0, -1):
oldname = "%s.%d" % (basename, i) oldname = "%s.%d" % (basename, i)
newname = "%s.%d" % (basename, i+1) newname = "%s.%d" % (basename, i+1)
try: try:
os.rename(oldname, newname) os.rename(oldname, newname)
except OSError: except OSError:
pass pass
try: try:
os.rename(basename, "%s.1" % (basename)) os.rename(basename, "%s.1" % (basename))
except OSError: except OSError:
pass pass
def open(name, maxsize=360000, maxsave=9): def open(name, maxsize=360000, maxsave=9):
return ManagedLog(name, maxsize, maxsave) return ManagedLog(name, maxsize, maxsave)
def writelog(logobj, data): def writelog(logobj, data):
try: try:
logobj.write(data) logobj.write(data)
except SizeError: except SizeError:
return rotate(logobj) return rotate(logobj)
else: else:
return logobj return logobj