class DarwinDebugHandler(logging.StreamHandler): """ Debug-Handler that passes Messages to the darwin debugging """ def __init__(self): self.glog = Scope("bin.Record", console_out=False) # global logger super(DarwinDebugHandler, self).__init__(self) self.setLevel(logging.DEBUG) self.glog.log("Logging attached to Record-Script") if not __debug__: self.glog.warning("__debug__ is false, some messages might be optimised into nirvana!") def write(self, message): """ Called by logger Implements an function required by Objects attached to a :class:`StreamHandler` :param message: Incoming Logging Message :type message: Should be a String :return: Nothing """ self.glog.log(message) def flush(self): """ Called by logger Implements an function required by Objects attached to a :class:`StreamHandler` (This one actually does nothing, it is only here for the looks) :return: Nothing """ pass
def yaml_include(loader, node): """Include another YAML file.""" debug = Scope("Util.Config.yaml_loader") filename = loader.construct_scalar(node) filename = find_resource(filename + '.yaml') with open(filename) as include_fp: data = yaml.load(include_fp) debug.log("Include-Config '%s' geladen" % filename) return data
def test_net_send_string_log(self): self.dbg.reset() debug = Scope('Test') debug.log("Name", "Toller Name mit Umlauten: öä") gevent.sleep(1) msg = self.dbg.get_debug_data(HOST + "::Test.Name") self.assertTrue(msg) # es ist keine nachricht angekommen self.assertEquals(msg[0], "string") self.assertEquals(msg[1], "Toller Name mit Umlauten: öä")
def test_net_console_log(self): self.dbg.reset() debug = Scope('Test') debug.log('Testnachricht') gevent.sleep(1) msg = self.dbg.get_debug_data(HOST + "::Test.log") self.assertTrue(msg) # es ist keine nachricht angekommen self.assertEquals(msg[0], "log") self.assertEquals(msg[1], "Testnachricht") debug.log('Dies ist eine längere Nachricht') gevent.sleep(1) msg = self.dbg.get_debug_data(HOST + "::Test.log") self.assertTrue(msg) # es ist keine nachricht angekommen self.assertEquals(msg[0], "log") self.assertEquals(msg[1], "Dies ist eine längere Nachricht")
class Nice(object): """ Diese Klasse stellt methoden bereit, um die relevanz des aktuellen Prozesses zu verändern. Wenn das runtersetzen des Nicelevels (hochsetzen der Priorität) nicht möglich ist wird aus gründen der sicherheit nichts getan. """ def __init__(self, debug=None): if not debug: self.debug = Scope("Nice") else: self.debug = debug.sub("Nice") config = get_config() if config['nice']: try: self.nice_ok = True self.level = self.get_nice() self.__test_nice() except: # behandlung um intern consistent zu bleiben self.nice_ok = False raise # fehler weiterwerfen else: self.debug.log("Nice ist in der Config deaktiviert") self.nice_ok = False def __test_nice(self): """ Testet ob das runtersetzen des nicelevels möglich ist """ try: # wenn wir hier unterbrochen werden passieren dumme dinge try: self.set_nice(-1, True) self.set_nice(1, True) self.nice_ok = 1 except OSError: # dann der lange weg try: os.popen("sudo -n renice -n %d -p %d 2> /dev/null" % (-1, multiprocessing.current_process().pid)) except OSError: #irgentwass schiefgegangen, der rest fängt es ab... pass time.sleep(1) if not (self.get_nice() == -1): # wir dürfen nicht.... :( self.nice_ok = False self.debug.warning( "Nicelevel darf nicht reduziert werden, disable Nice") else: self.nice_ok = 2 self.set_normal(True) except: # dann gehts nicht # wenn wir hier landen wird es hoffentlich meist ein # KeybordInterrupt sein, wenn wir es nicht auf false setzen # passieren unter umständen komische dinge self.nice_ok = False raise # weitergeben des fehlers... def get_active(self): """ :return: Ob das Modul aktiv ist. :return type: boolean """ return self.nice_ok def get_nice(self): """ :return: Das aktuelle Nicelevel :return type: int """ self.level = os.nice(0) self.debug.log("niceines", self.level) return self.level def set_nice(self, change, silence=False): """ Verändert das Nicellevel um change :param change: die Änderung des Nicelevels :type change: int :param silence: Supress debugmessages :type silence: boolean :return: True wenn erfolgt :return type: boolean .. hint:: Wenn :func:`get_nice` == False wird ''nichts'' getan (außer einer debug warning) """ if self.nice_ok: if self.nice_ok == 1: self.level = os.nice(change) else: os.popen("sudo -n renice -n %d -p %d 2> /dev/null" % (self.level + change, multiprocessing.current_process().pid)) time.sleep(1) self.get_nice() if not silence: self.debug("Set Nicelevel to %d" % self.level) return True else: self.debug.warning("Setzen von Nice nicht möglich") return False def set_realtime(self): """ Setzt die Priorität auf "Realtime" """ if self.nice_ok: return self.set_level(-20) else: self.debug.warning("Set (Soft-) Realtime Priorität nicht möglich!") return False def set_normal(self, silence=False): """ Setzt die Prioritöt auf Normal """ return self.set_level(0, silence) def set_level(self, level, silence=False): """ Setzt das nice level auf level :param level: das Level auf das die Priorität gesetzt werden soll :type level: int """ return self.set_nice((self.level - level) * (-1), silence)