cleaned up all this logging stuff. logging to files does not work anymore but that will be fixed. use -q when starting linspector for now
This commit is contained in:
parent
da6e575410
commit
cbb106ee8a
38 changed files with 188 additions and 164 deletions
|
|
@ -38,6 +38,8 @@ from linspector.core.scheduler import Scheduler
|
||||||
from linspector.backends.jsonrpc import JsonrpcBackend
|
from linspector.backends.jsonrpc import JsonrpcBackend
|
||||||
from linspector.frontends.lish import LishFrontend
|
from linspector.frontends.lish import LishFrontend
|
||||||
|
|
||||||
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def parse_args():
|
def parse_args():
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
|
|
@ -49,7 +51,7 @@ def parse_args():
|
||||||
#TODO: add --nocolor to disable colored output in lish
|
#TODO: add --nocolor to disable colored output in lish
|
||||||
parser.add_argument("--version", action="version", version="%(prog)s " + str(__version__))
|
parser.add_argument("--version", action="version", version="%(prog)s " + str(__version__))
|
||||||
#TODO: make the config file a required field without -c or --config at the end eg: linspector config.json
|
#TODO: make the config file a required field without -c or --config at the end eg: linspector config.json
|
||||||
parser.add_argument("-c", "--config", default=__default_config__,
|
parser.add_argument("-c", "--config", default=__default_config__, metavar="FILE",
|
||||||
help="select configfile to use")
|
help="select configfile to use")
|
||||||
parser.add_argument("-l", "--logfile", default="./log/linspector.log", metavar="FILE",
|
parser.add_argument("-l", "--logfile", default="./log/linspector.log", metavar="FILE",
|
||||||
help="set logfile to use")
|
help="set logfile to use")
|
||||||
|
|
@ -67,50 +69,29 @@ def parse_args():
|
||||||
return parser.parse_args()
|
return parser.parse_args()
|
||||||
|
|
||||||
|
|
||||||
def setup_logging(logfile="./log/linspector.log", logLevel=logging.ERROR, logfileLevel=logging.DEBUG):
|
|
||||||
#TODO: catch all log messages (apscheduler etc.); make logging more generic to support libraries logging
|
|
||||||
logfile = path.expanduser(logfile)
|
|
||||||
if not path.exists(path.dirname(logfile)):
|
|
||||||
os.makedirs(path.dirname(logfile))
|
|
||||||
|
|
||||||
logging.basicConfig(level=logging.WARNING)
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
#log.setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
consoleHandler = logging.StreamHandler()
|
|
||||||
consoleHandler.setLevel(logLevel)
|
|
||||||
|
|
||||||
fileHandler = logging.handlers.RotatingFileHandler(logfile, maxBytes=10485760, backupCount=4)
|
|
||||||
fileHandler.setLevel(logfileLevel)
|
|
||||||
|
|
||||||
consoleFormatter = logging.Formatter('[%(levelname)s]: %(message)s')
|
|
||||||
#TODO: if debug with file and function else without that
|
|
||||||
fileFormatter = logging.Formatter('%(asctime)s %(pathname)s %(module)s %(funcName)s %(lineno)d [%(levelname)s]: %(message)s')
|
|
||||||
|
|
||||||
consoleHandler.setFormatter(consoleFormatter)
|
|
||||||
fileHandler.setFormatter(fileFormatter)
|
|
||||||
|
|
||||||
log.addHandler(consoleHandler)
|
|
||||||
log.addHandler(fileHandler)
|
|
||||||
return log
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
args = parse_args()
|
args = parse_args()
|
||||||
|
|
||||||
log = setup_logging(args.logfile, args.loglevel)
|
logfile = path.expanduser(args.logfile)
|
||||||
|
if not path.exists(path.dirname(logfile)):
|
||||||
|
os.makedirs(path.dirname(logfile))
|
||||||
|
|
||||||
log.info("parsed arguments")
|
#logger.propagate = False
|
||||||
|
logging.basicConfig(level=args.loglevel)
|
||||||
|
#file_handler = logging.handlers.RotatingFileHandler(args.logfile, maxBytes=10485760, backupCount=4)
|
||||||
|
#file_formatter = logging.Formatter('%(asctime)s %(pathname)s %(module)s %(funcName)s %(lineno)d [%(levelname)s]: %(message)s')
|
||||||
|
#file_handler.setFormatter(file_formatter)
|
||||||
|
#file_handler.setLevel(level=args.loglevel)
|
||||||
|
#logger.addHandler(file_handler)
|
||||||
|
|
||||||
configParser = FullConfigParser(log)
|
configParser = FullConfigParser()
|
||||||
linConf, core = configParser.parse_config(args.config)
|
linConf, core = configParser.parse_config(args.config)
|
||||||
|
|
||||||
scheduler = Scheduler({"apscheduler.threadpool.max_threads": 1000})
|
scheduler = Scheduler({"apscheduler.threadpool.max_threads": 1000})
|
||||||
print scheduler._threadpool
|
|
||||||
scheduler.start()
|
scheduler.start()
|
||||||
|
|
||||||
q = Queue.Queue()
|
q = Queue.Queue()
|
||||||
linspector = Linspector(linConf, core, scheduler, log, q)
|
linspector = Linspector(linConf, core, scheduler, q)
|
||||||
linspector.daemon = True
|
linspector.daemon = True
|
||||||
linspector.start()
|
linspector.start()
|
||||||
|
|
||||||
|
|
@ -131,7 +112,7 @@ def main():
|
||||||
|
|
||||||
LishFrontend(interface)
|
LishFrontend(interface)
|
||||||
|
|
||||||
log.debug("shutting down scheduler")
|
logger.debug("shutting down scheduler")
|
||||||
|
|
||||||
shutdown_wait = True
|
shutdown_wait = True
|
||||||
if "shutdown_wait" in core:
|
if "shutdown_wait" in core:
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Backend(threading.Thread):
|
class Backend(threading.Thread):
|
||||||
def __init__(self, interface, **kwargs):
|
def __init__(self, interface, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -22,13 +22,15 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import json
|
import json
|
||||||
import time
|
|
||||||
|
|
||||||
from bjsonrpc.handlers import BaseHandler
|
from bjsonrpc.handlers import BaseHandler
|
||||||
from bjsonrpc import createserver
|
from bjsonrpc import createserver
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.backends.backend import Backend
|
from linspector.backends.backend import Backend
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class JsonrpcBackend(Backend):
|
class JsonrpcBackend(Backend):
|
||||||
def __init__(self, interface, config, **kwargs):
|
def __init__(self, interface, config, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LinspectorConfig(object):
|
class LinspectorConfig(object):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class HostGroupException(Exception):
|
class HostGroupException(Exception):
|
||||||
def __init__(self, msg):
|
def __init__(self, msg):
|
||||||
|
|
@ -124,7 +128,7 @@ class HostGroupService:
|
||||||
return "HostgroupService { " + str([str(s) for s in self.services]) + ", " + str([p.name for p in self.periods]) + "}"
|
return "HostgroupService { " + str([str(s) for s in self.services]) + ", " + str([p.name for p in self.periods]) + "}"
|
||||||
|
|
||||||
|
|
||||||
def parseHostGroupList(hostgroups, hosts, members, periods, services, log):
|
def parseHostGroupList(hostgroups, hosts, members, periods, services):
|
||||||
parsedHostGroups = []
|
parsedHostGroups = []
|
||||||
for hgname, hgValues in hostgroups.items():
|
for hgname, hgValues in hostgroups.items():
|
||||||
hostGroup = HostGroup(hgname)
|
hostGroup = HostGroup(hgname)
|
||||||
|
|
@ -141,7 +145,7 @@ def parseHostGroupList(hostgroups, hosts, members, periods, services, log):
|
||||||
if service is not None:
|
if service is not None:
|
||||||
services.append(service)
|
services.append(service)
|
||||||
else:
|
else:
|
||||||
log.w("could not find HostService(" + str(serviceName) + ") for host " + host.name)
|
logger.warning("could not find HostService(" + str(serviceName) + ") for host " + host.name)
|
||||||
hostGroupPeriods = [p for p in periods if p.name in servicePeriods]
|
hostGroupPeriods = [p for p in periods if p.name in servicePeriods]
|
||||||
hostGroup.services.append(HostGroupService(services, hostGroupPeriods))
|
hostGroup.services.append(HostGroupService(services, hostGroupPeriods))
|
||||||
parsedHostGroups.append(hostGroup)
|
parsedHostGroups.append(hostGroup)
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LayoutException(Exception):
|
class LayoutException(Exception):
|
||||||
def __init__(self, msg):
|
def __init__(self, msg):
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Member:
|
class Member:
|
||||||
def __init__(self, id, name="", comment="", tasks=None):
|
def __init__(self, id, name="", comment="", tasks=None):
|
||||||
|
|
@ -58,7 +62,7 @@ class MemberFilter:
|
||||||
return "Filter:" + str(self.filter) + " Value:" + self.value
|
return "Filter:" + str(self.filter) + " Value:" + self.value
|
||||||
|
|
||||||
|
|
||||||
def parseMemberList(members, filters, log):
|
def parseMemberList(members, filters):
|
||||||
parsedMembers = [Member(nameid, **values) for nameid, values in members.items()]
|
parsedMembers = [Member(nameid, **values) for nameid, values in members.items()]
|
||||||
for member in parsedMembers:
|
for member in parsedMembers:
|
||||||
mFilter = []
|
mFilter = []
|
||||||
|
|
@ -72,6 +76,6 @@ def parseMemberList(members, filters, log):
|
||||||
memberFilter.command = re.sub('@member', replacement, filt.command)
|
memberFilter.command = re.sub('@member', replacement, filt.command)
|
||||||
mFilter.append(memberFilter)
|
mFilter.append(memberFilter)
|
||||||
if not found:
|
if not found:
|
||||||
log.w("filter: " + filtername + " is not defined in member " + member.name)
|
logger.warning("filter: " + filtername + " is not defined in member " + member.name)
|
||||||
member.filters = mFilter
|
member.filters = mFilter
|
||||||
return parsedMembers
|
return parsedMembers
|
||||||
|
|
@ -17,9 +17,11 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import imp
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
from os.path import isfile
|
from os.path import isfile
|
||||||
from os.path import join
|
from os.path import join
|
||||||
import imp
|
|
||||||
|
|
||||||
from layouts import Layout
|
from layouts import Layout
|
||||||
from hostgroups import HostGroup
|
from hostgroups import HostGroup
|
||||||
|
|
@ -43,6 +45,8 @@ KEY_MEMBERS = "members"
|
||||||
KEY_PERIODS = "periods"
|
KEY_PERIODS = "periods"
|
||||||
KEY_CORE = "core"
|
KEY_CORE = "core"
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ConfigurationException(Exception):
|
class ConfigurationException(Exception):
|
||||||
def __init__(self, msg, log):
|
def __init__(self, msg, log):
|
||||||
|
|
@ -54,13 +58,10 @@ class ConfigurationException(Exception):
|
||||||
|
|
||||||
|
|
||||||
class ConfigParser:
|
class ConfigParser:
|
||||||
def __init__(self, log):
|
def __init__(self):
|
||||||
"""
|
"""
|
||||||
initializes a new ConfigParser Object
|
initializes a new ConfigParser Object
|
||||||
|
|
||||||
:param log: pre configured logger Object to post messages while parsing"
|
|
||||||
"""
|
"""
|
||||||
self.log = log
|
|
||||||
self.hostgroups = {}
|
self.hostgroups = {}
|
||||||
self.members = {}
|
self.members = {}
|
||||||
self.periods = {}
|
self.periods = {}
|
||||||
|
|
@ -83,14 +84,14 @@ class ConfigParser:
|
||||||
"""
|
"""
|
||||||
if not isfile(configFilename):
|
if not isfile(configFilename):
|
||||||
msg = "config file not found at " + str(configFilename)
|
msg = "config file not found at " + str(configFilename)
|
||||||
raise ConfigurationException(msg, self.log)
|
raise ConfigurationException(msg, logger)
|
||||||
|
|
||||||
self.configFilename = configFilename
|
self.configFilename = configFilename
|
||||||
|
|
||||||
with open(configFilename) as cfgFile:
|
with open(configFilename) as cfgFile:
|
||||||
config = cfgFile.read()
|
config = cfgFile.read()
|
||||||
|
|
||||||
self.log.info("reading Config: " + configFilename)
|
logger.info("reading Config: " + configFilename)
|
||||||
|
|
||||||
if self.configFilename.endswith(".yaml") or configFilename.endswith("yml"):
|
if self.configFilename.endswith(".yaml") or configFilename.endswith("yml"):
|
||||||
import yaml
|
import yaml
|
||||||
|
|
@ -118,8 +119,8 @@ class ConfigParser:
|
||||||
item = creator(key, val)
|
item = creator(key, val)
|
||||||
items.append(item)
|
items.append(item)
|
||||||
except Exception:
|
except Exception:
|
||||||
self.log.warning("ignoring " + msgName + ": " + key + "! reason:")
|
logger.warning("ignoring " + msgName + ": " + key + "! reason:")
|
||||||
self.log.warning(str(Exception))
|
logger.warning(str(Exception))
|
||||||
return items
|
return items
|
||||||
|
|
||||||
def _load_module(self, clazz, modPart):
|
def _load_module(self, clazz, modPart):
|
||||||
|
|
@ -163,15 +164,15 @@ class ConfigParser:
|
||||||
if class_check(item):
|
if class_check(item):
|
||||||
repl.append(item)
|
repl.append(item)
|
||||||
else:
|
else:
|
||||||
self.log.warning("Ignoring class " + clazzItem["class"] + "! It does not pass the class check!")
|
logger.warning("Ignoring class " + clazzItem["class"] + "! It does not pass the class check!")
|
||||||
|
|
||||||
except ImportError, err:
|
except ImportError, err:
|
||||||
self.log.warning("Could not import " + clazz + ": " + str(clazzItem) + "! reason")
|
logger.warning("Could not import " + clazz + ": " + str(clazzItem) + "! reason")
|
||||||
self.log.warning(str(err))
|
logger.warning(str(err))
|
||||||
except KeyError, k:
|
except KeyError, k:
|
||||||
self.log.warning("Key " + str(k) + " not in classItem " + str(clazzItem))
|
logger.warning("Key " + str(k) + " not in classItem " + str(clazzItem))
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.log.warning("Error while replacing class ( " + clazz + " ): " + str(e))
|
logger.warning("Error while replacing class ( " + clazz + " ): " + str(e))
|
||||||
|
|
||||||
del items[:]
|
del items[:]
|
||||||
items.extend(repl)
|
items.extend(repl)
|
||||||
|
|
@ -241,8 +242,6 @@ class FullConfigParser(ConfigParser):
|
||||||
creator = lambda name, values: HostGroup(name, **values)
|
creator = lambda name, values: HostGroup(name, **values)
|
||||||
self.hostgroups = self._create_raw_Object(self.dict[KEY_HOSTGROUPS], "Hostgroup", creator)
|
self.hostgroups = self._create_raw_Object(self.dict[KEY_HOSTGROUPS], "Hostgroup", creator)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
creator = parsePeriodList
|
creator = parsePeriodList
|
||||||
periods = self._create_raw_Object(self.dict[KEY_PERIODS], "Period", creator)
|
periods = self._create_raw_Object(self.dict[KEY_PERIODS], "Period", creator)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Period(object):
|
class Period(object):
|
||||||
def __init__(self, name):
|
def __init__(self, name):
|
||||||
|
|
|
||||||
|
|
@ -18,16 +18,20 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import subprocess as sp
|
import subprocess as sp
|
||||||
|
|
||||||
from subprocess import Popen
|
from subprocess import Popen
|
||||||
from subprocess import CalledProcessError
|
from subprocess import CalledProcessError
|
||||||
from datetime import datetime as dt
|
from datetime import datetime as dt
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
#TODO: Move this to shell.py service file. this definitely is shell execution. (hanez)
|
#TODO: Move this to shell.py service file. this definitely is shell execution. (hanez)
|
||||||
|
|
||||||
|
|
||||||
class Command:
|
class Command:
|
||||||
def __init__(self, command, log):
|
def __init__(self, command):
|
||||||
self.command = command
|
self.command = command
|
||||||
self.log = log
|
|
||||||
self.output = None
|
self.output = None
|
||||||
self.error = None
|
self.error = None
|
||||||
self.retcode = 0
|
self.retcode = 0
|
||||||
|
|
@ -46,12 +50,12 @@ class Command:
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.commandStart = dt.now()
|
self.commandStart = dt.now()
|
||||||
self.log.info("calling command " + str(self.command) + " at " + str(self.commandStart))
|
logger.info("calling command " + str(self.command) + " at " + str(self.commandStart))
|
||||||
#self.output=sp.check_output(self.command.split())
|
#self.output=sp.check_output(self.command.split())
|
||||||
process = Popen(self.command, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)
|
process = Popen(self.command, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)
|
||||||
self.output, self.error = process.communicate()
|
self.output, self.error = process.communicate()
|
||||||
self.log.debug(str(self.output))
|
logger.debug(str(self.output))
|
||||||
self.log.debug(str(self.error))
|
logger.debug(str(self.error))
|
||||||
self.retcode = process.poll()
|
self.retcode = process.poll()
|
||||||
except CalledProcessError:
|
except CalledProcessError:
|
||||||
self.error = CalledProcessError.output
|
self.error = CalledProcessError.output
|
||||||
|
|
|
||||||
|
|
@ -22,14 +22,11 @@ import sys
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import atexit
|
import atexit
|
||||||
from signal import SIGTERM
|
|
||||||
|
|
||||||
"""
|
from signal import SIGTERM
|
||||||
TODO: Think about, that daemonizing this software is not our goal but when we want to that, this needs a rewrite and
|
from logging import getLogger
|
||||||
should maybe move over to the daemon frontend. daemon.py will remain the the base for this and should stay in linspector/core .
|
|
||||||
Since a daemon it normally not a frontend we should think about how to handle this. When daemonizing a real frontend
|
logger = getLogger(__name__)
|
||||||
like "Lish" will make no sense but a frontend like "https" or "xmpp" could be useful anyway...
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class LinspectorDaemon(Daemon):
|
class LinspectorDaemon(Daemon):
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LinspectorInterface(object):
|
class LinspectorInterface(object):
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from binascii import crc32
|
from binascii import crc32
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def generateId():
|
def generateId():
|
||||||
|
|
@ -60,9 +63,6 @@ class Job:
|
||||||
ret = "0" + ret
|
ret = "0" + ret
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
def set_logger(self, log):
|
|
||||||
self.log = log
|
|
||||||
|
|
||||||
def set_job(self, job):
|
def set_job(self, job):
|
||||||
self.job = job
|
self.job = job
|
||||||
|
|
||||||
|
|
@ -85,7 +85,7 @@ class Job:
|
||||||
self.jobThreshold += 1
|
self.jobThreshold += 1
|
||||||
|
|
||||||
if self.jobThreshold >= serviceThreshold:
|
if self.jobThreshold >= serviceThreshold:
|
||||||
self.log.debug("Threshold reached!")
|
logger.debug("Threshold reached!")
|
||||||
self.handle_alarm(jobInfo, self.jobThreshold - serviceThreshold)
|
self.handle_alarm(jobInfo, self.jobThreshold - serviceThreshold)
|
||||||
|
|
||||||
def handle_alarm(self, jobInfo, thresholdOffset):
|
def handle_alarm(self, jobInfo, thresholdOffset):
|
||||||
|
|
@ -95,8 +95,8 @@ class Job:
|
||||||
task.execute(jobInfo.get_message(), self.core)
|
task.execute(jobInfo.get_message(), self.core)
|
||||||
|
|
||||||
def handle_call(self):
|
def handle_call(self):
|
||||||
self.log.debug("handle call")
|
logger.debug("handle call")
|
||||||
self.log.debug(self.service)
|
logger.debug(self.service)
|
||||||
if self._enabled:
|
if self._enabled:
|
||||||
try:
|
try:
|
||||||
jobInfo = JobInfo(self.hex_string(), self.host, self.service)
|
jobInfo = JobInfo(self.hex_string(), self.host, self.service)
|
||||||
|
|
@ -105,14 +105,14 @@ class Job:
|
||||||
|
|
||||||
self.handle_threshold(jobInfo, self.service.get_threshold(), jobInfo.was_execution_successful())
|
self.handle_threshold(jobInfo, self.service.get_threshold(), jobInfo.was_execution_successful())
|
||||||
|
|
||||||
self.log.debug("Code: " + str(jobInfo.get_errorcode()) + ", Message: " + str(jobInfo.get_message()))
|
logger.debug("Code: " + str(jobInfo.get_errorcode()) + ", Message: " + str(jobInfo.get_message()))
|
||||||
|
|
||||||
self.jobInfos.append(jobInfo)
|
self.jobInfos.append(jobInfo)
|
||||||
|
|
||||||
except Exception, e:
|
except Exception, e:
|
||||||
self.log.debug(e)
|
logger.debug(e)
|
||||||
else:
|
else:
|
||||||
self.log.debug("Job " + self.hex_string() + " disabled")
|
logger.debug("Job " + self.hex_string() + " disabled")
|
||||||
|
|
||||||
|
|
||||||
class JobInfo(object):
|
class JobInfo(object):
|
||||||
|
|
|
||||||
|
|
@ -17,15 +17,11 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from ..core import logger
|
from logging import getLogger
|
||||||
|
|
||||||
from ..core.daemon import Daemon
|
from ..core.daemon import Daemon
|
||||||
|
|
||||||
"""
|
logger = getLogger(__name__)
|
||||||
TODO: Think about, that daemonizing this software is not our goal but when we want to that, this needs a rewrite and
|
|
||||||
should maybe move over to the daemon frontend. daemon.py will remain the the base for this and should stay in linspector/core .
|
|
||||||
Since a daemon it normally not a frontend we should think about how to handle this. When daemonizing a real frontend
|
|
||||||
like "Lish" will make no sense but a frontend like "https" or "xmpp" could be useful anyway...
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class LinspectorDaemon(Daemon):
|
class LinspectorDaemon(Daemon):
|
||||||
|
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
||||||
"""
|
|
||||||
Copyright (c) 2011-2013 "Johannes Findeisen and Rafael Timmerberg"
|
|
||||||
|
|
||||||
This file is part of Linspector (http://linspector.org).
|
|
||||||
|
|
||||||
Linspector is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Affero General Public License as
|
|
||||||
published by the Free Software Foundation, either version 3 of the
|
|
||||||
License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
GNU Affero General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Affero General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
"""
|
|
||||||
|
|
||||||
import logging
|
|
||||||
import logging.handlers
|
|
||||||
import os
|
|
||||||
import os.path as path
|
|
||||||
|
|
||||||
|
|
||||||
class Logger():
|
|
||||||
"""
|
|
||||||
Logger class that prints its messages and keeps them also inside a logfile
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, logfile="./linspector.log", logLevel=logging.DEBUG, logfileLevel=logging.DEBUG):
|
|
||||||
"""
|
|
||||||
initializes a new Logger object.
|
|
||||||
|
|
||||||
:param logLevel: the LoggingLevel from the console output (DEBUG default)
|
|
||||||
:param logfile: the file where to log. Logs are rotated by default.
|
|
||||||
:param logfileLevel: the LoggingLevel for the file Logger. (DEBUG default)
|
|
||||||
"""
|
|
||||||
logfile = path.expanduser(logfile)
|
|
||||||
if not path.exists(path.dirname(logfile)):
|
|
||||||
os.makedirs(path.dirname(logfile))
|
|
||||||
|
|
||||||
self.log = logging.getLogger("LinspectorLogger")
|
|
||||||
self.log.setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
consoleHandler = logging.StreamHandler()
|
|
||||||
consoleHandler.setLevel(logLevel)
|
|
||||||
|
|
||||||
fileHandler = logging.handlers.RotatingFileHandler(logfile, maxBytes=1024000, backupCount=4)
|
|
||||||
fileHandler.setLevel(logfileLevel)
|
|
||||||
|
|
||||||
consoleFormatter = logging.Formatter('[%(levelname)s]: %(message)s')
|
|
||||||
fileFormatter = logging.Formatter('%(asctime)s [%(levelname)s]: %(message)s')
|
|
||||||
|
|
||||||
consoleHandler.setFormatter(consoleFormatter)
|
|
||||||
fileHandler.setFormatter(fileFormatter)
|
|
||||||
|
|
||||||
self.log.addHandler(consoleHandler)
|
|
||||||
self.log.addHandler(fileHandler)
|
|
||||||
|
|
||||||
def d(self, message):
|
|
||||||
self.log.debug(message)
|
|
||||||
|
|
||||||
def i(self, message):
|
|
||||||
self.log.info(message)
|
|
||||||
|
|
||||||
def w(self, message):
|
|
||||||
self.log.warn(message)
|
|
||||||
|
|
||||||
def e(self, message):
|
|
||||||
self.log.error(message)
|
|
||||||
|
|
||||||
def c(self, message):
|
|
||||||
self.log.critical(message)
|
|
||||||
|
|
||||||
def close(self):
|
|
||||||
logging.shutdown()
|
|
||||||
|
|
@ -17,8 +17,12 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from apscheduler.scheduler import Scheduler
|
from apscheduler.scheduler import Scheduler
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Scheduler(Scheduler):
|
class Scheduler(Scheduler):
|
||||||
def test(self):
|
def test(self):
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Frontend(object):
|
class Frontend(object):
|
||||||
def __init__(self, linspectorInterface):
|
def __init__(self, linspectorInterface):
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
from cmd import Cmd
|
from cmd import Cmd
|
||||||
|
from logging import getLogger
|
||||||
from shlex import split as shsplit
|
from shlex import split as shsplit
|
||||||
|
|
||||||
from linspector.frontends.frontend import Frontend
|
from linspector.frontends.frontend import Frontend
|
||||||
|
|
@ -38,6 +40,8 @@ GREEN = "\033[92m"
|
||||||
RED = "\033[91m"
|
RED = "\033[91m"
|
||||||
END = "\033[0m"
|
END = "\033[0m"
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class LishFrontend(Frontend):
|
class LishFrontend(Frontend):
|
||||||
def __init__(self, linpsectorInterface):
|
def __init__(self, linpsectorInterface):
|
||||||
|
|
|
||||||
|
|
@ -23,19 +23,22 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
import datetime
|
import datetime
|
||||||
import threading
|
import threading
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from core.job import Job
|
from core.job import Job
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
def handle_job(jobInfo):
|
def handle_job(jobInfo):
|
||||||
jobInfo.handle_call()
|
jobInfo.handle_call()
|
||||||
|
|
||||||
|
|
||||||
class Linspector(threading.Thread):
|
class Linspector(threading.Thread):
|
||||||
def __init__(self, linConf, core, scheduler, log, q):
|
def __init__(self, linConf, core, scheduler, q):
|
||||||
self.linConf = linConf
|
self.linConf = linConf
|
||||||
self.core = core
|
self.core = core
|
||||||
self.scheduler = scheduler
|
self.scheduler = scheduler
|
||||||
self.log = log
|
|
||||||
self.q = q
|
self.q = q
|
||||||
threading.Thread.__init__(self)
|
threading.Thread.__init__(self)
|
||||||
|
|
||||||
|
|
@ -62,6 +65,5 @@ class Linspector(threading.Thread):
|
||||||
schedulerJob = period.createJob(self.scheduler, job, handle_job, start_date=new_start_date)
|
schedulerJob = period.createJob(self.scheduler, job, handle_job, start_date=new_start_date)
|
||||||
if schedulerJob is not None:
|
if schedulerJob is not None:
|
||||||
job.set_job(schedulerJob)
|
job.set_job(schedulerJob)
|
||||||
job.set_logger(self.log)
|
|
||||||
jobs.append(job)
|
jobs.append(job)
|
||||||
self.q.put(jobs)
|
self.q.put(jobs)
|
||||||
|
|
@ -17,6 +17,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Parser:
|
class Parser:
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,12 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.parsers.parser import Parser
|
from linspector.parsers.parser import Parser
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ShellParser(Parser):
|
class ShellParser(Parser):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,11 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
from linspector.processors.processor import Processor
|
from linspector.processors.processor import Processor
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class MariadbProcessor(Processor):
|
class MariadbProcessor(Processor):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,11 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
from linspector.processors.processor import Processor
|
from linspector.processors.processor import Processor
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class MongodbProcessor(Processor):
|
class MongodbProcessor(Processor):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Processor:
|
class Processor:
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,11 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
from linspector.processors.processor import Processor
|
from linspector.processors.processor import Processor
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SyslogProcessor(Processor):
|
class SyslogProcessor(Processor):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -26,8 +26,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import urllib
|
import urllib
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.services.service import Service
|
from linspector.services.service import Service
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class HttpService(Service):
|
class HttpService(Service):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# http://code.activestate.com/recipes/409689-icmplib-library-for-creating-and-reading-icmp-pack/
|
# http://code.activestate.com/recipes/409689-icmplib-library-for-creating-and-reading-icmp-pack/
|
||||||
from linspector.services.service import Service
|
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
from linspector.services.service import Service
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Packet(object):
|
class Packet(object):
|
||||||
"""Creates ICMPv4 and v6 packets.
|
"""Creates ICMPv4 and v6 packets.
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,8 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
KEY_PARSER = "parser"
|
KEY_PARSER = "parser"
|
||||||
KEY_COMMENT = "comment"
|
KEY_COMMENT = "comment"
|
||||||
KEY_THRESHOLD = "threshold"
|
KEY_THRESHOLD = "threshold"
|
||||||
|
|
@ -24,6 +26,8 @@ KEY_FAILS = "fails"
|
||||||
KEY_PERIODS = "periods"
|
KEY_PERIODS = "periods"
|
||||||
KEY_ARGS = "args"
|
KEY_ARGS = "args"
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Service(object):
|
class Service(object):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,12 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.services.service import Service
|
from linspector.services.service import Service
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class ShellService(Service):
|
class ShellService(Service):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,9 +19,13 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
#from pysnmp.entity.rfc3413.oneliner import cmdgen
|
#from pysnmp.entity.rfc3413.oneliner import cmdgen
|
||||||
|
|
||||||
from linspector.services.service import Service
|
from linspector.services.service import Service
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SnmpgetService(Service):
|
class SnmpgetService(Service):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -24,8 +24,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
import paramiko
|
import paramiko
|
||||||
import pprint
|
import pprint
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.services.service import Service
|
from linspector.services.service import Service
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SshService(Service):
|
class SshService(Service):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.services.service import Service
|
from linspector.services.service import Service
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class TcpconnectService(Service):
|
class TcpconnectService(Service):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.services.service import Service
|
from linspector.services.service import Service
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class UdpconnectService(Service):
|
class UdpconnectService(Service):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import xmpp
|
import xmpp
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.tasks.task import Task
|
from linspector.tasks.task import Task
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class JabberTask(Task):
|
class JabberTask(Task):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -23,9 +23,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
import smtplib
|
import smtplib
|
||||||
|
|
||||||
from email.mime.text import MIMEText
|
from email.mime.text import MIMEText
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.tasks.task import Task
|
from linspector.tasks.task import Task
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class MailTask(Task):
|
class MailTask(Task):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,12 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.tasks.task import Task
|
from linspector.tasks.task import Task
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class SmsTask(Task):
|
class SmsTask(Task):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,10 @@ You should have received a copy of the GNU Affero General Public License
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class Task:
|
class Task:
|
||||||
def set_task_type(self, taskType):
|
def set_task_type(self, taskType):
|
||||||
|
|
|
||||||
|
|
@ -22,8 +22,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import tweepy
|
import tweepy
|
||||||
|
|
||||||
|
from logging import getLogger
|
||||||
|
|
||||||
from linspector.tasks.task import Task
|
from linspector.tasks.task import Task
|
||||||
|
|
||||||
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
class TweetTask(Task):
|
class TweetTask(Task):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue