Subversion Repositories freemyipod

Rev

Rev 395 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 395 Rev 396
Line 21... Line 21...
21
#
21
#
22
#
22
#
23
 
23
 
24
import sys
24
import sys
25
import os
25
import os
26
import inspect
-
 
27
import re
-
 
28
import time
26
import time
29
import struct
27
import struct
30
import locale
28
import locale
31
 
29
 
32
from functools import wraps
30
from functools import wraps
33
 
31
 
34
import libembios
32
import libembios
35
from libembios import Error
-
 
36
import libembiosdata
33
import libembiosdata
-
 
34
from misc import Error, Logger, getfuncdoc
37
 
35
 
38
 
36
 
39
class NotImplementedError(Error):
37
class NotImplementedError(Error):
40
    pass
38
    pass
41
 
39
 
Line 57... Line 55...
57
    """
55
    """
58
        Prints the usage information.
56
        Prints the usage information.
59
        It is auto generated from various places.
57
        It is auto generated from various places.
60
    """
58
    """
61
    logger = Logger()
59
    logger = Logger()
62
    cmddict= Commandline.cmddict
60
    cmddict = Commandline.cmddict
63
    doc = {}
-
 
64
    # This sorts the output of various internal functions
-
 
65
    # and puts everything in easy readable form
-
 
66
    for function in cmddict:
61
    doc = getfuncdoc(cmddict)
67
        function = cmddict[function].func
-
 
68
        docinfo = {}
-
 
69
        name = function.__name__
-
 
70
        args = inspect.getargspec(function)[0]
-
 
71
        docinfo['varargs'] = False
-
 
72
        if inspect.getargspec(function)[1]:
-
 
73
            docinfo['varargs'] = True
-
 
74
        kwargvalues = inspect.getargspec(function)[3]
-
 
75
        kwargs = {}
-
 
76
        if args:
-
 
77
            if kwargvalues:
-
 
78
                argnum = len(args) - len(kwargvalues)
-
 
79
                kwargnum = len(kwargvalues)
-
 
80
                kwargs = dict(zip(args[argnum:], kwargvalues))
-
 
81
            else:
-
 
82
                argnum = len(args)
-
 
83
        else:
-
 
84
            argnum = 0
-
 
85
        docinfo['args'] = args[1:argnum]
-
 
86
        docinfo['kwargs'] = kwargs
-
 
87
        if function.__doc__:
-
 
88
            # strip unneccessary whitespace
-
 
89
            docinfo['documentation'] = re.sub(r'\n        ', '\n', function.__doc__)
-
 
90
        else:
-
 
91
            docinfo['documentation'] = None
-
 
92
        doc[name] = docinfo
-
 
93
 
-
 
94
    if not specific:
62
    if not specific:
95
        logger.log("Please provide a command and (if needed) parameters as command line arguments\n\n")
63
        logger.log("Please provide a command and (if needed) parameters as command line arguments\n\n")
96
        logger.log("Available commands:\n\n")
64
        logger.log("Available commands:\n\n")
97
    else:
65
    else:
98
        logger.log("\n")
66
        logger.log("\n")
99
    for function in sorted(doc.items()):
67
    for function in sorted(doc.items()):
100
        function = function[0]
68
        function = function[0]
101
        if specific == False or specific == function:
69
        if specific == False or specific == function:
102
            logger.log("  " + function + " ")
70
            logger.log(function + " ", 2)
103
            for arg in doc[function]['args']:
71
            for arg in doc[function]['args']:
104
                logger.log("<" + arg + "> ")
72
                logger.log("<" + arg + "> ")
105
            if doc[function]['kwargs']:
73
            if doc[function]['kwargs']:
106
                for kwarg in doc[function]['kwargs']:
74
                for kwarg in doc[function]['kwargs']:
107
                    logger.log("[" + kwarg + "] ")
75
                    logger.log("[" + kwarg + "] ")
108
            if doc[function]['varargs']:
76
            if doc[function]['varargs']:
109
                logger.log("<db1> ... <dbN>")
77
                logger.log("<db1> ... <dbN>")
-
 
78
            logger.log("\n")
110
            if doc[function]['documentation']:
79
            if doc[function]['documentation']:
111
                logger.log(doc[function]['documentation']+"\n")
80
                logger.log(doc[function]['documentation']+"\n", 4)
112
    
81
            logger.log("\n")
113
    logger.log("\n")
82
    logger.log("\n")
114
 
83
 
115
    if errormsg:
84
    if errormsg:
116
        logger.error(str(errormsg)+"\n")
85
        logger.error(str(errormsg)+"\n")
117
    exit(2)
86
    exit(2)
118
 
87
 
119
 
88
 
120
class Logger(object):
-
 
121
    """
-
 
122
        Simple stdout logger.
-
 
123
        Loglevel 4 is most verbose, Loglevel 0: Only say something if there is an error.
-
 
124
        The log function doesn't care about the loglevel and always logs to stdout.
-
 
125
    """
-
 
126
    def __init__(self):
-
 
127
        # Possible values: 0 (only errors), 1 (warnings), 2 (info, recommended for production use), 3 and more (debug)
-
 
128
        self.loglevel = 3
-
 
129
        
-
 
130
    def log(self, text):
-
 
131
        sys.stdout.write(text)
-
 
132
    
-
 
133
    def debug(self, text):
-
 
134
        if self.loglevel >= 3:
-
 
135
            self.log("DEBUG: " + text)
-
 
136
    
-
 
137
    def info(self, text):
-
 
138
        if self.loglevel >= 2:
-
 
139
            self.log(text)
-
 
140
    
-
 
141
    def warn(self, text):
-
 
142
        if self.loglevel >= 1:
-
 
143
            self.log("WARNING: " + text)
-
 
144
    
-
 
145
    def error(self, text):
-
 
146
        self.log("ERROR: " + text)
-
 
147
 
-
 
148
 
-
 
149
def command(func):
89
def command(func):
150
    """
90
    """
151
        Decorator for all commands.
91
        Decorator for all commands.
152
        The decorated function is called with (self, all, other, arguments, ...)
92
        The decorated function is called with (self, all, other, arguments, ...)
153
    """
93
    """
Line 504... Line 444...
504
        cpuload = threadload + coreload
444
        cpuload = threadload + coreload
505
        self.logger.info("Threads: %d, CPU load: %.1f%%, kernel load: %.1f%%, user load: %.1f%%\n\n"
445
        self.logger.info("Threads: %d, CPU load: %.1f%%, kernel load: %.1f%%, user load: %.1f%%\n\n"
506
                         % (len(threads), cpuload * 100, coreload * 100, threadload * 100))
446
                         % (len(threads), cpuload * 100, coreload * 100, threadload * 100))
507
        self.logger.info("Thread dump:\n")
447
        self.logger.info("Thread dump:\n")
508
        for thread in threads:
448
        for thread in threads:
509
            self.logger.info("  "+thread.name+":\n")
449
            self.logger.info(thread.name+":\n", 2)
510
            self.logger.info("    Thread id: "      + str(thread.id)+"\n")
450
            self.logger.info("Thread id: "      + str(thread.id)+"\n", 4)
511
            self.logger.info("    Thread type: "    + thread.type+"\n")
451
            self.logger.info("Thread type: "    + thread.type+"\n", 4)
512
            self.logger.info("    Thread state: "   + thread.state+"\n")
452
            self.logger.info("Thread state: "   + thread.state+"\n", 4)
513
            self.logger.info("    Block type: "     + thread.block_type+"\n")
453
            self.logger.info("Block type: "     + thread.block_type+"\n", 4)
514
            self.logger.info("    Blocked by: "     + self._hex(thread.blocked_by_ptr)+"\n")
454
            self.logger.info("Blocked by: "     + self._hex(thread.blocked_by_ptr)+"\n", 4)
515
            self.logger.info("    Priority: "       + str(thread.priority)+"/255\n")
455
            self.logger.info("Priority: "       + str(thread.priority)+"/255\n", 4)
516
            self.logger.info("    Current CPU load: %.1f%%\n" % ((thread.cpuload * 100) / 255.))
456
            self.logger.info("Current CPU load: %.1f%%\n" % ((thread.cpuload * 100) / 255.), 4)
517
            self.logger.info("    CPU time (total): "+str(datetime.timedelta(microseconds = thread.cputime_total))+"\n")
457
            self.logger.info("CPU time (total): "+str(datetime.timedelta(microseconds = thread.cputime_total))+"\n", 4)
518
            self.logger.info("    Stack address: "  + self._hex(thread.stackaddr)+"\n")
458
            self.logger.info("Stack address: "  + self._hex(thread.stackaddr)+"\n", 4)
519
            self.logger.info("    Registers:\n")
459
            self.logger.info("Registers:\n", 4)
520
            for registerrange in range(4):
460
            for registerrange in range(4):
521
                self.logger.info("      ")
461
                self.logger.info("      ")
522
                for register in range(registerrange, 16, 4):
462
                for register in range(registerrange, 16, 4):
523
                    registerrepr = "r"+str(register)
463
                    registerrepr = "r"+str(register)
524
                    self.logger.info("{0:3s}: 0x{1:08X}   ".format(registerrepr, thread.regs["r"+str(register)]))
464
                    self.logger.info("{0:3s}: 0x{1:08X}   ".format(registerrepr, thread.regs["r"+str(register)]))
525
                self.logger.info("\n")
465
                self.logger.info("\n")
526
            self.logger.info("     cpsr: 0x{0:08X}".format(thread.regs.cpsr))
466
            self.logger.info("cpsr: 0x{0:08X}".format(thread.regs.cpsr), 6)
527
            self.logger.info("\n")
467
            self.logger.info("\n")
528
    
468
    
529
    @command
469
    @command
530
    def lockscheduler(self):
470
    def lockscheduler(self):
531
        """
471
        """