diff --git a/README.md b/README.md index f04c9eac..56eafa2b 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # archer -基于inception的自动化SQL操作平台,支持工单、审核、邮件、OSC等功能,支持MySQL查询、动态脱敏、查询权限管理、慢查询管理,自适应手机等小屏设备 +基于inception的自动化SQL操作平台,支持工单、审核、定时任务、邮件、OSC等功能,额外可配置功能有MySQL查询、动态脱敏、查询权限管理、慢查询管理、阿里云RDS管理等,页面可自适应小屏设备, ### 开发语言和推荐环境 python:3.4及以上 @@ -15,8 +15,10 @@ 为什么要有人工审核? 这是遵循运维领域线上操作的流程意识,一个工程师要进行线上数据库SQL更新,最好由另外一个工程师来把关 很多时候DBA并不知道SQL的业务含义,所以人工审核最好由其他研发工程师或研发经理来审核. 这是archer的设计理念 -* 回滚数据展示 +* 回滚数据展示 工单内可展示回滚语句,支持一键提交回滚工单 +* 定时执行SQL + 审核通过的工单可由申请人或者审核人选择定时执行,执行前可修改执行时间,可随时终止 * pt-osc执行 支持pt-osc执行进度展示,并且可以点击中止pt-osc进程 * MySQL查询 @@ -31,11 +33,19 @@ 基于percona-toolkit的pt_query_digest分析和存储慢日志,并在web端展现 * 邮件通知 可配置邮件提醒,对上线申请、权限申请、审核结果等进行通知 - 对异常登录进行通知 + 对异常登录进行通知 +* 主库集群配置 +* 用户权限配置 + 工程师角色(engineer)与审核角色(review_man):工程师可以发起SQL上线,在通过了inception自动审核之后,需要由人工审核点击确认才能执行SQL.
+ 还有一个特殊的超级管理员即可以上线、审核,又可以登录admin界面进行管理 +* 历史工单管理,查看、修改、删除 +* 可通过django admin进行匹配SQL关键字的工单搜索 +* 发起SQL上线,可配置的邮件提醒审核人进行审核 +* 在发起SQL上线前,自助SQL审核,给出建议 ### 设计规范 * 合理的数据库设计和规范很有必要,尤其是MySQL数据库,内核没有oracle、db2、SQL Server等数据库这么强大,需要合理设计,扬长避短。互联网业界有成熟的MySQL设计规范,特此撰写如下。请读者在公司上线使用archer系统之前由专业DBA给所有后端开发人员培训一下此规范,做到知其然且知其所以然。 -下载链接: https://github.com/hhyo/archer/blob/master/src/docs/mysql_db_design_guide.docx +下载链接: https://github.com/jly8866/archer/blob/master/src/docs/mysql_db_design_guide.docx ### 主要配置文件 * archer/archer/settings.py @@ -44,38 +54,49 @@ * docker镜像,参考wiki: * inception镜像: https://dev.aliyun.com/detail.html?spm=5176.1972343.2.12.7b475aaaLiCfMf&repoId=142093 * archer镜像: https://dev.aliyun.com/detail.html?spm=5176.1972343.2.38.XtXtLh&repoId=142147 +* docker镜像制作感谢@小圈圈 提供 ### 一键安装脚本 -* 可快速安装好archer环境,但inception还需自行安装 -[centos7_install](https://github.com/hhyo/archer/blob/master/src/script/centos7_install.sh) +* 可快速安装好archer环境,inception还需自行安装配置 +[centos7_install](https://github.com/jly8866/archer/blob/master/src/script/centos7_install.sh) ### 手动安装步骤 1. 环境准备: -(1)克隆代码到本地 -`git clone git@github.com:hhyo/archer.git` +(1)克隆代码到本地或者下载zip包 +`git clone https://github.com/jly8866/archer.git` (2)安装inception,[项目地址](http://mysql-inception.github.io/inception-document/install/) -2. 安装python3,版本号>=3.4:(由于需要修改官方模块,请使用virtualenv或venv等单独隔离环境!) +2. 安装python3,版本号>=3.4:(由于需要修改官方模块,请使用virtualenv或venv等单独隔离环境!) 3. 安装所需相关模块: -`pip3 install -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/web/simple/` -centos如果安装ladp报错需要执行yum install openldap-devel,其他系统请自行查找解决方案,如果不需要集成ladp也可以不安装 -4. MySQLdb模块兼容inception版本信息: -使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/目录下的文件 +`pip3 install -r requirements.txt` +为了自动构建docker镜像,requirements.txt的包是完整的依赖包,用户可按照说明进行选择性安装 +4. MySQLdb模块兼容inception版本信息 +由于python3使用的pymysql模块里并未兼容inception返回的server信息,因此需要编辑/pymysql/connections.py +在if int(self.server_version.split('.', 1)[0]) >= 5: 这一行之前加上以下这一句并保存,记得别用tab键用4个空格缩进: +self.server_version = '5.6.24-72.2-log' +最后看起来像这样: +![image](https://github.com/jly8866/archer/raw/master/screenshots/pymysql.png) + +或者可以直接使用src/docker/pymysql目录下的文件替换/path/to/python3/lib/python3.4/site-packages/pymysql/对应文件即可 ### 启动前准备 1. 创建archer本身的数据库表: (1)修改archer/archer/settings.py所有的地址信息,包括DATABASES和INCEPTION_XXX部分 -(2)通过model创建archer本身的数据库表 +(2)通过model创建archer本身的数据库表 + ``` python3 manage.py makemigrations sql python3 manage.py migrate ``` 2. 创建admin系统root用户(该用户可以登录django admin来管理model): - `python3 manage.py createsuperuser` + ```python3 manage.py createsuperuser``` 3. 启动,有两种方式: -(1)用django内置runserver启动服务,仅开发环境使用,不要在生产环境使用 +(1)用django内置runserver启动服务,建议不要在生产环境使用 `bash debug.sh` (2)用gunicorn+nginx启动服务 + 安装模块 + `gunicorn==19.7.1` nginx配置示例 + ``` server{ listen 9123; #监听的端口 @@ -105,38 +126,61 @@ centos如果安装ladp报错需要执行yum install openldap-devel,其他系 } } ``` - 启动 - `bash startup.sh` + 启动 `bash startup.sh` 4. 正式访问: 使用上面创建的管理员账号登录`http://X.X.X.X:port/` ### 其他功能集成 +#### 在线查询&脱敏查询 +1. settings中QUERY改为True +2. 到【后台数据管理】-【从库地址】页面添加从库信息 +3. 到【后台数据管理】-【工作流配置】页面配置审核流程 +4. 用户申请权限、审核通过后即可进行在线查询 +5. 如需要使用动态脱敏,请将settings中DATA_MASKING_ON_OFF改为True,并且到【后台数据管理】-【脱敏配置】页面配置脱敏规则和字段 + #### 慢日志管理 -1. 安装percona-toolkit(版本>3.0),以centos为例 +1. settings中SLOWQUERY改为True +2. 安装percona-toolkit(版本>3.0),以centos为例 + + ``` yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm yum -y install percona-toolkit.x86_64 -2. 使用src/script/mysql_slow_query_review.sql创建慢日志收集表到archer数据库 -3. 将src/script/analysis_slow_query.sh部署到各个监控机器,注意修改配置信息 -4. 如果有阿里云RDS实例,可以在后台数据管理添加关联关系 + ``` +3. 使用src/script/mysql_slow_query_review.sql创建慢日志收集表到archer数据库 +4. 将src/script/analysis_slow_query.sh部署到各个监控机器,注意修改脚本里面的 `hostname="${mysql_host}:${mysql_port}" `与archer主库配置信息一致,否则将无法筛选到相关记录 -#### 集成SQLAdvisor +#### SQLAdvisor优化工具 1. 安装SQLAdvisor,[项目地址](https://github.com/Meituan-Dianping/SQLAdvisor) -2. 修改配置文件SQLADVISOR为程序路径,路径需要完整,如'/opt/SQLAdvisor/sqladvisor/sqladvisor' +2. 修改配置文件SQLADVISOR为程序路径,路径需要完整,如'/opt/SQLAdvisor/sqladvisor/sqladvisor' + +#### 阿里云rds管理 +1. 修改配置文件ALIYUN_RDS_MANAGE=True +2. 安装模块 + +``` +pip3 install aliyun-python-sdk-core==2.3.5 +pip3 install aliyun-python-sdk-core-v3==2.5.3 +pip3 install aliyun-python-sdk-rds==2.1.1 +``` +3. 在【后台数据管理】-【阿里云认证信息】页面,添加阿里云账号的accesskey信息,重新启动服务 +4. 在【后台数据管理】-【阿里云rds配置】页面,添加实例信息,即可实现对阿里云rds的进程管理、慢日志管理 #### admin后台加固,防暴力破解 1. patch目录下,名称为:django_1.8.17_admin_secure_archer.patch -2. 使用命令: -`patch python/site-packages/django/contrib/auth/views.py django_1.8.17_admin_secure_archer.patch` +2. 使用命令: + +``` +patch python/site-packages/django/contrib/auth/views.py django_1.8.17_admin_secure_archer.patch +``` #### 集成ldap -1. settings中ENABLE_LDAP改为True,可以启用ldap账号登陆 +1. settings中ENABLE_LDAP改为True,安装相关模块,可以启用ldap账号登陆,以centos为例 +``` +yum install openldap-devel +pip install django-auth-ldap==1.3.0 +``` 2. 如果使用了ldaps,并且是自签名证书,需要打开settings中AUTH_LDAP_GLOBAL_OPTIONS的注释 -3. settings中以AUTH_LDAP开头的配置,需要根据自己的ldap对应修改 - -#### 集成阿里云rds管理 -1. 修改配置文件ENABLE_ALIYUN=True -2. 在【后台数据管理】-【阿里云认证信息】页面,添加阿里云账号的accesskey信息,重新启动服务 -3. 在【后台数据管理】-【阿里云rds配置】页面,添加实例信息,即可实现对阿里云rds的进程管理、慢日志管理 +3. settings中以AUTH_LDAP开头的配置,需要根据自己的ldap对应修改 ### 部分功能使用说明 1. 用户角色配置 @@ -144,20 +188,20 @@ centos如果安装ladp报错需要执行yum install openldap-devel,其他系 工程师角色(engineer)与审核角色(review_man),工程师可以发起SQL上线,审核人进行审核,超级管理员可以登录admin界面进行管理 2. 配置主库地址 在【后台数据管理】-【主库地址】页面管理主库 - 主库地址用户SQL上线,DDL、DML、慢日志查看、SQL优化等功能 + 主库地址用于SQL上线,DDL、DML、慢日志查看、SQL优化等功能 3. 配置从库地址 在【后台数据管理】-【从库地址】页面管理从库 - 从库地址用户SQL查询功能 + 从库地址用于SQL查询功能 4. 配置查询权限审核流程 在【后台数据管理】-【工作流配置】页面管理审核流程 ### 系统展示截图: 1. 工单展示页 -![image](https://github.com/hhyo/archer/blob/master/src/screenshots/allworkflow.png) +![image](https://github.com/hhyo/archer/blob/master/src/screenshots/allworkflow.png) 2. 自助审核SQL -![image](https://github.com/hhyo/archer/blob/master/src/screenshots/autoreview.png) +![image](https://github.com/hhyo/archer/blob/master/src/screenshots/autoreview.png) 3. 提交SQL工单 -![image](https://github.com/hhyo/archer/blob/master/src/screenshots/submitsql.png) +![image](https://github.com/hhyo/archer/blob/master/src/screenshots/submitsql.png) 4. SQL自动审核、人工审核、执行结果详情页: ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/waitingforme.png) 5. 用户登录页 @@ -176,7 +220,7 @@ centos如果安装ladp报错需要执行yum install openldap-devel,其他系 ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/applyforprivileges.png) 12. SQL慢查日志统计 ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/slowquery.png) -13. SQL慢查日志明细、一键优化 +13. SQL慢查日志明细、SQLAdvisor一键优化 ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/slowquerylog.png) 14. SQLAdvisor ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/sqladvisor.png) @@ -188,8 +232,6 @@ centos如果安装ladp报错需要执行yum install openldap-devel,其他系 ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/workflowconfig.png) 18. 脱敏规则配置 ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/datamaskingrules.png) -19. 脱敏字段配置 -![image](https://github.com/hhyo/archer/blob/master/src/screenshots/datamaskingcolumns.png) ### 联系方式: QQ群:524233225 @@ -197,8 +239,10 @@ QQ群:524233225 ### 部分小问题解决办法: 1. 报错: ![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug1.png)  -![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug2.png) +![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug2.png) 原因:python3的pymysql模块会向inception发送SHOW WARNINGS语句,导致inception返回一个"Must start as begin statement"错误被archer捕捉到报在日志里. 解决:如果实在忍受不了,请修改/path/to/python3/lib/python3.4/site-packages/pymysql/cursors.py:338行,将self._show_warnings()这一句注释掉,换成pass,如下: -![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug3.png) +![image](https://github.com/hhyo/archer/blob/master/src/screenshots/bugs/bug3.png) 但是此方法有副作用,会导致所有调用该pymysql模块的程序不能show warnings,因此强烈推荐使用virtualenv或venv环境! + + diff --git a/archer/settings.py b/archer/settings.py index 3279f43d..e22e9b52 100644 --- a/archer/settings.py +++ b/archer/settings.py @@ -244,17 +244,25 @@ # on是开,会首先用正则表达式匹配sqlContent,如果匹配到高危DDL操作,则判断为“自动审核不通过”;off是关,直接将所有的SQL语句提交给inception,对于上述高危DDL操作,只备份元数据 CRITICAL_DDL_ON_OFF = 'off' -# 在线查询当inception语法树打印失败时的控制,on是开启校验,失败不允许继续执行并返回错误,off是关闭校验,继续执行,允许执行会导致解析失败的查询表权限验证和脱敏功能失效 +# 是否开启SQL查询功能,关闭会隐藏菜单和相关功能 +QUERY = False + +# 当inception语法树打印失败时在线查询的结果控制, +# True是开启校验,失败不允许继续执行并返回错, +# False是关闭校验,继续执行,关闭校验会导致解析失败的查询表权限验证和脱敏功能失效 CHECK_QUERY_ON_OFF = True -# 是否开启动态脱敏查询,由于采取遍历处理结果集的方式,会影响部分查询效率 -DATA_MASKING_ON_OFF = True +# 是否开启动态脱敏查询,采取正则遍历处理结果集的方式,会影响部分查询效率 +DATA_MASKING_ON_OFF = False # 管理员在线查询的结果集限制 ADMIN_QUERY_LIMIT = 5000 -# sqladvisor的路径配置 +# 是否开启慢日志管理,关闭会隐藏菜单和相关功能 +SLOWQUERY = False + +# sqladvisor的路径配置,如'/opt/SQLAdvisor/sqladvisor/sqladvisor',''代表关闭,隐藏菜单和相关功能 SQLADVISOR = '' -# 是否开启AliYun相关功能 -ENABLE_ALIYUN = False +# 是否开启AliYunRDS管理 +ALIYUN_RDS_MANAGE = False diff --git a/requirements.txt b/requirements.txt index 482e3d5f..7814204b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,9 +12,10 @@ shellescape==3.4.1 simplejson==3.13.2 urllib3==1.22 django-admin-bootstrapped==2.5.7 +django-apscheduler==0.2.8 +#后面为非必要模块,可按需安装 gunicorn==19.7.1 django-auth-ldap==1.3.0 -django-apscheduler==0.2.8 aliyun-python-sdk-core==2.3.5 aliyun-python-sdk-core-v3==2.5.3 aliyun-python-sdk-rds==2.1.1 diff --git a/sql/const.py b/sql/const.py index 227821e9..1e66fb42 100644 --- a/sql/const.py +++ b/sql/const.py @@ -7,7 +7,7 @@ class Const(object): 'autoreviewing': '自动审核中', 'manreviewing': '等待审核人审核', 'pass': '审核通过', - 'tasktiming': '定时执行', + 'timingtask': '定时执行', 'executing': '执行中', 'autoreviewwrong': '自动审核不通过', 'exception': '执行有异常', diff --git a/sql/jobs.py b/sql/jobs.py index 82c41d2a..e37dc963 100644 --- a/sql/jobs.py +++ b/sql/jobs.py @@ -32,44 +32,18 @@ # 添加/修改sql执行任务 -def add_sqlcronjob(request): - workflowId = request.POST.get('workflowid') - run_date = request.POST.get('run_date') - if run_date is None or workflowId is None: - context = {'errMsg': '时间不能为空'} - return render(request, 'error.html', context) - elif run_date < datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'): - context = {'errMsg': '时间不能小于当前时间'} - return render(request, 'error.html', context) - workflowDetail = workflow.objects.get(id=workflowId) - if workflowDetail.status not in ['审核通过', '定时执行']: - context = {'errMsg': '必须为审核通过或者定时执行状态'} - return render(request, 'error.html', context) - - run_date = datetime.datetime.strptime(run_date, "%Y-%m-%d %H:%M:%S") - url = getDetailUrl(request) + str(workflowId) + '/' - job_id = Const.workflowJobprefix['sqlreview'] + '-' + str(workflowId) - +def add_sqlcronjob(job_id, run_date, workflowId, url): + scheduler = BackgroundScheduler() + scheduler.add_jobstore(DjangoJobStore(), "default") + scheduler.add_job(execute_job, 'date', run_date=run_date, args=[workflowId, url], id=job_id, + replace_existing=True) + register_events(scheduler) try: - scheduler = BackgroundScheduler() - scheduler.add_jobstore(DjangoJobStore(), "default") - scheduler.add_job(execute_job, 'date', run_date=run_date, args=[workflowId, url], id=job_id, - replace_existing=True) - register_events(scheduler) - try: - scheduler.start() - logger.debug("Scheduler started!") - except SchedulerAlreadyRunningError: - logger.debug("Scheduler is already running!") - workflowDetail.status = Const.workflowStatus['tasktiming'] - workflowDetail.save() - except Exception as e: - context = {'errMsg': '任务添加失败,错误信息:' + str(e)} - return render(request, 'error.html', context) - else: - logger.debug('add_sqlcronjob:' + job_id + "run_date:" + run_date.strftime('%Y-%m-%d %H:%M:%S')) - - return HttpResponseRedirect(reverse('sql:detail', args=(workflowId,))) + scheduler.start() + logger.debug("Scheduler started!") + except SchedulerAlreadyRunningError: + logger.debug("Scheduler is already running!") + logger.debug('add_sqlcronjob:' + job_id + "run_date:" + run_date.strftime('%Y-%m-%d %H:%M:%S')) # 删除sql执行任务 diff --git a/sql/processor.py b/sql/processor.py index 1094ca48..96703bf7 100644 --- a/sql/processor.py +++ b/sql/processor.py @@ -3,43 +3,34 @@ from django.conf import settings leftMenuBtnsCommon = ( - {'key': 'allworkflow', 'name': '查看历史工单', 'url': '/allworkflow/', 'class': 'glyphicon glyphicon-home'}, - {'key': 'submitsql', 'name': '发起SQL上线', 'url': '/submitsql/', 'class': 'glyphicon glyphicon-asterisk'}, - {'key': 'sqlquery', 'name': 'SQL在线查询', 'url': '/sqlquery/', 'class': 'glyphicon glyphicon-search'}, - {'key': 'slowquery', 'name': 'SQL慢查日志', 'url': '/slowquery/', 'class': 'glyphicon glyphicon-align-right'}, - {'key': 'sqladvisor', 'name': 'SQL优化工具', 'url': '/sqladvisor/', 'class': 'glyphicon glyphicon-wrench'}, - {'key': 'queryapply', 'name': '查询权限管理', 'url': '/queryapplylist/', 'class': 'glyphicon glyphicon-eye-open'}, - {'key': 'workflow', 'name': '工单审核管理', 'url': '/workflow/', 'class': 'glyphicon glyphicon-shopping-cart'}, -) - -leftMenuBtnsAliYun = ( - {'key': 'diagnosis', 'name': 'RDS进程管理', 'url': '/diagnosis_process/','class': 'glyphicon glyphicon glyphicon-scissors'}, + {'key': 'allworkflow', 'name': '查看历史工单', 'url': '/allworkflow/', 'class': 'glyphicon glyphicon-home', 'display': True}, + {'key': 'submitsql', 'name': '发起SQL上线', 'url': '/submitsql/', 'class': 'glyphicon glyphicon-asterisk', 'display': True}, + {'key': 'sqlquery', 'name': 'SQL在线查询', 'url': '/sqlquery/', 'class': 'glyphicon glyphicon-search', 'display': settings.QUERY}, + {'key': 'slowquery', 'name': 'SQL慢查日志', 'url': '/slowquery/', 'class': 'glyphicon glyphicon-align-right', 'display': settings.SLOWQUERY}, + {'key': 'sqladvisor', 'name': 'SQL优化工具', 'url': '/sqladvisor/', 'class': 'glyphicon glyphicon-wrench', 'display': settings.SQLADVISOR}, + {'key': 'queryapply', 'name': '查询权限管理', 'url': '/queryapplylist/', 'class': 'glyphicon glyphicon-eye-open', 'display': settings.QUERY}, + {'key': 'workflow', 'name': '工单审核管理', 'url': '/workflow/', 'class': 'glyphicon glyphicon-shopping-cart', 'display': settings.QUERY}, ) leftMenuBtnsSuper = ( - {'key': 'admin', 'name': '后台数据管理', 'url': '/admin/', 'class': 'glyphicon glyphicon-list'}, + {'key': 'diagnosis', 'name': 'RDS进程管理', 'url': '/diagnosis_process/', 'class': 'glyphicon glyphicon-scissors', 'display': settings.ALIYUN_RDS_MANAGE}, + {'key': 'ldapsync', 'name': '同步LDAP用户', 'url': '/ldapsync/', 'class': 'glyphicon glyphicon-th-large', 'display': settings.ENABLE_LDAP}, + {'key': 'admin', 'name': '后台数据管理', 'url': '/admin/', 'class': 'glyphicon glyphicon-list', 'display': True}, ) leftMenuBtnsDoc = ( - {'key': 'dbaprinciples', 'name': 'SQL审核必读', 'url': '/dbaprinciples/', 'class': 'glyphicon glyphicon-book'}, - {'key': 'charts', 'name': '统计图表展示', 'url': '/charts/', 'class': 'glyphicon glyphicon-file'}, + {'key': 'dbaprinciples', 'name': 'SQL审核必读', 'url': '/dbaprinciples/', 'class': 'glyphicon glyphicon-book', 'display': True}, + {'key': 'charts', 'name': '统计图表展示', 'url': '/charts/', 'class': 'glyphicon glyphicon-file','display': True}, ) -if settings.ENABLE_LDAP: - leftMenuBtnsSuper = ( - {'key': 'ldapsync', 'name': '同步LDAP用户', 'url': '/ldapsync/', 'class': 'glyphicon glyphicon-th-large'}, - {'key': 'admin', 'name': '后台数据管理', 'url': '/admin/', 'class': 'glyphicon glyphicon-list'}, - ) - -if settings.ENABLE_ALIYUN: - leftMenuBtnsCommon = leftMenuBtnsCommon + leftMenuBtnsAliYun - def global_info(request): """存放用户,会话信息等.""" loginUser = request.session.get('login_username', None) if loginUser is not None: user = users.objects.get(username=loginUser) UserDisplay = user.display + if UserDisplay == '': + UserDisplay = loginUser if user.is_superuser: leftMenuBtns = leftMenuBtnsCommon + leftMenuBtnsSuper + leftMenuBtnsDoc else: diff --git a/sql/query.py b/sql/query.py index bb8a8847..f5432cfe 100644 --- a/sql/query.py +++ b/sql/query.py @@ -24,8 +24,10 @@ from .data_masking import Masking from .workflow import Workflow from .permission import role_required, superuser_required -from .aliyun_function import slowquery_review as aliyun_rds_slowquery_review, \ - slowquery_review_history as aliyun_rds_slowquery_review_history + +if settings.ALIYUN_RDS_MANAGE: + from .aliyun_function import slowquery_review as aliyun_rds_slowquery_review, \ + slowquery_review_history as aliyun_rds_slowquery_review_history dao = Dao() prpCryptor = Prpcrypt() @@ -328,7 +330,6 @@ def getColumnNameList(request): return HttpResponse(json.dumps(result), content_type='application/json') - # 获取查询权限申请列表 @csrf_exempt def getqueryapplylist(request): @@ -769,9 +770,10 @@ def slowquery_review(request): # 判断是RDS还是其他实例 cluster_info = master_config.objects.get(cluster_name=cluster_name) try: - rds_dbinstanceid = cluster_info.aliyunrdsconfig.rds_dbinstanceid - # 调用阿里云慢日志接口 - result = aliyun_rds_slowquery_review(request) + if settings.ALIYUN_RDS_MANAGE: + rds_dbinstanceid = cluster_info.aliyunrdsconfig.rds_dbinstanceid + # 调用阿里云慢日志接口 + result = aliyun_rds_slowquery_review(request) except Exception: StartTime = request.POST.get('StartTime') EndTime = request.POST.get('EndTime') @@ -875,9 +877,10 @@ def slowquery_review_history(request): # 判断是RDS还是其他实例 cluster_info = master_config.objects.get(cluster_name=cluster_name) try: - rds_dbinstanceid = cluster_info.aliyunrdsconfig.rds_dbinstanceid - # 调用阿里云慢日志接口 - result = aliyun_rds_slowquery_review_history(request) + if settings.ALIYUN_RDS_MANAGE: + rds_dbinstanceid = cluster_info.aliyunrdsconfig.rds_dbinstanceid + # 调用阿里云慢日志接口 + result = aliyun_rds_slowquery_review_history(request) except Exception: StartTime = request.POST.get('StartTime') EndTime = request.POST.get('EndTime') diff --git a/sql/sqlreview.py b/sql/sqlreview.py index 04e64282..0e114990 100644 --- a/sql/sqlreview.py +++ b/sql/sqlreview.py @@ -59,6 +59,7 @@ def execute_call_back(workflowId, clusterName, url): dictConn = getMasterConnStr(clusterName) try: # 交给inception先split,再执行 + logger.debug('execute_call_back:' + str(workflowId) + ' executing') (finalStatus, finalList) = inceptionDao.executeFinal(workflowDetail, dictConn) # 封装成JSON格式存进数据库字段里 @@ -72,6 +73,7 @@ def execute_call_back(workflowId, clusterName, url): # 重新获取连接,防止超时 connection.close() workflowDetail.save() + logger.debug('execute_call_back:' + str(workflowId) + ' finish') except Exception as e: logger.error(e) @@ -103,7 +105,7 @@ def execute_job(workflowId, url): clusterName = workflowDetail.cluster_name # 服务器端二次验证,当前工单状态必须为定时执行过状态 - if workflowDetail.status != Const.workflowStatus['tasktiming']: + if workflowDetail.status != Const.workflowStatus['timingtask']: raise Exception('工单不是定时执行状态') # 将流程状态修改为执行中,并更新reviewok_time字段 diff --git a/sql/static/allWorkflow.html b/sql/static/allWorkflow.html index 0ecf0edf..aa22793b 100644 --- a/sql/static/allWorkflow.html +++ b/sql/static/allWorkflow.html @@ -7,7 +7,7 @@ - + diff --git a/sql/static/base.html b/sql/static/base.html index c117e420..a0e3ca23 100644 --- a/sql/static/base.html +++ b/sql/static/base.html @@ -1,6 +1,6 @@  - + 自动化运维平台 {% load staticfiles %} @@ -17,7 +17,7 @@ - + @@ -57,6 +57,7 @@
{% for menu in leftMenuBtns %} + {% if menu.display %} {% if menu.key == currentMenu %}  {{menu.name}} {% endif %} - + {% endif %} {% endfor %}
- +
@@ -105,7 +106,7 @@
- +

自动化运维平台.  Developed by OP.

diff --git a/sql/static/detail.html b/sql/static/detail.html index 438b8d52..436290d7 100644 --- a/sql/static/detail.html +++ b/sql/static/detail.html @@ -116,7 +116,7 @@

单子名称:{{ work placeholder="请填写驳回原因" rows=3>
-
+ {% csrf_token %} 单子名称:{{ work - +
{% csrf_token %} @@ -223,7 +223,7 @@

单子名称:{{ work {% endif %} {% endif %} - +