tools/search.py
author Tero Marttila <terom@fixme.fi>
Tue, 10 Feb 2009 02:57:16 +0200
changeset 79 43ac75054d5c
parent 68 8157c41b3236
permissions -rw-r--r--
image formatting \o/
65
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
"""
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
    Tool for accessing the search index
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
import sys; sys.path.insert(0, '.'); sys.path.insert(0, '..')
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
import datetime, pytz
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
import log_search
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
def cmd_load (options, channel_name, *dates) :
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    """
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
        Loads the logs for a specific channel for the given dates into the index
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    """
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    import channels
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    # open the LogSearchIndex
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
    index = log_search.LogSearchIndex(options.index_path, '*' if options.create_index else 'a')
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    # open the channel
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    channel = channels.channel_list.lookup(channel_name)
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    for date_name in dates :
68
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    25
        print "%s..." % (date_name, ),
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    26
        lines = None
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    27
        
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    28
        try :
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    29
            # parse date
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    30
            date = datetime.datetime.strptime(date_name, '%Y-%m-%d').replace(tzinfo=channel.source.tz)
65
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
68
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    32
            # load lines for date
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    33
            lines = channel.source.get_date(date)
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    34
        
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    35
        except Exception, e :
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    36
            print "Skipped: %s" % (e, )
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    37
        
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    38
        else :
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    39
            # insert
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    40
            count = index.insert(channel, lines)
65
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
68
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    42
            print "%d" % count
65
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
def cmd_search (options, channel_name, query) :
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
    """
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
        Search the index for events on a specific channel with the given query
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    """
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    import channels
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    assert not options.create_index
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    # open the LogSearchIndex
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    index = log_search.LogSearchIndex(options.index_path, 'r')
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    # open the channel
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    channel = channels.channel_list.lookup(channel_name)
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    # search
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    lines = index.search_simple(channel, query)
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    # display as plaintext
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    for line in options.formatter.format_txt(lines) :
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        print line
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
if __name__ == '__main__' :
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    from optparse import OptionParser
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    import log_formatter
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    # define parser
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    parser = OptionParser(
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        usage           = "%prog [options] <command> [ ... ]",
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
        add_help_option = True,
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    )
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    # define command-line arguments
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    parser.add_option("-I", "--index", dest="index_path", help="Index database path", metavar="PATH", default="logs/index")
68
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    78
    parser.add_option("--create", dest="create_index", action="store_true", help="Create index database")
65
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    parser.add_option("-f", "--formatter", dest="formatter_name", help="LogFormatter to use", default="irssi")
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    parser.add_option("-z", "--timezone", dest="tz_name", help="Timezone for output", metavar="TZ", default="UTC")
68
8157c41b3236 improve search form & script
Tero Marttila <terom@fixme.fi>
parents: 65
diff changeset
    81
    parser.add_option("--skip-missing", dest="skip_missing", action="store_true", help="Skip missing logfiles")
65
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    # parse
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    options, args = parser.parse_args()
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    # postprocess stuff
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    options.tz = pytz.timezone(options.tz_name)
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    options.formatter = log_formatter.by_name(options.formatter_name)(options.tz)
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    # pop command
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    command = args.pop(0)
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    # inspect
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    func = globals()['cmd_%s' % command]
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    # call
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    func(options, *args)
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
8b50694f841e improve search further
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99