From 8597cf5e116012c038e83f763a816ca106cad4d2 Mon Sep 17 00:00:00 2001 From: HuabingZhao Date: Thu, 25 Aug 2016 10:17:35 +0800 Subject: [PATCH] Solve api gateway issue Change-Id: I88fedc04faaf4d799b9dbf4c306aa073cabd6218 Signed-off-by: HuabingZhao --- .../resources/openresty/nginx/conf/mime.types | 94 ----- .../resources/openresty/nginx/conf/nginx.conf | 256 ++++++++++-- .../resources/openresty/nginx/luaext/auth.lua | 15 + .../openresty/nginx/luaext/conf/msbinit.lua | 44 --- .../openresty/nginx/luaext/conf/svcconf.lua | 34 -- .../resources/openresty/nginx/luaext/dao/dao.lua | 120 ------ .../openresty/nginx/luaext/dao/db_access.lua | 74 ---- .../openresty/nginx/luaext/dao/redis_db.lua | 193 --------- .../resources/openresty/nginx/luaext/iui_auth.lua | 41 ++ .../openresty/nginx/luaext/lib/tools/db_cache.lua | 54 --- .../openresty/nginx/luaext/lib/utils/log_util.lua | 28 -- .../openresty/nginx/luaext/lib/utils/svc_util.lua | 59 --- .../nginx/luaext/lib/utils/table_util.lua | 30 -- .../nginx/luaext/loadbalance/balancer.lua | 40 -- .../nginx/luaext/loadbalance/policy/roundrobin.lua | 60 --- .../openresty/nginx/luaext/log/logger.lua | 26 -- .../resources/openresty/nginx/luaext/login.lua | 9 + .../resources/openresty/nginx/luaext/logout.lua | 6 + .../openresty/nginx/luaext/make_authed.lua | 44 +++ .../nginx/luaext/rewrite/commonrewrite.lua | 155 -------- .../nginx/luaext/rewrite/customrewrite.lua | 208 ---------- .../openresty/nginx/luaext/serviceaccess.lua | 15 + .../openresty/nginx/luaext/vendor/shcache.lua | 440 --------------------- .../nginx/msb-enabled/location-ext-mount/README.md | 4 - .../nginx/msb-enabled/location-ext/README.md | 11 - .../resources/openresty/nginx/msb-enabled/msb.conf | 218 ---------- .../resources/openresty/nginx/openrestyService.exe | Bin 59392 -> 0 bytes .../resources/openresty/nginx/openrestyService.xml | 13 - .../openresty/nginx/sites-enabled-mount/README.md | 4 - .../openresty/nginx/sites-enabled/README.md | 15 - .../openresty/nginx/stream-enabled/placeholder.txt | 0 31 files changed, 343 insertions(+), 1967 deletions(-) delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/log_util.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua create mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/openrestyService.exe delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/openrestyService.xml delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md delete mode 100644 msb-core/openresty-ext/src/assembly/resources/openresty/nginx/stream-enabled/placeholder.txt diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types deleted file mode 100644 index 829e8ba..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/mime.types +++ /dev/null @@ -1,94 +0,0 @@ -# -# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -types { - text/html html htm shtml; - text/css css; - text/xml xml rss; - image/gif gif; - image/jpeg jpeg jpg; - application/x-javascript js; - application/atom+xml atom; - - text/mathml mml; - text/plain txt; - text/vnd.sun.j2me.app-descriptor jad; - text/vnd.wap.wml wml; - text/x-component htc; - - image/png png; - image/tiff tif tiff; - image/vnd.wap.wbmp wbmp; - image/x-icon ico; - image/x-jng jng; - image/x-ms-bmp bmp; - image/svg+xml svg svgz; - - application/java-archive jar war ear; - application/json json; - application/mac-binhex40 hqx; - application/msword doc; - application/pdf pdf; - application/postscript ps eps ai; - application/rtf rtf; - application/vnd.ms-excel xls; - application/vnd.ms-powerpoint ppt; - application/vnd.wap.wmlc wmlc; - application/vnd.google-earth.kml+xml kml; - application/vnd.google-earth.kmz kmz; - application/x-7z-compressed 7z; - application/x-cocoa cco; - application/x-java-archive-diff jardiff; - application/x-java-jnlp-file jnlp; - application/x-makeself run; - application/x-perl pl pm; - application/x-pilot prc pdb; - application/x-rar-compressed rar; - application/x-redhat-package-manager rpm; - application/x-sea sea; - application/x-shockwave-flash swf; - application/x-stuffit sit; - application/x-tcl tcl tk; - application/x-x509-ca-cert der pem crt; - application/x-xpinstall xpi; - application/xhtml+xml xhtml; - application/zip zip; - - application/octet-stream bin exe dll; - application/octet-stream deb; - application/octet-stream dmg; - application/octet-stream eot; - application/octet-stream iso img; - application/octet-stream msi msp msm; - application/ogg ogx; - - audio/midi mid midi kar; - audio/mpeg mpga mpega mp2 mp3 m4a; - audio/ogg oga ogg spx; - audio/x-realaudio ra; - audio/webm weba; - - video/3gpp 3gpp 3gp; - video/mp4 mp4; - video/mpeg mpeg mpg mpe; - video/ogg ogv; - video/quicktime mov; - video/webm webm; - video/x-flv flv; - video/x-mng mng; - video/x-ms-asf asx asf; - video/x-ms-wmv wmv; - video/x-msvideo avi; -} \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf index 5c524fc..9a2db3f 100644 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/conf/nginx.conf @@ -1,57 +1,227 @@ -# -# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -#user nobody; -worker_processes auto; -worker_rlimit_nofile 50000; - -error_log logs/error.log warn; -pid logs/nginx.pid; +#user xfs xfs; +worker_processes 1; + +error_log logs/error.log warn; +pid logs/nginx.pid; events { - #linux下打开提高性能 - #use epoll; - worker_connections 2048; - multi_accept on; + worker_connections 1024; } http { - server_tokens off; - include mime.types; - default_type text/html; + include mime.types; + + upstream iui { + server 127.0.0.1:8202; + } + + upstream nsoc { + server 127.0.0.1:8203; + } + + upstream roc { + server 127.0.0.1:8204; + } - #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' - # '$status $body_bytes_sent "$http_referer" ' - # '"$http_user_agent" "$http_x_forwarded_for"'; + upstream umc { + server 127.0.0.1:8205; + } - #access_log logs/access.log main; - access_log off; + upstream ssh { + server 127.0.0.1:8209; + } - sendfile on; - tcp_nopush on; + upstream yamlparser { + server 127.0.0.1:8210; + } + + upstream dac { + server 127.0.0.1:8206; + } + + upstream cmcc { + server 127.0.0.1:8207; + } + + upstream tacker { + server 127.0.0.1:8208; + } + + upstream winery { + server 127.0.0.1:8080; + } + + upstream etsi { + server 127.0.0.1:8211; + } + + upstream openstackadapter { + server 127.0.0.1:8217; + } + + upstream vimadapter { + server 127.0.0.1:8218; + } + + upstream odlsdn { + server 127.0.0.1:8216; + } + # Basic Settings + default_type application/octet-stream; + sendfile on; + tcp_nopush on; + server_names_hash_bucket_size 128; keepalive_timeout 120s; - gzip on; + #the maximum allowed size of the client request body,current 10G + client_max_body_size 10240m; + client_body_buffer_size 128k; + + #set the time wait for connect to proxy_pass target,avoid waiting too long + proxy_connect_timeout 10s; + proxy_read_timeout 120s; + proxy_send_timeout 120s; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header Host $host:$server_port; + proxy_buffers 4 32k; + + #set the nginx_cache parameter + #proxy_cache_path temp/proxy_cache levels=1:2 keys_zone=nginx_cache:10m inactive=1d max_size=100m; + + # Logging + access_log off; - include ../msb-enabled/*.conf; - include ../sites-enabled/*.conf; - include ../sites-enabled-mount/*.conf; -} + # Lua settings + lua_package_path "$prefix/../lualib/?.lua;;"; + lua_package_cpath "$prefix/../lualib/?.so;;"; + + lua_shared_dict ceryx 10M; + lua_code_cache on; + + server { + listen 80; + default_type text/html; + + location = / { + rewrite ^ /iui/framework redirect; + } + + location = /openo { + rewrite ^ /iui/framework redirect; + } + + location = /iui/openo { + rewrite ^ /iui/framework redirect; + } + + location = /iui/framework/login.html { + access_by_lua_file luaext/iui_auth.lua; + proxy_pass http://iui; + } + + location = /api/uiframe/v1/login { + rewrite ^ /api/umcsm/v1/login break; + proxy_pass http://umc; + header_filter_by_lua_file luaext/login.lua; + } + + location = /api/uiframe/v1/loginOut { + access_by_lua_file luaext/logout.lua; + rewrite ^ /api/umcsm/v1/loginOut break; + proxy_pass http://umc; + } + + location = /api/hsif/v1/authentication { + access_by_lua_file luaext/make_authed.lua; + } + + location /iui { + access_by_lua_file luaext/iui_auth.lua; + proxy_pass http://iui; + } + + location ~ ^/api/(?:vim|nsoc)/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://nsoc; + } + + location = /api/nsoc/v1/vnfgrantinfo { + rewrite ^ /api/vim/v1/vnfgrantinfo break; + access_by_lua_file luaext/auth.lua; + proxy_pass http://nsoc; + } + + location /api/nsocnotification/v1 { + rewrite ^/api/nsocnotification/v1/(.*) /nsocnotification/v1/$1 break; + access_by_lua_file luaext/auth.lua; + proxy_pass http://nsoc; + } + + location ~ ^/api/(?:roc|rocnotification)/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://roc; + } + + location /api/uiframe/v1 { + rewrite ^/api/uiframe/v1/(.*) /api/umcsm/v1/$1 break; + access_by_lua_file luaext/iui_auth.lua; + proxy_pass http://umc; + } + + location ~ ^/api/umc(?:pm|fm|drill|sm|monitor)/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://umc; + } + + location ~ ^/api/ssh/v1 { + proxy_pass http://ssh; + } + + location ~ ^/api/yamlparser/v1 { + proxy_pass http://yamlparser; + } + + location ~ ^/api/(?:dac|dacnotification)/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://dac; + } + + location /api/cmccia/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://cmcc; + } + + location /api/tackeria/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://tacker; + } + + location /winery { + access_by_lua_file luaext/auth.lua; + proxy_pass http://winery; + } + + location = /api/microservices/v1/apiRoute { + access_by_lua_file luaext/auth.lua; + content_by_lua_file luaext/serviceaccess.lua; + } + + location /api/umcswagger/v1 { + rewrite ^/api/umcswagger/v1/(.*) /api/$1 break; + access_by_lua_file luaext/auth.lua; + proxy_pass http://umc; + } + + location /api/etsiia/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://etsi; + } -stream { - include ../stream-enabled/*; + location /api/odlsdnia/v1 { + access_by_lua_file luaext/auth.lua; + proxy_pass http://odlsdn; + } + } } diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua new file mode 100644 index 0000000..067c277 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/auth.lua @@ -0,0 +1,15 @@ +local cache = ngx.shared.ceryx +local client_ip = ngx.var.remote_addr +local host = ngx.var.host +if client_ip == '127.0.0.1' or client_ip == host or client_ip == ngx.var.server_addr then + return +end +local succ, err, forcible = cache:replace(client_ip, "place_holder", 3600) +if not succ then + if err == 'not found' then + ngx.log(ngx.WARN, "access record not found for "..client_ip) + ngx.exit(401) + else + ngx.log(ngx.WARN, err) + end +end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua deleted file mode 100644 index cf943c0..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/msbinit.lua +++ /dev/null @@ -1,44 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local modulename = "msbinit" -local _M = {} -_M._VERSION = '1.0.0' - -_M.systemConf = { - ["defaultport"] = "10080", - ["defaultprefix"] = "msb:routing", - ["enablefullsearch"] = true, --whether test against the custom services after common match processing - ["enablerefercheck"] = true, --whether use refer to test against the service names as the last solution - ["enableauthcheck"] = true, --whether add custom auth header or not - ["useconsultemplate"] = false --whether using consul template or not -} -_M.redisConf = { - ["host"] = "127.0.0.1", - ["port"] = 6379, - ["poolsize"] = 100, - ["idletimeout"] = 90000, - ["timeout"] = 1000, - ["dbid"] = 0 -} -_M.cacheConf = { - ["positive_ttl"] = 60, --shcache use,in seconds - ["negative_ttl"] = 2, --shcache use,in seconds - ["lru_ttl"] = 10 --in seconds -} -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua deleted file mode 100644 index df6356e..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/conf/svcconf.lua +++ /dev/null @@ -1,34 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local _M = {} -_M._VERSION = '1.0.0' - -_M.apiRelatedTypes = { - ["api"] = true, - ["admin"] = true, - ["apijson"] = true -} -_M.urlfieldMap = { - ["api"] = "url", - ["admin"] = "metricsUrl", - ["apijson"] = "apijson", - ["iui"] = "url", - ["custom"] = "url" -} -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua deleted file mode 100644 index fb47cca..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/dao.lua +++ /dev/null @@ -1,120 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - ---This module integrates the shcache with an abstraction for various databases(redis and so on) -local _M = {} -_M._VERSION = '1.0.0' - -local shcache = require("vendor.shcache") -local cjson = require "cjson" -local msbConf = require('conf.msbinit') - -local DB = require('dao.redis_db') -local options = msbConf.redisConf - -local cacheConf = msbConf.cacheConf -local positive_ttl = cacheConf.positive_ttl or 60 -local negative_ttl = cacheConf.negative_ttl or 2 - -local svc_shcache = ngx.shared.svc_cache - -local function load_serviceinfo(key) - - -- closure to perform external lookup to redis - local fetch_svcinfo_from_db = function () - local _db = DB:new(options) - return _db:getserviceinfo(key) - end - - local svcinfo_cache_table = shcache:new( - svc_shcache, - { external_lookup = fetch_svcinfo_from_db, - --encode = cmsgpack.pack, - encode = cjson.encode, - --decode = cmsgpack.unpack - decode = cjson.decode - }, - { positive_ttl = positive_ttl, -- default cache good data for 60s - negative_ttl = negative_ttl, -- default cache failed lookup for 5s - name = 'svcinfo_cache' -- "named" cache, useful for debug / report - } - ) - - local serviceinfo, from_cache = svcinfo_cache_table:load(key) - - return serviceinfo -end -_M.load_serviceinfo = load_serviceinfo - -local function load_backservers(keypattern) - - -- closure to perform external lookup to redis - local fetch_servers_from_db = function () - local _db = DB:new(options) - return _db:getbackservers(keypattern) - end - - local servers_cache_table = shcache:new( - svc_shcache, - { external_lookup = fetch_servers_from_db, - --encode = cmsgpack.pack, - encode = cjson.encode, - --decode = cmsgpack.unpack - decode = cjson.decode - }, - { positive_ttl = positive_ttl, -- default cache good data for 60s - negative_ttl = negative_ttl, -- default cache failed lookup for 5s - name = 'servers_cache' -- "named" cache, useful for debug / report - } - ) - - local servers_table, from_cache = servers_cache_table:load(keypattern) - - return servers_table -end -_M.load_backservers = load_backservers - - -local function load_customsvcnames(keypattern) - -- closure to perform external lookup to redis - local fetch_svcnames_from_db = function () - local _db = DB:new(options) - return _db:getcustomsvcnames(keypattern) - end - - local svcnames_cache_table = shcache:new( - svc_shcache, - { external_lookup = fetch_svcnames_from_db, - --encode = cmsgpack.pack, - encode = cjson.encode, - --decode = cmsgpack.unpack - decode = cjson.decode - }, - { positive_ttl = positive_ttl, -- default cache good data for 60s - negative_ttl = negative_ttl, -- default cache failed lookup for 5s - name = 'svcnames_cache' -- "named" cache, useful for debug / report - } - ) - - local service_names, from_cache = svcnames_cache_table:load(keypattern) - - return service_names -end -_M.load_customsvcnames = load_customsvcnames - -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua deleted file mode 100644 index 4848a09..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/db_access.lua +++ /dev/null @@ -1,74 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - --- unified layer to access back DB, using two levels of cache mechanism(LRUCache and shcache) -local _M = {} -_M._VERSION = '1.0.0' - -local cache = require('lib.tools.db_cache') -local dao = require('dao.dao') -local msbConf = require('conf.msbinit') - -local cacheConf = msbConf.cacheConf -local lru_ttl = cacheConf.lru_ttl or 10 - -function _M.load_serviceinfo(key) - local value, err - -- Try to get from cache - value = cache.get(key) - if not value then - -- Get from shcache or backend redis - value = dao.load_serviceinfo(key) - cache.set(key,value,lru_ttl) - end - if cache.is_empty(value) then - return nil - end - return value -end - -function _M.load_backservers(keypattern) - local value, err - -- Try to get from cache - value = cache.get(keypattern) - if not value then - -- Get from shcache or backend redis - value = dao.load_backservers(keypattern) - cache.set(keypattern,value,lru_ttl) - end - if cache.is_empty(value) then - return nil - end - return value -end - -function _M.load_customsvcnames(keypattern) - local value, err - -- Try to get from cache - value = cache.get(keypattern) - if not value then - -- Get from shcache or backend redis - value = dao.load_customsvcnames(keypattern) - cache.set(keypattern,value,lru_ttl) - end - if cache.is_empty(value) then - return nil - end - return value -end -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua deleted file mode 100644 index c5b75c6..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/dao/redis_db.lua +++ /dev/null @@ -1,193 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - --- the client for redis, include the connection pool management and api implements -local redis = require('resty.redis') -local tbl_util = require('lib.utils.table_util') - -local _M = { -} -_M._VERSION = '0.0.1' -_M._DESCRIPTION = 'msb_redis_module' - -local mt = { __index = _M } - -local tbl_insert = table.insert -local tbl_sort = table.sort -local tbl_isempty = tbl_util.isempty - -function _M.new(self, conf) - self.host = conf.host - self.port = conf.port - self.timeout = conf.timeout - self.dbid = conf.dbid - self.poolsize = conf.poolsize - self.idletimeout = conf.idletimeout - - local red = redis:new() - return setmetatable({redis = red}, mt) -end - -function _M.connectdb(self) - local host = self.host - local port = self.port - local dbid = self.dbid - local red = self.redis - - if not (host and port) then - return nil, 'no host:port avaliable provided' - end - - --set default value - if not dbid then dbid = 0 end - local timeout = self.timeout - if not timeout then - timeout = 1000 -- 1s - end - - red:set_timeout(timeout) - - local ok, err - if host and port then - ok, err = red:connect(host, port) - if ok then return red:select(dbid) end - end - - return ok, err -end - -function _M.keepalivedb(self) - local max_idle_timeout = self.idletimeout --ms - local pool_size = self.poolsize - - if not pool_size then pool_size = 100 end - if not max_idle_timeout then max_idle_timeout = 90000 end --90s - - local ok, err = self.redis:set_keepalive(max_idle_timeout, pool_size) - if not ok then - ngx.log(ngx.ERR, "redis pool keepalive error",err) - return - end - return -end - ---inner function,only used in this module -local function _hgetall(red,key) - local resp,err = red:hgetall(key) - --if not resp or next(resp) == nil then - if tbl_isempty(resp) then - return nil, "key "..key.." not found" - end - local hashinfo = red:array_to_hash(resp) - return hashinfo,nil -end - -function _M.getserviceinfo(self,key) - if not key then - return nil,'no key is provided' - end - local c, err = self:connectdb() - if not c then - return nil, err - end - - local red = self.redis - - local resp,err = red:hgetall(key) --the key will create dynamically - --if not resp or next(resp) == nil then - if tbl_isempty(resp) then - self:keepalivedb() - return nil, "key "..key.." not found" - end - - local serviceinfo = red:array_to_hash(resp) - - self:keepalivedb() - - return serviceinfo,nil -end - -function _M.getbackservers(self,keypattern) - if not keypattern then - return nil,'no keypattern is provided' - end - local c, err = self:connectdb() - if not c then - return nil, err - end - - local red = self.redis - - local resp, err = red:keys(keypattern) - if tbl_isempty(resp) then - self:keepalivedb() - return nil, "no server matched" - end - - local servers = {} - for i, v in ipairs(resp) do - local serverinfo,err = _hgetall(red,v) - if serverinfo then - tbl_insert(servers,serverinfo) - end - end - self:keepalivedb() - return servers,nil -end - -function _M.getcustomsvcnames(self,keypattern) - if not keypattern then - return nil,'no keypattern is provided' - end - local c, err = self:connectdb() - if not c then - return nil, err - end - - local red = self.redis - - local resp, err = red:keys(keypattern) - if tbl_isempty(resp) then - self:keepalivedb() - return {}, "no custome service name found" - end - - local svcnames = {} - --store svc names into the Set - local key_set={} - local name - for key, value in ipairs(resp) do - local m, err = ngx.re.match(value, "^.+:custom:([^:]+):.*", "o") - if m then - name = m[1] - key_set[name]=true - end - end - - for key,_ in pairs(key_set) do - tbl_insert(svcnames,key) - end - --sort the key_table in reverse order - tbl_sort(svcnames, function (a, b) - return a > b - end) - - self:keepalivedb() - return svcnames,nil -end -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua new file mode 100644 index 0000000..dd7b2ed --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/iui_auth.lua @@ -0,0 +1,41 @@ +local cache = ngx.shared.ceryx +local client_ip = ngx.var.remote_addr +local uri = ngx.var.uri +if uri == "/iui/framework/login.html" then + local value, flags = cache:get(client_ip) + if not value then + return + else + ngx.redirect("/iui/framework/main-page.html") + end +end + +local referer = ngx.var.http_referer +local refererList = { + "/iui/framework/login.html", + "/iui/framework/css/login.css", + "/iui/component/thirdparty/font%-awesome/css/font%-awesome.min.css", + "/iui/framework/css/style%-custom.css" +} +local function referer_matches(t, r) + for k,_ in pairs(t) do + if string.match(r, t[k]) then + return true + end + end + return false +end + +if referer and referer_matches(refererList, referer) then + return +end + +local succ, err, forcible = cache:replace(client_ip, "place_holder", 3600) +if not succ then + if err == 'not found' then + ngx.log(ngx.WARN, "access record not found for "..client_ip..",redirect to login page") + ngx.redirect("/iui/framework/login.html") + else + ngx.log(ngx.WARN, err) + end +end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua deleted file mode 100644 index 7f40590..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/tools/db_cache.lua +++ /dev/null @@ -1,54 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - --- db cache over LRUCache, used within one worker processes -local _M = {} -_M._VERSION = '1.0.0' - -local lrucache = require "resty.lrucache" - -local EMPTY_DATA = '_EMPTY_' - --- we need to initialize the cache on the lua module level so that --- it can be shared by all the requests served by each nginx worker process: -local cache,err = lrucache.new(200) -- allow up to 200 items in the cache -if not cache then - return ngx.log(ngx.ERR,"failed to create the cache: " .. (err or "unknown")) -end - -function _M.get(key) - return cache:get(key) -end - -function _M.set(key,value) - return _M:set(key, value, nil) -end - -function _M.set(key,value,ttl) - if not value then - value = EMPTY_DATA - end - return cache:set(key, value, ttl) -end - --- check if the data returned by get() is considered empty -function _M.is_empty(data) - return data == EMPTY_DATA -end - -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/log_util.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/log_util.lua deleted file mode 100644 index 67b0e26..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/log_util.lua +++ /dev/null @@ -1,28 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local _M = {} -_M._VERSION = '1.0.0' - -function _M.log(k, v) - --if empty,initialize it - if not ngx.ctx.logtbl then ngx.ctx.logtbl = {} end - ngx.ctx.logtbl[k] = v -end - -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua deleted file mode 100644 index 224b321..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/svc_util.lua +++ /dev/null @@ -1,59 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local _M = {} -_M._VERSION = '1.0.0' - -local tbl_util = require('lib.utils.table_util') -local msbConf= require('conf.msbinit') -local log_util = require('lib.utils.log_util') -local tbl_isempty = tbl_util.isempty -local enableauthcheck = msbConf.systemConf.enableauthcheck -local log = log_util.log - -function _M.isactive(svcinfo) - if tbl_isempty(svcinfo) then - return false - end - if svcinfo["status"] == "1" then - return true - else - return false - end -end - -function _M.isautodiscover(svcinfo) - if tbl_isempty(svcinfo) then - return false - end - if svcinfo["autoDiscover"] == "1" then - return true - else - return false - end -end - -function _M.setauthheader(svcinfo) - --if auth check enabled and this service is inter-system then add sth - if enableauthcheck and svcinfo["visualRange"] == "0" then - ngx.req.set_header("Z-EXTENT", "C012089CF43DE687B23B2C0176B344EE") - log("add Z-EXTENT",true) - end -end - -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua deleted file mode 100644 index c1ddbfe..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/lib/utils/table_util.lua +++ /dev/null @@ -1,30 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local _M = {} -_M._VERSION = '1.0.0' - -function _M.isempty(t) - if t == nil or next(t) == nil then - return true - else - return false - end -end - -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua deleted file mode 100644 index ffd9f0a..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/balancer.lua +++ /dev/null @@ -1,40 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local b = require "ngx.balancer" -local policymodule = require "loadbalance.policy.roundrobin" -local log_util = require('lib.utils.log_util') - -local ngx_ctx = ngx.ctx -local log = log_util.log - -local doservernil = function() - ngx.status = ngx.HTTP_NOT_FOUND - ngx.say("no on-line server found!") - return ngx.exit(ngx.status) -end - -local servers = ngx_ctx.backservers -local svckeypattern = ngx_ctx.svcserverpattern -local server,err = policymodule.get_backserver(servers,svckeypattern) -if not server then - doservernil() -end ---b.set_current_peer(server["ip"]..":"..server["port"]) -b.set_current_peer(server["ip"],server["port"]) -log("upstreamserver",server["ip"]..":"..server["port"]) \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua deleted file mode 100644 index 986d04e..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/loadbalance/policy/roundrobin.lua +++ /dev/null @@ -1,60 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local _M = {} -_M._VERSION = '1.0.0' - -local tbl_util = require('lib.utils.table_util') -local tbl_isempty = tbl_util.isempty - -function _M.get_backserver(servers,svckey) - if tbl_isempty(servers) then return nil,"input server list is empty" end - - local length = #servers - if length==1 then - -- return it directly if there is only one server - return servers[1],nil - end - - local resty_lock = require "resty.lock" - local roundrobin_cache = ngx.shared.rr_cache - - --step1:acquire lock - local opts = {["timeout"] = 0.002,["exptime"] = 0.05}--this can be set using the conf file - local rrlock = resty_lock:new("rr_locks",opts) - local elapsed, err = rrlock:lock(svckey) - if not elapsed then - --return fail("failed to acquire the lock: ", err) - end - --step2:lock successfully acquired!incr the index - local index, err = roundrobin_cache:get(svckey) - if not index then - index = 0 - end - index = index%length+1 - - --step3:update the shm cache with the new index - roundrobin_cache:set(svckey,index) - - --step4:release the lock - local ok, err = rrlock:unlock() - - return servers[index],nil -end - -return _M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua deleted file mode 100644 index 86452ef..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/log/logger.lua +++ /dev/null @@ -1,26 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local cjson = require "cjson" - -local ngx_ctx = ngx.ctx - -if ngx_ctx.logtbl then - local jsonData = cjson.encode(ngx_ctx.logtbl) - ngx.log(ngx.WARN, string.gsub(jsonData,"\\/","/")) -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua new file mode 100644 index 0000000..7d6bfd8 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/login.lua @@ -0,0 +1,9 @@ +local h = ngx.resp.get_headers() +if h["openoauth"] and h["openoauth"] == "true" then + local cache = ngx.shared.ceryx + local client_ip = ngx.var.remote_addr + local succ, err, forcible = cache:set(client_ip, "place_holder", 3600) + if not succ then + ngx.log(ngx.WARN, err) + end +end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua new file mode 100644 index 0000000..e23f787 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/logout.lua @@ -0,0 +1,6 @@ +local cache = ngx.shared.ceryx +local client_ip = ngx.var.remote_addr +local succ, err, forcible = cache:delete(client_ip) +if not succ then + ngx.log(ngx.WARN, err) +end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua new file mode 100644 index 0000000..c4c2d78 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/make_authed.lua @@ -0,0 +1,44 @@ +function ipValidator(ip) + local chunks = {ip:match("(%d+)%.(%d+)%.(%d+)%.(%d+)")} + if #chunks == 4 then + for _,v in pairs(chunks) do + if tonumber(v) > 255 then return R.STRING end + end + return true + end + local chunks = {ip:match(("([a-fA-F0-9]*):"):rep(8):gsub(":$","$"))} + if #chunks == 8 then + for _,v in pairs(chunks) do + if #v > 0 and tonumber(v, 16) > 65535 then return R.STRING end + end + return true + end + return false +end + +if ngx.req.get_method() == "POST" then + ngx.req.read_body() + local body = ngx.req.get_body_data() + local json = require('cjson') + local tab = json.decode(body) + local ip = tab["passIp"] + if not ip then + ngx.log(ngx.WARN, "ip is nil.") + ngx.exit(500) + end + if ipValidator(ip) then + local cache = ngx.shared.ceryx + local succ, err, forcible = cache:set(ip, "place_holder", 3600) + if not succ then + ngx.log(ngx.WARN, err) + ngx.exit(500) + end + else + ngx.log(ngx.WARN, "not a valid ip.") + ngx.exit(500) + end + ngx.exit(201) +else + ngx.log(ngx.WARN, "not a POST request.") + ngx.exit(500) +end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua deleted file mode 100644 index c57880d..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/commonrewrite.lua +++ /dev/null @@ -1,155 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local msbConf = require('conf.msbinit') -local svcConf = require('conf.svcconf') -local dbclient = require('dao.db_access') -local tbl_util = require('lib.utils.table_util') -local svc_util = require('lib.utils.svc_util') -local log_util = require('lib.utils.log_util') - -local tbl_concat = table.concat -local tbl_isempty = tbl_util.isempty -local svc_isactive = svc_util.isactive -local svc_setauthheader = svc_util.setauthheader -local svc_isautodiscover = svc_util.isautodiscover - -local str_sub = string.sub -local str_len = string.len -local str_low = string.lower -local ngx_var = ngx.var -local ngx_ctx = ngx.ctx -local log = log_util.log - -local defaultport = msbConf.systemConf.defaultport -local defaultprefix = msbConf.systemConf.defaultprefix -local enablefullsearch = msbConf.systemConf.enablefullsearch -local useconsultemplate = msbConf.systemConf.useconsultemplate -local apiRelatedTypes = svcConf.apiRelatedTypes -local urlfieldMap = svcConf.urlfieldMap - -local donotfound = function() - if enablefullsearch then - -- test against the custom services after the commonrewrite phase - ngx.status = ngx.HTTP_GONE - else - ngx.status = ngx.HTTP_NOT_FOUND - ngx.say("service info not found!") - end - return ngx.exit(ngx.status) -end - ---------------------------------------------------------------- ---preCheck: --- determine whether it is websocket request --- and do internal redirect ---------------------------------------------------------------- -local http_upgrade = ngx_var.http_upgrade -if(ngx_var.websocket_internal_redirect == "on") and http_upgrade and str_low(http_upgrade) == "websocket" then - ngx.log(ngx.ERR, "Websocket request and redirect to @commonwebsocket") - return ngx.exec("@commonwebsocket"); -end - ---------------------------------------------------------------- ---step0:Preparation --- svc_info_key --- svc_server_keypattern ---------------------------------------------------------------- -local svc_name = ngx_var.svc_name -local req_res = ngx_var.req_res -local svc_type = ngx_var.svc_type - -local sys_prefix = "" -local server_port = ngx_var.server_port -if(server_port == defaultport) then - sys_prefix = defaultprefix -else - sys_prefix = server_port -end - -local svc_info_key = "" -local svc_server_keypattern = "" -local upstream_name_consultemplate = "" -if(apiRelatedTypes[svc_type]) then - -- process version info first - local version1 = ngx_var.svc_version1 - local version2 = ngx_var.svc_version2 - local version = "" - -- check version info appearing befor or after - if(not version2) then version2 = "" end --convert nil to empty sting avoiding throw error - if(not version1 or version1 == "") then - version = version2 - else - version = version1 - req_res = version2..req_res - end - -- remove the slash in front of the version (e.g. /V1.0) - local svc_version=str_sub(version,2,str_len(version)) - svc_info_key = tbl_concat({sys_prefix,"api",svc_name,svc_version,"info"},":") - svc_server_keypattern = tbl_concat({sys_prefix,"api",svc_name,svc_version,"lb:server*"},":") - upstream_name_consultemplate = svc_name -else - svc_info_key = tbl_concat({sys_prefix,"iui",svc_name,"info"},":") - svc_server_keypattern = tbl_concat({sys_prefix,"iui",svc_name,"lb:server*"},":") - upstream_name_consultemplate = "IUI_"..svc_name -end - ---------------------------------------------------------------- ---step1:query the service info from share memory or back db --- svcinfo: the requested service information ---------------------------------------------------------------- -local svcinfo = dbclient.load_serviceinfo(svc_info_key) -if not svc_isactive(svcinfo) then - donotfound() -end - -local svc_url = svcinfo[urlfieldMap[svc_type]] -if not svc_url then - donotfound() -end - ---------------------------------------------------------------- ---step2:rewrite the request uri using the svcinfo ---------------------------------------------------------------- -local rewrited_uri = svc_url..req_res ---special handling: avoid throws internal error when it is empty -if (rewrited_uri == "") then rewrited_uri = "/" end -ngx.req.set_uri(rewrited_uri) - -log("matchedservice",svc_name) -log("rewrited_uri",rewrited_uri) ---------------------------------------------------------------- ---step2.1:if this service is inter-system,add custom http header ---------------------------------------------------------------- -svc_setauthheader(svcinfo) - ---------------------------------------------------------------- ---step3:process the proxy upstream part --- con1-using consul template:set the upstream name --- con2-using msb balancer:query the server list and store in the ctx ---------------------------------------------------------------- -if useconsultemplate and svc_isautodiscover(svcinfo) then - ngx_var.backend = upstream_name_consultemplate -else - local backservers = dbclient.load_backservers(svc_server_keypattern) - if tbl_isempty(backservers) then - donotfound() - end - ngx_ctx.backservers = backservers - ngx_ctx.svcserverpattern = svc_server_keypattern -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua deleted file mode 100644 index 564a52a..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/rewrite/customrewrite.lua +++ /dev/null @@ -1,208 +0,0 @@ ---[[ - - Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - ---]] - -local msbConf = require('conf.msbinit') -local svcConf = require('conf.svcconf') -local dbclient = require('dao.db_access') -local tbl_util = require('lib.utils.table_util') -local svc_util = require('lib.utils.svc_util') -local log_util = require('lib.utils.log_util') - -local tbl_concat = table.concat -local tbl_isempty = tbl_util.isempty -local svc_isactive = svc_util.isactive -local svc_setauthheader = svc_util.setauthheader -local svc_isautodiscover = svc_util.isautodiscover -local str_sub = string.sub -local str_len = string.len -local str_low = string.lower -local ngx_var = ngx.var -local ngx_ctx = ngx.ctx -local log = log_util.log - -local defaultport = msbConf.systemConf.defaultport -local defaultprefix = msbConf.systemConf.defaultprefix -local enablerefercheck = msbConf.systemConf.enablerefercheck -local useconsultemplate = msbConf.systemConf.useconsultemplate -local urlfieldMap = svcConf.urlfieldMap - -local donotfound = function() - ngx.status = ngx.HTTP_NOT_FOUND - ngx.say("service info not found!") - return ngx.exit(ngx.status) -end - ---------------------------------------------------------------- ---preCheck: --- determine whether it is websocket request --- and do internal redirect ---------------------------------------------------------------- -local http_upgrade = ngx_var.http_upgrade -if(ngx_var.websocket_internal_redirect == "on") and http_upgrade and str_low(http_upgrade)== "websocket" then - ngx.log(ngx.ERR, "Websocket request and redirect to @customwebsocket") - return ngx.exec("@customwebsocket"); -end - ---------------------------------------------------------------- ---step0:Preparation --- svcnames:service names registered under this port ---------------------------------------------------------------- -local sys_prefix = "" -local server_port = ngx_var.server_port -if(server_port == defaultport) then - sys_prefix = defaultprefix -else - sys_prefix = server_port -end - -local custom_svc_keypattern = tbl_concat({sys_prefix,"custom","*"},":") - -local get_svcinfokey_custom = function(svcname) - return tbl_concat({sys_prefix,"custom",svcname,"info"},":") -end - -local get_svcserverpattern_custom = function(svcname) - return tbl_concat({sys_prefix,"custom",svcname,"lb:server*"},":") -end - -local svcnames,err = dbclient.load_customsvcnames(custom_svc_keypattern) -if not svcnames then - donotfound() -end - ---------------------------------------------------------------- ---step1:run the match process(check whether the request --- match the name in the svcnames one by one) --- and return the matched serice info ---------------------------------------------------------------- -local req_res = ngx_var.uri -local svc_type = ngx_var.svc_type -local matchedsvcname -local svcinfo ---add by wangyg:20160418 special handler for refer -local matched_usingrefer = false ---end of add by wangyg:20160418 special handler for refer -for _, svcname in ipairs(svcnames) do - if (svcname == "/") then - local svc_info_key = get_svcinfokey_custom(svcname) - local svc_info,err = dbclient.load_serviceinfo(svc_info_key) - if svc_info and svc_isactive(svc_info)then - matchedsvcname = svcname - svcinfo = svc_info - break - end - end - local from, to, err = ngx.re.find(req_res, "^"..svcname.."(/(.*))?$", "jo") - --check whether svcname is the prefix of the req uri - if from then - local svc_info_key = get_svcinfokey_custom(svcname) - local svc_info,err = dbclient.load_serviceinfo(svc_info_key) - if svc_info and svc_isactive(svc_info) then - matchedsvcname = svcname - svcinfo = svc_info - break - end - else - --do nothing - end -end ---------------------------------------------------------------- ---step1.1:additional process,test against the refer --- similar to step1 ---------------------------------------------------------------- ---add by wangyg:20160418 special handler for refer -if not matchedsvcname and enablerefercheck then - local refer = ngx_var.http_referer - if(refer and refer~="") then - for _, svcname in ipairs(svcnames) do - local urlreg ="^(https://|http://|)(([1-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))\\.)(([0-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))\\.){2}([1-9]|([1-9]\\d)|(1\\d\\d)|(2([0-4]\\d|5[0-5])))(:\\d{1,5})?"..svcname.."(/(.*))?$"; - local from, to, err = ngx.re.find(refer, urlreg, "jo") - ----check whether svcname is the prefix of the req refer - if from then - local svc_info_key = get_svcinfokey_custom(svcname) - local svc_info,err = dbclient.load_serviceinfo(svc_info_key) - if svc_info and svc_isactive(svc_info) then - matchedsvcname = svcname - svcinfo = svc_info - matched_usingrefer = true - break - end - end - end - end -end ---end of add by wangyg:20160418 special handler for refer - -if not matchedsvcname or tbl_isempty(svcinfo) then - donotfound() -end - -local svc_url = svcinfo[urlfieldMap[svc_type]] -if not svc_url then - donotfound() -end - ---------------------------------------------------------------- ---step2:rewrite the request uri using the svcinfo ---------------------------------------------------------------- -local rewrited_uri ="" -if (matchedsvcname == "/") then - --special handling: if "/" matched, contact directly - rewrited_uri = svc_url..req_res -else - --rewrited_uri = ngx.re.sub(req_res, "^"..matchedsvcname.."(.*)", svc_url.."$1", "o") - local newuri,n,err = ngx.re.sub(req_res, "^"..matchedsvcname.."(/.*)?", svc_url.."$1", "o") - --add by wangyg:20160418 special handler for refer - if(n==0 and matched_usingrefer) then newuri = svc_url..req_res end --special handling if matched using refer - --end of add by wangyg:20160418 special handler for refer - rewrited_uri = newuri -end -if (rewrited_uri == "") then rewrited_uri = "/" end --avoid throws internal error when it is empty -ngx.req.set_uri(rewrited_uri) - ---set the matched service info,used in the proxy_redirect directive -ngx_var.svc_name = matchedsvcname -ngx_var.svc_url = svc_url - ---log the route info -log("matchedservice",matchedsvcname) -if(matched_usingrefer) then log("matched_usingrefer",true) end -log("rewrited_uri",rewrited_uri) - ---------------------------------------------------------------- ---step2.1:if this service is inter-system,add custom http header ---------------------------------------------------------------- -svc_setauthheader(svcinfo) - ---------------------------------------------------------------- ---step3:process the proxy upstream part --- con1-using consul template:set the upstream name --- con2-using msb balancer:query the backserver list and store in the ctx ---------------------------------------------------------------- -if useconsultemplate and svc_isautodiscover(svcinfo) then - --FIX ME:if svcname contains "/", the upstream name may be illegal - ngx_var.backend = ngx.re.sub(matchedsvcname, "^/(.*)", "$1", "o") -else - local svc_server_keypattern = get_svcserverpattern_custom(matchedsvcname) - local backservers,err = dbclient.load_backservers(svc_server_keypattern) - if tbl_isempty(backservers) then - donotfound() - end - ngx_ctx.backservers = backservers - ngx_ctx.svcserverpattern = svc_server_keypattern -end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua new file mode 100644 index 0000000..1118341 --- /dev/null +++ b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/serviceaccess.lua @@ -0,0 +1,15 @@ +if ngx.req.get_method() == "GET" then + local services = { + {serviceName="odlsdnia",apiJson="/api/odlsdnia/v1/swagger.json"}, + {serviceName="roc",apiJson="/api/roc/v1/swagger.json"}, + {serviceName="tackeria",apiJson="/api/tackeria/v1/swagger.json"}, + {serviceName="etsi",apiJson="/api/etsiia/v1/swagger.json"} + } + local cjson = require "cjson" + local jsonData = cjson.encode(services) + jsonData = string.gsub(jsonData,"\\/","/") + ngx.print(jsonData) +else + ngx.log(ngx.WARN, "not a GET request.") + ngx.exit(500) +end \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua deleted file mode 100644 index 32a9b6c..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/luaext/vendor/shcache.lua +++ /dev/null @@ -1,440 +0,0 @@ --- Copyright (C) 2013 Matthieu Tourne --- @author Matthieu Tourne - --- small overlay over shdict, smart cache load mechanism - -local M = {} - -local resty_lock = require("resty.lock") - -local DEBUG = false - --- defaults in secs -local DEFAULT_POSITIVE_TTL = 10 -- cache for, successful lookup -local DEFAULT_NEGATIVE_TTL = 2 -- cache for, failed lookup -local DEFAULT_ACTUALIZE_TTL = 2 -- stale data, actualize data for - --- default lock options, in secs -local function _get_default_lock_options() - return { - exptime = 1, -- max wait if failing to call unlock() - timeout = 0.5, -- max waiting time of lock() - max_step = 0.1, -- max sleeping interval - } -end - -local function prequire(m) - local ok, err_or_module = pcall(require, m) - if not ok then - return nil, err_or_module - end - return err_or_module -end - -local conf = prequire("conf") -if conf then - DEFAULT_NEGATIVE_TTL = conf.DEFAULT_NEGATIVE_TTL or DEFAULT_NEGATIVE_TTL - DEFAULT_ACTUALIZE_TTL = conf.DEFAULT_ACTUALIZE_TTL or DEFAULT_ACTUALIZE_TTL -end - -local band = bit.band -local bor = bit.bor -local st_format = string.format - --- there are only really 5 states total - -- is_stale is_neg is_from_cache -local MISS_STATE = 0 -- 0 0 0 -local HIT_POSITIVE_STATE = 1 -- 0 0 1 -local HIT_NEGATIVE_STATE = 3 -- 0 1 1 -local STALE_POSITIVE_STATE = 5 -- 1 0 1 - --- stale negative doesn't really make sense, use HIT_NEGATIVE instead --- local STALE_NEGATIVE_STATE = 7 -- 1 1 1 - --- xor to set -local NEGATIVE_FLAG = 2 -local STALE_FLAG = 4 - -local STATES = { - [MISS_STATE] = 'MISS', - [HIT_POSITIVE_STATE] = 'HIT', - [HIT_NEGATIVE_STATE] = 'HIT_NEGATIVE', - [STALE_POSITIVE_STATE] = 'STALE', - -- [STALE_NEGATIVE_STATE] = 'STALE_NEGATIVE', -} - -local function get_status(flags) - return STATES[flags] or st_format('UNDEF (0x%x)', flags) -end - -local EMPTY_DATA = '_EMPTY_' - --- install debug functions -if DEBUG then - local resty_lock_lock = resty_lock.lock - - resty_lock.lock = function (...) - local _, key = unpack({...}) - print("lock key: ", tostring(key)) - return resty_lock_lock(...) - end - - local resty_lock_unlock = resty_lock.unlock - - resty_lock.unlock = function (...) - print("unlock") - return resty_lock_unlock(...) - end -end - - --- store the object in the context --- useful for debugging and tracking cache status -local function _store_object(self, name) - if DEBUG then - print('storing shcache: ', name, ' into ngx.ctx') - end - - local ngx_ctx = ngx.ctx - - if not ngx_ctx.shcache then - ngx_ctx.shcache = {} - end - ngx_ctx.shcache[name] = self -end - -local obj_mt = { - __index = M, -} - --- default function for callbacks.encode / decode. -local function _identity(data) - return data -end - --- shdict: ngx.shared.DICT, created by the lua_shared_dict directive --- callbacks: see shcache state machine for user defined functions --- * callbacks.external_lookup is required --- * callbacks.encode : optional encoding before saving to shmem --- * callbacks.decode : optional decoding when retreiving from shmem --- opts: --- * opts.positive_ttl : save a valid external loookup for, in seconds --- * opts.positive_ttl : save a invalid loookup for, in seconds --- * opts.actualize_ttl : re-actualize a stale record for, in seconds --- * opts.lock_options : set option to lock see : http://github.com/agentzh/lua-resty-lock --- for more details. --- * opts.locks_shdict : specificy the name of the shdict containing the locks --- (useful if you might have locks key collisions) --- uses "locks" by default. --- * opts.name : if shcache object is named, it will automatically --- register itself in ngx.ctx.shcache (useful for logging). -local function new(self, shdict, callbacks, opts) - if not shdict then - return nil, "shdict does not exist" - end - - -- check that callbacks.external_lookup is set - if not callbacks or not callbacks.external_lookup then - return nil, "no external_lookup function defined" - end - - if not callbacks.encode then - callbacks.encode = _identity - end - - if not callbacks.decode then - callbacks.decode = _identity - end - - local opts = opts or {} - - -- merge default lock options with the ones passed to new() - local lock_options = _get_default_lock_options() - if opts.lock_options then - for k, v in pairs(opts.lock_options) do - lock_options[k] = v - end - end - - local name = opts.name - - local obj = { - shdict = shdict, - callbacks = callbacks, - - positive_ttl = opts.positive_ttl or DEFAULT_POSITIVE_TTL, - negative_ttl = opts.negative_ttl or DEFAULT_NEGATIVE_TTL, - - -- ttl to actualize stale data to - actualize_ttl = opts.actualize_ttl or DEFAULT_ACTUALIZE_TTL, - - lock_options = lock_options, - - locks_shdict = opts.lock_shdict or "locks", - - -- STATUS -- - - from_cache = false, - cache_status = 'UNDEF', - cache_state = MISS_STATE, - lock_status = 'NO_LOCK', - - -- shdict:set() pushed out another value - forcible_set = false, - - -- cache hit on second attempt (post lock) - hit2 = false, - - name = name, - } - - local locks = ngx.shared[obj.locks_shdict] - - -- check for existence, locks is not directly used - if not locks then - ngx.log(ngx.CRIT, 'shared mem locks is missing.\n', - '## add to you lua conf: lua_shared_dict locks 5M; ##') - return nil - end - - local self = setmetatable(obj, obj_mt) - - -- if the shcache object is named - -- keep track of the object in the context - -- (useful for gathering stats at log phase) - if name then - _store_object(self, name) - end - - return self -end -M.new = new - --- acquire a lock -local function _get_lock(self) - local lock = self.lock - if not lock then - lock = resty_lock:new(self.locks_shdict, self.lock_options) - self.lock = lock - end - return lock -end - --- remove the lock if there is any -local function _unlock(self) - local lock = self.lock - if lock then - local ok, err = lock:unlock() - if not ok then - ngx.log(ngx.ERR, "failed to unlock :" , err) - end - self.lock = nil - end -end - -local function _return(self, data, flags) - -- make sure we remove the locks if any before returning data - _unlock(self) - - -- set cache status - local cache_status = get_status(self.cache_state) - - if cache_status == 'MISS' and not data then - cache_status = 'NO_DATA' - end - - self.cache_status = cache_status - - return data, self.from_cache -end - -local function _set(self, ...) - if DEBUG then - local key, data, ttl, flags = unpack({...}) - print("saving key: ", key, ", for: ", ttl) - end - - local ok, err, forcible = self.shdict:set(...) - - self.forcible_set = forcible - - if not ok then - local key, data, ttl, flags = unpack({...}) - ngx.log(ngx.ERR, 'failed to set key: ', key, ', err: ', err) - end - - return ok -end - --- check if the data returned by :get() is considered empty -local function _is_empty(data, flags) - return flags and band(flags, NEGATIVE_FLAG) and data == EMPTY_DATA -end - --- save positive, encode the data if needed before :set() -local function _save_positive(self, key, data) - if DEBUG then - print("key: ", key, ". save positive, ttl: ", self.positive_ttl) - end - data = self.callbacks.encode(data) - return _set(self, key, data, self.positive_ttl, HIT_POSITIVE_STATE) -end - --- save negative, no encoding required (no data actually saved) -local function _save_negative(self, key) - if DEBUG then - print("key: ", key, ". save negative, ttl: ", self.negative_ttl) - end - return _set(self, key, EMPTY_DATA, self.negative_ttl, HIT_NEGATIVE_STATE) -end - --- save actualize, will boost a stale record to a live one -local function _save_actualize(self, key, data, flags) - local new_flags = bor(flags, STALE_FLAG) - - if DEBUG then - print("key: ", key, ". save actualize, ttl: ", self.actualize_ttl, - ". new state: ", get_status(new_flags)) - end - - _set(self, key, data, self.actualize_ttl, new_flags) - return new_flags -end - -local function _process_cached_data(self, data, flags) - if DEBUG then - print("data: ", data, st_format(", flags: %x", flags)) - end - - self.cache_state = flags - self.from_cache = true - - if _is_empty(data, flags) then - -- empty cached data - return nil - else - return self.callbacks.decode(data) - end -end - --- wrapper to get data from the shdict -local function _get(self, key) - -- always call get_stale() as it does not free element - -- like get does on each call - local data, flags, stale = self.shdict:get_stale(key) - - if data and stale then - if DEBUG then - print("found stale data for key : ", key) - end - - self.stale_data = { data, flags } - - return nil, nil - end - - return data, flags -end - -local function _get_stale(self) - local stale_data = self.stale_data - if stale_data then - return unpack(stale_data) - end - - return nil, nil -end - -local function load(self, key) - -- start: check for existing cache - local data, flags = _get(self, key) - - -- hit: process_cache_hit - if data then - data = _process_cached_data(self, data, flags) - return _return(self, data) - end - - -- miss: set lock - - -- lock: set a lock before performing external lookup - local lock = _get_lock(self) - local elapsed, err = lock:lock(key) - - if not elapsed then - -- failed to acquire lock, still proceed normally to external_lookup - -- unlock() might fail. - ngx.log(ngx.ERR, "failed to acquire the lock: ", err) - self.lock_status = 'ERROR' - -- _unlock won't try to unlock() without a valid lock - self.lock = nil - else - -- lock acquired successfuly - - if elapsed > 0 then - - -- elapsed > 0 => waited lock (other thread might have :set() the data) - -- (more likely to get a HIT on cache_load 2) - self.lock_status = 'WAITED' - - else - - -- elapsed == 0 => immediate lock - -- it is less likely to get a HIT on cache_load 2 - -- but still perform it (race condition cases) - self.lock_status = 'IMMEDIATE' - end - - -- perform cache_load 2 - data, flags = _get(self, key) - if data then - -- hit2 : process cache hit - - self.hit2 = true - - -- unlock before de-serializing cached data - _unlock(self) - data = _process_cached_data(self, data, flags) - return _return(self, data) - end - - -- continue to external lookup - end - - -- perform external lookup - data, err = self.callbacks.external_lookup() - - if data then - -- succ: save positive and return the data - - _save_positive(self, key, data) - return _return(self, data) - else - ngx.log(ngx.WARN, 'external lookup failed: ', err) - end - - -- external lookup failed - -- attempt to load stale data - data, flags = _get_stale(self) - if data and not _is_empty(data, flags) then - -- hit_stale + valid (positive) data - - flags = _save_actualize(self, key, data, flags) - -- unlock before de-serializing data - _unlock(self) - data = _process_cached_data(self, data, flags) - return _return(self, data) - end - - if DEBUG and data then - -- there is data, but it failed _is_empty() => stale negative data - print('STALE_NEGATIVE data => cache as a new HIT_NEGATIVE') - end - - -- nothing has worked, save negative and return empty - _save_negative(self, key) - return _return(self, nil) -end -M.load = load - -return M \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md deleted file mode 100644 index ce00b06..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext-mount/README.md +++ /dev/null @@ -1,4 +0,0 @@ -README -=============== -Similar to the location-ext directory,but it's just a placeholder folder. -The folder may always be empty and you attach an external folder found outside the container or the virtual machine at the directory. \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md deleted file mode 100644 index 58310a7..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/location-ext/README.md +++ /dev/null @@ -1,11 +0,0 @@ -README -=============== - -The directory to store configuration files that extends locations of the default listening server(e.g 10080). -The config file must be a *.conf file. For example: -#testlocation.conf -~~~ -location = /test { - echo "test ok"; -} -~~~ \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf deleted file mode 100644 index 3a64ff9..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/msb-enabled/msb.conf +++ /dev/null @@ -1,218 +0,0 @@ -# -# Copyright (C) 2016 ZTE, Inc. and others. All rights reserved. (ZTE) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -#the maximum allowed size of the client request body,current 10G -client_max_body_size 10240m; -client_body_buffer_size 128k; - -#set conf for proxy pass -proxy_connect_timeout 10s; -proxy_read_timeout 120s; -proxy_send_timeout 120s; -proxy_set_header X-Real-IP $remote_addr; -proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; -proxy_set_header Host $host:$server_port; -proxy_buffers 4 16k; - -#set the nginx_cache parameter -proxy_cache_path temp/proxy_cache levels=1:2 keys_zone=nginx_cache:100m inactive=1d max_size=1g; -proxy_cache_key $host$uri$is_args$args; -proxy_cache_revalidate on; -proxy_cache_min_uses 3; -proxy_cache_use_stale error timeout updating http_500 http_502 http_503 http_504; -proxy_cache_lock on; - -# Lua settings -lua_package_path "$prefix/../lualib/?.lua;$prefix/luaext/?.lua;;"; -lua_package_cpath "$prefix/../lualib/?.so;;"; -lua_shared_dict rr_cache 1M; -lua_shared_dict rr_locks 100k; - -lua_shared_dict svc_cache 5M; -lua_shared_dict locks 200k; - -lua_code_cache on; - -# Basic reverse proxy server processor -upstream defaultbackend { - server 0.0.0.1; - balancer_by_lua_file luaext/loadbalance/balancer.lua; - #keepalive 10; -} - -server { - listen 10080; - default_type text/html; - - # the flag identify whether to check doing internal redirect or not - set $websocket_internal_redirect "on"; - - location = /msb { - #try_files $uri @defaulthomepage; - rewrite ^ /iui/microservices/default.html redirect; - } - - location = /iui/microservices { - try_files $uri @addslash; - } - - location @addslash { - return 302 $scheme://$http_host$uri/; - } - - location @defaulthomepage { - return 302 $scheme://$http_host/iui/microservices/default.html; - } - - error_page 410 = @commonnotfound; - - location @commonnotfound { - set $svc_type "custom"; - set $svc_name ""; - set $svc_url ""; - set $backend "defaultbackend"; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/customrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_pass http://$backend; - proxy_redirect http://$host:$server_port$svc_url http://$host:$server_port$svc_name; - } - - location @customwebsocket { - set $websocket_internal_redirect "off"; - #set header for websocket - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "Upgrade"; - - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $host:$server_port; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/customrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_pass http://$backend; - } - - location @commonwebsocket { - set $websocket_internal_redirect "off"; - #set header for websocket - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "Upgrade"; - - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header Host $host:$server_port; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/commonrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_pass http://$backend; - } - - location / { - set $svc_type "custom"; - set $svc_name ""; - set $svc_url ""; - set $backend "defaultbackend"; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/customrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_pass http://$backend; - proxy_redirect http://$host:$server_port$svc_url http://$host:$server_port$svc_name; - } - - location ~ ^/(api|admin|apijson)(/[Vv]\d+(?:\.\d+)*)?/([^/]+)(/[Vv]\d+(?:\.\d+)*)?(.*) { - set $svc_type $1; - set $svc_name $3; - set $svc_version1 $2; - set $svc_version2 $4; - set $req_res $5; - set $backend "defaultbackend"; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/commonrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_pass http://$backend; - } - - location ~* ^/iui/([^/]+)(.*)\.(png|jpg|jpeg|gif|ico|bmp|woff)$ { - set $svc_type "iui"; - set $svc_name $1; - set $req_res $2.$3; - set $backend "defaultbackend"; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/commonrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_cache nginx_cache; - add_header X-Cache-Status $upstream_cache_status; - proxy_pass http://$backend; - } - - location ~ ^/iui/([^/]+)(.*) { - set $svc_type "iui"; - set $svc_name $1; - set $req_res $2; - set $backend "defaultbackend"; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/commonrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_pass http://$backend; - } - - location ~* \.(?:png|jpg|jpeg|gif|ico|bmp|woff)$ { - set $svc_type "custom"; - set $svc_name ""; - set $svc_url ""; - set $backend "defaultbackend"; - - #rewrite by the lua file - rewrite_by_lua_file luaext/rewrite/customrewrite.lua; - #log by the lua file - log_by_lua_file luaext/log/logger.lua; - - proxy_cache nginx_cache; - add_header X-Cache-Status $upstream_cache_status; - proxy_pass http://$backend; - proxy_redirect http://$host:$server_port$svc_url http://$host:$server_port$svc_name; - } - - location = /favicon.ico { - log_not_found off; - } - include ../msb-enabled/location-ext/*.conf; - include ../msb-enabled/location-ext-mount/*.conf; -} \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/openrestyService.exe b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/openrestyService.exe deleted file mode 100644 index c6e8fc2900bed695c4e712dd7121b59deb601a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59392 zcmbrn34B!56+eFFy_q*l)=9!7VUeJKLlz)mR}?}LAexOVENYEIGQdER7vD@+L?|e( zg;wgmR&n22vD9koZnf^B)wYV_QfsZXty)Zotbx9gSYJtPb6ZKT*&Usnl@%Cot8S?yYH;ba;_TNuoZQ|a&6VNG zAbJy=fZ`ti6}}}LcH!TA71mU_nakyupZSOfzwU2@dd)wFC|CYVeQnYf|M*LyW(m9K zHp6D7e@a}G33}fbM5ELB|EF*XkuOcg2YPWDJvkBGm;hb-1^{tVSCl*br-bOV$yVIz z0#lU@bz`Lm)1{;}=1;bwJthRXtb{Ui8_);C?C*6QnRj>nX&3!j|7gkP!q4a2w*8*VGWWf<_x*=TgQu;^c;>nF zPsg75;^+50dC4==Z>jS>7o5A|sOxv%6Zl@+6)T<|^_wj(|LN5YkvZSY{NSIoFtfe1 z>9{!`?pb={@89_RXHT~0WL^1}Z#Hynf9;)z_AQz5>Yth}ZG7(FE5CcI?Zodsa>?{B zp6c(?r@9FyB|loY0QRF56qL-P913TnI$O{(Zf!H;))9ydhXCaxEin4Sg$VCF78VvR zLMUDgIHMGr@~6U*@P$xNrPWKmaY17aGzN@8iZ1y!MMfMZYLwoQp7}`5JX3MPuv25A zCd#CgrN`Li*SDZA-6+T?)a^Nx17t8yKQtl_!8|?36&?jWu`OpoDo?ixUDUtj?6mL> zg#Cg2D6AHS2?xSs02z7YHjhAH3xtuxlnbDR?^825mFGLjaY+fSEr4bGpLQ2QHs9N=oF;U(I(-ep)X*VVSLO!+=!`~R;n3=%QbT!yKgX za2+aHsTRgCM>)$&yk->(3x=m5SdrzmnvlH^35*nV3x?JPr2R5N znepjJmKDl(hw?pJXCSP3^E7{+JI@ow5HKbN-SL?$;gi14IE+ZX5i}~sg;8H)ZNO?p z?#9j<9w)PqP8w|X5y&^sduW6g?J61P`|`35jX*WDysXfcAX+3ZOBpxJ7U9qq49+AE z1xbc6B;CQRe1D!d&tLKl>@m+5Mj9hO5Df6hH2To!YbTGi&Ocm1et?E7+{MMn&j@CO ze!wABEQiv=vr+6VFgkaVC0$Z<(#u;gNetl@E@wVQfIH~(1~Ur7`COLFU}jobMp*Y8 zrYu1pPbtPkFV91UQF??L(4{A7`j*q7Ps`E5b5WGuEf%O!(qUtZP<;Mz#=dzR1gwvs z-8>#4a~>c(AF$;-)}X8S&kqxSzUbufu@?H!5tzF;O}HAVVNnb4$f zqIfMZ(`#Z54fuGbFqBAmAsFShd>Ew+3{7gwEk+cKk;ehdmDiDA36&7-YJ$N8G$Uku zKW5fL2&1qvLpMTR^8`?3f7Hwq@zn*BO@%p6Clr|7fS^`>+|~LMz?ZT zIJPO0vg#SzIGkpQ%4RYtf2^_@?o$&wumA?#V$Rk??mHfo7;0Pq!%UiChPPs-r@T

O;XRU&Wuh3k_wBH+&ikdx41%kfO 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 HzZCdiu4TJ* diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/openrestyService.xml b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/openrestyService.xml deleted file mode 100644 index ced7188..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/openrestyService.xml +++ /dev/null @@ -1,13 +0,0 @@ - - msb_openresty - msb_openresty - This service runs openresty. - %BASE% - - nginx.exe - nginx.exe - -s - stop - rotate - - \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md deleted file mode 100644 index 6b443bc..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled-mount/README.md +++ /dev/null @@ -1,4 +0,0 @@ -README -=============== -Similar to the sites-enabled directory,but it's just a placeholder folder. -The folder may always be empty and you attach an external folder found outside the container or the virtual machine at the directory. \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md deleted file mode 100644 index d57d687..0000000 --- a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/sites-enabled/README.md +++ /dev/null @@ -1,15 +0,0 @@ -README -=============== - -The directory to store configuration files that configs another server except the default listening server(e.g 10080). -The config file must be a *.conf file. For example: -#server1.conf -~~~ -server { - listen 20080; - - location =/info { - echo "another server 20080"; - } -} -~~~ \ No newline at end of file diff --git a/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/stream-enabled/placeholder.txt b/msb-core/openresty-ext/src/assembly/resources/openresty/nginx/stream-enabled/placeholder.txt deleted file mode 100644 index e69de29..0000000 -- 2.16.6