Last active
June 3, 2017 13:16
-
-
Save RWJMurphy/5537082 to your computer and use it in GitHub Desktop.
Fabric fabfile for turning a directory of scripts into remote-running tasks. Like magic. Just drop `__init__.py` into a folder containing your executable scripts, and `import script_dir` from your existing `fabfile.py`. Each script file will then be available as a task named `script_dir.script_name`
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import os | |
import os.path | |
import re | |
import fabric.api | |
import fabric.tasks | |
SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) | |
SUDO_PREFIX = re.compile(r'/(root|sudo)_?', re.I) | |
class ScriptTask(fabric.tasks.Task): | |
def __init__(self, script_path, name=None, sudo=False): | |
super(ScriptTask, self).__init__() | |
self.script_path = script_path | |
self.script_name = os.path.basename(script_path) | |
self.name = name or os.path.splitext(self.script_name)[0] | |
self.sudo = sudo | |
if sudo: | |
self.remote_path = '/root/{}'.format(self.script_name) | |
else: | |
self.remote_path = '/tmp/{}'.format(self.script_name) | |
def run(self): | |
fabric.api.put( | |
self.script_path, | |
self.remote_path, | |
mirror_local_mode=True, | |
use_sudo=self.sudo | |
) | |
if self.sudo: | |
fabric.api.sudo(self.remote_path) | |
else: | |
fabric.api.run(self.remote_path) | |
__all__ = [] | |
tasks = {} | |
for filename in os.listdir(SCRIPT_DIR): | |
if filename in ["__init__.py", ]: | |
continue | |
filename = os.path.join(SCRIPT_DIR, filename) | |
if os.path.isfile(filename) and os.access(filename, os.X_OK): | |
task_is_sudo = bool(SUDO_PREFIX.search(filename)) | |
task = ScriptTask(filename, sudo=task_is_sudo) | |
tasks[task.name] = task | |
for task_name, task in tasks.iteritems(): | |
globals()[task_name] = task | |
__all__.append(task_name) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment