├── .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 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 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 | 72 | 73 | 74 | 75 | 76 |
taskId任务标题任务状态申请人处理人授权人
{{ data.task_id }}{{ data.task_name }}审核中审核未通过审核完成已完成{{ data.create__user_name }}{{ data.execute__user_name }}{{ data.authorizer__user_name }}
77 |
78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 |
任务详情拒绝授权理由创建时间完成时间
{{ data.task_info }}{{ data.remarks }}{{ data.created_date }}{{ data.modify_date }}
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 | --------------------------------------------------------------------------------