111 lines
3.2 KiB
Python
111 lines
3.2 KiB
Python
"""
|
|
Component for monitoring activity on a folder.
|
|
|
|
For more details about this platform, refer to the documentation at
|
|
https://home-assistant.io/components/folder_watcher/
|
|
"""
|
|
import os
|
|
import logging
|
|
import voluptuous as vol
|
|
from homeassistant.const import (
|
|
EVENT_HOMEASSISTANT_START, EVENT_HOMEASSISTANT_STOP)
|
|
import homeassistant.helpers.config_validation as cv
|
|
|
|
REQUIREMENTS = ['watchdog==0.8.3']
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
CONF_FOLDER = 'folder'
|
|
CONF_PATTERNS = 'patterns'
|
|
DEFAULT_PATTERN = '*'
|
|
DOMAIN = "folder_watcher"
|
|
|
|
CONFIG_SCHEMA = vol.Schema({
|
|
DOMAIN: vol.All(cv.ensure_list, [vol.Schema({
|
|
vol.Required(CONF_FOLDER): cv.isdir,
|
|
vol.Optional(CONF_PATTERNS, default=[DEFAULT_PATTERN]):
|
|
vol.All(cv.ensure_list, [cv.string]),
|
|
})])
|
|
}, extra=vol.ALLOW_EXTRA)
|
|
|
|
|
|
def setup(hass, config):
|
|
"""Set up the folder watcher."""
|
|
conf = config[DOMAIN]
|
|
for watcher in conf:
|
|
path = watcher[CONF_FOLDER]
|
|
patterns = watcher[CONF_PATTERNS]
|
|
if not hass.config.is_allowed_path(path):
|
|
_LOGGER.error("folder %s is not valid or allowed", path)
|
|
return False
|
|
Watcher(path, patterns, hass)
|
|
|
|
return True
|
|
|
|
|
|
def create_event_handler(patterns, hass):
|
|
"""Return the Watchdog EventHandler object."""
|
|
from watchdog.events import PatternMatchingEventHandler
|
|
|
|
class EventHandler(PatternMatchingEventHandler):
|
|
"""Class for handling Watcher events."""
|
|
|
|
def __init__(self, patterns, hass):
|
|
"""Initialise the EventHandler."""
|
|
super().__init__(patterns)
|
|
self.hass = hass
|
|
|
|
def process(self, event):
|
|
"""On Watcher event, fire HA event."""
|
|
_LOGGER.debug("process(%s)", event)
|
|
if not event.is_directory:
|
|
folder, file_name = os.path.split(event.src_path)
|
|
self.hass.bus.fire(
|
|
DOMAIN, {
|
|
"event_type": event.event_type,
|
|
'path': event.src_path,
|
|
'file': file_name,
|
|
'folder': folder,
|
|
})
|
|
|
|
def on_modified(self, event):
|
|
"""File modified."""
|
|
self.process(event)
|
|
|
|
def on_moved(self, event):
|
|
"""File moved."""
|
|
self.process(event)
|
|
|
|
def on_created(self, event):
|
|
"""File created."""
|
|
self.process(event)
|
|
|
|
def on_deleted(self, event):
|
|
"""File deleted."""
|
|
self.process(event)
|
|
|
|
return EventHandler(patterns, hass)
|
|
|
|
|
|
class Watcher():
|
|
"""Class for starting Watchdog."""
|
|
|
|
def __init__(self, path, patterns, hass):
|
|
"""Initialise the watchdog observer."""
|
|
from watchdog.observers import Observer
|
|
self._observer = Observer()
|
|
self._observer.schedule(
|
|
create_event_handler(patterns, hass),
|
|
path,
|
|
recursive=True)
|
|
hass.bus.listen_once(EVENT_HOMEASSISTANT_START, self.startup)
|
|
hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, self.shutdown)
|
|
|
|
def startup(self, event):
|
|
"""Start the watcher."""
|
|
self._observer.start()
|
|
|
|
def shutdown(self, event):
|
|
"""Shutdown the watcher."""
|
|
self._observer.stop()
|
|
self._observer.join()
|