OpenSecurity/bin/opensecurityd.pyw
changeset 87 d5b04809faca
parent 86 a169498c5314
child 88 f4f813ef9b33
     1.1 --- a/OpenSecurity/bin/opensecurityd.pyw	Mon Mar 03 15:05:17 2014 +0100
     1.2 +++ b/OpenSecurity/bin/opensecurityd.pyw	Tue Mar 04 16:54:51 2014 +0100
     1.3 @@ -39,7 +39,7 @@
     1.4  import web
     1.5  from cygwin import Cygwin
     1.6  
     1.7 -from vmmanager import VMManager
     1.8 +import vmmanager
     1.9  
    1.10  # local
    1.11  from environment import Environment
    1.12 @@ -54,8 +54,6 @@
    1.13  
    1.14  """All the URLs we know mapping to class handler"""
    1.15  opensecurity_urls = (
    1.16 -    #'/device_change',                   'os_device_change',     # http://localhost:8080/device_change                           GET
    1.17 -    #'/sdvm_started',                    'os_sdvm_started',      # http://localhost:8080/sdvm_started                            GET
    1.18      '/browsing',                        'os_browsing',          # http://localhost:8080/browsing                                GET
    1.19      '/sdvms',                           'os_sdvms',             # http://localhost:8080/sdvms                                   GET, PUT
    1.20      '/sdvms/(.*)/application/(.*)',     'os_sdvm_application',  # http://localhost:8080/sdvms/[VMNAME]/application/[COMMAND]    GET
    1.21 @@ -65,10 +63,12 @@
    1.22      '/sdvms/(.*)',                      'os_sdvm',              # http://localhost:8080/sdvms/[VMNAME]                          GET, DELETE
    1.23      '/vms',                             'os_vms',               # http://localhost:8080/vms                                     GET
    1.24      '/vms/(.*)',                        'os_vm',                # http://localhost:8080/vms/[VMNAME]                            GET
    1.25 -    '/',                                'os_root',              # http://localhost:8080/                                        GET
    1.26 -    '/update_template',                 'os_update_template'    # http://localhost:8080/update_template                         GET
    1.27 +    '/update_template',                 'os_update_template',   # http://localhost:8080/update_template                         GET
    1.28 +    '/terminate',                       'os_terminate',         # http://localhost:8080/terminate                               GET
    1.29 +    '/',                                'os_root'               # http://localhost:8080/                                        GET
    1.30  )
    1.31  
    1.32 +
    1.33  # ------------------------------------------------------------
    1.34  # vars
    1.35  
    1.36 @@ -80,18 +80,6 @@
    1.37  # code
    1.38  
    1.39  
    1.40 -#class os_device_change:
    1.41 -#    """OpenSecurity '/device_change' handler"""
    1.42 -#    
    1.43 -#    def GET(self):
    1.44 -#        log_call(web.ctx.environ)
    1.45 -#        try:
    1.46 -#            new_ip = gvm_mgr.handleDeviceChange()
    1.47 -#            return new_ip
    1.48 -#        except:
    1.49 -#            raise web.internalerror()
    1.50 -
    1.51 -        
    1.52  class os_browsing:
    1.53      """OpenSecurity '/browsing' handler
    1.54      
    1.55 @@ -100,21 +88,30 @@
    1.56      
    1.57      def GET(self):
    1.58          log_call(web.ctx.environ)
    1.59 +        global gvm_mgr
    1.60          try:
    1.61 -            browsingVM = vmmanager().handleBrowsingRequest()
    1.62 +            browsingVM = gvm_mgr.handleBrowsingRequest()
    1.63              return browsingVM
    1.64          except:
    1.65              raise web.internalerror()
    1.66  
    1.67 -#class os_sdvm_started:
    1.68 -#    """OpenSecurity '/sdvm_started' handler"""
    1.69 -#    
    1.70 -#    def GET(self):
    1.71 -#        log_call(web.ctx.environ)
    1.72 -#        remote_ip = web.ctx.environ['REMOTE_ADDR']
    1.73 -#        gvm_mgr.putStartNotification(remote_ip)
    1.74 -#        return "os_sdvm_started"
    1.75 -        
    1.76 +       
    1.77 +class os_root:
    1.78 +    """OpenSecurity '/' handler
    1.79 +    
    1.80 +    - GET: give information about current installation.
    1.81 +    """
    1.82 +    
    1.83 +    def GET(self):
    1.84 +        log_call(web.ctx.environ)
    1.85 +        global gvm_mgr
    1.86 +        res = "'os_server': { "
    1.87 +        res += "'version': '" + __version__ + "', "
    1.88 +        res += "'machine_folder': '" + gvm_mgr.getDefaultMachineFolder() + "' "
    1.89 +        res += "}"
    1.90 +        return res
    1.91 +
    1.92 +
    1.93  class os_sdvm:
    1.94      """OpenSecurity '/sdvms/[VM]' handler
    1.95      
    1.96 @@ -124,11 +121,13 @@
    1.97      
    1.98      def GET(self, name):
    1.99          log_call(web.ctx.environ)
   1.100 -        return vmmanager().getVMInfo(name)
   1.101 +        global gvm_mgr
   1.102 +        return gvm_mgr.getVMInfo(name)
   1.103  
   1.104      def DELETE(self, name):
   1.105          log_call(web.ctx.environ)
   1.106 -        return vmmanager().removeVM(name)
   1.107 +        global gvm_mgr
   1.108 +        return gvm_mgr.removeVM(name)
   1.109              
   1.110  
   1.111  class os_sdvm_application:
   1.112 @@ -139,10 +138,11 @@
   1.113      
   1.114      def GET(self, name, command):
   1.115          log_call(web.ctx.environ)
   1.116 +        global gvm_mgr
   1.117          command = '/' + command
   1.118 -        result = Cygwin.sshExecuteX11(command, vmmanager().getHostOnlyIP(name), 'osecuser', Cygwin.cygPath(gvm_mgr.getMachineFolder()) + '/' + name + '/dvm_key'  )
   1.119 +        result = Cygwin.sshExecuteX11(command, gvm_mgr.getHostOnlyIP(name), 'osecuser', Cygwin.cygPath(gvm_mgr.getMachineFolder()) + '/' + name + '/dvm_key'  )
   1.120          self.poweroffVM(name)
   1.121 -        return vmmanager().removeVM(name)
   1.122 +        return gvm_mgr.removeVM(name)
   1.123      
   1.124  
   1.125  class os_sdvm_ip:
   1.126 @@ -153,7 +153,8 @@
   1.127      
   1.128      def GET(self, name):
   1.129          log_call(web.ctx.environ)
   1.130 -        return vmmanager().getHostOnlyIP(name)
   1.131 +        global gvm_mgr
   1.132 +        return gvm_mgr.getHostOnlyIP(name)
   1.133              
   1.134  
   1.135  class os_sdvm_start:
   1.136 @@ -164,7 +165,8 @@
   1.137      
   1.138      def GET(self, name):
   1.139          log_call(web.ctx.environ)
   1.140 -        return vmmanager().startVM(name)
   1.141 +        global gvm_mgr
   1.142 +        return gvm_mgr.startVM(name)
   1.143              
   1.144  
   1.145  class os_sdvm_stop:
   1.146 @@ -175,7 +177,8 @@
   1.147      
   1.148      def GET(self, name):
   1.149          log_call(web.ctx.environ)
   1.150 -        return vmmanager().stopVM(name)
   1.151 +        global gvm_mgr
   1.152 +        return gvm_mgr.stopVM(name)
   1.153              
   1.154  
   1.155  class os_sdvms:
   1.156 @@ -188,21 +191,62 @@
   1.157      def GET(self):
   1.158          """get the list of SDVMs"""
   1.159          log_call(web.ctx.environ)
   1.160 -        return vmmanager().listSDVM() 
   1.161 +        global gvm_mgr
   1.162 +        return gvm_mgr.listSDVM() 
   1.163              
   1.164      def POST(self):
   1.165          """create a new SDVM"""
   1.166          log_call(web.ctx.environ)
   1.167 +        global gvm_mgr
   1.168          
   1.169          # get a new vm-name
   1.170 -        name = vmmanager().generateSDVMName()
   1.171 +        name = gvm_mgr.generateSDVMName()
   1.172          try:
   1.173 -            vmmanager().createVM(name)
   1.174 +            gvm_mgr.createVM(name)
   1.175          except:
   1.176              raise web.internalerror()
   1.177              
   1.178          return name
   1.179              
   1.180 +
   1.181 +class os_terminate:
   1.182 +    """OpenSecurity '/terminate' handler
   1.183 +    
   1.184 +    - GET: terminate the opensecurityd.
   1.185 +
   1.186 +    YES: this here is bonkers. But the web.py http
   1.187 +    server runs infinite until a SystemExit exception
   1.188 +    or KeyboardInterrupt exception is raised.
   1.189 +
   1.190 +    see: site-packages/web/httpserver.py - line 157ff
   1.191 +    see: site-packages/web/wsgiserver/__init__.py - line 1682ff
   1.192 +
   1.193 +    So, we invoke a sys.exit(0) here to trigger server.stop().
   1.194 +
   1.195 +    TODO: need to find a better way doing this, and not via the
   1.196 +          REST api. Maybe hack web.py server code?
   1.197 +    """
   1.198 +    
   1.199 +    def GET(self):
   1.200 +        log_call(web.ctx.environ)
   1.201 +        global gvm_mgr
   1.202 +        sys.exit(0)
   1.203 +        return None
   1.204 +
   1.205 +
   1.206 +class os_update_template:
   1.207 +    """OpenSecurity '/update_template' handler
   1.208 +    
   1.209 +    - GET: update template vm
   1.210 +    """
   1.211 +    
   1.212 +    def GET(self):
   1.213 +        #return gvm_mgr.guestExecute('SecurityDVM', 'sudo apt-get -y update')
   1.214 +        global gvm_mgr
   1.215 +        log_call(web.ctx.environ)
   1.216 +        return gvm_mgr.updateTemplate()
   1.217 +
   1.218 +
   1.219  class os_vm:
   1.220      """OpenSecurity '/vms/[VM]' handler
   1.221      
   1.222 @@ -211,7 +255,8 @@
   1.223      
   1.224      def GET(self, name):
   1.225          log_call(web.ctx.environ)
   1.226 -        return vmmanager().getVMInfo(name)
   1.227 +        global gvm_mgr
   1.228 +        return gvm_mgr.getVMInfo(name)
   1.229              
   1.230  
   1.231  class os_vms:
   1.232 @@ -222,35 +267,10 @@
   1.233      
   1.234      def GET(self):
   1.235          log_call(web.ctx.environ)
   1.236 -        return vmmanager().listVM() 
   1.237 +        global gvm_mgr
   1.238 +        return gvm_mgr.listVM() 
   1.239              
   1.240  
   1.241 -class os_root:
   1.242 -    """OpenSecurity '/' handler
   1.243 -    
   1.244 -    - GET: give information about current installation.
   1.245 -    """
   1.246 -    
   1.247 -    def GET(self):
   1.248 -        log_call(web.ctx.environ)
   1.249 -        res = "'os_server': { "
   1.250 -        res += "'version': '" + __version__ + "', "
   1.251 -        res += "'machine_folder': '" + vmmanager().getDefaultMachineFolder() + "' "
   1.252 -        res += "}"
   1.253 -        return res
   1.254 -
   1.255 -class os_update_template:
   1.256 -    """OpenSecurity '/update_template' handler
   1.257 -    
   1.258 -    - GET: update template vm
   1.259 -    """
   1.260 -    
   1.261 -    def GET(self):
   1.262 -        #return gvm_mgr.guestExecute('SecurityDVM', 'sudo apt-get -y update')
   1.263 -        log_call(web.ctx.environ)
   1.264 -        return vmmanager().updateTemplate()
   1.265 -
   1.266 -
   1.267  def log_call(web_environ):
   1.268      """log the incoming call to the REST api"""
   1.269      try:
   1.270 @@ -262,16 +282,17 @@
   1.271  
   1.272  def main():
   1.273      """main startup for the opensecuirityd"""
   1.274 -    server = web.application(opensecurity_urls, globals())
   1.275 +
   1.276 +    logger.debug('Starting OpenSecurity REST server')
   1.277 +
   1.278 +    # ensure a VMManger is yet loaded
   1.279 +    global gvm_mgr
   1.280 +    gvm_mgr = vmmanager.VMManager.getInstance()
   1.281 +    
   1.282 +    server = web.application(opensecurity_urls, globals(), autoreload = False)
   1.283      server.run()
   1.284 -
   1.285 -
   1.286 -def vmmanager():
   1.287 -
   1.288 -    """helper method to make lazy init of VMManager"""
   1.289 -    if gvm_mgr is None:
   1.290 -        gvm_mgr = VMManager.getInstance()
   1.291 -    return gvm_mgr    
   1.292 +    
   1.293 +    logger.debug('Stopped OpenSecurity REST server')
   1.294  
   1.295  
   1.296  # start