Index: /branches/rel_apv_10_7/usr/click/bin/debug_monitor/monitor.sh
===================================================================
--- /branches/rel_apv_10_7/usr/click/bin/debug_monitor/monitor.sh	(revision 38574)
+++ /branches/rel_apv_10_7/usr/click/bin/debug_monitor/monitor.sh	(working copy)
@@ -273,6 +273,8 @@
         echo "/ca/bin/backend -c \"show statistics tcp all\"" >> $output_file
         /ca/bin/backend -c "show statistics tcp all"`echo -e "\\0374"` | sed "s/`echo -e \\"\\0374\\"`//g" >> $output_file
         echo -e "\n" >> $output_file
+# insert data into database of tcp status
+    /usr/local/bin/python /ca/webui/htdocs/new/src/hive/monitor_log/write_monitor_to_db.py tcpstatus
 
 #ssl info
 	timestamp_gen $output_file
Index: /branches/rel_apv_10_7/usr/click/bin/debug_monitor/slb_monitor.sh
===================================================================
--- /branches/rel_apv_10_7/usr/click/bin/debug_monitor/slb_monitor.sh	(revision 38574)
+++ /branches/rel_apv_10_7/usr/click/bin/debug_monitor/slb_monitor.sh	(working copy)
@@ -27,3 +27,7 @@
 # because this monitor is on and excuted by default 
 echo "$ANETSTAT -p tcp :" >> $OUTPUT_FILE
 $ANETSTAT -p tcp >> $OUTPUT_FILE
+
+# insert data into database of tcp syn drop
+/usr/local/bin/python /ca/webui/htdocs/new/src/hive/monitor_log/write_monitor_to_db.py tcpsyndrop
+
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/TCPSYNDropStat.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/TCPSYNDropStat.py	(revision 38574)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/TCPSYNDropStat.py	(working copy)
@@ -1,15 +1,28 @@
 import re
 from datetime import datetime, timedelta
 import os
-import gzip
-import shutil
 from MonitorFileController import MonitorFileController
 from DataController import DataController
+import time
 
 class TCPSYNDropStat():
+    C_COLUMN_MATCH = {
+        'in_use_syn_drop': 'In Use SYN Drop',
+        'over_max_syn_drop': 'Over Max SYN Drop',
+        'mss_err_syn_drop': 'MSS Error SYN Drop',
+        'mss_size_syn_drop': 'MSS Size SYN Drop',
+        'eroute_err_syn_drop': 'Eroute Error SYN Drop',
+        'system_stack_syn_route': 'System Stack Syn Route'
+    }
+    C_PATH_TCP_SYN_DROP_DB = "/var/crash/tcp_syn_drop/"
+    C_DB_TCP_SYN_DROUP = 'TCPSynDropStatistics'
+    C_TYPE_TOTAL = 'total'
+
     def __init__(self, from_time, gz_directory="/var/crash"):
         self.gz_directory = gz_directory
         self.start_time = self.get_start_time(from_time)
+        now = time.asctime( time.localtime(time.time()) )
+        self.end_time = datetime.strptime(now, '%a %b %d %H:%M:%S %Y')
         self.directory_to_extract_to = os.path.join(os.getcwd(), "tmp", "sslmonitor")
         self.format_data_list = None
     def get_data(self):
@@ -79,9 +92,84 @@
         if self.format_data_list==None:
             self.get_data()
         return [(data[0], data[3]) for data in self.format_data_list]
+    def get_data_from_db(self, type):
+        """
+        Get data from sqlite db by start time and type
+        :param string type: such as total or name of a virtual host
+        :return dict
+        example:
+            {
+                "time": [],
+                "in_use_syn_drop": [],
+                ...
+                "system_stack_syn_route": []
+            }
+        """
+        ret = {}
+        if not os.path.exists(self.C_PATH_TCP_SYN_DROP_DB):
+            return ret
+        ret['data'] = []
+        start_db = str(self.start_time).split(' ')[0] + '.db'
+        end_db = str(self.end_time).split(' ')[0] + '.db'
+        all_db = filter(lambda e: e.endswith('.db') and e >= start_db and e <=end_db,
+                        os.listdir(self.C_PATH_TCP_SYN_DROP_DB))
+        need_db_list = sorted(all_db)
+        ret['db_list'] = need_db_list
+        cmd = " ".join([
+            "SELECT DATETIME(time, 'unixepoch') AS timef,",
+            "SUM(in_use_syn_drop),",
+            "SUM(over_max_syn_drop),",
+            "SUM(mss_err_syn_drop),",
+            "SUM(mss_size_syn_drop),",
+            "SUM(eroute_err_syn_drop),",
+            "SUM(system_stack_syn_route)",
+            "FROM %s" % self.C_DB_TCP_SYN_DROUP,
+            "WHERE timef BETWEEN '%s' AND '%s'" % (self.start_time, self.end_time),
+            "AND type = '%s'" % type,
+            "GROUP BY timef;"])
+        data_handle = DataController()
+        for each in need_db_list:
+            result = data_handle.query_database(self.C_PATH_TCP_SYN_DROP_DB, each, cmd)
+            if result:
+                ret['data'] = ret['data'] + result
+        return ret
+    def get_sql(self, type):
+        time_list = []
+        in_use_syn_drop_list = []
+        over_max_syn_drop_list = []
+        mss_err_syn_drop_list = []
+        mss_size_syn_drop_list = []
+        eroute_err_syn_drop_list = []
+        system_stack_syn_route_list = []
+        select_data = self.get_data_from_db(type)
+        data = select_data['data']
+        for each in data:
+            time_list.append(each[0])
+            in_use_syn_drop_list.append(each[1])
+            over_max_syn_drop_list.append(each[2])
+            mss_err_syn_drop_list.append(each[3])
+            mss_size_syn_drop_list.append(each[4])
+            eroute_err_syn_drop_list.append(each[5])
+            system_stack_syn_route_list.append(each[6])
+        return {
+            "time": time_list,
+            "in_use_syn_drop_list": in_use_syn_drop_list,
+            "over_max_syn_drop_list": over_max_syn_drop_list,
+            "mss_err_syn_drop_list": mss_err_syn_drop_list,
+            "mss_size_syn_drop_list": mss_size_syn_drop_list,
+            "eroute_err_syn_drop_list": eroute_err_syn_drop_list,
+            "system_stack_syn_route_list": system_stack_syn_route_list,
+        }
+    def check_is_tcp_syn_drop(self, filter):
+        is_tcp_syn_drop = False
+        fields = list(self.C_COLUMN_MATCH.keys())
+        for each in filter:
+            if str(each).replace("vs_", "") in fields:
+                is_tcp_syn_drop = True
+                break
+        return is_tcp_syn_drop
 if __name__=="__main__":
     # example
-    sslStat = SSLStatFacade("now-1h", gz_directory="./")
-    connection_attempts_list = sslStat.get_connection_attempts_data()
-    for e in connection_attempts_list:
-        print(e)
+    tcpSynDrpStat = TCPSYNDropStat("now-1h", gz_directory="./")
+    data = tcpSynDrpStat.get_data_from_db(tcpSynDrpStat.C_TYPE_TOTAL)
+    print(data)
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/TCPStatistics.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/TCPStatistics.py	(revision 0)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/TCPStatistics.py	(working copy)
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+"""
+This file is for get data from sqlite database
+and for the part of tcp statistics
+Author: shuinvy@arraynetworks.net
+"""
+from datetime import datetime, timedelta
+import os
+from DataController import DataController
+import re
+import time
+
+class TCPStatistics:
+    """
+    Class for db data for tcp status
+    """
+    C_GLOBAL_INDEX = "global"
+    C_COLUMN_MATCH = {
+        'listen': 'LISTEN',
+        'syn_sent': 'SYN_SENT',
+        'syn_rcvd': 'SYN_RCVD',
+        'established': 'ESTABLISHED',
+        'close_wait': 'CLOSE_WAIT',
+        'fin_wait_1': 'FIN_WAIT_1',
+        'closing': 'CLOSING',
+        'last_ack': 'LAST_ACK',
+        'fin_wait_2': 'FIN_WAIT_2',
+        'time_wait': 'TIME_WAIT'
+    }
+
+    C_PATH_TCP_STATUS_DB = "/var/crash/tcp_status/"
+    C_DB_TCP_STATUS = 'TCPStatusStatistics'
+
+    def __init__(self, from_time):
+        self.start_time = self.get_start_time(from_time)
+        now = time.asctime( time.localtime(time.time()) )
+        self.end_time = datetime.strptime(now, '%a %b %d %H:%M:%S %Y')
+
+    def get_data_from_db(self, type):
+        """
+        Get data from sqlite db by start time and type
+        :param string type: such as global or name of a virtual service
+        :return dict
+        example:
+            {
+                "time": [],
+                "listen": [],
+                ...
+                "time_wait": []
+            }
+        """
+        ret = {}
+        if not os.path.exists(self.C_PATH_TCP_STATUS_DB):
+            return ret
+        ret['data'] = []
+        start_db = str(self.start_time).split(' ')[0] + '.db'
+        end_db = str(self.end_time).split(' ')[0] + '.db'
+        all_db = filter(lambda e: e.endswith('.db') and e >= start_db and e <=end_db,
+                        os.listdir(self.C_PATH_TCP_STATUS_DB))
+        need_db_list = sorted(all_db)
+        ret['db_list'] = need_db_list
+        cmd = " ".join([
+            "SELECT DATETIME(time, 'unixepoch') AS timef,",
+            "SUM(listen),",
+            "SUM(syn_sent),",
+            "SUM(syn_rcvd),",
+            "SUM(established),",
+            "SUM(close_wait),",
+            "SUM(fin_wait_1),",
+            "SUM(closing),",
+            "SUM(last_ack),",
+            "SUM(fin_wait_2),",
+            "SUM(time_wait)",
+            "FROM %s" % self.C_DB_TCP_STATUS,
+            "WHERE timef BETWEEN '%s' AND '%s'" % (self.start_time, self.end_time),
+            "AND type = '%s'" % type,
+            "GROUP BY timef;"])
+        data_handle = DataController()
+        for each in need_db_list:
+            result = data_handle.query_database(self.C_PATH_TCP_STATUS_DB, each, cmd)
+            if result:
+                ret['data'] = ret['data'] + result
+        return ret
+
+    def get_start_time(self, from_time):
+        '''
+        from_time is string type, which might be now-1h, now-2h, now-6h, now-1d, now-1w, or now-1M
+        return datetime object based on from_time
+        '''
+        current_date_time = datetime.now()
+        period = from_time.split("-")[1]
+        match = re.match(r'(\d+)[hdwM]+', period)
+        period_number = int(match.group(1))
+        if "h" in period:
+            return current_date_time - timedelta(hours=period_number)
+        elif "d" in period:
+            return current_date_time - timedelta(days=period_number)
+        elif "w" in period:
+            return current_date_time - timedelta(weeks=period_number)
+        elif "M" in period:
+            # there is no consideration for the condition 29, 30, 31 days in a month
+            return current_date_time - timedelta(days=30*period_number)
+
+    def get_sql(self, type):
+        time_list = []
+        listen_list = []
+        syn_sent_list = []
+        syn_rcvd_list = []
+        established_list = []
+        close_wait_list = []
+        fin_wait_1_list = []
+        closing_list = []
+        last_ack_list = []
+        fin_wait_2_list = []
+        time_wait_list = []
+        select_data = self.get_data_from_db(type)
+        data = select_data['data']
+        for each in data:
+            time_list.append(each[0])
+            listen_list.append(each[1])
+            syn_sent_list.append(each[2])
+            syn_rcvd_list.append(each[3])
+            established_list.append(each[4])
+            close_wait_list.append(each[5])
+            fin_wait_1_list.append(each[6])
+            closing_list.append(each[7])
+            last_ack_list.append(each[8])
+            fin_wait_2_list.append(each[9])
+            time_wait_list.append(each[10])
+        return {
+            "time": time_list,
+            "listen_list": listen_list,
+            "syn_sent_list": syn_sent_list,
+            "syn_rcvd_list": syn_rcvd_list,
+            "established_list": established_list,
+            "close_wait_list": close_wait_list,
+            "fin_wait_1_list": fin_wait_1_list,
+            "closing_list": closing_list,
+            "last_ack_list": last_ack_list,
+            "fin_wait_2_list": fin_wait_2_list,
+            "time_wait_list": time_wait_list,
+        }
+    def check_is_tcp_status(self, filter):
+        is_tcp_status = False
+        fields = list(self.C_COLUMN_MATCH.keys())
+        for each in filter:
+            if str(each).replace("vs_", "") in fields:
+                is_tcp_status = True
+                break
+        return is_tcp_status
+
+if __name__=="__main__":
+    tcp_status = TCPStatistics("now-1w")
+    data = tcp_status.get_data_from_db(tcp_status.C_GLOBAL_INDEX)
+    print(data)
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/write_monitor_to_db.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/write_monitor_to_db.py	(revision 38574)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/monitor_log/write_monitor_to_db.py	(working copy)
@@ -182,6 +182,22 @@
         for field, pattern in C_PATTERN_TCP_SYN_DROP_MATCH.items():
             data = re.findall(pattern, output, re.DOTALL)
             grp_data[field] = str(data[0]).strip()
+    each_cmd = '/ca/bin/backend -c "show slb virtual all"'
+    each_cmd = each_cmd.encode('utf-8') + chr(252)
+    (status, output) = commands.getstatusoutput(each_cmd)
+    if status != 0:
+        exit(1)
+    each_data = {}
+    if output:
+        # ex: slb virtual tcp "v_tcp" 192.168.100.16 8081 arp 0
+        each_pattern = r"slb virtual (\S+) \"(\S+)\" (\S+) (\S+) (\S+) (\S+)\s*"
+        name_data = re.findall(each_pattern, output, re.DOTALL)
+        for i in range(len(name_data)):
+            vs_name = name_data[i][1]
+            each_data[vs_name] = []
+            for field, pattern in C_PATTERN_TCP_SYN_DROP_MATCH.items():
+                each_match = re.findall(pattern, output, re.DOTALL)
+                each_data[vs_name].append(each_match[i])
     db_name = C_PATH_TCP_SYN_DROP_DB + get_date_for_db_name()
     conn = sqlite3.connect(db_name)
     db = conn.cursor()
@@ -223,6 +239,34 @@
                         grp_data['mss_size_syn_drop'],
                         grp_data['eroute_err_syn_drop'],
                         grp_data['system_stack_syn_route']))
+        if each_data:
+            for type, enrty in each_data.items():
+                db.execute(" ".join(['INSERT INTO %s(' % C_DB_TCP_SYN_DROUP,
+                        'time,',
+                        'type,',
+                        'in_use_syn_drop,',
+                        'over_max_syn_drop,',
+                        'mss_err_syn_drop,',
+                        'mss_size_syn_drop,',
+                        'eroute_err_syn_drop,',
+                        'system_stack_syn_route',
+                        ') VALUES (',
+                        '?,',
+                        '?,',
+                        '?,',
+                        '?,',
+                        '?,',
+                        '?,',
+                        '?,',
+                        '?)']),
+                        (now,
+                        type,
+                        enrty[0],
+                        enrty[1],
+                        enrty[2],
+                        enrty[3],
+                        enrty[4],
+                        enrty[5]))
     except Exception as ex:
         print("Cannot insert data into db %s" % C_DB_TCP_SYN_DROUP)
         print(ex)
Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/report.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/report.py	(revision 38574)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/report.py	(working copy)
@@ -19,9 +19,8 @@
 from hive.utils import local_equirement
 import random, time, csv, codecs
 from hive.monitor_log.TCPSYNDropStat import TCPSYNDropStat
-from tcp_status.statistics import MonitorOutput
+from hive.monitor_log.TCPStatistics import TCPStatistics
 from hive.monitor_log.SSLStatFacade import SSLStatFacade
-from datetime import datetime
 
 TIMEFORMAT='%Y-%m-%d %X'
 chart_path = "/var/crash/statmon/"
@@ -696,7 +695,7 @@
     
     return story
 
-def generateSLBVSReport(from_time, to_time, slb_vs_list, env, styles, story, tcp_status):
+def generateSLBVSReport(from_time, to_time, slb_vs_list, env, styles, story):
     story.append(Spacer(1, 12))
     ptext = '<font size="16">' + unicode(_("SLB Virtual Service Status")) + '</font>'
     story.append(Paragraph(ptext, styles["alibaba"]))
@@ -774,24 +773,31 @@
             table_data = zip(errcode_list, err_data)
             story = Draw_Bar_Chart(unicode(_("HTTP Response Code Statistics"))+"(%s)"%each_vs, env, styles, story, errcode_list, graph_item, table_data, 50)
 
-        if 'vs_tcp' in slb_vs_list[each_vs] and slb_vs_list[each_vs]['vs_tcp'] and each_vs in tcp_status:
-            mo = MonitorOutput()
-            for column in mo.convert_list_to_column(slb_vs_list[each_vs]['vs_tcp']):
-                # ex: LISTEN
-                item_value = []
-                table_data = []
-                time_list = []
-                for date, each in tcp_status[each_vs].items():
-                    # {"2024-06-28 15:42:47": {"LISTEN": "0"}}
-                    value = each[column]
-                    item_value.append(value) # ex: 2
-                    table_data.append([date, value]) # ex: ["2024-06-27 16:12:00", 2]
-                    time_list.append(date) # ex: "2024-06-27 16:12:00"
-                graph_item = [{
-                    "item_name" : unicode(_(column)), # ex: LISTEN
-                    "item_value" : item_value
-                }]
-                story = Draw_Line_Chart(unicode(_(column))+"(%s)"%each_vs, env, styles, story, time_list, graph_item, table_data)
+        if 'vs_tcp' in slb_vs_list[each_vs] and slb_vs_list[each_vs]['vs_tcp']:
+            tcp_status = TCPStatistics(from_time)
+            tcp_syn_drop = TCPSYNDropStat(from_time)
+            tcp_status_dic = tcp_status.get_sql(each_vs)
+            tcp_syn_drop_dic = tcp_syn_drop.get_sql(each_vs)
+            for filter in slb_vs_list[each_vs]['vs_tcp']:
+                field = str(filter).replace("vs_", "")
+                if field in list(tcp_status.C_COLUMN_MATCH.keys()):
+                    column = tcp_status.C_COLUMN_MATCH[field] # ex: LISTEN
+                    if 'time' in tcp_status_dic and (field + '_list') in tcp_status_dic:
+                        graph_item = [{
+                            "item_name" : unicode(_(column)),
+                            "item_value" : tcp_status_dic[field + '_list']
+                        }]
+                        table_data = zip(tcp_status_dic['time'], tcp_status_dic[field + '_list'])
+                        story = Draw_Line_Chart(unicode(_(column))+"(%s)"%each_vs, env, styles, story, tcp_status_dic['time'], graph_item, table_data)
+                if field in list(tcp_syn_drop.C_COLUMN_MATCH.keys()):
+                    column = tcp_syn_drop.C_COLUMN_MATCH[field] # ex: In Use SYN Drop
+                    if 'time' in tcp_syn_drop_dic and (field + '_list') in tcp_syn_drop_dic:
+                        graph_item = [{
+                            "item_name" : unicode(_(column)),
+                            "item_value" : tcp_syn_drop_dic[field + '_list']
+                        }]
+                        table_data = zip(tcp_syn_drop_dic['time'], tcp_syn_drop_dic[field + '_list'])
+                        story = Draw_Line_Chart(unicode(_(column))+"(%s)"%each_vs, env, styles, story, tcp_syn_drop_dic['time'], graph_item, table_data)
 
     return story
 
@@ -1136,40 +1142,43 @@
     
     return story
 
-def generateTCPReport(tcp_status, tcp_list, env, styles, story):
+def generateTCPReport(from_time, tcp_list, env, styles, story):
     """
     Get PDF data of tcp status and filter columns
-    :param dict tcp_status: statistics of tcp status
+    :param string from_time: start time, ex: now-1d
     :param list tcp_list: needed columns
     :param object env
     :param object styles
     :param object story: pdf object
     """
-    mo = MonitorOutput()
+    tcp_status = TCPStatistics(from_time)
+    tcp_syn_drop = TCPSYNDropStat(from_time)
+    tcp_status_dic = tcp_status.get_sql(tcp_status.C_GLOBAL_INDEX)
+    tcp_syn_drop_dic = tcp_syn_drop.get_sql(tcp_syn_drop.C_TYPE_TOTAL)
     story.append(Spacer(1, 12))
     ptext = '<font size="16">' + unicode(_("TCP Global Status")) + '</font>'
     story.append(Paragraph(ptext, styles["alibaba"]))
     story.append(Spacer(1, 12))
 
-    if not MonitorOutput.C_GLOBAL_INDEX in tcp_status:
-        return story
-
-    for column in mo.convert_list_to_column(tcp_list):
-        # ex: LISTEN
-        item_value = []
-        table_data = []
-        time_list = []
-        for date, each in tcp_status[MonitorOutput.C_GLOBAL_INDEX].items():
-            # {"2024-06-28 15:42:47": {"LISTEN": "0"}}
-            value = each[column]
-            item_value.append(value) # ex: 2
-            table_data.append([date, value]) # ex: ["2024-06-27 16:12:00", 2]
-            time_list.append(date) # ex: "2024-06-27 16:12:00"
-        graph_item = [{
-            "item_name" : unicode(_(column)), # ex: LISTEN
-            "item_value" : item_value
-        }]
-        story = Draw_Line_Chart(unicode(_(column)), env, styles, story, time_list, graph_item, table_data)
+    for field in tcp_list:
+        if field in list(tcp_status.C_COLUMN_MATCH.keys()):
+            if "time" in tcp_status_dic and (field + '_list') in tcp_status_dic:
+                column = tcp_status.C_COLUMN_MATCH[field] # ex: LISTEN
+                graph_item = [{
+                    "item_name" : unicode(_(column)),
+                    "item_value" : tcp_status_dic[field + '_list']
+                }]
+                table_data = zip(tcp_status_dic['time'], tcp_status_dic[field + '_list'])
+                story = Draw_Line_Chart(unicode(_(column)), env, styles, story, tcp_status_dic['time'], graph_item, table_data)
+        if field in list(tcp_syn_drop.C_COLUMN_MATCH.keys()):
+            if "time" in tcp_syn_drop_dic and (field + '_list') in tcp_syn_drop_dic:
+                column = tcp_syn_drop.C_COLUMN_MATCH[field] # ex: In Use SYN Drop
+                graph_item = [{
+                    "item_name" : unicode(_(column)),
+                    "item_value" : tcp_syn_drop_dic[field + '_list']
+                }]
+                table_data = zip(tcp_syn_drop_dic['time'], tcp_syn_drop_dic[field + '_list'])
+                story = Draw_Line_Chart(unicode(_(column)), env, styles, story, tcp_syn_drop_dic['time'], graph_item, table_data)
     return story
 def generateSSLTotalReport(from_time, ssl_list, env, styles, story):
     """
@@ -1281,7 +1290,7 @@
         cw.writerows(zip(slb_total_dic['time'], slb_total_dic['compress_list']))
     return cw
 
-def generateSLBVSCSV(cw, from_time, to_time, vs_name, slb_vs_list, tcp_status):
+def generateSLBVSCSV(cw, from_time, to_time, vs_name, slb_vs_list):
     cw.writerow([unicode(_("SLB Virtual Service Status"))+"(%s)"%vs_name])
     vs_data_dic = get_vs_data_sql(from_time, to_time, vs_name)
 
@@ -1327,17 +1336,25 @@
         cw.writerow([unicode(_('Compression Ratio for All Data'))])
         cw.writerow([unicode(_('Time')), unicode(_('Compression Ratio for All Data(%)'))])
         cw.writerows(zip(vs_data_dic['time'], vs_data_dic['compress_all']))
-    if 'vs_tcp' in slb_vs_list[vs_name] and slb_vs_list[vs_name]['vs_tcp'] and vs_name in tcp_status:
-        cw.writerow([unicode(_('TCP Statistics of Virtual Service: %s') % vs_name)])
-        mo = MonitorOutput()
-        for column in mo.convert_list_to_column(slb_vs_list[vs_name]['vs_tcp']):
-            # ex: LISTEN
-            cw.writerow([unicode(_(column))])
-            # ex: Time, LISTEN
-            cw.writerow([unicode(_('Time')), unicode(_(column))])
-            for date, each in tcp_status[vs_name].items():
-                # {"2024-06-28 15:42:47": {"LISTEN": "0"}}
-                cw.writerow([date, each[column]])
+    if 'vs_tcp' in slb_vs_list[vs_name] and slb_vs_list[vs_name]['vs_tcp']:
+        tcp_status = TCPStatistics(from_time)
+        tcp_syn_drop = TCPSYNDropStat(from_time)
+        tcp_status_dic = tcp_status.get_sql(vs_name)
+        tcp_syn_drop_dic = tcp_syn_drop.get_sql(vs_name)
+        for filter in slb_vs_list[vs_name]['vs_tcp']:
+            field = str(filter).replace("vs_", "")
+            if field in list(tcp_status.C_COLUMN_MATCH.keys()):
+                column = tcp_status.C_COLUMN_MATCH[field] # ex: LISTEN
+                cw.writerow([unicode(_(column))])
+                cw.writerow([unicode(_('Time')), unicode(_(column))])
+                if 'time' in tcp_status_dic and (field + '_list') in tcp_status_dic:
+                    cw.writerows(zip(tcp_status_dic['time'], tcp_status_dic[field + '_list']))
+            if field in list(tcp_syn_drop.C_COLUMN_MATCH.keys()):
+                column = tcp_syn_drop.C_COLUMN_MATCH[field] # ex: In Use SYN Drop
+                cw.writerow([unicode(_(column))])
+                cw.writerow([unicode(_('Time')), unicode(_(column))])
+                if 'time' in tcp_syn_drop_dic and (field + '_list') in tcp_syn_drop_dic:
+                    cw.writerows(zip(tcp_syn_drop_dic['time'], tcp_syn_drop_dic[field + '_list']))
 
     return cw
 
@@ -1511,25 +1528,31 @@
         each[0] = time.strftime(TIMEFORMAT, time.localtime(int(each[0])/1000))
         cw.writerow(each)
     return cw
-def generateTCPCSV(cw, tcp_status, tcp_list):
+def generateTCPCSV(cw, from_time, tcp_list):
     """
     Get CSV data of global tcp status and filter columns
     :param object cw: csv object
-    :param dict tcp_status: statistics of tcp status
+    :param string from_time: start time, ex: now-1d
     :param list tcp_list: needed columns
     """
-    mo = MonitorOutput()
     cw.writerow([unicode(_('TCP Global Statistics'))])
-    if not MonitorOutput.C_GLOBAL_INDEX in tcp_status:
-        return cw
-    for column in mo.convert_list_to_column(tcp_list):
-        # ex: LISTEN
-        cw.writerow([unicode(_(column))])
-        # ex: Time, LISTEN
-        cw.writerow([unicode(_('Time')), unicode(_(column))])
-        for date, each in tcp_status[MonitorOutput.C_GLOBAL_INDEX].items():
-            # {"2024-06-28 15:42:47": {"LISTEN": "0"}}
-            cw.writerow([date, each[column]])
+    tcp_status = TCPStatistics(from_time)
+    tcp_status_dic = tcp_status.get_sql(tcp_status.C_GLOBAL_INDEX)
+    tcp_syn_drop = TCPSYNDropStat(from_time)
+    tcp_syn_drop_dic = tcp_syn_drop.get_sql(tcp_syn_drop.C_TYPE_TOTAL)
+    for field in tcp_list:
+        if field in list(tcp_status.C_COLUMN_MATCH.keys()):
+            column = tcp_status.C_COLUMN_MATCH[field] # ex: LISTEN
+            cw.writerow([unicode(_(column))])
+            cw.writerow([unicode(_('Time')), unicode(_(column))])
+            if "time" in tcp_status_dic and (field + '_list') in tcp_status_dic:
+                cw.writerows(zip(tcp_status_dic['time'], tcp_status_dic[field + '_list']))
+        if field in list(tcp_syn_drop.C_COLUMN_MATCH.keys()):
+            column = tcp_syn_drop.C_COLUMN_MATCH[field] # ex: In Use SYN Drop
+            cw.writerow([unicode(_(column))])
+            cw.writerow([unicode(_('Time')), unicode(_(column))])
+            if "time" in tcp_syn_drop_dic and (field + '_list') in tcp_syn_drop_dic:
+                cw.writerows(zip(tcp_syn_drop_dic['time'], tcp_syn_drop_dic[field + '_list']))
     return cw
 def generateSSLTotalCSV(cw, from_time, ssl_list):
     """
@@ -1554,21 +1577,6 @@
     return cw
 def generateCSVReport(report_name, from_time, to_time, end_time, start_time, system_list, slb_vs_list, slb_rs_list, slb_vh_list, slb_rh_list, slb_total_list, llb_list, llb_total_list, gslb_list, tcp_list, ssl_total_list):
     sys_info = get_system_version()
-    is_tcp_status = False
-    is_tcp_group = True
-    if slb_vs_list:
-        for vsname in slb_vs_list:
-            if 'vs_tcp' in slb_vs_list[vsname]:
-                is_tcp_status = True
-                is_tcp_group = False
-    get_tcp_status = {}
-    if is_tcp_status or tcp_list:
-        mo = MonitorOutput()
-        tr = TimeRange(from_time, to_time)
-        start_time = tr.ParseFrom()
-        end_time = tr.ParseTo()
-        # get tcp status of all
-        get_tcp_status = mo.get(datetime.fromtimestamp(start_time), is_tcp_group)
     with codecs.open(report_file_path+report_name, 'w', encoding="utf-8-sig") as csvfile:
         cw = csv.writer(csvfile)
         cw.writerow([unicode(_('Create Time')), time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())])
@@ -1589,7 +1597,7 @@
             cw.writerow("")
             for each in slb_vs_list:
                 vs_name = each
-                cw = generateSLBVSCSV(cw, from_time, to_time, vs_name, slb_vs_list, get_tcp_status)
+                cw = generateSLBVSCSV(cw, from_time, to_time, vs_name, slb_vs_list)
         if slb_rs_list:
             cw.writerow("")
             for each in slb_rs_list:
@@ -1618,7 +1626,7 @@
             cw = generateGSLBRSCSV(cw, from_time, to_time)
         if tcp_list:
             cw.writerow("")
-            cw = generateTCPCSV(cw, get_tcp_status, tcp_list)
+            cw = generateTCPCSV(cw, from_time, tcp_list)
         if ssl_total_list:
             cw.writerow("")
             cw = generateSSLTotalCSV(cw, from_time, ssl_total_list)
@@ -1643,23 +1651,6 @@
 
 def generatePDFReport(pdf_name, from_time, to_time, end_time, start_time, system_list, slb_vs_list, slb_rs_list, slb_vh_list, slb_rh_list, slb_total_list, llb_list, llb_total_list, gslb_list, tcp_list, ssl_total_list):
     sys_info = get_system_version()
-
-    is_tcp_status = False
-    is_tcp_group = True
-    if slb_vs_list:
-        for vsname in slb_vs_list:
-            if 'vs_tcp' in slb_vs_list[vsname]:
-                is_tcp_status = True
-                is_tcp_group = False
-    get_tcp_status = {}
-    if is_tcp_status or tcp_list:
-        mo = MonitorOutput()
-        tr = TimeRange(from_time, to_time)
-        start_time = tr.ParseFrom()
-        end_time = tr.ParseTo()
-        # get tcp status of all
-        get_tcp_status = mo.get(datetime.fromtimestamp(start_time), is_tcp_group)
-
     doc = SimpleDocTemplate(report_file_path+pdf_name,pagesize=letter,
                         rightMargin=60,leftMargin=60,
                         topMargin=70,bottomMargin=55)
@@ -1691,7 +1682,7 @@
     if slb_total_list:
         story = generateSLBTotalReport(from_time, to_time, slb_total_list, env, styles, story)
     if slb_vs_list:
-        story = generateSLBVSReport(from_time, to_time, slb_vs_list, env, styles, story, get_tcp_status)
+        story = generateSLBVSReport(from_time, to_time, slb_vs_list, env, styles, story)
     if slb_rs_list:
         story = generateSLBRSReport(from_time, to_time, slb_rs_list, env, styles, story)
     if slb_vh_list:
@@ -1705,7 +1696,7 @@
     if gslb_list:
         story = generateGSLBReport(from_time, to_time, gslb_list, env, styles, story)
     if tcp_list:
-        story = generateTCPReport(get_tcp_status, tcp_list, env, styles, story)
+        story = generateTCPReport(from_time, tcp_list, env, styles, story)
     if ssl_total_list:
         story = generateSSLTotalReport(from_time, ssl_total_list, env, styles, story)
     doc.build(story,onFirstPage=myFirstPages, onLaterPages=myLaterPages)
@@ -1887,7 +1878,7 @@
         data["children"].extend([{
             "value": 'vs_tcp',
             "label": unicode(_('TCP')),
-            "children": get_statistics_tcp_list(is_vs=True)
+            "children": get_statistics_tcp_list(is_vs=True) + get_tcp_syn_drop_list(is_vs=True)
         }])
         vs_list.append(data)
     return vs_list
@@ -2118,6 +2109,43 @@
         for each in list:
             each["value"] = "vh_" + each["value"]
     return list
+def get_tcp_syn_drop_list(is_vs):
+    """
+    Get list of TCP Syn Drop options
+    :param bool is_vs: is for virtual service? False for total
+    :return List
+        Total ex: [{
+            "value": 'in_use_syn_drop',
+            "label": 'In Use SYN Drop'
+        }]
+        Virtual Service ex: [{
+            "value": 'vs_in_use_syn_drop',
+            "label": 'In Use SYN Drop'
+        }]
+    """
+    list = [{
+        "value": 'in_use_syn_drop',
+        "label": unicode(_('In Use SYN Drop')),
+    }, {
+        "value": 'over_max_syn_drop',
+        "label": unicode(_('Over Max SYN Drop')),
+    }, {
+        "value": 'mss_err_syn_drop',
+        "label": unicode(_('MSS Error SYN Drop')),
+    }, {
+        "value": 'mss_size_syn_drop',
+        "label": unicode(_('MSS Size SYN Drop')),
+    }, {
+        "value": 'eroute_err_syn_drop',
+        "label": unicode(_('Eroute Error SYN Drop')),
+    }, {
+        "value": 'system_stack_syn_route',
+        "label": unicode(_('System Stack Syn Route')),
+    }]
+    if is_vs:
+        for each in list:
+            each["value"] = "vs_" + each["value"]
+    return list
 def generateItems(request):
     item_list = [{
       "value": 'system',
@@ -2181,7 +2209,7 @@
     }, {
       "value": 'tcp',
       "label": unicode(_('TCP')),
-      "children": get_statistics_tcp_list(is_vs=False)
+      "children": get_statistics_tcp_list(is_vs=False) + get_tcp_syn_drop_list(is_vs=False)
     }]
     return HttpResponse(json.dumps(item_list))
 
