OpenSecurity/bin/opensecurity_client_restful_server.py added join to wait for netmount /umount thread finish
authorBarthaM@N3SIM1218.D03.arc.local
Mon, 19 May 2014 17:19:47 +0100
changeset 163e7fbdaabd0bc
parent 162 c1c9ccd9d7c8
child 164 b6b9dc0ed2ac
OpenSecurity/bin/opensecurity_client_restful_server.py added join to wait for netmount /umount thread finish
OpenSecurity/bin/opensecurity_client_restful_server.py
OpenSecurity/bin/opensecurity_tray.pyw
OpenSecurity/bin/opensecurityd.pyw
     1.1 --- a/OpenSecurity/bin/opensecurity_client_restful_server.py	Mon May 19 16:43:11 2014 +0100
     1.2 +++ b/OpenSecurity/bin/opensecurity_client_restful_server.py	Mon May 19 17:19:47 2014 +0100
     1.3 @@ -33,25 +33,19 @@
     1.4  # imports
     1.5  
     1.6  import getpass
     1.7 -import glob
     1.8  import json
     1.9  import os
    1.10  import os.path
    1.11 -import pickle
    1.12  import platform
    1.13  import socket
    1.14  import subprocess
    1.15  import sys
    1.16 -import threading
    1.17 -import time
    1.18  import urllib
    1.19  import urllib2
    1.20  import web
    1.21  import threading
    1.22  import time
    1.23  import string
    1.24 -import win32api
    1.25 -import win32con
    1.26  
    1.27  from opensecurity_util import logger, setupLogger, OpenSecurityException
    1.28  if sys.platform == 'win32' or sys.platform == 'cygwin':
    1.29 @@ -59,7 +53,6 @@
    1.30  
    1.31  # local
    1.32  import __init__ as opensecurity
    1.33 -from environment import Environment
    1.34  
    1.35  
    1.36  # ------------------------------------------------------------
    1.37 @@ -83,13 +76,6 @@
    1.38  # vars
    1.39  
    1.40  
    1.41 -"""lock for read/write log file"""
    1.42 -log_file_lock = threading.Lock()
    1.43 -
    1.44 -"""timer for the log file bouncer"""
    1.45 -log_file_bouncer = None
    1.46 -
    1.47 -
    1.48  """The REST server object"""
    1.49  server = None
    1.50  
    1.51 @@ -184,13 +170,19 @@
    1.52          args['user'] = getpass.getuser()
    1.53          args['system'] = platform.node() + " " + platform.system() + " " + platform.release()
    1.54  
    1.55 -        # add these to new data to log
    1.56 -        global log_file_lock
    1.57 -        log_file_name = os.path.join(Environment('OpenSecurity').log_path, 'vm_new.log')
    1.58 -        log_file_lock.acquire()
    1.59 -        pickle.dump(args,  open(log_file_name, 'ab'))
    1.60 -        log_file_lock.release()
    1.61 +        # bounce log data
    1.62 +        url_addr = 'http://GIMME-SERVER-TO-LOG-TO/log'
    1.63  
    1.64 +        # by provided a 'data' we turn this into a POST statement
    1.65 +        d = urllib.urlencode(args)
    1.66 +        req = urllib2.Request(url_addr, d)
    1.67 +        try:
    1.68 +            res = urllib2.urlopen(req)
    1.69 +        except:
    1.70 +            print('failed to contact: ' + url_addr)
    1.71 +            print('log data: ' + d)
    1.72 +            return "Failed"
    1.73 +         
    1.74          return "Ok"
    1.75  
    1.76  
    1.77 @@ -309,6 +301,7 @@
    1.78  
    1.79          driveHandler = MountNetworkDriveHandler(args['drive_letter'], args['net_resource'])
    1.80          driveHandler.start()
    1.81 +        driveHandler.join(None)
    1.82          return 'Ok'
    1.83  
    1.84           
    1.85 @@ -357,6 +350,7 @@
    1.86          
    1.87          driveHandler = UmountNetworkDriveHandler(args['drive_letter'])
    1.88          driveHandler.start()
    1.89 +        driveHandler.join(None)
    1.90          return 'Ok'
    1.91      
    1.92  
    1.93 @@ -448,8 +442,11 @@
    1.94              print 'error in password parsing'
    1.95              return
    1.96          
    1.97 +        # TODO: it would be WAY easier and secure if we just 
    1.98 +        #       add the result json to a HTTP-POST here.
    1.99 +        url_addr = 'http://' + self._remote_ip + ':58080' + self._resource
   1.100 +
   1.101          # by provided a 'data' we turn this into a POST statement
   1.102 -        url_addr = 'http://' + self._remote_ip + ':58080' + self._resource
   1.103          req = urllib2.Request(url_addr, urllib.urlencode(j))
   1.104          try:
   1.105              res = urllib2.urlopen(req)
   1.106 @@ -493,95 +490,12 @@
   1.107      return True
   1.108  
   1.109  
   1.110 -def _bounce_vm_logs():
   1.111 -
   1.112 -    """grab all logs from the VMs and push them to the log servers"""
   1.113 -
   1.114 -    global log_file_lock
   1.115 -
   1.116 -    # pick the highest current number
   1.117 -    cur = 0
   1.118 -    for f in glob.iglob(os.path.join(Environment('OpenSecurity').log_path, 'vm_cur.log.*')):
   1.119 -        try:
   1.120 -            n = f.split('.')[-1:][0]
   1.121 -            if cur < int(n):
   1.122 -                cur = int(n)
   1.123 -        except:
   1.124 -            pass
   1.125 -
   1.126 -    cur = cur + 1
   1.127 -
   1.128 -    # first add new vm logs to our existing one: rename the log file
   1.129 -    log_file_name_new = os.path.join(Environment('OpenSecurity').log_path, 'vm_new.log')
   1.130 -    log_file_name_cur = os.path.join(Environment('OpenSecurity').log_path, 'vm_cur.log.' + str(cur))
   1.131 -    log_file_lock.acquire()
   1.132 -    try:
   1.133 -        os.rename(log_file_name_new, log_file_name_cur)
   1.134 -        print('new log file: ' + log_file_name_cur)
   1.135 -    except:
   1.136 -        pass
   1.137 -    log_file_lock.release()
   1.138 -
   1.139 -    # now we have a list of next log files to dump
   1.140 -    log_files = glob.glob(os.path.join(Environment('OpenSecurity').log_path, 'vm_cur.log.*'))
   1.141 -    log_files.sort()
   1.142 -    for log_file in log_files:
   1.143 -
   1.144 -        try:
   1.145 -            f = open(log_file, 'rb')
   1.146 -            while True:
   1.147 -                l = pickle.load(f)
   1.148 -                _push_log(l)
   1.149 -
   1.150 -        except EOFError:
   1.151 -
   1.152 -            try:
   1.153 -                os.remove(log_file)
   1.154 -            except:
   1.155 -                logger.warning('tried to delete log file (pushed to EOF) "' + log_file + '" but failed')
   1.156 -
   1.157 -        except:
   1.158 -            logger.warning('encountered error while pushing log file "' + log_file + '"')
   1.159 -            break
   1.160 -
   1.161 -    # start bouncer again ...
   1.162 -    global log_file_bouncer
   1.163 -    log_file_bouncer = threading.Timer(5.0, _bounce_vm_logs)
   1.164 -    log_file_bouncer.start()
   1.165 -
   1.166 -
   1.167 -def _push_log(log):
   1.168 -    """POST a single log to log server
   1.169 -
   1.170 -    @param  log     the log POST param
   1.171 -    """
   1.172 -
   1.173 -    try:
   1.174 -        key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 'SOFTWARE\OpenSecurity')
   1.175 -        log_server_url = str(win32api.RegQueryValueEx(key, 'LogServerURL')[0])
   1.176 -        win32api.RegCloseKey(key)
   1.177 -    except:
   1.178 -        logger.critical('Cannot open Registry HKEY_LOCAL_MACHINE\SOFTWARE\OpenSecurity and get LogServerURL value')
   1.179 -        raise
   1.180 -
   1.181 -    # by provided a 'data' we turn this into a POST statement
   1.182 -    d = urllib.urlencode(log)
   1.183 -    req = urllib2.Request(log_server_url, d)
   1.184 -    urllib2.urlopen(req)
   1.185 -    logger.debug('pushed log to server: ' + str(log_server_url))
   1.186 -
   1.187 -
   1.188  def _serve(port):
   1.189  
   1.190      """Start the REST server"""
   1.191  
   1.192      global server
   1.193  
   1.194 -    # start the VM-log bouncer timer
   1.195 -    global log_file_bouncer
   1.196 -    log_file_bouncer = threading.Timer(5.0, _bounce_vm_logs)
   1.197 -    log_file_bouncer.start()
   1.198 -
   1.199      # trick the web.py server 
   1.200      sys.argv = [__file__, str(port)]
   1.201      server = web.application(opensecurity_urls, globals())
   1.202 @@ -609,11 +523,8 @@
   1.203      if server is None:
   1.204          return
   1.205  
   1.206 -    global log_file_bouncer
   1.207 -    if log_file_bouncer is not None:
   1.208 -        log_file_bouncer.cancel()
   1.209 +    server.stop()
   1.210  
   1.211 -    server.stop()
   1.212  
   1.213  # start
   1.214  if __name__ == "__main__":
     2.1 --- a/OpenSecurity/bin/opensecurity_tray.pyw	Mon May 19 16:43:11 2014 +0100
     2.2 +++ b/OpenSecurity/bin/opensecurity_tray.pyw	Mon May 19 17:19:47 2014 +0100
     2.3 @@ -1,4 +1,3 @@
     2.4 -#!/bin/env python
     2.5  # -*- coding: utf-8 -*-
     2.6  
     2.7  # ------------------------------------------------------------
     3.1 --- a/OpenSecurity/bin/opensecurityd.pyw	Mon May 19 16:43:11 2014 +0100
     3.2 +++ b/OpenSecurity/bin/opensecurityd.pyw	Mon May 19 17:19:47 2014 +0100
     3.3 @@ -123,8 +123,8 @@
     3.4          trace_file = open(trace_file_name, 'w+')
     3.5  
     3.6          machine_folder = Cygwin.cygPath(gvm_mgr.getMachineFolder()) 
     3.7 -        download_initial_image_script = Cygwin.cygPath(os.path.abspath(os.path.join(os.path.split(__file__)[0], 'download_initial_image.sh')))
     3.8 -        Cygwin.bashExecute(download_initial_image_script + ' \'' + machine_folder + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
     3.9 +        download_initial_image_script = '/OpenSecurity/bin/download_initial_image.sh \'' + machine_folder + '\''
    3.10 +        Cygwin.bashExecute(download_initial_image_script, wait_return = False, stdout = trace_file, stderr = trace_file) 
    3.11  
    3.12          res = '{ "fetch_log": "' + trace_file_name.replace('\\', '\\\\') + '" }'
    3.13          return res
    3.14 @@ -144,8 +144,8 @@
    3.15          trace_file = open(trace_file_name, 'w+')
    3.16  
    3.17          vm_image = Cygwin.cygPath(gvm_mgr.getMachineFolder()) + '/OsecVM.ova'
    3.18 -        initial_import_script = Cygwin.cygPath(os.path.abspath(os.path.join(os.path.split(__file__)[0], 'initial_vm.sh')))
    3.19 -        Cygwin.bashExecute(initial_import_script + ' \'' + vm_image + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
    3.20 +        initial_import_script = '/OpenSecurity/bin/initial_vm.sh \'' + vm_image + '\''
    3.21 +        Cygwin.bashExecute(initial_import_script, wait_return = False, stdout = trace_file, stderr = trace_file) 
    3.22  
    3.23          res = '{ "init_log": "' + trace_file_name.replace('\\', '\\\\') + '" }'
    3.24          return res