Show
Ignore:
Timestamp:
10/01/08 16:21:23 (22 months ago)
Author:
haypo
svm:headrev:

c624a6cb-57d4-0310-9736-a25a8df6d016:16284
svk:copy_cache_prev:
9444
Message:

Create Filter class, responsible to filter, sort and truncate

Location:
mirror/edenwall/pynetfilter_conntrack/trunk/pynetfilter_conntrack
Files:
1 added
2 modified

Legend:

Unmodified
Added
Removed
  • mirror/edenwall/pynetfilter_conntrack/trunk/pynetfilter_conntrack/__init__.py

    r5882 r9447  
    55from pynetfilter_conntrack.func_expect import * 
    66from pynetfilter_conntrack.conntrack_entry import * 
     7from pynetfilter_conntrack.filter import Filter 
    78from pynetfilter_conntrack.conntrack import * 
    89from pynetfilter_conntrack.expect_entry import * 
  • mirror/edenwall/pynetfilter_conntrack/trunk/pynetfilter_conntrack/conntrack.py

    r9445 r9447  
    1 from pynetfilter_conntrack import ConntrackEntry,\ 
     1from pynetfilter_conntrack import ConntrackEntry, Filter, \ 
    22    nfct_query, nfct_callback_t, nfct_callback_register, \ 
    33    nfct_callback_unregister, nfct_catch, \ 
    4     CONNTRACK, NFCT_Q_DUMP, NFCT_T_ALL, NFCT_CB_CONTINUE, NFCT_CB_STOLEN, \ 
    5     IPPROTO_TCP, TCP_CONNTRACK_TIME_WAIT, PF_INET, PF_INET6 
     4    CONNTRACK, NFCT_Q_DUMP, NFCT_T_ALL, NFCT_CB_CONTINUE, NFCT_CB_STOLEN 
    65from pynetfilter_conntrack.conntrack_base import ConntrackBase 
    76from ctypes import byref 
     
    3635        self.callback_arg = None 
    3736 
    38     def filterConnection(self, conn, filter): 
    39         # Ignore TCP connection in state TIME_WAIT 
    40         if (conn.orig_l4proto == IPPROTO_TCP) \ 
    41         and (conn.tcp_state == TCP_CONNTRACK_TIME_WAIT): 
    42             return False 
    43  
    44         # Get source and destination IP (v4 or v6) addresses 
    45         l3proto = conn.orig_l3proto 
    46         if l3proto == PF_INET: 
    47             ip_src = conn.orig_ipv4_src 
    48             ip_dst = conn.orig_ipv4_dst 
    49         elif l3proto == PF_INET6: 
    50             ip_src = conn.orig_ipv6_src 
    51             ip_dst = conn.orig_ipv6_dst 
    52         else: 
    53             return True 
    54  
    55         # Ignore IP address in self.filter 
    56         for network in filter: 
    57             if (ip_src in network) or (ip_dst in network): 
    58                 return False 
    59         return True 
    60  
    61     def dump_table(self, family=AF_INET, event_type=NFCT_T_ALL, drop_networks=None, sort=None, reverse=False, start=0, size=None): 
     37    def dump_table(self, family=AF_INET, event_type=NFCT_T_ALL, filter=None): 
     38        if not filter: 
     39            filter = Filter() 
    6240        if HAS_CNETFILTER_CONNTRACK: 
    6341            if family != AF_INET: 
    6442                raise ValueError("cnetfilter_conntrack only supports IPv4") 
    65             if drop_networks: 
    66                 drop_networks = tuple((ip.int(), ip.broadcast().int()) for ip in drop_networks) 
    67             if not size: 
    68                 size = 0 
    69             table, total = dump_table_ipv4(self.handle, drop_networks=drop_networks, sort=sort, reverse=reverse, start=start, size=size) 
     43            options = filter.createCNetfilterOptions() 
     44            table, total = dump_table_ipv4(self.handle, **options) 
    7045 
    7146            connections = [] 
     
    8055            return connections, total 
    8156        else: 
    82             if sort: 
    83                 raise NotImplementedError("Python version of dump_table() doesn't support sorting") 
    84             if reverse: 
    85                 raise NotImplementedError("Python version of dump_table() doesn't support reverse") 
    86  
    8757            # Create a pointer to a 'uint8_t' of the address family 
    8858            family = byref(uint8_t(family)) 
     
    9060            def copyEntry(msgtype, conntrack, data): 
    9161                conn = ConntrackEntry(self, conntrack, msgtype) 
    92                 if not self.filterConnection(conn, drop_networks): 
     62                if not filter.filterConnection(conn): 
    9363                    conn._destroy = False 
    9464                    return NFCT_CB_CONTINUE 
     
    10171            self.query(NFCT_Q_DUMP, family) 
    10272            self.unregister_callback() 
    103             table = copyEntry.ctlist 
     73            connset = copyEntry.ctlist 
     74 
     75            # Sort the list 
     76            filter.sortTable(connset) 
    10477 
    10578            # Truncated the list 
    10679            total = len(connset) 
    107             if size is None: 
    108                 connset = connset[start:] 
    109             else: 
    110                 connset = connset[start:start+size] 
     80            connset = filter.truncate(connset) 
    11181 
    11282            # Suppress unwanted entries 
    113             return table, total 
     83            return connset, total 
    11484 
    11585    def query(self, command, argument):