From bc15eb4e6b051f557567aca767a1160939c0f6d7 Mon Sep 17 00:00:00 2001 From: Matthieu Coudron Date: Wed, 17 Dec 2014 23:39:10 +0100 Subject: [PATCH] i3pystatus creates a logger that can be imported via import i3pystatus.logger . Thus when modules enable the 'enable_log' setting, it should log i3pystatus errors to a file called '.i3pystatus-'. This commit only solves the case when email_client was called in the email module and would output things into stderr/stdout. --- i3pystatus/__init__.py | 12 ++++++++++++ i3pystatus/core/command.py | 37 +++++++++++++++++++++++++++++++++++++ i3pystatus/mail/__init__.py | 4 +++- 3 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 i3pystatus/core/command.py diff --git a/i3pystatus/__init__.py b/i3pystatus/__init__.py index d18ca03..df270a2 100644 --- a/i3pystatus/__init__.py +++ b/i3pystatus/__init__.py @@ -5,6 +5,17 @@ from i3pystatus.core.modules import Module, IntervalModule from i3pystatus.core.settings import SettingsBase from i3pystatus.core.util import formatp +import logging +import os + +h=logging.FileHandler(".i3pystatus-" + str(os.getpid())); + +logger = logging.getLogger("i3pystatus") +logger.addHandler(h) +logger.setLevel(logging.DEBUG) +#~/.i3pystatus-- +logger.error("Start !") + __path__ = extend_path(__path__, __name__) __all__ = [ @@ -12,6 +23,7 @@ __all__ = [ "Module", "IntervalModule", "SettingsBase", "formatp", + "logger", ] diff --git a/i3pystatus/core/command.py b/i3pystatus/core/command.py new file mode 100644 index 0000000..a1eb41a --- /dev/null +++ b/i3pystatus/core/command.py @@ -0,0 +1,37 @@ +from subprocess import check_output, CalledProcessError +import subprocess +from i3pystatus import logger +# class Command(Object): + +# ,*args +def run_through_shell(command,enable_log): + """ + Retrieves output of shell command + Returns tuple boolean (success)/ string (error msg, output) + """ + result=False + try: + #stderr=subprocess.STDOUT + #stderr=subprocess.PIPE + # with subprocess.Popen() as proc: + # logger.error(proc.stderr.read()) + proc = subprocess.Popen(command,stderr=subprocess.PIPE,stdout=subprocess.PIPE) + + out, stderr = proc.communicate() + if stderr and enable_log: + logger.error(stderr) + # out = check_output(command, stderr=subprocess.STDOUT, shell=True) + result=True + # color = self.color + except CalledProcessError as e: + out = e.output + # color = self.error_color + + out = out.decode("UTF-8").replace("\n", " ") + try: + if out[-1] == " ": + out = out[:-1] + except: + out = "" + + return result, out diff --git a/i3pystatus/mail/__init__.py b/i3pystatus/mail/__init__.py index abf0ba1..cc9658b 100644 --- a/i3pystatus/mail/__init__.py +++ b/i3pystatus/mail/__init__.py @@ -2,6 +2,7 @@ import subprocess from i3pystatus import SettingsBase, IntervalModule from i3pystatus.core.util import internet, require +from i3pystatus.core.command import run_through_shell class Backend(SettingsBase): @@ -69,7 +70,8 @@ class Mail(IntervalModule): def on_leftclick(self): if self.email_client: - subprocess.Popen(self.email_client.split()) + run_through_shell(self.email_client,self.enable_log) + def on_rightclick(self): self.run()