Commit 8b07b6d1 authored by Anael Beutot's avatar Anael Beutot
Browse files

Handler for script job

parent b13a92e6
Loading
Loading
Loading
Loading
+34 −1
Original line number Diff line number Diff line
@@ -6,6 +6,7 @@ import fcntl
import subprocess
import logging
import os.path
import stat
import struct
import socket
import termios
@@ -15,13 +16,14 @@ from subprocess import Popen, PIPE, STDOUT

from sjrpc.utils import pass_connection, threadless
from sjrpc.core.protocols import TunnelProtocol
from sjrpc.core.exceptions import RpcError
from cloudcontrol.common.client.tags import Tag, tag_inspector
from cloudcontrol.common.client.plugins import Base as BasePlugin
from cloudcontrol.common.jobs import JobsManager, JobsStore
from cloudcontrol.common.helpers.logger import patch_logging; patch_logging()

from cloudcontrol.node.host import tags
from cloudcontrol.node.host.jobs import NodeJobsManagerInterface
from cloudcontrol.node.host.jobs import NodeJobsManagerInterface, ScriptJob


logger = logging.getLogger(__name__)
@@ -181,6 +183,7 @@ class Handler(BasePlugin):
            job_cancel=self.job_cancel,
            job_purge=self.job_purge,
            job_attachment=self.job_attachment,
            script_run=self.script_run,
        ))
        # running shells
        self.shells = dict()
@@ -278,6 +281,36 @@ class Handler(BasePlugin):
        # create tunnel
        conn.create_tunnel(label=label, endpoint=sock)

    @pass_connection
    def script_run(self, conn, sha1, script, owner, *args):
        # retrive script if not here
        filename = '/tmp/cc-node-scripts/' + sha1
        if not os.access(filename, os.X_OK):
            try:
                sha1, content = conn.call('script_get', script)
            except RpcError:
                logger.error('Error while retrieving script: %s', script)
                raise
            with open(filename, "w") as f:
                try:
                    f.write(content)
                    os.chmod(filename, stat.S_IREAD | stat.S_IWRITE | stat.S_IEXEC)
                except OSError:
                    logger.error(
                        'Could not set execution permission to script: %s',
                        script)
                    raise
                except IOError:
                    logger.error(
                        'Could not write script to repository: %s', script)
                    raise

        return self.jobs_manager.spawn(ScriptJob, owner, settings=dict(
            script=script,
            filename=filename,
            args=args,
        )).id

    def job_cancel(self, job_id):
        self.jobs_manager.get(job_id).cancel()