aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhploetz <hploetz@f711b948-2313-0410-aaa9-d29f33439f0b>2006-11-22 06:25:48 +0000
committerhploetz <hploetz@f711b948-2313-0410-aaa9-d29f33439f0b>2006-11-22 06:25:48 +0000
commit7cba0484e847a10a0c4ab704db4c50bd4dab8dcb (patch)
tree39ff4a58aeca8b428ca472fe7abb9dd48eddc004
parent8534043036127e996313b70766c03d9e16d057ea (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.e3p6
-rwxr-xr-xcyberflex-shell.py85
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 = {