pyledriver/sharedLogging.py

90 lines
2.7 KiB
Python
Raw Normal View History

import logging, os
2017-05-22 01:44:16 -04:00
from subprocess import run, PIPE, CalledProcessError
2017-05-29 18:04:50 -04:00
from logging.handlers import TimedRotatingFileHandler
2016-12-30 02:51:56 -05:00
# formats console output depending on whether we have gluster
2017-05-29 21:53:08 -04:00
def _formatConsole(gluster = False):
c = '' if gluster else '[CONSOLE ONLY] '
fmt = logging.Formatter('[%(name)s] [%(levelname)s] ' + c + '%(message)s')
console.setFormatter(fmt)
2017-05-29 21:53:08 -04:00
# init console, but don't expect gluster to be here yet
console = logging.StreamHandler()
2017-05-29 21:53:08 -04:00
_formatConsole(gluster = False)
rootLogger = logging.getLogger()
rootLogger.setLevel(logging.DEBUG)
rootLogger.addHandler(console)
logger = logging.getLogger(__name__)
2017-05-22 02:32:19 -04:00
2017-05-29 21:15:38 -04:00
class GlusterFSHandler(TimedRotatingFileHandler):
def __init__(self, server, volume, mountpoint, options=None):
2017-05-22 01:44:16 -04:00
if not os.path.exists(mountpoint):
raise FileNotFoundError
2017-05-29 21:15:38 -04:00
self._mountpoint = mountpoint
self._server = server
self._volume = volume
self._options = options
logdest = mountpoint + '/logs'
if not os.path.exists(logdest):
os.mkdir(logdest)
elif os.path.isfile(logdest):
logger.critical('%s is present but is a file (vs a directory). ' \
'Please (re)move this file to prevent data loss', logdest)
2017-05-29 21:15:38 -04:00
raise SystemExit
self._mount()
super().__init__(logdest + '/pyledriver-log', when='midnight')
fmt = logging.Formatter('[%(asctime)s] [%(name)s] [%(levelname)s] %(message)s')
self.setFormatter(fmt)
def _mount(self):
if os.path.ismount(self._mountpoint):
# NOTE: this assumes that the already-mounted device is the one intended
logger.warning('Device already mounted at {}'.format(self._mountpoint))
else:
2017-05-29 21:15:38 -04:00
dst = self._server + ':/' + self._volume
cmd = ['mount', '-t', 'glusterfs', dst, self._mountpoint]
if self._options:
cmd[1:1] = ['-o', self._options]
self._run(cmd)
2017-05-22 01:44:16 -04:00
2017-05-29 21:15:38 -04:00
def _unmount(self):
self._run(['umount', self._mountpoint])
2017-05-22 01:44:16 -04:00
def _run(self, cmd):
try:
run(cmd, check=True, stdout=PIPE, stderr=PIPE)
except CalledProcessError as e:
2017-05-22 02:32:19 -04:00
# we assume that this will only get thrown when the logger is not
# active, so use fallback to get the explicit mount errors
2017-05-29 21:15:38 -04:00
stderr = e.stderr.decode('ascii').rstrip()
logger.critical(stderr)
2017-05-23 01:43:39 -04:00
raise SystemExit
2017-05-29 21:15:38 -04:00
def close(self):
TimedRotatingFileHandler.close(self) # must close file stream before unmounting
self._unmount()
2017-05-29 21:53:08 -04:00
# ...now activate gluster
gluster = GlusterFSHandler(
server = '192.168.11.39',
volume = 'pyledriver',
mountpoint = '/mnt/glusterfs/pyledriver',
options = 'backupvolfile-server=192.168.11.48'
)
2017-05-22 02:32:19 -04:00
2017-05-29 21:53:08 -04:00
_formatConsole(gluster = True)
rootLogger.addHandler(gluster)
2016-12-30 02:51:56 -05:00
2017-05-29 21:53:08 -04:00
# this should only be called at the end to clean up
def unmountGluster():
rootLogger.removeHandler(gluster)
2017-05-29 21:53:08 -04:00
_formatConsole(gluster = False)