import win32evtlogimport win32evtlogutilimport win32securityimport win32conimport winerrorimport timeimport tracebackimport sysimport reimport stringfrom RecordFetcher import RecordFetcher, Recordclass RecordFetcherWindows32(RecordFetcher): def date2sec(self, evt_date): ''' This function converts dates with format '12/23/99 15:54:09' to seconds since 1970. ''' regexp=re.compile('(.*)\\s(.*)') #store result in site reg_result=regexp.search(evt_date) date=reg_result.group(1) the_time=reg_result.group(2) (mon,day,yr)=map(lambda x: string.atoi(x),string.split(date,'/')) (hr,min,sec)=map(lambda x: string.atoi(x),string.split(the_time,':')) tup=[yr,mon,day,hr,min,sec,0,0,0] sec=time.mktime(tup) return sec def fetchRecords(self, fromWhen = 28800): print "RecordFetcherWindows32::fetchRecords" begin_sec=time.time() begin_time=time.strftime('%H:%M:%S ',time.localtime(begin_sec)) flags = win32evtlog.EVENTLOG_BACKWARDS_READ|win32evtlog.EVENTLOG_SEQUENTIAL_READ evt_dict={ win32con.EVENTLOG_AUDIT_FAILURE:'EVENTLOG_AUDIT_FAILURE', win32con.EVENTLOG_AUDIT_SUCCESS:'EVENTLOG_AUDIT_SUCCESS', win32con.EVENTLOG_INFORMATION_TYPE:'EVENTLOG_INFORMATION_TYPE', win32con.EVENTLOG_WARNING_TYPE:'EVENTLOG_WARNING_TYPE', win32con.EVENTLOG_ERROR_TYPE:'EVENTLOG_ERROR_TYPE'} logType = 'Application' hand = win32evtlog.OpenEventLog('', logType) records = [] try: events=1 while events: events=win32evtlog.ReadEventLog(hand,flags,0) for ev_obj in events: #check if the event is recent enough #only want data from last 8hrs the_time=ev_obj.TimeGenerated.Format() seconds=self.date2sec(the_time) if seconds < begin_sec-fromWhen: break #data is recent enough, so print it out computer=str(ev_obj.ComputerName) cat=str(ev_obj.EventCategory) src=str(ev_obj.SourceName) if src == 'LifeBeat': record=str(ev_obj.RecordNumber) evt_id=str(winerror.HRESULT_CODE(ev_obj.EventID)) evt_type=str(evt_dict[ev_obj.EventType]) msg = str(win32evtlogutil.SafeFormatMessage(ev_obj, logType)) rec = Record(the_time,computer,src,cat,record,evt_id,evt_type,msg) records.append(rec) if seconds < begin_sec-60: break #get out of while loop as well win32evtlog.CloseEventLog(hand) except: print traceback.print_exc(sys.exc_info()) return records