Created
May 21, 2014 08:20
-
-
Save hwgao/eea5bb9ea6a73a398c44 to your computer and use it in GitHub Desktop.
Terminator plugin -- log the output of the terminator into a file with the current time as the default file name and with the time stamp on each line
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# Plugin by Sinan Nalkaya <sardok@gmail.com> | |
# See LICENSE of Terminator package. | |
""" logger.py - Terminator Plugin to log 'content' of individual | |
terminals """ | |
import os | |
import sys | |
import time | |
import gtk | |
import time | |
import datetime | |
import terminatorlib.plugin as plugin | |
from terminatorlib.translation import _ | |
AVAILABLE = ['MyLogger'] | |
class MyLogger(plugin.MenuItem): | |
""" Add custom command to the terminal menu""" | |
capabilities = ['terminal_menu'] | |
loggers = None | |
dialog_action = gtk.FILE_CHOOSER_ACTION_SAVE | |
dialog_buttons = (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, | |
gtk.STOCK_SAVE, gtk.RESPONSE_OK) | |
def __init__(self): | |
plugin.MenuItem.__init__(self) | |
if not self.loggers: | |
self.loggers = {} | |
def callback(self, menuitems, menu, terminal): | |
""" Add save menu item to the menu""" | |
vte_terminal = terminal.get_vte() | |
if not self.loggers.has_key(vte_terminal): | |
item = gtk.MenuItem(_('Start Logger')) | |
item.connect("activate", self.start_logger, terminal) | |
else: | |
item = gtk.MenuItem(_('Stop Logger')) | |
item.connect("activate", self.stop_logger, terminal) | |
item.set_has_tooltip(True) | |
item.set_tooltip_text("Saving at '" + self.loggers[vte_terminal]["filepath"] + "'") | |
menuitems.append(item) | |
def write_content(self, terminal, row_start, col_start, row_end, col_end): | |
""" Final function to write a file """ | |
content = terminal.get_text_range(row_start, col_start, row_end, col_end, | |
lambda *a: True) | |
# Insert current time to the beginning of a new line | |
now = datetime.datetime.now().strftime("[%d-%H:%M] ") | |
fd = self.loggers[terminal]["fd"] | |
# Don't write the last char which is always '\n' | |
# fd.write(content[:-1]) | |
lines = content.splitlines(True) | |
for i in range(0, len(lines)): | |
if ((i == 0) and (col_start != 0)): | |
continue | |
lines[i] = now + lines[i] | |
fd.write(lines[i]) | |
self.loggers[terminal]["col"] = col_end | |
self.loggers[terminal]["row"] = row_end | |
def save(self, terminal): | |
""" 'contents-changed' callback """ | |
last_saved_col = self.loggers[terminal]["col"] | |
last_saved_row = self.loggers[terminal]["row"] | |
(col, row) = terminal.get_cursor_position() | |
# Save only when buffer is nearly full, | |
# for the sake of efficiency | |
if row - last_saved_row < terminal.get_row_count(): | |
return | |
self.write_content(terminal, last_saved_row, last_saved_col, row, col) | |
def start_logger(self, _widget, Terminal): | |
""" Handle menu item callback by saving text to a file""" | |
savedialog = gtk.FileChooserDialog(title="Save Log File As", | |
action=self.dialog_action, | |
buttons=self.dialog_buttons) | |
savedialog.set_do_overwrite_confirmation(True) | |
savedialog.set_local_only(True) | |
savedialog.show_all() | |
savedialog.set_current_folder(os.path.expanduser("~") + "/log") | |
savedialog.set_current_name(time.strftime("%Y%m%d-%H%M%S") + ".log") | |
response = savedialog.run() | |
if response == gtk.RESPONSE_OK: | |
try: | |
logfile = os.path.join(savedialog.get_current_folder(), | |
savedialog.get_filename()) | |
fd = open(logfile, 'w+') | |
# Save log file path, | |
# associated file descriptor, signal handler id | |
# and last saved col,row positions respectively. | |
vte_terminal = Terminal.get_vte() | |
(col, row) = vte_terminal.get_cursor_position() | |
self.loggers[vte_terminal] = {"filepath":logfile, | |
"handler_id":0, "fd":fd, | |
"col":col, "row":row} | |
# Add contents-changed callback | |
self.loggers[vte_terminal]["handler_id"] = vte_terminal.connect('contents-changed', self.save) | |
except: | |
e = sys.exc_info()[1] | |
error = gtk.MessageDialog(None, gtk.DIALOG_MODAL, gtk.MESSAGE_ERROR, | |
gtk.BUTTONS_OK, e.strerror) | |
error.run() | |
error.destroy() | |
savedialog.destroy() | |
def stop_logger(self, _widget, terminal): | |
vte_terminal = terminal.get_vte() | |
last_saved_col = self.loggers[vte_terminal]["col"] | |
last_saved_row = self.loggers[vte_terminal]["row"] | |
(col, row) = vte_terminal.get_cursor_position() | |
if last_saved_col != col or last_saved_row != row: | |
# Save unwritten bufer to the file | |
self.write_content(vte_terminal, last_saved_row, last_saved_col, row, col) | |
fd = self.loggers[vte_terminal]["fd"] | |
fd.close() | |
vte_terminal.disconnect(self.loggers[vte_terminal]["handler_id"]) | |
del(self.loggers[vte_terminal]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment