OpenSecurity/bin/cygwin.py
author dyle@opensecurity.d03.arc.local
Wed, 29 Jan 2014 09:23:52 +0000
changeset 53 01839f13cef3
parent 52 1238895dc6b6
child 60 eeb778585a4d
permissions -rwxr-xr-x
SSH cert and ISO creation with shadowrun.exe
     1 #!/bin/env python
     2 # -*- coding: utf-8 -*-
     3 
     4 # ------------------------------------------------------------
     5 # cygwin command
     6 # 
     7 # executes a cygwin command inside the opensecurity project
     8 #
     9 # Autor: Oliver Maurhart, <oliver.maurhart@ait.ac.at>
    10 #
    11 # Copyright (C) 2013 AIT Austrian Institute of Technology
    12 # AIT Austrian Institute of Technology GmbH
    13 # Donau-City-Strasse 1 | 1220 Vienna | Austria
    14 # http://www.ait.ac.at
    15 #
    16 # This program is free software; you can redistribute it and/or
    17 # modify it under the terms of the GNU General Public License
    18 # as published by the Free Software Foundation version 2.
    19 # 
    20 # This program is distributed in the hope that it will be useful,
    21 # but WITHOUT ANY WARRANTY; without even the implied warranty of
    22 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    23 # GNU General Public License for more details.
    24 # 
    25 # You should have received a copy of the GNU General Public License
    26 # along with this program; if not, write to the Free Software
    27 # Foundation, Inc., 51 Franklin Street, Fifth Floor, 
    28 # Boston, MA  02110-1301, USA.
    29 # ------------------------------------------------------------
    30 
    31 
    32 # ------------------------------------------------------------
    33 # imports
    34 
    35 import os
    36 import subprocess
    37 import sys
    38 
    39 # local
    40 from environment import Environment
    41 
    42 
    43 # ------------------------------------------------------------
    44 # code
    45 
    46 
    47 class Cygwin(object):
    48 
    49     """Some nifty methods working with Cygwin"""
    50     
    51     def __call__(self, command, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE):
    52         """make an instance of this object act as a function"""
    53         return self.execute(command, stdin, stdout, stderr)
    54 
    55         
    56     @staticmethod
    57     def root():
    58         """get the path to our local cygwin installment"""
    59         home_drive = os.path.expandvars("%HOMEDRIVE%") + os.sep
    60         path_hint = [ 
    61             os.path.abspath(os.path.join(Environment('OpenSecurity').prefix_path, '..', 'cygwin')), 
    62             os.path.abspath(os.path.join(Environment('OpenSecurity').prefix_path, '..', 'cygwin64')), 
    63             os.path.abspath(os.path.join(home_drive, 'cygwin')),
    64             os.path.abspath(os.path.join(home_drive, 'cygwin64'))
    65         ]
    66         path_valid = [ p for p in path_hint if os.path.exists(p) ]
    67         return path_valid[0]
    68 
    69 
    70     def execute(self, command, stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, window = False):
    71         """execute a cygwin shell command
    72         
    73         command is list of arguments like ['/bin/ls', '-al', '-h']
    74         
    75         a Popen object is returned"""
    76         command_path = os.sep.join([Cygwin.root()] + command[0].split('/')[1:])
    77         command = [command_path] + command[1:]
    78 
    79         if not window:
    80             # hide any window
    81             shadowrun_path = os.path.join(Cygwin.root(), 'bin', 'shadowrun.exe')
    82             if os.access(shadowrun_path, os.X_OK):
    83                 command = [shadowrun_path] + command
    84             else:
    85                 print("EPIC FAIL!")
    86 
    87         try:
    88             print('cygwin: ' + ' '.join(command))
    89             return subprocess.Popen(command, shell = False, stdin = stdin, stdout = stdout, stderr = stderr)
    90         except:
    91             sys.stderr.write('Failed to execute cygwin command.\n\tcommand="' + ' '.join(command) + '"\n')
    92         
    93         
    94     @staticmethod
    95     def is_X11_running():
    96         """check if we can connect to a X11 running instance"""
    97         p = Cygwin()(['/bin/bash', '-c', 'DISPLAY=:0 /usr/bin/xset -q'])
    98         stdout, stderr = p.communicate()
    99         return p.returncode == 0
   100         
   101         
   102     @staticmethod
   103     def start_X11():
   104         """start X11 in the background (if not already running) on DISPLAY=:0"""
   105         
   106         # do not start if already running
   107         if Cygwin.is_X11_running():
   108             return
   109             
   110         # launch X11 (forget output and return immediately)
   111         p = Cygwin()(['/bin/bash', '--login', '-i', '-c', ' X :0 -multiwindow'], stdin = None, stdout = None, stderr = None)
   112         
   113     
   114 # start
   115 if __name__ == "__main__":
   116 
   117     print(Cygwin.root())
   118     sys.exit(1)
   119 
   120     # execute what is given on the command line
   121     c = Cygwin()
   122     p = c(sys.argv[1:])
   123     
   124     # wait until the process finished and grab the output
   125     stdout, stderr = p.communicate()
   126     print('=== call result on stdout: ===\n' + stdout)
   127     print('=== call result on stderr: ===\n' + stderr)
   128