import repository from arizona
[raven.git] / 2.0 / python / logging / tcpdumpdaemon.py
1 #! /usr/bin/env python
2
3 """
4 <Program Name>
5    tcpdumpdaemon.py
6
7 <Started>
8    February 3, 2007
9
10 <Author>
11    Programmed by Jeffry Johnston
12
13 <Purpose>
14    Collects packet information from tcpdump and saves as files in one hour
15    increments.
16    
17    Note: Planetlab use requires that the following line be included in  
18          /etc/passwd:
19          
20          pcap:x:77:77::/var/arpwatch:/bin/nologin
21 """
22
23 #           [option, long option,  variable,   action,  data,     default, metavar,   description]
24 """arizonaconfig
25    options=[
26             ["",     "--logdir",   "logdir",   "store", "string", "/tmp",  "DIR",     "log file directory (default: /tmp)"],
27             ["",     "--interval", "interval", "store", "int",    3600,    "SECONDS", "wait at least this number of seconds before opening a new log file (default 3600)"]
28            ]
29    includes=[]        
30 """
31
32 import arizonaconfig
33 import signal
34 import arizonageneral
35 import os
36 import sys
37 import time
38 import storkerror
39
40 done = False
41 pipe = None
42
43
44
45
46
47 def handler_sighup(signum, frame):
48     """
49     <Purpose>
50        Intercepts the HUP signal.
51     """
52     global done, pipe
53     
54     try: 
55        pipe.flush()
56        pipe.close()
57     except:
58        pass   
59     pipe = None
60     done = True
61
62
63
64
65
66 def main(): 
67    global done, pipe
68
69    # parse command line and options
70    args = arizonaconfig.init_options(module="tcpdumpdaemon.py", version="2.0")
71
72    # run as a daemon 
73    arizonageneral.make_daemon("tcpdumpd")
74    
75    # make it easy to kill the daemon 
76    outfile = open("/tmp/tcpdump.pid", "w")
77    outfile.write(str(os.getpid()))
78    outfile.close()
79    
80    # set up I/O
81    pipe = os.popen("/usr/sbin/tcpdump -tt -v -nn 2> /dev/null", "r")
82    
83    # set up hangup signal handler
84    signal.signal(signal.SIGHUP, handler_sighup)
85
86    lasttime = 0
87    
88    while not done:
89       # is it time to change log file?
90       currtime = time.time()
91       if currtime - lasttime >= arizonaconfig.get_option("interval"): 
92          lasttime = currtime 
93
94          # build filename
95          filename = None
96          try:
97             filename = arizonageneral.gethostname()
98          except:
99             pass
100          if filename == None:
101             filename = "unknown_host"
102          try:
103             username = arizonageneral.getusername()
104          except:
105             username = "unknown_user"
106          filename = arizonaconfig.get_option("logdir") + "/" + filename \
107                     + "^" + username + "^" + str(currtime) + "^packetlog" 
108          
109          # close old file
110          try:
111             outfile.flush()
112          except:
113             pass
114          try:
115             outfile.close()
116          except:
117             pass
118             
119          # create current.packetlog file
120          try:
121             tempfile = open(arizonaconfig.get_option("logdir") + "/current.packetlog", "w")
122             tempfile.write(filename)
123             tempfile.close()
124          except:
125             pass   
126             
127          # open new file   
128          try:    
129             outfile = open(filename, "a")
130          except:   
131             pass
132    
133       # read stdin
134       if not done:    
135          try:
136             line = pipe.readline()
137          except:
138             done = True
139           
140       # write to file      
141       if not done:    
142          try:
143             outfile.write(line)
144          except: 
145             pass   
146       if not done:    
147          try:
148             outfile.flush()
149          except: 
150             pass   
151    
152       #dont eat up cycles
153       time.sleep(1)
154
155    # clean up
156    try:
157       outfile.close()
158    except: 
159       pass   
160       
161    os.system("/bin/rm -f /tmp/tcpdump.pid &> /dev/null")
162    
163    
164    
165      
166
167 if __name__ == "__main__":
168    # prepare error reporting tool
169    storkerror.init_error_reporting("tcpdumpdaemon.py")
170       
171    # call main
172    main()