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");
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
            }
        }