Block more HTTP request methods
[mgsmtp.git] / Log.pas
1 {
2 MegaBrutal's SMTP Server (MgSMTP)
3 Copyright (C) 2010-2018 MegaBrutal
4
5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU Affero General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17 }
18
19 {
20 Unit: Log
21 Supports basic logging features.
22 }
23
24
25 {$MODE DELPHI}
26 unit Log;
27
28 interface
29 uses SysUtils, Classes, INIFiles, Common;
30
31 type
32
33 TStreamLogger = class
34 constructor Create(Stream: TStream);
35 destructor Destroy; override;
36 protected
37 LogFile: TStream;
38 function AddPureLine(Line: string): boolean; virtual;
39 public
40 function AddLine(Line: string): boolean; overload;
41 function AddLine(Agent, Line: string): boolean; overload;
42 function WriteLn(Line: string): boolean; overload;
43 function WriteLn: boolean; overload;
44 end;
45
46
47 TLogger = class(TStreamLogger)
48 constructor Create(Config: TINIFile);
49 destructor Destroy; override;
50 protected
51 FLogOn: boolean;
52 FLogFileName: string;
53 {FLogLevel: integer;}
54 function AddPureLine(Line: string): boolean; override;
55 public
56 function AddStdLine(Line: string): boolean; overload;
57 function AddStdLine(Agent, Line: string): boolean; overload;
58 end;
59
60
61 var
62
63 Out: TStreamLogger;
64 Logger: TLogger;
65
66
67
68 implementation
69
70 const
71
72 LOG_FN_STDOUT = 'mgsmtp_stdout.log';
73 LOG_FN_STDOUT_PREV = 'mgsmtp_stdout_previousrun.log';
74 LOG_FN_SMTP = 'smtp.log';
75
76
77 constructor TStreamLogger.Create(Stream: TStream);
78 begin
79 LogFile:= Stream;
80 end;
81
82 destructor TStreamLogger.Destroy;
83 begin
84 LogFile.Free;
85 end;
86
87 constructor TLogger.Create(Config: TINIFile);
88 begin
89 FLogOn:= MainServerConfig.Log;
90 if FLogOn then begin
91 FLogFileName:= Config.ReadString('Log', 'Filename', LOG_FN_SMTP);
92 if not FileExists(FLogFileName) then begin
93 LogFile:= TFileStream.Create(FLogFileName, fmCreate);
94 LogFile.Free;
95 end;
96 LogFile:= TFileStream.Create(FLogFileName, fmOpenWrite or fmShareDenyWrite);
97 LogFile.Seek(0, soFromEnd);
98 AddPureLine('');
99 AddPureLine('');
100 AddPureLine('MgSMTP version ' + MainServerConfig.VersionStr + ', session log');
101 AddPureLine('Log started: ' + DateTimeToStr(Now));
102 end;
103 end;
104
105 destructor TLogger.Destroy;
106 begin
107 if FLogOn then
108 AddPureLine('Log finished: ' + DateTimeToStr(Now));
109 inherited Destroy;
110 end;
111
112
113 function TStreamLogger.AddPureLine(Line: string): boolean;
114 begin
115 Result:= WriteLineToStream(LogFile, Line);
116 end;
117
118 function TStreamLogger.AddLine(Line: string): boolean;
119 begin
120 Result:= AddPureLine('[' + DateTimeToStr(Now) + '] ' + Line);
121 end;
122
123 function TStreamLogger.AddLine(Agent, Line: string): boolean;
124 begin
125 Result:= AddPureLine('[' + DateTimeToStr(Now) + '] <' + Agent + '> ' + Line);
126 end;
127
128 function TStreamLogger.WriteLn(Line: string): boolean;
129 { Only a wrapper for AddPureLine for convenience. }
130 begin
131 Result:= AddPureLine(Line);
132 end;
133
134 function TStreamLogger.WriteLn: boolean;
135 begin
136 Result:= AddPureLine('');
137 end;
138
139 function TLogger.AddPureLine(Line: string): boolean;
140 begin
141 if FLogOn then
142 Result:= inherited AddPureLine(Line)
143 else
144 Result:= true;
145 end;
146
147 function TLogger.AddStdLine(Line: string): boolean;
148 { Log message to both stdout and smtp.log. }
149 var outresult, logresult: boolean;
150 begin
151 outresult:= Out.AddLine(Line);
152 logresult:= AddLine(Line);
153 Result:= outresult and logresult;
154 end;
155
156 function TLogger.AddStdLine(Agent, Line: string): boolean;
157 { Log message to both stdout and smtp.log. }
158 var outresult, logresult: boolean;
159 begin
160 outresult:= Out.AddLine(Agent, Line);
161 logresult:= AddLine(Agent, Line);
162 Result:= outresult and logresult;
163 end;
164
165
166
167 initialization
168 if StdOutputHandle > 0 then
169 Out:= TStreamLogger.Create(THandleStream.Create(StdOutputHandle))
170 else begin
171 DeleteFile(LOG_FN_STDOUT_PREV);
172 RenameFile(LOG_FN_STDOUT, LOG_FN_STDOUT_PREV);
173 Out:= TStreamLogger.Create(TFileStream.Create(LOG_FN_STDOUT, fmCreate or fmShareDenyWrite));
174 end;
175 finalization
176 Out.Free;
177 end.