OpenSecurity/bin/opensecurityd.pyw
author BarthaM@N3SIM1218.D03.arc.local
Thu, 17 Jul 2014 10:20:10 +0100
changeset 212 59ebaa44c12c
parent 204 0c3136908f4f
child 213 2e0b94e12bfc
permissions -rwxr-xr-x
Modified update_template to cope with unattached .vmdk
Added start method to vmmanager
Modified vmmanager to not start automatically over getInstance() invocation
Modified cygwin to corectly get the root folder (OpenSecurity//bin)
mb@63
     1
#!/bin/env python
mb@63
     2
# -*- coding: utf-8 -*-
mb@63
     3
mb@63
     4
# ------------------------------------------------------------
mb@63
     5
# opensecurityd
BarthaM@212
     6
#   
mb@63
     7
# the opensecurityd as RESTful server
mb@63
     8
#
mb@63
     9
# Autor: Oliver Maurhart, <oliver.maurhart@ait.ac.at>
BarthaM@212
    10
#        Mihai Bartha, <mihai.bartha@ait.ac.at>       
mb@63
    11
#
mb@63
    12
# Copyright (C) 2013 AIT Austrian Institute of Technology
mb@63
    13
# AIT Austrian Institute of Technology GmbH
mb@63
    14
# Donau-City-Strasse 1 | 1220 Vienna | Austria
mb@63
    15
# http://www.ait.ac.at
mb@63
    16
#
mb@63
    17
# This program is free software; you can redistribute it and/or
mb@63
    18
# modify it under the terms of the GNU General Public License
mb@63
    19
# as published by the Free Software Foundation version 2.
mb@63
    20
# 
mb@63
    21
# This program is distributed in the hope that it will be useful,
mb@63
    22
# but WITHOUT ANY WARRANTY; without even the implied warranty of
mb@63
    23
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
mb@63
    24
# GNU General Public License for more details.
mb@63
    25
# 
mb@63
    26
# You should have received a copy of the GNU General Public License
mb@63
    27
# along with this program; if not, write to the Free Software
mb@63
    28
# Foundation, Inc., 51 Franklin Street, Fifth Floor, 
mb@63
    29
# Boston, MA  02110-1301, USA.
mb@63
    30
# ------------------------------------------------------------
mb@63
    31
mb@63
    32
mb@63
    33
# ------------------------------------------------------------
mb@63
    34
# imports
mb@63
    35
oliver@130
    36
import json
mb@63
    37
import os
mb@63
    38
import os.path
mb@63
    39
import subprocess
mb@63
    40
import sys
oliver@91
    41
import tempfile
mb@63
    42
import web
mb@63
    43
oliver@87
    44
import vmmanager
mb@63
    45
mb@63
    46
# local
oliver@144
    47
import __init__ as opensecurity
oliver@91
    48
from cygwin import Cygwin
oliver@147
    49
from environment import Environment
oliver@193
    50
from opensecurity_util import logger, showTrayMessage
oliver@193
    51
mb@63
    52
mb@63
    53
mb@63
    54
# ------------------------------------------------------------
mb@63
    55
# const
mb@63
    56
mb@63
    57
"""All the URLs we know mapping to class handler"""
mb@63
    58
opensecurity_urls = (
mb@63
    59
    '/browsing',                        'os_browsing',          # http://localhost:8080/browsing                                GET
oliver@91
    60
    '/fetch_initial_image',             'os_fetch_image',       # http://localhost:8080/fetch_initial_image                     GET
oliver@91
    61
    '/init',                            'os_init',              # http://localhost:8080/init                                    GET
oliver@107
    62
    '/initial_image',                   'os_initial_image',     # http://localhost:8080/initial_image                           GET
mb@63
    63
    '/sdvms',                           'os_sdvms',             # http://localhost:8080/sdvms                                   GET, PUT
mb@63
    64
    '/sdvms/(.*)/application/(.*)',     'os_sdvm_application',  # http://localhost:8080/sdvms/[VMNAME]/application/[COMMAND]    GET
mb@63
    65
    '/sdvms/(.*)/ip',                   'os_sdvm_ip',           # http://localhost:8080/sdvms/[VMNAME]/ip                       GET
mb@63
    66
    '/sdvms/(.*)/start',                'os_sdvm_start',        # http://localhost:8080/sdvms/[VMNAME]/start                    GET
mb@63
    67
    '/sdvms/(.*)/stop',                 'os_sdvm_stop',         # http://localhost:8080/sdvms/[VMNAME]/stop                     GET
mb@63
    68
    '/sdvms/(.*)',                      'os_sdvm',              # http://localhost:8080/sdvms/[VMNAME]                          GET, DELETE
oliver@93
    69
    '/setup',                           'os_setup',             # http://localhost:8080/setup                                   GET
mb@63
    70
    '/vms',                             'os_vms',               # http://localhost:8080/vms                                     GET
mb@63
    71
    '/vms/(.*)',                        'os_vm',                # http://localhost:8080/vms/[VMNAME]                            GET
oliver@87
    72
    '/update_template',                 'os_update_template',   # http://localhost:8080/update_template                         GET
oliver@87
    73
    '/terminate',                       'os_terminate',         # http://localhost:8080/terminate                               GET
BarthaM@212
    74
    '/initialize',                      'os_initialize',        # http://localhost:8080/initialize                               GET
oliver@87
    75
    '/',                                'os_root'               # http://localhost:8080/                                        GET
mb@63
    76
)
mb@63
    77
oliver@87
    78
mb@66
    79
# ------------------------------------------------------------
mb@63
    80
# vars
mb@63
    81
mb@63
    82
# Global VMManager instance
oliver@86
    83
gvm_mgr = None
oliver@86
    84
oliver@138
    85
# server instance
oliver@138
    86
server = None
oliver@138
    87
oliver@138
    88
mb@63
    89
# ------------------------------------------------------------
mb@63
    90
# code
mb@63
    91
mb@63
    92
mb@63
    93
class os_browsing:
mb@63
    94
    """OpenSecurity '/browsing' handler
mb@63
    95
    
mb@63
    96
    - GET: Start and prepare a new SecurityVM for Internet Browsing. Return the name of the VM.
mb@63
    97
    """
mb@63
    98
    
mb@63
    99
    def GET(self):
oliver@74
   100
        log_call(web.ctx.environ)
oliver@87
   101
        global gvm_mgr
mb@63
   102
        try:
mb@90
   103
            result = gvm_mgr.handleBrowsingRequest()
mb@90
   104
            return result
mb@63
   105
        except:
mb@63
   106
            raise web.internalerror()
mb@63
   107
oliver@87
   108
       
oliver@91
   109
class os_fetch_image:
oliver@91
   110
    """OpenSecurity '/fetch_initial_image' handler
oliver@91
   111
    
oliver@91
   112
    - GET: fetch the initial image from the X-Net Servers
oliver@91
   113
            The initial image is stored in the
oliver@91
   114
            Virtual Box default machine path.
oliver@91
   115
            The result to this call is a temprary file
oliver@91
   116
            which shows the progress (or error state)
oliver@91
   117
            of this call.
oliver@91
   118
    """
oliver@91
   119
    
oliver@91
   120
    def GET(self):
oliver@91
   121
        
oliver@91
   122
        log_call(web.ctx.environ)
oliver@91
   123
        global gvm_mgr
oliver@91
   124
oliver@147
   125
        trace_file_name = os.path.join(Environment('OpenSecurity').log_path, 'OpenSecurity_fetch_image.log')
oliver@91
   126
        trace_file = open(trace_file_name, 'w+')
oliver@91
   127
oliver@91
   128
        machine_folder = Cygwin.cygPath(gvm_mgr.getMachineFolder()) 
oliver@164
   129
        download_initial_image_script = Cygwin.cygPath(os.path.abspath(os.path.join(os.path.split(__file__)[0], 'download_initial_image.sh')))
BarthaM@170
   130
        Cygwin.bashExecute('\\"' + download_initial_image_script + '\\" \'' + machine_folder + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
oliver@91
   131
oliver@116
   132
        res = '{ "fetch_log": "' + trace_file_name.replace('\\', '\\\\') + '" }'
oliver@115
   133
        return res
oliver@91
   134
oliver@147
   135
oliver@91
   136
class os_init:
oliver@91
   137
    """OpenSecurity '/init' handler
oliver@91
   138
    
oliver@91
   139
    - GET: Do initial import of OsecVM.ova
oliver@91
   140
    """
oliver@91
   141
    
oliver@91
   142
    def GET(self):
oliver@91
   143
        log_call(web.ctx.environ)
oliver@91
   144
        global gvm_mgr
oliver@91
   145
BarthaM@170
   146
        gvm_mgr.stop()
BarthaM@170
   147
        gvm_mgr.cleanup()
BarthaM@170
   148
        
BarthaM@170
   149
        if gvm_mgr.vmRootName in gvm_mgr.listVM():
BarthaM@170
   150
            gvm_mgr.poweroffVM(gvm_mgr.vmRootName)
BarthaM@171
   151
            tmplateUUID = gvm_mgr.getTemplateUUID()
BarthaM@171
   152
            if tmplateUUID != None:
BarthaM@171
   153
                logger.debug('found parent uuid ' + tmplateUUID)
BarthaM@171
   154
                gvm_mgr.storageDetach(gvm_mgr.vmRootName)
BarthaM@171
   155
                gvm_mgr.removeSnapshots(tmplateUUID)
BarthaM@171
   156
                gvm_mgr.removeImage(tmplateUUID)
BarthaM@171
   157
            else:
BarthaM@171
   158
                logger.debug('parent uuid not found')
BarthaM@171
   159
            gvm_mgr.removeVM(gvm_mgr.vmRootName)
BarthaM@170
   160
        
oliver@147
   161
        trace_file_name = os.path.join(Environment('OpenSecurity').log_path, 'OpenSecurity_initial_import.log')
oliver@91
   162
        trace_file = open(trace_file_name, 'w+')
oliver@91
   163
oliver@91
   164
        vm_image = Cygwin.cygPath(gvm_mgr.getMachineFolder()) + '/OsecVM.ova'
oliver@164
   165
        initial_import_script = Cygwin.cygPath(os.path.abspath(os.path.join(os.path.split(__file__)[0], 'initial_vm.sh')))
BarthaM@170
   166
        Cygwin.bashExecute('\\"' + initial_import_script + '\\" \'' + vm_image + '\'', wait_return = False, stdout = trace_file, stderr = trace_file) 
oliver@91
   167
oliver@116
   168
        res = '{ "init_log": "' + trace_file_name.replace('\\', '\\\\') + '" }'
oliver@115
   169
        return res
oliver@91
   170
oliver@91
   171
oliver@107
   172
class os_initial_image:
oliver@107
   173
    """OpenSecurity '/initial_image' handler
oliver@107
   174
    
oliver@107
   175
    - GET: Return what we have as initial image.
oliver@107
   176
    """
oliver@107
   177
    
oliver@107
   178
    def GET(self):
oliver@107
   179
        log_call(web.ctx.environ)
oliver@107
   180
        global gvm_mgr
oliver@107
   181
        t = os.path.join(gvm_mgr.systemProperties['Default machine folder'], 'OsecVM.ova')
oliver@107
   182
        res = ''
oliver@107
   183
        if os.path.isfile(t):
oliver@107
   184
            res = '{"initial_template": { '
oliver@107
   185
            res += '"name": "OsecVM.ova", '
oliver@107
   186
            res += '"path": "' + t.replace('\\', '\\\\') + '", '
oliver@107
   187
            res += '"size": ' + str(os.path.getsize(t)) + ', ' 
oliver@107
   188
            res += '"date": ' + str(os.path.getmtime(t)) + ''
oliver@112
   189
            res += '}}'
oliver@107
   190
        return res
oliver@107
   191
oliver@107
   192
oliver@87
   193
class os_root:
oliver@87
   194
    """OpenSecurity '/' handler
oliver@87
   195
    
oliver@87
   196
    - GET: give information about current installation.
oliver@87
   197
    """
oliver@87
   198
    
oliver@87
   199
    def GET(self):
oliver@87
   200
        log_call(web.ctx.environ)
oliver@87
   201
        global gvm_mgr
oliver@130
   202
oliver@130
   203
        # create a json string and pretty print it
oliver@107
   204
        res = '{"os_server": { '
oliver@144
   205
        res += '"version": "' + opensecurity.__version__ + '" '
oliver@130
   206
        res += ', "virtual box systemproperties": ' + str(gvm_mgr.systemProperties).replace("'", '"') 
oliver@130
   207
        res += ', "current temporary folder": "' + tempfile.gettempdir().replace('\\', '\\\\') + '"'
oliver@147
   208
        res += ', "current log folder": "' + Environment('OpenSecurity').log_path.replace('\\', '\\\\') + '"'
oliver@130
   209
oliver@130
   210
        try:
oliver@130
   211
            res += ', "whoami": "' + Cygwin.bashExecute('whoami')[1].strip() + '"'
oliver@130
   212
        except:
oliver@130
   213
            res += ', "whoami": "FAILED"'
oliver@130
   214
oliver@130
   215
        try:
oliver@130
   216
            res += ', "mount": ' + str(Cygwin.bashExecute('mount')[1].split('\n')[:-1]).replace("'", '"')
oliver@130
   217
        except:
oliver@130
   218
            res += ', "mount": "FAILED"'
oliver@130
   219
oliver@130
   220
        try:
oliver@130
   221
            res += ', "cygpath --windows ~": "' + Cygwin.bashExecute('cygpath --windows ~')[1].strip().replace('\\', '\\\\') + '"'
oliver@130
   222
        except:
oliver@130
   223
            res += ', "cygpath --windows ~": "FAILED"'
oliver@130
   224
oliver@131
   225
oliver@131
   226
        res += ', "status message": "' + gvm_mgr.status_message.replace('"', "'") + '"'
oliver@131
   227
oliver@107
   228
        res += '}}'
oliver@130
   229
oliver@130
   230
        # loading it into json and print it again ensures
oliver@130
   231
        # we really do have a valid RFC conform json string
oliver@130
   232
        # created (as long as the python json module is RFC conform)
oliver@130
   233
        return json.dumps(json.loads(res), indent = 4)
oliver@87
   234
oliver@87
   235
oliver@204
   236
mb@63
   237
class os_sdvm:
mb@63
   238
    """OpenSecurity '/sdvms/[VM]' handler
mb@63
   239
    
mb@63
   240
    - GET: Information about a specific SecurityVM
mb@63
   241
    - DELETE: Remove a specific
mb@63
   242
    """
mb@63
   243
    
mb@63
   244
    def GET(self, name):
oliver@74
   245
        log_call(web.ctx.environ)
oliver@87
   246
        global gvm_mgr
oliver@203
   247
        return json.dumps(gvm_mgr.getVMInfo(name), indent = 4)
mb@63
   248
mb@63
   249
    def DELETE(self, name):
oliver@74
   250
        log_call(web.ctx.environ)
oliver@87
   251
        global gvm_mgr
oliver@87
   252
        return gvm_mgr.removeVM(name)
mb@63
   253
            
mb@63
   254
mb@63
   255
class os_sdvm_application:
mb@63
   256
    """OpenSecurity '/sdvms/[VM]/application/[CMD]' handler
mb@63
   257
    
mb@63
   258
    - GET: start application with given command in the VM.
mb@63
   259
    """
mb@63
   260
    
mb@63
   261
    def GET(self, name, command):
oliver@74
   262
        log_call(web.ctx.environ)
oliver@87
   263
        global gvm_mgr
mb@63
   264
        command = '/' + command
oliver@193
   265
        showTrayMessage('Launching application in isolated VM...', 7000)
oliver@87
   266
        result = Cygwin.sshExecuteX11(command, gvm_mgr.getHostOnlyIP(name), 'osecuser', Cygwin.cygPath(gvm_mgr.getMachineFolder()) + '/' + name + '/dvm_key'  )
oliver@165
   267
        return 'Command ' + str(command) + ' started on VM "' + name + '" with IP ' + gvm_mgr.getHostOnlyIP(name)
mb@63
   268
    
mb@63
   269
mb@63
   270
class os_sdvm_ip:
mb@63
   271
    """OpenSecurity '/sdvms/[VM]/ip' handler
mb@63
   272
    
mb@63
   273
    - GET: give IP of SecurityVM.
mb@63
   274
    """
mb@63
   275
    
mb@63
   276
    def GET(self, name):
oliver@74
   277
        log_call(web.ctx.environ)
oliver@87
   278
        global gvm_mgr
oliver@87
   279
        return gvm_mgr.getHostOnlyIP(name)
mb@63
   280
            
mb@63
   281
mb@63
   282
class os_sdvm_start:
mb@63
   283
    """OpenSecurity '/sdvms/[VM]/start' handler
mb@63
   284
    
mb@63
   285
    - GET: Start specific SecuirtyVM.
mb@63
   286
    """
mb@63
   287
    
mb@63
   288
    def GET(self, name):
oliver@74
   289
        log_call(web.ctx.environ)
oliver@87
   290
        global gvm_mgr
oliver@87
   291
        return gvm_mgr.startVM(name)
mb@63
   292
            
mb@63
   293
mb@63
   294
class os_sdvm_stop:
mb@63
   295
    """OpenSecurity '/sdvms/[VM]/stop' handler
mb@63
   296
    
mb@63
   297
    - GET: stop specific Secuirty VM.
mb@63
   298
    """
mb@63
   299
    
mb@63
   300
    def GET(self, name):
oliver@74
   301
        log_call(web.ctx.environ)
oliver@87
   302
        global gvm_mgr
oliver@87
   303
        return gvm_mgr.stopVM(name)
mb@63
   304
            
mb@63
   305
mb@63
   306
class os_sdvms:
mb@63
   307
    """OpenSecurity '/sdvms' handler
mb@63
   308
    
mb@63
   309
    - GET: list all available secuirty VMs.
mb@63
   310
    - POST: create new security vm.
mb@63
   311
    """
mb@63
   312
    
mb@63
   313
    def GET(self):
mb@63
   314
        """get the list of SDVMs"""
oliver@74
   315
        log_call(web.ctx.environ)
oliver@87
   316
        global gvm_mgr
oliver@204
   317
oliver@204
   318
        d = {}
oliver@204
   319
        for sdvm in gvm_mgr.listSDVM():
oliver@204
   320
            d[sdvm] = gvm_mgr.getHostOnlyIP(sdvm)
oliver@204
   321
oliver@204
   322
        return json.dumps(d, indent = 4)
mb@63
   323
            
mb@63
   324
    def POST(self):
mb@63
   325
        """create a new SDVM"""
oliver@74
   326
        log_call(web.ctx.environ)
oliver@87
   327
        global gvm_mgr
oliver@74
   328
        
mb@63
   329
        # get a new vm-name
oliver@87
   330
        name = gvm_mgr.generateSDVMName()
mb@63
   331
        try:
oliver@87
   332
            gvm_mgr.createVM(name)
mb@63
   333
        except:
mb@63
   334
            raise web.internalerror()
mb@63
   335
            
mb@63
   336
        return name
mb@63
   337
            
oliver@87
   338
oliver@93
   339
class os_setup:
oliver@93
   340
    """OpenSecurity '/setup' handler
oliver@93
   341
    
BarthaM@172
   342
    - GET: Give user some info how to setup the OpenSecurity environment
oliver@93
   343
    """
oliver@93
   344
    
oliver@93
   345
    def GET(self):
oliver@93
   346
oliver@93
   347
        log_call(web.ctx.environ)
oliver@93
   348
oliver@93
   349
        page = """
oliver@93
   350
        <html>
oliver@93
   351
        <body>
oliver@93
   352
        <h1>Setup OpenSecurity</h1>
oliver@93
   353
        In order to setup OpenSecurity an inital VM image has to be downloaded and imported:<br/>
oliver@93
   354
        <ul>
oliver@93
   355
            <li>Download initial VM image: <a href="/fetch_initial_image">fetch_initial_image</a>
oliver@93
   356
            <li>Import initial VM: <a href="/init">init</a>
oliver@93
   357
        </ul>
oliver@93
   358
        </body>
oliver@93
   359
        </html>
oliver@93
   360
        """
oliver@93
   361
        return page
oliver@93
   362
oliver@93
   363
oliver@87
   364
class os_terminate:
oliver@87
   365
    """OpenSecurity '/terminate' handler
oliver@87
   366
    
oliver@87
   367
    - GET: terminate the opensecurityd.
oliver@87
   368
oliver@87
   369
    TODO: need to find a better way doing this, and not via the
oliver@87
   370
          REST api. Maybe hack web.py server code?
oliver@87
   371
    """
oliver@87
   372
    
oliver@87
   373
    def GET(self):
oliver@87
   374
        log_call(web.ctx.environ)
oliver@139
   375
        global gvm_mgr
BarthaM@170
   376
        gvm_mgr.stop()
oliver@139
   377
        gvm_mgr.cleanup()
oliver@138
   378
        global server
oliver@138
   379
        server.stop()
oliver@87
   380
        return None
oliver@87
   381
BarthaM@212
   382
class os_initialize:
BarthaM@212
   383
    """OpenSecurity '/initialize' handler
BarthaM@212
   384
    
BarthaM@212
   385
    - GET: initialize / starts the vmmanager.
BarthaM@212
   386
BarthaM@212
   387
    """
BarthaM@212
   388
    
BarthaM@212
   389
    def GET(self):
BarthaM@212
   390
        log_call(web.ctx.environ)
BarthaM@212
   391
        global gvm_mgr
BarthaM@212
   392
        gvm_mgr.cleanup()
BarthaM@212
   393
        gvm_mgr.start()
BarthaM@212
   394
        global server
BarthaM@212
   395
        server.run()
BarthaM@212
   396
        return None
oliver@87
   397
oliver@87
   398
class os_update_template:
oliver@87
   399
    """OpenSecurity '/update_template' handler
oliver@87
   400
    
oliver@87
   401
    - GET: update template vm
oliver@87
   402
    """
oliver@87
   403
    
oliver@87
   404
    def GET(self):
oliver@87
   405
        #return gvm_mgr.guestExecute('SecurityDVM', 'sudo apt-get -y update')
oliver@87
   406
        global gvm_mgr
oliver@87
   407
        log_call(web.ctx.environ)
oliver@87
   408
        return gvm_mgr.updateTemplate()
oliver@87
   409
oliver@87
   410
mb@63
   411
class os_vm:
mb@63
   412
    """OpenSecurity '/vms/[VM]' handler
mb@63
   413
    
mb@63
   414
    - GET: list information of arbitrary VM.
mb@63
   415
    """
mb@63
   416
    
mb@63
   417
    def GET(self, name):
oliver@74
   418
        log_call(web.ctx.environ)
oliver@87
   419
        global gvm_mgr
oliver@87
   420
        return gvm_mgr.getVMInfo(name)
mb@63
   421
            
mb@63
   422
mb@63
   423
class os_vms:
mb@63
   424
    """OpenSecurity '/vms' handler
mb@63
   425
    
mb@63
   426
    - GET: list all (also non Security) VMs.
mb@63
   427
    """
mb@63
   428
    
mb@63
   429
    def GET(self):
oliver@74
   430
        log_call(web.ctx.environ)
oliver@87
   431
        global gvm_mgr
oliver@112
   432
        return str(gvm_mgr.listVM()).replace("'",'"')
mb@63
   433
            
mb@63
   434
oliver@74
   435
def log_call(web_environ):
oliver@74
   436
    """log the incoming call to the REST api"""
oliver@74
   437
    try:
oliver@74
   438
        call = 'REST ' +  web_environ['REQUEST_METHOD'] + ' ' + web_environ['REQUEST_URI'] + ' from ' + web_environ['REMOTE_ADDR'] + ':' + web_environ['REMOTE_PORT']
oliver@74
   439
        logger.debug(call)
oliver@74
   440
    except:
oliver@74
   441
        pass
oliver@74
   442
oliver@86
   443
oliver@86
   444
def main():
oliver@86
   445
    """main startup for the opensecuirityd"""
oliver@87
   446
oliver@139
   447
    global gvm_mgr
oliver@139
   448
    global server
oliver@139
   449
oliver@87
   450
    logger.debug('Starting OpenSecurity REST server')
oliver@87
   451
oliver@87
   452
    # ensure a VMManger is yet loaded
oliver@87
   453
    gvm_mgr = vmmanager.VMManager.getInstance()
BarthaM@212
   454
    gvm_mgr.start()
oliver@98
   455
    # tweak sys.argv to control wep.py server start behavior
oliver@98
   456
    sys.argv = [__file__, "8080"]
oliver@87
   457
    server = web.application(opensecurity_urls, globals(), autoreload = False)
mb@63
   458
    server.run()
oliver@87
   459
    
oliver@87
   460
    logger.debug('Stopped OpenSecurity REST server')
oliver@86
   461
oliver@86
   462
oliver@88
   463
def stop():
oliver@88
   464
    """stop the opensecuirityd"""
oliver@88
   465
oliver@88
   466
    # calling sys.exit() raises a SystemExit exception
oliver@88
   467
    # of the WSGI Server to let it wind down
oliver@89
   468
    # gracefully
oliver@88
   469
    sys.exit(0)
oliver@88
   470
oliver@86
   471
# start
oliver@86
   472
if __name__ == "__main__":
oliver@86
   473
    main()
BarthaM@170
   474
    sys.exit(0)
oliver@86
   475