diff options
author | hploetz <hploetz@f711b948-2313-0410-aaa9-d29f33439f0b> | 2006-11-22 06:25:48 +0000 |
---|---|---|
committer | hploetz <hploetz@f711b948-2313-0410-aaa9-d29f33439f0b> | 2006-11-22 06:25:48 +0000 |
commit | 7cba0484e847a10a0c4ab704db4c50bd4dab8dcb (patch) | |
tree | 39ff4a58aeca8b428ca472fe7abb9dd48eddc004 | |
parent | 8534043036127e996313b70766c03d9e16d057ea (diff) |
Implemented logging
Hint: Try something like log %(HOMEDIR)s/cyberflex-shell-%(ISOTIME)s.log in your ~/.cyberflex-shellrc
git-svn-id: svn+ssh://localhost/home/henryk/svn/cyberflex-shell/trunk@137 f711b948-2313-0410-aaa9-d29f33439f0b
-rw-r--r-- | cyberflex-shell.e3p | 6 | ||||
-rwxr-xr-x | cyberflex-shell.py | 85 |
2 files changed, 89 insertions, 2 deletions
diff --git a/cyberflex-shell.e3p b/cyberflex-shell.e3p index 2c5722a..732b234 100644 --- a/cyberflex-shell.e3p +++ b/cyberflex-shell.e3p @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Project SYSTEM "Project-3.7.dtd"> <!-- Project file for project cyberflex-shell --> -<!-- Saved: 2006-07-24, 17:00:49 --> +<!-- Saved: 2006-11-22, 07:24:14 --> <!-- Copyright (C) 2006 Henryk Plötz, henryk@ploetzli.ch --> <Project version="3.7"> <ProgLanguage mixed="0">Python</ProgLanguage> @@ -76,6 +76,10 @@ <Dir>cards</Dir> <Name>cardos_card.py</Name> </Source> + <Source> + <Dir>cards</Dir> + <Name>postcard_card.py</Name> + </Source> </Sources> <Forms> </Forms> diff --git a/cyberflex-shell.py b/cyberflex-shell.py index efa1d85..5ef42e5 100755 --- a/cyberflex-shell.py +++ b/cyberflex-shell.py @@ -1,17 +1,53 @@ #!/usr/bin/env python # -*- coding: iso-8859-1 -*- -import pycsc, crypto_utils, utils, cards, os, re, binascii, sys, exceptions, traceback, getopt +import pycsc, crypto_utils, utils, cards, os, re, binascii, sys, exceptions, traceback, getopt, datetime from shell import Shell def list_readers(): for index, name in enumerate(pycsc.listReader()): print "%i: %s" % (index, name) +class Logger(object): + def __init__(self, filename, stream, prefix = "# "): + self.fp = file(filename, "w") + self.stream = stream + self.prefix = prefix + self.need_prefix = True + + def println(self, string): + if not self.need_prefix: + self.fp.write("\n") + self.need_prefix = True + self.fp.write("\n".join(string.splitlines()) + "\n") + + def flush(self): + return self.stream.flush() + + def close(self): + self.stream.close() + + def writelines(self, lines): + for line in lines: + self.write(line) + + def write(self, line): + if self.need_prefix: + self.fp.write(self.prefix) + self.need_prefix = False + + self.fp.write( ( ("\n"+self.prefix).join(line.splitlines()) ) ) + if line[-1] == "\n": + self.fp.write("\n") + self.need_prefix = True + + self.stream.write(line) + class Cyberflex_Shell(Shell): def __init__(self, basename): self.print_backtrace = True self.reader = 0 + self.logger = None Shell.__init__(self, basename) self.register_commands(self, self.NOCARD_COMMANDS) self.set_prompt("(No card) ") @@ -321,6 +357,52 @@ class Cyberflex_Shell(Shell): if len(response.data) > 0: ## The SW is already printed by _print_sw as a post_hook print utils.hexdump(response.data) + + def pause_log(self): + if self.logger is not None: + sys.stdout = self.logger.stream + + def unpause_log(self): + if self.logger is not None: + sys.stdout = self.logger + + def start_log(self, filename): + if self.logger is not None: + self.stop_log() + self.logger = Logger(filename, sys.stdout) + sys.stdout = self.logger + print "Logging to %s" % filename + self.register_pre_hook(self.pause_log) + + def stop_log(self): + if self.logger is not None: + print "Log stopped" + sys.stdout = self.logger.stream + self.logger.flush() + self.logger = None + self.unregister_pre_hook(self.pause_log) + + def parse_and_execute(self, line): + if self.logger is not None: + self.logger.println( self.logger.prefix + "\n" + + self.logger.prefix + "=== " + datetime.datetime.now().isoformat(" ") + " " + ("="*49) ) + self.logger.println(line) + if self.logger is not None: + self.unpause_log() + result = Shell.parse_and_execute(self, line) + return result + + def cmd_log(self, filename = None): + "Start (when given a filename) or stop (otherwise) logging to a file" + if filename is not None: + date = datetime.datetime.now() + vars = { + "HOMEDIR": os.environ["HOME"], + "ISOTIME": date.isoformat() + } + self.start_log(filename % vars) + else: + self.stop_log() def _print_sw(self): if self.card.sw_changed: @@ -422,6 +504,7 @@ class Cyberflex_Shell(Shell): "save_response": cmd_save_response, "fancy": cmd_fancy, "enc": cmd_enc, + "log": cmd_log, } ) CARD_COMMANDS = { |