summaryrefslogtreecommitdiff
path: root/src/leap/util/log.py
blob: 661b0a17282bc3e430d257ab56dfa2011c630ab4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
log.py
------
Logging for leap_mx.

@authors: Isis Agora Lovecruft, <isis@leap.se> 0x2cdb8b35
@licence: see included LICENSE file
@copyright: 2013 Isis Agora Lovecruft
'''

from functools import wraps

import logging
import os
import sys
import traceback

from twisted.python import log  as txlog
from twisted.python import util as txutil
from twisted.python.logfile import DailyLogFile
from twisted.python.failure import Failure

from leap.util import version, config


class UnprefixedLogfile(txlog.FileLogObserver):
    def emit(self, eventDict):
        text = txlog.textFromEventDict(eventDict)
        if text is None:
            return

        txutil.untilConcludes(self.write, "%s\n" % text)
        txutil.untilConcludes(self.flush)


def start(logfile=None, application_name=None):
    if not application_name:
        application_name = version.name
    print "application name: %s" % application_name

    daily_logfile = None

    if not logfile:
        logfile = config.basic.logfile

    repo_dir = version.getRepoDir()
    logfile_dir = os.path.join(repo_dir, 'log')
    logfile_name = logfile

    daily_logfile = DailyLogFile(logfile_name, logfile_dir)

    txlog.startLoggingWithObserver(UnprefixedLogfile(sys.stdout).emit)
    txlog.addObserver(txlog.FileLogObserver(daily_logfile).emit)
    txlog.msg("Starting %s on %s (%s UTC)" % (application_name, 
                                              prettyDateNow(),
                                              utcPrettyDateNow()))
    ## xxx need these functions! ^^

def msg(msg, *arg, **kwarg):
    print "[*] %s" % msg

def debug(msg *arg, **kwarg):
    if config.basic.debug:
        print "[d] %s" % msg

def warn(msg, *arg, **kwarg):
    if config.basic.show_warnings:
        txlog.logging.captureWarnings('true')
        print "[#] %s" % msg

def err(msg, *arg, **kwarg):
    print "[!] %s" % msg

def fail(*failure):
    logging.critical(failure)
    ## xxx should we take steps to exit here?

def exception(error):
    """
    Catch an exception and print only the error message, then continue normal
    program execution.

    @param error: Can be error messages printed to stdout and to the
    logfile, or can be a twisted.python.failure.Failure instance.
    """
    if isinstance(error, Failure):
        error.printTraceback()
    else:
        exc_type, exc_value, exc_traceback = sys.exc_info()
        traceback.print_exception(exc_type, exc_value, exc_traceback)

def catch(func):
    """
    Quick wrapper to add around test methods for debugging purposes,
    catches the given Exception. Use like so:

        >>> @log.catch
            def foo(bar):
                if bar == 'baz':
                    raise Exception("catch me no matter what I am")
        >>> foo("baz")
        [!] catch me no matter what I am

    """
    @wraps(func)
    def _catch(*args, **kwargs):
        try:
            func(*args, **kwargs)
        except Exception, exc:
            exception(exc)
    return _catch