removed stratum nonce hacks
[p2pool.git] / p2pool / util / logging.py
1 import codecs
2 import datetime
3 import os
4 import sys
5
6 from twisted.python import log
7
8 class EncodeReplacerPipe(object):
9     def __init__(self, inner_file):
10         self.inner_file = inner_file
11         self.softspace = 0
12     def write(self, data):
13         if isinstance(data, unicode):
14             try:
15                 data = data.encode(self.inner_file.encoding, 'replace')
16             except:
17                 data = data.encode('ascii', 'replace')
18         self.inner_file.write(data)
19     def flush(self):
20         self.inner_file.flush()
21
22 class LogFile(object):
23     def __init__(self, filename):
24         self.filename = filename
25         self.inner_file = None
26         self.reopen()
27     def reopen(self):
28         if self.inner_file is not None:
29             self.inner_file.close()
30         open(self.filename, 'a').close()
31         f = open(self.filename, 'rb')
32         f.seek(0, os.SEEK_END)
33         length = f.tell()
34         if length > 100*1000*1000:
35             f.seek(-1000*1000, os.SEEK_END)
36             while True:
37                 if f.read(1) in ('', '\n'):
38                     break
39             data = f.read()
40             f.close()
41             f = open(self.filename, 'wb')
42             f.write(data)
43         f.close()
44         self.inner_file = codecs.open(self.filename, 'a', 'utf-8')
45     def write(self, data):
46         self.inner_file.write(data)
47     def flush(self):
48         self.inner_file.flush()
49
50 class TeePipe(object):
51     def __init__(self, outputs):
52         self.outputs = outputs
53     def write(self, data):
54         for output in self.outputs:
55             output.write(data)
56     def flush(self):
57         for output in self.outputs:
58             output.flush()
59
60 class TimestampingPipe(object):
61     def __init__(self, inner_file):
62         self.inner_file = inner_file
63         self.buf = ''
64         self.softspace = 0
65     def write(self, data):
66         buf = self.buf + data
67         lines = buf.split('\n')
68         for line in lines[:-1]:
69             self.inner_file.write('%s %s\n' % (datetime.datetime.now(), line))
70             self.inner_file.flush()
71         self.buf = lines[-1]
72     def flush(self):
73         pass
74
75 class AbortPipe(object):
76     def __init__(self, inner_file):
77         self.inner_file = inner_file
78         self.softspace = 0
79     def write(self, data):
80         try:
81             self.inner_file.write(data)
82         except:
83             sys.stdout = sys.__stdout__
84             log.DefaultObserver.stderr = sys.stderr = sys.__stderr__
85             raise
86     def flush(self):
87         self.inner_file.flush()
88
89 class PrefixPipe(object):
90     def __init__(self, inner_file, prefix):
91         self.inner_file = inner_file
92         self.prefix = prefix
93         self.buf = ''
94         self.softspace = 0
95     def write(self, data):
96         buf = self.buf + data
97         lines = buf.split('\n')
98         for line in lines[:-1]:
99             self.inner_file.write(self.prefix + line + '\n')
100             self.inner_file.flush()
101         self.buf = lines[-1]
102     def flush(self):
103         pass