private static void TryDumpLocalisationData(object sender, ElapsedEventArgs args) { Timer timer = (Timer)sender; TextDb textDb = UL.Localization.Localizer.s_textDb; if (textDb == null) { Injector.LogPlugin("Waiting for textDb to be ready.."); return; } timer.Stop(); Injector.LogPlugin("Dumping textDb (" + textDb.m_ids.Length + " strings)"); for (int i = 0; i < textDb.m_ids.Length; i++) { uint id = (uint)textDb.m_ids[i]; if (!textDb.m_idToIndex.ContainsKey(id)) { continue; } int index = textDb.m_idToIndex[id]; int offStart = textDb.m_offsets[index]; int offEnd = textDb.m_offsets[index + 1]; int len = offEnd - offStart; string entry = textDb.m_strings.Substring(offStart, len); Injector.LogPlugin(string.Format("{0}: {1}", id, entry)); } Injector.LogPlugin("Done"); }
private void GetSessionLog(string argsText) { /* GetSessionLog <virtualServerID> <service> "<sessionID>" "<sessionStartDate>" Responses: +OK <sizeOfData> <data> -ERR <errorText> */ try{ string[] args = TextUtils.SplitQuotedString(argsText,' ',true); if(args.Length != 4){ WriteLine("-ERR Invalid arguments. Syntax: GetSessionLog <virtualServerID> <service> \"<sessionID>\" \"<sessionStartDate>\""); return; } VirtualServer virtualServer = null; foreach(VirtualServer vServer in this.Server.MailServer.VirtualServers){ if(vServer.ID.ToLower() == args[0].ToLower()){ virtualServer = vServer; break; } } if(virtualServer == null){ WriteLine("-ERR Specified virtual server with ID '" + argsText + "' doesn't exist !"); } DateTime startTime = Convert.ToDateTime(TextUtils.UnQuoteString(args[3])); DataSet ds = new DataSet("dsSessionLog"); ds.Tables.Add("SessionLog"); ds.Tables["SessionLog"].Columns.Add("LogText"); string fileName = ""; if(args[1] == "SMTP"){ fileName += virtualServer.SMTP_LogsPath + "smtp"; } else if(args[1] == "POP3"){ fileName += virtualServer.POP3_LogsPath + "pop3"; } else if(args[1] == "IMAP"){ fileName += virtualServer.IMAP_LogsPath + "imap"; } else if(args[1] == "RELAY"){ fileName += virtualServer.RELAY_LogsPath + "relay"; } else if(args[1] == "FETCH"){ fileName += virtualServer.FETCH_LogsPath + "fetch"; } else{ throw new Exception("Invalid <service value> !"); } fileName += "-" + startTime.ToString("yyyyMMdd") + ".log"; if(File.Exists(fileName)){ StringBuilder retVal = new StringBuilder(); using(TextDb db = new TextDb('\t')){ db.OpenRead(fileName); while(db.MoveNext()){ string[] row = db.CurrentRow; if(row.Length == 6){ string sessionID = row[0]; string logText = row[5]; if(sessionID.ToLower() == args[2].ToLower()){ retVal.Append(db.CurrentRowString + "\r\n"); } } } } DataRow dr = ds.Tables["SessionLog"].NewRow(); dr["LogText"] = retVal.ToString(); ds.Tables["SessionLog"].Rows.Add(dr); } // Compress data byte[] dsZipped = CompressDataSet(ds); WriteLine("+OK " + dsZipped.Length); Write(dsZipped); } catch(Exception x){ WriteLine("-ERR " + x.Message); } }
private void GetLogSessions(string argsText) { /* GetLogSessions <virtualServerID> <service> <limit> "<startTime>" "<endTime>" "containsText" Responses: +OK <sizeOfData> <data> -ERR <errorText> */ try{ string[] args = TextUtils.SplitQuotedString(argsText,' '); if(args.Length != 6){ WriteLine("-ERR Invalid arguments. Syntax: GetLogSessions <virtualServerID> <service> <limit> \"<startTime>\" \"<endTime>\" \"containsText\""); return; } VirtualServer virtualServer = null; foreach(VirtualServer vServer in this.Server.MailServer.VirtualServers){ if(vServer.ID.ToLower() == args[0].ToLower()){ virtualServer = vServer; break; } } if(virtualServer == null){ WriteLine("-ERR Specified virtual server with ID '" + argsText + "' doesn't exist !"); } DataSet ds = new DataSet("dsLogsSessions"); ds.Tables.Add("LogSessions"); ds.Tables["LogSessions"].Columns.Add("SessionID"); ds.Tables["LogSessions"].Columns.Add("StartTime",typeof(DateTime)); ds.Tables["LogSessions"].Columns.Add("RemoteEndPoint"); ds.Tables["LogSessions"].Columns.Add("UserName"); int limit = ConvertEx.ToInt32(args[2]); DateTime startTime = Convert.ToDateTime(TextUtils.UnQuoteString(args[3])); DateTime endTime = Convert.ToDateTime(TextUtils.UnQuoteString(args[4])); string containsText = TextUtils.UnQuoteString(args[5]); string fileName = ""; if(args[1] == "SMTP"){ fileName = virtualServer.SMTP_LogsPath + "smtp"; } else if(args[1] == "POP3"){ fileName = virtualServer.POP3_LogsPath + "pop3"; } else if(args[1] == "IMAP"){ fileName = virtualServer.IMAP_LogsPath + "imap"; } else if(args[1] == "RELAY"){ fileName = virtualServer.RELAY_LogsPath + "relay"; } else if(args[1] == "FETCH"){ fileName = virtualServer.FETCH_LogsPath + "fetch"; } else{ throw new Exception("Invalid <service value> !"); } fileName += "-" + startTime.ToString("yyyyMMdd") + ".log"; if(File.Exists(fileName)){ using(TextDb db = new TextDb('\t')){ db.OpenRead(fileName); Dictionary<string,string> processedSessions = new Dictionary<string,string>(); while(db.MoveNext()){ string[] row = db.CurrentRow; if(row.Length == 6){ string sessionID = row[0]; DateTime sessionStartTime = Convert.ToDateTime(row[1]); string remoteEndPoint = row[2]; string userName = row[3]; string logText = row[5]; if(!processedSessions.ContainsKey(sessionID)){ //--- Apply fileting criteria ---------------------------------------------// bool add = true; if(startTime > sessionStartTime || endTime < sessionStartTime){ add = false; } if(containsText.Length > 0 && logText.ToLower().IndexOf(containsText.ToLower()) == -1){ add = false; } if(processedSessions.Count > limit){ break; } //------------------------------------------------------------------------// if(add){ DataRow dr = ds.Tables["LogSessions"].NewRow(); dr["SessionID"] = sessionID; dr["StartTime"] = sessionStartTime; dr["RemoteEndPoint"] = remoteEndPoint; dr["UserName"] = userName; ds.Tables["LogSessions"].Rows.Add(dr); processedSessions.Add(sessionID,""); } } } } } } // Compress data byte[] dsZipped = CompressDataSet(ds); WriteLine("+OK " + dsZipped.Length); Write(dsZipped); } catch(Exception x){ WriteLine("-ERR " + x.Message); } }