Statistics
| Branch: | Tag: | Revision:

root / image_creator / winexe.py @ 63af9c37

History | View | Annotate | Download (4 kB)

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