Index: /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/router.py
===================================================================
--- /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/router.py	(revision 39761)
+++ /branches/rel_apv_10_7/usr/click/webui/htdocs/new/src/hive/router.py	(working copy)
@@ -1,1145 +1,1166 @@
-import sys
-import os
-import unittest
-from django.core.urlresolvers import resolve
-from django.http import HttpResponse, HttpResponseRedirect
-from django.utils.datastructures import SortedDict
-from django.http import Http404
-from jinja2 import Environment, PackageLoader, ChoiceLoader
-
-from hive.model.fields.builtin import IntegerField
-from hive.utils import andebug, get_current_session, url2obj, upload_receive, UploadResponse, dict_combine, match_illegal_character
-from hive.model.loading import get_model, get_app, get_model_from_full_path, get_apps
-from hive.session import ANSession, current_app, temp_session
-from hive.node import AppNode, NodeRedirect
-from django.shortcuts import redirect
-from hive.model.ajax import ModelAjaxHandler, ObjectAjaxHandler
-from hive.model.rest import ModelRESTResource, InstanceRESTResource, CLIRestResource, CLIRestResource2, CLIRestResource3, BatchCLIRestResource, HealthCheckRestResource, CMRESTResource
-from hive.model.storage import ModelStorageHandler
-from itertools import izip
-from django.shortcuts import redirect
-import json
-import hive.engineer as eng
-from hive.search import *
-from hive.model.query import clear_cache_all, mark_expire_all, QuerySet, mark_expire_one
-from djproject.settings import FILE_UPLOAD_DIR
-import base64
-from django.views.decorators.csrf import csrf_exempt
-import csv
-from hive.exceptions import ModelQueryException, ManagerImplError, ValidationError, RestfulException,BadRequestException
-import types
-import collections
-from hive.model.manager import ANManager
-from hive.model.utils import CONDITIONAL_NONE
-import djproject.an_settings 
-import re
-from apv.localfile import localfile_path_map
-from lib.response import FileResponse
-from hive.model.legacycli import CLIEnablePassError, cli_parse, RegexParser, MATCHALL, MATCHONE, EasyParser
-from apv.company import *
-from hive.utils import *
-import time, commands, datetime
-
-def webuiOn(request):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    djproject.an_settings.WEBUI_ON_OFF = True
-    djproject.an_settings.CHECK_HOST_REFERER = True if get_sysctl_int('net.inet.clicktcp.webui_check_host') else False
-    return HttpResponse('WebUI is on.')
-
-
-def webuiOff(request):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    djproject.an_settings.WEBUI_ON_OFF = False
-    return HttpResponse('WebUI is off.')
-
-
-def restfulapiOn(request, port):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    djproject.an_settings.RESTAPI_ON_OFF = True
-    djproject.an_settings.RESTAPI_PORT = port
-    return HttpResponse('RESTful API is on.')
-
-
-def restfulapiOff(request):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    djproject.an_settings.RESTAPI_ON_OFF = False
-    return HttpResponse('RESTful API is off.')
-
-
-def webuiCheckHostOn(request):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    djproject.an_settings.CHECK_HOST_REFERER = True
-    return HttpResponse('RESTful API is off.')
-
-def webuiCheckHostOff(request):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    djproject.an_settings.CHECK_HOST_REFERER = False
-    return HttpResponse('RESTful API is off.')
-
-global_function_config_tm = 0
-def get_function_configs():
-    global global_function_config_tm
-    new_tm = time.time()
-    if new_tm - global_function_config_tm > 15:
-        global_function_config_tm = time.time()
-        if get_sysctl_int('net.inet.clicktcp.new_webui_enable'):
-            djproject.an_settings.WEBUI_ON_OFF = True
-        else:
-            djproject.an_settings.WEBUI_ON_OFF = False
-        if get_sysctl_int('net.inet.clicktcp.restfulapi_enable'):
-            djproject.an_settings.RESTAPI_ON_OFF = True
-            djproject.an_settings.RESTAPI_PORT = get_sysctl_int('net.inet.clicktcp.restfulapi_port')
-        else:
-            djproject.an_settings.RESTAPI_ON_OFF = False
-            djproject.an_settings.RESTAPI_PORT = 0
-
-class webui_restapi_switch_middleware(object):
-    def process_request(self, request):
-        if request.META['REQUEST_URI'].startswith('/ReloadAppNode'):
-            return None
-        if request.META['REQUEST_URI'].startswith('/CacheClean'):
-            return None
-        if request.META['REQUEST_URI'].startswith('/RSCacheClean'):
-            return None
-        if request.META['REQUEST_URI'].startswith('/restapi'):
-            return None
-        if request.META['REQUEST_URI'].startswith('/webui'):
-            return None
-        if request.META['REQUEST_URI'].startswith('/rest'):
-            if not djproject.an_settings.RESTAPI_ON_OFF:
-                get_function_configs()
-                if not djproject.an_settings.RESTAPI_ON_OFF:
-                    return HttpResponse('RESTful API is off or is starting. Please try again later.')
-            if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
-                get_function_configs()
-                if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
-                    return HttpResponse('RESTful API Port Error.')
-        elif request.META['REQUEST_URI'].startswith('/aest'):
-            if not djproject.an_settings.RESTAPI_ON_OFF:
-                get_function_configs()
-                if not djproject.an_settings.RESTAPI_ON_OFF:
-                    return HttpResponse('RESTful API is off or is starting. Please try again later.')
-            if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
-                get_function_configs()
-                if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
-                    return HttpResponse('RESTful API Port Error.')
-        elif request.META['REQUEST_URI'].startswith('/pest'):
-            if not djproject.an_settings.RESTAPI_ON_OFF:
-                get_function_configs()
-                if not djproject.an_settings.RESTAPI_ON_OFF:
-                    return HttpResponse('RESTful API is off or is starting. Please try again later.')
-            if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
-                get_function_configs()
-                if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
-                    return HttpResponse('RESTful API Port Error.')
-        else:
-            if not djproject.an_settings.WEBUI_ON_OFF:
-                get_function_configs()
-                if not djproject.an_settings.WEBUI_ON_OFF:
-                    return HttpResponse('WebUI is off or is starting. Please try again later.')
-            if request.META['SERVER_PORT'] == str(djproject.an_settings.RESTAPI_PORT):
-                get_function_configs()
-                if request.META['SERVER_PORT'] == str(djproject.an_settings.RESTAPI_PORT):
-                    return HttpResponse('WebUI Port Error .')
-
-def hive_router(request, app, path):
-    sess = get_current_session()
-
-    if app in ['nsae','netopti','apv']:
-        app = 'apv'
-    else:
-        raise Http404('Page not found')
-    try:
-        app_node = AppNode.get_app(app)
-    except ImportError:
-        raise
-        raise Http404('APP not found')
-    except:
-        if getattr(sess, 'engmode', False):
-            raise
-        else:
-            raise
-            raise Http404('APP loading error')
-
-    try:
-        (node, action) = app_node.get_node_by_path(path.strip('/').split('/'))
-    except KeyError:
-        raise Http404('Node not found')
-
-    try:
-        response = HttpResponse(node.render(request, sess, action))
-        return response
-    except NodeRedirect, e:
-        return redirect(e.args[0])
-    except CLIEnablePassError, e:
-        response = HttpResponseRedirect("/logout")
-        response.set_cookie('error_code', 401)
-        return response
-
-def parse_ajax_path(app, path_list):
-    model, action, pk, pk_list = None, None, None, None
-    
-    (model, rest_list) = get_model_from_full_path(app, path_list)
-    if not rest_list:
-        pass
-    elif rest_list[0][0] == '_':
-        action = rest_list[0][1:]
-        pk_list = rest_list[1:]
-    else:
-        pk_list = rest_list
-
-    if pk_list:
-        i = iter(pk_list)
-        pk = dict(izip(i,i))
-        
-    return (model, action, pk)
-    
-def hive_ajax_router(request, app, path):
-    if app in ['nsae','netopti','apv']:
-        app = 'apv'
-    sess = get_current_session()
-    """
-    'REQUEST_URI': '/api/apv/loadbalancing/slb/rs/L4L7RealService/_box_instance_config/service_name/%22%271%22?group_name=default'
-    """
-    try:
-        path = request.META['REQUEST_URI'].split('?')[0].split('/',3)[3]
-    except IndexError:
-        pass
-    """
-    If path is like u'loadbalancing/slb/vs/http/HTTPACL/_box_instance_config/path/"^/*test52.h*tml$"/service/[{"_asso_idx": 0, "service": [{"service_name": "httpsvs", "_asso_idx": 1}]}]'
-    we should avoid "^/*test52.h*tml$" to be split by '/'.
-    """
-    to_protect = re.findall(r'/"\S.*?"/', path.strip('/'))
-    if to_protect:
-        to_protect_new = [i[1:-1] for i in to_protect]
-        for i in to_protect_new:
-            path = path.replace(i, i.replace('/', '%2F'))
-            #later decoded at the ObjectAjaxHandler's __init__
-
-    path_list = path.strip('/').split('/')
-    (model, action, pk) = parse_ajax_path(app, path_list)
-    if action:
-        if '.' in action:
-            (action, suffix) = action.split('.')
-        else:
-            suffix = ''
-        if not pk and not model._meta.profile:
-            try:
-    	        response = HttpResponse(ModelAjaxHandler(request, sess, app, model, action).render())
-            except CLIEnablePassError, e:
-                response = HttpResponse(status=401)
-                response.set_cookie('error_code', 401)
-                return response
-            except BadRequestException:
-                response = HttpResponse()
-                response.status_code = 400
-                return response
-        else:
-            # two cases:
-            # - non-profile model, pk is not None
-            # - profile model, pk is None
-            try:
-                response = HttpResponse(ObjectAjaxHandler(request, sess, app, model, action, pk).render())
-            except CLIEnablePassError, e:
-                response = HttpResponse(status=401)
-                response.set_cookie('error_code', 401)
-                return response
-    else:
-        raise Http404('No action')
-
-    if suffix == 'txt' or suffix == 'conf':
-        cur_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
-        field = model._meta.get_field(request.GET['field'])
-        file_name = "%s_%s.%s" % (field.verbose_name.encode('utf-8'), cur_time, suffix)
-        response['Content-Type'] = 'text/plain; charset=utf-8'
-        response['Content-Disposition'] = 'attachment; filename=%s' % file_name
-    return response
-
-def parse_rest_path(app, path_list):
-    model, instance_id, attribute, action_name, meta, target_id = None, None, None, None, False, None  
-    (model, rest_list) = get_model_from_full_path(app, path_list)
-    if not rest_list:
-        pass
-    elif len(rest_list) == 1:
-        #four cases:
-        # 1- a model action_name
-        # 2- a profile model attribute(field/fieldgroup)
-        # 3- a non-profile model instance_id
-        # 4- a model meta
-        if rest_list[0].lower() == 'meta':
-            meta = True
-        elif rest_list[0][0] == '_':
-            action_name = rest_list[0][1:]
-        elif model._meta.profile:
-            attribute = rest_list[0]
-        else:
-            instance_id = rest_list[0]
-    elif len(rest_list) == 2:
-        #three cases:
-        # 1- a non-profile model instance /instance_id/action_name
-        # 2- a non-profile model instance /instance_id/attribute(field/fieldgroup)
-        # 3- a profile model: DELETE /rest/<model_path>/<asso_field_name>/<target_id>
-        if model._meta.profile:
-            attribute = rest_list[0]
-            target_id = rest_list[1]
-        else:
-            instance_id = rest_list[0]
-            if rest_list[1][0] == '_':
-                action_name = rest_list[1][1:]
-            else:
-                attribute = rest_list[1]
-
-    elif len(rest_list) == 3:
-        #one case:
-        # 1- DELETE /rest/<model_path>/<instance_id>/<asso_field_name>/<target_id>
-        instance_id = rest_list[0]
-        attribute = rest_list[1]
-        target_id = rest_list[2]
-    return (model, instance_id, attribute, action_name, meta, target_id)
-
-@csrf_exempt
-def hive_pest_proxy_router(request, url):
-    with temp_session(request, 'apv') as sess:
-        if not sess:
-            try:
-                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
-                response['WWW-Authenticate'] = 'Basic realm="%s Inc. Cloud API HTTP Auth"' % COMPANY_KEYWORD
-                response.status_code = 401
-                return response
-            except:
-                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
-                response.status_code = 401
-                return response
-        view, args, kwargs = resolve('/'+url)
-        return view(request, *args, **kwargs)
-
-@csrf_exempt
-def hive_aest_router(request, app, path):
-    if app in ['nsae','netopti','fblos','apv']:
-        app = 'apv'
-    with temp_session(request, app) as sess:
-        if not sess:
-            try:
-                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
-                response['WWW-Authenticate'] = 'Basic realm="%s Inc. Cloud API HTTP Auth"' % COMPANY_KEYWORD
-                response.status_code = 401
-                return response
-            except:
-                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
-                response.status_code = 401
-                return response
-        """
-        If path is like u'loadbalancing/slb/vs/http/HTTPACL/_box_instance_config/path/"^/*test52.h*tml$"/service/[{"_asso_idx": 0, "service": [{"service_name": "httpsvs", "_asso_idx": 1}]}]'
-        we should avoid "^/*test52.h*tml$" to be split by '/'.
-        """
-        to_protect = re.findall(r'/"\S.*?"/', path.strip('/'))
-        if to_protect:
-            to_protect_new = [i[1:-1] for i in to_protect]
-            for i in to_protect_new:
-                path = path.replace(i, i.replace('/', '%2F'))
-                #later decoded at the ObjectAjaxHandler's __init__
-
-        path_list = path.strip('/').split('/')
-        (model, action, pk) = parse_ajax_path(app, path_list)
-        if action:
-            if '.' in action:
-                (action, suffix) = action.split('.')
-            else:
-                suffix = ''
-            if not pk and not model._meta.profile:
-                try:
-                    response = HttpResponse(ModelAjaxHandler(request, sess, app, model, action).render())
-                except CLIEnablePassError, e:
-                    send_notification('error', 'Enable password error, will relogin.')
-                    if sess:
-                        sess.logout()
-                    #clear session in thread here, just make it send notification correctly.
-                    _thread_locals.session = None
-                    response = HttpResponse(status=401)
-                    response.set_cookie('error_code', 401)
-                    return response
-            else:
-                # two cases:
-                # - non-profile model, pk is not None
-                # - profile model, pk is None
-                try:
-                    response = HttpResponse(ObjectAjaxHandler(request, sess, app, model, action, pk).render())
-                except CLIEnablePassError, e:
-                    send_notification('error', 'Enable password error, will relogin.')
-                    if sess:
-                        sess.logout()
-                    #clear session in thread here, just make it send notification correctly.
-                    _thread_locals.session = None
-                    response = HttpResponse(status=401)
-                    response.set_cookie('error_code', 401)
-                    return response
-        else:
-            raise Http404('No action')
-        
-        if suffix == 'txt':
-            response['Content-Type'] = 'text/plain; charset=utf-8'
-            response['Content-Disposition'] = 'attachment; filename="export.txt"'
-        elif suffix == 'conf':
-            response['Content-Type'] = 'text/plain; charset=utf-8'
-            response['Content-Disposition'] = 'attachment; filename="export.conf"'
-        return response
-
-
-@csrf_exempt
-def hive_rest_router(request, app, path):
-    if app in ['nsae','netopti','apv']:
-        app = 'apv'
-    with temp_session(request, app) as sess:
-        if not sess:
-            try:
-                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
-                response['WWW-Authenticate'] = 'Basic realm="%s Inc. Cloud API HTTP Auth"' % COMPANY_KEYWORD
-                response.status_code = 401
-                return response
-            except:
-                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
-                response.status_code = 401
-                return response
-        path_list = path.strip('/').split('/')
-        (model, instance_id, attribute, action_name, meta, target_id) = parse_rest_path(app, path_list)
-        method = request.method
-        try:
-            if model == None:
-                if "cli_extend2" in path_list:
-                    response = HttpResponse(CLIRestResource2(request, sess, request.method).render())
-                elif "cli_extend3" in path_list:
-                    response = HttpResponse(CLIRestResource3(request, sess, request.method).render())
-                elif "cli_extend" in path_list:
-                    response = HttpResponse(CLIRestResource(request, sess, request.method).render())
-                elif "batch_cli" in path_list:
-                    response = HttpResponse(BatchCLIRestResource(request, sess, request.method).render())
-                elif "health_check" in path_list:
-                    response = HttpResponse(HealthCheckRestResource(request, sess, request.method).render())
-                elif app == 'cm':
-                    action_name = path_list[0]
-                    if hasattr(CMRESTResource, method):
-                        #Here means vAPV deal with package send from CM
-                        response = HttpResponse(CMRESTResource(request, sess, method, action_name).render())
-                    else:
-                        response = HttpResponse('The request method not implemented.')
-                        response.status_code = 501
-                else:
-                    response = HttpResponse('The request model is not found.')
-                    response.status_code = 404
-            elif hasattr(ModelRESTResource, method) or hasattr(InstanceRESTResource, method):
-                if not instance_id and not attribute:
-                    response = HttpResponse(ModelRESTResource(request, sess, app, model, method, action_name, meta).render())
-                else:
-                    # two cases:
-                    # - non-profile model, instance_id is not None
-                    # - profile model, instance_id is None
-                    response = HttpResponse(InstanceRESTResource(request, sess, app, model, method, instance_id, attribute, action_name, target_id).render())
-            else:
-                response = HttpResponse('The request method not implemented.')
-                response.status_code = 501
-        except RestfulException, e:
-            if e.message:
-                response = HttpResponse(json.dumps(e.message))
-                response.status_code = e.code
-            else:
-                response = HttpResponse('The request has some error, please check it.')
-                response.status_code = 400
-
-        #get content_type
-        content_type = 'application/json'
-        if 'HTTP_ACCEPT' in request.META:
-            if 'application/xml' in request.META['HTTP_ACCEPT']:
-                content_type = 'application/xml'
-
-        response['Content-Type'] = content_type
-        response['Server'] = '%s-eCloud-server' % OS_NAME
-        return response
-@csrf_exempt
-def ping_hosts(request):
-    hosts=json.loads(request.POST.keys()[0])
-    result=[]
-    for ip in hosts:
-        if match_illegal_character(ip):
-            tmp = {'ip': ip, 'send': '', 'receive': ''}
-        else:
-            rst=os.popen("ping -t 3 "+ip+" | grep received")
-            data=rst.read()
-            rst.close()
-            tmp={'ip':ip, 'send':data.split()[0], 'receive':data.split()[3]}
-        result.append(tmp)
-    return HttpResponse(json.dumps(result))
-
-def hive_storage_router(request, app):
-	sess = get_current_session()
-
-	response = HttpResponse(ModelStorageHandler(request, sess, app).render())
-	return response
-	    
-def hive_index_router(request):
-    sess = get_current_session()
-    return redirect('/'+current_app()+'/monitoring/index')
-
-def hive_search_router(request):
-    sess = get_current_session()
-    if 'q' in request.GET and request.GET['q'][:11] == 'arrayclick1':
-        sess.engmode = True
-        sess.reload_document()
-        return HttpResponse('enter_engmode')
-    else:
-        request_dict = dict(request.REQUEST)
-        q = request_dict.pop('q', None)
-        return HttpResponse(hive_search(q, **request_dict))
-    
-def hive_eng_mode_router(request, action, path):
-    sess = get_current_session()
-    if not sess.engmode:
-        raise Http404('not in eng mode')
-
-    if action == 'document':
-        return HttpResponse(eng.document(request))
-    elif action == 'download_doc':
-        return HttpResponse(eng.download_doc(request), content_type='application/xml')
-    elif action == 'doc_detail':
-        return HttpResponse(eng.doc_detail(request))
-    elif action == 'view_loaded_doc':
-        return HttpResponse(eng.view_loaded_doc(request))
-    elif action == 'upload_doc':
-        lang = request.GET.get('lang', 'english')
-        app = request.GET.get('app', 'apv')
-        eng.upload_doc(request)
-        return redirect('/eng/document/?lang=%s&app=%s' % (lang, app))
-    elif action == 'clone_doc':
-        return HttpResponse(eng.clone_doc(request))
-    elif action == 'remove_doc':
-        return HttpResponse(eng.remove_doc(request))
-    elif action == 'diff_doc':
-        return HttpResponse(eng.diff_doc(request), content_type='text/html')
-    elif action == 'ml_download':
-        return HttpResponse(eng.ml_download(request), content_type='text/plain')
-    else:
-        return HttpResponse(getattr(eng, action)(request))
-        
-def hive_pref_get(request, key):
-    sess = get_current_session()
-    return HttpResponse(json.dumps(sess.pref.get(key)))
-
-def hive_pref_set(request, key):
-    sess = get_current_session()
-    if 'v' in request.GET:
-        value = url2obj(request.GET['v'])
-    elif 'v' in request.POST:
-        value = url2obj(request.POST['v'])
-    else:
-        value = None
-        
-    if 'restore' in request.GET or 'restore' in request.POST:
-        return HttpResponse(json.dumps(sess.pref.restore(key)))
-    else:
-        return HttpResponse(json.dumps(sess.pref.set(key, value)))
-
-def hive_pref_clear(request, key):
-    sess = get_current_session()
-    sess.cli.cmd_direct("webui graph clear")
-    return HttpResponse(json.dumps({}))
-
-def CacheClean(request):
-    djproject.an_settings.device_basci_info_dict = {
-        'date': '',
-        'data': ''
-    }
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    return HttpResponse(clear_cache_all())
-
-def RSCacheClean(request):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    mod = get_model('apv', ['loadbalancing', 'slb', 'rs', 'RealService'])
-    return HttpResponse(mark_expire_all(mod))
-
-def UpdateWebUIPermitHost(request):
-    if request.META['SERVER_NAME'] != 'localhost':
-        raise Http404('Page not found')
-    check_host_referer = True
-    host_list = cmd_direct("show webui setting").split('\n')
-    for each in host_list:
-        m1 = re.match("The HTTP Host and Referer check is (\w+)", each)
-        if m1:
-            check_host_referer = False if m1.group(1)=="off" else True
-
-    djproject.an_settings.CHECK_HOST_REFERER = check_host_referer
-    return HttpResponse(json.dumps({}))
-
-config_lock = False
-
-def check_before_upload(request):
-    """
-    This API is for check old uploaded files be removed and set to config mode
-    """
-    if request.method != 'POST':
-        return HttpResponse(status=405)
-    global config_lock
-    config_lock = True
-    remove_files_by_dir(FILE_UPLOAD_DIR, False, False, '.array')
-    force_config_mode()
-    return HttpResponse(json.dumps({}))
-
-def force_config_mode():
-    """
-    Keep in config mode for uploading
-    prevent user enter config mode in SSH
-    """
-    global config_lock
-    sess = get_current_session()
-    while config_lock:
-        sess.cli.set_config()
-
-def upload(request):
-    global config_lock
-    config_lock = False
-    file = upload_receive( request )
-    file_name = handle_uploaded_file(file)
-
-    file_dict = {
-        'name' : file.name,
-        'size' : file.size,
-        'url': file_name,
-    }
-    return UploadResponse( request, file_dict )
-
-def handle_uploaded_file(f):
-    file_name = ""
-    
-    try:
-        path = FILE_UPLOAD_DIR
-        if not os.path.exists(path):
-            os.makedirs(path)
-        file_name = path + f.name
-        destination = open(file_name, 'wb+')
-        for chunk in f.chunks():
-            destination.write(chunk)
-        destination.close()
-    except Exception, e:
-        raise Http404('File upload failed: %s' % e)
-
-    return file_name
-
-def save_file(request):
-    post_dict = json.loads(request.POST.dict()['post_data'])
-    try:
-        path = FILE_UPLOAD_DIR
-        if not os.path.exists(path):
-            os.makedirs(path)
-        file_name = path + post_dict['name']
-        destination = open(file_name, 'wb+')
-        destination.write(post_dict['using']['input_online'])
-        destination.close()
-        file_size = os.path.getsize(file_name)
-        file_dict = {
-            'name' : post_dict['name'],
-            'size' : file_size,
-            'url': file_name,
-        }
-    except Exception, e:
-        raise Http404('File upload failed: %s' % e)
-
-    return UploadResponse(request,file_dict)
-
-
-def get_runtime_script(request):
-    sess = get_current_session()
-    lang = get_current_lang()
-    
-    try:
-        if(sess.segment_name):
-            filename = request.GET.dict()['filename'] + '@@'+sess.segment_name
-        else:
-            filename = request.GET.dict()['filename']
-        if 'example' in filename:
-            if lang == 'zh-cn':
-                file_path = 'zh-cn'
-            else :
-                file_path = 'en'
-            path = '/ca/webui/htdocs/new/src/media/docs/epolicy/scripts/'+file_path+'/'+request.GET.dict()['filename']
-        else:
-            path = '/ca/ePolicy/lb/scripts/'+filename
-        destination = open(path, 'r')
-        code = destination.readlines()
-        destination.close()
-    except Exception, e:
-        raise Http404('File got failed: %s' % e)
-    return HttpResponse(code)
-
-def localfile_downloading_handler(request, app, filename):
-    file_path = localfile_path_map[app]['path']
-    content_type = localfile_path_map[app]['Content-Type'] if 'Content-Type' in localfile_path_map[app] else 'application/octet-stream'
-    os.chdir(file_path)
-    file_exist = os.path.exists(filename)
-    if file_exist:
-        response = FileResponse(open(filename, 'rb'))
-        response['Content-Type'] = content_type
-        # for bug79512 the name is different after download,keep same file name as before download
-        pos = filename.rfind("/")
-        if pos != -1:
-            filename = filename[pos+1:]
-        response['Content-Disposition'] = 'attachment; filename=%s'%filename
-    else:
-        response = HttpResponse('The request file is not found.')
-        response.status_code = 404
-    return response
-
-def ChartExport(request, file_name):
-    request_dict = request.POST.dict()
-    data = []
-    if request_dict:
-        if request_dict["type"] == 'png':
-            data = base64.decodestring(request_dict["data"])
-        elif request_dict["type"] == 'csv':
-            data = request_dict["data"]
-    #data = request_dict["data"]
-    response =  HttpResponse(data, mimetype="application/octet-stream")
-    response['Content-Disposition'] = 'attachment; filename='+file_name
-    return response
-    #return HttpResponse(data)
-
-FILE_CONTENT = []
-
-@csrf_exempt
-def configImport(request, model_path):
-    file = upload_receive( request )
-    file_name = handle_uploaded_file(file)
-
-    if file_name.split('.')[-1] != 'csv':
-        return HttpResponse(json.dumps({'is_success': False, 'errorInfo': 'Invalid File Format !'}))
-
-    global FILE_CONTENT
-    FILE_CONTENT = []
-    try:
-        with open(file_name,'rb') as f:
-            reader = csv.reader(f, dialect='excel')
-            for line in reader:
-                FILE_CONTENT.append(line)
-    except csv.Error as e:
-        return HttpResponse(json.dumps({'is_success': False, 'errorInfo': unicode(e)}))
-
-    sess = get_current_session()
-    model = get_model('apv', model_path.split(','))
-    try:
-        import_handler(model, sess)
-    except ValidationError as e:
-        raise ModelQueryException(e)
-    except ModelQueryException as e:
-        return HttpResponse(json.dumps({'is_success': False, 'errorInfo': unicode(e)}))
-            
-    return HttpResponse(json.dumps({'is_success': True}))
-
-
-def import_handler(model, sess, asso_info=None):
-    try:
-        if not model._meta.abstract:
-            non_abstract_model_import_handler(model, sess, asso_info)
-        else:
-            abstract_model_import_handler(model, sess, asso_info)
-    except ValidationError as e:
-        raise ModelQueryException(e)
-    except ModelQueryException as e:
-        raise e
-
-def non_abstract_model_import_handler(model, sess, asso_info):
-    global FILE_CONTENT
-    manager = model.get_manager(sess)
-    instance = model()
-    
-    if asso_info:
-        try:
-            begin = FILE_CONTENT.index(['#BEGIN %s OF %s'%asso_info])
-            end = FILE_CONTENT.index(['#END %s OF %s'%asso_info])
-            data = FILE_CONTENT[begin+1:end]
-        except ValueError, e:
-            return
-    else:
-        try:
-            begin = FILE_CONTENT.index(['#BEGIN %s'%model._meta.object_name])
-            end = FILE_CONTENT.index(['#END %s'%model._meta.object_name])
-            data = FILE_CONTENT[begin+1:end]
-        except ValueError, e:
-            return
-
-    #In some model, there are two same composition asso
-    #Romove the data from file_content to avoid the data being parsed twice.
-    #e.g. SLB Vlink has two Policy: out policices and in policies 
-    FILE_CONTENT = FILE_CONTENT[:begin] + FILE_CONTENT[end+1:]
-
-    key = data[0]
-    values = data[1:]
-    data = [collections.OrderedDict(zip(key, value)) for value in values]
-    for d in data:
-        field_list = []
-        non_compo_asso_list = []
-        composition_asso_model_list = []
-        for key, value in d.iteritems():
-            field = model._meta.get_field(key)
-            if value == 'CONDITIONAL_NONE':
-                setattr(instance, key, CONDITIONAL_NONE)
-                continue
-            if value == "" and isinstance(field, IntegerField):
-                value = 0
-            #Because csv data is type str, a dict or a list after csv reading will turn to be type str.
-            #For IPAdressFiled, GroupField, UnionFiled, etc. We should try to change it back to type dict or list.
-            if field.type_name in ['ipaddr', 'GroupField', 'UnionField', 'multienum', 'ListField', 'enumorder', 'Percent']:
-                value = eval(value)
-            if field.type_name != 'asso':
-                new_value = field.to_python(value)
-                setattr(instance, key, new_value)
-                field_list.append(key)
-            else:
-                if not field.is_composition_asso():
-                    value = eval(value)
-                    new_value = field.to_python(value)
-                    setattr(instance, key, new_value)
-                    field_list.append(key)
-                    non_compo_asso_list.append(key)
-                else:
-                    if not field.primary_key:
-                        composition_asso_model = get_model('apv', field.tgt[0].split('.')[:-1])
-                        composition_asso_model_list.append(composition_asso_model)
-                    else:
-                        value = eval(value)
-                        new_value = field.to_python(value)
-                        setattr(instance, key, new_value)
-
-        if model._meta.profile:
-            old_values = dict(manager.all()[0].get_field_dict(withstats=False))
-            manager.update(instance, field_list, old_values)
-            mark_expire_all(model)
-        else:
-            try:
-                manager.insert(instance)
-                pk = instance.pk_dict()
-                try:
-                    object = manager.get(pk)
-                    old_values = dict(object.get_field_dict(withstats=False))
-                except KeyError, e:
-                    raise e
-            except ManagerImplError as e:
-                pk = instance.pk_dict()
-                try:
-                    object = manager.get(pk)
-                    old_values = dict(object.get_field_dict(withstats=False))
-                except KeyError, e:
-                    raise e
-                manager.update(instance, field_list, old_values)
-                mark_expire_one(model, pk)
-            except ModelQueryException as e:
-                #sometimes, after a model instance is added, the asso data related will already exist. 
-                #So when we add asso model instance later, it will raise 'The instance is already existed' error, we need to avoid it.
-                if e.messages[0].find('already existed') != -1:
-                    continue
-                if len(e.orig_messages):
-                    for_update = False
-                    try:
-                        orig_msg_tuple = e.orig_messages[0]._proxy____args
-                    except AttributeError:
-                        orig_msg_tuple = ()
-                    if len(orig_msg_tuple) and isinstance(orig_msg_tuple, tuple):
-                        for orig_msg in orig_msg_tuple:
-                            if orig_msg.find('already exists') != -1:
-                                for_update = True
-                    if not for_update:
-                        raise e
-                else:
-                    raise e
-
-            #update assolist inside after create an instance with manager.insert
-            #but if manager.insert calls _insert_or_update in fact, we shouldn't execute manager.update later.
-            #becauce manager.update will call _insert_or_update too, and the instance will be create twice which will raise error.
-            if non_compo_asso_list:
-                to_update = []
-                for i in non_compo_asso_list:
-                    if not instance.is_delayed_query(i):
-                        to_update.append(i)
-                if to_update:
-                    #To avoid '_insert_or_update' to be called twice
-                    #judge whether child manager rewrite ANManager's '_insert_or_update'
-                    if getattr(manager, '_insert_or_update').im_func is getattr(ANManager, '_insert_or_update').im_func:
-                        try:
-                            manager.update(instance, to_update, old_values)
-                        except AttributeError as e:
-                            if isinstance(e, ManagerImplError):
-                                pass
-                        except UnboundLocalError:
-                            manager.update(instance, to_update)
-                        mark_expire_one(model, instance.pk_dict())
-
-        if composition_asso_model_list:
-            for composition_asso_model in composition_asso_model_list:
-                asso_info = composition_asso_model._meta.path[-1], instance.pk_id()
-                import_handler(composition_asso_model, sess, asso_info)  
-
-
-def abstract_model_import_handler(parent, sess, asso_info):
-    try:
-        for child in parent._meta.children:
-            if not child._meta.abstract:
-                if asso_info:
-                    asso_info = child._meta.path[-1], asso_info[1]
-                non_abstract_model_import_handler(child, sess, asso_info)
-            else:
-                abstract_model_import_handler(child, sess, asso_info)
-    except ValidationError as e:
-        raise ModelQueryException(e)
-    except ModelQueryException as e:
-        raise e
-
-@csrf_exempt
-def configExport(request, model_path):
-    filename = model_path.replace(',', '-')+ '.csv'
-    sess = get_current_session()
-    model = get_model('apv', model_path.split(','))
-    manager = model.get_manager(sess)
-    if hasattr(manager, 'export'):
-        response = manager.export()
-        res_content = response.get('Content-Disposition')
-        if res_content:
-            content_list = res_content.split('filename=')
-            if len(content_list)>1:
-                filename = content_list[1].split('.csv')[0]
-                cur_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
-                filename = filename+"_%s"%cur_time+'.csv'
-    else:
-        response = HttpResponse(mimetype='text/csv')
-        export_handler(model, sess, response)  
-    
-    response['Content-Disposition'] = 'attachment; filename=%s'%filename 
-    return response
-
-@csrf_exempt
-def configExportPDF(request, model_path):
-    filename = model_path.replace(',', '-')+ '.pdf'
-    sess = get_current_session()
-    model = get_model('apv', model_path.split(','))
-    manager = model.get_manager(sess)
-    if hasattr(manager, 'exportPDF'):
-        response = manager.exportPDF()
-        res_content = response.get('Content-Disposition')
-        if res_content:
-            content_list = res_content.split('filename=')
-            if len(content_list)>1:
-                filename = content_list[1].split('.pdf')[0]
-                cur_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
-                filename = filename+"_%s"%cur_time+'.pdf'
-    else:
-        response = HttpResponse(mimetype='text/pdf')
-        export_handler(model, sess, response)  
-    
-    response['Content-Disposition'] = 'attachment; filename=%s'%filename 
-    return response
-
-def export_handler(model, sess, response, filter_dict=None, asso_info=None):
-    manager = model.get_manager(sess)
-    
-    if not filter_dict:
-        if not model._meta.abstract:
-            result = manager.all()
-            non_abstract_model_export_handler(result, model, sess, response, asso_info)
-
-        else:
-            abstract_model_export_handler(model, sess, response, asso_info)
-
-    else:
-        try:
-            result = manager.filter(filter_dict)
-        except ManagerImplError, e:
-            result = manager.get(filter_dict)
-
-        if not model._meta.abstract:
-            non_abstract_model_export_handler(result, model, sess, response, asso_info)
-        else:
-            for child in model._meta.children:
-                instance_list = []
-                for instance in result:
-                    if isinstance(instance, child):
-                        instance_list.append(instance)
-                if instance_list:
-                    asso_info = child._meta.path[-1], asso_info[1]
-                    non_abstract_model_export_handler(instance_list, child, sess, response, asso_info)
-
-
-def abstract_model_export_handler(parent, sess, response, asso_info):
-        for child in parent._meta.children:
-            if not child._meta.abstract:
-                manager = child.get_manager(sess)
-                result = manager.all()
-                non_abstract_model_export_handler(result, child , sess, response, asso_info)
-            else:
-                abstract_model_export_handler(child, sess, response, asso_info)
-
-
-def non_abstract_model_export_handler(result, model, sess, response, asso_info):
-    flag = False
-    if type(result) is list:
-        if result:
-            flag = True
-    elif isinstance(result, QuerySet):
-        if result.count() > 0:
-            flag = True
-    else:
-        flag = True
-        new_result = []
-        new_result.append(result)
-        result = new_result
-
-    if flag:
-        composition_asso_model_list = []
-        data_dict = []
-        for instance in result:
-            composition_asso_model_dict = {}
-            asso_models = []
-            values = []
-            if model._meta.profile:
-                keys = [fieldname for fieldname in instance.get_field_dict(withstats=False).keys()]
-            else:
-                keys = [field.name for field in model._meta.get_config_fields()]
-
-            for key in keys:
-                asso_model_dict = {}
-                field = model._meta.get_field(key)
-                if field.type_name == 'asso':
-                    if field.is_composition_asso():
-                        if not field.hidden:
-                            if len(field.tgt_field[0].tgt_field) > 1:
-                                composition_asso_model = get_model('apv', field.tgt[0].split('.')[:-1])
-                                values.append('COMPOSITION_ASSO_' + composition_asso_model._meta.path[-1])
-
-                                the_pk_dict = instance.pk_dict()
-                                filter_dict = {}
-
-                                tgt_field = field.target_end[0].field
-                                tgt_to_self_idx = 0
-                                for idx in range(tgt_field.asso_count):
-                                    tgt_model = tgt_field.target_end[idx].model
-                                    if not tgt_model._meta.abstract:
-                                        if tgt_model == model:
-                                            tgt_to_self_idx = idx
-                                            break
-                                    else:
-                                        if model in tgt_model._meta.children:
-                                            tgt_to_self_idx = idx
-                                            break                                        
-
-                                if the_pk_dict:
-                                    filter_dict[tgt_field.name] = [dict_combine(the_pk_dict, {'_asso_idx':tgt_to_self_idx})]
-                                else:
-                                    filter_dict[tgt_field.name] = [{'_asso_idx':tgt_to_self_idx}]
-
-                                asso_model_dict[composition_asso_model] = filter_dict
-                                asso_models.append(asso_model_dict)
-                            else:
-                                composition_asso_model = get_model('apv', field.tgt[0].split('.')[:-1])
-
-                                if not field.primary_key:
-
-                                    values.append('COMPOSITION_ASSO_' + composition_asso_model._meta.path[-1])
-
-                                    the_pk_dict = instance.pk_dict()
-                                    filter_dict = {}
-                                    if the_pk_dict:
-                                        filter_dict[field.tgt_field[0].name] = [dict_combine(the_pk_dict, {'_asso_idx':0})]
-                                    else:
-                                        filter_dict[field.tgt_field[0].name] = [{'_asso_idx':0}]
-
-                                    asso_model_dict[composition_asso_model] = filter_dict
-                                    asso_models.append(asso_model_dict)
-                                else:
-                                    val_raw = instance.get_attr_real(field.attname)
-                                    if val_raw is CONDITIONAL_NONE:
-                                        values.append('CONDITIONAL_NONE')
-                                    else:
-                                        values.append(getattr(instance, key))
-                        else:
-                            keys = [key2 for key2 in keys[:] if key2 != key]
-
-                    else:
-                        if not field.hidden:
-                            val_raw = instance.get_attr_real(field.attname)
-                            if val_raw is CONDITIONAL_NONE:
-                                values.append('CONDITIONAL_NONE')
-                            else:
-                                values.append(getattr(instance, key))
-                        else:
-                            keys = [key2 for key2 in keys[:] if key2 != key]
-                else:
-                    val_raw = instance.get_attr_real(field.attname)
-                    if val_raw is CONDITIONAL_NONE:
-                        values.append('CONDITIONAL_NONE')
-                    else:
-                        values.append(getattr(instance, key))
-
-            data_dict.append(collections.OrderedDict(zip(keys, values)))
-            composition_asso_model_dict[instance] = asso_models
-            composition_asso_model_list.append(composition_asso_model_dict)
-
-
-        if not asso_info:
-            write_csv_without_composition_asso(response, keys, data_dict, model._meta.object_name)
-        else:
-            write_csv_with_composition_asso(response, keys, data_dict, asso_info)
-
-        if composition_asso_model_list:
-            for instance in result:
-                for a in composition_asso_model_list:
-                    if a.keys()[0] == instance:
-                        for b in a[instance]:
-                            asso_model = b.keys()[0]
-                            asso_model_cls_name = asso_model._meta.path[-1]
-                            asso_filter_dict = b.values()[0]
-                            export_handler(asso_model, sess, response, asso_filter_dict, asso_info=(asso_model_cls_name, instance.pk_id()))
-
-
-def write_csv_without_composition_asso(response, keys, data_dict, model_info):
-    response.write('#BEGIN %s\r\n'%model_info)
-    try:
-        dict_writer = csv.DictWriter(response, quoting=csv.QUOTE_NONNUMERIC, fieldnames=keys, dialect='excel')
-        dict_writer.writeheader()
-        dict_writer.writerows(data_dict)
-    except csv.Error as e:
-        raise Http404('Configuration export failed: %s' % e)
-    response.write('#END %s\r\n\r\n'%model_info)
-
-
-
-def write_csv_with_composition_asso(response, keys, data_dict, asso_info):
-    response.write('#BEGIN %s OF %s\r\n'%asso_info)
-    try:
-        dict_writer = csv.DictWriter(response, quoting=csv.QUOTE_NONNUMERIC, fieldnames=keys, dialect='excel')
-        dict_writer.writeheader()
-        dict_writer.writerows(data_dict)
-    except csv.Error as e:
-        raise Http404('Configuration export failed: %s' % e)
-    response.write('#END %s OF %s\r\n\r\n'%asso_info)
-
-def basic_handler(request):
-    return HttpResponse(json.dumps(get_system_info()))
-
-def check_login_info(request):
-    C_PATH_CONF_LOGIN_INFO = "/var/crash/webui_login_info.conf"
-    if not os.path.exists(C_PATH_CONF_LOGIN_INFO):
-        f = open(C_PATH_CONF_LOGIN_INFO, "w")
-        f.write("show_information 0")
-        f.close()
-    result = 0
-    with open(C_PATH_CONF_LOGIN_INFO, "r") as f:
-        for line in f.readlines():
-            if 'show_information' in line:
-                target = line.split()
-                if len(target) < 2:
-                    break
-                result = target[1].strip()
-                break
-    return HttpResponse(json.dumps({'is_show': result}))
+import sys
+import os
+import unittest
+from django.core.urlresolvers import resolve
+from django.http import HttpResponse, HttpResponseRedirect
+from django.utils.datastructures import SortedDict
+from django.http import Http404
+from jinja2 import Environment, PackageLoader, ChoiceLoader
+
+from hive.model.fields.builtin import IntegerField
+from hive.utils import andebug, get_current_session, url2obj, upload_receive, UploadResponse, dict_combine, match_illegal_character
+from hive.model.loading import get_model, get_app, get_model_from_full_path, get_apps
+from hive.session import ANSession, current_app, temp_session
+from hive.node import AppNode, NodeRedirect
+from django.shortcuts import redirect
+from hive.model.ajax import ModelAjaxHandler, ObjectAjaxHandler
+from hive.model.rest import ModelRESTResource, InstanceRESTResource, CLIRestResource, CLIRestResource2, CLIRestResource3, BatchCLIRestResource, HealthCheckRestResource, CMRESTResource
+from hive.model.storage import ModelStorageHandler
+from itertools import izip
+from django.shortcuts import redirect
+import json
+import hive.engineer as eng
+from hive.search import *
+from hive.model.query import clear_cache_all, mark_expire_all, QuerySet, mark_expire_one
+from djproject.settings import FILE_UPLOAD_DIR
+import base64
+from django.views.decorators.csrf import csrf_exempt
+import csv
+from hive.exceptions import ModelQueryException, ManagerImplError, ValidationError, RestfulException,BadRequestException
+import types
+import collections
+from hive.model.manager import ANManager
+from hive.model.utils import CONDITIONAL_NONE
+import djproject.an_settings 
+import re
+from apv.localfile import localfile_path_map
+from lib.response import FileResponse
+from hive.model.legacycli import CLIEnablePassError, cli_parse, RegexParser, MATCHALL, MATCHONE, EasyParser
+from apv.company import *
+from hive.utils import *
+import time, commands, datetime
+
+def webuiOn(request):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    djproject.an_settings.WEBUI_ON_OFF = True
+    djproject.an_settings.CHECK_HOST_REFERER = True if get_sysctl_int('net.inet.clicktcp.webui_check_host') else False
+    return HttpResponse('WebUI is on.')
+
+
+def webuiOff(request):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    djproject.an_settings.WEBUI_ON_OFF = False
+    return HttpResponse('WebUI is off.')
+
+
+def restfulapiOn(request, port):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    djproject.an_settings.RESTAPI_ON_OFF = True
+    djproject.an_settings.RESTAPI_PORT = port
+    return HttpResponse('RESTful API is on.')
+
+
+def restfulapiOff(request):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    djproject.an_settings.RESTAPI_ON_OFF = False
+    return HttpResponse('RESTful API is off.')
+
+
+def webuiCheckHostOn(request):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    djproject.an_settings.CHECK_HOST_REFERER = True
+    return HttpResponse('RESTful API is off.')
+
+def webuiCheckHostOff(request):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    djproject.an_settings.CHECK_HOST_REFERER = False
+    return HttpResponse('RESTful API is off.')
+
+global_function_config_tm = 0
+def get_function_configs():
+    global global_function_config_tm
+    new_tm = time.time()
+    if new_tm - global_function_config_tm > 15:
+        global_function_config_tm = time.time()
+        if get_sysctl_int('net.inet.clicktcp.new_webui_enable'):
+            djproject.an_settings.WEBUI_ON_OFF = True
+        else:
+            djproject.an_settings.WEBUI_ON_OFF = False
+        if get_sysctl_int('net.inet.clicktcp.restfulapi_enable'):
+            djproject.an_settings.RESTAPI_ON_OFF = True
+            djproject.an_settings.RESTAPI_PORT = get_sysctl_int('net.inet.clicktcp.restfulapi_port')
+        else:
+            djproject.an_settings.RESTAPI_ON_OFF = False
+            djproject.an_settings.RESTAPI_PORT = 0
+
+class webui_restapi_switch_middleware(object):
+    def process_request(self, request):
+        if request.META['REQUEST_URI'].startswith('/ReloadAppNode'):
+            return None
+        if request.META['REQUEST_URI'].startswith('/CacheClean'):
+            return None
+        if request.META['REQUEST_URI'].startswith('/RSCacheClean'):
+            return None
+        if request.META['REQUEST_URI'].startswith('/restapi'):
+            return None
+        if request.META['REQUEST_URI'].startswith('/webui'):
+            return None
+        if request.META['REQUEST_URI'].startswith('/rest'):
+            if not djproject.an_settings.RESTAPI_ON_OFF:
+                get_function_configs()
+                if not djproject.an_settings.RESTAPI_ON_OFF:
+                    return HttpResponse('RESTful API is off or is starting. Please try again later.')
+            if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
+                get_function_configs()
+                if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
+                    return HttpResponse('RESTful API Port Error.')
+        elif request.META['REQUEST_URI'].startswith('/aest'):
+            if not djproject.an_settings.RESTAPI_ON_OFF:
+                get_function_configs()
+                if not djproject.an_settings.RESTAPI_ON_OFF:
+                    return HttpResponse('RESTful API is off or is starting. Please try again later.')
+            if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
+                get_function_configs()
+                if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
+                    return HttpResponse('RESTful API Port Error.')
+        elif request.META['REQUEST_URI'].startswith('/pest'):
+            if not djproject.an_settings.RESTAPI_ON_OFF:
+                get_function_configs()
+                if not djproject.an_settings.RESTAPI_ON_OFF:
+                    return HttpResponse('RESTful API is off or is starting. Please try again later.')
+            if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
+                get_function_configs()
+                if request.META['SERVER_PORT'] != str(djproject.an_settings.RESTAPI_PORT):
+                    return HttpResponse('RESTful API Port Error.')
+        else:
+            if not djproject.an_settings.WEBUI_ON_OFF:
+                get_function_configs()
+                if not djproject.an_settings.WEBUI_ON_OFF:
+                    return HttpResponse('WebUI is off or is starting. Please try again later.')
+            if request.META['SERVER_PORT'] == str(djproject.an_settings.RESTAPI_PORT):
+                get_function_configs()
+                if request.META['SERVER_PORT'] == str(djproject.an_settings.RESTAPI_PORT):
+                    return HttpResponse('WebUI Port Error .')
+
+def hive_router(request, app, path):
+    sess = get_current_session()
+
+    if app in ['nsae','netopti','apv']:
+        app = 'apv'
+    else:
+        raise Http404('Page not found')
+    try:
+        app_node = AppNode.get_app(app)
+    except ImportError:
+        raise
+        raise Http404('APP not found')
+    except:
+        if getattr(sess, 'engmode', False):
+            raise
+        else:
+            raise
+            raise Http404('APP loading error')
+
+    try:
+        (node, action) = app_node.get_node_by_path(path.strip('/').split('/'))
+    except KeyError:
+        raise Http404('Node not found')
+
+    try:
+        response = HttpResponse(node.render(request, sess, action))
+        return response
+    except NodeRedirect, e:
+        return redirect(e.args[0])
+    except CLIEnablePassError, e:
+        response = HttpResponseRedirect("/logout")
+        response.set_cookie('error_code', 401)
+        return response
+
+def parse_ajax_path(app, path_list):
+    model, action, pk, pk_list = None, None, None, None
+    
+    (model, rest_list) = get_model_from_full_path(app, path_list)
+    if not rest_list:
+        pass
+    elif rest_list[0][0] == '_':
+        action = rest_list[0][1:]
+        pk_list = rest_list[1:]
+    else:
+        pk_list = rest_list
+
+    if pk_list:
+        i = iter(pk_list)
+        pk = dict(izip(i,i))
+        
+    return (model, action, pk)
+    
+def hive_ajax_router(request, app, path):
+    if app in ['nsae','netopti','apv']:
+        app = 'apv'
+    sess = get_current_session()
+    """
+    'REQUEST_URI': '/api/apv/loadbalancing/slb/rs/L4L7RealService/_box_instance_config/service_name/%22%271%22?group_name=default'
+    """
+    try:
+        path = request.META['REQUEST_URI'].split('?')[0].split('/',3)[3]
+    except IndexError:
+        pass
+    """
+    If path is like u'loadbalancing/slb/vs/http/HTTPACL/_box_instance_config/path/"^/*test52.h*tml$"/service/[{"_asso_idx": 0, "service": [{"service_name": "httpsvs", "_asso_idx": 1}]}]'
+    we should avoid "^/*test52.h*tml$" to be split by '/'.
+    """
+    to_protect = re.findall(r'/"\S.*?"/', path.strip('/'))
+    if to_protect:
+        to_protect_new = [i[1:-1] for i in to_protect]
+        for i in to_protect_new:
+            path = path.replace(i, i.replace('/', '%2F'))
+            #later decoded at the ObjectAjaxHandler's __init__
+
+    path_list = path.strip('/').split('/')
+    (model, action, pk) = parse_ajax_path(app, path_list)
+    if action:
+        if '.' in action:
+            (action, suffix) = action.split('.')
+        else:
+            suffix = ''
+        if not pk and not model._meta.profile:
+            try:
+    	        response = HttpResponse(ModelAjaxHandler(request, sess, app, model, action).render())
+            except CLIEnablePassError, e:
+                response = HttpResponse(status=401)
+                response.set_cookie('error_code', 401)
+                return response
+            except BadRequestException:
+                response = HttpResponse()
+                response.status_code = 400
+                return response
+        else:
+            # two cases:
+            # - non-profile model, pk is not None
+            # - profile model, pk is None
+            try:
+                response = HttpResponse(ObjectAjaxHandler(request, sess, app, model, action, pk).render())
+            except CLIEnablePassError, e:
+                response = HttpResponse(status=401)
+                response.set_cookie('error_code', 401)
+                return response
+    else:
+        raise Http404('No action')
+
+    if suffix == 'txt' or suffix == 'conf':
+        cur_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
+        field = model._meta.get_field(request.GET['field'])
+        file_name = "%s_%s.%s" % (field.verbose_name.encode('utf-8'), cur_time, suffix)
+        response['Content-Type'] = 'text/plain; charset=utf-8'
+        response['Content-Disposition'] = 'attachment; filename=%s' % file_name
+    return response
+
+def parse_rest_path(app, path_list):
+    model, instance_id, attribute, action_name, meta, target_id = None, None, None, None, False, None  
+    (model, rest_list) = get_model_from_full_path(app, path_list)
+    if not rest_list:
+        pass
+    elif len(rest_list) == 1:
+        #four cases:
+        # 1- a model action_name
+        # 2- a profile model attribute(field/fieldgroup)
+        # 3- a non-profile model instance_id
+        # 4- a model meta
+        if rest_list[0].lower() == 'meta':
+            meta = True
+        elif rest_list[0][0] == '_':
+            action_name = rest_list[0][1:]
+        elif model._meta.profile:
+            attribute = rest_list[0]
+        else:
+            instance_id = rest_list[0]
+    elif len(rest_list) == 2:
+        #three cases:
+        # 1- a non-profile model instance /instance_id/action_name
+        # 2- a non-profile model instance /instance_id/attribute(field/fieldgroup)
+        # 3- a profile model: DELETE /rest/<model_path>/<asso_field_name>/<target_id>
+        if model._meta.profile:
+            attribute = rest_list[0]
+            target_id = rest_list[1]
+        else:
+            instance_id = rest_list[0]
+            if rest_list[1][0] == '_':
+                action_name = rest_list[1][1:]
+            else:
+                attribute = rest_list[1]
+
+    elif len(rest_list) == 3:
+        #one case:
+        # 1- DELETE /rest/<model_path>/<instance_id>/<asso_field_name>/<target_id>
+        instance_id = rest_list[0]
+        attribute = rest_list[1]
+        target_id = rest_list[2]
+    return (model, instance_id, attribute, action_name, meta, target_id)
+
+@csrf_exempt
+def hive_pest_proxy_router(request, url):
+    with temp_session(request, 'apv') as sess:
+        if not sess:
+            try:
+                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
+                response['WWW-Authenticate'] = 'Basic realm="%s Inc. Cloud API HTTP Auth"' % COMPANY_KEYWORD
+                response.status_code = 401
+                return response
+            except:
+                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
+                response.status_code = 401
+                return response
+        view, args, kwargs = resolve('/'+url)
+        return view(request, *args, **kwargs)
+
+@csrf_exempt
+def hive_aest_router(request, app, path):
+    if app in ['nsae','netopti','fblos','apv']:
+        app = 'apv'
+    with temp_session(request, app) as sess:
+        if not sess:
+            try:
+                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
+                response['WWW-Authenticate'] = 'Basic realm="%s Inc. Cloud API HTTP Auth"' % COMPANY_KEYWORD
+                response.status_code = 401
+                return response
+            except:
+                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
+                response.status_code = 401
+                return response
+        """
+        If path is like u'loadbalancing/slb/vs/http/HTTPACL/_box_instance_config/path/"^/*test52.h*tml$"/service/[{"_asso_idx": 0, "service": [{"service_name": "httpsvs", "_asso_idx": 1}]}]'
+        we should avoid "^/*test52.h*tml$" to be split by '/'.
+        """
+        to_protect = re.findall(r'/"\S.*?"/', path.strip('/'))
+        if to_protect:
+            to_protect_new = [i[1:-1] for i in to_protect]
+            for i in to_protect_new:
+                path = path.replace(i, i.replace('/', '%2F'))
+                #later decoded at the ObjectAjaxHandler's __init__
+
+        path_list = path.strip('/').split('/')
+        (model, action, pk) = parse_ajax_path(app, path_list)
+        if action:
+            if '.' in action:
+                (action, suffix) = action.split('.')
+            else:
+                suffix = ''
+            if not pk and not model._meta.profile:
+                try:
+                    response = HttpResponse(ModelAjaxHandler(request, sess, app, model, action).render())
+                except CLIEnablePassError, e:
+                    send_notification('error', 'Enable password error, will relogin.')
+                    if sess:
+                        sess.logout()
+                    #clear session in thread here, just make it send notification correctly.
+                    _thread_locals.session = None
+                    response = HttpResponse(status=401)
+                    response.set_cookie('error_code', 401)
+                    return response
+            else:
+                # two cases:
+                # - non-profile model, pk is not None
+                # - profile model, pk is None
+                try:
+                    response = HttpResponse(ObjectAjaxHandler(request, sess, app, model, action, pk).render())
+                except CLIEnablePassError, e:
+                    send_notification('error', 'Enable password error, will relogin.')
+                    if sess:
+                        sess.logout()
+                    #clear session in thread here, just make it send notification correctly.
+                    _thread_locals.session = None
+                    response = HttpResponse(status=401)
+                    response.set_cookie('error_code', 401)
+                    return response
+        else:
+            raise Http404('No action')
+        
+        if suffix == 'txt':
+            response['Content-Type'] = 'text/plain; charset=utf-8'
+            response['Content-Disposition'] = 'attachment; filename="export.txt"'
+        elif suffix == 'conf':
+            response['Content-Type'] = 'text/plain; charset=utf-8'
+            response['Content-Disposition'] = 'attachment; filename="export.conf"'
+        return response
+
+
+@csrf_exempt
+def hive_rest_router(request, app, path):
+    if app in ['nsae','netopti','apv']:
+        app = 'apv'
+    with temp_session(request, app) as sess:
+        if not sess:
+            try:
+                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
+                response['WWW-Authenticate'] = 'Basic realm="%s Inc. Cloud API HTTP Auth"' % COMPANY_KEYWORD
+                response.status_code = 401
+                return response
+            except:
+                response = HttpResponse('Please use http basic authentication, and make sure the username/password is correct.')
+                response.status_code = 401
+                return response
+        path_list = path.strip('/').split('/')
+        (model, instance_id, attribute, action_name, meta, target_id) = parse_rest_path(app, path_list)
+        method = request.method
+        try:
+            if model == None:
+                if "cli_extend2" in path_list:
+                    response = HttpResponse(CLIRestResource2(request, sess, request.method).render())
+                elif "cli_extend3" in path_list:
+                    response = HttpResponse(CLIRestResource3(request, sess, request.method).render())
+                elif "cli_extend" in path_list:
+                    response = HttpResponse(CLIRestResource(request, sess, request.method).render())
+                elif "batch_cli" in path_list:
+                    response = HttpResponse(BatchCLIRestResource(request, sess, request.method).render())
+                elif "health_check" in path_list:
+                    response = HttpResponse(HealthCheckRestResource(request, sess, request.method).render())
+                elif app == 'cm':
+                    action_name = path_list[0]
+                    if hasattr(CMRESTResource, method):
+                        #Here means vAPV deal with package send from CM
+                        response = HttpResponse(CMRESTResource(request, sess, method, action_name).render())
+                    else:
+                        response = HttpResponse('The request method not implemented.')
+                        response.status_code = 501
+                else:
+                    response = HttpResponse('The request model is not found.')
+                    response.status_code = 404
+            elif hasattr(ModelRESTResource, method) or hasattr(InstanceRESTResource, method):
+                if not instance_id and not attribute:
+                    response = HttpResponse(ModelRESTResource(request, sess, app, model, method, action_name, meta).render())
+                else:
+                    # two cases:
+                    # - non-profile model, instance_id is not None
+                    # - profile model, instance_id is None
+                    response = HttpResponse(InstanceRESTResource(request, sess, app, model, method, instance_id, attribute, action_name, target_id).render())
+            else:
+                response = HttpResponse('The request method not implemented.')
+                response.status_code = 501
+        except RestfulException, e:
+            if e.message:
+                response = HttpResponse(json.dumps(e.message))
+                response.status_code = e.code
+            else:
+                response = HttpResponse('The request has some error, please check it.')
+                response.status_code = 400
+
+        #get content_type
+        content_type = 'application/json'
+        if 'HTTP_ACCEPT' in request.META:
+            if 'application/xml' in request.META['HTTP_ACCEPT']:
+                content_type = 'application/xml'
+
+        response['Content-Type'] = content_type
+        response['Server'] = '%s-eCloud-server' % OS_NAME
+        return response
+@csrf_exempt
+def ping_hosts(request):
+    hosts=json.loads(request.POST.keys()[0])
+    result=[]
+    for ip in hosts:
+        if match_illegal_character(ip):
+            tmp = {'ip': ip, 'send': '', 'receive': ''}
+        else:
+            rst=os.popen("ping -t 3 "+ip+" | grep received")
+            data=rst.read()
+            rst.close()
+            tmp={'ip':ip, 'send':data.split()[0], 'receive':data.split()[3]}
+        result.append(tmp)
+    return HttpResponse(json.dumps(result))
+
+def hive_storage_router(request, app):
+	sess = get_current_session()
+
+	response = HttpResponse(ModelStorageHandler(request, sess, app).render())
+	return response
+	    
+def hive_index_router(request):
+    sess = get_current_session()
+    return redirect('/'+current_app()+'/monitoring/index')
+
+def hive_search_router(request):
+    sess = get_current_session()
+    if 'q' in request.GET and request.GET['q'][:11] == 'arrayclick1':
+        sess.engmode = True
+        sess.reload_document()
+        return HttpResponse('enter_engmode')
+    else:
+        request_dict = dict(request.REQUEST)
+        q = request_dict.pop('q', None)
+        return HttpResponse(hive_search(q, **request_dict))
+    
+def hive_eng_mode_router(request, action, path):
+    sess = get_current_session()
+    if not sess.engmode:
+        raise Http404('not in eng mode')
+
+    if action == 'document':
+        return HttpResponse(eng.document(request))
+    elif action == 'download_doc':
+        return HttpResponse(eng.download_doc(request), content_type='application/xml')
+    elif action == 'doc_detail':
+        return HttpResponse(eng.doc_detail(request))
+    elif action == 'view_loaded_doc':
+        return HttpResponse(eng.view_loaded_doc(request))
+    elif action == 'upload_doc':
+        lang = request.GET.get('lang', 'english')
+        app = request.GET.get('app', 'apv')
+        eng.upload_doc(request)
+        return redirect('/eng/document/?lang=%s&app=%s' % (lang, app))
+    elif action == 'clone_doc':
+        return HttpResponse(eng.clone_doc(request))
+    elif action == 'remove_doc':
+        return HttpResponse(eng.remove_doc(request))
+    elif action == 'diff_doc':
+        return HttpResponse(eng.diff_doc(request), content_type='text/html')
+    elif action == 'ml_download':
+        return HttpResponse(eng.ml_download(request), content_type='text/plain')
+    else:
+        return HttpResponse(getattr(eng, action)(request))
+        
+def hive_pref_get(request, key):
+    sess = get_current_session()
+    return HttpResponse(json.dumps(sess.pref.get(key)))
+
+def hive_pref_set(request, key):
+    sess = get_current_session()
+    if 'v' in request.GET:
+        value = url2obj(request.GET['v'])
+    elif 'v' in request.POST:
+        value = url2obj(request.POST['v'])
+    else:
+        value = None
+        
+    if 'restore' in request.GET or 'restore' in request.POST:
+        return HttpResponse(json.dumps(sess.pref.restore(key)))
+    else:
+        return HttpResponse(json.dumps(sess.pref.set(key, value)))
+
+def hive_pref_clear(request, key):
+    sess = get_current_session()
+    sess.cli.cmd_direct("webui graph clear")
+    return HttpResponse(json.dumps({}))
+
+def CacheClean(request):
+    djproject.an_settings.device_basci_info_dict = {
+        'date': '',
+        'data': ''
+    }
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    return HttpResponse(clear_cache_all())
+
+def RSCacheClean(request):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    mod = get_model('apv', ['loadbalancing', 'slb', 'rs', 'RealService'])
+    return HttpResponse(mark_expire_all(mod))
+
+def UpdateWebUIPermitHost(request):
+    if request.META['SERVER_NAME'] != 'localhost':
+        raise Http404('Page not found')
+    check_host_referer = True
+    host_list = cmd_direct("show webui setting").split('\n')
+    for each in host_list:
+        m1 = re.match("The HTTP Host and Referer check is (\w+)", each)
+        if m1:
+            check_host_referer = False if m1.group(1)=="off" else True
+
+    djproject.an_settings.CHECK_HOST_REFERER = check_host_referer
+    return HttpResponse(json.dumps({}))
+
+config_lock = False
+
+def check_before_upload(request):
+    """
+    This API is for check old uploaded files be removed and set to config mode
+    """
+    if request.method != 'POST':
+        return HttpResponse(status=405)
+    global config_lock
+    config_lock = True
+    remove_files_by_dir(FILE_UPLOAD_DIR, False, False, '.array')
+    force_config_mode()
+    return HttpResponse(json.dumps({}))
+
+def force_config_mode():
+    """
+    Keep in config mode for uploading
+    prevent user enter config mode in SSH
+    """
+    global config_lock
+    sess = get_current_session()
+    while config_lock:
+        sess.cli.set_config()
+
+def upload(request):
+    global config_lock
+    config_lock = False
+    file = upload_receive( request )
+    file_name = handle_uploaded_file(file)
+
+    file_dict = {
+        'name' : file.name,
+        'size' : file.size,
+        'url': file_name,
+    }
+    return UploadResponse( request, file_dict )
+
+def handle_uploaded_file(f):
+    file_name = ""
+    
+    try:
+        path = FILE_UPLOAD_DIR
+        if not os.path.exists(path):
+            os.makedirs(path)
+        file_name = path + f.name
+        destination = open(file_name, 'wb+')
+        for chunk in f.chunks():
+            destination.write(chunk)
+        destination.close()
+    except Exception, e:
+        raise Http404('File upload failed: %s' % e)
+
+    return file_name
+
+def save_file(request):
+    post_dict = json.loads(request.POST.dict()['post_data'])
+    try:
+        path = FILE_UPLOAD_DIR
+        if not os.path.exists(path):
+            os.makedirs(path)
+        file_name = path + post_dict['name']
+        destination = open(file_name, 'wb+')
+        destination.write(post_dict['using']['input_online'])
+        destination.close()
+        file_size = os.path.getsize(file_name)
+        file_dict = {
+            'name' : post_dict['name'],
+            'size' : file_size,
+            'url': file_name,
+        }
+    except Exception, e:
+        raise Http404('File upload failed: %s' % e)
+
+    return UploadResponse(request,file_dict)
+
+
+def get_runtime_script(request):
+    sess = get_current_session()
+    lang = get_current_lang()
+    
+    try:
+        if(sess.segment_name):
+            filename = request.GET.dict()['filename'] + '@@'+sess.segment_name
+        else:
+            filename = request.GET.dict()['filename']
+        if 'example' in filename:
+            if lang == 'zh-cn':
+                file_path = 'zh-cn'
+            else :
+                file_path = 'en'
+            path = '/ca/webui/htdocs/new/src/media/docs/epolicy/scripts/'+file_path+'/'+request.GET.dict()['filename']
+        else:
+            path = '/ca/ePolicy/lb/scripts/'+filename
+        destination = open(path, 'r')
+        code = destination.readlines()
+        destination.close()
+    except Exception, e:
+        raise Http404('File got failed: %s' % e)
+    return HttpResponse(code)
+
+def localfile_downloading_handler(request, app, filename):
+    file_path = localfile_path_map[app]['path']
+    content_type = localfile_path_map[app]['Content-Type'] if 'Content-Type' in localfile_path_map[app] else 'application/octet-stream'
+    os.chdir(file_path)
+    file_exist = os.path.exists(filename)
+    if file_exist:
+        response = FileResponse(open(filename, 'rb'))
+        response['Content-Type'] = content_type
+        # for bug79512 the name is different after download,keep same file name as before download
+        pos = filename.rfind("/")
+        if pos != -1:
+            filename = filename[pos+1:]
+        response['Content-Disposition'] = 'attachment; filename=%s'%filename
+    else:
+        response = HttpResponse('The request file is not found.')
+        response.status_code = 404
+    return response
+
+def ChartExport(request, file_name):
+    request_dict = request.POST.dict()
+    data = []
+    if request_dict:
+        if request_dict["type"] == 'png':
+            data = base64.decodestring(request_dict["data"])
+        elif request_dict["type"] == 'csv':
+            data = request_dict["data"]
+    #data = request_dict["data"]
+    response =  HttpResponse(data, mimetype="application/octet-stream")
+    response['Content-Disposition'] = 'attachment; filename='+file_name
+    return response
+    #return HttpResponse(data)
+
+FILE_CONTENT = []
+
+@csrf_exempt
+def configImport(request, model_path):
+    file = upload_receive( request )
+    file_name = handle_uploaded_file(file)
+
+    if file_name.split('.')[-1] != 'csv':
+        return HttpResponse(json.dumps({'is_success': False, 'errorInfo': 'Invalid File Format !'}))
+
+    global FILE_CONTENT
+    FILE_CONTENT = []
+    try:
+        with open(file_name,'rb') as f:
+            reader = csv.reader(f, dialect='excel')
+            for line in reader:
+                FILE_CONTENT.append(line)
+    except csv.Error as e:
+        return HttpResponse(json.dumps({'is_success': False, 'errorInfo': unicode(e)}))
+
+    sess = get_current_session()
+    model = get_model('apv', model_path.split(','))
+    try:
+        import_handler(model, sess)
+    except ValidationError as e:
+        raise ModelQueryException(e)
+    except ModelQueryException as e:
+        return HttpResponse(json.dumps({'is_success': False, 'errorInfo': unicode(e)}))
+            
+    return HttpResponse(json.dumps({'is_success': True}))
+
+
+def import_handler(model, sess, asso_info=None):
+    try:
+        if not model._meta.abstract:
+            non_abstract_model_import_handler(model, sess, asso_info)
+        else:
+            abstract_model_import_handler(model, sess, asso_info)
+    except ValidationError as e:
+        raise ModelQueryException(e)
+    except ModelQueryException as e:
+        raise e
+
+def non_abstract_model_import_handler(model, sess, asso_info):
+    global FILE_CONTENT
+    manager = model.get_manager(sess)
+    instance = model()
+    
+    if asso_info:
+        try:
+            begin = FILE_CONTENT.index(['#BEGIN %s OF %s'%asso_info])
+            end = FILE_CONTENT.index(['#END %s OF %s'%asso_info])
+            data = FILE_CONTENT[begin+1:end]
+        except ValueError, e:
+            return
+    else:
+        try:
+            begin = FILE_CONTENT.index(['#BEGIN %s'%model._meta.object_name])
+            end = FILE_CONTENT.index(['#END %s'%model._meta.object_name])
+            data = FILE_CONTENT[begin+1:end]
+        except ValueError, e:
+            return
+
+    #In some model, there are two same composition asso
+    #Romove the data from file_content to avoid the data being parsed twice.
+    #e.g. SLB Vlink has two Policy: out policices and in policies 
+    FILE_CONTENT = FILE_CONTENT[:begin] + FILE_CONTENT[end+1:]
+
+    key = data[0]
+    values = data[1:]
+    data = [collections.OrderedDict(zip(key, value)) for value in values]
+    for d in data:
+        field_list = []
+        non_compo_asso_list = []
+        composition_asso_model_list = []
+        for key, value in d.iteritems():
+            field = model._meta.get_field(key)
+            if field.is_external_component():
+                setattr(instance, key, None)
+                continue
+            if value == 'CONDITIONAL_NONE':
+                setattr(instance, key, CONDITIONAL_NONE)
+                continue
+            if value == "" and isinstance(field, IntegerField):
+                if field.optional:
+                    if hasattr(field, 'scope') and field.scope:
+                        try:
+                            min_value = field.scope.get_min()
+                            if min_value == 0:
+                                value = field.get_default(None) if field.has_default() else 0
+                            else:
+                                setattr(instance, key, None)
+                                field_list.append(key)
+                                continue
+                        except Exception as e:
+                            andebug('hive.debug', "Error checking scope for field '%s': %s" % (key, e))
+                            value = 0
+                    else:
+                        setattr(instance, key, None)
+                        field_list.append(key)
+                        continue
+                else:
+                    value = 0
+            #Because csv data is type str, a dict or a list after csv reading will turn to be type str.
+            #For IPAdressFiled, GroupField, UnionFiled, etc. We should try to change it back to type dict or list.
+            if field.type_name in ['ipaddr', 'GroupField', 'UnionField', 'multienum', 'ListField', 'enumorder', 'Percent']:
+                value = eval(value)
+            if field.type_name != 'asso':
+                new_value = field.to_python(value)
+                setattr(instance, key, new_value)
+                field_list.append(key)
+            else:
+                if not field.is_composition_asso():
+                    value = eval(value)
+                    new_value = field.to_python(value)
+                    setattr(instance, key, new_value)
+                    field_list.append(key)
+                    non_compo_asso_list.append(key)
+                else:
+                    if not field.primary_key:
+                        composition_asso_model = get_model('apv', field.tgt[0].split('.')[:-1])
+                        composition_asso_model_list.append(composition_asso_model)
+                    else:
+                        value = eval(value)
+                        new_value = field.to_python(value)
+                        setattr(instance, key, new_value)
+
+        if model._meta.profile:
+            old_values = dict(manager.all()[0].get_field_dict(withstats=False))
+            manager.update(instance, field_list, old_values)
+            mark_expire_all(model)
+        else:
+            try:
+                manager.insert(instance)
+                pk = instance.pk_dict()
+                try:
+                    object = manager.get(pk)
+                    old_values = dict(object.get_field_dict(withstats=False))
+                except KeyError, e:
+                    raise e
+            except ManagerImplError as e:
+                pk = instance.pk_dict()
+                try:
+                    object = manager.get(pk)
+                    old_values = dict(object.get_field_dict(withstats=False))
+                except KeyError, e:
+                    raise e
+                manager.update(instance, field_list, old_values)
+                mark_expire_one(model, pk)
+            except ModelQueryException as e:
+                #sometimes, after a model instance is added, the asso data related will already exist. 
+                #So when we add asso model instance later, it will raise 'The instance is already existed' error, we need to avoid it.
+                if e.messages[0].find('already existed') != -1:
+                    continue
+                if len(e.orig_messages):
+                    for_update = False
+                    try:
+                        orig_msg_tuple = e.orig_messages[0]._proxy____args
+                    except AttributeError:
+                        orig_msg_tuple = ()
+                    if len(orig_msg_tuple) and isinstance(orig_msg_tuple, tuple):
+                        for orig_msg in orig_msg_tuple:
+                            if orig_msg.find('already exists') != -1:
+                                for_update = True
+                    if not for_update:
+                        raise e
+                else:
+                    raise e
+
+            #update assolist inside after create an instance with manager.insert
+            #but if manager.insert calls _insert_or_update in fact, we shouldn't execute manager.update later.
+            #becauce manager.update will call _insert_or_update too, and the instance will be create twice which will raise error.
+            if non_compo_asso_list:
+                to_update = []
+                for i in non_compo_asso_list:
+                    if not instance.is_delayed_query(i):
+                        to_update.append(i)
+                if to_update:
+                    #To avoid '_insert_or_update' to be called twice
+                    #judge whether child manager rewrite ANManager's '_insert_or_update'
+                    if getattr(manager, '_insert_or_update').im_func is getattr(ANManager, '_insert_or_update').im_func:
+                        try:
+                            manager.update(instance, to_update, old_values)
+                        except AttributeError as e:
+                            if isinstance(e, ManagerImplError):
+                                pass
+                        except UnboundLocalError:
+                            manager.update(instance, to_update)
+                        mark_expire_one(model, instance.pk_dict())
+
+        if composition_asso_model_list:
+            for composition_asso_model in composition_asso_model_list:
+                asso_info = composition_asso_model._meta.path[-1], instance.pk_id()
+                import_handler(composition_asso_model, sess, asso_info)  
+
+
+def abstract_model_import_handler(parent, sess, asso_info):
+    try:
+        for child in parent._meta.children:
+            if not child._meta.abstract:
+                if asso_info:
+                    asso_info = child._meta.path[-1], asso_info[1]
+                non_abstract_model_import_handler(child, sess, asso_info)
+            else:
+                abstract_model_import_handler(child, sess, asso_info)
+    except ValidationError as e:
+        raise ModelQueryException(e)
+    except ModelQueryException as e:
+        raise e
+
+@csrf_exempt
+def configExport(request, model_path):
+    filename = model_path.replace(',', '-')+ '.csv'
+    sess = get_current_session()
+    model = get_model('apv', model_path.split(','))
+    manager = model.get_manager(sess)
+    if hasattr(manager, 'export'):
+        response = manager.export()
+        res_content = response.get('Content-Disposition')
+        if res_content:
+            content_list = res_content.split('filename=')
+            if len(content_list)>1:
+                filename = content_list[1].split('.csv')[0]
+                cur_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
+                filename = filename+"_%s"%cur_time+'.csv'
+    else:
+        response = HttpResponse(mimetype='text/csv')
+        export_handler(model, sess, response)  
+    
+    response['Content-Disposition'] = 'attachment; filename=%s'%filename 
+    return response
+
+@csrf_exempt
+def configExportPDF(request, model_path):
+    filename = model_path.replace(',', '-')+ '.pdf'
+    sess = get_current_session()
+    model = get_model('apv', model_path.split(','))
+    manager = model.get_manager(sess)
+    if hasattr(manager, 'exportPDF'):
+        response = manager.exportPDF()
+        res_content = response.get('Content-Disposition')
+        if res_content:
+            content_list = res_content.split('filename=')
+            if len(content_list)>1:
+                filename = content_list[1].split('.pdf')[0]
+                cur_time = time.strftime("%Y%m%d%H%M%S", time.localtime())
+                filename = filename+"_%s"%cur_time+'.pdf'
+    else:
+        response = HttpResponse(mimetype='text/pdf')
+        export_handler(model, sess, response)  
+    
+    response['Content-Disposition'] = 'attachment; filename=%s'%filename 
+    return response
+
+def export_handler(model, sess, response, filter_dict=None, asso_info=None):
+    manager = model.get_manager(sess)
+    
+    if not filter_dict:
+        if not model._meta.abstract:
+            result = manager.all()
+            non_abstract_model_export_handler(result, model, sess, response, asso_info)
+
+        else:
+            abstract_model_export_handler(model, sess, response, asso_info)
+
+    else:
+        try:
+            result = manager.filter(filter_dict)
+        except ManagerImplError, e:
+            result = manager.get(filter_dict)
+
+        if not model._meta.abstract:
+            non_abstract_model_export_handler(result, model, sess, response, asso_info)
+        else:
+            for child in model._meta.children:
+                instance_list = []
+                for instance in result:
+                    if isinstance(instance, child):
+                        instance_list.append(instance)
+                if instance_list:
+                    asso_info = child._meta.path[-1], asso_info[1]
+                    non_abstract_model_export_handler(instance_list, child, sess, response, asso_info)
+
+
+def abstract_model_export_handler(parent, sess, response, asso_info):
+        for child in parent._meta.children:
+            if not child._meta.abstract:
+                manager = child.get_manager(sess)
+                result = manager.all()
+                non_abstract_model_export_handler(result, child , sess, response, asso_info)
+            else:
+                abstract_model_export_handler(child, sess, response, asso_info)
+
+
+def non_abstract_model_export_handler(result, model, sess, response, asso_info):
+    flag = False
+    if type(result) is list:
+        if result:
+            flag = True
+    elif isinstance(result, QuerySet):
+        if result.count() > 0:
+            flag = True
+    else:
+        flag = True
+        new_result = []
+        new_result.append(result)
+        result = new_result
+
+    if flag:
+        composition_asso_model_list = []
+        data_dict = []
+        for instance in result:
+            composition_asso_model_dict = {}
+            asso_models = []
+            values = []
+            if model._meta.profile:
+                keys = [fieldname for fieldname in instance.get_field_dict(withstats=False).keys()]
+            else:
+                keys = [field.name for field in model._meta.get_config_fields()]
+
+            for key in keys:
+                asso_model_dict = {}
+                field = model._meta.get_field(key)
+                if field.type_name == 'asso':
+                    if field.is_composition_asso():
+                        if not field.hidden:
+                            if len(field.tgt_field[0].tgt_field) > 1:
+                                composition_asso_model = get_model('apv', field.tgt[0].split('.')[:-1])
+                                values.append('COMPOSITION_ASSO_' + composition_asso_model._meta.path[-1])
+
+                                the_pk_dict = instance.pk_dict()
+                                filter_dict = {}
+
+                                tgt_field = field.target_end[0].field
+                                tgt_to_self_idx = 0
+                                for idx in range(tgt_field.asso_count):
+                                    tgt_model = tgt_field.target_end[idx].model
+                                    if not tgt_model._meta.abstract:
+                                        if tgt_model == model:
+                                            tgt_to_self_idx = idx
+                                            break
+                                    else:
+                                        if model in tgt_model._meta.children:
+                                            tgt_to_self_idx = idx
+                                            break                                        
+
+                                if the_pk_dict:
+                                    filter_dict[tgt_field.name] = [dict_combine(the_pk_dict, {'_asso_idx':tgt_to_self_idx})]
+                                else:
+                                    filter_dict[tgt_field.name] = [{'_asso_idx':tgt_to_self_idx}]
+
+                                asso_model_dict[composition_asso_model] = filter_dict
+                                asso_models.append(asso_model_dict)
+                            else:
+                                composition_asso_model = get_model('apv', field.tgt[0].split('.')[:-1])
+
+                                if not field.primary_key:
+
+                                    values.append('COMPOSITION_ASSO_' + composition_asso_model._meta.path[-1])
+
+                                    the_pk_dict = instance.pk_dict()
+                                    filter_dict = {}
+                                    if the_pk_dict:
+                                        filter_dict[field.tgt_field[0].name] = [dict_combine(the_pk_dict, {'_asso_idx':0})]
+                                    else:
+                                        filter_dict[field.tgt_field[0].name] = [{'_asso_idx':0}]
+
+                                    asso_model_dict[composition_asso_model] = filter_dict
+                                    asso_models.append(asso_model_dict)
+                                else:
+                                    val_raw = instance.get_attr_real(field.attname)
+                                    if val_raw is CONDITIONAL_NONE:
+                                        values.append('CONDITIONAL_NONE')
+                                    else:
+                                        values.append(getattr(instance, key))
+                        else:
+                            keys = [key2 for key2 in keys[:] if key2 != key]
+
+                    else:
+                        if not field.hidden:
+                            val_raw = instance.get_attr_real(field.attname)
+                            if val_raw is CONDITIONAL_NONE:
+                                values.append('CONDITIONAL_NONE')
+                            else:
+                                values.append(getattr(instance, key))
+                        else:
+                            keys = [key2 for key2 in keys[:] if key2 != key]
+                else:
+                    val_raw = instance.get_attr_real(field.attname)
+                    if val_raw is CONDITIONAL_NONE:
+                        values.append('CONDITIONAL_NONE')
+                    else:
+                        values.append(getattr(instance, key))
+
+            data_dict.append(collections.OrderedDict(zip(keys, values)))
+            composition_asso_model_dict[instance] = asso_models
+            composition_asso_model_list.append(composition_asso_model_dict)
+
+
+        if not asso_info:
+            write_csv_without_composition_asso(response, keys, data_dict, model._meta.object_name)
+        else:
+            write_csv_with_composition_asso(response, keys, data_dict, asso_info)
+
+        if composition_asso_model_list:
+            for instance in result:
+                for a in composition_asso_model_list:
+                    if a.keys()[0] == instance:
+                        for b in a[instance]:
+                            asso_model = b.keys()[0]
+                            asso_model_cls_name = asso_model._meta.path[-1]
+                            asso_filter_dict = b.values()[0]
+                            export_handler(asso_model, sess, response, asso_filter_dict, asso_info=(asso_model_cls_name, instance.pk_id()))
+
+
+def write_csv_without_composition_asso(response, keys, data_dict, model_info):
+    response.write('#BEGIN %s\r\n'%model_info)
+    try:
+        dict_writer = csv.DictWriter(response, quoting=csv.QUOTE_NONNUMERIC, fieldnames=keys, dialect='excel')
+        dict_writer.writeheader()
+        dict_writer.writerows(data_dict)
+    except csv.Error as e:
+        raise Http404('Configuration export failed: %s' % e)
+    response.write('#END %s\r\n\r\n'%model_info)
+
+
+
+def write_csv_with_composition_asso(response, keys, data_dict, asso_info):
+    response.write('#BEGIN %s OF %s\r\n'%asso_info)
+    try:
+        dict_writer = csv.DictWriter(response, quoting=csv.QUOTE_NONNUMERIC, fieldnames=keys, dialect='excel')
+        dict_writer.writeheader()
+        dict_writer.writerows(data_dict)
+    except csv.Error as e:
+        raise Http404('Configuration export failed: %s' % e)
+    response.write('#END %s OF %s\r\n\r\n'%asso_info)
+
+def basic_handler(request):
+    return HttpResponse(json.dumps(get_system_info()))
+
+def check_login_info(request):
+    C_PATH_CONF_LOGIN_INFO = "/var/crash/webui_login_info.conf"
+    if not os.path.exists(C_PATH_CONF_LOGIN_INFO):
+        f = open(C_PATH_CONF_LOGIN_INFO, "w")
+        f.write("show_information 0")
+        f.close()
+    result = 0
+    with open(C_PATH_CONF_LOGIN_INFO, "r") as f:
+        for line in f.readlines():
+            if 'show_information' in line:
+                target = line.split()
+                if len(target) < 2:
+                    break
+                result = target[1].strip()
+                break
+    return HttpResponse(json.dumps({'is_show': result}))
