1
0
Fork 0
mirror of synced 2024-11-23 00:35:34 -05:00

First iteration of LinkIf shell conditional plugin

This commit is contained in:
Ben Klein 2018-02-23 16:56:19 -05:00
parent 2f4cc0d9cb
commit 16dfb63194
2 changed files with 44 additions and 0 deletions

View file

@ -43,6 +43,7 @@ class Dispatcher(object):
def _load_plugins(self): def _load_plugins(self):
self._plugins = [plugin(self._context) self._plugins = [plugin(self._context)
for plugin in Plugin.__subclasses__()] for plugin in Plugin.__subclasses__()]
self._log.debug("Found plugins: " + str(self._plugins))
class DispatchError(Exception): class DispatchError(Exception):
pass pass

View file

@ -2,6 +2,8 @@ import os
import glob import glob
import shutil import shutil
import dotbot import dotbot
import subprocess
import copy
class Link(dotbot.Plugin): class Link(dotbot.Plugin):
@ -217,3 +219,44 @@ class Link(dotbot.Plugin):
self._log.lowinfo('Link exists %s -> %s' % (link_name, source)) self._log.lowinfo('Link exists %s -> %s' % (link_name, source))
success = True success = True
return success return success
class Linkif(Link, dotbot.Plugin):
'''
Symbolically links dotfiles conditionally.
'''
_directive = 'linkif'
_config_key = 'if'
def handle(self, directive, data):
if directive != self._directive:
raise ValueError('LinkIf cannot handle directive %s' % directive)
success = True
data_filtered = copy.deepcopy(data)
for destination, config in data.items():
if isinstance(config, dict) and config[self._config_key] is not None:
commandsuccess = self._test_success(config[self._config_key])
if commandsuccess:
del data_filtered[destination][self._config_key]
else:
# remove the item from data
del data_filtered[destination]
else:
self._log.error("Could not find valid conditional in linkif 'if'!")
success &= False
return self._process_links(data_filtered)
def _test_success(self, testcommand):
try:
osstdout = subprocess.check_output(
testcommand,
stderr=subprocess.STDOUT,
shell=True,
executable=os.environ.get("SHELL", "/bin/sh")
)
except subprocess.CalledProcessError as e:
# self._log.warning("Command failed: " + str(testcommand))
self._log.debug("Command returned "+str(e.returncode)+": \n" + str(testcommand))
return False
return True