Statistics
| Branch: | Tag: | Revision:

root / image_creator / winexe.py @ f953c647

History | View | Annotate | Download (4.1 kB)

1 f5873ed0 Nikos Skalkotos
# -*- coding: utf-8 -*-
2 f5873ed0 Nikos Skalkotos
#
3 f5873ed0 Nikos Skalkotos
# Copyright 2013 GRNET S.A. All rights reserved.
4 f5873ed0 Nikos Skalkotos
#
5 f5873ed0 Nikos Skalkotos
# Redistribution and use in source and binary forms, with or
6 f5873ed0 Nikos Skalkotos
# without modification, are permitted provided that the following
7 f5873ed0 Nikos Skalkotos
# conditions are met:
8 f5873ed0 Nikos Skalkotos
#
9 f5873ed0 Nikos Skalkotos
#   1. Redistributions of source code must retain the above
10 f5873ed0 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
11 f5873ed0 Nikos Skalkotos
#      disclaimer.
12 f5873ed0 Nikos Skalkotos
#
13 f5873ed0 Nikos Skalkotos
#   2. Redistributions in binary form must reproduce the above
14 f5873ed0 Nikos Skalkotos
#      copyright notice, this list of conditions and the following
15 f5873ed0 Nikos Skalkotos
#      disclaimer in the documentation and/or other materials
16 f5873ed0 Nikos Skalkotos
#      provided with the distribution.
17 f5873ed0 Nikos Skalkotos
#
18 f5873ed0 Nikos Skalkotos
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
19 f5873ed0 Nikos Skalkotos
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 f5873ed0 Nikos Skalkotos
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 f5873ed0 Nikos Skalkotos
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
22 f5873ed0 Nikos Skalkotos
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 f5873ed0 Nikos Skalkotos
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 f5873ed0 Nikos Skalkotos
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
25 f5873ed0 Nikos Skalkotos
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
26 f5873ed0 Nikos Skalkotos
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 f5873ed0 Nikos Skalkotos
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
28 f5873ed0 Nikos Skalkotos
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 f5873ed0 Nikos Skalkotos
# POSSIBILITY OF SUCH DAMAGE.
30 f5873ed0 Nikos Skalkotos
#
31 f5873ed0 Nikos Skalkotos
# The views and conclusions contained in the software and
32 f5873ed0 Nikos Skalkotos
# documentation are those of the authors and should not be
33 f5873ed0 Nikos Skalkotos
# interpreted as representing official policies, either expressed
34 f5873ed0 Nikos Skalkotos
# or implied, of GRNET S.A.
35 f5873ed0 Nikos Skalkotos
36 f5873ed0 Nikos Skalkotos
"""This module provides an interface for the WinEXE utility"""
37 f5873ed0 Nikos Skalkotos
38 f5873ed0 Nikos Skalkotos
import subprocess
39 f5873ed0 Nikos Skalkotos
import time
40 f5873ed0 Nikos Skalkotos
import signal
41 9b2b47ae Nikos Skalkotos
import distutils
42 f5873ed0 Nikos Skalkotos
43 f5873ed0 Nikos Skalkotos
from image_creator.util import FatalError
44 f5873ed0 Nikos Skalkotos
45 f5873ed0 Nikos Skalkotos
46 f5873ed0 Nikos Skalkotos
class WinexeTimeout(FatalError):
47 f5873ed0 Nikos Skalkotos
    """Raised when a WinExE command times-out"""
48 f5873ed0 Nikos Skalkotos
    pass
49 f5873ed0 Nikos Skalkotos
50 f5873ed0 Nikos Skalkotos
51 f5873ed0 Nikos Skalkotos
class WinEXE:
52 f5873ed0 Nikos Skalkotos
    """Wrapper class for the winexe command"""
53 f5873ed0 Nikos Skalkotos
54 9b2b47ae Nikos Skalkotos
    @staticmethod
55 9b2b47ae Nikos Skalkotos
    def is_installed(program='winexe'):
56 9b2b47ae Nikos Skalkotos
        return distutils.spawn.find_executable(program) is not None
57 9b2b47ae Nikos Skalkotos
58 f5873ed0 Nikos Skalkotos
    def __init__(self, username, password, hostname, program='winexe'):
59 f5873ed0 Nikos Skalkotos
        self._host = hostname
60 f5873ed0 Nikos Skalkotos
        self._user = username
61 f5873ed0 Nikos Skalkotos
        self._pass = password
62 f5873ed0 Nikos Skalkotos
        self._prog = program
63 f5873ed0 Nikos Skalkotos
64 f5873ed0 Nikos Skalkotos
        # -U USERNAME[%PASSWORD]
65 f5873ed0 Nikos Skalkotos
        user = '%s%s' % (self._user, '%%%s' % self._pass if self._pass else "")
66 f5873ed0 Nikos Skalkotos
        self._opts = ['-U', user]
67 f5873ed0 Nikos Skalkotos
68 f5873ed0 Nikos Skalkotos
    def reset(self):
69 f5873ed0 Nikos Skalkotos
        """Reset all winexe options"""
70 f5873ed0 Nikos Skalkotos
71 f5873ed0 Nikos Skalkotos
        # -U USERNAME[%PASSWORD]
72 f5873ed0 Nikos Skalkotos
        user = '%s%s' % (self._user, '%%%s' % self._pass if self._pass else "")
73 f5873ed0 Nikos Skalkotos
        self._opts = ['-U', user]
74 f5873ed0 Nikos Skalkotos
75 f5873ed0 Nikos Skalkotos
    def runas(self, username, password):
76 f5873ed0 Nikos Skalkotos
        """Run command as this user"""
77 f5873ed0 Nikos Skalkotos
        self._opts.append('--runas=%s%%%s' % (username, password))
78 f5873ed0 Nikos Skalkotos
        return self
79 f5873ed0 Nikos Skalkotos
80 f5873ed0 Nikos Skalkotos
    def system(self):
81 f5873ed0 Nikos Skalkotos
        """Use SYSTEM account"""
82 f5873ed0 Nikos Skalkotos
        self._opts.append('--system')
83 f5873ed0 Nikos Skalkotos
        return self
84 f5873ed0 Nikos Skalkotos
85 f5873ed0 Nikos Skalkotos
    def uninstall(self):
86 f5873ed0 Nikos Skalkotos
        """Uninstall winexe service after remote execution"""
87 f5873ed0 Nikos Skalkotos
        self._opts.append('--uninstall')
88 f5873ed0 Nikos Skalkotos
        return self
89 f5873ed0 Nikos Skalkotos
90 f5873ed0 Nikos Skalkotos
    def reinstall(self):
91 f5873ed0 Nikos Skalkotos
        """Reinstall winexe service before remote execution"""
92 f5873ed0 Nikos Skalkotos
        self._opts.append('--reinstall')
93 f5873ed0 Nikos Skalkotos
        return self
94 f5873ed0 Nikos Skalkotos
95 f5873ed0 Nikos Skalkotos
    def debug(self, level):
96 f5873ed0 Nikos Skalkotos
        """Set debug level"""
97 f5873ed0 Nikos Skalkotos
        self._opts.append('--debuglevel=%d' % level)
98 f5873ed0 Nikos Skalkotos
        return self
99 f5873ed0 Nikos Skalkotos
100 f5873ed0 Nikos Skalkotos
    def debug_stderr(self):
101 f5873ed0 Nikos Skalkotos
        """Send debug output to STDERR"""
102 f5873ed0 Nikos Skalkotos
        self._opts.append('--debug-stderr')
103 f5873ed0 Nikos Skalkotos
104 f5873ed0 Nikos Skalkotos
    def run(self, command, timeout=0):
105 f5873ed0 Nikos Skalkotos
        """Run a command on a remote windows system"""
106 f5873ed0 Nikos Skalkotos
107 f5873ed0 Nikos Skalkotos
        args = [self._prog] + self._opts + ["//%s" % self._host] + [command]
108 f5873ed0 Nikos Skalkotos
        run = subprocess.Popen(args, stdout=subprocess.PIPE,
109 f5873ed0 Nikos Skalkotos
                               stderr=subprocess.PIPE)
110 f5873ed0 Nikos Skalkotos
111 f5873ed0 Nikos Skalkotos
        def handler(signum, frame):
112 f5873ed0 Nikos Skalkotos
            run.terminate()
113 f5873ed0 Nikos Skalkotos
            time.sleep(1)
114 f5873ed0 Nikos Skalkotos
            run.poll()
115 f5873ed0 Nikos Skalkotos
            if run.returncode is None:
116 f5873ed0 Nikos Skalkotos
                run.kill()
117 f5873ed0 Nikos Skalkotos
            run.wait()
118 f5873ed0 Nikos Skalkotos
            raise WinexeTimeout("Command: `%s' timed-out" % " ".join(args))
119 f5873ed0 Nikos Skalkotos
120 f5873ed0 Nikos Skalkotos
        signal.signal(signal.SIGALRM, handler)
121 f5873ed0 Nikos Skalkotos
        signal.alarm(timeout)
122 f5873ed0 Nikos Skalkotos
        stdout, stderr = run.communicate()
123 f5873ed0 Nikos Skalkotos
        rc = run.poll()
124 f5873ed0 Nikos Skalkotos
        signal.alarm(0)
125 f5873ed0 Nikos Skalkotos
126 f5873ed0 Nikos Skalkotos
        return (stdout, stderr, rc)
127 f5873ed0 Nikos Skalkotos
128 f5873ed0 Nikos Skalkotos
# vim: set sta sts=4 shiftwidth=4 sw=4 et ai :