From 6cd397cd79dbaa45822b5e0c2cf728093eac9c81 Mon Sep 17 00:00:00 2001 From: ThoughtWorks-dyzhang Date: Mon, 8 Aug 2016 18:00:11 +0800 Subject: [PATCH] add config backup --- README.md | 3 +- db.sqlite3.bak | Bin 0 -> 172032 bytes .../plugins/FileSaver/FileSaver.min.js | 2 + settings/urls.py | 1 + settings/views.py | 49 ++++++++++- templates/base.html | 1 + templates/settings/view.html | 76 ++++++++++++++++++ 7 files changed, 130 insertions(+), 2 deletions(-) create mode 100644 db.sqlite3.bak create mode 100644 resource/AdminLTE/plugins/FileSaver/FileSaver.min.js diff --git a/README.md b/README.md index 9589725..4b0810d 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ 项目起源于好哥们需要一个 7 层负载均衡器,无奈商业负载均衡器成本高昂,操作复杂。又没有特别喜欢(好看,好用)的开源产品,作为一名大 Ops 怎么能没有办法?正好最近在看 Django 框架,尝试自己给 Nginx 画皮,项目诞生!非专业开发,代码凑合看吧。 -> * 项目基于 [Django](https://www.djangoproject.com/) + [AdminLTE](https://www.almsaeedstudio.com/) 构建,在 Ubuntu 14.04 上测试通过; +> * 项目基于 [Django](https://www.djangoproject.com/) + [AdminLTE](https://www.almsaeedstudio.com/) 构建,在 Ubuntu 14.04 上测试通过;为了保证良好的兼容性,请使用 Chrome 浏览器。 > * 因为增加了 iptables 自动控制,所以暂时不支持 docker 方式部署;需要本地测试的同学请使用 vagrant 方式 > * 因为使用了 [nginx_upstream_check_module](http://tengine.taobao.org/document/http_upstream_check.html) 模块,以及为了后续扩展方便,建议大家直接使用 [Tengine](http://tengine.taobao.org/) 替代 Nginx 服务 @@ -14,6 +14,7 @@ * 修复因前方有防火墙导致无法获取后端服务器状态 * 修复因主机头导致后端服务器探测失败 * 新增自定义管理员用户 +* 新增配置通过文件备份和还原 * 更新 Vagrantfile * 修复其他 Bug diff --git a/db.sqlite3.bak b/db.sqlite3.bak new file mode 100644 index 0000000000000000000000000000000000000000..3620bf411ed8e641b813529f330e805371f2819b GIT binary patch literal 172032 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 literal 0 HcmV?d00001 diff --git a/resource/AdminLTE/plugins/FileSaver/FileSaver.min.js b/resource/AdminLTE/plugins/FileSaver/FileSaver.min.js new file mode 100644 index 0000000..7d82588 --- /dev/null +++ b/resource/AdminLTE/plugins/FileSaver/FileSaver.min.js @@ -0,0 +1,2 @@ +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ +var saveAs=saveAs||function(e){"use strict";if(typeof e==="undefined"||typeof navigator!=="undefined"&&/MSIE [1-9]\./.test(navigator.userAgent)){return}var t=e.document,n=function(){return e.URL||e.webkitURL||e},r=t.createElementNS("http://www.w3.org/1999/xhtml","a"),o="download"in r,i=function(e){var t=new MouseEvent("click");e.dispatchEvent(t)},a=/constructor/i.test(e.HTMLElement),f=/CriOS\/[\d]+/.test(navigator.userAgent),u=function(t){(e.setImmediate||e.setTimeout)(function(){throw t},0)},d="application/octet-stream",s=1e3*40,c=function(e){var t=function(){if(typeof e==="string"){n().revokeObjectURL(e)}else{e.remove()}};setTimeout(t,s)},l=function(e,t,n){t=[].concat(t);var r=t.length;while(r--){var o=e["on"+t[r]];if(typeof o==="function"){try{o.call(e,n||e)}catch(i){u(i)}}}},p=function(e){if(/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(e.type)){return new Blob([String.fromCharCode(65279),e],{type:e.type})}return e},v=function(t,u,s){if(!s){t=p(t)}var v=this,w=t.type,m=w===d,y,h=function(){l(v,"writestart progress write writeend".split(" "))},S=function(){if((f||m&&a)&&e.FileReader){var r=new FileReader;r.onloadend=function(){var t=f?r.result:r.result.replace(/^data:[^;]*;/,"data:attachment/file;");var n=e.open(t,"_blank");if(!n)e.location.href=t;t=undefined;v.readyState=v.DONE;h()};r.readAsDataURL(t);v.readyState=v.INIT;return}if(!y){y=n().createObjectURL(t)}if(m){e.location.href=y}else{var o=e.open(y,"_blank");if(!o){e.location.href=y}}v.readyState=v.DONE;h();c(y)};v.readyState=v.INIT;if(o){y=n().createObjectURL(t);setTimeout(function(){r.href=y;r.download=u;i(r);h();c(y);v.readyState=v.DONE});return}S()},w=v.prototype,m=function(e,t,n){return new v(e,t||e.name||"download",n)};if(typeof navigator!=="undefined"&&navigator.msSaveOrOpenBlob){return function(e,t,n){t=t||e.name||"download";if(!n){e=p(e)}return navigator.msSaveOrOpenBlob(e,t)}}w.abort=function(){};w.readyState=w.INIT=0;w.WRITING=1;w.DONE=2;w.error=w.onwritestart=w.onprogress=w.onwrite=w.onabort=w.onerror=w.onwriteend=null;return m}(typeof self!=="undefined"&&self||typeof window!=="undefined"&&window||this.content);if(typeof module!=="undefined"&&module.exports){module.exports.saveAs=saveAs}else if(typeof define!=="undefined"&&define!==null&&define.amd!==null){define([],function(){return saveAs})} diff --git a/settings/urls.py b/settings/urls.py index 1613d17..87de605 100644 --- a/settings/urls.py +++ b/settings/urls.py @@ -22,4 +22,5 @@ url(r'^password/$', views.modify_pass), url(r'^admin/$', views.admin_reset), url(r'^nic/$', views.select_nic), + url(r'^config/(?P.*)/$', views.config_backup), ] diff --git a/settings/views.py b/settings/views.py index d9f44f3..c29addb 100644 --- a/settings/views.py +++ b/settings/views.py @@ -2,7 +2,10 @@ from django.template import RequestContext, loader from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User +from django.core import serializers from django.http import HttpResponse +from proxy.models import * +from main.models import * from lazy_balancer.views import is_auth from nginx.ip import set_firewall from .models import system_settings @@ -64,7 +67,6 @@ def admin_reset(request): @is_auth def select_nic(request): try: - content = "test" post = json.loads(request.body) internal_nic = post['select_nic'] if system_settings.objects.all().count() != 0: @@ -76,3 +78,48 @@ def select_nic(request): except Exception,e: content = { "flag":"Error","content":str(e) } return HttpResponse(json.dumps(content)) + +@is_auth +def config_backup(request,action): + main_config_qc = main_config.objects.all() + upstream_config_qc = upstream_config.objects.all() + proxy_config_qc = proxy_config.objects.all() + if action == "export": + try: + m_config = serializers.serialize('json', main_config_qc) + u_config = serializers.serialize('json', upstream_config_qc) + p_config = serializers.serialize('json', proxy_config_qc) + + config = { + "main_config" : m_config, + "upstream_config" : u_config, + "proxy_config" : p_config, + } + content = { "flag":"Success", "content": config } + except Exception,e: + content = { "flag":"Error","content":str(e) } + + elif action == "import": + try: + post = json.loads(request.body) + + m_config = post['main_config'] + u_config = post['upstream_config'] + p_config = post['proxy_config'] + + main_config_qc.delete() + upstream_config_qc.delete() + proxy_config_qc.delete() + + for obj in serializers.deserialize("json", m_config): + obj.save() + for obj in serializers.deserialize("json", u_config): + obj.save() + for obj in serializers.deserialize("json", p_config): + obj.save() + + content = { "flag":"Success" } + except Exception,e: + content = { "flag":"Error","content":str(e) } + + return HttpResponse(json.dumps(content)) diff --git a/templates/base.html b/templates/base.html index 2166141..ab71eb8 100644 --- a/templates/base.html +++ b/templates/base.html @@ -32,6 +32,7 @@ + diff --git a/templates/settings/view.html b/templates/settings/view.html index f790f44..4d25eee 100644 --- a/templates/settings/view.html +++ b/templates/settings/view.html @@ -73,6 +73,21 @@

网络选择 用于创建防火墙规则 +
+
+
+
+

配置备份 通过文件备份和还原负载均衡配置

+
+
+ + + +
+
+
+
+