├── .gitignore
├── LICENSE
├── README.md
├── cmdb
├── .gitkeep
├── __init__.py
├── admin.py
├── apps.py
├── models.py
├── tests.py
├── urls.py
└── views
│ ├── __init__.py
│ ├── controller
│ ├── __init__.py
│ ├── additionalController.py
│ ├── ambientController.py
│ ├── apiInfoController.py
│ ├── gitInfoController.py
│ ├── hostInfoController.py
│ ├── monitorDashController.py
│ ├── monitorInfoController.py
│ ├── projectInfoController.py
│ ├── projectSettingController.py
│ ├── releaseOrderController.py
│ ├── roleInfoController.py
│ ├── saltController.py
│ ├── taskListController.py
│ ├── userGroupController.py
│ ├── userInfoController.py
│ └── vlanController.py
│ └── dao
│ ├── __init__.py
│ ├── ambientDao.py
│ ├── apiInfoDao.py
│ ├── diskInfoDao.py
│ ├── gitInfoDao.py
│ ├── hostInfoDao.py
│ ├── monitorDashDao.py
│ ├── monitorInfoDao.py
│ ├── networkDao.py
│ ├── projectInfoDao.py
│ ├── projectSettingDao.py
│ ├── releaseOrderDao.py
│ ├── roleInfoDao.py
│ ├── saltDao.py
│ ├── taskListDao.py
│ ├── taskLogListDao.py
│ ├── userGroupDao.py
│ ├── userInfoDao.py
│ └── vlanDao.py
├── devops
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
├── manage.py
├── sdk_api
├── ZabbixApi.py
├── __init__.py
└── saltstack.py
├── templates
└── task-info.html
├── test.py
└── utils
├── DateEncoder.py
├── JsonResponse.py
├── UserSession.py
├── __init__.py
├── githot.py
└── sendemail.py
/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | build/
12 | develop-eggs/
13 | dist/
14 | downloads/
15 | eggs/
16 | .eggs/
17 | lib/
18 | lib64/
19 | parts/
20 | sdist/
21 | var/
22 | wheels/
23 | share/python-wheels/
24 | *.egg-info/
25 | .installed.cfg
26 | *.egg
27 | MANIFEST
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .nox/
43 | .coverage
44 | .coverage.*
45 | .cache
46 | nosetests.xml
47 | coverage.xml
48 | *.cover
49 | .hypothesis/
50 | .pytest_cache/
51 |
52 | # Translations
53 | *.mo
54 | *.pot
55 |
56 | # Django stuff:
57 | *.log
58 | local_settings.py
59 | db.sqlite3
60 | migrations
61 |
62 | # Flask stuff:
63 | instance/
64 | .webassets-cache
65 |
66 | # Scrapy stuff:
67 | .scrapy
68 |
69 | # Sphinx documentation
70 | docs/_build/
71 |
72 | # PyBuilder
73 | target/
74 |
75 | # Jupyter Notebook
76 | .ipynb_checkpoints
77 |
78 | # IPython
79 | profile_default/
80 | ipython_config.py
81 |
82 | # pyenv
83 | .python-version
84 |
85 | # celery beat schedule file
86 | celerybeat-schedule
87 |
88 | # SageMath parsed files
89 | *.sage.py
90 |
91 | # Environments
92 | .env
93 | .venv
94 | env/
95 | venv/
96 | ENV/
97 | env.bak/
98 | venv.bak/
99 |
100 | # Spyder project settings
101 | .spyderproject
102 | .spyproject
103 |
104 | # Rope project settings
105 | .ropeproject
106 |
107 | # mkdocs documentation
108 | /site
109 |
110 | # mypy
111 | .mypy_cache/
112 | .dmypy.json
113 | dmypy.json
114 |
115 | # Pyre type checker
116 | .pyre/
117 |
118 | #PyCharm
119 | .idea/
120 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ### cmdb #: 资源管控
2 |
3 | 1.views #: 视图
4 | 1.controller #: 编写api请求层代码,保证数据传入,如输出规范
5 | 2.dao #: 连接orm数据操作
6 | 3.models #: 表结构
7 | 4.urls #: api地址
8 |
9 | ### devops #: 主项目配置中心
10 |
11 | ### sdk_api #: 各项目api接入中心
12 |
13 | # utils #:工具类
14 |
15 | 1.DataEncoder 解决orm时间格式转换json格式
16 | 2.JsonResponse 统计api输出json格式化
17 | 3.UserSession session会话登录验证
18 |
19 | ### 部署方法
20 | 1.项目部署请修改settings中DATABASES连接的数据库地址
21 |
22 | ```
23 | DATABASES = {
24 | 'default': {
25 | 'ENGINE': 'django.db.backends.mysql',
26 | 'NAME': 'devops',
27 | 'USER': 'root',
28 | 'PASSWORD': 'admin123',
29 | 'HOST': '172.28.5.190',
30 | 'PORT': '3306',
31 | 'OPTIONS': {
32 | 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
33 | 'charset': 'utf8mb4'
34 | }
35 | }
36 | }
37 | ```
38 |
39 |
40 | 2.请修改saltAPI类中saltapi地址
41 |
42 | ```
43 | #: 类变量定义
44 | def __init__(self):
45 | self.__url = 'https://172.28.5.190:8000'
46 | self.__user = 'saltapi'
47 | self.__password = 'saltapi'
48 | ```
49 |
50 | 3.pip安装依赖组件
51 |
52 | pip install Django==2.1.3
53 | pip install Jinja2==2.10
54 | pip install urllib3==1.24.1
55 | pip install PyMySQL==0.9.2
56 |
57 | 4.数据库同步
58 |
59 | python manage.py makemigrations cmdb
60 | python manage.py migrate
61 | 如果同步失败,请删除cmdb中migrations与__pycache__文件夹中的文件
62 |
63 | 5.启动项目
64 |
65 | python manage.py runserver 0.0.0.0:8080
66 |
--------------------------------------------------------------------------------
/cmdb/.gitkeep:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tender-Liu/cmdb-python/a2eb1ca51cc062b677ece5746569906d087c8202/cmdb/.gitkeep
--------------------------------------------------------------------------------
/cmdb/__init__.py:
--------------------------------------------------------------------------------
1 | # coding=utf-8
2 |
3 | import pymysql
4 | pymysql.install_as_MySQLdb()
--------------------------------------------------------------------------------
/cmdb/admin.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 |
3 | # Register your models here.
4 |
--------------------------------------------------------------------------------
/cmdb/apps.py:
--------------------------------------------------------------------------------
1 | from django.apps import AppConfig
2 |
3 |
4 | class CmdbConfig(AppConfig):
5 | name = 'cmdb'
6 |
--------------------------------------------------------------------------------
/cmdb/models.py:
--------------------------------------------------------------------------------
1 | # -*- coding:utf-8 -*-
2 | from django.db import models
3 | import django.utils.timezone as timezone
4 |
5 |
6 | #: 主机信息表
7 | class HostInfo(models.Model):
8 | host_id = models.AutoField(primary_key=True, unique=True, verbose_name='主机id')
9 | salt_id = models.CharField(max_length=50, unique=True, null=False, verbose_name='salt名')
10 | host_name = models.CharField(max_length=50, verbose_name='主机名')
11 | alies_name = models.CharField(max_length=50, verbose_name='主机别名')
12 | vlan = models.ForeignKey(to="Vlan", to_field="id", related_name='vlan_id',
13 | on_delete=models.CASCADE, null=True, verbose_name='vlan')
14 | ambient = models.ForeignKey(to="Ambient", to_field="id", related_name='ambient_id',
15 | on_delete=models.CASCADE, null=True, verbose_name='环境')
16 | memory = models.IntegerField(null=True, verbose_name='内存')
17 | swap = models.IntegerField(null=True, verbose_name='交换分区')
18 | os_fullname = models.CharField(null=True, max_length=50, verbose_name='系统版本名')
19 | os_release = models.CharField(null=True, max_length=50, verbose_name='系统版本号')
20 | kernel_release = models.CharField(max_length=50, verbose_name='内核版本')
21 | cpu_model = models.CharField(max_length=50, verbose_name='cpu信息')
22 | cpus_number = models.IntegerField(null=True, verbose_name='cpu核数')
23 | host_type = models.CharField(max_length=50, verbose_name='主机类型')
24 | ssh_port = models.IntegerField(null=True, verbose_name='远程端口')
25 | state = models.IntegerField(default=0, verbose_name='主机状态')
26 | project_list = models.CharField(max_length=50, null=True, verbose_name='主机类型')
27 | delete = models.IntegerField(default=0, verbose_name='是否收集')
28 | remarks = models.CharField(max_length=200, verbose_name='备注')
29 | created_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
30 |
31 | def __str__(self):
32 | return self.salt_id
33 |
34 | class Meta:
35 | db_table = 'host_info'
36 |
37 |
38 | #: 环境表
39 | class Ambient(models.Model):
40 | id = models.AutoField(primary_key=True, unique=True, verbose_name='id')
41 | ambient_name = models.CharField(max_length=50, verbose_name='环境名')
42 | remarks = models.CharField(max_length=200, verbose_name='备注')
43 | created_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
44 |
45 | def __str__(self):
46 | return self.ambient_name
47 |
48 | class Meta:
49 | db_table = 'ambient'
50 |
51 |
52 | #: 主机磁盘表
53 | class DiskInfo(models.Model):
54 | id = models.AutoField(primary_key=True, unique=True, verbose_name='id')
55 | host = models.ForeignKey(to="HostInfo", to_field="host_id", related_name='disk_host',
56 | on_delete=models.CASCADE, verbose_name='主机id')
57 | disk_name = models.CharField(null=True, max_length=50, verbose_name='磁盘名')
58 | size_gb = models.CharField(null=True, max_length=50, verbose_name='容量/GB')
59 | size_bytes = models.CharField(null=True, max_length=50, verbose_name='容量/bytes')
60 | state = models.IntegerField(default=0, verbose_name='状态1: 磁盘已不存在,状态0:磁盘使用中')
61 |
62 | def __str__(self):
63 | return self.disk_name
64 |
65 | class Meta:
66 | db_table = 'disk_info'
67 |
68 |
69 | #: 主机网卡表
70 | class Network(models.Model):
71 | id = models.AutoField(primary_key=True, unique=True, verbose_name='id')
72 | host = models.ForeignKey(to="HostInfo", to_field="host_id", related_name='network_host',
73 | on_delete=models.CASCADE, verbose_name='主机id')
74 | network_name = models.CharField(max_length=50, verbose_name='网卡名')
75 | ip_address = models.CharField(max_length=50, verbose_name='ip地址')
76 | state = models.IntegerField(default=0, verbose_name='状态1: 网卡已不存在,状态0:网卡使用中')
77 |
78 | def __str__(self):
79 | return self.network_name
80 |
81 | class Meta:
82 | db_table = 'network'
83 |
84 |
85 | #: vlan网段表
86 | class Vlan(models.Model):
87 | id = models.AutoField(primary_key=True, unique=True, verbose_name='id')
88 | vlan_name = models.CharField(max_length=50, unique=True, verbose_name='vlan名')
89 | gateway = models.CharField(max_length=50, verbose_name='网关')
90 | network = models.CharField(max_length=50, verbose_name='子网')
91 | created_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
92 |
93 | def __str__(self):
94 | return self.vlan_name
95 |
96 | class Meta:
97 | db_table = 'vlan'
98 |
99 |
100 | #: 任务信息表
101 | class TaskList(models.Model):
102 | task_id = models.AutoField(primary_key=True, unique=True, verbose_name='任务id')
103 | task_name = models.CharField(max_length=100, null=False, verbose_name='任务标题')
104 | task_state = models.IntegerField(default=0, verbose_name='任务状态')
105 | task_info = models.CharField(max_length=500, verbose_name='任务详情')
106 | create = models.ForeignKey(to="UserInfo", to_field="user_id", related_name='create_id',
107 | on_delete=models.CASCADE, verbose_name='创建人')
108 | execute = models.ForeignKey(to="UserInfo", to_field="user_id", related_name='execute_id',
109 | null=True, on_delete=models.CASCADE, verbose_name='处理人')
110 | authorizer = models.ForeignKey(to="UserInfo", to_field="user_id", related_name='authorizer_id', null=True,
111 | on_delete=models.CASCADE, verbose_name='授权人')
112 | remarks = models.CharField(max_length=500, null=True, verbose_name='任务备注')
113 | created_date = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
114 | modify_date = models.DateTimeField(null=True, verbose_name='完成时间')
115 |
116 | def __str__(self):
117 | return self.task_name
118 |
119 | class Meta:
120 | db_table = 'task_list'
121 |
122 |
123 | #: 任务日志信息表
124 | class TaskLogList(models.Model):
125 | log_id = models.AutoField(primary_key=True, unique=True, verbose_name='日志id')
126 | task_id = models.IntegerField(null=False, verbose_name='任务id')
127 | execute = models.IntegerField(null=False, verbose_name='操作人')
128 | log_info = models.CharField(max_length=200, verbose_name='日志详情')
129 | created_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
130 |
131 | def __str__(self):
132 | return self.log_id
133 |
134 | class Meta:
135 | db_table = 'task_log_list'
136 |
137 |
138 | #: 用户信息表
139 | class UserInfo(models.Model):
140 | user_id = models.AutoField(primary_key=True, unique=True, verbose_name='用户id')
141 | group = models.ForeignKey(to="UserGroup", to_field="group_id", null=True,
142 | on_delete=models.CASCADE, verbose_name='用户组Id')
143 | user_name = models.CharField(max_length=50, default='小样记得取名', verbose_name='用户名')
144 | password = models.CharField(max_length=100, null=False, verbose_name='密码')
145 | phone = models.CharField(max_length=50, verbose_name='手机号码')
146 | email = models.CharField(max_length=50, verbose_name='邮箱')
147 | state = models.IntegerField(default=1, verbose_name='用户状态')
148 | created_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
149 | modify_time = models.DateTimeField(auto_now=True, verbose_name='修改时间')
150 |
151 | def __str__(self):
152 | return self.user_name
153 |
154 | class Meta:
155 | db_table = 'user_info'
156 |
157 |
158 | #: 用户组表
159 | class UserGroup(models.Model):
160 | group_id = models.AutoField(primary_key=True, unique=True, verbose_name='用户组id')
161 | role = models.ForeignKey(to="RoleInfo", to_field="role_id", null=True,
162 | on_delete=models.CASCADE, verbose_name='角色Id')
163 | group_name = models.CharField(max_length=100, verbose_name='用户组名')
164 | remarks = models.CharField(max_length=500, null=True, verbose_name='备注')
165 | create_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
166 |
167 | def __str__(self):
168 | return self.group_name
169 |
170 | class Meta:
171 | db_table = 'user_group'
172 |
173 |
174 | #: 权限角色表
175 | class RoleInfo(models.Model):
176 | role_id = models.AutoField(primary_key=True, unique=True, verbose_name='角色Id')
177 | role_name = models.CharField(max_length=100, verbose_name='角色名')
178 | api_list = models.CharField(max_length=500, null=True, verbose_name='api id json')
179 | remarks = models.CharField(max_length=500, null=True, verbose_name='备注')
180 | create_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
181 |
182 | def __str__(self):
183 | return self.role_name
184 |
185 | class Meta:
186 | db_table = 'role_info'
187 |
188 |
189 | #: api信息表
190 | class ApiInfo(models.Model):
191 | api_id = models.AutoField(primary_key=True, unique=True, verbose_name='apiId')
192 | api_url = models.CharField(max_length=300, verbose_name='api url地址')
193 | api_name = models.CharField(max_length=300, null=True, verbose_name='api url名')
194 | remarks = models.CharField(max_length=500, null=True, verbose_name='备注')
195 | create_time = models.DateTimeField(default=timezone.now, verbose_name='创建时间')
196 |
197 | def __str__(self):
198 | return self.api_url
199 |
200 | class Meta:
201 | db_table = 'api_info'
202 |
203 |
204 | #: 项目详情表
205 | class ProjectInfo(models.Model):
206 | project_id = models.AutoField(primary_key=True, unique=True, verbose_name='项目Id')
207 | project_name = models.CharField(max_length=100, unique=True, verbose_name='项目名')
208 | project_path = models.CharField(max_length=300, null=True, verbose_name='项目路径')
209 | package_path = models.CharField(max_length=300, null=True, verbose_name='项目包路径')
210 | project_port = models.IntegerField(null=True, verbose_name='项目端口')
211 | project_type = models.IntegerField(null=True, verbose_name='项目类型')
212 | git = models.ForeignKey(to="GitInfo", to_field="git_id", null=True,
213 | on_delete=models.CASCADE, verbose_name='gitId')
214 | github_url = models.CharField(max_length=200, null=True, verbose_name='github仓库地址')
215 | maven_path = models.CharField(max_length=200, null=True, verbose_name='maven获取包地址')
216 | update_time = models.DateTimeField(default=timezone.now, verbose_name='更新时间')
217 | remarks = models.CharField(max_length=200, null=True, verbose_name='备注')
218 |
219 | def __str__(self):
220 | return self.project_name
221 |
222 | class Meta:
223 | db_table = 'project_info'
224 |
225 |
226 | #: 项目配置文件表
227 | class ProjectSetting(models.Model):
228 | setting_id = models.AutoField(primary_key=True, unique=True, verbose_name='配置文件Id')
229 | project = models.ForeignKey(to="ProjectInfo", to_field="project_id", null=True,
230 | on_delete=models.CASCADE, verbose_name='项目Id')
231 | ambient = models.ForeignKey(to="Ambient", to_field="id", null=True,
232 | on_delete=models.CASCADE, verbose_name='环境Id')
233 | file_name = models.CharField(max_length=100, verbose_name='配置文件名')
234 | remote_path = models.CharField(max_length=200, verbose_name='配置文件远端路径')
235 | update_time = models.DateTimeField(default=timezone.now, verbose_name='更新时间')
236 | remarks = models.CharField(max_length=200, null=True, verbose_name='备注')
237 |
238 | def __str__(self):
239 | return self.file_name
240 |
241 | class Meta:
242 | db_table = 'project_setting'
243 | unique_together = ["project", "ambient", "file_name"]
244 |
245 |
246 | #: git账号信息表
247 | class GitInfo(models.Model):
248 | git_id = models.AutoField(primary_key=True, unique=True, verbose_name='gitId')
249 | git_name = models.CharField(max_length=100, unique=True, verbose_name='git用户')
250 | git_key = models.CharField(max_length=100, null=True, verbose_name='git私钥')
251 | git_pass = models.CharField(max_length=150, null=True, verbose_name='git密码')
252 | update_time = models.DateTimeField(default=timezone.now, verbose_name='更新时间')
253 | remarks = models.CharField(max_length=200, null=True, verbose_name='备注')
254 |
255 | def __str__(self):
256 | return self.git_name
257 |
258 | class Meta:
259 | db_table = 'git_info'
260 |
261 |
262 | #: 发布工单信息表
263 | class ReleaseOrder(models.Model):
264 | order_id = models.AutoField(primary_key=True, unique=True, verbose_name='发布工单Id')
265 | order_title = models.CharField(max_length=150, verbose_name='工单标题')
266 | order_content = models.CharField(max_length=300, verbose_name='工单内容')
267 | author = models.ForeignKey(to="UserInfo", to_field="user_id", related_name='author',
268 | on_delete=models.CASCADE, verbose_name='工单创建人')
269 | executor = models.ForeignKey(to="UserInfo", to_field="user_id", related_name='executor',
270 | on_delete=models.CASCADE, verbose_name='任务执行人')
271 | product = models.ForeignKey(to="UserInfo", to_field="user_id", related_name='product',
272 | on_delete=models.CASCADE, verbose_name='产品审核人')
273 | artisan = models.ForeignKey(to="UserInfo", to_field="user_id", related_name='artisan',
274 | on_delete=models.CASCADE, verbose_name='技术审核人')
275 | ambient = models.ForeignKey(to="Ambient", to_field="id", related_name='ambient',
276 | on_delete=models.CASCADE, verbose_name='环境Id')
277 | authorizer = models.CharField(max_length=50, default='''{"artisan": 1, "product": 1}''', verbose_name='授权状态')
278 | status = models.IntegerField(default=1, verbose_name='工单状态')
279 | ftp_path = models.CharField(max_length=100, null=True, verbose_name='ftp路径')
280 | remarks = models.CharField(max_length=300, null=True, verbose_name='备注')
281 | release_time = models.DateTimeField(verbose_name='发布时间')
282 | update_time = models.DateTimeField(default=timezone.now, verbose_name='更新时间')
283 |
284 | def __str__(self):
285 | return self.order_title
286 |
287 | class Meta:
288 | db_table = 'release_order'
289 |
290 |
291 | #: 监控item表
292 | class Monitor(models.Model):
293 | id = models.AutoField(primary_key=True, unique=True, verbose_name='id')
294 | host = models.ForeignKey(to="HostInfo", to_field="host_id", related_name='monitor_host',
295 | on_delete=models.CASCADE, verbose_name='主机id')
296 | cpu_use = models.CharField(max_length=50, verbose_name='CPU使用率')
297 | mem_use = models.CharField(max_length=50, verbose_name='内存使用率')
298 | load5 = models.CharField(max_length=50, verbose_name='5分钟内load值')
299 |
300 | class Meta:
301 | db_table = 'monitor_info'
302 |
303 |
304 | #: 步骤模板
305 | class StepTemp(models.Model):
306 | step_id = models.AutoField(primary_key=True, unique=True, verbose_name='步骤Id')
307 | step_name = models.CharField(max_length=100, verbose_name='步骤名')
308 | script_path = models.CharField(max_length=150, verbose_name='脚本路径')
309 | execute_count = models.IntegerField(default=1, verbose_name='执行次数,默认执行一次')
310 | execute_time = models.IntegerField(default=0, verbose_name='执行间隔时间,0代表没有间隔时间')
311 | update_time = models.DateTimeField(default=timezone.now, verbose_name='修改时间')
312 | remarks = models.CharField(max_length=200, null=True, verbose_name='备注')
313 |
314 | def __str__(self):
315 | return self.step_name
316 |
317 | class Meta:
318 | db_table = 'step_temp'
319 |
320 |
321 | #: 步骤参数模板
322 | class StepParameterTemp(models.Model):
323 | param_id = models.AutoField(primary_key=True, unique=True, verbose_name='参数Id')
324 | step = models.ForeignKey(to="StepTemp", to_field="step_id", related_name='step',
325 | on_delete=models.CASCADE, verbose_name='步骤ID')
326 | param_name = models.CharField(max_length=100, verbose_name='参数中文解释')
327 | param_command = models.CharField(max_length=50, verbose_name='参数命令')
328 | is_null = models.CharField(max_length=50, default='false', verbose_name='是否为空,默认不能为空')
329 |
330 |
--------------------------------------------------------------------------------
/cmdb/tests.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*-coding:utf-8-*-
3 | import os
4 | from utils.githot import githot
5 | import json
6 |
7 |
8 | if __name__ == '__main__':
9 | auth = {
10 | 'artisan': -1,
11 | 'product': 1
12 | }
13 | if -1 in auth.values():
14 | print("ok")
--------------------------------------------------------------------------------
/cmdb/urls.py:
--------------------------------------------------------------------------------
1 | # _*_ coding:utf-8 _*_
2 | from django.urls import path
3 | from cmdb.views.controller import userInfoController
4 | from cmdb.views.controller import taskListController
5 | from cmdb.views.controller import hostInfoController
6 | from cmdb.views.controller import saltController
7 | from cmdb.views.controller import ambientController
8 | from cmdb.views.controller import vlanController
9 | from cmdb.views.controller import monitorInfoController
10 | from cmdb.views.controller import apiInfoController
11 | from cmdb.views.controller import roleInfoController
12 | from cmdb.views.controller import userGroupController
13 | from cmdb.views.controller import projectInfoController
14 | from cmdb.views.controller import projectSettingController
15 | from cmdb.views.controller import gitInfoController
16 | from cmdb.views.controller import releaseOrderController
17 | from cmdb.views.controller import monitorDashController
18 |
19 |
20 |
21 | urlpatterns = []
22 |
23 | #: 用户API
24 | urlpatterns += [
25 | #: 添加用户
26 | path('userInfo/setFromUserInfo', userInfoController.setFromUserInfo),
27 | #: 更新用户信息
28 | path('userInfo/updInfoFromUserInfo', userInfoController.updInfoFromUserInfo),
29 | #: 用户登录验证
30 | path('userInfo/getFromUserInfoByLogin', userInfoController.getFromUserInfoByLogin),
31 | #: 注销登录
32 | path('userInfo/delFromSessionByKey', userInfoController.delFromSessionByKey),
33 | #: 查询指定用户信息-管理员使用
34 | path('userInfo/getAllFromUsreInfoByUserId', userInfoController.getAllFromUsreInfoByUserId),
35 | #: 获取所有用户id与用户名
36 | path('userInfo/getAllUserInfo', userInfoController.getAllUserInfo),
37 | #: 用户信息查询分页功能,模糊查询
38 | path('userInfo/getAllFromUserInfoByPage', userInfoController.getAllFromUserInfoByPage),
39 | #: 修改用户密码
40 | path('userInfo/updPassWordFromUserInfo', userInfoController.updPassWordFromUserInfo),
41 | #: 查询个人用户信息
42 | path('userInfo/getAllFromUsreInfoByMyself', userInfoController.getAllFromUsreInfoByMyself),
43 | #: 管理员修改用户密码重置
44 | path('userInfo/updPassWordFromUserInfoByUserId', userInfoController.updPassWordFromUserInfoByUserId),
45 | #: 管理员修改用户分组
46 | path('userInfo/updGroupFromUserInfoByUserId', userInfoController.updGroupFromUserInfoByUserId),
47 | ]
48 |
49 |
50 | #: 任务列表API URL
51 | urlpatterns += [
52 | #: 返回所有任务count
53 | path('taskList/getCountFromTaskList', taskListController.getCountFromTaskList),
54 | #: 返回所有任务各种状态count
55 | path('taskList/getCountFromTaskListByTaskState', taskListController.getCountFromTaskListByTaskState),
56 | #: 返回指定任务详情
57 | path('taskList/getAllFromTaskListByTaskId', taskListController.getAllFromTaskListByTaskId),
58 | #: 添加任务
59 | path('taskList/setAllFromTaskList', taskListController.setAllFromTaskList),
60 | #: 更新任务信息
61 | path('taskList/updAllFromTaskListByTaskId', taskListController.updAllFromTaskListByTaskId),
62 | #: 更新任务状态
63 | path('taskList/updTaskStateFromTaskListByTaskId', taskListController.updTaskStateFromTaskListByTaskId),
64 | #: 查询任务操作日志
65 | path('taskList/getAllFromTaskLogListByTaskId', taskListController.getAllFromTaskLogListByTaskId),
66 | #: 添加任务操作日志
67 | path('taskList/setAllFromTaskLogListByTaskId', taskListController.setAllFromTaskLogListByTaskId),
68 | #: 任务分页查询
69 | path('taskList/getAllFromTaskListByPage', taskListController.getAllFromTaskListByPage),
70 | ]
71 |
72 |
73 | #: 主机信息操作api
74 | urlpatterns += [
75 | #: 查看分页主机资源信息
76 | path('hostInfo/getAllHostInfoByPage', hostInfoController.getAllHostInfoByPage),
77 | #: 查看指定主机详情包含ip列表与disk列表
78 | path('hostInfo/getAllHostInfoByHostId', hostInfoController.getAllHostInfoByHostId),
79 | #: 更新指定主机详情
80 | path('hostInfo/updHostInfoByHostId', hostInfoController.updHostInfoByHostId),
81 | #: 查看指定主机详情
82 | path('hostInfo/getHostInfoByHostId', hostInfoController.getHostInfoByHostId),
83 | ]
84 |
85 |
86 | #: saltAPI
87 | urlpatterns += [
88 | #: 检查新主机,返回saltId
89 | path('salt/getNewSaltId', saltController.getNewSaltId),
90 | #: 收集指定saltId主机信息
91 | path('salt/setNewHostInfo', saltController.setNewHostInfo),
92 | #: 更新所有数据库中存在的主机资源
93 | path('salt/updAllHostInfoBySalt', saltController.updAllHostInfoBySalt),
94 | #: salt执行指定主机执行操作命令
95 | path('salt/getCommandFromSaltBySaltIdList', saltController.getCommandFromSaltBySaltIdList),
96 | #: salt收集与更新主机项目列表
97 | path('salt/getProjectListFromHostInfoBySalt', saltController.getProjectListFromHostInfoBySalt),
98 | ]
99 |
100 |
101 | #: 环境操作API
102 | urlpatterns += [
103 | #: 添加Ambient
104 | path('ambient/setFromAmbient', ambientController.setFromAmbient),
105 | #: 删除Ambient
106 | path('ambient/delFromAmbientById', ambientController.delFromAmbientById),
107 | #: 查看Ambient
108 | path('ambient/getAllFromAmbient', ambientController.getAllFromAmbient),
109 | #: 更新Ambient
110 | path('ambient/updAllFromAmbientById', ambientController.updAllFromAmbientById),
111 | #: 查看指定的Ambient
112 | path('ambient/getAllFromAmbientById', ambientController.getAllFromAmbientById),
113 | #: 查看分页Ambient信息
114 | path('ambient/getAllFromAmbientByPage', ambientController.getAllFromAmbientByPage),
115 | ]
116 |
117 |
118 | #: Vlan操作API
119 | urlpatterns += [
120 | #: 添加Vlan
121 | path('vlan/setFromVlan', vlanController.setFromVlan),
122 | #: 删除Vlan
123 | path('vlan/delFromVlanById', vlanController.delFromVlanById),
124 | #: 查看Vlan分页信息
125 | path('vlan/getAllFromVlanByPage', vlanController.getAllFromVlanByPage),
126 | #: 更新Vlan
127 | path('vlan/updAllFromVlanById', vlanController.updAllFromVlanById),
128 | #: 查看指定的Vlan
129 | path('vlan/getAllFromValnById', vlanController.getAllFromValnById),
130 | #: 查看所有vlan信息
131 | path('vlan/getIdAndVlanNameFromVlan', vlanController.getIdAndVlanNameFromVlan),
132 | ]
133 |
134 | #: 主机监控操作api
135 | urlpatterns += [
136 | #: 一键安装主机
137 | path('monitorInfo/createHost', monitorInfoController.createHost),
138 | # 获取资源信息
139 | path('monitorInfo/getAllHostInfoByPage', monitorInfoController.getAllHostInfoByPage),
140 | #资源大盘
141 | path('monitorDash/getMonitorItem', monitorDashController.getMonitorItem),
142 |
143 | ]
144 |
145 |
146 | #: apiInfo操作api
147 | urlpatterns += [
148 | #: 根据apiId查询api信息
149 | path('apiInfo/getAllFromApiInfoByApiId', apiInfoController.getAllFromApiInfoByApiId),
150 | #: 添加api信息
151 | path('apiInfo/setFromApiInfo', apiInfoController.setFromApiInfo),
152 | #: 根据apiId更新api信息
153 | path('apiInfo/updAllFromApiInfoByApiId', apiInfoController.updAllFromApiInfoByApiId),
154 | #: 根据apiId删除指定api信息
155 | path('apiInfo/delFromApiInfoByApiId', apiInfoController.delFromApiInfoByApiId),
156 | #: apiInfo分页查询带模糊查询功能
157 | path('apiInfo/getListFromApiInfoByPage', apiInfoController.getListFromApiInfoByPage),
158 | ]
159 |
160 |
161 | #: roleInfo操作api
162 | urlpatterns += [
163 | #: 根据apiId查询角色信息
164 | path('roleInfo/getAllFromRoleInfoByRoleId', roleInfoController.getAllFromRoleInfoByRoleId),
165 | #: 根据roleId查询角色信息与角色权限详情
166 | path('roleInfo/getAllFromRoleInfoAndApiInfoByRoleId', roleInfoController.getAllFromRoleInfoAndApiInfoByRoleId),
167 | #: 根据apiId查询角色信息
168 | path('roleInfo/getAllFromRoleInfoAndApiInfoByRoleId', roleInfoController.getAllFromRoleInfoAndApiInfoByRoleId),
169 | #: 添加api信息
170 | path('roleInfo/setFromRoleInfo', roleInfoController.setFromRoleInfo),
171 | #: 根据apiId更新角色信息
172 | path('roleInfo/updAllFromRoleInfoByRoleId', roleInfoController.updAllFromRoleInfoByRoleId),
173 | #: 根据apiId删除指定角色信息
174 | path('roleInfo/delFromRoleInfoByRoleId', roleInfoController.delFromRoleInfoByRoleId),
175 | #: apiInfo分页查询带模糊查询功能
176 | path('roleInfo/getListFromRoleInfoByPage', roleInfoController.getListFromRoleInfoByPage),
177 | #: 查询全部角色id与角色名
178 | path('roleInfo/getRoleIdAndRoleNameFromRoleInfo', roleInfoController.getRoleIdAndRoleNameFromRoleInfo),
179 | #: 根据roleId查询角色信息与角色拥有的权限详情与未拥有的权限详情
180 | path('roleInfo/getListFromRoleInfoAndApiInfoByRoleId', roleInfoController.getListFromRoleInfoAndApiInfoByRoleId),
181 | #: 添加角色权限
182 | path('roleInfo/addApiListFromRoleIdByRoleId', roleInfoController.addApiListFromRoleIdByRoleId),
183 | #: 删除角色权限
184 | path('roleInfo/delApiListFromRoleIdByRoleId', roleInfoController.delApiListFromRoleIdByRoleId),
185 | ]
186 |
187 |
188 | #: 用户组操作api
189 | urlpatterns += [
190 | #: 根据groupId查询查询用户组信息
191 | path('userGroup/getAllFromUserGroupByGroupId', userGroupController.getAllFromUserGroupByGroupId),
192 | #: 添加用户分组信息
193 | path('userGroup/setFromUserGroup', userGroupController.setFromUserGroup),
194 | #: 根据groupId更新用户信息
195 | path('userGroup/updAllFromUserGroupByGroupId', userGroupController.updAllFromUserGroupByGroupId),
196 | #: 根据groupId删除角色信息
197 | path('userGroup/delFromUserGroupByGroupId', userGroupController.delFromUserGroupByGroupId),
198 | #: 用户组分页查询带模糊查询功能
199 | path('userGroup/getListFromUserGroupByPage', userGroupController.getListFromUserGroupByPage),
200 | #: 获取所有用户组与用户组Id
201 | path('userGroup/getGroupIdAndGroupNameFromUserGroup', userGroupController.getGroupIdAndGroupNameFromUserGroup),
202 | ]
203 |
204 |
205 | #: 项目信息操作API
206 | urlpatterns += [
207 | #: 查看分页项目信息
208 | path('projectInfo/getAllFromProjectInfoByPage', projectInfoController.getAllFromProjectInfoByPage),
209 | #: 添加项目信息
210 | path('projectInfo/setFromProjectInfo', projectInfoController.setFromProjectInfo),
211 | #: 更新项目信息
212 | path('projectInfo/updFromProjectInfoByProjectId', projectInfoController.updFromProjectInfoByProjectId),
213 | #: 删除项目信息
214 | path('projectInfo/delFromProjectInfoByProjectId', projectInfoController.delFromProjectInfoByProjectId),
215 | #: 查看指定项目信息
216 | path('projectInfo/getAllFromProjectInfoByProjectId', projectInfoController.getAllFromProjectInfoByProjectId),
217 | #: 获取全部项目id与项目名
218 | path('projectInfo/getProjectNameFromProjectInfo', projectInfoController.getProjectNameFromProjectInfo),
219 | #: 查询所有指定的gitId的项目
220 | path('projectInfo/getAllFromProjectNameFromGitId', projectInfoController.getAllFromProjectNameFromGitId),
221 | ]
222 |
223 |
224 | #: 项目配置文件操作API
225 | urlpatterns += [
226 | #: 分页查询项目配置文件信息,包含项目以及配置文件名模糊匹配
227 | path('projectSetting/getAllFromProjectSettingByPage', projectSettingController.getAllFromProjectSettingByPage),
228 | #: 添加项目配置文件
229 | path('projectSetting/addFromProjectSettingByProjectIdAndAmbientId', projectSettingController.addFromProjectSettingByProjectIdAndAmbientId),
230 | #: 编辑配置文件 #内容#
231 | path('projectSetting/editFromProjectSettingByProjectId', projectSettingController.editFromProjectSettingByProjectId),
232 | #: 查看指定文件 #内容#
233 | path('projectSetting/getContentFromProjectSettingByProjectId',projectSettingController.getContentFromProjectSettingByProjectId),
234 | #: 查看指定配置 #文件信息#
235 | path('projectSetting/getAllFromProjectSettingByProjectId',projectSettingController.getAllFromProjectSettingByProjectId),
236 | #: 修改指定配置 #文件信息#
237 | path('projectSetting/updFromProjectSettingByProjectId',projectSettingController.updFromProjectSettingByProjectId),
238 | #: 删除配置文件
239 | path('projectSetting/delFromProjectSettingByProjectId',projectSettingController.delFromProjectSettingByProjectId),
240 | ]
241 |
242 |
243 | #: git信息操作API
244 | urlpatterns += [
245 | #: 添加git信息
246 | path('gitInfo/addFromGitInfo', gitInfoController.addFromGitInfo),
247 | #: 删除git信息
248 | path('gitInfo/delFromGitInfoByGitId', gitInfoController.delFromGitInfoByGitId),
249 | #: 更新git信息
250 | path('gitInfo/updAllFromGitInfoByGitId', gitInfoController.updAllFromGitInfoByGitId),
251 | #: 查询指定git信息
252 | path('gitInfo/getAllFromGitInfoByGitId', gitInfoController.getAllFromGitInfoByGitId),
253 | #: 查询所有git名称,前端使用
254 | path('gitInfo/getGitNameFromGitInfo', gitInfoController.getGitNameFromGitInfo),
255 | #: 分页查询,带模糊查询
256 | path('gitInfo/getAllFromGitInfoByPage', gitInfoController.getAllFromGitInfoByPage),
257 | #: 根据项目id,获取所有git分支名
258 | path('gitInfo/getBranchsFromGitByProjectId', gitInfoController.getBranchsFromGitByProjectId),
259 | ]
260 |
261 |
262 | #: 发布工单信息操作API
263 | urlpatterns += [
264 | #: 查询指定orderId的工单信息
265 | path('releaseOrder/getAllFromReleaseOrderByOrderId', releaseOrderController.getAllFromReleaseOrderByOrderId),
266 | #: 添加发布工单信息
267 | path('releaseOrder/setFromReleaseOrder', releaseOrderController.setFromReleaseOrder),
268 | #: 发布工单分页查询,带模糊查询
269 | path('releaseOrder/getListFromReleaseOrderByPage', releaseOrderController.getListFromReleaseOrderByPage),
270 | #: 删除发布工单信息
271 | path('releaseOrder/delFromReleaseOrderByOrderId', releaseOrderController.delFromReleaseOrderByOrderId),
272 | #: 指定orderId, 修改工单内容
273 | path('releaseOrder/updContentFromReleaseOrdeByOrderId', releaseOrderController.updContentFromReleaseOrdeByOrderId),
274 | #: 指定orderId,修改工单授权
275 | path('releaseOrder/updAuthorizerFromReleaseOrdeByOrderId', releaseOrderController.updAuthorizerFromReleaseOrdeByOrderId),
276 | #: 指定orderId,修改工单状态
277 | path('releaseOrder/updStatusFromReleaseOrderByOrderId', releaseOrderController.updStatusFromReleaseOrderByOrderId),
278 | ]
--------------------------------------------------------------------------------
/cmdb/views/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tender-Liu/cmdb-python/a2eb1ca51cc062b677ece5746569906d087c8202/cmdb/views/__init__.py
--------------------------------------------------------------------------------
/cmdb/views/controller/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tender-Liu/cmdb-python/a2eb1ca51cc062b677ece5746569906d087c8202/cmdb/views/controller/__init__.py
--------------------------------------------------------------------------------
/cmdb/views/controller/additionalController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from utils.JsonResponse import JsonResponse
3 |
4 |
5 | #: 作用: 404
6 | #: url: *
7 | #: 参数: None
8 | def getNotFindUrl():
9 | return HttpResponse(JsonResponse(code=404, message="url无效,系统暂无此api!", data=None).getJson())
10 |
--------------------------------------------------------------------------------
/cmdb/views/controller/ambientController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import ambientDao
3 | from utils.JsonResponse import JsonResponse
4 | from utils.JsonResponse import OrmConversion
5 | from utils.UserSession import checkUserSession
6 |
7 |
8 | #: 作用: 添加Ambient
9 | #: url: ambient/setFromAmbient
10 | #: 参数: ambientName, remarks
11 | def setFromAmbient(requset):
12 | code, data, message = None, None, None
13 | try:
14 | checkUserSession(requset)
15 | ambientName= requset.GET.get('ambientName')
16 | remarks = requset.GET.get('remarks')
17 | if ambientName:
18 | ambientDao.setFromAmbient(ambientName, remarks)
19 | code, message = 200, '添加成功'
20 | else:
21 | raise Exception('参数报错: ambientName不能为空!')
22 | except Exception as e:
23 | code, data, message = 300, None, str(e)
24 | finally:
25 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
26 |
27 |
28 | #: 作用: 删除Ambient
29 | #: url: ambient/delFromAmbientById
30 | #: 参数: id
31 | def delFromAmbientById(requset):
32 | code, data, message = None, None, None
33 | try:
34 | checkUserSession(requset)
35 | id= requset.GET.get('id')
36 | if id and id.isdigit():
37 | ambientDao.delFromAmbientById(id)
38 | code, message = 200, '删除成功'
39 | else:
40 | raise Exception('参数报错: id不能为空!')
41 | except Exception as e:
42 | code, data, message = 300, None, str(e)
43 | finally:
44 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
45 |
46 |
47 | #: 作用: 查看Ambient
48 | #: url: ambient/getAllFromAmbient
49 | #: 参数: id
50 | def getAllFromAmbient(requset):
51 | code, data, message = None, None, None
52 | try:
53 | checkUserSession(requset)
54 | ambientList = ambientDao.getAllFromAmbient()
55 | code, data = 200, { 'ambientList': OrmConversion(list(ambientList)) }
56 | except Exception as e:
57 | code, data, message = 300, None, str(e)
58 | finally:
59 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
60 |
61 |
62 | #: 作用: 更新Ambient
63 | #: url: ambient/updAllFromAmbientById
64 | #: 参数: id, ambientName, remarks
65 | def updAllFromAmbientById(requset):
66 | code, data, message = None, None, None
67 | try:
68 | checkUserSession(requset)
69 | id = requset.GET.get('id')
70 | ambientName = requset.GET.get('ambientName')
71 | remarks = requset.GET.get('remarks')
72 | if id and id.isdigit():
73 | ambientDao.updAllFromAmbientById(id, ambientName=ambientName, remarks=remarks)
74 | code, message = 200, '更新成功'
75 | else:
76 | raise Exception('参数报错: id不能为空!')
77 | except Exception as e:
78 | code, data, message = 300, None, str(e)
79 | finally:
80 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
81 |
82 |
83 | #: 作用: 查看指定Ambient信息
84 | #: url: ambient/getAllFromAmbientById
85 | #: 参数: id
86 | def getAllFromAmbientById(requset):
87 | code, data, message = None, None, None
88 | try:
89 | checkUserSession(requset)
90 | id = requset.GET.get('id')
91 | if id and id.isdigit():
92 | ambient = ambientDao.getAllFromAmbientById(id)
93 | code, data = 200, { 'ambient': OrmConversion(ambient) }
94 | else:
95 | raise Exception('参数报错: id不能为空!')
96 | except Exception as e:
97 | code, data, message = 300, None, str(e)
98 | finally:
99 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
100 |
101 |
102 | #: 作用: 查看分页Ambient信息
103 | #: url: ambient/getAllFromAmbientByPage
104 | #: 参数: page, ambientName
105 | def getAllFromAmbientByPage(requset):
106 | code, data, message = None, None, None
107 | try:
108 | checkUserSession(requset)
109 | page = requset.GET.get('page')
110 | ambientName = requset.GET.get('ambientName')
111 | if page:
112 | ambientList, numPages = ambientDao.getAllFromAmbientByPage(page=page, ambientName=ambientName)
113 | code = 200
114 | data = {
115 | 'ambientList': OrmConversion(list(ambientList)),
116 | 'numPages': numPages,
117 | 'page': int(page)
118 | }
119 | else:
120 | raise Exception('参数报错: page不能为空')
121 | except Exception as e:
122 | code, data, message = 300, None, str(e)
123 | finally:
124 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
--------------------------------------------------------------------------------
/cmdb/views/controller/apiInfoController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import apiInfoDao
3 | from utils.JsonResponse import JsonResponse
4 | from utils.JsonResponse import OrmConversion
5 | from utils.UserSession import checkUserSession
6 | import json
7 |
8 |
9 | #: 作用: 根据apiId查询api信息与权限详情
10 | #: url: apiInfo/getAllFromApiInfoByApiId
11 | #: 参数: apiId
12 | def getAllFromApiInfoByApiId(requset):
13 | code, data, message = None, None, None
14 | try:
15 | checkUserSession(requset)
16 | apiId = requset.GET.get('apiId')
17 | if apiId:
18 | apiInfo = apiInfoDao.getAllFromApiInfoByApiId(apiId)
19 | code, data = 200, {'apiInfo': OrmConversion(apiInfo)}
20 | else:
21 | raise Exception('参数报错: apiId 不能为空!')
22 | except Exception as e:
23 | code, data, message = 300, None, str(e)
24 | finally:
25 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
26 |
27 |
28 | #: 作用: 添加api信息
29 | #: url: apiInfo/setFromApiInfo
30 | #: 参数: apiUrl, apiName, remarks
31 | def setFromApiInfo(requset):
32 | code, data, message = None, None, None
33 | try:
34 | checkUserSession(requset)
35 | apiUrl = requset.GET.get('apiUrl')
36 | apiName = requset.GET.get('apiName')
37 | remarks = requset.GET.get('remarks')
38 | if apiUrl and remarks:
39 | apiInfoDao.setFromApiInfo(apiUrl, apiName, remarks)
40 | code, message = 200, '添加完成'
41 | else:
42 | raise Exception('参数报错: apiUrl,apiName, remarks 都不能为空!')
43 | except Exception as e:
44 | code, data, message = 300, None, str(e)
45 | finally:
46 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
47 |
48 |
49 | #: 作用: 根据apiId更新api信息
50 | #: url: apiInfo/updAllFromApiInfoByApiId
51 | #: 参数: apiId, apiUrl, apiName, remarks
52 | def updAllFromApiInfoByApiId(requset):
53 | code, data, message = None, None, None
54 | try:
55 | checkUserSession(requset)
56 | apiId = requset.GET.get('apiId')
57 | apiUrl = requset.GET.get('apiUrl')
58 | apiName = requset.GET.get('apiName')
59 | remarks = requset.GET.get('remarks')
60 | if apiId:
61 | apiInfoDao.updAllFromApiInfoByApiId(apiId, apiUrl=apiUrl, apiName=apiName, remarks=remarks)
62 | code, message = 200, '更新完成'
63 | else:
64 | raise Exception('参数报错: apiId 不能为空!')
65 | except Exception as e:
66 | code, data, message = 300, None, str(e)
67 | finally:
68 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
69 |
70 |
71 | #: 作用: 根据apiId删除指定api信息
72 | #: url: apiInfo/delFromApiInfoByApiId
73 | #: 参数: apiId
74 | def delFromApiInfoByApiId(requset):
75 | code, data, message = None, None, None
76 | try:
77 | checkUserSession(requset)
78 | apiId = requset.GET.get('apiId')
79 | if apiId:
80 | apiInfoDao.delFromApiInfoByApiId(apiId)
81 | code, message = 200, '更新完成'
82 | else:
83 | raise Exception('参数报错: apiId 不能为空!')
84 | except Exception as e:
85 | code, data, message = 300, None, str(e)
86 | finally:
87 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
88 |
89 |
90 | #: 作用: apiInfo分页查询带模糊查询功能
91 | #: url: apiInfo/getListFromApiInfoByPage
92 | #: 参数: page, apiUrl
93 | def getListFromApiInfoByPage(requset):
94 | code, data, message = None, None, None
95 | try:
96 | checkUserSession(requset)
97 | page = requset.GET.get('page')
98 | apiUrl = requset.GET.get('apiUrl')
99 | if page:
100 | apiInfoList, numPages = apiInfoDao.getListFromApiInfoByPage(page=page, apiUrl=apiUrl)
101 | code = 200
102 | data = {
103 | 'apiInfoList': OrmConversion(list(apiInfoList)),
104 | 'numPages': numPages,
105 | 'page': int(page)
106 | }
107 | else:
108 | raise Exception('参数报错: page 不能为空!')
109 | except Exception as e:
110 | code, data, message = 300, None, str(e)
111 | finally:
112 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
113 |
114 |
115 | #: 作用: 根据roleId查询api信息列表
116 | #: url: apiInfo/getAllFromApiInfoByApiId
117 | #: 参数: apiId
118 | def getAllFromApiInfoByRoleId(requset):
119 | code, data, message = None, None, None
120 | try:
121 | checkUserSession(requset)
122 | apiId = requset.GET.get('apiId')
123 | if apiId:
124 | apiInfo = apiInfoDao.getAllFromApiInfoByApiId(apiId)
125 | code, data = 200, {'apiInfo': OrmConversion(apiInfo)}
126 | else:
127 | raise Exception('参数报错: apiId 不能为空!')
128 | except Exception as e:
129 | code, data, message = 300, None, str(e)
130 | finally:
131 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
--------------------------------------------------------------------------------
/cmdb/views/controller/gitInfoController.py:
--------------------------------------------------------------------------------
1 | from utils.JsonResponse import JsonResponse, OrmConversion
2 | from utils.UserSession import checkUserSession
3 | from django.shortcuts import HttpResponse
4 | from cmdb.views.dao import gitInfoDao
5 |
6 |
7 | #: 作用: 添加git信息
8 | #: url: gitInfo/addFromGitInfo
9 | #: 参数: gitName, gitUser, gitPass, remarks
10 | def addFromGitInfo(requset):
11 | code, data, message = None, None, None
12 | try:
13 | checkUserSession(requset)
14 | gitName = requset.GET.get('gitName')
15 | gitKey = requset.GET.get('gitKey')
16 | gitPass = requset.GET.get('gitPass')
17 | remarks = requset.GET.get('remarks')
18 | if gitName:
19 | gitInfoDao.addFromGitInfo(gitName, gitKey=gitKey, gitPass=gitPass, remarks=remarks)
20 | code, message = 200, '添加信息成功'
21 | else:
22 | raise Exception('参数报错: gitName, gitUser, gitPass 都不能为空')
23 | except Exception as e:
24 | code, data, message = 300, None, str(e)
25 | finally:
26 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
27 |
28 |
29 | #: 作用: 删除git信息
30 | #: url: gitInfo/delFromGitInfoByGitId
31 | #: 参数: gitId
32 | def delFromGitInfoByGitId(requset):
33 | code, data, message = None, None, None
34 | try:
35 | checkUserSession(requset)
36 | gitId = requset.GET.get('gitId')
37 | if gitId:
38 | gitInfoDao.delFromGitInfoByGitId(gitId)
39 | code, message = 200, '删除信息成功'
40 | else:
41 | raise Exception('参数报错: gitId 不能为空')
42 | except Exception as e:
43 | code, data, message = 300, None, str(e)
44 | finally:
45 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
46 |
47 |
48 | #: 作用: 更新git信息
49 | #: url: gitInfo/updAllFromGitInfoByGitId
50 | #: 参数: gitId, remarks, gitName, gitUser, gitPass
51 | def updAllFromGitInfoByGitId(requset):
52 | code, data, message = None, None, None
53 | try:
54 | checkUserSession(requset)
55 | gitId = requset.GET.get('gitId')
56 | gitName = requset.GET.get('gitName')
57 | gitKey = requset.GET.get('gitKey')
58 | gitPass = requset.GET.get('gitPass')
59 | remarks = requset.GET.get('remarks')
60 | if gitId:
61 | gitInfoDao.updAllFromGitInfoByGitId(gitId, remarks, gitName=gitName, gitKey=gitKey, gitPass=gitPass)
62 | code, message = 200, '更新信息成功'
63 | else:
64 | raise Exception('参数报错: gitId 不能为空')
65 | except Exception as e:
66 | code, data, message = 300, None, str(e)
67 | finally:
68 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
69 |
70 |
71 | #: 作用: 查询指定git信息
72 | #: url: gitInfo/getAllFromGitInfoByGitId
73 | #: 参数: gitId
74 | def getAllFromGitInfoByGitId(requset):
75 | code, data, message = None, None, None
76 | try:
77 | checkUserSession(requset)
78 | gitId = requset.GET.get('gitId')
79 | if gitId:
80 | gitInfo = gitInfoDao.getAllFromGitInfoByGitId(gitId)
81 | code, data = 200, {'gitInfo': OrmConversion(gitInfo)}
82 | else:
83 | raise Exception('参数报错: gitId 不能为空')
84 | except Exception as e:
85 | code, data, message = 300, None, str(e)
86 | finally:
87 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
88 |
89 |
90 | #: 作用: 查询所有git名称,前端使用
91 | #: url: gitInfo/getGitNameFromGitInfo
92 | #: 参数: gitId
93 | def getGitNameFromGitInfo(requset):
94 | code, data, message = None, None, None
95 | try:
96 | checkUserSession(requset)
97 | gitInfoList = gitInfoDao.getGitNameFromGitInfo()
98 | code, data = 200, {'gitInfoList': list(gitInfoList)}
99 | except Exception as e:
100 | code, data, message = 300, None, str(e)
101 | finally:
102 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
103 |
104 |
105 | #: 作用: 分页查询,带模糊查询
106 | #: url: gitInfo/getAllFromGitInfoByPage
107 | #: 参数: gitName
108 | def getAllFromGitInfoByPage(requset):
109 | code, data, message = None, None, None
110 | try:
111 | checkUserSession(requset)
112 | page = requset.GET.get('page')
113 | gitName = requset.GET.get('gitName')
114 | if page:
115 | gitInfoList, numPages = gitInfoDao.getAllFromGitInfoByPage(page, gitName=gitName)
116 | code, data = 200, {
117 | 'gitInfoList': OrmConversion(list(gitInfoList)),
118 | 'numPages': numPages,
119 | 'page': int(page)
120 | }
121 | else:
122 | raise Exception('参数报错: page 不能为空')
123 | except Exception as e:
124 | code, data, message = 300, None, str(e)
125 | finally:
126 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
127 |
128 |
129 | #: 作用: 根据项目id,获取所有git分支名
130 | #: url: gitInfo/getBranchsFromGitByProjectId
131 | #: 参数: projectId
132 | def getBranchsFromGitByProjectId(requset):
133 | code, data, message = None, None, None
134 | try:
135 | checkUserSession(requset)
136 | projectId = requset.GET.get('projectId')
137 | if projectId:
138 | branchs = gitInfoDao.getBranchsFromGitByProjectId(projectId)
139 | code, data = 200, {'branchs': branchs}
140 | else:
141 | raise Exception('参数报错: projectId 不能为空')
142 | except Exception as e:
143 | code, data, message = 300, None, str(e)
144 | finally:
145 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
146 |
--------------------------------------------------------------------------------
/cmdb/views/controller/hostInfoController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import hostInfoDao, networkDao, diskInfoDao, projectInfoDao
3 | from utils.JsonResponse import JsonResponse
4 | from utils.JsonResponse import OrmConversion
5 | from utils.UserSession import checkUserSession
6 | import json
7 |
8 |
9 | #: 作用: 查看分页主机资源信息
10 | #: url: hostInfo/getAllHostInfoByPage
11 | #: 参数: page
12 | def getAllHostInfoByPage(requset):
13 | code, data, message = None, None, None
14 | try:
15 | checkUserSession(requset)
16 | page = requset.GET.get('page')
17 | projectId = requset.GET.get('projectId')
18 | ambientId = requset.GET.get('ambientId')
19 | ip = requset.GET.get('ip')
20 | if page:
21 | hostInfoList, numPages = hostInfoDao.getAllHostInfoByPage(page=page, projectId=projectId, ambientId=ambientId, ip=ip)
22 | for hostInfo in hostInfoList:
23 | networkList = networkDao.getAllFromNetworkByHostId(hostInfo['host_id'], state=0)
24 | ipstr = ''
25 | for network in networkList:
26 | ipstr = ipstr + network.network_name + ': '+ network.ip_address + ' || '
27 | hostInfo['ip'] = ipstr.strip(' || ')
28 | data = {
29 | 'hostInfoList': list(hostInfoList),
30 | 'numPages': numPages,
31 | 'page': int(page)
32 | }
33 | code = 200
34 | else:
35 | raise Exception('参数报错: page不能为空')
36 | except Exception as e:
37 | code, data, message = 300, None, str(e)
38 | finally:
39 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
40 |
41 |
42 | #: 作用: 查看指定主机详情包含ip列表与disk列表
43 | #: url: hostInfo/getAllHostInfoByHostId
44 | #: 参数: hostId
45 | def getAllHostInfoByHostId(requset):
46 | code, data, message = None, None, None
47 | try:
48 | checkUserSession(requset)
49 | hostId = requset.GET.get('hostId')
50 | if hostId and hostId.isdigit():
51 | hostInfo = hostInfoDao.getAllHostInfoByHostId(hostId)
52 | ipList = networkDao.getAllFromNetworkByHostId(hostId)
53 | diskList = diskInfoDao.getAllFromDiskInFoByHostId(hostId)
54 | if hostInfo['project_list'] is not None and hostInfo['project_list'] != '[]':
55 | projectInfoList = projectInfoDao.getProjectNameFromProjectInfoByProjectIdList(json.loads(hostInfo['project_list']))
56 | else:
57 | projectInfoList = []
58 | code = 200
59 | data = {
60 | 'hostInfo': hostInfo,
61 | 'ipList': OrmConversion(list(ipList)),
62 | 'diskList': OrmConversion(list(diskList)),
63 | 'projectInfoList': list(projectInfoList)
64 | }
65 | else:
66 | raise Exception('参数报错: hostId不能为空,并且是数字')
67 | except Exception as e:
68 | code, data, message = 300, None, str(e)
69 | finally:
70 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
71 |
72 |
73 | #: 作用: 更新指定主机详情
74 | #: url: hostInfo/updHostInfoByHostId
75 | #: 参数: hostId, vlanId, ambientId, remarks, delete
76 | def updHostInfoByHostId(requset):
77 | code, data, message = None, None, None
78 | try:
79 | checkUserSession(requset)
80 | hostId = requset.GET.get('hostId')
81 | vlanId = requset.GET.get('vlanId')
82 | ambientId = requset.GET.get('ambientId')
83 | delete = requset.GET.get('delete')
84 | remarks = requset.GET.get('remarks')
85 | if hostId and hostId.isdigit():
86 | hostInfoDao.updAllHostInfobyHostId(hostId=hostId, vlanId=vlanId, ambientId=ambientId, remarks=remarks, delete=delete)
87 | code, message = 200, '更新完成'
88 | else:
89 | raise Exception('参数报错: hostId不能为空,并且是数字')
90 | except Exception as e:
91 | code, data, message = 300, None, str(e)
92 | finally:
93 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
94 |
95 |
96 | #: 作用: 查看指定主机详情
97 | #: url: hostInfo/getHostInfoByHostId
98 | #: 参数: hostId
99 | def getHostInfoByHostId(requset):
100 | code, data, message = None, None, None
101 | try:
102 | checkUserSession(requset)
103 | hostId = requset.GET.get('hostId')
104 | if hostId and hostId.isdigit():
105 | hostInfo = hostInfoDao.getHostInfoByHostId(hostId)
106 | code, data = 200, {'hostInfo': OrmConversion(hostInfo)}
107 | else:
108 | raise Exception('参数报错: hostId不能为空,并且是数字')
109 | except Exception as e:
110 | code, data, message = 300, None, str(e)
111 | finally:
112 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
113 |
114 |
--------------------------------------------------------------------------------
/cmdb/views/controller/monitorDashController.py:
--------------------------------------------------------------------------------
1 | from cmdb.views.dao import monitorDashDao
2 | from utils.JsonResponse import JsonResponse, OrmConversion
3 | from utils.UserSession import checkUserSession
4 | from django.shortcuts import HttpResponse
5 |
6 | def getMonitorItem(request):
7 | code, data, message = None, None, None
8 | data = {}
9 | cpu_use_20,cpu_use_20_50,cpu_use_50_80,cpu_use_80 = 0,0,0,0
10 | mem_use_20, mem_use_20_50, mem_use_50_80, mem_use_80 = 0,0,0,0
11 | load_use_1,load_use_1_5,load_use_5_10,load_use_10 = 0,0,0,0
12 | try:
13 | result = monitorDashDao.getMonitorItem()
14 |
15 | for item in OrmConversion(list(result)):
16 | if float(item['cpu_use']) < 20:
17 | cpu_use_20 += 1
18 | if float(item['cpu_use']) >= 20 and float(item['cpu_use']) < 50:
19 | cpu_use_20_50 += 1
20 | if float(item['cpu_use']) >= 50 and float(item['cpu_use']) < 80:
21 | cpu_use_50_80 += 1
22 | if float(item['cpu_use']) >= 80:
23 | cpu_use_80 += 1
24 |
25 | if float(item['mem_use']) < 20:
26 | mem_use_20 += 1
27 | if float(item['mem_use']) >= 20 and float(item['mem_use']) < 50:
28 | mem_use_20_50 += 1
29 | if float(item['mem_use']) >= 50 and float(item['mem_use']) < 80:
30 | mem_use_50_80 += 1
31 | if float(item['mem_use']) >= 80:
32 | mem_use_80 += 1
33 |
34 | if float(item['load5']) < 1:
35 | load_use_1 += 1
36 | if float(item['load5']) >= 1 and float(item['load5']) < 5:
37 | load_use_1_5 += 1
38 | if float(item['load5']) >= 5 and float(item['load5']) < 10:
39 | load_use_5_10 += 1
40 | if float(item['load5']) >= 10:
41 | load_use_10 += 1
42 |
43 | data['cpu'] = [{'value':cpu_use_20,'name':'20%以下'},
44 | {'value':cpu_use_20_50,'name':'20%~50%'},
45 | {'value':cpu_use_50_80,'name':'50%~80%'},
46 | {'value':cpu_use_80,'name':'80%以上'}]
47 |
48 | data['mem'] = [{'value': mem_use_20, 'name': '20%以下'},
49 | {'value': mem_use_20_50, 'name': '20%~50%'},
50 | {'value': mem_use_50_80, 'name': '50%~80%'},
51 | {'value': mem_use_80, 'name': '80%以上'}]
52 |
53 | data['load5'] = [{'value': load_use_1, 'name': '1以下'},
54 | {'value': load_use_1_5, 'name': '1~5'},
55 | {'value': load_use_5_10, 'name': '5~10'},
56 | {'value': load_use_10, 'name': '10以上'}]
57 | print(data)
58 | code, message = 200, 'OK'
59 | except Exception as e:
60 | code, data, message = 300, None, str(e)
61 | finally:
62 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
63 |
64 |
--------------------------------------------------------------------------------
/cmdb/views/controller/monitorInfoController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse, redirect, render, render_to_response
2 | from cmdb.views.dao import monitorInfoDao, networkDao
3 | from utils.JsonResponse import JsonResponse
4 | from utils.UserSession import checkUserSession
5 |
6 |
7 | #: 作用: 一键安装新主机
8 | #: url: monitorInfo/createHost
9 | #: 参数: None
10 | def createHost(request):
11 | code, data, message = None, None, None
12 | try:
13 | checkUserSession(request)
14 | host_ip = request.GET.get('host_ip')
15 |
16 | if host_ip:
17 | result = monitorInfoDao.createHost(host_ip)
18 | if result['code'] == 200:
19 | code, message = 200, '安装监控成功'
20 | else:
21 | raise Exception(result['data'])
22 | else:
23 | raise Exception('host_ip为空')
24 | except Exception as e:
25 | code, message = 300, str(e)
26 | finally:
27 | return HttpResponse(JsonResponse(code=code, message=message, data=None).getJson())
28 |
29 |
30 | #: 作用: 查看主机监控信息
31 | #: url: monitorInfo/getAllHostInfoByPage
32 | #: 参数: page
33 | def getAllHostInfoByPage(requset):
34 | code, data, message = None, None, None
35 | try:
36 | #checkUserSession(requset)
37 | zabbix_hostip = []
38 | page = requset.GET.get('page')
39 | if page:
40 | hostInfoList, numPages = monitorInfoDao.getAllHostInfoByPage(page=page)
41 | for hostInfo in hostInfoList:
42 | networkList = networkDao.getAllFromNetworkByHostId(hostInfo['host_id'], state=0)
43 | host_ip = ''
44 | for network in networkList:
45 | if 'eth0' in network.network_name or 'en' in network.network_name or 'em' in network.network_name:
46 | host_ip = network.ip_address
47 | break
48 | hostInfo['ip'] = host_ip
49 | zabbix_hostip.append(host_ip)
50 |
51 | ip_id_D = monitorInfoDao.getAllHostID(zabbix_hostip)
52 | if ip_id_D:
53 | host_monitor_D = monitorInfoDao.getAllItem(ip_id_D)
54 | for k in hostInfoList:
55 | for key, item in host_monitor_D.items():
56 | if key in k['ip']:
57 | k['cpu_use'] = item[0]
58 | k['mem_use'] = item[1]
59 | k['load5_use'] = item[2]
60 | break
61 | else:
62 | k['cpu_use'] = ''
63 | k['mem_use'] = ''
64 | k['load5_use'] = ''
65 | data = {
66 | 'hostInfoList': list(hostInfoList),
67 | 'numPages': numPages,
68 | 'page': int(page)
69 | }
70 | code = 200
71 | else:
72 | for k in hostInfoList:
73 | k['cpu_use'] = ''
74 | k['mem_use'] = ''
75 | k['load5_use'] = ''
76 |
77 | data = {
78 | 'hostInfoList': list(hostInfoList),
79 | 'numPages': numPages,
80 | 'page': int(page)
81 | }
82 | code = 200
83 | else:
84 | raise Exception('参数报错: page不能为空')
85 | except Exception as e:
86 | code, data, message = 300, None, str(e)
87 | finally:
88 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
89 |
--------------------------------------------------------------------------------
/cmdb/views/controller/projectInfoController.py:
--------------------------------------------------------------------------------
1 | from utils.JsonResponse import JsonResponse, OrmConversion
2 | from utils.UserSession import checkUserSession
3 | from django.shortcuts import HttpResponse
4 | from cmdb.views.dao import projectInfoDao
5 | from django.db.utils import IntegrityError
6 |
7 |
8 | #: 作用: 查看分页项目信息
9 | #: url: projectInfo/getAllFromProjectInfoByPage
10 | #: 参数: page, projectName
11 | def getAllFromProjectInfoByPage(requset):
12 | code, data, message = None, None, None
13 | try:
14 | checkUserSession(requset)
15 | page = requset.GET.get('page')
16 | projectName = requset.GET.get('projectName')
17 | if page:
18 | projectInfoList, numPages = projectInfoDao.getAllFromProjectInfoByPage(page, projectName=projectName)
19 | code = 200
20 | data = {
21 | 'projectInfoList': OrmConversion(list(projectInfoList)),
22 | 'numPages': numPages,
23 | 'page': int(page)
24 | }
25 | else:
26 | raise Exception('参数报错: page不能为空')
27 | except Exception as e:
28 | code, data, message = 300, None, str(e)
29 | finally:
30 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
31 |
32 |
33 | #: 作用: 添加项目信息
34 | #: url: projectInfo/setFromProjectInfo
35 | #: 参数: projectName, projectPath, packagePath, projectPort, projectType, githubUrl, gitId, mavenPath, remarks
36 | def setFromProjectInfo(requset):
37 | code, data, message = None, None, None
38 | try:
39 | checkUserSession(requset)
40 | projectName = requset.GET.get('projectName')
41 | projectPath = requset.GET.get('projectPath')
42 | packagePath = requset.GET.get('packagePath')
43 | projectPort = requset.GET.get('projectPort')
44 | projectType = requset.GET.get('projectType')
45 | githubUrl = requset.GET.get('githubUrl')
46 | gitId = requset.GET.get('gitId')
47 | mavenPath = requset.GET.get('mavenPath')
48 | remarks = requset.GET.get('remarks')
49 | if projectName and projectPath and packagePath and projectPort and projectType and githubUrl:
50 | projectInfoDao.setFromProjectInfo(projectName, projectPath, packagePath, projectPort, projectType, githubUrl,
51 | gitId=gitId, mavenPath=mavenPath, remarks=remarks)
52 | code, message = 200, '项目信息添加成功'
53 | else:
54 | raise Exception('参数报错: projectName, projectPath, packagePath, projectPort, projectType, githubUrl 都不能为空!')
55 | except IntegrityError:
56 | code, data, message = 300, None, '项目已存在'
57 | except Exception as e:
58 | code, data, message = 300, None, str(e)
59 | finally:
60 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
61 |
62 |
63 | #: 作用: 更新项目信息
64 | #: url: projectInfo/updFromProjectInfoByProjectId
65 | #: 参数: projectId, projectName, projectPath, packagePath
66 | #: projectPort, projectType, githubUrl, githubId, mavenPath, remarks
67 | def updFromProjectInfoByProjectId(requset):
68 | code, data, message = None, None, None
69 | try:
70 | checkUserSession(requset)
71 | projectId = requset.GET.get('projectId')
72 | projectName = requset.GET.get('projectName')
73 | projectPath = requset.GET.get('projectPath')
74 | packagePath = requset.GET.get('packagePath')
75 | projectPort = requset.GET.get('projectPort')
76 | projectType = requset.GET.get('projectType')
77 | githubUrl = requset.GET.get('githubUrl')
78 | gitId = requset.GET.get('gitId')
79 | mavenPath = requset.GET.get('mavenPath')
80 | remarks = requset.GET.get('remarks')
81 | if projectId and projectName and packagePath and packagePath and projectPort and projectType and githubUrl:
82 | projectInfoDao.updFromProjectInfoByProjectId(projectId, projectName, projectPath, packagePath, projectPort, projectType,
83 | githubUrl, gitId=gitId, mavenPath=mavenPath, remarks=remarks)
84 | code, message = 200, '项目信息更新成功'
85 | else:
86 | raise Exception('参数报错: projectId, projectName, projectPath, packagePath, projectPort, projectType, githubUrl 都不能为空!')
87 | except Exception as e:
88 | code, data, message = 300, None, str(e)
89 | finally:
90 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
91 |
92 |
93 | #: 作用: 删除项目信息
94 | #: url: projectInfo/delFromProjectInfoByProjectId
95 | #: 参数: projectId
96 | def delFromProjectInfoByProjectId(requset):
97 | code, data, message = None, None, None
98 | try:
99 | checkUserSession(requset)
100 | projectId = requset.GET.get('projectId')
101 | if projectId:
102 | projectInfoDao.delFromProjectInfoByProjectId(projectId)
103 | code, message = 200, '项目信息删除成功'
104 | else:
105 | raise Exception('参数报错: projectId 不能为空!')
106 | except Exception as e:
107 | code, data, message = 300, None, str(e)
108 | finally:
109 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
110 |
111 |
112 | #: 作用: 查看指定项目信息
113 | #: url: projectInfo/getAllFromProjectInfoByProjectId
114 | #: 参数: projectId
115 | def getAllFromProjectInfoByProjectId(requset):
116 | code, data, message = None, None, None
117 | try:
118 | checkUserSession(requset)
119 | projectId = requset.GET.get('projectId')
120 | if projectId:
121 | projectInfo = projectInfoDao.getAllFromProjectInfoByProjectId(projectId)
122 | code, data = 200, {'projectInfo': projectInfo}
123 | else:
124 | raise Exception('参数报错: projectId 不能为空!')
125 | except Exception as e:
126 | code, data, message = 300, None, str(e)
127 | finally:
128 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
129 |
130 |
131 | #: 作用: 获取全部项目id与项目名
132 | #: url: projectInfo/getProjectNameFromProjectInfo
133 | #: 参数: None
134 | def getProjectNameFromProjectInfo(requset):
135 | code, data, message = None, None, None
136 | try:
137 | checkUserSession(requset)
138 | projectInfoList = projectInfoDao.getProjectNameFromProjectInfo()
139 | code, data = 200, {'projectInfoList': list(projectInfoList)}
140 | except Exception as e:
141 | code, data, message = 300, None, str(e)
142 | finally:
143 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
144 |
145 |
146 | #: 作用: 查询所有指定的gitId的项目
147 | #: url: projectInfo/getAllFromProjectNameFromGitId
148 | #: 参数: gitId
149 | def getAllFromProjectNameFromGitId(requset):
150 | code, data, message = None, None, None
151 | try:
152 | checkUserSession(requset)
153 | gitId = requset.GET.get('gitId')
154 | if gitId:
155 | projectInfoList = projectInfoDao.getAllFromProjectNameFromGitId(gitId)
156 | code, data = 200, {'projectInfoList': list(projectInfoList)}
157 | else:
158 | raise Exception('参数报错: projectId 不能为空!')
159 | except Exception as e:
160 | code, data, message = 300, None, str(e)
161 | finally:
162 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
163 |
--------------------------------------------------------------------------------
/cmdb/views/controller/projectSettingController.py:
--------------------------------------------------------------------------------
1 | from utils.JsonResponse import JsonResponse, OrmConversion
2 | from utils.UserSession import checkUserSession
3 | from django.shortcuts import HttpResponse
4 | from cmdb.views.dao import projectSettingDao
5 | from utils.JsonResponse import JsonResponse
6 | from utils.JsonResponse import OrmConversion
7 |
8 |
9 | #: 作用: 分页查询项目配置文件信息,包含项目以及配置文件名模糊匹配
10 | #: url: projectSetting/getAllFromProjectSettingByPage
11 | #: 参数: page, projectId, fileName
12 | def getAllFromProjectSettingByPage(requset):
13 | code, data, message = None, None, None
14 | try:
15 | checkUserSession(requset)
16 | page = requset.GET.get('page')
17 | projectId = requset.GET.get('projectId')
18 | ambientId = requset.GET.get('ambientId')
19 | fileName = requset.GET.get('fileName')
20 | projectSettingList, numPages = projectSettingDao.getAllFromProjectSettingByPage(page=page, projectId=projectId, ambientId=ambientId, fileName=fileName)
21 | code = 200
22 | data = {
23 | 'projectSettingList': list(projectSettingList),
24 | 'numPages': numPages,
25 | 'page': int(page)
26 | }
27 | except Exception as e:
28 | code, data, message = 300, None, str(e)
29 | finally:
30 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
31 |
32 |
33 | #: 作用: 添加项目配置文件
34 | #: url: projectSetting/addFromProjectSettingByProjectIdAndAmbientId
35 | #: 参数: projectId, ambientId, fileName, remotePath, remarks
36 | def addFromProjectSettingByProjectIdAndAmbientId(requset):
37 | code, data, message = None, None, None
38 | try:
39 | checkUserSession(requset)
40 | projectId = requset.GET.get('projectId')
41 | ambientId = requset.GET.get('ambientId')
42 | fileName = requset.GET.get('fileName')
43 | remotePath = requset.GET.get('remotePath')
44 | remarks = requset.GET.get('remarks')
45 | if projectId and ambientId and fileName and remotePath:
46 | projectSettingDao.addFromProjectSettingByProjectIdAndAmbientId(projectId, ambientId, fileName, remotePath, remarks)
47 | code, message = 200, '新建项目配置文件完成'
48 | else:
49 | raise Exception('参数报错: projectId, ambientId, fileName, remotePath 都不能为空!')
50 | except Exception as e:
51 | code, data, message = 300, None, str(e)
52 | finally:
53 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
54 |
55 |
56 | #: 作用: 编辑配置文件 #内容#
57 | #: url: projectSetting/editFromProjectSettingByProjectId
58 | #: 参数: settingId, content
59 | def editFromProjectSettingByProjectId(requset):
60 | code, data, message = None, None, None
61 | try:
62 | checkUserSession(requset)
63 | settingId = requset.GET.get('settingId')
64 | content = requset.GET.get('content')
65 | if settingId:
66 | projectSettingDao.editFromProjectSettingByProjectId(settingId, content=content)
67 | code, message = 200, "编辑内容,保存完成"
68 | else:
69 | raise Exception('参数报错: settingId, content 都不能为空!')
70 | except Exception as e:
71 | code, data, message = 300, None, str(e)
72 | finally:
73 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
74 |
75 |
76 | #: 作用: 查看指定文件 #内容#
77 | #: url: projectSetting/getContentFromProjectSettingByProjectId
78 | #: 参数: settingId
79 | def getContentFromProjectSettingByProjectId(requset):
80 | code, data, message = None, None, None
81 | try:
82 | checkUserSession(requset)
83 | settingId = requset.GET.get('settingId')
84 | if settingId:
85 | content = projectSettingDao.getContentFromProjectSettingByProjectId(settingId)
86 | code, data = 200, {'content': content}
87 | else:
88 | raise Exception('参数报错: settingId 不能为空!')
89 | except Exception as e:
90 | code, data, message = 300, None, str(e)
91 | finally:
92 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
93 |
94 |
95 | #: 作用: 查看指定配置 #文件信息#
96 | #: url: projectSetting/getAllFromProjectSettingByProjectId
97 | #: 参数: settingId
98 | def getAllFromProjectSettingByProjectId(requset):
99 | code, data, message = None, None, None
100 | try:
101 | checkUserSession(requset)
102 | settingId = requset.GET.get('settingId')
103 | if settingId:
104 | projectSetting = projectSettingDao.getAllFromProjectSettingByProjectId(settingId)
105 | code, data = 200, {'projectSetting': OrmConversion(projectSetting)}
106 | else:
107 | raise Exception('参数报错: settingId 不能为空!')
108 | except Exception as e:
109 | code, data, message = 300, None, str(e)
110 | finally:
111 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
112 |
113 |
114 | #: 作用: 修改指定配置 #文件信息#
115 | #: url: projectSetting/updFromProjectSettingByProjectId
116 | #: 参数: settingId, projectId, ambientId, fileName, remotePath
117 | def updFromProjectSettingByProjectId(requset):
118 | code, data, message = None, None, None
119 | try:
120 | checkUserSession(requset)
121 | settingId = requset.GET.get('settingId')
122 | projectId = requset.GET.get('projectId')
123 | ambientId = requset.GET.get('ambientId')
124 | fileName = requset.GET.get('fileName')
125 | remotePath = requset.GET.get('remotePath')
126 | remarks = requset.GET.get('remarks')
127 | if settingId and projectId and ambientId and fileName and remotePath:
128 | projectSettingDao.updFromProjectSettingByProjectId(settingId, projectId, ambientId, fileName, remotePath, remarks=remarks)
129 | code, message = 200, '配置文件信息,更新完成'
130 | else:
131 | raise Exception('参数报错: settingId, projectId, ambientId, fileName, remotePath 都不能为空!')
132 | except Exception as e:
133 | code, data, message = 300, None, str(e)
134 | finally:
135 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
136 |
137 |
138 | #: 作用: 删除配置文件
139 | #: url: projectSetting/delFromProjectSettingByProjectId
140 | #: 参数: settingId
141 | def delFromProjectSettingByProjectId(requset):
142 | code, data, message = None, None, None
143 | try:
144 | checkUserSession(requset)
145 | settingId = requset.GET.get('settingId')
146 | if settingId:
147 | projectSettingDao.delFromProjectSettingByProjectId(settingId)
148 | code, message = 200, '删除配置文件完成'
149 | else:
150 | raise Exception('参数报错: settingId 不能为空!')
151 | except Exception as e:
152 | code, data, message = 300, None, str(e)
153 | finally:
154 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
--------------------------------------------------------------------------------
/cmdb/views/controller/releaseOrderController.py:
--------------------------------------------------------------------------------
1 | from utils.JsonResponse import JsonResponse, OrmConversion
2 | from utils.UserSession import checkUserSession
3 | from django.shortcuts import HttpResponse
4 | from cmdb.views.dao import releaseOrderDao
5 |
6 |
7 | #: 作用: 发布工单分页查询,带模糊查询
8 | #: url: releaseOrder/getListFromReleaseOrderByPage
9 | #: 参数: page, orderTitle, status
10 | def getListFromReleaseOrderByPage(requset):
11 | code, data, message = None, None, None
12 | try:
13 | checkUserSession(requset)
14 | page = requset.GET.get('page')
15 | orderTitle = requset.GET.get('orderTitle')
16 | status = requset.GET.get('status')
17 | if page:
18 | releaseOrderList, numPages= releaseOrderDao.getListFromReleaseOrderByPage(page, orderTitle=orderTitle, status=status)
19 | code = 200
20 | data = {
21 | 'releaseOrderList': list(releaseOrderList),
22 | 'numPages': numPages,
23 | 'page': int(page)
24 | }
25 | else:
26 | raise Exception('参数报错: page 不能为空')
27 | except Exception as e:
28 | code, data, message = 300, None, str(e)
29 | finally:
30 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
31 |
32 |
33 | #: 作用: 查询指定orderId的工单信息
34 | #: url: releaseOrder/getAllFromReleaseOrderByOrderId
35 | #: 参数: orderId
36 | def getAllFromReleaseOrderByOrderId(requset):
37 | code, data, message = None, None, None
38 | try:
39 | checkUserSession(requset)
40 | orderId = requset.GET.get('orderId')
41 | if orderId:
42 | releaseOrder = releaseOrderDao.getAllFromReleaseOrderByOrderId(orderId)
43 | code, data = 200, {'releaseOrder': releaseOrder}
44 | else:
45 | raise Exception('参数报错: orderId不能为空')
46 | except Exception as e:
47 | code, data, message = 300, None, str(e)
48 | finally:
49 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
50 |
51 |
52 | #: 作用: 添加发布工单信息
53 | #: url: releaseOrder/setFromReleaseOrder
54 | #: 参数: orderTitle, orderContent, releaseTime, ambientId, artisanId, authorId, productId, remarks, ftpPath
55 | def setFromReleaseOrder(requset):
56 | code, data, message = None, None, None
57 | try:
58 | userInfo = checkUserSession(requset)
59 | orderTitle = requset.GET.get('orderTitle')
60 | orderContent = requset.GET.get('orderContent')
61 | releaseTime = requset.GET.get('releaseTime')
62 | executorId = requset.GET.get('executorId')
63 | ambientId = requset.GET.get('ambientId')
64 | artisanId = requset.GET.get('artisanId')
65 | authorId = userInfo['user_id']
66 | productId = requset.GET.get('productId')
67 | remarks = requset.GET.get('remarks')
68 | ftpPath = requset.GET.get('ftpPath')
69 | if orderTitle and orderContent and releaseTime and ambientId and artisanId and authorId and productId and executorId:
70 | releaseOrder = releaseOrderDao.setFromReleaseOrder(orderTitle, orderContent, releaseTime, ambientId, executorId,
71 | artisanId, authorId, productId, remarks=remarks, ftpPath=ftpPath)
72 | code, message = 200, '添加工单完成'
73 | else:
74 | raise Exception('参数报错: orderTitle, orderContent, releaseTime, ambientId, executorId, artisanId, authorId, productId 都不能为空')
75 | except Exception as e:
76 | code, data, message = 300, None, str(e)
77 | finally:
78 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
79 |
80 |
81 | #: 作用: 删除发布工单信息
82 | #: url: releaseOrder/delFromReleaseOrderByOrderId
83 | #: 参数: orderId
84 | def delFromReleaseOrderByOrderId(requset):
85 | code, data, message = None, None, None
86 | try:
87 | checkUserSession(requset)
88 | orderId = requset.GET.get('orderId')
89 | if orderId:
90 | releaseOrderDao.delFromReleaseOrderByOrderId(orderId)
91 | code, message = 200, '删除工单完成'
92 | else:
93 | raise Exception('参数报错: orderId 不能为空')
94 | except Exception as e:
95 | code, data, message = 300, None, str(e)
96 | finally:
97 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
98 |
99 |
100 | #: 作用: 指定orderId, 修改工单内容
101 | #: url: releaseOrder/updContentFromReleaseOrdeByOrderId
102 | #: 参数: orderId, orderTitle, orderContent, ambientId, releaseTime, ftpPath, remarks
103 | def updContentFromReleaseOrdeByOrderId(requset):
104 | code, data, message = None, None, None
105 | try:
106 | checkUserSession(requset)
107 | orderId = requset.GET.get('orderId')
108 | orderTitle = requset.GET.get('orderTitle')
109 | orderContent = requset.GET.get('orderContent')
110 | ambientId = requset.GET.get('ambientId')
111 | releaseTime = requset.GET.get('releaseTime')
112 | executorId = requset.GET.get('executorId')
113 | artisanId = requset.GET.get('artisanId')
114 | productId = requset.GET.get('productId')
115 | ftpPath = requset.GET.get('ftpPath')
116 | remarks = requset.GET.get('remarks')
117 | if orderId:
118 | releaseOrderDao.updContentFromReleaseOrdeByOrderId(orderId, orderTitle, orderContent, ambientId, releaseTime,
119 | executorId, artisanId, productId, ftpPath=ftpPath, remarks=remarks)
120 | code, message = 200, '更新工单内容成功'
121 | else:
122 | raise Exception('参数报错: orderId 不能为空')
123 | except Exception as e:
124 | code, data, message = 300, None, str(e)
125 | finally:
126 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
127 |
128 |
129 | #: 作用: 指定orderId,修改工单授权
130 | #: url: releaseOrder/updAuthorizerFromReleaseOrdeByOrderId
131 | #: 参数: userId, orderId, authorizer
132 | def updAuthorizerFromReleaseOrdeByOrderId(requset):
133 | code, data, message = None, None, None
134 | try:
135 | userInfo = checkUserSession(requset)
136 | userId = userInfo['userId']
137 | orderId = requset.GET.get('orderId')
138 | authorizer = requset.GET.get('authorizer')
139 | if userId:
140 | releaseOrderDao.updAuthorizerFromReleaseOrdeByOrderId(userId, orderId, authorizer)
141 | code, message = 200, '发布工单授权完成'
142 | else:
143 | raise Exception('参数报错: orderId 不能为空')
144 | except Exception as e:
145 | code, data, message = 300, None, str(e)
146 | finally:
147 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
148 |
149 |
150 | #: 作用: 指定orderId,修改工单状态
151 | #: url: releaseOrder/updStatusFromReleaseOrderByOrderId
152 | #: 参数: orderId, status
153 | def updStatusFromReleaseOrderByOrderId(requset):
154 | code, data, message = None, None, None
155 | try:
156 | checkUserSession(requset)
157 | orderId = requset.GET.get('orderId')
158 | status = requset.GET.get('status')
159 | if orderId and status:
160 | releaseOrderDao.updStatusFromReleaseOrderByOrderId(orderId, status)
161 | code, message = 200, '工单状态更新完成'
162 | else:
163 | raise Exception('参数报错: orderId, status 都不能为空')
164 | except Exception as e:
165 | code, data, message = 300, None, str(e)
166 | finally:
167 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
--------------------------------------------------------------------------------
/cmdb/views/controller/roleInfoController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import roleInfoDao, apiInfoDao, userGroupDao
3 | from utils.JsonResponse import JsonResponse
4 | from utils.JsonResponse import OrmConversion
5 | from utils.UserSession import checkUserSession
6 | import json
7 |
8 |
9 | #: 作用: 根据roleId查询角色信息
10 | #: url: roleInfo/getAllFromRoleInfoByRoleId
11 | #: 参数: roleId
12 | def getAllFromRoleInfoByRoleId(requset):
13 | code, data, message = None, None, None
14 | try:
15 | checkUserSession(requset)
16 | apiId = requset.GET.get('roleId')
17 | if apiId:
18 | roleInfo = roleInfoDao.getAllFromRoleInfoByRoleId(apiId)
19 | code = 200
20 | data = {'roleInfo': OrmConversion(roleInfo)}
21 | else:
22 | raise Exception('参数报错: roleId 不能为空!')
23 | except Exception as e:
24 | code, data, message = 300, None, str(e)
25 | finally:
26 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
27 |
28 |
29 | #: 作用: 根据roleId查询角色信息与角色权限详情
30 | #: url: roleInfo/getAllFromRoleInfoAndApiInfoByRoleId
31 | #: 参数: roleId
32 | def getAllFromRoleInfoAndApiInfoByRoleId(requset):
33 | code, data, message = None, None, None
34 | try:
35 | checkUserSession(requset)
36 | apiId = requset.GET.get('roleId')
37 | if apiId:
38 | roleInfo = roleInfoDao.getAllFromRoleInfoByRoleId(apiId)
39 | if roleInfo.api_list == '*':
40 | apiInfoList = apiInfoDao.getAllFromApiInfo()
41 | elif roleInfo.api_list:
42 | apiIdList = json.loads(roleInfo.api_list)
43 | apiInfoList = apiInfoDao.getAllFromApiInfoByApiIdList(apiIdList)
44 | else:
45 | apiInfoList = []
46 | code = 200
47 | data = {
48 | 'roleInfo': OrmConversion(roleInfo),
49 | 'apiInfoList': OrmConversion(list(apiInfoList))
50 | }
51 | else:
52 | raise Exception('参数报错: roleId 不能为空!')
53 | except Exception as e:
54 | code, data, message = 300, None, str(e)
55 | finally:
56 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
57 |
58 |
59 | #: 作用: 添加角色信息
60 | #: url: roleInfo/setFromRoleInfo
61 | #: 参数: roleName, remarks
62 | def setFromRoleInfo(requset):
63 | code, data, message = None, None, None
64 | try:
65 | checkUserSession(requset)
66 | roleName = requset.GET.get('roleName')
67 | remarks = requset.GET.get('remarks')
68 | if roleName:
69 | roleInfoDao.setFromRoleInfo(roleName, remarks)
70 | code, message = 200, '添加完成'
71 | else:
72 | raise Exception('参数报错: roleName 不能为空!')
73 | except Exception as e:
74 | code, data, message = 300, None, str(e)
75 | finally:
76 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
77 |
78 |
79 | #: 作用: 根据roleId更新角色信息
80 | #: url: roleInfo/updAllFromRoleInfoByRoleId
81 | #: 参数: roleId, roleName, apiList, remarks
82 | def updAllFromRoleInfoByRoleId(requset):
83 | code, data, message = None, None, None
84 | try:
85 | checkUserSession(requset)
86 | roleId = requset.GET.get('roleId')
87 | roleName = requset.GET.get('roleName')
88 | remarks = requset.GET.get('remarks')
89 | if roleId:
90 | roleInfoDao.updAllFromRoleInfoByRoleId(roleId, roleName=roleName, remarks=remarks)
91 | code, message = 200, '更新完成'
92 | else:
93 | raise Exception('参数报错: roleId 不能为空!')
94 | except Exception as e:
95 | code, data, message = 300, None, str(e)
96 | finally:
97 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
98 |
99 |
100 |
101 | #: 作用: 根据roleId删除指定角色信息
102 | #: url: roleInfo/delFromRoleInfoByRoleId
103 | #: 参数: roleId
104 | def delFromRoleInfoByRoleId(requset):
105 | code, data, message = None, None, None
106 | try:
107 | checkUserSession(requset)
108 | roleId = requset.GET.get('roleId')
109 | if roleId:
110 | userGroupDao.updRoleIdIsNoneFromUserGroupByRoleId(roleId)
111 | roleInfoDao.delFromRoleInfoByRoleId(roleId)
112 | code, message = 200, '更新完成'
113 | else:
114 | raise Exception('参数报错: apiId 不能为空!')
115 | except Exception as e:
116 | code, data, message = 300, None, str(e)
117 | finally:
118 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
119 |
120 |
121 | #: 作用: roleInfo分页查询带模糊查询功能
122 | #: url: roleInfo/getListFromRoleInfoByPage
123 | #: 参数: page, roleName
124 | def getListFromRoleInfoByPage(requset):
125 | code, data, message = None, None, None
126 | try:
127 | checkUserSession(requset)
128 | page = requset.GET.get('page')
129 | roleName = requset.GET.get('roleName')
130 | if page:
131 | roleInfoList, numPages = roleInfoDao.getListFromRoleInfoByPage(page=page, roleName=roleName)
132 | code = 200
133 | data = {
134 | 'roleInfoList': OrmConversion(list(roleInfoList)),
135 | 'numPages': numPages,
136 | 'page': int(page)
137 | }
138 | else:
139 | raise Exception('参数报错: page 不能为空!')
140 | except Exception as e:
141 | code, data, message = 300, None, str(e)
142 | finally:
143 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
144 |
145 |
146 | #: 作用: 查询全部角色id与角色名
147 | #: url: roleInfo/getRoleIdAndRoleNameFromRoleInfo
148 | #: 参数: page, roleName
149 | def getRoleIdAndRoleNameFromRoleInfo(requset):
150 | code, data, message = None, None, None
151 | try:
152 | checkUserSession(requset)
153 |
154 | roleInfoList = roleInfoDao.getRoleIdAndRoleNameFromRoleInfo()
155 | code, data = 200, {'roleInfoList': list(roleInfoList)}
156 | except Exception as e:
157 | code, data, message = 300, None, str(e)
158 | finally:
159 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
160 |
161 |
162 | #: 作用: 根据roleId查询角色信息与角色拥有的权限详情与未拥有的权限详情
163 | #: url: roleInfo/getListFromRoleInfoAndApiInfoByRoleId
164 | #: 参数: roleId
165 | def getListFromRoleInfoAndApiInfoByRoleId(requset):
166 | code, data, message = None, None, None
167 | try:
168 | checkUserSession(requset)
169 | apiId = requset.GET.get('roleId')
170 | if apiId:
171 | roleInfo = roleInfoDao.getAllFromRoleInfoByRoleId(apiId)
172 | if roleInfo.api_list == '*':
173 | apiInfoList = apiInfoDao.getAllFromApiInfo()
174 | notApiInfoList = []
175 | elif roleInfo.api_list:
176 | apiIdList = json.loads(roleInfo.api_list)
177 | apiInfoList = apiInfoDao.getAllFromApiInfoByApiIdList(apiIdList)
178 | notApiInfoList = apiInfoDao.getAllFromApiInfoByNotApiIdList(apiIdList)
179 | else:
180 | apiInfoList = []
181 | notApiInfoList = apiInfoDao.getAllFromApiInfo()
182 | code = 200
183 | data = {
184 | 'roleInfo': OrmConversion(roleInfo),
185 | 'apiInfoList': OrmConversion(list(apiInfoList)),
186 | 'notApiInfoList': OrmConversion(list(notApiInfoList))
187 | }
188 | else:
189 | raise Exception('参数报错: roleId 不能为空!')
190 | except Exception as e:
191 | code, data, message = 300, None, str(e)
192 | finally:
193 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
194 |
195 |
196 | #: 作用: 添加角色权限
197 | #: url: roleInfo/addApiListFromRoleIdByRoleId
198 | #: 参数: roleId, apiList
199 | def addApiListFromRoleIdByRoleId(requset):
200 | code, data, message = None, None, None
201 | try:
202 | checkUserSession(requset)
203 | roleId = requset.GET.get('roleId')
204 | apiList = requset.GET.get('apiList')
205 | if roleId and apiList:
206 | roleInfo = roleInfoDao.getAllFromRoleInfoByRoleId(roleId)
207 | if roleInfo.api_list == '*':
208 | raise Exception("权限报错: 不能修改admin权限!")
209 | apiList = json.loads(apiList)
210 | if roleInfo.api_list and roleInfoDao != 'null':
211 | dbApiList = json.loads(roleInfo.api_list)
212 | apiList = list(set(apiList).difference(set(dbApiList)))
213 | dbApiList.extend(apiList)
214 | else:
215 | dbApiList = apiList
216 | roleInfoDao.updAllFromRoleInfoByRoleId(roleId, apiList=json.dumps(dbApiList))
217 | code, message = 200, '添加权限完成'
218 | else:
219 | raise Exception('参数报错: roleId, apiList 都不能为空!')
220 | except Exception as e:
221 | code, data, message = 300, None, str(e)
222 | finally:
223 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
224 |
225 |
226 | #: 作用: 删除角色权限
227 | #: url: roleInfo/delApiListFromRoleIdByRoleId
228 | #: 参数: roleId, apiList
229 | def delApiListFromRoleIdByRoleId(requset):
230 | code, data, message = None, None, None
231 | try:
232 | checkUserSession(requset)
233 | roleId = requset.GET.get('roleId')
234 | apiList = requset.GET.get('apiList')
235 | if roleId and apiList:
236 | roleInfo = roleInfoDao.getAllFromRoleInfoByRoleId(roleId)
237 | if roleInfo.api_list == '*':
238 | raise Exception("权限报错: 不能修改admin权限!")
239 | apiList = json.loads(apiList)
240 | if roleInfo.api_list:
241 | dbApiList = json.loads(roleInfo.api_list)
242 | dbApiList = list(set(dbApiList).difference(set(apiList)))
243 | roleInfoDao.updAllFromRoleInfoByRoleId(roleId, apiList=json.dumps(dbApiList))
244 | code, message = 200, '删除权限完成'
245 | else:
246 | raise Exception('权限报错: 该角色没有需要删除的权限!')
247 | else:
248 | raise Exception('参数报错: roleId, apiList 都不能为空!')
249 | except Exception as e:
250 | code, data, message = 300, None, str(e)
251 | finally:
252 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
--------------------------------------------------------------------------------
/cmdb/views/controller/saltController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import hostInfoDao, saltDao, networkDao, diskInfoDao, projectInfoDao
3 | from utils.JsonResponse import JsonResponse
4 | import json
5 | from utils.UserSession import checkUserSession
6 |
7 |
8 | #: 作用: salt收集新主机信息
9 | #: url: salt/setNewHostInfo
10 | #: 参数: saltIdList
11 | def setNewHostInfo(requset):
12 | code, data, message = None, None, None
13 | try:
14 | checkUserSession(requset)
15 | saltIdList = requset.GET.get('saltIdList')
16 | if saltIdList:
17 | saltIdList = json.loads(saltIdList)
18 | if type(saltIdList) == list:
19 | hostInfoDao.setSaltHostInfo(saltIdList)
20 | code, message = 200, "添加完成"
21 | else:
22 | raise Exception("saltIdList转换list类型异常")
23 | else:
24 | raise Exception("saltIdList不能为空")
25 | except Exception as e:
26 | code, data, message = 300, None, str(e)
27 | finally:
28 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
29 |
30 |
31 | #: 作用: salt发现新主机
32 | #: url: salt/getNewSaltId
33 | #: 参数: None
34 | def getNewSaltId(request):
35 | code, data, message = None, None, None
36 | try:
37 | checkUserSession(request)
38 | newHost = hostInfoDao.getNewSaltId()
39 | if newHost:
40 | data = newHost
41 | else:
42 | raise Exception("暂无新主机")
43 | code = 200
44 | except Exception as e:
45 | code, message = 300, str(e)
46 | finally:
47 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
48 |
49 |
50 | #: 作用: salt更新全部主机资源
51 | #: url: salt/updAllHostInfoBySalt
52 | #: 参数: hostId
53 | def updAllHostInfoBySalt(request):
54 | code, data, message = None, None, None
55 | try:
56 | # session回话验证
57 | checkUserSession(request)
58 | hostId = request.GET.get('hostId')
59 | if hostId and hostId.isdigit() == False:
60 | raise Exception('参数报错: hostId必须为整数')
61 | hostInfoList = hostInfoDao.getSaltIdFromHostInfo(hostId=hostId)
62 | if len(hostInfoList) == 0:
63 | raise Exception('主机处于已删除状态,无法更新!')
64 | # 获取存在的saltId
65 | saltIdList = [ hostInfo['salt_id'] for hostInfo in hostInfoList ]
66 | # salt检查主机是否正常
67 | saltCheckList = saltDao.getSaltTest(saltIdList)
68 | # 如果不正常更新状态为下线,状态正常添加到主机列表中,进行更新
69 |
70 | for host in hostInfoList:
71 | if saltCheckList[host['salt_id']] != True:
72 | saltIdList.remove(host['salt_id'])
73 | hostInfoDao.updAllHostInfobyHostId(host['host_id'], state=1)
74 |
75 | if hostInfoList is not None:
76 | # 针对正常主机,获取主机信息,进行更新
77 | saltGrains = saltDao.getSaltGrains(saltIdList)
78 | saltSsh = saltDao.getHostSsh(saltIdList)
79 | saltDisk = saltDao.getSaltDisk(saltIdList)
80 | saltMem = saltDao.getSaltMem(saltIdList)
81 | for saltId in saltIdList:
82 | # 主机详细更新
83 | hostName = saltGrains[saltId]['nodename']
84 | aliesName = saltGrains[saltId]['host']
85 | osFullName = saltGrains[saltId]['osfullname']
86 | osRelease = saltGrains[saltId]['osrelease']
87 | kernelRelease = saltGrains[saltId]['kernelrelease']
88 | cpuModel = saltGrains[saltId]['cpu_model']
89 | cpusNumber = saltGrains[saltId]['num_cpus']
90 | hostType = saltGrains[saltId]['virtual']
91 | sshPort = saltSsh[saltId]
92 | mem = saltMem[saltId]['MemTotal']['value']
93 | swap = saltMem[saltId]['SwapTotal']['value']
94 | hostId = hostInfoDao.updAllHostInfobyHostId(saltId=saltId, hostName=hostName, aliesName=aliesName, memory=None, swap=None,
95 | osFullname=osFullName, osRelease=osRelease, kernelRelease=kernelRelease,
96 | cpuModel=cpuModel, cpusNumber=cpusNumber, hostType=hostType, sshPort=sshPort, state=0)
97 | # 网卡数据更新
98 | networkDao.delFromNetworkById(hostId)
99 | for key, values in saltGrains[saltId]['ip4_interfaces'].items():
100 | if key == "lo" or len(values) == 0:
101 | continue
102 | network = networkDao.getFromNetworkByHostId(hostId, key)
103 | if network:
104 | networkDao.updFromNetworkByHostId(network.id, values[0])
105 | else:
106 | networkDao.setFromNetworkByHostId(hostId, key, values[0])
107 | # 磁盘数据更新
108 | diskInfoDao.delFromDiskInfoByHostId(hostId)
109 | diskList = saltDisk[saltId].split('\n')
110 | for diskStr in diskList:
111 | diskStrList = diskStr.split(' ')
112 | diskInfo = diskInfoDao.getFromDiskInfoById(hostId, diskStrList[1].strip(':'))
113 | if diskInfo:
114 | diskInfoDao.updFromDiskInfoByHostId(diskInfo.id, diskStrList[2], diskStrList[4])
115 | else:
116 | diskInfoDao.setFromDiskInfo(hostId, diskStrList[1].strip(':'), diskStrList[2], diskStrList[4])
117 |
118 | code, message = 200, '更新完成'
119 | except Exception as e:
120 | code, message = 300, str(e)
121 | finally:
122 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
123 |
124 |
125 | #: 作用: 主机远程批量命令执行
126 | #: url: salt/getCommandFromSaltBySaltIdList
127 | #: 参数: saltIdList, command
128 | def getCommandFromSaltBySaltIdList(request):
129 | code, data, message = None, None, None
130 | try:
131 | checkUserSession(request)
132 | saltIdList = request.GET.get('saltIdList')
133 | command = request.GET.get('command')
134 | if saltIdList is None or command is None or saltIdList == '':
135 | raise Exception('参数报错: saltIdList, command不能为空!')
136 | saltIdList = saltIdList.split(',')
137 | normalSaltIdList = hostInfoDao.getSaltIdListFromHostInfoByState(saltIdList)
138 | commandResult = {}
139 | if normalSaltIdList:
140 | commandResult = saltDao.getCommandFromSaltBySaltIdList(normalSaltIdList, command)
141 | abnormalsetSaltIdList = list(set(saltIdList) - set(normalSaltIdList))
142 | for saltId in abnormalsetSaltIdList:
143 | commandResult[saltId] = 'salt无法连接,请检查主机salt-minion是否正常!'
144 | code, data = 200, {'commandResult': commandResult}
145 | except Exception as e:
146 | code, message = 300, str(e)
147 | finally:
148 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
149 |
150 |
151 | #: 收集与更新主机项目列表
152 | #: url: salt/getProjectListFromHostInfoBySalt
153 | #: 参数: None
154 | def getProjectListFromHostInfoBySalt(request):
155 | code, data, message = None, None, None
156 | try:
157 | checkUserSession(request)
158 | hostInfoList = hostInfoDao.getALlFromHostInfoByState()
159 | projectInfoList = projectInfoDao.getProjectPathProjectNameFromProjectInfo()
160 |
161 | for hostInfo in hostInfoList:
162 | projectList = []
163 | for projectInfo in projectInfoList:
164 | saltResult = saltDao.getCheckFolderFromSaltBysaltIdList(hostInfo['salt_id'], projectInfo['project_path'])
165 | if saltResult[hostInfo['salt_id']] == True:
166 | projectList.append(projectInfo['project_id'])
167 | hostInfoDao.updProjectListFromHostInfoByHostId(hostInfo['host_id'], json.dumps(projectList))
168 |
169 | code, message= 200, '主机项目一键收集与更新完成'
170 | except Exception as e:
171 | code, message = 300, str(e)
172 | finally:
173 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
174 |
--------------------------------------------------------------------------------
/cmdb/views/controller/taskListController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import taskListDao
3 | from django.forms.models import model_to_dict
4 | from cmdb.views.dao import taskLogListDao
5 | import json
6 | from utils.DateEncoder import DateEncoder
7 | from utils.JsonResponse import JsonResponse
8 | from utils.UserSession import checkUserSession
9 |
10 |
11 | #: 作用: 返回所有任务count
12 | #: url: taskList/getCountFromTaskList
13 | #: 参数: userId
14 | def getCountFromTaskList(request):
15 | data = {}
16 | userId = request.GET.get('userId')
17 | count = taskListDao.getAllTaskCount(userId)
18 | data['count'] = count
19 | return HttpResponse(json.dumps(data).encode('utf-8'))
20 |
21 |
22 | #: 作用: 返回所有任务各种状态count
23 | #: url: taskList/getCountFromTaskListByTaskState
24 | #: 参数: userId, taskState
25 | def getCountFromTaskListByTaskState(request):
26 | data = {}
27 | userId = request.GET.get('userId')
28 | taskState = request.GET.get('taskState')
29 | if taskState is None:
30 | data['message'] = '任务状态不能为空!'
31 | else:
32 | count = taskListDao.getTaskStateCount(taskState, userId=userId)
33 | data['count'] = count
34 | return HttpResponse(json.dumps(data).encode('utf-8'))
35 |
36 |
37 | #: 作用: 返回指定任务详情
38 | #: url: taskList/getAllFromTaskListByTaskId
39 | #: 参数: taskId
40 | def getAllFromTaskListByTaskId(request):
41 | code, data, message = None, None, None
42 | try:
43 | checkUserSession(request)
44 | taskId = request.GET.get('taskId')
45 | if taskId is None:
46 | raise Exception('taskId不能为空')
47 | else:
48 | taskList = taskListDao.getAllFromTaskListByTaskId(taskId)
49 | code, data = 200, {'taskList': taskList}
50 | except Exception as e:
51 | code, data, message = 300, None, str(e)
52 | finally:
53 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
54 |
55 |
56 | #: 作用: 添加任务
57 | #: url: taskList/setAllFromTaskList
58 | #: 参数: taskName, taskInfo, executeId, authorizerId, modifyDate
59 | def setAllFromTaskList(request):
60 | code, data, message = None, None, None
61 | try:
62 | createId = checkUserSession(request)['user_id']
63 | taskName = request.GET.get('taskName')
64 | executeId = request.GET.get('executeId')
65 | authorizerId = request.GET.get('authorizerId')
66 | taskInfo = request.GET.get('taskInfo')
67 | modifyDate = request.GET.get('modifyDate')
68 | if taskInfo and executeId and authorizerId and modifyDate:
69 | taskId = taskListDao.setAllFromTaskList(taskName, taskInfo, createId, executeId, authorizerId, modifyDate)
70 | taskListDao.sendEmailFromTaskListByTaskId(taskId)
71 | code, data, message = 200, {'taskId': taskId}, '添加完成'
72 | else:
73 | raise Exception('参数报错:taskInfo, executeId, authorizerId, modifyDate都不能为空!')
74 | except Exception as e:
75 | code, data, message = 300, None, str(e)
76 | finally:
77 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
78 |
79 |
80 | #: 作用: 修改任务信息
81 | #: url: taskList/updAllFromTaskListByTaskId
82 | #: 参数: taskId,taskState,taskInfo,executeId,authorizerId,modifyDate
83 | def updAllFromTaskListByTaskId(request):
84 | code, data, message = None, None, None
85 | try:
86 | userInfo = checkUserSession(request)
87 | taskId = request.GET.get('taskId')
88 | taskInfo = request.GET.get('taskInfo')
89 | executeId = request.GET.get('executeId')
90 | authorizerId = request.GET.get('authorizerId')
91 | modifyDate = request.GET.get('modifyDate')
92 |
93 | if taskId is None:
94 | raise Exception('taskId不能为空')
95 | taskList = taskListDao.getAllFromTaskListByTaskId(taskId)
96 | if userInfo['user_name'] == 'admin':
97 | taskListDao.updAllFromTaskListByTaskId(taskId, taskInfo=taskInfo, executeId=executeId,
98 | authorizerId=authorizerId, modifyDate=modifyDate)
99 | code, data, message = 200, None, '修改完成'
100 | return
101 | if taskList['task_state'] == 2 or taskList['task_state'] == 4 or taskList['task_state'] == 3:
102 | raise Exception("修改失败:任务已经授权或完成操作,不能再修改任务内容!")
103 | else:
104 | taskListDao.updAllFromTaskListByTaskId(taskId, taskInfo=taskInfo, executeId=executeId, authorizerId=authorizerId, modifyDate=modifyDate)
105 | code, data, message = 200, None, '修改完成'
106 | except Exception as e:
107 | code, data, message = 300, None, str(e)
108 | finally:
109 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
110 |
111 |
112 | #: 作用: 更新任务状态
113 | #: url: taskList/updTaskStateFromTaskListByTaskId
114 | #: 参数: taskId,taskState
115 | def updTaskStateFromTaskListByTaskId(request):
116 | code, data, message = None, None, None
117 | try:
118 | userInfo = checkUserSession(request)
119 | taskId = request.GET.get('taskId')
120 | taskState = request.GET.get('taskState')
121 | remarks = request.GET.get('remarks')
122 | if userInfo['user_name'] == 'admin':
123 | taskListDao.updAllFromTaskListByTaskId(taskId, taskState=taskState, remarks=remarks)
124 | taskListDao.sendEmailFromTaskListByTaskId(taskId)
125 | code, message = 200, "任务状态更新完成"
126 | return
127 | if taskId is None and taskState is None:
128 | raise Exception('参数报错:taskId, taskState 都不能为空')
129 | if taskState.isdigit():
130 | taskState = int(taskState)
131 | taskList = taskListDao.getAllFromTaskListByTaskId(taskId)
132 | if taskList['task_state'] == 2 or taskList['task_state'] == 4:
133 | raise Exception("不能再次修改内容")
134 | elif taskState == 1:
135 | raise Exception("不能再将任务修改为审核中!")
136 | elif taskState == 2 or taskState == 3:
137 | if taskList['task_state'] == 1 and userInfo['user_id'] == taskList['authorizer_id']:
138 | taskListDao.updAllFromTaskListByTaskId(taskId, taskState=taskState, remarks=remarks)
139 | elif taskList['task_state'] != 1:
140 | raise Exception('任务状态必须为审核中!')
141 | else:
142 | raise Exception('操作权限失败,任务授权人不是您!')
143 | elif taskState == 4:
144 | if taskList['task_state'] == 3 and userInfo['user_id'] == taskList['execute_id']:
145 | taskListDao.updAllFromTaskListByTaskId(taskId, taskState=taskState)
146 | elif taskList['task_state'] != 3:
147 | raise Exception('任务状态必须为审核完成!')
148 | else:
149 | raise Exception('操作权限失败,任务执行人不是您!')
150 | else:
151 | raise Exception('暂无您指定的状态')
152 | taskListDao.sendEmailFromTaskListByTaskId(taskId)
153 | code, message = 200, "任务状态更新完成"
154 | except Exception as e:
155 | code, data, message = 300, None, str(e)
156 | finally:
157 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
158 |
159 |
160 | #: 作用: 查询任务操作日志
161 | #: url: taskList/getAllFromTaskLogListByTaskId
162 | #: 参数: taskId
163 | def getAllFromTaskLogListByTaskId(request):
164 | data = {}
165 | taskId = request.GET.get('taskId')
166 | try:
167 | checkUserSession(request)
168 | if taskId is None:
169 | data['message'] = '参数报错: taskId不能为空!'
170 | else:
171 | taskLogList = taskLogListDao.getAllFromTaskLogListByTaskId(taskId)
172 | for taskLog in taskLogList:
173 | data[taskLog.log_id] = model_to_dict(taskLog)
174 | except Exception as e:
175 | data['message'] = str(e)
176 | finally:
177 | return HttpResponse(json.dumps(data, cls=DateEncoder, ensure_ascii=False).encode('utf-8'))
178 |
179 |
180 | #: 作用: 添加任务操作日志
181 | #: url: taskList/setAllFromTaskLogListByTaskId
182 | #: 参数: taskId,execute,logInfo
183 | def setAllFromTaskLogListByTaskId(request):
184 | data = {}
185 | taskId = request.GET.get('taskId')
186 | execute = request.GET.get('execute')
187 | logInfo = request.GET.get('logInfo')
188 | try:
189 | userInfo = checkUserSession(request)
190 | if taskId and execute and logInfo:
191 | logId = taskLogListDao.setFromTaskLogListByTaskId(taskId, execute, logInfo)
192 | data['logId'] = logId
193 | else:
194 | data['message'] = '参数报错: taskId,execute,logInfo不能为空!'
195 | except Exception as e:
196 | data['message'] = str(e)
197 | finally:
198 | return HttpResponse(json.dumps(data).encode('utf-8'))
199 |
200 |
201 | #: 作用: 任务分页查询
202 | #: url: taskList/getAllFromTaskListByPage
203 | #: 参数: page,userId,taskState
204 | def getAllFromTaskListByPage(request):
205 | code, data, message = None, None, None
206 | try:
207 | userInfo = checkUserSession(request)
208 | page = request.GET.get('page')
209 | taskState = request.GET.get('taskState')
210 | type = request.GET.get('type')
211 | taskName = request.GET.get('taskName')
212 | userId = None
213 | if type == 'user' and userInfo['user_name'] != 'admin':
214 | userId = userInfo['user_id']
215 | if page:
216 | taskList, num_pages = taskListDao.getAllFromTaskListByPage(page, taskName=taskName, taskState=taskState, userId=userId)
217 | data = {
218 | 'taskList': list(taskList),
219 | 'num_pages': num_pages,
220 | 'page': int(page)
221 | }
222 | code = 200
223 | else:
224 | raise Exception('参数报错: page不能为空')
225 | except Exception as e:
226 | code, data, message = 300, None, str(e)
227 | finally:
228 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
229 |
--------------------------------------------------------------------------------
/cmdb/views/controller/userGroupController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import userGroupDao, userInfoDao
3 | from utils.JsonResponse import JsonResponse
4 | from utils.JsonResponse import OrmConversion
5 | from utils.UserSession import checkUserSession
6 |
7 |
8 | #: 作用: 根据groupId查询查询用户组信息
9 | #: url: userGroup/getAllFromUserGroupByGroupId
10 | #: 参数: groupId
11 | def getAllFromUserGroupByGroupId(requset):
12 | code, data, message = None, None, None
13 | try:
14 | checkUserSession(requset)
15 | groupId = requset.GET.get('groupId')
16 | if groupId:
17 | userGroup = userGroupDao.getAllFromUserGroupByGroupId(groupId)
18 | code, data = 200, {'userGroup': OrmConversion(userGroup)}
19 | else:
20 | raise Exception('参数报错: groupId 不能为空!')
21 | except Exception as e:
22 | code, data, message = 300, None, str(e)
23 | finally:
24 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
25 |
26 |
27 | #: 作用: 添加用户分组信息
28 | #: url: userGroup/setFromUserGroup
29 | #: 参数: groupName, roleId, remarks
30 | def setFromUserGroup(requset):
31 | code, data, message = None, None, None
32 | try:
33 | checkUserSession(requset)
34 | groupName = requset.GET.get('groupName')
35 | roleId = requset.GET.get('roleId')
36 | remarks = requset.GET.get('remarks')
37 | if groupName:
38 | userGroupDao.setFromUserGroup(groupName, roleId, remarks)
39 | code, message = 200, '添加完成'
40 | else:
41 | raise Exception('参数报错: groupName 不能为空!')
42 | except Exception as e:
43 | code, data, message = 300, None, str(e)
44 | finally:
45 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
46 |
47 |
48 |
49 | #: 作用: 根据groupId更新用户信息
50 | #: url: userGroup/updAllFromUserGroupByGroupId
51 | #: 参数: groupId, groupName, roleId, remarks
52 | def updAllFromUserGroupByGroupId(requset):
53 | code, data, message = None, None, None
54 | try:
55 | checkUserSession(requset)
56 | groupId = requset.GET.get('groupId')
57 | groupName = requset.GET.get('groupName')
58 | roleId = requset.GET.get('roleId')
59 | remarks = requset.GET.get('remarks')
60 | if groupId:
61 | userGroupDao.updAllFromUserGroupByGroupId(groupId, groupName=groupName, roleId=roleId, remarks=remarks)
62 | code, message = 200, '更新完成'
63 | else:
64 | raise Exception('参数报错: groupId 不能为空!')
65 | except Exception as e:
66 | code, data, message = 300, None, str(e)
67 | finally:
68 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
69 |
70 |
71 | #: 作用: 根据groupId删除角色信息
72 | #: url: userGroup/delFromUserGroupByGroupId
73 | #: 参数: groupId
74 | def delFromUserGroupByGroupId(requset):
75 | code, data, message = None, None, None
76 | try:
77 | checkUserSession(requset)
78 | groupId = requset.GET.get('groupId')
79 | if groupId:
80 | userInfoDao.updGroupIdFromUserInfoByGroupId(groupId)
81 | userGroupDao.delFromUserGroupByGroupId(groupId)
82 | code, message = 200, '删除完成'
83 | else:
84 | raise Exception('参数报错: groupId 不能为空!')
85 | except Exception as e:
86 | code, data, message = 300, None, str(e)
87 | finally:
88 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
89 |
90 |
91 | #: 作用: 用户组分页查询带模糊查询功能
92 | #: url: userGroup/getListFromUserGroupByPage
93 | #: 参数: page, groupName
94 | def getListFromUserGroupByPage(requset):
95 | code, data, message = None, None, None
96 | try:
97 | checkUserSession(requset)
98 | page = requset.GET.get('page')
99 | groupName = requset.GET.get('groupName')
100 | if page:
101 | userGroupList, numPages = userGroupDao.getListFromUserGroupByPage(page=page, groupName=groupName)
102 | code = 200
103 | data = {
104 | 'userGroupList': list(userGroupList),
105 | 'numPages': numPages,
106 | 'page': int(page)
107 | }
108 | else:
109 | raise Exception('参数报错: page 不能为空!')
110 | except Exception as e:
111 | code, data, message = 300, None, str(e)
112 | finally:
113 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
114 |
115 |
116 | #: 作用: 获取所有用户组与用户组Id
117 | #: url: userGroup/getGroupIdAndGroupNameFromUserGroup
118 | #: 参数: groupId
119 | def getGroupIdAndGroupNameFromUserGroup(requset):
120 | code, data, message = None, None, None
121 | try:
122 | checkUserSession(requset)
123 | userGroupList = userGroupDao.getGroupIdAndGroupNameFromUserGroup()
124 | code, data = 200, {'userGroupList': list(userGroupList)}
125 | except Exception as e:
126 | code, data, message = 300, None, str(e)
127 | finally:
128 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
129 |
--------------------------------------------------------------------------------
/cmdb/views/controller/userInfoController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import *
2 | from cmdb.views.dao import userInfoDao, userGroupDao
3 | from utils.JsonResponse import JsonResponse
4 | import hashlib
5 | from utils.UserSession import checkUserSession
6 |
7 |
8 | #: 作用: 添加用户
9 | #: url: userInfo/setFromUserInfo
10 | #: 参数: email, phone, userName, password
11 | def setFromUserInfo(request):
12 | code, data, message = None, None, None
13 | try:
14 | email = request.GET.get('email')
15 | phone = request.GET.get('phone')
16 | userName = request.GET.get('userName')
17 | password = request.GET.get('passWord')
18 | if email and phone and userName and password:
19 | if userName == 'admin':
20 | raise Exception('参数报错: 不能注册管理员账号!')
21 | userInfo = userInfoDao.getFromUserInfoByLogin(phone)
22 | if userInfo:
23 | raise Exception("注册失败,手机号码已存在")
24 | userInfo = userInfoDao.getFromUserInfoByLogin(email)
25 | if userInfo:
26 | raise Exception("注册失败,邮箱已存在")
27 | h = hashlib.sha256()
28 | h.update(bytes(password, encoding='utf-8'))
29 | password = h.hexdigest()
30 | userGroup = userGroupDao.getAllFromUserGroupByGroupName('员工部')
31 | userInfoDao.setFromUserInfo(email, phone, userName, password, userGroup.group_id)
32 | code, message = 200, '账号注册成功'
33 | else:
34 | raise Exception('参数报错: 邮箱, 手机号码, 用户名, 密码 都不能为空!')
35 | except Exception as e:
36 | code, message = 300, str(e)
37 | finally:
38 | return HttpResponse(JsonResponse(code=code, message=message, data=None).getJson())
39 |
40 |
41 | #: 作用: 修改用户信息-个人用户使用
42 | #: url: userInfo/updInfoFromUserInfo
43 | #: 参数: userName, password
44 | def updInfoFromUserInfo(request):
45 | code, data, message = None, None, None
46 | try:
47 | userInfo = checkUserSession(request)
48 | userName = request.GET.get('userName')
49 | phone = request.GET.get('phone')
50 | email = request.GET.get('email')
51 | if userName:
52 | if phone:
53 | checkUserInfo = userInfoDao.getFromUserInfoByLogin(phone)
54 | if checkUserInfo and checkUserInfo.user_id != userInfo['user_id']:
55 | raise Exception("参数报错: 手机号码已存在")
56 | if email:
57 | checkUserInfo = userInfoDao.getFromUserInfoByLogin(phone)
58 | if checkUserInfo and checkUserInfo.user_id != userInfo['user_id']:
59 | raise Exception("参数报错: 邮箱已存在")
60 | userInfoDao.updAllFromUserInfoByUserId(userInfo['user_id'], userName=userName, phone=phone, email=email)
61 | code, message = 200, '信息更新成功'
62 | else:
63 | raise Exception('参数报错: 用户名不能修改为空!')
64 | except Exception as e:
65 | code, message = 300, str(e)
66 | finally:
67 | return HttpResponse(JsonResponse(code=code, message=message, data=None).getJson())
68 |
69 |
70 | #: 作用: 修改用户密码-个人用户使用
71 | #: url: userInfo/updPassWordFromUserInfo
72 | #: 参数: oldPassWrod, newPassWord
73 | def updPassWordFromUserInfo(request):
74 | code, data, message = None, None, None
75 | try:
76 | userInfo = checkUserSession(request)
77 | oldPassWrod = request.GET.get('oldPassWrod')
78 | newPassWord = request.GET.get('newPassWord')
79 | if oldPassWrod and newPassWord:
80 | #: 密旧码验证
81 | h = hashlib.sha256()
82 | h.update(bytes(oldPassWrod, encoding='utf-8'))
83 | oldPassWrod = h.hexdigest()
84 | dbPassWord = userInfoDao.getPassWordFromUserInfoByUserId(userInfo['user_id'])
85 | if oldPassWrod != dbPassWord:
86 | raise Exception('参数报错: 老密码错误,请重新输入谢谢!')
87 | #: 新密码更新
88 | p = hashlib.sha256()
89 | p.update(bytes(newPassWord, encoding='utf-8'))
90 | newPassWord = p.hexdigest()
91 | userInfoDao.updAllFromUserInfoByUserId(userInfo['user_id'], password=newPassWord)
92 | code, message = 200, '密码修改成功'
93 | else:
94 | raise Exception("参数报错: 新旧密码不能为空!")
95 | except Exception as e:
96 | code, message = 300, str(e)
97 | finally:
98 | return HttpResponse(JsonResponse(code=code, message=message, data=None).getJson())
99 |
100 |
101 | #: 作用: 登录验证+session
102 | #: url: userInfo/getFromUserInfoByLogin
103 | #: 参数: account, password
104 | def getFromUserInfoByLogin(request):
105 | code, data, message = None, None, None
106 | try:
107 | account = request.GET.get('account')
108 | password = request.GET.get('password')
109 | if account and password:
110 | userInfo = userInfoDao.getFromUserInfoByLogin(account)
111 | if userInfo:
112 | if userInfo.state == 2:
113 | raise Exception('登录报错: 对不起,您已离职,账号无法再次使用!')
114 | h = hashlib.sha256()
115 | h.update(bytes(password, encoding='utf-8'))
116 | if userInfo.password == h.hexdigest():
117 | request.session['userId'] = userInfo.user_id
118 | code, data, message = 200, {'userName': userInfo.user_name}, "登录完成"
119 | else:
120 | raise Exception('密码输入错误')
121 | else:
122 | raise Exception("用户不存在")
123 | else:
124 | raise Exception('参数报错: 登录名与密码不能为空')
125 | except Exception as e:
126 | code, message = 300, str(e)
127 | finally:
128 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
129 |
130 |
131 | #: 注销登录
132 | #: url: userInfo/delFromSessionByKey
133 | #: 参数: None
134 | def delFromSessionByKey(request):
135 | code, data, message = None, None, None
136 | try:
137 | del request.session["userId"]
138 | code, message = 200, '注销完成'
139 | except Exception as e:
140 | code, message = 300, '用户没有登录,无需注销'
141 | finally:
142 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
143 |
144 |
145 | #: 查询指定用户信息-admin用户使用
146 | #: url: userInfo/getAllFromUsreInfoByUserId
147 | #: 参数: userId
148 | def getAllFromUsreInfoByUserId(request):
149 | code, data, message = None, None, None
150 | try:
151 | checkUserSession(request)
152 | userId = request.GET.get('userId')
153 | if userId is None:
154 | raise Exception('参数报错: userId不能为空!')
155 | userInfo = userInfoDao.getAllFromUsreInfoByUserId(userId)
156 | code, data = 200, {'userInfo': userInfo}
157 | except Exception as e:
158 | code, message = 300, str(e)
159 | finally:
160 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
161 |
162 |
163 | #: 查询全部用户id与用户名
164 | #: url: userInfo/getAllUserInfo
165 | #: 参数: None
166 | def getAllUserInfo(request):
167 | code, data, message = None, None, None
168 | try:
169 | checkUserSession(request)
170 | groupId = request.GET.get("groupId")
171 | userInfoList = userInfoDao.getAllUserInfo(groupId=groupId)
172 | code, data = 200, list(userInfoList)
173 | except Exception as e:
174 | code, message = 300, str(e)
175 | finally:
176 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
177 |
178 |
179 | #: 用户信息查询分页功能,模糊查询
180 | #: url: userInfo/getAllFromUserInfoByPage
181 | #: 参数: groupId, userName
182 | def getAllFromUserInfoByPage(request):
183 | code, data, message = None, None, None
184 | try:
185 | checkUserSession(request)
186 | page = request.GET.get('page')
187 | groupId = request.GET.get('groupId')
188 | userName = request.GET.get('userName')
189 | userInfoList, numPages = userInfoDao.getAllFromUserInfoByPage(page=page, groupId=groupId, userName=userName)
190 | code = 200
191 | data = {
192 | 'userInfoList': list(userInfoList),
193 | 'numPages': numPages,
194 | 'page': int(page)
195 | }
196 | except Exception as e:
197 | code, message = 300, str(e)
198 | finally:
199 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
200 |
201 |
202 | #: 查询个人用户信息
203 | #: url: userInfo/getAllFromUsreInfoByMyself
204 | #: 参数: userId
205 | def getAllFromUsreInfoByMyself(request):
206 | code, data, message = None, None, None
207 | try:
208 | userInfo = checkUserSession(request)
209 | userInfo = userInfoDao.getAllFromUsreInfoByUserId(userInfo['user_id'])
210 | code, data = 200, {'userInfo': userInfo}
211 | except Exception as e:
212 | code, message = 300, str(e)
213 | finally:
214 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
215 |
216 |
217 | #: 作用: 重置用户密码-管理员使用
218 | #: url: userInfo/updPassWordFromUserInfoByUserId
219 | #: 参数: userId, password
220 | def updPassWordFromUserInfoByUserId(request):
221 | code, data, message = None, None, None
222 | try:
223 | checkUserSession(request)
224 | userId = request.GET.get('userId')
225 | password = request.GET.get('password')
226 | if userId and password:
227 | h = hashlib.sha256()
228 | h.update(bytes(password, encoding='utf-8'))
229 | password = h.hexdigest()
230 | userInfoDao.updAllFromUserInfoByUserId(userId, password=password)
231 | code, message = 200, '重置密码成功'
232 | else:
233 | raise Exception("参数报错: userId与password 都不能为空!")
234 | except Exception as e:
235 | code, message = 300, str(e)
236 | finally:
237 | return HttpResponse(JsonResponse(code=code, message=message, data=None).getJson())
238 |
239 |
240 | #: 作用: 修改用户分组-管理员使用
241 | #: url: userInfo/updGroupFromUserInfoByUserId
242 | #: 参数: userId, password
243 | def updGroupFromUserInfoByUserId(request):
244 | code, data, message = None, None, None
245 | try:
246 | checkUserSession(request)
247 | userId = request.GET.get('userId')
248 | groupId = request.GET.get('groupId')
249 | state = request.GET.get('state')
250 | if userId:
251 | userInfoDao.updAllFromUserInfoByUserId(userId, groupId=groupId, state=state)
252 | code, message = 200, '修改用户信息完成'
253 | else:
254 | raise Exception("参数报错: userId 不能为空!")
255 | except Exception as e:
256 | code, message = 300, str(e)
257 | finally:
258 | return HttpResponse(JsonResponse(code=code, message=message, data=None).getJson())
--------------------------------------------------------------------------------
/cmdb/views/controller/vlanController.py:
--------------------------------------------------------------------------------
1 | from django.shortcuts import HttpResponse
2 | from cmdb.views.dao import vlanDao
3 | from utils.JsonResponse import JsonResponse
4 | from utils.JsonResponse import OrmConversion
5 | from utils.UserSession import checkUserSession
6 |
7 |
8 | #: 作用: 添加vlan
9 | #: url: vlan/setFromVlan
10 | #: 参数: vlanName, gateway, network
11 | def setFromVlan(requset):
12 | code, data, message = None, None, None
13 | try:
14 | checkUserSession(requset)
15 | vlanName = requset.GET.get('vlanName')
16 | gateway = requset.GET.get('gateway')
17 | network = requset.GET.get('network')
18 | if vlanName and gateway and network:
19 | vlanInfo = vlanDao.getAllFromVlanByVlanName(vlanName)
20 | if vlanInfo != None:
21 | raise Exception("vlan名已存在,请修改vlan名!")
22 | vlanDao.setFromVlan(vlanName, gateway, network)
23 | code, message = 200, '添加成功'
24 | else:
25 | raise Exception('参数报错: vlanName, gateway, network 都不能为空!')
26 | except Exception as e:
27 | code, data, message = 300, None, str(e)
28 | finally:
29 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
30 |
31 |
32 | #: 作用: 删除vlan
33 | #: url: vlan/delFromVlanById
34 | #: 参数: id
35 | def delFromVlanById(requset):
36 | code, data, message = None, None, None
37 | try:
38 | checkUserSession(requset)
39 | id= requset.GET.get('id')
40 | if id and id.isdigit():
41 | vlanDao.delFromVlanById(id)
42 | code, message = 200, '删除成功'
43 | else:
44 | raise Exception('参数报错: id不能为空!')
45 | except Exception as e:
46 | code, data, message = 300, None, str(e)
47 | finally:
48 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
49 |
50 |
51 | #: 作用: 查看分页vlan
52 | #: url: vlan/getAllFromVlanByPage
53 | #: 参数: page, vlanName
54 | def getAllFromVlanByPage(requset):
55 | code, data, message = None, None, None
56 | try:
57 | checkUserSession(requset)
58 | page = requset.GET.get('page')
59 | vlanName = requset.GET.get('vlanName')
60 | if page:
61 | vlanList, numPages = vlanDao.getAllFromVlanByPage(page=page, vlanName=vlanName)
62 | code = 200
63 | data = {
64 | 'vlanList': OrmConversion(list(vlanList)),
65 | 'numPages': numPages,
66 | 'page': int(page)
67 | }
68 | else:
69 | raise Exception('参数报错: page不能为空')
70 | except Exception as e:
71 | code, data, message = 300, None, str(e)
72 | finally:
73 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
74 |
75 |
76 | #: 作用: 更新vlan信息
77 | #: url: vlan/updAllFromVlanById
78 | #: 参数: id, vlanName, gateway, network
79 | def updAllFromVlanById(requset):
80 | code, data, message = None, None, None
81 | try:
82 | checkUserSession(requset)
83 | id = requset.GET.get('id')
84 | vlanName = requset.GET.get('vlanName')
85 | gateway = requset.GET.get('gateway')
86 | network = requset.GET.get('network')
87 | if id and id.isdigit():
88 | vlanDao.updAllFromVlanById(id, vlanName=vlanName, gateway=gateway, network=network)
89 | code, message = 200, '更新成功'
90 | else:
91 | raise Exception('参数报错: id不能为空!')
92 | except Exception as e:
93 | code, data, message = 300, None, str(e)
94 | finally:
95 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
96 |
97 |
98 | #: 作用: 查看指定vlan信息
99 | #: url: vlan/getAllFromValnById
100 | #: 参数: id
101 | def getAllFromValnById(requset):
102 | code, data, message = None, None, None
103 | try:
104 | checkUserSession(requset)
105 | id = requset.GET.get('id')
106 | if id and id.isdigit():
107 | vlanInfo = vlanDao.getAllFromValnById(id)
108 | code, data = 200, { 'vlan': OrmConversion(vlanInfo) }
109 | else:
110 | raise Exception('参数报错: id不能为空!')
111 | except Exception as e:
112 | code, data, message = 300, None, str(e)
113 | finally:
114 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
115 |
116 |
117 | #: 作用: 查看所有vlan信息
118 | #: url: vlan/getIdAndVlanNameFromVlan
119 | #: 参数: None
120 | def getIdAndVlanNameFromVlan(requset):
121 | code, data, message = None, None, None
122 | try:
123 | checkUserSession(requset)
124 | vlanList = vlanDao.getIdAndVlanNameFromVlan()
125 | code, data = 200, {'vlanList': list(vlanList)}
126 | except Exception as e:
127 | code, data, message = 300, None, str(e)
128 | finally:
129 | return HttpResponse(JsonResponse(code=code, message=message, data=data).getJson())
--------------------------------------------------------------------------------
/cmdb/views/dao/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tender-Liu/cmdb-python/a2eb1ca51cc062b677ece5746569906d087c8202/cmdb/views/dao/__init__.py
--------------------------------------------------------------------------------
/cmdb/views/dao/ambientDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import Ambient, HostInfo
2 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
3 |
4 |
5 | #: 添加Ambient
6 | def setFromAmbient(ambientName, remarks):
7 | ambient = Ambient.objects.create(
8 | ambient_name=ambientName,
9 | remarks=remarks
10 | )
11 | ambient.save()
12 |
13 |
14 | #: 删除Ambient
15 | def delFromAmbientById(id):
16 | hostInfoList = HostInfo.objects.filter(ambient__id=id).iterator()
17 | if len(list(hostInfoList)) == 0:
18 | Ambient.objects.get(id=id).delete()
19 | else:
20 | raise Exception("环境删除失败:环境中还有主机存在!")
21 |
22 |
23 | #: 查看Ambient
24 | def getAllFromAmbient():
25 | ambient = Ambient.objects.all().iterator()
26 | return ambient
27 |
28 |
29 | #: 更新Ambient
30 | def updAllFromAmbientById(id, ambientName=None, remarks=None):
31 | ambient = Ambient.objects.get(id=id)
32 | if ambientName:
33 | ambient.ambient_name = ambientName
34 | if remarks:
35 | ambient.remarks = remarks
36 | ambient.save()
37 |
38 |
39 | #: 查看指定Ambient信息
40 | def getAllFromAmbientById(id):
41 | ambient = Ambient.objects.get(id=id)
42 | return ambient
43 |
44 |
45 | #: 作用: 查看分页Ambient信息
46 | def getAllFromAmbientByPage(page=1, count=10, ambientName=None):
47 | if ambientName:
48 | ambientList = Ambient.objects.filter(ambient_name__contains=ambientName).order_by("id")
49 | else:
50 | ambientList = Ambient.objects.all().order_by("id")
51 | paginator = Paginator(ambientList, count)
52 | pageList = paginator.page(number=page)
53 | return pageList, paginator.num_pages
--------------------------------------------------------------------------------
/cmdb/views/dao/apiInfoDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import ApiInfo, RoleInfo
2 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
3 | import json
4 |
5 |
6 | #: 根据apiId查询api信息
7 | def getAllFromApiInfoByApiId(apiId):
8 | apiInfo = ApiInfo.objects.get(api_id=apiId)
9 | return apiInfo
10 |
11 |
12 | #: 添加api信息
13 | def setFromApiInfo(apiUrl, apiName, remarks):
14 | apiInfo = ApiInfo.objects.create(
15 | api_url=apiUrl,
16 | api_name=apiName,
17 | remarks=remarks
18 | )
19 | apiInfo.save()
20 | return apiInfo.api_id
21 |
22 |
23 | #: 根据apiId更新api信息
24 | def updAllFromApiInfoByApiId(apiId, apiUrl=None, apiName=None, remarks=None):
25 | apiInfo = ApiInfo.objects.get(api_id=apiId)
26 | if apiUrl:
27 | apiInfo.api_url = apiUrl
28 | if apiName:
29 | apiInfo.api_name = apiName
30 | if remarks:
31 | apiInfo.remarks = remarks
32 | apiInfo.save()
33 |
34 |
35 | #: 根据apiId删除指定api信息
36 | def delFromApiInfoByApiId(apiId):
37 | apiInfoList = RoleInfo.objects.filter(api_list__contains=apiId)
38 | for apiInfo in apiInfoList:
39 | apiList = json.loads(apiInfo.api_list)
40 | apiList.remove(int(apiId))
41 | apiInfo.api_list = json.dumps(apiList)
42 | apiInfo.save()
43 | ApiInfo.objects.get(api_id=apiId).delete()
44 |
45 |
46 | #: apiInfo分页查询带模糊查询功能
47 | def getListFromApiInfoByPage(page=1, count=10, apiUrl=None):
48 | if apiUrl:
49 | apiInfoList = ApiInfo.objects.filter(api_url__contains=apiUrl).order_by("-create_time")
50 | else:
51 | apiInfoList = ApiInfo.objects.all().order_by("-create_time")
52 |
53 | paginator = Paginator(apiInfoList, count)
54 | pageList = paginator.page(number=page)
55 | return pageList, paginator.num_pages
56 |
57 |
58 | #: 根据apiUrl查询api是否存在,返回apiId
59 | def getApiIdFromApiInfoByApiUrl(apiUrl):
60 | apiInfo = ApiInfo.objects.filter(api_url=apiUrl).values('api_id').first()
61 | return apiInfo['api_id']
62 |
63 |
64 | #: 查询apiId列表查询api信息
65 | def getAllFromApiInfoByApiIdList(apiIdList):
66 | apiInfoList = ApiInfo.objects.filter(api_id__in=apiIdList).iterator()
67 | return apiInfoList
68 |
69 |
70 | #: 查询除apiId列表中的api信息
71 | def getAllFromApiInfoByNotApiIdList(apiIdList):
72 | apiInfoList = ApiInfo.objects.exclude(api_id__in=apiIdList).iterator()
73 | return apiInfoList
74 |
75 |
76 | #: 查询所有api信息,管理员使用
77 | def getAllFromApiInfo():
78 | apiInfoList = ApiInfo.objects.all().iterator()
79 | return apiInfoList
--------------------------------------------------------------------------------
/cmdb/views/dao/diskInfoDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import DiskInfo
2 |
3 |
4 | def getFromDiskInfoById(hostId, diskName):
5 | diskInfo = DiskInfo.objects.filter(host_id=hostId, disk_name=diskName).first()
6 | return diskInfo
7 |
8 |
9 | def setFromDiskInfo(hostId, diskName, sizeGb, sizeBytes):
10 | diskInfo = DiskInfo.objects.create(
11 | host_id=hostId,
12 | disk_name=diskName,
13 | size_gb=sizeGb,
14 | size_bytes=sizeBytes
15 | )
16 | diskInfo.save()
17 |
18 |
19 | def updFromDiskInfoByHostId(id, sizeGb, sizeBytes , hostId=None, diskName=None):
20 | diskInfo = DiskInfo.objects.get(id=id)
21 | if hostId:
22 | diskInfo.host_id = hostId
23 | if diskName:
24 | diskInfo.disk_name = diskName
25 | diskInfo.size_gb = sizeGb
26 | diskInfo.size_bytes = sizeBytes
27 | diskInfo.state=0
28 | diskInfo.save()
29 |
30 |
31 | def delFromDiskInfoByHostId(hostId):
32 | DiskInfo.objects.filter(host_id=hostId).update(state=1)
33 |
34 |
35 | def getAllFromDiskInFoByHostId(hostId):
36 | diskInfoList = DiskInfo.objects.filter(host_id=hostId).iterator()
37 | return diskInfoList
--------------------------------------------------------------------------------
/cmdb/views/dao/gitInfoDao.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*-coding:utf-8-*-
3 | from cmdb.models import GitInfo, ProjectInfo
4 | from cmdb.views.dao import projectInfoDao
5 | from django.core.paginator import Paginator
6 | from django.utils import timezone
7 | from utils.githot import githot
8 | from devops.settings import ProjectPath
9 | import os
10 |
11 |
12 | #: 添加git信息
13 | def addFromGitInfo(gitName, gitKey=None, gitPass=None, remarks=None):
14 | gitInfo = GitInfo.objects.create(
15 | git_name=gitName,
16 | git_key=gitKey,
17 | git_pass=gitPass,
18 | remarks=remarks
19 | )
20 | gitInfo.save()
21 | return gitInfo.git_id
22 |
23 |
24 | #: 删除git信息
25 | def delFromGitInfoByGitId(gitId):
26 | #: 去除项目中指定的gitId
27 | projectInfoList = ProjectInfo.objects.filter(git_id=gitId)
28 | for projectInfo in projectInfoList:
29 | projectInfo.git_id = None
30 | projectInfo.save()
31 | GitInfo.objects.get(git_id=gitId).delete()
32 |
33 |
34 | #: 更新git信息
35 | def updAllFromGitInfoByGitId(gitId, remarks, gitKey, gitPass=None, gitName=None):
36 | gitInfo = GitInfo.objects.get(git_id=gitId)
37 | if gitName:
38 | gitInfo.git_name = gitName
39 |
40 | gitInfo.git_pass = gitPass
41 | gitInfo.git_key = gitKey
42 | gitInfo.remarks = remarks
43 | gitInfo.update_time = timezone.now()
44 | gitInfo.save()
45 | return gitInfo.git_id
46 |
47 |
48 | #: 查询指定git信息
49 | def getAllFromGitInfoByGitId(gitId):
50 | gitInfo = GitInfo.objects.get(git_id=gitId)
51 | return gitInfo
52 |
53 |
54 | #: 查询所有git名称,前端使用
55 | def getGitNameFromGitInfo():
56 | gitInfoList = GitInfo.objects.values("git_id", "git_name").all()
57 | return gitInfoList
58 |
59 |
60 | #: 分页查询,带模糊查询
61 | def getAllFromGitInfoByPage(page, count=10, gitName=None):
62 | filter_dict = dict()
63 | if gitName:
64 | filter_dict['git_name__contains'] = gitName
65 | gitInfoList = GitInfo.objects.filter(**filter_dict).order_by('git_id')
66 |
67 | paginator = Paginator(gitInfoList, count)
68 | pageList = paginator.page(number=page)
69 | return pageList, paginator.num_pages
70 |
71 |
72 | #: 根据项目id,获取所有git分支名
73 | def getBranchsFromGitByProjectId(projectId):
74 | projectInfo = projectInfoDao.getAllFromProjectInfoByProjectId(projectId)
75 | if projectInfo['github_url'] is None or projectInfo['git'] is None:
76 | raise Exception('数据报错: 次项目git地址与git账号密码不能为空!')
77 | gitInfo = getAllFromGitInfoByGitId(projectInfo['git'])
78 | localPath = ProjectPath['build']+'/' + projectInfo['project_name']
79 | if os.path.exists(localPath) == False:
80 | os.makedirs(localPath)
81 | gitHot = githot(projectInfo['github_url'], gitInfo.git_name, gitInfo.git_pass, localPath)
82 | branchs = gitHot.getBranchsFromGit()
83 | return branchs
--------------------------------------------------------------------------------
/cmdb/views/dao/hostInfoDao.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*-coding:utf-8-*-
3 | from cmdb.views.dao import saltDao
4 | from cmdb.models import *
5 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
6 | import json
7 | from django.db.models import Q
8 |
9 |
10 | #: 获取数据库中不存在的新主机
11 | def getNewSaltId():
12 | newHost = []
13 | saltHostList = saltDao.getSaltTest("*")
14 | for saltHostInfo in saltHostList.keys():
15 | if saltHostList[saltHostInfo] == True:
16 | hostInfo = HostInfo.objects.filter(salt_id=saltHostInfo).first()
17 | if hostInfo is None:
18 | newHost.append(saltHostInfo)
19 | return newHost
20 |
21 |
22 | #: salt收集主机信息,保存数据库
23 | #: 使用此方法,请先使用test方法,测试salt-minion连接性
24 | def setSaltHostInfo(saltIdList):
25 | saltGrains = saltDao.getSaltGrains(saltIdList)
26 | saltSsh = saltDao.getHostSsh(saltIdList)
27 | saltDisk = saltDao.getSaltDisk(saltIdList)
28 | saltMem = saltDao.getSaltMem(saltIdList)
29 | for saltId in saltIdList:
30 | hostName = saltGrains[saltId]['nodename']
31 | aliesName = saltGrains[saltId]['host']
32 | osFullName = saltGrains[saltId]['osfullname']
33 | osRelease = saltGrains[saltId]['osrelease']
34 | kernelRelease = saltGrains[saltId]['kernelrelease']
35 | cpuModel = saltGrains[saltId]['cpu_model']
36 | cpusNumber = saltGrains[saltId]['num_cpus']
37 | hostType = saltGrains[saltId]['virtual']
38 | sshPort = saltSsh[saltId]
39 | mem = saltMem[saltId]['MemTotal']['value']
40 | swap = saltMem[saltId]['SwapTotal']['value']
41 |
42 | hostInfo = HostInfo.objects.create(
43 | salt_id=saltId,
44 | host_name=hostName,
45 | alies_name=aliesName,
46 | os_fullname=osFullName,
47 | os_release=osRelease,
48 | kernel_release=kernelRelease,
49 | cpu_model=cpuModel,
50 | cpus_number = cpusNumber,
51 | host_type = hostType,
52 | memory=mem,
53 | swap=swap,
54 | ssh_port=sshPort,
55 | )
56 | hostInfo.save()
57 | for key, values in saltGrains[saltId]['ip4_interfaces'].items():
58 | if key == "lo" or len(values) == 0:
59 | continue
60 | network = Network.objects.create(
61 | host_id=hostInfo.host_id,
62 | network_name=key,
63 | ip_address=values[0]
64 | ).save()
65 | diskList = saltDisk[saltId].split('\n')
66 | for diskStr in diskList:
67 | diskInfo = diskStr.split(' ')
68 | DiskInfo.objects.create(
69 | host_id=hostInfo.host_id,
70 | disk_name=diskInfo[1].strip(':'),
71 | size_gb=diskInfo[2],
72 | size_bytes=diskInfo[4]
73 | ).save()
74 |
75 |
76 | #: 查看分页主机信息
77 | def getAllHostInfoByPage(page=1, count=10, projectId=None, ambientId=None, ip=None):
78 | filter_dict = dict()
79 | if ambientId:
80 | filter_dict['ambient__id'] = ambientId
81 | if ip:
82 | filter_dict['network_host__ip_address__contains'] = ip
83 | hostInfoList = HostInfo.objects.filter(**filter_dict).values(
84 | "host_id", "salt_id", "host_name", "ambient__ambient_name",
85 | "memory", "os_release", "cpus_number", "state", "project_list").order_by("-created_time")
86 |
87 | #: 过滤不保存项目Id的主机
88 | if projectId:
89 | tempHostInfoList = []
90 | for hostInfo in hostInfoList:
91 | if hostInfo['project_list'] is not None and int(projectId) in json.loads(hostInfo['project_list']):
92 | tempHostInfoList.append(hostInfo)
93 | hostInfoList = tempHostInfoList
94 |
95 | paginator = Paginator(hostInfoList, count)
96 | pageList = paginator.page(number=page)
97 | return pageList, paginator.num_pages
98 |
99 |
100 | #: 查询指定主机详情
101 | def getAllHostInfoByHostId(hostId):
102 | hostInfo = HostInfo.objects.values("host_id", "salt_id", "host_name", "alies_name", "vlan__vlan_name",
103 | "ambient__ambient_name", "memory", "swap", "os_fullname", "os_release",
104 | "kernel_release", "cpu_model", "cpus_number", "host_type", "ssh_port",
105 | "state", "delete", "remarks", "created_time", "project_list"
106 | ).get(host_id=hostId)
107 | return hostInfo
108 |
109 |
110 | #: 更新主机信息
111 | def updAllHostInfobyHostId(hostId=None,saltId=None, hostName=None, aliesName=None, vlanId=None, ambientId=None,
112 | memory=None, swap=None, osFullname=None, osRelease=None, kernelRelease=None,
113 | cpuModel=None, cpusNumber=None, hostType=None, sshPort=None, state=None, delete=None,
114 | remarks=None):
115 | hostInfo = None
116 | if hostId:
117 | hostInfo = HostInfo.objects.get(host_id=hostId)
118 | elif saltId:
119 | hostInfo = HostInfo.objects.get(salt_id=saltId)
120 | else:
121 | raise Exception("参数报错: hostId与saltId,必须有个值不能为空!")
122 | if hostName:
123 | hostInfo.host_name = hostName
124 | if aliesName:
125 | hostInfo.alies_name = aliesName
126 | if vlanId:
127 | hostInfo.vlan_id = vlanId
128 | if ambientId:
129 | hostInfo.ambient_id = ambientId
130 | if memory:
131 | hostInfo.memory = memory
132 | if swap:
133 | hostInfo.swap = swap
134 | if osFullname:
135 | hostInfo.os_fullname = osFullname
136 | if osRelease:
137 | hostInfo.os_release = osRelease
138 | if kernelRelease:
139 | hostInfo.kernel_release = kernelRelease
140 | if cpuModel:
141 | hostInfo.cpu_model = cpuModel
142 | if cpusNumber:
143 | hostInfo.cpus_number = cpusNumber
144 | if hostType:
145 | hostInfo.host_type = hostType
146 | if sshPort:
147 | hostInfo.ssh_port = sshPort
148 | if state is not None:
149 | hostInfo.state = state
150 | if delete:
151 | hostInfo.delete = delete
152 | if remarks:
153 | hostInfo.remarks = remarks
154 | hostInfo.save()
155 | return hostInfo.host_id
156 |
157 |
158 | #: 查询所有主机saltId
159 | def getSaltIdFromHostInfo(hostId=None):
160 | hostInfo = None
161 | if hostId:
162 | hostInfo = HostInfo.objects.filter(host_id=hostId, delete=0).values("host_id", "salt_id")
163 | else:
164 | hostInfo = HostInfo.objects.filter(delete=0).values("host_id", "salt_id")
165 | return hostInfo
166 |
167 |
168 | #: 查看指定hostId的主机信息
169 | def getHostInfoByHostId(hostId):
170 | hostInfo = HostInfo.objects.get(host_id=hostId)
171 | return hostInfo
172 |
173 |
174 | #: 根据saltIdList查询主机信息返回状态为0得主机信息
175 | def getSaltIdListFromHostInfoByState(saltIdList):
176 | hostInfoList = HostInfo.objects.values('salt_id').filter(state=0, salt_id__in=saltIdList).iterator()
177 | saltIdList = [hostInfo['salt_id'] for hostInfo in hostInfoList]
178 | return saltIdList
179 |
180 |
181 | #: 查询主机状态不异常并且管理中得主机信息
182 | def getALlFromHostInfoByState():
183 | hostInfoList = HostInfo.objects.values('host_id', 'salt_id', 'project_list').filter().exclude(Q(state=1 )| Q(delete=1))
184 | return hostInfoList
185 |
186 |
187 | #: 跟新主机项目列表
188 | def updProjectListFromHostInfoByHostId(hostId, projectList):
189 | hostInfo = HostInfo.objects.get(host_id=hostId)
190 | hostInfo.project_list = projectList
191 | hostInfo.save()
--------------------------------------------------------------------------------
/cmdb/views/dao/monitorDashDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import *
2 |
3 | def getMonitorItem():
4 | result = Monitor.objects.all().iterator()
5 | return result
6 |
7 |
--------------------------------------------------------------------------------
/cmdb/views/dao/monitorInfoDao.py:
--------------------------------------------------------------------------------
1 | from sdk_api.ZabbixApi import ZabbixAPI,ZabbixAPIException
2 | from cmdb.models import *
3 | from django.core.paginator import Paginator
4 | from devops import settings
5 |
6 | zabbix_host_url = settings.zabbix_host_url
7 | zabbix_username = settings.zabbix_username
8 | zabbix_password = settings.zabbix_password
9 |
10 | def createHost(host_ip):
11 | try:
12 | zapi = ZabbixAPI(url=zabbix_host_url, user=zabbix_username, password=zabbix_password)
13 |
14 | params_json = {
15 | "host": host_ip,
16 | "interfaces": [
17 | {
18 | "type": 1,
19 | "main": 1,
20 | "useip": 1,
21 | "ip": host_ip,
22 | "dns": "",
23 | "port": "10050"
24 | }
25 | ],
26 | "groups": [
27 | {
28 | "groupid": "2"
29 | }
30 | ],
31 | "templates": [
32 | {
33 | "templateid": "10001"
34 | }
35 | ]
36 | }
37 |
38 | zapi.do_request('host.create', params=params_json)
39 | result = {'code':200,'data':'create success'}
40 | return result
41 | except ZabbixAPIException as e:
42 | result = {'code':300,'data':e.data}
43 | return result
44 |
45 | #: 查看监控分页主机信息
46 | def getAllHostInfoByPage(page=1, count=10):
47 | hostInfoList = HostInfo.objects.filter(delete=0).values("host_id", "host_name").order_by("-host_id")
48 | paginator = Paginator(hostInfoList, count)
49 | pageList = paginator.page(number=page)
50 | return pageList, paginator.num_pages
51 |
52 | #参数:主机列表
53 | #功能:获取hostid
54 | #data['result']
55 | """
56 | [{u'host': u'172.31.0.20', u'hostid': u'10261'},
57 | {u'host': u'172.31.0.96', u'hostid': u'10260'},
58 | {u'host': u'Zabbix server', u'hostid': u'10084'}
59 | ]
60 | """
61 | #host_ip_D
62 | """
63 | {u'Zabbix server': u'10084', u'172.31.0.20': u'10261', u'172.31.0.96': u'10260'}
64 | """
65 | def getAllHostID(hostip_list=None):
66 | try:
67 | zapi = ZabbixAPI(url=zabbix_host_url, user=zabbix_username, password=zabbix_password)
68 | params_json = {
69 | "output": ["hostid","host"],
70 | "filter": {
71 | "host": hostip_list
72 | }
73 | }
74 |
75 | host_ip_D = {}
76 | data = zapi.do_request('host.get', params=params_json)
77 | for key in data['result']:
78 | host_ip_D[key['host']] = key['hostid']
79 | return host_ip_D
80 | except ZabbixAPIException as e:
81 | print(e)
82 | return None
83 |
84 |
85 |
86 |
87 | # 参数:hostid字典,key是监控项
88 | # 功能:获取CPU使用率
89 | # all_host_d
90 | """
91 | {'IP1':[use_cpu,use_mem,use_load5],'IP2':[use_cpu,use_mem,use_load5]}
92 | """
93 | def getAllItem(hostid=None):
94 | all_host_d = {}
95 |
96 | if hostid:
97 | for k,v in hostid.items():
98 | system_cpu = float(getItem(v,"system.cpu.util[,system]"))
99 | user_cpu = float(getItem(v,"system.cpu.util[,user]"))
100 | use_cpu = format((system_cpu + user_cpu),'.2f')
101 | total_mem = int(getItem(v,"vm.memory.size[total]"))
102 | available_mem = int(getItem(v,"vm.memory.size[available]"))
103 | if total_mem !=0:
104 | use_mem = format((total_mem - available_mem)/total_mem,'.2f')
105 | else:
106 | use_mem = 0
107 | use_load5 = float(getItem(v,"system.cpu.load[percpu,avg5]"))
108 | use_load5_format = format(use_load5,'.2f')
109 | all_host_d[k] = [use_cpu,use_mem,use_load5_format]
110 |
111 | host_id = Network.objects.filter(ip_address=k).first().host_id
112 |
113 | exist_host_id = Monitor.objects.filter(host_id=host_id).first()
114 | if exist_host_id:
115 | exist_host_id.cpu_use = use_cpu
116 | exist_host_id.mem_use = use_mem
117 | exist_host_id.load5 = use_load5_format
118 | exist_host_id.save()
119 | else:
120 | monitor = Monitor.objects.create(cpu_use=use_cpu,mem_use=use_mem,load5=use_load5_format,host_id=host_id)
121 | monitor.save()
122 |
123 | return all_host_d
124 |
125 | # 参数:hostid字符串,key是监控项
126 | # 功能:获取CPU使用率
127 | # data
128 | """
129 | [{u'itemid': u'28578', u'lastvalue': u'0.1042'}]
130 | """
131 | def getItem(hostid=None,key=None):
132 | try:
133 | zapi = ZabbixAPI(url=zabbix_host_url, user=zabbix_username, password=zabbix_password)
134 | params_json = {
135 | "output": ["lastvalue"],
136 | "hostids": hostid,
137 | "search": {
138 | "key_": key,
139 | },
140 | }
141 |
142 | data = zapi.do_request('item.get', params=params_json)
143 | return data['result'][0]['lastvalue']
144 | except ZabbixAPIException as e:
145 | return None
146 |
147 |
148 |
149 |
--------------------------------------------------------------------------------
/cmdb/views/dao/networkDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import Network
2 |
3 |
4 | def getFromNetworkByHostId(hostId, networkName):
5 | network = Network.objects.filter(host_id=hostId, network_name=networkName).first()
6 | return network
7 |
8 |
9 | def updFromNetworkByHostId(id, ipAddress, hostId=None, networkName=None):
10 | network = Network.objects.get(id=id)
11 | if hostId:
12 | network.host_id = hostId
13 | if networkName:
14 | network.network_name = networkName
15 | network.state=0
16 | network.ip_address = ipAddress
17 | network.save()
18 |
19 |
20 | def setFromNetworkByHostId(hostId, networkName, ipAddress):
21 | network = Network.objects.create(
22 | host_id=hostId,
23 | network_name=networkName,
24 | ip_address=ipAddress
25 | )
26 | network.save()
27 |
28 |
29 | def delFromNetworkById(hostId):
30 | Network.objects.filter(host_id=hostId).update(state=1)
31 |
32 |
33 | def getAllFromNetworkByHostId(hostId, state=None):
34 | networkList = None
35 | if state is not None:
36 | networkList = Network.objects.filter(host_id=hostId, state=0).iterator()
37 | else:
38 | networkList = Network.objects.filter(host_id=hostId).iterator()
39 | return networkList
40 |
--------------------------------------------------------------------------------
/cmdb/views/dao/projectInfoDao.py:
--------------------------------------------------------------------------------
1 | import json, os, shutil
2 | from django.core.paginator import Paginator
3 | from django.utils import timezone
4 | from cmdb.models import ProjectInfo, HostInfo
5 | from cmdb.views.dao import hostInfoDao
6 | from devops.settings import ProjectPath
7 |
8 |
9 | #: 作用: 查看分页项目信息
10 | def getAllFromProjectInfoByPage(page=1, count=10, projectName=None):
11 | filter_dict = dict()
12 | if projectName:
13 | filter_dict['project_name__contains'] = projectName
14 | ProjectInfoList = ProjectInfo.objects.filter(**filter_dict).order_by('project_id')
15 |
16 | paginator = Paginator(ProjectInfoList, count)
17 | pageList = paginator.page(number=page)
18 | return pageList, paginator.num_pages
19 |
20 |
21 | #: 添加项目信息
22 | def setFromProjectInfo(projectName, projectPath, packagePath, projectPort, projectType, githubUrl,
23 | gitId=None, mavenPath=None, remarks=None):
24 | projectInfo = ProjectInfo.objects.create(
25 | project_name=projectName,
26 | project_path=projectPath,
27 | package_path=packagePath,
28 | project_port=projectPort,
29 | project_type=projectType,
30 | github_url=githubUrl,
31 | git_id=gitId,
32 | maven_path=mavenPath,
33 | remarks=remarks
34 | )
35 | projectInfo.save()
36 | #: 检查项目构建仓库路径是否村存在,不存在则创建
37 | if os.path.exists(ProjectPath['build']+'/'+projectName) == False:
38 | os.makedirs(ProjectPath['build']+'/'+projectName)
39 | return projectInfo.project_id
40 |
41 |
42 | #: 修改项目信息
43 | def updFromProjectInfoByProjectId(projectId, projectName, projectPath, packagePath, projectPort, projectType,
44 | githubUrl, gitId=None, mavenPath=None, remarks=None):
45 | projectInfo = ProjectInfo.objects.get(project_id=projectId)
46 | oldProjectName = None
47 | if projectName:
48 | oldProjectName = ProjectPath['build'] + '/' + projectInfo.project_name
49 | projectInfo.project_name = projectName
50 | if projectPath:
51 | projectInfo.project_path = projectPath
52 | if packagePath:
53 | projectInfo.package_path = packagePath
54 | if projectPort:
55 | projectInfo.project_port = projectPort
56 | if projectType:
57 | projectInfo.project_type = projectType
58 | if githubUrl:
59 | projectInfo.github_url = githubUrl
60 | projectInfo.git_id = gitId
61 | projectInfo.maven_path = mavenPath
62 | projectInfo.remarks = remarks
63 | projectInfo.update_time = timezone.now()
64 | projectInfo.save()
65 | if oldProjectName is not None:
66 | os.rename(oldProjectName, ProjectPath['build'] + '/' + projectInfo.project_name)
67 | return projectInfo.project_id
68 |
69 |
70 | #: 删除项目,同时删除主机保存次项目的Id
71 | def delFromProjectInfoByProjectId(projectId):
72 | hostInfoList = HostInfo.objects.values('host_id', 'project_list').all()
73 | for hostInfo in hostInfoList:
74 | projectList = hostInfo['project_list']
75 | if projectList is not None and projectList != '[]':
76 | projectList = json.loads(projectList)
77 | if projectId in projectList:
78 | projectList.remove(projectId)
79 | hostInfoDao.updProjectListFromHostInfoByHostId(hostInfo['host_id'], json.dumps(projectList))
80 | projectInfo = ProjectInfo.objects.get(project_id=projectId)
81 | projectName = projectInfo.project_name
82 | projectInfo.delete()
83 | shutil.rmtree(ProjectPath['build'] + '/' + projectName)
84 | if os.path.exists(os.getcwd() + '/' + ProjectPath['setting'] + '/' + projectId):
85 | shutil.rmtree(os.getcwd() + '/' + ProjectPath['setting'] + '/' + projectId)
86 |
87 |
88 | #: 查询指定项目详情
89 | def getAllFromProjectInfoByProjectId(projectId):
90 | projectInfo = ProjectInfo.objects.values(
91 | "project_id", "project_name", "project_path", "package_path", "project_port", "project_type", "git__git_name",
92 | "git", "github_url", "maven_path", "update_time", "remarks").get(project_id=projectId)
93 | return projectInfo
94 |
95 |
96 | #: 根据projectIdList查询项目名
97 | def getProjectNameFromProjectInfoByProjectIdList(projectIdList):
98 | projectInfoList = ProjectInfo.objects.values('project_id', 'project_name').filter(project_id__in=projectIdList)
99 | return projectInfoList
100 |
101 |
102 | #: 查询所有项目名与项目Id
103 | def getProjectNameFromProjectInfo():
104 | projectInfoList = ProjectInfo.objects.values('project_id', 'project_name').all().iterator()
105 | return projectInfoList
106 |
107 |
108 | #: 查询所有项目id与项目路径
109 | def getProjectPathProjectNameFromProjectInfo():
110 | projectInfoList = ProjectInfo.objects.values('project_id', 'project_path').all()
111 | return projectInfoList
112 |
113 |
114 | #: 查询所有指定的gitId的项目
115 | def getAllFromProjectNameFromGitId(gitId):
116 | projectInfoList = ProjectInfo.objects.values('project_id', 'project_name').filter(git=gitId).iterator()
117 | return projectInfoList
--------------------------------------------------------------------------------
/cmdb/views/dao/projectSettingDao.py:
--------------------------------------------------------------------------------
1 | from django.core.paginator import Paginator
2 | from cmdb.models import ProjectSetting
3 | from devops.settings import ProjectPath
4 | import os, pathlib, shutil
5 | from django.utils import timezone
6 |
7 |
8 | #: 分页查询项目配置文件信息,包含项目以及配置文件名模糊匹配
9 | def getAllFromProjectSettingByPage(page=1, count=10, projectId=None, ambientId=None, fileName=None):
10 | filter_dict = dict()
11 | if projectId:
12 | filter_dict['project_id'] = projectId
13 | if ambientId:
14 | filter_dict['ambient_id'] = ambientId
15 | if fileName:
16 | filter_dict['file_name__contains'] = fileName
17 | projectSettingList = ProjectSetting.objects.values(
18 | 'setting_id', 'project__project_name', 'ambient__ambient_name', 'file_name', 'remote_path', 'update_time', 'remarks'
19 | ).filter(**filter_dict).order_by('setting_id')
20 |
21 | paginator = Paginator(projectSettingList, count)
22 | pageList = paginator.page(number=page)
23 | return pageList, paginator.num_pages
24 |
25 |
26 | #: 添加项目配置文件信息
27 | def addFromProjectSettingByProjectIdAndAmbientId(projectId, ambientId, fileName, remotePath, remarks):
28 | projectSetting = ProjectSetting.objects.create(
29 | project_id=projectId,
30 | ambient_id=ambientId,
31 | file_name=fileName,
32 | remote_path=remotePath,
33 | remarks=remarks,
34 | )
35 | projectSetting.save()
36 | localPath = os.getcwd()+'/'+ProjectPath['setting']+'/'+projectId+'/'+ambientId
37 | if not os.path.exists(localPath):
38 | os.makedirs(localPath)
39 | pathlib.Path(localPath+'/'+fileName).touch()
40 | return projectSetting.setting_id
41 |
42 |
43 | #: 编辑配置文件 #内容#
44 | def editFromProjectSettingByProjectId(settingId, content=''):
45 | projectSetting = ProjectSetting.objects.get(setting_id=settingId)
46 | localPath = os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) +'/' + str(projectSetting.ambient_id) + '/' + projectSetting.file_name
47 | wfile = open(localPath, 'w+', encoding='utf-8')
48 | wfile.write(content)
49 | wfile.close()
50 | projectSetting.update_time = timezone.now()
51 | projectSetting.save()
52 |
53 |
54 |
55 | #: 查看指定文件 #内容#
56 | def getContentFromProjectSettingByProjectId(settingId):
57 | projectSetting = ProjectSetting.objects.get(setting_id=settingId)
58 | localPath = os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) + '/' + str(projectSetting.ambient_id) + '/' + projectSetting.file_name
59 | file = open(localPath, 'r+', encoding='utf-8')
60 | content = ''
61 | for line in file:
62 | content += line
63 | file.close()
64 | return content
65 |
66 |
67 | #: 查看指定配置 #文件信息#
68 | def getAllFromProjectSettingByProjectId(settingId):
69 | projectSetting = ProjectSetting.objects.get(setting_id=settingId)
70 | return projectSetting
71 |
72 |
73 | #: 修改指定配置 #文件信息#
74 | def updFromProjectSettingByProjectId(settingId, projectId, ambientId, fileName, remotePath, remarks=None):
75 | projectSetting = ProjectSetting.objects.get(setting_id=settingId)
76 | #: 文件路径--老
77 | oldLocalPath = os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) + '/' + str(projectSetting.ambient_id) + '/' + projectSetting.file_name
78 | projectSetting.remarks = remarks
79 | if projectId:
80 | projectSetting.project_id = projectId
81 | if ambientId:
82 | projectSetting.ambient_id =ambientId
83 | if fileName:
84 | projectSetting.file_name = fileName
85 | if remotePath:
86 | projectSetting.remote_path = remotePath
87 | projectSetting.update_time = timezone.now()
88 | projectSetting.save()
89 | #: 文件路径--新
90 | newLocalPath = os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) + '/' + str(projectSetting.ambient_id) + '/' + projectSetting.file_name
91 | #: 文件移动
92 | if oldLocalPath != newLocalPath:
93 | if not os.path.exists(os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) + '/' + str(projectSetting.ambient_id)):
94 | print(os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) + '/' + str(projectSetting.ambient_id))
95 | os.makedirs(os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) + '/' + str(projectSetting.ambient_id))
96 | shutil.move(oldLocalPath, newLocalPath)
97 | #: 删除空文件夹
98 | clearNullFolder(os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id))
99 |
100 |
101 | #: 删除配置文件
102 | def delFromProjectSettingByProjectId(settingId):
103 | projectSetting = ProjectSetting.objects.get(setting_id=settingId)
104 | #: 删除配置文件
105 | localPath = os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id) + '/' + str(projectSetting.ambient_id) + '/' + projectSetting.file_name
106 | os.remove(localPath)
107 | #: 删除空文件夹
108 | clearNullFolder(os.getcwd() + '/' + ProjectPath['setting'] + '/' + str(projectSetting.project_id))
109 | projectSetting.delete()
110 |
111 |
112 | #: 清理空文件夹
113 | def clearNullFolder(filePath):
114 | for dir in os.listdir(filePath):
115 | if os.path.isdir(filePath + '/' + dir):
116 | if not os.listdir(filePath + '/' + dir):
117 | os.rmdir(filePath + '/' + dir)
118 |
--------------------------------------------------------------------------------
/cmdb/views/dao/releaseOrderDao.py:
--------------------------------------------------------------------------------
1 | from django.utils import timezone
2 | from cmdb.models import ReleaseOrder
3 | import json
4 | from django.core.paginator import Paginator
5 |
6 |
7 | #: 发布工单分页查询,带模糊查询
8 | def getListFromReleaseOrderByPage(page, count=10, orderTitle=None, status=None):
9 | filter_dict = dict()
10 | if orderTitle:
11 | filter_dict['order_title__contains'] = orderTitle
12 | if status:
13 | filter_dict['status'] = status
14 | releaseOederList = ReleaseOrder.objects.filter(**filter_dict).values("order_id", "order_title", "authorizer",
15 | "status", "order_content", "release_time",).order_by("-update_time")
16 | paginator = Paginator(releaseOederList, count)
17 | pageList = paginator.page(number=page)
18 | for releaseOeder in pageList:
19 | if releaseOeder['authorizer'] == '{"artisan": 1, "product": 1}':
20 | releaseOeder['authorizer'] = 1
21 | elif releaseOeder['authorizer'] == '{"artisan": 2, "product": 2}':
22 | releaseOeder['authorizer'] = 3
23 | elif '-1' in releaseOeder['authorizer']:
24 | releaseOeder['authorizer'] = -1
25 | else:
26 | releaseOeder['authorizer'] = 2
27 | return pageList, paginator.num_pages
28 |
29 |
30 | #: 查询指定orderId的工单信息
31 | def getAllFromReleaseOrderByOrderId(orderId):
32 | releaseOrder = ReleaseOrder.objects.values("order_id", "order_title", "order_content", "authorizer", "status", "ftp_path",
33 | "ambient_id", "ambient__ambient_name" ,"artisan_id", "artisan__user_name", "author_id",
34 | "author__user_name", "executor_id", "executor__user_name", "product_id", "product__user_name",
35 | "release_time", "update_time","remarks").get(order_id=orderId)
36 | releaseOrder['authorizerList'] = json.loads(releaseOrder['authorizer'], encoding='utf-8')
37 | if -1 in releaseOrder['authorizerList'].values():
38 | releaseOrder['authorizer'] = -1
39 | elif releaseOrder['authorizerList']['artisan'] == 1 and releaseOrder['authorizerList']['product'] == 1:
40 | releaseOrder['authorizer'] = 1
41 | elif releaseOrder['authorizerList']['artisan'] == 2 and releaseOrder['authorizerList']['product'] == 2:
42 | releaseOrder['authorizer'] = 3
43 | else:
44 | releaseOrder['authorizer'] = 2
45 | return releaseOrder
46 |
47 |
48 | #: 添加发布工单信息
49 | def setFromReleaseOrder(orderTitle, orderContent, releaseTime, ambientId, executorId,
50 | artisanId, authorId, productId, remarks=None, ftpPath=None):
51 | releaseOrder = ReleaseOrder.objects.create(
52 | order_title=orderTitle,
53 | order_content=orderContent,
54 | release_time=releaseTime,
55 | ftp_path=ftpPath,
56 | ambient_id=ambientId,
57 | executor_id=executorId,
58 | artisan_id=artisanId,
59 | author_id=authorId,
60 | product_id=productId,
61 | remarks=remarks
62 | )
63 | releaseOrder.save()
64 | return releaseOrder.order_id
65 |
66 |
67 | #: 删除发布工单信息
68 | def delFromReleaseOrderByOrderId(orderId):
69 | releaseOrder = ReleaseOrder.objects.get(order_id=orderId)
70 | if releaseOrder.status == 3 or releaseOrder.status == 2:
71 | raise Exception("工单报错: 工单处于运行状态或等待执行状态,无法删除工单")
72 | releaseOrder.save()
73 |
74 |
75 | #: 指定orderId, 修改工单内容
76 | def updContentFromReleaseOrdeByOrderId(orderId, orderTitle, orderContent, ambientId,releaseTime,
77 | executorId, artisanId, productId, ftpPath=None, remarks=None):
78 | releaseOrder = ReleaseOrder.objects.get(order_id=orderId)
79 | authorizerList = json.loads(releaseOrder.authorizer, encoding='utf-8')
80 | if authorizerList['artisan'] == 2 and authorizerList['product'] == 2:
81 | raise Exception("工单报错: 工单已经通过授权,不能再修改工单内容,如有疑问,请联系运维!")
82 | if orderTitle:
83 | releaseOrder.order_title = orderTitle
84 | if orderContent:
85 | releaseOrder.order_content = orderContent
86 | if ambientId:
87 | releaseOrder.ambient_id = ambientId
88 | if releaseTime:
89 | releaseOrder.release_time = releaseTime
90 | if executorId:
91 | releaseOrder.executor_id = executorId
92 | if productId:
93 | releaseOrder.product_id = productId
94 | if artisanId:
95 | releaseOrder.artisan_id = artisanId
96 | releaseOrder.ftp_path = ftpPath
97 | releaseOrder.remarks = remarks
98 | releaseOrder.update_time = timezone.now()
99 | releaseOrder.save()
100 |
101 |
102 | #: 指定orderId,修改工单授权
103 | def updAuthorizerFromReleaseOrdeByOrderId(userId, orderId, authorizer):
104 | releaseOrder = ReleaseOrder.objects.get(order_id=orderId)
105 | if releaseOrder.artisan_id != userId and releaseOrder.product_id != userId:
106 | raise Exception("工单报错: 你没有权限授权次工单!")
107 | authorizerList = json.loads(releaseOrder.authorizer, encoding='utf-8')
108 | if releaseOrder.artisan_id == userId:
109 | authorizerList['artisan'] = authorizer
110 | if releaseOrder.product_id == userId:
111 | authorizerList['product'] = authorizer
112 | releaseOrder.authorizer = json.dumps(authorizerList)
113 | releaseOrder.update_time = timezone.now()
114 | releaseOrder.save()
115 |
116 |
117 | #: 指定orderId,修改工单状态
118 | def updStatusFromReleaseOrderByOrderId(orderId, status):
119 | if 0 > int(status) or int(status) > 6:
120 | raise Exception("工单报错: 无法识别的工单状态!")
121 | releaseOrder = ReleaseOrder.objects.get(order_id=orderId)
122 | if releaseOrder.authorizer != '{"artisan": 1, "product": 1}':
123 | raise Exception("工单报错: 工单授权暂未通过,无法修改工单状态!")
124 | releaseOrder.status = status
125 | releaseOrder.update_time = timezone.now()
126 | releaseOrder.save()
127 |
--------------------------------------------------------------------------------
/cmdb/views/dao/roleInfoDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import RoleInfo
2 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
3 |
4 |
5 | #: 根据roleId查询角色信息
6 | def getAllFromRoleInfoByRoleId(roleId):
7 | roleInfo = RoleInfo.objects.get(role_id=roleId)
8 | return roleInfo
9 |
10 |
11 | #: 添加角色信息
12 | def setFromRoleInfo(roleName, remarks):
13 | roleInfo = RoleInfo.objects.create(
14 | role_name=roleName,
15 | remarks=remarks
16 | )
17 | roleInfo.save()
18 | return roleInfo.role_id
19 |
20 |
21 | #: 根据roleId更新角色信息
22 | def updAllFromRoleInfoByRoleId(roleId, roleName=None, apiList=None, remarks=None):
23 | roleInfo = RoleInfo.objects.get(role_id=roleId)
24 | if roleName:
25 | roleInfo.role_name = roleName
26 | if apiList:
27 | roleInfo.api_list = apiList
28 | if remarks:
29 | roleInfo.remarks = remarks
30 | roleInfo.save()
31 |
32 |
33 | #: 根据roleId删除角色信息
34 | def delFromRoleInfoByRoleId(roleId):
35 | RoleInfo.objects.get(role_id=roleId).delete()
36 |
37 |
38 | #: 角色分页查询带模糊查询功能
39 | def getListFromRoleInfoByPage(page=1, count=10, roleName=None):
40 | if roleName:
41 | roleInfoList = RoleInfo.objects.filter(role_name__contains=roleName).order_by("role_id")
42 | else:
43 | roleInfoList = RoleInfo.objects.all().order_by("role_id")
44 |
45 | paginator = Paginator(roleInfoList, count)
46 | pageList = paginator.page(number=page)
47 | return pageList, paginator.num_pages
48 |
49 |
50 | #: 查询全部角色id与角色名
51 | def getRoleIdAndRoleNameFromRoleInfo():
52 | roleInfoList = RoleInfo.objects.values("role_id", "role_name").all().iterator()
53 | return roleInfoList
54 |
--------------------------------------------------------------------------------
/cmdb/views/dao/saltDao.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*-coding:utf-8-*-
3 | from sdk_api import saltstack
4 | import logging
5 |
6 |
7 | #: 获取Linux主机远程端口
8 | def getHostSsh(saltIdList):
9 | salt_api = saltstack.SaltAPI()
10 | tgt = saltIdList
11 | fun = 'cmd.run'
12 | arg = "netstat -lnpt | grep sshd | grep -v 'tcp6' | awk '{print $4}' | awk -F':' '{print $2}' | head -1"
13 | data = salt_api.salt_command(tgt, fun, arg)
14 | return data['return'][0]
15 |
16 |
17 | #: salt-minion主机连接测试
18 | def getSaltTest(saltIdList):
19 | salt_api = saltstack.SaltAPI()
20 | tgt = saltIdList
21 | fun = 'test.ping'
22 | data = salt_api.salt_command(tgt, fun)
23 | return data['return'][0]
24 |
25 |
26 | #: salt ganins信息获取
27 | def getSaltGrains(saltIdList):
28 | salt_api = saltstack.SaltAPI()
29 | tgt = saltIdList
30 | fun = 'grains.items'
31 | data = salt_api.salt_command(tgt, fun)
32 | return data['return'][0]
33 |
34 |
35 | #: salt获取磁盘信息
36 | def getSaltDisk(saltIdList):
37 | salt_api = saltstack.SaltAPI()
38 | tgt = saltIdList
39 | fun = 'cmd.run'
40 | arg = "fdisk -l | grep Disk | grep -vE '(identifier|/dev/mapper|label type)'"
41 | data = salt_api.salt_command(tgt, fun, arg)
42 | return data['return'][0]
43 |
44 |
45 | #: salt获取内存信息
46 | def getSaltMem(saltIdList):
47 | salt_api = saltstack.SaltAPI()
48 | tgt = saltIdList
49 | fun = 'status.meminfo'
50 | data = salt_api.salt_command(tgt, fun)
51 | return data['return'][0]
52 |
53 |
54 | #: salt执行指定主机执行操作命令
55 | def getCommandFromSaltBySaltIdList(saltIdList, command):
56 | salt_api = saltstack.SaltAPI()
57 | tgt = saltIdList
58 | fun = 'cmd.run'
59 | arg = command
60 | data = salt_api.salt_command(tgt, fun, arg)
61 | return data['return'][0]
62 |
63 |
64 | #: salt检查指定主机得指定文件夹是否存在
65 | def getCheckFolderFromSaltBysaltIdList(saltId, path):
66 | salt_api = saltstack.SaltAPI()
67 | tgt = saltId
68 | fun = 'file.directory_exists'
69 | arg = path
70 | data = salt_api.salt_command(tgt, fun, arg=arg)
71 | return data['return'][0]
72 |
73 |
74 |
--------------------------------------------------------------------------------
/cmdb/views/dao/taskListDao.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin python
2 | # _*_ coding:utf-8 _*_
3 | from cmdb.models import *
4 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
5 | from django.db.models import Q
6 | from utils import sendemail
7 |
8 |
9 | #: 获取全部任务数,或个人任务数
10 | def getAllTaskCount(userId=None):
11 | if userId:
12 | taskList = TaskList.objects.filter(create=userId)
13 | else:
14 | taskList = TaskList.objects.filter()
15 | count = taskList.count()
16 | return count
17 |
18 |
19 | #: 获取任务各种状态的任务数
20 | def getTaskStateCount(taskState, userId=None):
21 | if userId:
22 | taskList = TaskList.objects.filter(create=userId, task_state=taskState)
23 | else:
24 | taskList = TaskList.objects.filter(task_state=taskState)
25 | count = taskList.count()
26 | return count
27 |
28 |
29 | #: 获取指定taskId任务信息
30 | def getAllFromTaskListByTaskId(taskId):
31 | taskList = TaskList.objects.values(
32 | "task_id", "task_name", "task_state", "task_info",
33 | "create_id", "create__user_name", "execute_id", "execute__user_name", "authorizer_id", "authorizer__user_name",
34 | "remarks", "created_date", "modify_date"
35 | ).get(task_id=taskId)
36 | return taskList
37 |
38 |
39 | #: 插入task_list数据
40 | def setAllFromTaskList(taskName, taskInfo, createId, executeId, authorizerId, modifyDate):
41 | taskList = TaskList.objects.create(
42 | task_name=taskName,
43 | task_info=taskInfo,
44 | task_state=1,
45 | create_id=createId,
46 | execute_id=executeId,
47 | authorizer_id=authorizerId,
48 | modify_date=modifyDate
49 | )
50 | taskList.save()
51 | return taskList.task_id
52 |
53 |
54 | #: 更新指定任务信息
55 | def updAllFromTaskListByTaskId(taskId, taskState=None, taskInfo=None, executeId=None, authorizerId=None, modifyDate=None, remarks=None):
56 | taskList = TaskList.objects.get(task_id=taskId)
57 | if taskState:
58 | taskList.task_state = taskState
59 | if taskInfo:
60 | taskList.task_info = taskInfo
61 | if executeId:
62 | taskList.execute_id = executeId
63 | if authorizerId:
64 | taskList.authorizer_id = authorizerId
65 | if modifyDate:
66 | taskList.modify_date = modifyDate
67 | taskList.remarks = remarks
68 | taskList.save()
69 |
70 |
71 | #: 任务分页功能
72 | def getAllFromTaskListByPage(page=1, count=10, taskName=None, taskState=None, userId=None):
73 | filter_dict = dict()
74 | if taskName:
75 | filter_dict['task_name__contains'] = taskName
76 | if taskState:
77 | filter_dict['task_state'] = taskState
78 | if userId:
79 | taskList = TaskList.objects.filter(Q(create_id=userId)|Q(execute_id=userId)|Q(authorizer_id=userId), **filter_dict).values(
80 | "task_id", "task_name", "task_state", "task_info", "create__user_name", "execute__user_name",
81 | "authorizer__user_name", "remarks", "created_date", "modify_date"
82 | ).order_by("-created_date")
83 | else:
84 | taskList = TaskList.objects.filter(**filter_dict).values(
85 | "task_id", "task_name", "task_state", "task_info", "create__user_name", "execute__user_name",
86 | "authorizer__user_name", "remarks", "created_date", "modify_date"
87 | ).order_by("-created_date")
88 | paginator = Paginator(taskList, count)
89 | pageList = paginator.page(number=page)
90 | return pageList, paginator.num_pages
91 |
92 |
93 | #: 查询任务信息发送提示邮件
94 | def sendEmailFromTaskListByTaskId(taskId):
95 | taskInfo = TaskList.objects.values(
96 | "task_id", "task_name", "task_state", "task_info", "create__user_name", "create__email", "execute__user_name",
97 | "execute__email", "authorizer__user_name", "authorizer__email", "remarks", "created_date", "modify_date"
98 | ).get(task_id=taskId)
99 | subject = '任务提示'
100 | addressee = [taskInfo['create__email'], taskInfo['execute__email'], taskInfo['authorizer__email']]
101 | html = 'task-info.html'
102 | sendEmail = sendemail.SendEmail()
103 | message = sendEmail.sendMail(subject=subject, addressee=addressee, html=html, data=taskInfo)
104 | if message is not True:
105 | raise Exception('任务提示邮件, 发送失败!')
106 |
--------------------------------------------------------------------------------
/cmdb/views/dao/taskLogListDao.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin python
2 | # _*_ coding:utf-8 _*_
3 | from cmdb.models import *
4 |
5 |
6 | #: 获取指定任务操作日志
7 | def getAllFromTaskLogListByTaskId(taskId):
8 | taskLogList = TaskLogList.objects.filter(task_id=taskId).iterator()
9 | return taskLogList
10 |
11 |
12 | #: 添加操作日志
13 | def setFromTaskLogListByTaskId(taskId, execute, logInfo):
14 | logList = TaskLogList.objects.create(
15 | task_id=taskId,
16 | execute=execute,
17 | log_info=logInfo
18 | )
19 | logList.save()
20 | return logList.log_id
21 |
--------------------------------------------------------------------------------
/cmdb/views/dao/userGroupDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import UserGroup
2 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
3 |
4 |
5 | #: 根据groupId查询查询用户组信息
6 | def getAllFromUserGroupByGroupId(groupId):
7 | userGroup = UserGroup.objects.get(group_id=groupId)
8 | return userGroup
9 |
10 | #: 根据groupName查询查询用户组信息
11 | def getAllFromUserGroupByGroupName(groupName):
12 | userGroup = UserGroup.objects.filter(group_name=groupName).first()
13 | return userGroup
14 |
15 |
16 | #: 添加用户分组信息
17 | def setFromUserGroup(groupName, roleId, remarks):
18 | userGroup = UserGroup.objects.create(
19 | group_name=groupName,
20 | role_id=roleId,
21 | remarks=remarks
22 | )
23 | userGroup.save()
24 | return userGroup.group_id
25 |
26 |
27 | #: 根据groupId更新用户信息
28 | def updAllFromUserGroupByGroupId(groupId, groupName, roleId, remarks):
29 | userGroup = UserGroup.objects.get(group_id=groupId)
30 | if groupId:
31 | userGroup.group_id=groupId
32 | if groupName:
33 | userGroup.group_name=groupName
34 | if roleId:
35 | userGroup.role_id=roleId
36 | if remarks:
37 | userGroup.remarks = remarks
38 | userGroup.save()
39 |
40 |
41 | #: 根据groupId删除角色信息
42 | def delFromUserGroupByGroupId(groupId):
43 | UserGroup.objects.get(group_id=groupId).delete()
44 |
45 |
46 | #: 用户组分页查询带模糊查询功能
47 | def getListFromUserGroupByPage(page=1, count=10, groupName=None):
48 | filter_dict = dict()
49 | if groupName:
50 | filter_dict['group_name__contains'] = groupName
51 |
52 | userGroupList = UserGroup.objects.values('group_id', 'group_name', 'role__role_name',
53 | 'remarks', 'create_time').filter(**filter_dict).order_by("group_id")
54 | paginator = Paginator(userGroupList, count)
55 | pageList = paginator.page(number=page)
56 | return pageList, paginator.num_pages
57 |
58 |
59 | #: 获取所有用户组与用户组Id
60 | def getGroupIdAndGroupNameFromUserGroup():
61 | userGroupList = UserGroup.objects.values('group_id', 'group_name').all().iterator()
62 | return userGroupList
63 |
64 |
65 | #: 根据角色Id查询用户组,并且更新用户组roleId为空
66 | def updRoleIdIsNoneFromUserGroupByRoleId(roleId):
67 | userGroupList = UserGroup.objects.filter(role_id=roleId)
68 | for userGroup in userGroupList:
69 | userGroup.role_id = ''
70 | userGroup.save()
--------------------------------------------------------------------------------
/cmdb/views/dao/userInfoDao.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin python
2 | # _*_ coding:utf-8 _*_
3 | from cmdb.models import *
4 | from django.core.paginator import Paginator
5 |
6 |
7 | #: 登录账户密码查询
8 | def getFromUserInfoByLogin(account):
9 | userInfo = None
10 | if account.isdigit():
11 | userInfo = UserInfo.objects.filter(phone=account).first()
12 | else:
13 | userInfo = UserInfo.objects.filter(email=account).first()
14 | if userInfo:
15 | return userInfo
16 | else:
17 | return None
18 |
19 |
20 | #: 用户注册
21 | def setFromUserInfo(email, phone, userName, password, groupId=None):
22 | userInfo = UserInfo.objects.create(
23 | email=email,
24 | phone=phone,
25 | user_name=userName,
26 | password=password,
27 | group_id=groupId
28 | )
29 | userInfo.save()
30 | return userInfo.user_id
31 |
32 |
33 | #: 修改用户
34 | def updAllFromUserInfoByUserId(user_id, userName=None, password=None, phone=None, email=None, groupId=None, state=None):
35 | userInfo = UserInfo.objects.get(user_id=user_id)
36 | if userName:
37 | userInfo.user_name = userName
38 | if password:
39 | userInfo.password = password
40 | if phone:
41 | userInfo.phone = phone
42 | if email:
43 | userInfo.email = email
44 | if groupId:
45 | userInfo.group_id = groupId
46 | if state:
47 | userInfo.state = state
48 | userInfo.save()
49 |
50 |
51 | #: 查询用户信息
52 | def getAllFromUsreInfoByUserId(userId):
53 | userInfo = UserInfo.objects.values("user_id", "user_name", "phone", "email", 'state',
54 | "group__group_id", "group__group_name", "group__role__api_list", "created_time").get(user_id=userId)
55 | return userInfo
56 |
57 |
58 | #: 根据UserId查询用户密码
59 | def getPassWordFromUserInfoByUserId(userId):
60 | userInfo = UserInfo.objects.values('password').get(user_id=userId)
61 | return userInfo['password']
62 |
63 |
64 | #: 查询所有用户id与用户名
65 | def getAllUserInfo(groupId=None):
66 | filter_dict = dict()
67 | if groupId:
68 | filter_dict["group_id"] = groupId
69 | userinfoList = UserInfo.objects.values("user_id", "user_name").filter(**filter_dict).all().iterator()
70 | return userinfoList
71 |
72 |
73 | #: 用户信息查询分页功能,模糊查询
74 | def getAllFromUserInfoByPage(page=1, count=10, groupId=None, userName=None):
75 | filter_dict = dict()
76 | if groupId and groupId != '0':
77 | filter_dict['group__group_id'] = groupId
78 | if userName:
79 | filter_dict['user_name__contains'] = userName
80 | userInfoList = UserInfo.objects.filter(**filter_dict).values('user_id', 'user_name', 'group__group_name',
81 | 'phone', 'email', 'state', 'created_time').order_by('user_id')
82 |
83 | paginator = Paginator(userInfoList, count)
84 | pageList = paginator.page(number=page)
85 | return pageList, paginator.num_pages
86 |
87 |
88 | #: 按部门查询用户,批量修改用户部门为空
89 | def updGroupIdFromUserInfoByGroupId(groupId):
90 | userInfoList = UserInfo.objects.filter(group_id=groupId).all()
91 | for userInfo in userInfoList:
92 | userInfo.group_id = ''
93 | userInfo.save()
94 |
--------------------------------------------------------------------------------
/cmdb/views/dao/vlanDao.py:
--------------------------------------------------------------------------------
1 | from cmdb.models import Vlan, HostInfo
2 | from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
3 |
4 |
5 | #: 添加vlan
6 | def setFromVlan(vlanName, gateway, network):
7 | vlan = Vlan.objects.create(
8 | vlan_name=vlanName,
9 | gateway=gateway,
10 | network=network
11 | )
12 | vlan.save()
13 |
14 |
15 | #: 删除vlan
16 | def delFromVlanById(id):
17 | hostInfoList = HostInfo.objects.filter(vlan__id=id).iterator()
18 | if len(list(hostInfoList)) == 0:
19 | Vlan.objects.get(id=id).delete()
20 | else:
21 | raise Exception('vlan删除失败: vlan中还有主机!')
22 |
23 |
24 | #: 查看分页vlan
25 | def getAllFromVlanByPage(page=1, count=10, vlanName=None):
26 | if vlanName:
27 | vlanList = Vlan.objects.filter(vlan_name__contains=vlanName).order_by("id")
28 | else:
29 | vlanList = Vlan.objects.all().order_by("id")
30 | paginator = Paginator(vlanList, count)
31 | pageList = paginator.page(number=page)
32 | return pageList, paginator.num_pages
33 |
34 |
35 | #: 查看所有vlan信息
36 | def getIdAndVlanNameFromVlan():
37 | vlanList = Vlan.objects.values('id', 'vlan_name').all().iterator()
38 | return vlanList
39 |
40 |
41 | #: 更新vlan
42 | def updAllFromVlanById(id, vlanName=None, gateway=None, network=None):
43 | vlan = Vlan.objects.get(id=id)
44 | if vlanName:
45 | vlan.vlan_name= vlanName
46 | if gateway:
47 | vlan.gateway = gateway
48 | if network:
49 | vlan.network = network
50 | vlan.save()
51 |
52 |
53 | #: 查看指定vlan信息
54 | def getAllFromValnById(id):
55 | vlan = Vlan.objects.get(id=id)
56 | return vlan
57 |
58 |
59 | #: 根据vlan名查询vlan信息
60 | def getAllFromVlanByVlanName(vlanName):
61 | vlanInfo = Vlan.objects.filter(vlan_name=vlanName).first()
62 | return vlanInfo
--------------------------------------------------------------------------------
/devops/__init__.py:
--------------------------------------------------------------------------------
1 | # coding=utf-8
2 |
3 | import pymysql
4 | pymysql.install_as_MySQLdb()
--------------------------------------------------------------------------------
/devops/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for devops project.
3 |
4 | Generated by 'django-admin startproject' using Django 2.1.3.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/2.1/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/2.1/ref/settings/
11 | """
12 |
13 | import os
14 |
15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17 |
18 |
19 | # Quick-start development settings - unsuitable for production
20 | # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
21 |
22 | # SECURITY WARNING: keep the secret key used in production secret!
23 | SECRET_KEY = ')t)8akefo($_jps5w29h-@k79i44vv-r&j80b#!!*ooujhi)#e'
24 |
25 | # SECURITY WARNING: don't run with debug turned on in production!
26 | DEBUG = False
27 |
28 | ALLOWED_HOSTS = ['*']
29 |
30 |
31 | # Application definition
32 |
33 | INSTALLED_APPS = [
34 | 'django.contrib.admin',
35 | 'django.contrib.auth',
36 | 'django.contrib.contenttypes',
37 | 'django.contrib.sessions',
38 | 'django.contrib.messages',
39 | 'django.contrib.staticfiles',
40 | 'cmdb.apps.CmdbConfig',
41 | ]
42 |
43 | MIDDLEWARE = [
44 | 'django.middleware.security.SecurityMiddleware',
45 | 'django.contrib.sessions.middleware.SessionMiddleware',
46 | 'django.middleware.common.CommonMiddleware',
47 | 'django.middleware.csrf.CsrfViewMiddleware',
48 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
49 | 'django.contrib.messages.middleware.MessageMiddleware',
50 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
51 | ]
52 |
53 | ROOT_URLCONF = 'devops.urls'
54 |
55 | TEMPLATES = [
56 | {
57 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
58 | 'DIRS': [os.path.join(BASE_DIR, 'templates')]
59 | ,
60 | 'APP_DIRS': True,
61 | 'OPTIONS': {
62 | 'context_processors': [
63 | 'django.template.context_processors.debug',
64 | 'django.template.context_processors.request',
65 | 'django.contrib.auth.context_processors.auth',
66 | 'django.contrib.messages.context_processors.messages',
67 | ],
68 | },
69 | },
70 | ]
71 |
72 | WSGI_APPLICATION = 'devops.wsgi.application'
73 |
74 |
75 | #: 数据库配置信息
76 | DATABASES = {
77 | 'default': {
78 | 'ENGINE': 'django.db.backends.mysql',
79 | 'NAME': 'devops',
80 | 'USER': 'root',
81 | 'PASSWORD': 'admin123',
82 | 'HOST': '172.28.5.96',
83 | 'PORT': '3306',
84 | 'OPTIONS': {
85 | 'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
86 | 'charset': 'utf8mb4'
87 | }
88 | }
89 | }
90 |
91 |
92 | # Password validation
93 | # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
94 |
95 | AUTH_PASSWORD_VALIDATORS = [
96 | {
97 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
98 | },
99 | {
100 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
101 | },
102 | {
103 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
104 | },
105 | {
106 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
107 | },
108 | ]
109 |
110 |
111 | # Internationalization
112 | # https://docs.djangoproject.com/en/2.1/topics/i18n/
113 |
114 | LANGUAGE_CODE = 'en-us'
115 |
116 | TIME_ZONE = 'UTC'
117 |
118 | USE_I18N = True
119 |
120 | USE_L10N = True
121 |
122 | USE_TZ = True
123 |
124 |
125 | STATIC_URL = '/static/'
126 |
127 | STATICFILES_DIRS = (
128 | [(os.path.join(BASE_DIR, 'static'))]
129 | )
130 |
131 |
132 | #: SaltStackApi配置详情
133 | SaltStackApi = {
134 | 'url': 'https://172.28.5.50:8000',
135 | 'user': 'saltapi',
136 | 'password': 'saltapi'
137 | }
138 |
139 |
140 | #: 项目构建路径, 项目配置文件路径, 不存在的文件会自动创建
141 | #: setting = 项目配置文件存放的路径,**必须相对路径,没有特殊情况请勿修改**
142 | #: build = 项目maven构建路径,**绝对路径,可自由安排**
143 | ProjectPath = {
144 | 'build': 'F:/project-build',
145 | 'setting': 'project_setting'
146 | }
147 |
148 |
149 | #: 邮箱配置详情 建议不要使用QQ个人邮箱,请使用企业邮箱
150 | Email = {
151 | 'email_host': 'smtp.exmail.qq.com',
152 | 'email_port': 465,
153 | 'email_user': '邮箱账号',
154 | 'email_password': '邮箱密码',
155 | 'email_postfix': '邮箱域名'
156 | }
157 |
158 |
159 | #: Zabbix配置详情
160 | zabbix_host_url = 'zabbix服务地址'
161 | zabbix_username = '账号'
162 | zabbix_password = '密码'
163 |
--------------------------------------------------------------------------------
/devops/urls.py:
--------------------------------------------------------------------------------
1 | from django.contrib import admin
2 | from django.urls import path, include
3 |
4 | urlpatterns = [
5 | path('', include('cmdb.urls')),
6 | path('admin/', admin.site.urls),
7 | ]
8 |
--------------------------------------------------------------------------------
/devops/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for devops project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devops.settings')
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import os
3 | import sys
4 |
5 | if __name__ == '__main__':
6 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'devops.settings')
7 | try:
8 | from django.core.management import execute_from_command_line
9 | except ImportError as exc:
10 | raise ImportError(
11 | "Couldn't import Django. Are you sure it's installed and "
12 | "available on your PYTHONPATH environment variable? Did you "
13 | "forget to activate a virtual environment?"
14 | ) from exc
15 | execute_from_command_line(sys.argv)
16 |
--------------------------------------------------------------------------------
/sdk_api/ZabbixApi.py:
--------------------------------------------------------------------------------
1 | # -*- encoding: utf-8 -*-
2 | import json
3 | import logging
4 | import os
5 | import ssl
6 | import sys
7 |
8 |
9 | try:
10 | import urllib2
11 | except ImportError:
12 | import urllib.request as urllib2
13 |
14 |
15 | class NullHandler(logging.Handler):
16 | """Null logger handler.
17 | :class:`NullHandler` will used if there are no other logger handlers.
18 | """
19 | def emit(self, record):
20 | pass
21 |
22 | null_handler = NullHandler()
23 | logger = logging.getLogger(__name__)
24 | logger.addHandler(null_handler)
25 |
26 |
27 | class ZabbixAPIException(Exception):
28 | def __init__(self, *args):
29 | super(Exception, self).__init__(*args)
30 | if len(args) == 1 and isinstance(args[0], dict):
31 | self.error = args[0]
32 | self.message = self.error['message']
33 | self.code = self.error['code']
34 | self.data = self.error['data']
35 | self.json = self.error['json']
36 |
37 |
38 | class ZabbixAPIObjectClass(object):
39 | def __init__(self, group, parent):
40 | self.group = group
41 | self.parent = parent
42 |
43 | def __getattr__(self, name):
44 |
45 |
46 | def fn(*args, **kwargs):
47 | if args and kwargs:
48 | raise TypeError("Found both args and kwargs")
49 |
50 | method = '{0}.{1}'.format(self.group, name)
51 | logger.debug("Call %s method", method)
52 |
53 | return self.parent.do_request(
54 | method,
55 | args or kwargs
56 | )['result']
57 |
58 | return fn
59 |
60 |
61 | def ssl_context_compat(func):
62 | def inner(req):
63 | # We shoul explicitly disable cert verification to support
64 | # self-signed certs with urllib2 since Python 2.7.9 and 3.4.3
65 |
66 | default_version = (2, 7, 9)
67 | version = {
68 | 2: default_version,
69 | 3: (3, 4, 3),
70 | }
71 |
72 | python_version = sys.version_info[0]
73 | minimum_version = version.get(python_version, default_version)
74 |
75 | if sys.version_info[0:3] >= minimum_version:
76 | # Create default context to skip SSL cert verification.
77 | ctx = ssl.create_default_context()
78 | ctx.check_hostname = False
79 | ctx.verify_mode = ssl.CERT_NONE
80 | res = func(req, context=ctx)
81 | else:
82 | res = func(req)
83 |
84 | return res
85 |
86 | return inner
87 |
88 |
89 | @ssl_context_compat
90 | def urlopen(*args, **kwargs):
91 | return urllib2.urlopen(*args, **kwargs)
92 |
93 |
94 | class ZabbixAPI(object):
95 | def __init__(self, url=None, use_authenticate=False, user=None,
96 | password=None):
97 |
98 | url = url or os.environ.get('ZABBIX_URL') or 'https://localhost/zabbix'
99 | user = user or os.environ.get('ZABBIX_USER') or 'Admin'
100 | password = password or os.environ.get('ZABBIX_PASSWORD') or 'zabbix'
101 |
102 | self.use_authenticate = use_authenticate
103 | self.auth = None
104 | self.url = url + '/api_jsonrpc.php'
105 | self._login(user, password)
106 | logger.debug("JSON-PRC Server: %s", self.url)
107 |
108 | def __getattr__(self, name):
109 | """Dynamically create an object class (ie: host).
110 | :type name: str
111 | :param name: Zabbix API method group name.
112 | Example: `apiinfo.version` method it will be `apiinfo`.
113 | """
114 |
115 | return ZabbixAPIObjectClass(name, self)
116 |
117 | def _login(self, user='', password=''):
118 | """Do login to zabbix server.
119 | :type user: str
120 | :param user: Zabbix user
121 | :type password: str
122 | :param password: Zabbix user password
123 | """
124 |
125 | logger.debug("ZabbixAPI.login({0},{1})".format(user, password))
126 |
127 | self.auth = None
128 |
129 | if self.use_authenticate:
130 | self.auth = self.user.authenticate(user=user, password=password)
131 | else:
132 | self.auth = self.user.login(user=user, password=password)
133 |
134 | def api_version(self):
135 | """Return version of server Zabbix API.
136 | :rtype: str
137 | :return: Version of server Zabbix API.
138 | """
139 |
140 | return self.apiinfo.version()
141 |
142 | def do_request(self, method, params=None):
143 | request_json = {
144 | 'jsonrpc': '2.0',
145 | 'method': method,
146 | 'params': params or {},
147 | 'id': '1',
148 | }
149 |
150 | # apiinfo.version and user.login doesn't require auth token
151 | if self.auth and (method not in ('apiinfo.version', 'user.login')):
152 | request_json['auth'] = self.auth
153 |
154 | logger.debug(
155 | 'urllib2.Request({0}, {1})'.format(
156 | self.url,
157 | json.dumps(request_json)))
158 |
159 | data = json.dumps(request_json)
160 | if not isinstance(data, bytes):
161 | data = data.encode("utf-8")
162 |
163 | req = urllib2.Request(self.url, data)
164 | req.get_method = lambda: 'POST'
165 | req.add_header('Content-Type', 'application/json-rpc')
166 |
167 | try:
168 | res = urlopen(req)
169 | res_str = res.read().decode('utf-8')
170 | res_json = json.loads(res_str)
171 | except ValueError as e:
172 | raise ZabbixAPIException("Unable to parse json: %s" % e.message)
173 |
174 | res_str = json.dumps(res_json, indent=4, separators=(',', ': '))
175 | logger.debug("Response Body: %s", res_str)
176 |
177 | if 'error' in res_json:
178 | err = res_json['error'].copy()
179 | err.update({'json': str(request_json)})
180 | raise ZabbixAPIException(err)
181 |
182 | return res_json
183 |
184 | def get_id(self, item_type, item=None, with_id=False, hostid=None, **args):
185 | result = None
186 | name = args.get('name', False)
187 |
188 | type_ = '{item_type}.get'.format(item_type=item_type)
189 |
190 | item_filter_name = {
191 | 'mediatype': 'description',
192 | 'trigger': 'description',
193 | 'triggerprototype': 'description',
194 | 'user': 'alias',
195 | 'usermacro': 'macro',
196 | }
197 |
198 | item_id_name = {
199 | 'discoveryrule': 'item',
200 | 'graphprototype': 'graph',
201 | 'hostgroup': 'group',
202 | 'itemprototype': 'item',
203 | 'map': 'selement',
204 | 'triggerprototype': 'trigger',
205 | 'usergroup': 'usrgrp',
206 | 'usermacro': 'hostmacro',
207 | }
208 |
209 | filter_ = {
210 | 'filter': {
211 | item_filter_name.get(item_type, 'name'): item,
212 | },
213 | 'output': 'extend'}
214 |
215 | if hostid:
216 | filter_['filter'].update({'hostid': hostid})
217 |
218 | if args.get('templateids'):
219 | if item_type == 'usermacro':
220 | filter_['hostids'] = args['templateids']
221 | else:
222 | filter_['templateids'] = args['templateids']
223 |
224 | if args.get('app_name'):
225 | filter_['application'] = args['app_name']
226 |
227 | logger.debug(
228 | 'do_request( "{type}", {filter} )'.format(
229 | type=type_,
230 | filter=filter_))
231 | response = self.do_request(type_, filter_)['result']
232 |
233 | if response:
234 | item_id_str = item_id_name.get(item_type, item_type)
235 | item_id = '{item}id'.format(item=item_id_str)
236 | result = []
237 | for obj in response:
238 | # Check if object not belong current template
239 | if args.get('templateids'):
240 | if (not obj.get('templateid') in ("0", None) or
241 | not len(obj.get('templateids', [])) == 0):
242 | continue
243 |
244 | if name:
245 | o = obj.get(item_filter_name.get(item_type, 'name'))
246 | result.append(o)
247 | elif with_id:
248 | result.append({item_id: int(obj.get(item_id))})
249 | else:
250 | result.append(int(obj.get(item_id)))
251 |
252 | list_types = (list, type(None))
253 | if not isinstance(item, list_types):
254 | result = result[0]
255 |
256 | return result
--------------------------------------------------------------------------------
/sdk_api/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tender-Liu/cmdb-python/a2eb1ca51cc062b677ece5746569906d087c8202/sdk_api/__init__.py
--------------------------------------------------------------------------------
/sdk_api/saltstack.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | # -*-coding:utf-8-*-
3 | import urllib
4 | import urllib.parse
5 | import urllib.request
6 | import ssl
7 | import json
8 | from devops.settings import SaltStackApi
9 |
10 | #: 解决saltstack api ssh连接报错
11 | context = ssl._create_unverified_context()
12 | ssl._create_default_https_context = ssl._create_unverified_context
13 |
14 |
15 | class SaltAPI(object):
16 | __token_id = ''
17 |
18 | #: 类变量定义
19 | def __init__(self):
20 | self.__url = SaltStackApi['url']
21 | self.__user = SaltStackApi['user']
22 | self.__password = SaltStackApi['password']
23 |
24 | #: 获取请求成功参数token值
25 | def token_id(self):
26 | params = {'eauth': 'pam', 'username': self.__user, 'password': self.__password}
27 | encode_params = urllib.parse.urlencode(params).encode(encoding='utf-8')
28 | content = self.post_request(encode_params, prefix='/login')
29 | self.__token_id = content['return'][0]['token']
30 |
31 | #: 使用post请求,配置请求参数
32 | def post_request(self, params, prefix='/'):
33 | url = self.__url + prefix
34 | headers = {'X-Auth-Token': self.__token_id}
35 | req = urllib.request.Request(url, params, headers=headers)
36 | data = urllib.request.urlopen(req).read().decode("utf-8")
37 | content = json.loads(data)
38 | return content
39 |
40 | #: 获取各主机信息
41 | def salt_command(self, tgt, fun, arg=None):
42 | self.token_id()
43 | params = {'client': 'local'}
44 | try:
45 | if tgt and fun:
46 | if type(tgt) == list:
47 | params['expr_form'] = 'list'
48 | params['tgt'] = ','.join(tgt)
49 | else:
50 | params['tgt'] = tgt
51 | params['fun'] = fun
52 | else:
53 | raise Exception("salt语法有误,请检查!")
54 | if arg:
55 | params['arg'] = arg
56 | encode_params = urllib.parse.urlencode(params).encode(encoding='utf-8')
57 | content = self.post_request(encode_params)
58 | return content
59 | except Exception as e:
60 | return str(e)
--------------------------------------------------------------------------------
/templates/task-info.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
43 |
44 |
45 | 任务信息
46 |
47 |
48 |
49 | taskId |
50 | 任务标题 |
51 | 任务状态 |
52 | 申请人 |
53 | 处理人 |
54 | 授权人 |
55 |
56 |
57 |
58 |
59 |
60 | {{ data.task_id }} |
61 | {{ data.task_name }} |
62 | {% if data.task_state == 1 %}
63 | 审核中 |
64 | {% elif data.task_state == 2 %}
65 | 审核未通过 |
66 | {% elif data.task_state == 3 %}
67 | 审核完成 |
68 | {% else %}
69 | 已完成 |
70 | {% endif %}
71 | {{ data.create__user_name }} |
72 | {{ data.execute__user_name }} |
73 | {{ data.authorizer__user_name }} |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 | 任务详情 |
82 | 拒绝授权理由 |
83 | 创建时间 |
84 | 完成时间 |
85 |
86 |
87 |
88 |
89 | {{ data.task_info }} |
90 | {{ data.remarks }} |
91 | {{ data.created_date }} |
92 | {{ data.modify_date }} |
93 |
94 |
95 |
96 |
97 |
98 |
--------------------------------------------------------------------------------
/test.py:
--------------------------------------------------------------------------------
1 | def fab(max):
2 | n,a,b = 0,0,1
3 | while n < max:
4 | yield b
5 | a,b = b,a + b
6 | n = n + 1
7 |
8 |
--------------------------------------------------------------------------------
/utils/DateEncoder.py:
--------------------------------------------------------------------------------
1 | import json
2 | import datetime
3 |
4 |
5 | #: datatime数据类型转换
6 | class DateEncoder(json.JSONEncoder):
7 |
8 | def default(self, obj):
9 | if isinstance(obj, datetime.datetime):
10 | return obj.strftime('%Y-%m-%d %H:%M:%S')
11 | elif isinstance(obj, datetime.date):
12 | return obj.strftime("%Y-%m-%d")
13 | else:
14 | return json.JSONEncoder.default(self, obj)
15 |
16 |
17 |
--------------------------------------------------------------------------------
/utils/JsonResponse.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin python
2 | # _*_ coding:utf-8 _*_
3 | from django.forms.models import model_to_dict
4 | import json
5 | from utils.DateEncoder import DateEncoder
6 |
7 |
8 | #: orm对象转换
9 | def OrmConversion(params):
10 | if type(params) is list:
11 | data_list = []
12 | for param in params:
13 | data_list.append(model_to_dict(param))
14 | return data_list
15 | else:
16 | data = model_to_dict(params)
17 | return data
18 |
19 |
20 | #: api返回json格式标准
21 | class JsonResponse(object):
22 | def __init__(self, code, message=None, data=None):
23 | self.code = code
24 | self.message = message
25 | self.data = data
26 |
27 |
28 | def getJson(self):
29 | responseData = {
30 | 'code': self.code,
31 | 'message': self.message,
32 | 'data': self.data,
33 | }
34 | try:
35 | return json.dumps(responseData, cls=DateEncoder, ensure_ascii=False).encode('utf-8')
36 | except Exception as e:
37 | return json.dumps(responseData, cls=DateEncoder).encode('utf-8')
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/utils/UserSession.py:
--------------------------------------------------------------------------------
1 | from cmdb.views.dao import userInfoDao
2 | from cmdb.views.dao import apiInfoDao
3 | import json
4 |
5 | def checkUserSession(request):
6 | try:
7 | userId = request.session["userId"]
8 | userInfo = userInfoDao.getAllFromUsreInfoByUserId(userId=userId)
9 | apiStr = userInfo['group__role__api_list']
10 | if apiStr != '*':
11 | apiList = json.loads(apiStr)
12 | apiUrl = request.path[1:]
13 | apiId = apiInfoDao.getApiIdFromApiInfoByApiUrl(apiUrl)
14 | if apiId not in apiList:
15 | raise Exception('您暂无权限,请联系管理员,给您附加权限,谢谢!')
16 | return userInfo
17 | except KeyError:
18 | raise Exception("请求api失败,请登录后操作!")
19 | except Exception as e:
20 | raise Exception('您暂无权限,请联系管理员,给您附加权限,谢谢!%s', e)
21 |
--------------------------------------------------------------------------------
/utils/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Tender-Liu/cmdb-python/a2eb1ca51cc062b677ece5746569906d087c8202/utils/__init__.py
--------------------------------------------------------------------------------
/utils/githot.py:
--------------------------------------------------------------------------------
1 | import git
2 | import os
3 |
4 | class githot():
5 |
6 | #: git信息初始化
7 | def __init__(self, url, user, password, localPath):
8 | if url is None or localPath is None or user is None:
9 | raise Exception('gitApi报错: git地址,项目名,项目路径,都不能为空!')
10 | elif password:
11 | self.__gitUrl = url.replace('://', ('://%s:%s@'%(user, password)), 1)
12 | else:
13 | self.__gitUrl = url
14 | self.__localPath = localPath
15 |
16 |
17 | #: 项目克隆,以及项目与初始化
18 | def gitClone(self):
19 | try:
20 | repo = None
21 | if os.listdir(self.__localPath):
22 | repo = git.Repo(self.__localPath)
23 | else:
24 | repo = git.Repo.clone_from(url=self.__gitUrl, to_path=self.__localPath)
25 | return repo
26 | except Exception as e:
27 | raise Exception('gitApi报错: git账号密码错误!.{}'.format(e))
28 |
29 |
30 | #: 项目分支获取 === 需要点时间,因为先clone代码,在获取分支的
31 | def getBranchsFromGit(self):
32 | repo = self.gitClone()
33 | #:获取分支
34 | repo.git.fetch()
35 | branchs = repo.git.branch('-r').split('\n')
36 | for i in range(len(branchs)):
37 | branchs[i] = branchs[i].strip()
38 | if branchs[i].find('->') > 0:
39 | branchs[i] = branchs[i][15:]
40 | return branchs
41 |
42 |
43 | #: 指定项目分支,下载源代码
44 | def getPullFromGitByBranch(self, branch):
45 | if branch is None:
46 | raise Exception('gitApi报错: branch不能为空!')
47 | repo = self.gitClone()
48 | repo.git.checkout(branch)
49 | branch = branch.split('/')
50 | if len(branch) != 2 or branch[0] != 'origin':
51 | raise Exception("gitApi报错: branch参数报错, branch参数例子:origin/xxxx")
52 | repo.git.pull(branch[0], branch[1])
53 | print(branch)
--------------------------------------------------------------------------------
/utils/sendemail.py:
--------------------------------------------------------------------------------
1 | import smtplib
2 | import os
3 | from email.mime.text import MIMEText
4 | from jinja2 import Environment, FileSystemLoader
5 | from devops.settings import Email
6 |
7 |
8 | # 发送邮件类
9 | class SendEmail:
10 | #: 邮件配置初始化
11 | def __init__(self):
12 | self.mailHost = Email['email_host'] # 设置服务器
13 | self.mailUser = Email['email_user'] # 用户名
14 | self.mailPass = Email['email_password'] # 口令
15 | self.mailPostfix = Email['email_postfix'] # 发件箱的后缀
16 |
17 | #: subject: 邮件主题
18 | #: addressee: 收件人 列表类型
19 | #: data: 网页渲染的数据
20 | #: html: 网页
21 | def sendMail(self, subject, addressee, data, html):
22 | path = os.path.dirname(os.path.abspath(__file__))
23 | env = Environment(autoescape=False, loader=FileSystemLoader(os.path.join(path, '../templates')), trim_blocks=False)
24 | template = env.get_template(html)
25 | content = template.render(data=data)
26 | msg = MIMEText(content, _subtype='html', _charset='utf-8')
27 | msg['Subject'] = subject
28 | msg['From'] = "CMDB系统邮件<" + self.mailUser + ">"
29 | msg['To'] = ";".join(addressee)
30 | sendEmail = smtplib.SMTP()
31 | try:
32 | sendEmail.connect(self.mailHost) # 连接smtp服务器
33 | sendEmail.login(self.mailUser, self.mailPass) # 登陆服务器
34 | sendEmail.sendmail(self.mailUser, addressee, msg.as_string()) # 发送邮件
35 | return True
36 | except Exception as e:
37 | return e
38 | finally:
39 | sendEmail.close()
40 |
--------------------------------------------------------------------------------