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
This commit is contained in:
hploetz 2006-11-22 06:25:48 +00:00
parent 8534043036
commit 7cba0484e8
2 changed files with 89 additions and 2 deletions

View File

@ -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>

View File

@ -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 = {