├── .gitignore ├── LICENSE ├── README.md ├── apps ├── __init__.py ├── cabinet │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── filter.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── groups │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── common.py │ ├── filters.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── idcs │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── filter.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── manufacturers │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── filter.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── menu │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── common.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── permissions │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── common.py │ ├── filters.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── products │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── filters.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── servers │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── filter.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py ├── users │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── common.py │ ├── filters.py │ ├── models.py │ ├── router.py │ ├── serializers.py │ ├── tests.py │ └── views.py └── zabbix │ ├── __init__.py │ ├── admin.py │ ├── api_wrapper.py │ ├── apps.py │ ├── common.py │ ├── exceptions.py │ ├── models.py │ ├── router.py │ ├── tests.py │ └── views.py ├── docs └── install.md ├── manage.py ├── ops ├── __init__.py ├── paginations.py ├── permissions.py ├── settings.py ├── settings_dev.py ├── urls.py └── wsgi.py ├── requirements.txt └── scripts └── import_menu.py /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/node,python,django,vagrant,pycharm,webstorm 3 | 4 | ### Django ### 5 | *.log 6 | *.pot 7 | *.pyc 8 | __pycache__/ 9 | ops/apps/*/migrations 10 | ops/.idea 11 | local_settings.py 12 | db.sqlite3 13 | media 14 | 15 | # If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ 16 | # in your Git repository. Update and uncomment the following line accordingly. 17 | # /staticfiles/ 18 | 19 | ### Node ### 20 | # Logs 21 | logs 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # Runtime data 27 | pids 28 | *.pid 29 | *.seed 30 | *.pid.lock 31 | 32 | # Directory for instrumented libs generated by jscoverage/JSCover 33 | lib-cov 34 | 35 | # Coverage directory used by tools like istanbul 36 | coverage 37 | 38 | # nyc test coverage 39 | .nyc_output 40 | 41 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 42 | .grunt 43 | 44 | # Bower dependency directory (https://bower.io/) 45 | bower_components 46 | 47 | # node-waf configuration 48 | .lock-wscript 49 | 50 | # Compiled binary addons (http://nodejs.org/api/addons.html) 51 | build/Release 52 | 53 | # Dependency directories 54 | node_modules/ 55 | jspm_packages/ 56 | 57 | # Typescript v1 declaration files 58 | typings/ 59 | 60 | # Optional npm cache directory 61 | .npm 62 | 63 | # Optional eslint cache 64 | .eslintcache 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variables file 76 | .env 77 | 78 | 79 | ### PyCharm ### 80 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 81 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 82 | 83 | # User-specific stuff: 84 | .idea/**/workspace.xml 85 | .idea/**/tasks.xml 86 | .idea/dictionaries 87 | 88 | 89 | # Sensitive or high-churn files: 90 | .idea/**/dataSources/ 91 | .idea/**/dataSources.ids 92 | .idea/**/dataSources.xml 93 | .idea/**/dataSources.local.xml 94 | .idea/**/sqlDataSources.xml 95 | .idea/**/dynamic.xml 96 | .idea/**/uiDesigner.xml 97 | 98 | # Gradle: 99 | .idea/**/gradle.xml 100 | .idea/**/libraries 101 | 102 | # CMake 103 | cmake-build-debug/ 104 | 105 | # Mongo Explorer plugin: 106 | .idea/**/mongoSettings.xml 107 | 108 | ## File-based project format: 109 | *.iws 110 | 111 | ## Plugin-specific files: 112 | 113 | # IntelliJ 114 | /out/ 115 | 116 | # mpeltonen/sbt-idea plugin 117 | .idea_modules/ 118 | 119 | # JIRA plugin 120 | atlassian-ide-plugin.xml 121 | 122 | # Cursive Clojure plugin 123 | .idea/replstate.xml 124 | 125 | # Ruby plugin and RubyMine 126 | /.rakeTasks 127 | 128 | # Crashlytics plugin (for Android Studio and IntelliJ) 129 | com_crashlytics_export_strings.xml 130 | crashlytics.properties 131 | crashlytics-build.properties 132 | fabric.properties 133 | 134 | ### PyCharm Patch ### 135 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 136 | 137 | # *.iml 138 | # modules.xml 139 | # .idea/misc.xml 140 | # *.ipr 141 | 142 | # Sonarlint plugin 143 | .idea/sonarlint 144 | .vscode/ 145 | 146 | ### Python ### 147 | # Byte-compiled / optimized / DLL files 148 | *.py[cod] 149 | *$py.class 150 | 151 | # C extensions 152 | *.so 153 | 154 | # Distribution / packaging 155 | .Python 156 | build/ 157 | develop-eggs/ 158 | dist/ 159 | downloads/ 160 | eggs/ 161 | .eggs/ 162 | lib/ 163 | lib64/ 164 | parts/ 165 | sdist/ 166 | var/ 167 | wheels/ 168 | *.egg-info/ 169 | .installed.cfg 170 | *.egg 171 | 172 | # PyInstaller 173 | # Usually these files are written by a python script from a template 174 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 175 | *.manifest 176 | *.spec 177 | 178 | # Installer logs 179 | pip-log.txt 180 | pip-delete-this-directory.txt 181 | 182 | # Unit test / coverage reports 183 | htmlcov/ 184 | .tox/ 185 | .coverage 186 | .coverage.* 187 | .cache 188 | .pytest_cache/ 189 | nosetests.xml 190 | coverage.xml 191 | *.cover 192 | .hypothesis/ 193 | 194 | # Translations 195 | *.mo 196 | 197 | # Flask stuff: 198 | instance/ 199 | .webassets-cache 200 | 201 | # Scrapy stuff: 202 | .scrapy 203 | 204 | # Sphinx documentation 205 | docs/_build/ 206 | 207 | # PyBuilder 208 | target/ 209 | 210 | # Jupyter Notebook 211 | .ipynb_checkpoints 212 | 213 | # pyenv 214 | .python-version 215 | 216 | # celery beat schedule file 217 | celerybeat-schedule.* 218 | 219 | # SageMath parsed files 220 | *.sage.py 221 | 222 | # Environments 223 | .venv 224 | env/ 225 | venv/ 226 | ENV/ 227 | env.bak/ 228 | venv.bak/ 229 | 230 | # Spyder project settings 231 | .spyderproject 232 | .spyproject 233 | 234 | # Rope project settings 235 | .ropeproject 236 | 237 | # mkdocs documentation 238 | /site 239 | 240 | # mypy 241 | .mypy_cache/ 242 | 243 | ### Vagrant ### 244 | .vagrant/ 245 | *.box 246 | 247 | ### WebStorm ### 248 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm 249 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 250 | 251 | # User-specific stuff: 252 | 253 | # Sensitive or high-churn files: 254 | 255 | # Gradle: 256 | 257 | # CMake 258 | 259 | # Mongo Explorer plugin: 260 | 261 | ## File-based project format: 262 | 263 | ## Plugin-specific files: 264 | 265 | # IntelliJ 266 | 267 | # mpeltonen/sbt-idea plugin 268 | 269 | # JIRA plugin 270 | 271 | # Cursive Clojure plugin 272 | 273 | # Ruby plugin and RubyMine 274 | 275 | # Crashlytics plugin (for Android Studio and IntelliJ) 276 | 277 | ### WebStorm Patch ### 278 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 279 | 280 | # *.iml 281 | # modules.xml 282 | # .idea/misc.xml 283 | # *.ipr 284 | 285 | # Sonarlint plugin 286 | 287 | 288 | # End of https://www.gitignore.io/api/node,python,django,vagrant,pycharm,webstorm 289 | 290 | apps/*/migrations/ 291 | */__pycache__/ 292 | .idea/ -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 开源运维平台 2 | 3 | 此版本为开发版,用于研究与学习! -------------------------------------------------------------------------------- /apps/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/__init__.py -------------------------------------------------------------------------------- /apps/cabinet/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/cabinet/__init__.py -------------------------------------------------------------------------------- /apps/cabinet/admin.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/cabinet/admin.py -------------------------------------------------------------------------------- /apps/cabinet/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CabinetConfig(AppConfig): 5 | name = 'cabinet' 6 | -------------------------------------------------------------------------------- /apps/cabinet/filter.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | 3 | from .models import Cabinet 4 | 5 | 6 | class CabinetFilter(django_filters.rest_framework.FilterSet): 7 | """ 8 | 机柜过滤类 9 | """ 10 | name = django_filters.CharFilter(lookup_expr="icontains") 11 | idc = django_filters.NumberFilter(method="search_idc") 12 | 13 | def search_idc(self, queryset, name, value): 14 | return queryset.filter(idc__pk=value) 15 | 16 | 17 | class Meta: 18 | model = Cabinet 19 | fields = ['name', 'idc'] -------------------------------------------------------------------------------- /apps/cabinet/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from idcs.models import Idc 3 | # Create your models here. 4 | 5 | class Cabinet(models.Model): 6 | name = models.CharField("机柜名称", max_length=50, help_text="机柜名称") 7 | power_supply = models.IntegerField("电源功率", help_text="电源功率") 8 | idc = models.ForeignKey(Idc, verbose_name="所在机房", help_text="所在机房") 9 | 10 | def __str__(self): 11 | return self.name 12 | 13 | class Meta: 14 | db_table = 'resources_cabinet' 15 | permissions = ( 16 | ("view_cabinet", "cat view cabinet"), 17 | ) 18 | ordering = ["id"] -------------------------------------------------------------------------------- /apps/cabinet/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import CabinetViewset 3 | 4 | 5 | cabinet_router = DefaultRouter() 6 | cabinet_router.register(r'cabinet', CabinetViewset, base_name="cabinet") 7 | 8 | -------------------------------------------------------------------------------- /apps/cabinet/serializers.py: -------------------------------------------------------------------------------- 1 | 2 | from .models import Cabinet 3 | from rest_framework import serializers 4 | 5 | class CabinetSerializer(serializers.ModelSerializer): 6 | 7 | def to_representation(self, instance): 8 | idc_obj = instance.idc 9 | ret = super(CabinetSerializer, self).to_representation(instance) 10 | ret["idc"] = { 11 | "name": idc_obj.name, 12 | "id": idc_obj.id 13 | } 14 | return ret 15 | 16 | class Meta: 17 | model = Cabinet 18 | fields = '__all__' -------------------------------------------------------------------------------- /apps/cabinet/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/cabinet/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets 2 | from .models import Cabinet 3 | from .serializers import CabinetSerializer 4 | from .filter import CabinetFilter 5 | 6 | class CabinetViewset(viewsets.ModelViewSet): 7 | """ 8 | list: 9 | 返回机柜列表 10 | 11 | create: 12 | 创建机柜记录 13 | 14 | retrieve: 15 | 返回机柜记录 16 | 17 | destroy 18 | 删除机柜记录 19 | 20 | update: 21 | 更新机柜记录 22 | """ 23 | queryset = Cabinet.objects.all() 24 | serializer_class = CabinetSerializer 25 | filter_class = CabinetFilter 26 | filter_fields = ("name", "idc") 27 | -------------------------------------------------------------------------------- /apps/groups/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/groups/__init__.py -------------------------------------------------------------------------------- /apps/groups/admin.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/groups/admin.py -------------------------------------------------------------------------------- /apps/groups/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class GroupsConfig(AppConfig): 5 | name = 'groups' 6 | -------------------------------------------------------------------------------- /apps/groups/common.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import Group 2 | 3 | def get_group_obj(gid): 4 | try: 5 | return Group.objects.get(pk=gid) 6 | except Group.DoesNotExist: 7 | return None -------------------------------------------------------------------------------- /apps/groups/filters.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | from django.contrib.auth.models import Group 3 | 4 | class GroupFilter(django_filters.rest_framework.FilterSet): 5 | """ 6 | 用户组过滤类 7 | """ 8 | name = django_filters.CharFilter(name='name',lookup_expr='icontains') 9 | 10 | 11 | class Meta: 12 | model = Group 13 | fields = ['name'] 14 | 15 | -------------------------------------------------------------------------------- /apps/groups/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /apps/groups/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import GroupsViewset, UserGroupsViewset, GroupMembersViewset 3 | 4 | 5 | group_router = DefaultRouter() 6 | group_router.register(r'groups', GroupsViewset, base_name="groups") 7 | group_router.register(r'usergroups',UserGroupsViewset, base_name="usergroups") 8 | group_router.register(r'groupmembers', GroupMembersViewset, base_name="groupmembers") 9 | -------------------------------------------------------------------------------- /apps/groups/serializers.py: -------------------------------------------------------------------------------- 1 | 2 | from django.contrib.auth import get_user_model 3 | from django.contrib.auth.models import Group 4 | 5 | from rest_framework import serializers 6 | 7 | User = get_user_model() 8 | 9 | class Groupserializer(serializers.ModelSerializer): 10 | """ 11 | group序列化类 12 | """ 13 | def to_representation(self, instance): 14 | member = instance.user_set.count() 15 | ret = super(Groupserializer, self).to_representation(instance) 16 | ret["member"] = member 17 | return ret 18 | 19 | 20 | class Meta: 21 | model = Group 22 | fields = ("id", "name") 23 | 24 | class UserGroupsSerializer(serializers.ModelSerializer): 25 | """ 26 | 用户的角色 序列化类 27 | """ 28 | groups = Groupserializer(many=True) 29 | 30 | def to_representation(self, instance): 31 | name = instance.name 32 | ret = super(UserGroupsSerializer, self).to_representation(instance) 33 | ret["name"] = name 34 | return ret 35 | 36 | class Meta: 37 | model = User 38 | fields = ("id", "username", "groups") -------------------------------------------------------------------------------- /apps/groups/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/groups/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import Group 2 | from django.contrib.auth import get_user_model 3 | from django.db.models import Q 4 | from rest_framework import mixins, viewsets, status 5 | from rest_framework.response import Response 6 | 7 | from users.serializers import UserSerializer 8 | from users.common import get_user_obj 9 | 10 | 11 | from .serializers import Groupserializer 12 | from .filters import GroupFilter 13 | 14 | 15 | User = get_user_model() 16 | 17 | 18 | class GroupsViewset(viewsets.ModelViewSet): 19 | """ 20 | list: 21 | 返回用户组(角色)列表 22 | 23 | destroy: 24 | 删除角色 25 | """ 26 | queryset = Group.objects.all() 27 | serializer_class = Groupserializer 28 | filter_class = GroupFilter 29 | filter_fields = ("name",) 30 | 31 | def get_queryset(self): 32 | queryset = super(GroupsViewset, self).get_queryset() 33 | queryset = queryset.order_by("id") 34 | return queryset 35 | 36 | 37 | class UserGroupsViewset(mixins.RetrieveModelMixin, 38 | mixins.UpdateModelMixin, 39 | viewsets.GenericViewSet): 40 | 41 | """ 42 | retrieve: 43 | 返回指定用户的所有角色 44 | 45 | update: 46 | 修改当前用户的角色 47 | """ 48 | queryset = User.objects.all() 49 | serializer_class = Groupserializer 50 | 51 | def retrieve(self, request, *args, **kwargs): 52 | user_obj = self.get_object() 53 | queryset = user_obj.groups.all() 54 | 55 | page = self.paginate_queryset(queryset) 56 | if page is not None: 57 | serializer = self.get_serializer(page, many=True) 58 | return self.get_paginated_response(serializer.data) 59 | 60 | serializer = self.get_serializer(queryset, many=True) 61 | return Response(serializer.data) 62 | 63 | def update(self, request, *args, **kwargs): 64 | user_obj = self.get_object() 65 | gids = request.data.get("gid", []) 66 | user_obj.groups = Group.objects.filter(id__in=gids) 67 | return Response(status=status.HTTP_204_NO_CONTENT) 68 | 69 | def get_queryset(self): 70 | queryset = super(UserGroupsViewset, self).get_queryset() 71 | return queryset.order_by("id") 72 | 73 | 74 | class GroupMembersViewset(mixins.RetrieveModelMixin, 75 | mixins.UpdateModelMixin, 76 | mixins.DestroyModelMixin, 77 | viewsets.GenericViewSet): 78 | """ 79 | 角色成员管理 80 | 81 | retrieve: 82 | 返回指定组的成员列表 83 | 84 | update: 85 | 往指定组里添加成员 86 | 87 | destroy: 88 | 从指定组里删除成员 89 | """ 90 | queryset = Group.objects.all() 91 | serializer_class = UserSerializer 92 | 93 | 94 | def retrieve(self, request, *args, **kwargs): 95 | instance = self.get_object() 96 | queryset = instance.user_set.all() 97 | username=request.GET.get("username", None) 98 | if username is not None: 99 | queryset = queryset.filter(Q(name__icontains=username)|Q(username__icontains=username)) 100 | queryset = self.filter_queryset(queryset) 101 | page = self.paginate_queryset(queryset) 102 | if page is not None: 103 | serializer = self.get_serializer(page, many=True) 104 | return self.get_paginated_response(serializer.data) 105 | 106 | serializer = self.get_serializer(queryset, many=True) 107 | return Response(serializer.data) 108 | 109 | def update(self, request, *args, **kwargs): 110 | ret = {"status":0} 111 | group_obj = self.get_object() 112 | userobj = get_user_obj(request.data.get(request.data.get("uid", 0))) 113 | if userobj is None: 114 | ret["status"] = 1 115 | ret["errmsg"] = "用户错误" 116 | else: 117 | group_obj.user_set.add(userobj) 118 | return Response(ret, status=status.HTTP_200_OK) 119 | 120 | def destroy(self, request, *args, **kwargs): 121 | ret = {"status": 0} 122 | group_obj = self.get_object() 123 | userobj = get_user_obj(request.data.get("uid", 0)) 124 | if userobj is None: 125 | ret["status"] = 1 126 | ret["errmsg"] = "用户错误" 127 | else: 128 | group_obj.user_set.remove(userobj) 129 | return Response(ret, status=status.HTTP_200_OK) -------------------------------------------------------------------------------- /apps/idcs/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/idcs/__init__.py -------------------------------------------------------------------------------- /apps/idcs/admin.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/idcs/admin.py -------------------------------------------------------------------------------- /apps/idcs/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class IdcsConfig(AppConfig): 5 | name = 'idcs' 6 | -------------------------------------------------------------------------------- /apps/idcs/filter.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | 3 | from .models import Idc 4 | from django.db.models import Q 5 | 6 | 7 | class IdcFilter(django_filters.rest_framework.FilterSet): 8 | """ 9 | IDC机房过滤类 10 | """ 11 | name = django_filters.CharFilter(method='search_idc') 12 | 13 | def search_idc(self, queryset, name, value): 14 | return queryset.filter(Q(name__icontains=value)|Q(letter__icontains=value)) 15 | 16 | 17 | class Meta: 18 | model = Idc 19 | fields = ['name'] -------------------------------------------------------------------------------- /apps/idcs/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | 5 | 6 | class Idc(models.Model): 7 | letter = models.CharField("idc字母简称", max_length=10, unique=True, help_text="idc字母简称") 8 | name = models.CharField("idc名称", max_length=30, help_text="idc名称") 9 | address = models.CharField("idc具体地址", max_length=255, null=True, blank=True, help_text="idc具体地址") 10 | tel = models.CharField("客服电话", max_length=15, null=True, blank=True, help_text="客服电话") 11 | mail = models.EmailField("联系人邮箱", max_length=255, null=True, blank=True, help_text="联系人邮箱") 12 | remark = models.CharField("备注说明", max_length=255, null=True, blank=True, help_text="备注说明") 13 | 14 | def __str__(self): 15 | return self.name 16 | 17 | class Meta: 18 | db_table = 'resources_idc' 19 | permissions = ( 20 | ("view_idc", "cat view idc"), 21 | ) 22 | ordering = ["id"] -------------------------------------------------------------------------------- /apps/idcs/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import IdcViewset 3 | 4 | 5 | idc_router = DefaultRouter() 6 | idc_router.register(r'idcs', IdcViewset, base_name="idcs") 7 | -------------------------------------------------------------------------------- /apps/idcs/serializers.py: -------------------------------------------------------------------------------- 1 | 2 | from .models import Idc 3 | from rest_framework import serializers 4 | 5 | class IdcSerializer(serializers.ModelSerializer): 6 | """ 7 | Idc 模型序列化类 8 | """ 9 | class Meta: 10 | model = Idc 11 | fields = '__all__' -------------------------------------------------------------------------------- /apps/idcs/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/idcs/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets, response, status 2 | from cabinet.models import Cabinet 3 | from .filter import IdcFilter 4 | from .serializers import IdcSerializer 5 | from .models import Idc 6 | 7 | 8 | 9 | class IdcViewset(viewsets.ModelViewSet): 10 | """ 11 | list: 12 | 返回idc列表 13 | 14 | create: 15 | 创建idc记录 16 | 17 | retrieve: 18 | 返回idc记录 19 | 20 | destroy 21 | 删除idc记录 22 | 23 | update: 24 | 更新idc记录 25 | """ 26 | queryset = Idc.objects.all() 27 | serializer_class = IdcSerializer 28 | filter_class = IdcFilter 29 | filter_fields = ("name",) 30 | 31 | def destroy(self, request, *args, **kwargs): 32 | ret = {"status": 0} 33 | instance = self.get_object() 34 | 35 | if Cabinet.objects.filter(idc_id__exact=instance.id).count() != 0: 36 | ret["status"] = 1 37 | ret["errmsg"] = "该IDC还有机房记录,不能删除" 38 | return response.Response(ret, status=status.HTTP_200_OK) 39 | 40 | self.perform_destroy(instance) 41 | return response.Response(ret, status=status.HTTP_200_OK) -------------------------------------------------------------------------------- /apps/manufacturers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/manufacturers/__init__.py -------------------------------------------------------------------------------- /apps/manufacturers/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/manufacturers/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ManufacturersConfig(AppConfig): 5 | name = 'manufacturers' 6 | -------------------------------------------------------------------------------- /apps/manufacturers/filter.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | 3 | from .models import Manufacturer, ProductModel 4 | 5 | 6 | class ManufacturerFilter(django_filters.rest_framework.FilterSet): 7 | """ 8 | 制造商滤类 9 | """ 10 | vendor_name = django_filters.CharFilter(name="vendor_name", lookup_expr="icontains") 11 | 12 | class Meta: 13 | model = Manufacturer 14 | fields = ['vendor_name'] 15 | 16 | 17 | class ProductModelFilter(django_filters.rest_framework.FilterSet): 18 | """ 19 | 机器型号过滤类 20 | """ 21 | model_name = django_filters.CharFilter(name="model_name", lookup_expr="icontains") 22 | 23 | 24 | class Meta: 25 | model = ProductModel 26 | fields = ['model_name'] -------------------------------------------------------------------------------- /apps/manufacturers/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | 5 | class Manufacturer(models.Model): 6 | vendor_name = models.CharField("厂商名称", max_length=32, db_index=True, help_text="厂商名称") 7 | tel = models.CharField("联系电话", null=True, max_length=20, help_text="联系电话") 8 | mail = models.EmailField("email", null=True, blank=True, help_text="联系邮箱") 9 | remark = models.CharField("备注", max_length=300, null=True, blank=True, help_text="备注") 10 | 11 | def __str__(self): 12 | return self.vendor_name 13 | 14 | class Meta: 15 | db_table = 'resources_manufacturer' 16 | permissions = ( 17 | ("view_manufacturer", "cat view manufacturer"), 18 | ) 19 | ordering = ["id"] 20 | 21 | class ProductModel(models.Model): 22 | model_name = models.CharField("型号名称", max_length=32, help_text="型号名称") 23 | vendor = models.ForeignKey(Manufacturer, verbose_name="所属制造商", help_text="所属制造商") 24 | 25 | def __str__(self): 26 | return self.model_name 27 | 28 | class Meta: 29 | db_table = 'resources_productmodel' 30 | permissions = ( 31 | ("view_productmodel", "cat view productmodel"), 32 | ) 33 | ordering = ["id"] -------------------------------------------------------------------------------- /apps/manufacturers/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import ManufacturerViewset, ProductModelViewset 3 | 4 | 5 | manufacturer_router = DefaultRouter() 6 | manufacturer_router.register(r'manufacturer', ManufacturerViewset, base_name="manufacturer") 7 | manufacturer_router.register(r'product_model', ProductModelViewset, base_name="product_model") 8 | -------------------------------------------------------------------------------- /apps/manufacturers/serializers.py: -------------------------------------------------------------------------------- 1 | from .models import Manufacturer, ProductModel 2 | from rest_framework import serializers 3 | 4 | class ManufacturerSerializer(serializers.ModelSerializer): 5 | """ 6 | 制造商序列化类 7 | """ 8 | class Meta: 9 | model = Manufacturer 10 | fields = '__all__' 11 | 12 | 13 | class ProductModelSerializer(serializers.ModelSerializer): 14 | """ 15 | 产品型号序列化类 16 | """ 17 | def get_vendor_name(self, obj): 18 | try: 19 | return { 20 | "name": obj.vendor_name, 21 | "id": obj.id 22 | } 23 | except: 24 | return {} 25 | 26 | def to_representation(self, instance): 27 | vendor_name = self.get_vendor_name(instance.vendor) 28 | ret = super(ProductModelSerializer, self).to_representation(instance) 29 | ret["vendor"] = vendor_name 30 | return ret 31 | 32 | class Meta: 33 | model = ProductModel 34 | fields = '__all__' -------------------------------------------------------------------------------- /apps/manufacturers/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/manufacturers/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets, response, status 2 | from .models import Manufacturer, ProductModel 3 | from .serializers import ManufacturerSerializer, ProductModelSerializer 4 | from .filter import ManufacturerFilter, ProductModelFilter 5 | 6 | 7 | 8 | class ManufacturerViewset(viewsets.ModelViewSet): 9 | """ 10 | retrieve: 11 | 返回指定制造商信息 12 | 13 | list: 14 | 返回制造商列表 15 | 16 | update: 17 | 更新制造商信息 18 | 19 | destroy: 20 | 删除制造商记录 21 | 22 | create: 23 | 创建制造商资源 24 | 25 | partial_update: 26 | 更新部分字段 27 | 28 | """ 29 | queryset = Manufacturer.objects.all() 30 | serializer_class = ManufacturerSerializer 31 | filter_class = ManufacturerFilter 32 | filter_fields = ("vendor_name",) 33 | 34 | def destroy(self, request, *args, **kwargs): 35 | ret = {"status": 0} 36 | instance = self.get_object() 37 | 38 | if ProductModel.objects.filter(vendor_id__exact=instance.id).count() != 0: 39 | ret["status"] = 1 40 | ret["errmsg"] = "该制造商还有产品型号记录,不能删除" 41 | return response.Response(ret, status=status.HTTP_200_OK) 42 | 43 | self.perform_destroy(instance) 44 | return response.Response(ret, status=status.HTTP_200_OK) 45 | 46 | 47 | class ProductModelViewset(viewsets.ModelViewSet): 48 | """ 49 | retrieve: 50 | 返回指定产品型号信息 51 | 52 | list: 53 | 返回产品型号列表 54 | 55 | update: 56 | 更新产品型号信息 57 | 58 | destroy: 59 | 删除产品型号记录 60 | 61 | create: 62 | 创建产品型号资源 63 | 64 | partial_update: 65 | 更新部分字段 66 | """ 67 | queryset = ProductModel.objects.all() 68 | serializer_class = ProductModelSerializer 69 | filter_class = ProductModelFilter 70 | filter_fields = ("model_name",) -------------------------------------------------------------------------------- /apps/menu/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/menu/__init__.py -------------------------------------------------------------------------------- /apps/menu/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/menu/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class MenuConfig(AppConfig): 5 | name = 'menu' 6 | -------------------------------------------------------------------------------- /apps/menu/common.py: -------------------------------------------------------------------------------- 1 | from .models import Menu 2 | 3 | 4 | def get_menu_object(pk): 5 | try: 6 | return Menu.objects.get(pk=pk) 7 | except Menu.DoesNotExist: 8 | return None 9 | 10 | 11 | def get_menu_tree(queryset, group_queryset=None): 12 | ret = [] 13 | first_menus = _get_first_menu(queryset) 14 | for obj in first_menus: 15 | node = _get_menu_node(obj, group_queryset) 16 | node["children"] = _get_menu_children(queryset.filter(parent__exact=obj), group_queryset) 17 | ret.append(node) 18 | return ret 19 | 20 | 21 | def _get_first_menu(queryset): 22 | ret = [] 23 | def check_exists(obj): 24 | if obj in ret: 25 | return True 26 | return False 27 | for obj in queryset: 28 | if obj.parent: 29 | # 当前菜单为二级 30 | if not check_exists(obj.parent): 31 | ret.append(obj.parent) 32 | else: 33 | if not check_exists(obj): 34 | ret.append(obj) 35 | return ret 36 | 37 | 38 | def _get_menu_children(queryset, group_queryset=None): 39 | ret = [] 40 | for obj in queryset: 41 | ret.append(_get_menu_node(obj, group_queryset)) 42 | return ret 43 | 44 | 45 | def _get_menu_node(menu_obj, group_queryset=None): 46 | node = {} 47 | node["id"] = menu_obj.id 48 | node["path"] = menu_obj.path 49 | node["label"] = menu_obj.title 50 | node['icon'] = menu_obj.icon if menu_obj.icon else "" 51 | node['show'] = menu_obj.show 52 | node["pid"] = _get_menu_parent(menu_obj) 53 | if group_queryset is not None: 54 | node["permission"] = _get_menu_permission(menu_obj, group_queryset) 55 | return node 56 | 57 | 58 | def _get_menu_parent(menu_obj): 59 | try: 60 | return menu_obj.parent.id 61 | except: 62 | return 0 63 | 64 | 65 | def _get_menu_permission(menu_obj, group_queryset=None): 66 | if group_queryset is None: 67 | return True 68 | try: 69 | group_queryset.get(pk=menu_obj.id) 70 | return True 71 | except: 72 | return False -------------------------------------------------------------------------------- /apps/menu/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import Group 3 | 4 | class Menu(models.Model): 5 | path = models.CharField("目录名或文件名",max_length=100, default='/', help_text="目录名或文件名") 6 | icon = models.CharField("图标名", max_length=32, null=True, help_text="图标名") 7 | title = models.CharField("路由显示名", max_length=255, null=False, help_text="路由显示名") 8 | show = models.BooleanField("该路由是否显示", default=False, help_text="该路由是否显示") 9 | parent = models.ForeignKey("self", null=True, verbose_name="上级菜单", help_text="上级菜单") 10 | groups = models.ManyToManyField( 11 | Group, 12 | verbose_name='groups', 13 | blank=True, 14 | related_name="menu_set", 15 | related_query_name="menu", 16 | help_text="所属组", 17 | ) 18 | 19 | class Meta: 20 | ordering = ["title"] 21 | db_table = "view_menu" 22 | 23 | def __str__(self): 24 | return "{} {}".format(self.title, self.path) -------------------------------------------------------------------------------- /apps/menu/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import MenuViewset, GroupMenuViewset 3 | 4 | menu_router = DefaultRouter() 5 | menu_router.register(r'menus', MenuViewset, base_name="menus") 6 | menu_router.register(r'groupmenus', GroupMenuViewset, base_name="groupmenus") -------------------------------------------------------------------------------- /apps/menu/serializers.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | 3 | from .models import Menu 4 | 5 | 6 | class MenuSerializer(serializers.ModelSerializer): 7 | """ 8 | 前端视图菜单序列化类 9 | """ 10 | class Meta: 11 | model = Menu 12 | fields = ("id", "path", "icon", "title", "show", "parent") 13 | 14 | -------------------------------------------------------------------------------- /apps/menu/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/menu/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import viewsets, mixins, response, status 2 | from rest_framework.generics import get_object_or_404 3 | from django.contrib.auth.models import Group 4 | 5 | 6 | from .serializers import MenuSerializer 7 | from .models import Menu 8 | from .common import get_menu_tree 9 | 10 | 11 | class MenuViewset(viewsets.ModelViewSet): 12 | """ 13 | 前端左侧菜单 14 | 15 | retrieve: 16 | 返回指定菜单信息 17 | 18 | list: 19 | 返回菜单列表 20 | 21 | update: 22 | 更新菜单信息 23 | 24 | destroy: 25 | 删除菜单记录 26 | 27 | create: 28 | 创建菜单资源 29 | 30 | partial_update: 31 | 更新部分字段 32 | """ 33 | queryset = Menu.objects.all() 34 | serializer_class = MenuSerializer 35 | 36 | 37 | class GroupMenuViewset(mixins.RetrieveModelMixin, 38 | mixins.UpdateModelMixin, 39 | mixins.DestroyModelMixin, 40 | viewsets.GenericViewSet): 41 | """ 42 | 用户组菜单 43 | 44 | retrieve: 45 | 返回用户组的菜单列表 46 | 47 | update: 48 | 给指定用户组增加菜单,参数mid: menu id 49 | 50 | destroy: 51 | 删除指定组下的菜单,参数mid: menu id 52 | """ 53 | queryset = Menu.objects.all() 54 | serializer_class = MenuSerializer 55 | 56 | def process_menu(self, group_permission_queryset, data): 57 | for record in data: 58 | try: 59 | group_permission_queryset.get(pk=record.get("id", None)) 60 | record["status"] = True 61 | except: 62 | pass 63 | return data 64 | 65 | def get_group_menus(self): 66 | groupobj = self.get_object() 67 | queryset = groupobj.menu_set.all() 68 | data = get_menu_tree(queryset) 69 | return response.Response(data) 70 | 71 | def get_modify_menus(self): 72 | groupobj = self.get_object() 73 | group_menu_queryset = groupobj.menu_set.all() 74 | queryset = Menu.objects.all() 75 | ret = {} 76 | ret["data"] = get_menu_tree(queryset,group_menu_queryset) 77 | ret["permissions"] = [obj.id for obj in group_menu_queryset] 78 | return response.Response(ret) 79 | 80 | def retrieve(self, request, *args, **kwargs): 81 | modify = request.GET.get("modify", None) 82 | if modify is not None: 83 | return self.get_modify_menus() 84 | else: 85 | return self.get_group_menus() 86 | 87 | def get_object(self): 88 | queryset = Group.objects.all() 89 | lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field 90 | assert lookup_url_kwarg in self.kwargs, ( 91 | 'Expected view %s to be called with a URL keyword argument ' 92 | 'named "%s". Fix your URL conf, or set the `.lookup_field` ' 93 | 'attribute on the view correctly.' % 94 | (self.__class__.__name__, lookup_url_kwarg) 95 | ) 96 | 97 | filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} 98 | obj = get_object_or_404(queryset, **filter_kwargs) 99 | 100 | self.check_object_permissions(self.request, obj) 101 | return obj 102 | 103 | def update(self, request, *args, **kwargs): 104 | ret = {"status": 0} 105 | groupobj = self.get_object() 106 | menu_objects = Menu.objects.filter(pk__in=request.data.get("mid")) 107 | groupobj.menu_set = menu_objects 108 | return response.Response(ret, status=status.HTTP_200_OK) 109 | -------------------------------------------------------------------------------- /apps/permissions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/permissions/__init__.py -------------------------------------------------------------------------------- /apps/permissions/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/permissions/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class PermissionsConfig(AppConfig): 5 | name = 'permissions' 6 | -------------------------------------------------------------------------------- /apps/permissions/common.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import Permission 2 | 3 | def get_permission_obj(pid): 4 | try: 5 | return Permission.objects.get(pk=pid) 6 | except Permission.DoesNotExist: 7 | return None -------------------------------------------------------------------------------- /apps/permissions/filters.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | from django.contrib.auth.models import Permission 3 | from django.db.models import Q 4 | 5 | class PermissionFilter(django_filters.rest_framework.FilterSet): 6 | """ 7 | 权限过滤类 8 | """ 9 | name = django_filters.CharFilter(method='search_permission') 10 | 11 | def search_permission(self, queryset, name, value): 12 | return queryset.filter(Q(codename__icontains=value)| 13 | Q(content_type__app_label__icontains=value)| 14 | Q(content_type__model__icontains=value)) 15 | 16 | 17 | class Meta: 18 | model = Permission 19 | fields = ['name'] -------------------------------------------------------------------------------- /apps/permissions/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /apps/permissions/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import PermissionsViewset, GroupPermissionsViewset 3 | 4 | 5 | permission_router = DefaultRouter() 6 | permission_router.register(r'permissions', PermissionsViewset, base_name="permissions") 7 | permission_router.register(r'grouppermissions', GroupPermissionsViewset, base_name="grouppermissions") -------------------------------------------------------------------------------- /apps/permissions/serializers.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import Permission, ContentType 2 | 3 | from rest_framework import serializers 4 | 5 | 6 | class ContentTypeSerializer(serializers.ModelSerializer): 7 | 8 | class Meta: 9 | model = ContentType 10 | fields = "__all__" 11 | 12 | 13 | class PermissionSerializer(serializers.ModelSerializer): 14 | content_type = ContentTypeSerializer() 15 | status = serializers.BooleanField(default=False, read_only=True) 16 | 17 | class Meta: 18 | model = Permission 19 | fields = ("id", "content_type", "name", "codename", "status") -------------------------------------------------------------------------------- /apps/permissions/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/permissions/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import Permission, Group 2 | 3 | from rest_framework import viewsets, mixins, response, status 4 | from rest_framework.generics import get_object_or_404 5 | 6 | from .serializers import PermissionSerializer 7 | from .common import get_permission_obj 8 | from .filters import PermissionFilter 9 | 10 | class PermissionsViewset(viewsets.ReadOnlyModelViewSet): 11 | """ 12 | 权限列表 视图类 13 | 14 | list: 15 | 返回permission列表 16 | 17 | """ 18 | queryset = Permission.objects.all() 19 | serializer_class = PermissionSerializer 20 | filter_class = PermissionFilter 21 | filter_fields = ("name",) 22 | 23 | def get_queryset(self): 24 | queryset = super(PermissionsViewset, self).get_queryset() 25 | queryset = queryset.order_by("content_type__id") 26 | return queryset 27 | 28 | 29 | class GroupPermissionsViewset(viewsets.ReadOnlyModelViewSet, 30 | mixins.UpdateModelMixin, 31 | mixins.DestroyModelMixin): 32 | """ 33 | 用户组权限 34 | 35 | retrieve: 36 | 返回用户组的权限列表 37 | 38 | update: 39 | 给指定用户组增加权限,参数pid: permission id 40 | 41 | destroy: 42 | 删除指定组下的权限,参数pid: permission id 43 | """ 44 | 45 | queryset = Permission.objects.all() 46 | serializer_class = PermissionSerializer 47 | filter_class = PermissionFilter 48 | filter_fields = ("name",) 49 | 50 | def process_permission(self, group_permission_queryset, data): 51 | for record in data: 52 | try: 53 | group_permission_queryset.get(pk=record.get("id", None)) 54 | record["status"] = True 55 | except: 56 | pass 57 | return data 58 | 59 | def get_group_permissions(self): 60 | groupobj = self.get_object() 61 | queryset = groupobj.permissions.all() 62 | queryset = self.filter_queryset(queryset) 63 | page = self.paginate_queryset(queryset) 64 | if page is not None: 65 | serializer = self.get_serializer(page, many=True) 66 | return self.get_paginated_response(serializer.data) 67 | 68 | serializer = self.get_serializer(queryset, many=True) 69 | return response.Response(serializer.data) 70 | 71 | def get_modify_permissions(self): 72 | groupobj = self.get_object() 73 | group_permission_queryset = groupobj.permissions.all() 74 | queryset = Permission.objects.all() 75 | queryset = self.filter_queryset(queryset) 76 | page = self.paginate_queryset(queryset) 77 | if page is not None: 78 | serializer = self.get_serializer(page, many=True) 79 | return self.get_paginated_response(self.process_permission(group_permission_queryset, serializer.data)) 80 | 81 | serializer = self.get_serializer(queryset, many=True) 82 | return response.Response(self.process_permission(group_permission_queryset, serializer.data)) 83 | 84 | def retrieve(self, request, *args, **kwargs): 85 | modify = request.GET.get("modify", None) 86 | if modify is not None: 87 | return self.get_modify_permissions() 88 | else: 89 | return self.get_group_permissions() 90 | 91 | def get_object(self): 92 | queryset = Group.objects.all() 93 | lookup_url_kwarg = self.lookup_url_kwarg or self.lookup_field 94 | 95 | assert lookup_url_kwarg in self.kwargs, ( 96 | 'Expected view %s to be called with a URL keyword argument ' 97 | 'named "%s". Fix your URL conf, or set the `.lookup_field` ' 98 | 'attribute on the view correctly.' % 99 | (self.__class__.__name__, lookup_url_kwarg) 100 | ) 101 | 102 | filter_kwargs = {self.lookup_field: self.kwargs[lookup_url_kwarg]} 103 | obj = get_object_or_404(queryset, **filter_kwargs) 104 | 105 | # May raise a permission denied 106 | self.check_object_permissions(self.request, obj) 107 | return obj 108 | 109 | def update(self, request, *args, **kwargs): 110 | ret = {"status": 0} 111 | groupobj = self.get_object() 112 | permission_obj = get_permission_obj(request.data.get("pid", "")) 113 | if permission_obj is None: 114 | ret["status"] = 1 115 | ret["errmsg"] = "permission 不存在" 116 | else: 117 | groupobj.permissions.add(permission_obj) 118 | return response.Response(ret, status=status.HTTP_200_OK) 119 | 120 | def destroy(self, request, *args, **kwargs): 121 | ret = {"status": 0} 122 | groupobj = self.get_object() 123 | permission_obj = get_permission_obj(request.data.get("pid", "")) 124 | if permission_obj is None: 125 | ret["status"] = 1 126 | ret["errmsg"] = "permission 不存在" 127 | else: 128 | groupobj.permissions.remove(permission_obj) 129 | return response.Response(ret, status=status.HTTP_200_OK) -------------------------------------------------------------------------------- /apps/products/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/products/__init__.py -------------------------------------------------------------------------------- /apps/products/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/products/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ProductConfig(AppConfig): 5 | name = 'products' 6 | -------------------------------------------------------------------------------- /apps/products/filters.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | from .models import Product 3 | 4 | class ProductFilter(django_filters.rest_framework.FilterSet): 5 | """ 6 | 业务线过滤类 7 | """ 8 | pid = django_filters.NumberFilter(name="pid") 9 | 10 | 11 | class Meta: 12 | model = Product 13 | fields = ['pid'] -------------------------------------------------------------------------------- /apps/products/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth import get_user_model 3 | 4 | User = get_user_model() 5 | 6 | # Create your models here. 7 | 8 | 9 | class Product(models.Model): 10 | service_name = models.CharField("业务线名称", max_length=32, help_text="业务线名称") 11 | pid = models.IntegerField("上级业务线id", db_index=True, help_text="上级业务线id") 12 | module_letter = models.CharField("业务线字母简称", max_length=32, help_text="业务线字母简称") 13 | dev_interface = models.ManyToManyField(User, verbose_name="开发接口人", related_name="dev_interface", help_text="开发接口人") 14 | op_interface = models.ManyToManyField(User, verbose_name="运维接口人", related_name="op_interface", help_text="运维接口人") 15 | 16 | def __str__(self): 17 | return self.service_name 18 | 19 | class Meta: 20 | db_table = 'resources_product' 21 | permissions = ( 22 | ("view_product", "can view products"), 23 | ) 24 | ordering = ["id"] 25 | -------------------------------------------------------------------------------- /apps/products/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import ProductViewset, ProductManageViewSet 3 | 4 | 5 | products_router = DefaultRouter() 6 | products_router.register(r'products', ProductViewset, base_name='products') 7 | products_router.register(r'productmanage', ProductManageViewSet, base_name="productmanage") -------------------------------------------------------------------------------- /apps/products/serializers.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | from rest_framework import serializers 3 | from .models import Product 4 | 5 | 6 | User = get_user_model() 7 | 8 | 9 | class ProductSerializer(serializers.ModelSerializer): 10 | 11 | def validate_pid(self, pid): 12 | if pid > 0: 13 | try: 14 | product_obj = Product.objects.get(pk=pid) 15 | if product_obj.pid != 0: 16 | return serializers.ValidationError("上级业务线错误") 17 | except Product.DoesNotExist: 18 | return serializers.ValidationError("上级业务线不存在") 19 | return pid 20 | else: 21 | return 0 22 | 23 | def get_user_response(self, user_queryset): 24 | ret = [] 25 | for dev in user_queryset: 26 | ret.append({ 27 | "username": dev.username, 28 | "name": dev.name, 29 | "email": dev.email, 30 | "id": dev.id, 31 | }) 32 | return ret 33 | 34 | def to_representation(self, instance): 35 | dev_interface = self.get_user_response(instance.dev_interface.all()) 36 | op_interface = self.get_user_response(instance.op_interface.all()) 37 | ret = super(ProductSerializer, self).to_representation(instance) 38 | ret["dev_interface"] = dev_interface 39 | ret["op_interface"] = op_interface 40 | return ret 41 | 42 | def update(self, instance, validated_data): 43 | instance.service_name = validated_data.get("service_name", instance.service_name) 44 | instance.module_letter = validated_data.get("module_letter", instance.module_letter) 45 | instance.dev_interface = validated_data.get("dev_interface", instance.dev_interface) 46 | instance.op_interface = validated_data.get("op_interface", instance.op_interface) 47 | instance.save() 48 | return instance 49 | 50 | class Meta: 51 | model = Product 52 | fields = '__all__' 53 | -------------------------------------------------------------------------------- /apps/products/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/products/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import mixins, viewsets, response, status 2 | 3 | from .models import Product 4 | from .serializers import ProductSerializer 5 | from .filters import ProductFilter 6 | from servers.models import Server 7 | 8 | 9 | 10 | class ProductViewset(viewsets.ModelViewSet): 11 | """ 12 | retrieve: 13 | 返回指定业务线信息 14 | 15 | list: 16 | 返回业务线列表 17 | 18 | update: 19 | 更新业务线信息 20 | 21 | destroy: 22 | 删除业务线记录 23 | 24 | create: 25 | 创建业务线资源 26 | 27 | partial_update: 28 | 更新部分字段 29 | """ 30 | queryset = Product.objects.all() 31 | serializer_class = ProductSerializer 32 | extra_perms_map = { 33 | "GET": ["products.view_product"] 34 | } 35 | filter_class = ProductFilter 36 | filter_fields = ("pid",) 37 | 38 | def destroy(self, request, *args, **kwargs): 39 | ret = {"status": 0} 40 | instance = self.get_object() 41 | if instance.pid == 0: 42 | # 顶级业务线 43 | # 查找二级级业务线 44 | if Product.objects.filter(pid__exact=instance.id).count() != 0: 45 | ret["status"] = 1 46 | ret["errmsg"] = "该业务下还有二级业务线" 47 | return response.Response(ret, status=status.HTTP_200_OK) 48 | else: 49 | # 二级业务线 50 | if Server.objects.filter(server_purpose__id__exact=instance.id).count() != 0: 51 | ret["status"] = 1 52 | ret["errmsg"] = "该分组下还有产品线,不能删除" 53 | return response.Response(ret, status=status.HTTP_200_OK) 54 | 55 | self.perform_destroy(instance) 56 | return response.Response(ret, status=status.HTTP_200_OK) 57 | 58 | 59 | class ProductManageViewSet(mixins.ListModelMixin, 60 | viewsets.GenericViewSet): 61 | """ 62 | list: 63 | 业务线管理 64 | """ 65 | queryset = Product.objects.all() 66 | 67 | def list(self, request, *args, **kwargs): 68 | data = self.get_products() 69 | return response.Response(data) 70 | 71 | def get_products(self): 72 | ret = [] 73 | for obj in self.queryset.filter(pid=0): 74 | node = self.get_node(obj) 75 | node["children"] = self.get_children(obj.id) 76 | ret.append(node) 77 | return ret 78 | 79 | def get_children(self, pid): 80 | ret = [] 81 | for obj in self.queryset.filter(pid=pid): 82 | ret.append(self.get_node(obj)) 83 | return ret 84 | 85 | def get_node(self, product_obj): 86 | node = {} 87 | node["id"] = product_obj.id 88 | node["label"] = product_obj.service_name 89 | node["pid"] = product_obj.pid 90 | return node -------------------------------------------------------------------------------- /apps/servers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/servers/__init__.py -------------------------------------------------------------------------------- /apps/servers/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/servers/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ServersConfig(AppConfig): 5 | name = 'servers' 6 | -------------------------------------------------------------------------------- /apps/servers/filter.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | from django.db.models import Q 3 | 4 | from .models import Server, NetworkDevice, IP 5 | 6 | class ServerFilter(django_filters.rest_framework.FilterSet): 7 | """ 8 | 服务器过滤类 9 | """ 10 | 11 | hostname = django_filters.CharFilter(method='search_server') 12 | idc = django_filters.NumberFilter(method="search_idc") 13 | cabinet = django_filters.NumberFilter(method="search_cabinet") 14 | service = django_filters.NumberFilter(method="search_first_product") 15 | server_purpose = django_filters.NumberFilter(method="search_second_product") 16 | server_type = django_filters.ChoiceFilter(name="server_type", choices=((0,"vm"), (1, "物理机"),(2, "宿主机")), lookup_expr="exact") 17 | 18 | 19 | def search_server_type(self,queryset, name, value): 20 | if value == 0: 21 | return queryset.filter(server_type__in=[0,1]) 22 | else: 23 | return queryset.filter(server_type=value) 24 | 25 | 26 | def search_second_product(self, queryset, name, value): 27 | if value > 0: 28 | return queryset.filter(server_purpose_id__exact=value) 29 | elif value == -1: 30 | return queryset.filter(server_purpose_id__isnull=True) 31 | else: 32 | return queryset 33 | 34 | def search_first_product(self, queryset, name, value): 35 | if value > 0: 36 | return queryset.filter(service_id__exact=value) 37 | elif value == -1: 38 | return queryset.filter(service_id__isnull=True) 39 | else: 40 | return queryset 41 | 42 | def search_server(self, queryset, name, value): 43 | return queryset.filter(Q(hostname__icontains=value)|Q(manage_ip__icontains=value)) 44 | 45 | 46 | def search_idc(self, queryset, name, value): 47 | if value > 0: 48 | return queryset.filter(idc_id__exact=value) 49 | elif value == -1: 50 | return queryset.filter(idc_id__isnull=True) 51 | else: 52 | return queryset 53 | 54 | def search_cabinet(self, queryset, name, value): 55 | if value > 0: 56 | return queryset.filter(cabinet_id__exact=value) 57 | elif value == -1: 58 | return queryset.filter(cabinet_id__isnull=True) 59 | else: 60 | return queryset 61 | 62 | class Meta: 63 | model = Server 64 | fields = ['hostname', 'idc', 'cabinet', "service_id", "server_purpose","server_type"] 65 | 66 | 67 | class NetworkDeviceFilter(django_filters.rest_framework.FilterSet): 68 | """ 69 | 网卡过滤类 70 | """ 71 | name = django_filters.CharFilter(method='search_name') 72 | 73 | def search_name(self, queryset, name, value): 74 | return queryset.filter(Q(name__icontains=value)) 75 | 76 | 77 | class Meta: 78 | model = NetworkDevice 79 | fields = ['name'] 80 | 81 | 82 | class IpFilter(django_filters.rest_framework.FilterSet): 83 | """ 84 | 网卡过滤类 85 | """ 86 | ip_addr = django_filters.CharFilter(method='search_ip') 87 | 88 | def search_ip(self, queryset, ip_addr, value): 89 | return queryset.filter(Q(ip_addr__icontains=value)) 90 | 91 | 92 | class Meta: 93 | model = IP 94 | fields = ['ip_addr'] -------------------------------------------------------------------------------- /apps/servers/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from products.models import Product 3 | from idcs.models import Idc 4 | from cabinet.models import Cabinet 5 | from manufacturers.models import Manufacturer, ProductModel 6 | 7 | # Create your models here. 8 | 9 | 10 | class Server(models.Model): 11 | manufacturer = models.ForeignKey(Manufacturer, verbose_name="制造商", null=True, help_text="制造商") 12 | manufacture_data= models.DateField("制造日期", null=True, help_text="制造日期") 13 | model_name = models.ForeignKey(ProductModel, verbose_name="服务器型号", default=None, help_text="服务器型号") 14 | idc = models.ForeignKey(Idc, verbose_name="所在机房", null=True, help_text="所在机房") 15 | cabinet = models.ForeignKey(Cabinet, verbose_name="所在机柜", null=True, help_text="所在机柜") 16 | cabinet_position= models.CharField("机柜内位置", max_length=32, null=True, help_text="机柜内位置") 17 | warranty_time = models.DateField("保修时间", null=True, help_text="保修时间") 18 | purchasing_time = models.DateField("采购时间", null=True, help_text="采购时间") 19 | power_supply = models.IntegerField("电源功率", null=True, help_text="电源功率") 20 | os = models.CharField("操作系统", max_length=100, default=None, help_text="操作系统") 21 | hostname = models.CharField("主机名", max_length=50, default=None, db_index=True, help_text="主机名") 22 | manage_ip = models.CharField("管理IP", max_length=32, default=None, db_index=True, help_text="管理IP") 23 | server_cpu = models.CharField("CPU信息", max_length=250, default=None, help_text="CPU信息") 24 | disk = models.CharField("硬盘信息", max_length=300, null=True, help_text="硬盘信息") 25 | server_mem = models.CharField("内存信息", max_length=100, default=None, help_text="内存信息") 26 | status = models.CharField("服务器状态", max_length=32, null=True, db_index=True, help_text="服务器状态") 27 | remark = models.TextField("备注", null=True, help_text="备注") 28 | service = models.ForeignKey(Product, null=True, verbose_name="一级业务线", related_name="service", help_text="一级业务线") 29 | server_purpose = models.ForeignKey(Product, null=True, verbose_name="二级产品线", related_name="server_purpose", help_text="二级产品线") 30 | last_check = models.DateTimeField("上次检测时间", auto_now=True, help_text="上次检测时间") 31 | uuid = models.CharField("UUID", max_length=100, db_index=True,null=True, unique=True, help_text="UUID") 32 | sn = models.CharField("SN", max_length=40,db_index=True,null=True, help_text="SN") 33 | rmt_card_ip = models.CharField("远程管理卡IP", max_length=15, null=True, help_text="远程管理卡IP") 34 | server_type = models.IntegerField("机器类型", db_index=True, default=0, help_text="机器类型") 35 | """ 36 | 机器类型,0:vm, 1:物理机, 2:宿主机 37 | """ 38 | 39 | def __str__(self): 40 | return "{}[{}]".format(self.hostname, self.manage_ip) 41 | 42 | class Meta: 43 | db_table = 'resources_server' 44 | permissions=( 45 | ("view_server", "cat view server"), 46 | ) 47 | 48 | class NetworkDevice(models.Model): 49 | """ 50 | 网卡模型 51 | """ 52 | name = models.CharField("网卡设备名", max_length=32) 53 | mac = models.CharField("网卡mac地址", max_length=32) 54 | host = models.ForeignKey(Server, verbose_name="所在服务器") 55 | remark = models.CharField("备注", max_length=300, null=True) 56 | 57 | def __str__(self): 58 | return "{}[{}]".format(self.name, self.host) 59 | class Meta: 60 | db_table = 'resources_networkdevice' 61 | permissions=( 62 | ("view_networkdevice", "cat view networkdevice"), 63 | ) 64 | 65 | class IP(models.Model): 66 | ip_addr = models.CharField("ip地址", max_length=20, db_index=True) 67 | netmask = models.CharField("子网掩码", max_length=20) 68 | device = models.ForeignKey(NetworkDevice, verbose_name="网卡") 69 | 70 | def __str__(self): 71 | return self.ip_addr 72 | 73 | class Meta: 74 | db_table = 'resources_ip' 75 | permissions=( 76 | ("view_ip", "cat view ip"), 77 | ) 78 | -------------------------------------------------------------------------------- /apps/servers/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import ServerViewset, NetwokDeviceViewset, IPViewset, ServerAutoReportViewset, ServerCountViewset 3 | 4 | 5 | servers_router = DefaultRouter() 6 | servers_router.register(r'servers', ServerViewset, base_name="servers") 7 | servers_router.register(r'network_device', NetwokDeviceViewset, base_name="network_device") 8 | servers_router.register(r'ip', IPViewset, base_name="ip") 9 | servers_router.register(r'ServerAutoReport', ServerAutoReportViewset, base_name="ServerAutoReport") 10 | servers_router.register(r'ServerCount', ServerCountViewset, base_name="ServerCount") -------------------------------------------------------------------------------- /apps/servers/serializers.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | from rest_framework import serializers 4 | from .models import Server, NetworkDevice, IP 5 | from manufacturers.models import Manufacturer, ProductModel 6 | from raven.contrib.django.raven_compat.models import client 7 | 8 | import logging 9 | 10 | logger = logging.getLogger(__name__) 11 | 12 | 13 | class ServerSerializer(serializers.ModelSerializer): 14 | """ 15 | 服务器序列化类 16 | """ 17 | manufacture_data= serializers.DateField(format="%Y-%m-%d", label="制造日期", required=False, help_text="制造日期") 18 | warranty_time = serializers.DateField(format="%Y-%m-%d", label="保修时间", required=False, help_text="保修时间") 19 | purchasing_time = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", label="采购时间", required=False, help_text="采购时间") 20 | last_check = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True, help_text="检查时间") 21 | 22 | 23 | def get_product_name(self, product_obj): 24 | try: 25 | return { 26 | "name":product_obj.service_name, 27 | "id":product_obj.id 28 | } 29 | except Exception as e: 30 | return {} 31 | 32 | def get_idc_name(self, idc_obj): 33 | try: 34 | return { 35 | "name": idc_obj.name, 36 | "id": idc_obj.id 37 | } 38 | except Exception as e: 39 | return {} 40 | 41 | def get_manu(self, manu_obj): 42 | try: 43 | return { 44 | "vendor_name": manu_obj.vendor_name, 45 | "id": manu_obj.id 46 | } 47 | except Exception as e: 48 | return {} 49 | 50 | def get_pm(self, pm_obj): 51 | try: 52 | return { 53 | "model_name": pm_obj.model_name, 54 | "id": pm_obj.id 55 | } 56 | except Exception as e: 57 | return {} 58 | 59 | def to_representation(self, instance): 60 | idc_name = self.get_idc_name(instance.idc) 61 | server_purpose = self.get_product_name(instance.server_purpose) 62 | service = self.get_product_name(instance.service) 63 | 64 | ret = super(ServerSerializer, self).to_representation(instance) 65 | ret["idc"] = idc_name 66 | ret["server_purpose"] = server_purpose 67 | ret["service"] = service 68 | ret["device_type"] = { 69 | "id": ret["server_type"], 70 | "name": self.Meta.vm_status_dict.get(ret["server_type"]) 71 | } 72 | ret["manufacturer"] = self.get_manu(instance.manufacturer) 73 | ret["model_name"] = self.get_pm(instance.model_name) 74 | return ret 75 | 76 | class Meta: 77 | model = Server 78 | vm_status_dict = {0: "虚拟机", 1: "物理机", 2: "宿主机"} 79 | fields = '__all__' 80 | 81 | 82 | 83 | 84 | class NetworkDeviceSerializer(serializers.ModelSerializer): 85 | """ 86 | 网卡设备序列化类 87 | """ 88 | def get_host(self, obj): 89 | try: 90 | return { 91 | "hostname": obj.hostname, 92 | "id": obj.id 93 | } 94 | except Exception as e: 95 | return {} 96 | 97 | def to_representation(self, instance): 98 | host = self.get_host(instance.host) 99 | ret = super(NetworkDeviceSerializer, self).to_representation(instance) 100 | ret["host"] = host 101 | return ret 102 | 103 | class Meta: 104 | model = NetworkDevice 105 | fields = '__all__' 106 | 107 | 108 | class IPSerializer(serializers.ModelSerializer): 109 | """ 110 | IP实例化类 111 | """ 112 | def get_device(self, obj): 113 | try: 114 | return { 115 | "name": obj.name, 116 | "id": obj.id 117 | } 118 | except Exception as e: 119 | return {} 120 | 121 | def to_representation(self, instance): 122 | device = self.get_device(instance.device) 123 | ret = super(IPSerializer, self).to_representation(instance) 124 | ret["device"] = device 125 | return ret 126 | 127 | class Meta: 128 | model = IP 129 | fields = '__all__' 130 | 131 | 132 | class AutoReportSerializer(serializers.Serializer): 133 | """ 134 | 服务器信息自动上报接口序列化类 135 | """ 136 | hostname = serializers.CharField(required=True, max_length=50, label="主机名", help_text="主机名") 137 | os = serializers.CharField(required=True, max_length=100, label="操作系统", help_text="操作系统") 138 | manufacturer = serializers.CharField(required=True, max_length=32, label="厂商名称", help_text="厂商名称") 139 | model_name = serializers.CharField(required=True, max_length=32, label="型号", help_text="型号") 140 | uuid = serializers.CharField(required=True, max_length=100, label="UUID", help_text="UUID") 141 | server_cpu = serializers.CharField(required=True, max_length=32, label="CPU", help_text="CPU") 142 | server_mem = serializers.CharField(required=True, max_length=100, label="内存", help_text="内存") 143 | disk = serializers.JSONField(required=True, label="磁盘", help_text="磁盘") 144 | device = serializers.JSONField(required=True, label="网卡", help_text="网卡") 145 | sn = serializers.CharField(required=True, max_length=40, label="SN", help_text="SN") 146 | manage_ip = serializers.IPAddressField(required=False, label="IP地址", help_text="IP地址") 147 | 148 | def get_server_obj(self, uuid): 149 | try: 150 | return Server.objects.get(uuid__exact=uuid) 151 | except Server.DoesNotExist: 152 | return None 153 | except Server.MultipleObjectsReturned: 154 | client.captureException() 155 | raise serializers.ValidationError("存在多条记录") 156 | 157 | def validate_manufacturer(self, manufacturer): 158 | return self.get_manufacturer_obj(manufacturer) 159 | 160 | def validate(self, attrs): 161 | attrs["model_name"] = self.get_product_model_obj(attrs["manufacturer"], attrs["model_name"]) 162 | return attrs 163 | 164 | def get_manufacturer_obj(self, manufacturer): 165 | try: 166 | return Manufacturer.objects.get(vendor_name=manufacturer) 167 | except Manufacturer.DoesNotExist: 168 | return Manufacturer.objects.create(vendor_name=manufacturer) 169 | 170 | def get_product_model_obj(self, manufacturer_obj, model_name): 171 | try: 172 | return manufacturer_obj.productmodel_set.get(model_name__exact=model_name) 173 | except ProductModel.DoesNotExist: 174 | return ProductModel.objects.create(model_name=model_name, vendor=manufacturer_obj) 175 | 176 | def create_server(self, validated_data): 177 | logger.debug("[%s] 新客户端Server记录".format(validated_data["uuid"])) 178 | devices = validated_data.pop("device") 179 | server_obj = Server.objects.create(**validated_data) 180 | 181 | self.check_server_network_device(server_obj, devices) 182 | return server_obj 183 | 184 | def check_server_network_device(self, server_obj, devices): 185 | logger.debug("[%s] 检查服务器的网卡设备".format(server_obj.uuid)) 186 | networkDevice_queryset = server_obj.networkdevice_set.all() 187 | for device in devices: 188 | if device.get("name",None) and self.filter_network_device(device["name"]): 189 | try: 190 | # update 网卡 191 | obj = networkDevice_queryset.get(mac__exact=device.get("mac", "")) 192 | obj.name = device['name'] 193 | obj.mac = device['mac'] 194 | # ip 195 | self.check_ip(obj, ifnets = device.pop("ips")) 196 | obj.save() 197 | return obj 198 | except NetworkDevice.DoesNotExist: 199 | # 创建一块网卡记录 200 | self.create_network_device(server_obj,device) 201 | 202 | def filter_network_device(self, device_name): 203 | for filter_name in settings.FILTER_NETWORK_DEVICE: 204 | if device_name.lower().startswith(filter_name) == True: 205 | # 需要过滤掉些网卡 206 | return False 207 | return True 208 | 209 | def create_network_device(self, server_obj, device): 210 | ifnets = device.pop("ips") 211 | device["host"] = server_obj 212 | network_device_obj = NetworkDevice.objects.create(**device) 213 | self.check_ip(network_device_obj, ifnets) 214 | return network_device_obj 215 | 216 | def check_ip(self, network_device_obj, ifnets): 217 | ip_queryset = network_device_obj.ip_set.all() 218 | current_ip_objs = [] 219 | for ifnet in ifnets: 220 | if ifnet.get("inet", None): 221 | try: 222 | # update 223 | obj = ip_queryset.get(ip_addr__exact=ifnet["inet"], netmask__exact=ifnet["netmask"]) 224 | obj.ip_addr = ifnet['inet'] 225 | obj.netmask = ifnet['netmask'] 226 | obj.device = network_device_obj 227 | obj.save() 228 | current_ip_objs.append(obj) 229 | except IP.DoesNotExist: 230 | ip_obj = IP.objects.create(ip_addr=ifnet["inet"], netmask=ifnet["netmask"], device=network_device_obj) 231 | current_ip_objs.append(ip_obj) 232 | 233 | not_exists_ip = set(ip_queryset) - set(current_ip_objs) 234 | for ip_obj in not_exists_ip: 235 | ip_obj.delete() 236 | 237 | 238 | def create(self, validated_data): 239 | uuid = validated_data["uuid"].lower() 240 | sn = validated_data["sn"].lower() 241 | logger.debug("同步服务器数据: %s".format(uuid)) 242 | try: 243 | if sn == uuid or sn.startswith("vmware"): 244 | server_obj = Server.objects.get(uuid__iexact=uuid) 245 | else: 246 | server_obj = Server.objects.get(sn__iexact=sn) 247 | except Server.DoesNotExist: 248 | return self.create_server(validated_data) 249 | else: 250 | return self.update_server(server_obj, validated_data) 251 | 252 | def update_server(self, server_obj, validated_data): 253 | # 更新 254 | logger.debug("[%s] 更新客户端Server记录".format(validated_data["uuid"])) 255 | server_obj.hostname = validated_data["hostname"] 256 | server_obj.os = validated_data["os"] 257 | server_obj.manufacturer = validated_data["manufacturer"] 258 | server_obj.model_name = validated_data["model_name"] 259 | server_obj.server_cpu = validated_data["server_cpu"] 260 | server_obj.server_mem = validated_data["server_mem"] 261 | server_obj.disk = validated_data["disk"] 262 | server_obj.save() 263 | # update 网卡 264 | devices = validated_data.pop("device") 265 | self.check_server_network_device(server_obj, devices) 266 | return server_obj 267 | 268 | def to_representation(self, instance): 269 | ret = { 270 | "hostname": instance.hostname, 271 | "uuid": instance.uuid 272 | } 273 | return ret 274 | 275 | -------------------------------------------------------------------------------- /apps/servers/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/servers/views.py: -------------------------------------------------------------------------------- 1 | from rest_framework import mixins, viewsets, permissions, response, status 2 | 3 | from .models import Server, NetworkDevice, IP 4 | from .serializers import ServerSerializer, NetworkDeviceSerializer, IPSerializer, AutoReportSerializer 5 | from .filter import ServerFilter, NetworkDeviceFilter, IpFilter 6 | 7 | 8 | class ServerViewset(viewsets.ReadOnlyModelViewSet, mixins.UpdateModelMixin): 9 | """ 10 | list: 11 | 获取服务器列表 12 | 13 | create: 14 | 创建服务器 15 | 16 | retrieve: 17 | 获取指定服务器记录 18 | 19 | update: 20 | 修改服务器记录 21 | """ 22 | queryset = Server.objects.all() 23 | serializer_class = ServerSerializer 24 | #extra_perms_map = { 25 | # "GET": ["products.view_product"] 26 | #} 27 | filter_class = ServerFilter 28 | filter_fields = ('hostname', 'idc', 'cabinet', "service", "server_purpose", "server_type") 29 | 30 | def get_queryset(self): 31 | queryset = super(ServerViewset, self).get_queryset() 32 | queryset = queryset.order_by("id") 33 | return queryset 34 | 35 | 36 | class NetwokDeviceViewset(viewsets.ReadOnlyModelViewSet): 37 | """ 38 | list: 39 | 获取网卡列表 40 | 41 | retrieve: 42 | 获取指定网卡记录 43 | 44 | """ 45 | queryset = NetworkDevice.objects.all() 46 | serializer_class = NetworkDeviceSerializer 47 | filter_class = NetworkDeviceFilter 48 | filter_fields = ("name",) 49 | 50 | 51 | class IPViewset(viewsets.ReadOnlyModelViewSet): 52 | """ 53 | list: 54 | 获取网卡IP列表 55 | 56 | 57 | retrieve: 58 | 获取指定网卡IP记录 59 | """ 60 | queryset = IP.objects.all() 61 | serializer_class = IPSerializer 62 | filter_class = IpFilter 63 | filter_fields = ("ip_addr",) 64 | 65 | 66 | class ServerAutoReportViewset(mixins.CreateModelMixin, 67 | viewsets.GenericViewSet): 68 | """ 69 | agent采集的信息入库 70 | """ 71 | queryset = Server.objects.all() 72 | serializer_class = AutoReportSerializer 73 | permission_classes = (permissions.AllowAny,) 74 | 75 | 76 | class ServerCountViewset(viewsets.ViewSet,mixins.ListModelMixin): 77 | permission_classes = (permissions.IsAuthenticated,) 78 | queryset = Server.objects.all() 79 | 80 | def list(self, request, *args, **kwargs): 81 | data = self.get_server_nums() 82 | return response.Response(data) 83 | 84 | def get_server_nums(self): 85 | ret = { 86 | "count": self.queryset.count(), 87 | "vm_host_num": self.queryset.filter(server_type__exact=0).count(), 88 | "phy_host_num": self.queryset.filter(server_type__exact=1).count(), 89 | "master_host_num": self.queryset.filter(server_type__exact=2).count() 90 | } 91 | return ret -------------------------------------------------------------------------------- /apps/users/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/users/__init__.py -------------------------------------------------------------------------------- /apps/users/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/users/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class UsersConfig(AppConfig): 5 | name = 'users' 6 | -------------------------------------------------------------------------------- /apps/users/common.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | 3 | User = get_user_model() 4 | 5 | def get_user_obj(uid): 6 | try: 7 | return User.objects.get(pk=uid) 8 | except User.DoesNotExist: 9 | return None -------------------------------------------------------------------------------- /apps/users/filters.py: -------------------------------------------------------------------------------- 1 | import django_filters 2 | 3 | from django.contrib.auth import get_user_model 4 | from django.db.models import Q 5 | 6 | 7 | User = get_user_model() 8 | 9 | class UserFilter(django_filters.rest_framework.FilterSet): 10 | """ 11 | 用户过滤类 12 | """ 13 | username = django_filters.CharFilter(method='search_username') 14 | 15 | def search_username(self, queryset, name, value): 16 | return queryset.filter(Q(name__icontains=value)|Q(username__icontains=value)) 17 | 18 | 19 | class Meta: 20 | model = User 21 | fields = ['username'] -------------------------------------------------------------------------------- /apps/users/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | from django.contrib.auth.models import AbstractUser, Group 5 | from menu.models import Menu 6 | 7 | 8 | class User(AbstractUser): 9 | name = models.CharField("姓名", max_length=32, null=True, help_text="姓名") 10 | phone = models.CharField("电话", max_length=11, null=True, help_text="手机号") 11 | id_rsa_key = models.TextField(null=True) 12 | id_rsa_pub = models.TextField(null=True) 13 | 14 | class Meta: 15 | verbose_name = "用户" 16 | ordering = ["id"] 17 | db_table = 'auth_user' 18 | permissions = ( 19 | ("view_user", "cat view user"), 20 | ) 21 | 22 | def __str__(self): 23 | return self.username 24 | 25 | def get_view_permissions(self): 26 | if self.is_superuser: 27 | return Menu.objects.all() 28 | return Menu.objects.filter(groups__in=self.groups.all()) 29 | -------------------------------------------------------------------------------- /apps/users/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import UsersViewset, UserRegViewset, UserInfoViewset 3 | 4 | 5 | user_router = DefaultRouter() 6 | user_router.register(r'userreg', UserRegViewset, base_name="userreg") 7 | user_router.register(r'users', UsersViewset, base_name="users") 8 | user_router.register(r'userinfo', UserInfoViewset, base_name="userinfo") 9 | -------------------------------------------------------------------------------- /apps/users/serializers.py: -------------------------------------------------------------------------------- 1 | import io 2 | 3 | from rest_framework import serializers 4 | from django.contrib.auth import get_user_model 5 | from django.conf import settings 6 | from paramiko.rsakey import RSAKey 7 | 8 | 9 | User = get_user_model() 10 | 11 | 12 | class UserSerializer(serializers.ModelSerializer): 13 | """ 14 | 用户序列化类 15 | """ 16 | username = serializers.CharField(required=False, read_only=False, max_length=32, label="用户名", help_text="用户名") 17 | name = serializers.CharField(required=False, read_only=False, label="姓名", help_text="姓名") 18 | is_active = serializers.BooleanField(required=False, label="登陆状态", help_text="登陆状态") 19 | email = serializers.CharField(read_only=True, help_text="联系邮箱") 20 | last_login = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S", read_only=True, help_text="上次登录时间") 21 | phone = serializers.CharField(required=False, max_length=11, min_length=11, allow_null=True, help_text="手机号", 22 | error_messages={"max_length":"手机号错误","min_length":"手机号错误"}, 23 | ) 24 | 25 | class Meta: 26 | model = User 27 | fields = ("id", "username", "name", "phone", "email", "is_active", "last_login") 28 | 29 | 30 | class UserRegSerializer(serializers.ModelSerializer): 31 | """ 32 | 用户注册序列化类 33 | """ 34 | id = serializers.IntegerField(read_only=True) 35 | name = serializers.CharField(max_length=32, label="姓名", help_text="用户姓名,中文姓名") 36 | username = serializers.CharField(max_length=32, label="用户名", help_text="用户名,用户登陆名") 37 | password = serializers.CharField(style={"input_type": "password"}, label="密码", write_only=True, help_text="密码") 38 | phone = serializers.CharField(max_length=11, min_length=11, label="手机号", required=False, 39 | allow_null=True, allow_blank=True, help_text="手机号") 40 | 41 | def create(self, validated_data): 42 | validated_data["is_active"] = False 43 | instance = super(UserRegSerializer, self).create(validated_data=validated_data) 44 | instance.email = "{}{}".format(instance.username, settings.DOMAIN) 45 | 46 | instance.set_password(validated_data["password"]) 47 | instance.id_rsa_key, instance.id_rsa_pub = self.get_sshkey(instance.email) 48 | instance.save() 49 | return instance 50 | 51 | def update(self, instance, validated_data): 52 | password = validated_data.get("password", None) 53 | if password: 54 | instance.set_password(password) 55 | instance.save() 56 | return instance 57 | 58 | def get_sshkey(self, email): 59 | output = io.StringIO() 60 | sbuffer = io.StringIO() 61 | 62 | key = RSAKey.generate(2048) 63 | key.write_private_key(output) 64 | private_key = output.getvalue() 65 | 66 | sbuffer.write("{} {} {}".format(key.get_name(), key.get_base64(), email)) 67 | public_key = sbuffer.getvalue() 68 | return private_key, public_key 69 | 70 | class Meta: 71 | model = User 72 | fields = ("username", "password", "name", "id", "phone") 73 | -------------------------------------------------------------------------------- /apps/users/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/users/views.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth import get_user_model 2 | from rest_framework import viewsets, mixins, permissions 3 | from rest_framework.response import Response 4 | from .serializers import UserSerializer, UserRegSerializer 5 | 6 | from .filters import UserFilter 7 | 8 | from menu.common import get_menu_tree 9 | 10 | User = get_user_model() 11 | 12 | 13 | class UserRegViewset(mixins.CreateModelMixin, 14 | mixins.UpdateModelMixin, 15 | viewsets.GenericViewSet): 16 | """ 17 | create: 18 | 创建用户 19 | 20 | update: 21 | 修改密码 22 | """ 23 | queryset = User.objects.all() 24 | serializer_class = UserRegSerializer 25 | 26 | 27 | class UserInfoViewset(viewsets.ViewSet): 28 | """ 29 | 获取当前登陆的用户信息 30 | """ 31 | permission_classes = (permissions.IsAuthenticated,) 32 | def list(self, request, *args, **kwargs): 33 | data = { 34 | "username": self.request.user.username, 35 | "name": self.request.user.name, 36 | "menus": get_menu_tree(self.request.user.get_view_permissions()) 37 | } 38 | return Response(data) 39 | 40 | 41 | class UsersViewset(viewsets.ModelViewSet): 42 | """ 43 | retrieve: 44 | 获取用户信息 45 | 46 | list: 47 | 获取用户列表 48 | 49 | update: 50 | 更新用户信息 51 | 52 | delete: 53 | 删除用户 54 | """ 55 | queryset = User.objects.all() 56 | serializer_class = UserSerializer 57 | filter_class = UserFilter 58 | filter_fields = ("username",) 59 | extra_perms_map = { 60 | "GET": ["users.show_user_list"] 61 | } 62 | 63 | def get_queryset(self): 64 | queryset = super(UsersViewset, self).get_queryset() 65 | queryset = queryset.order_by("id") 66 | queryset = queryset.exclude(is_superuser=True) 67 | return queryset 68 | -------------------------------------------------------------------------------- /apps/zabbix/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rfjer/autoAdmin/e3c5af88b1f0c8be6b608d3221747f61aacefb32/apps/zabbix/__init__.py -------------------------------------------------------------------------------- /apps/zabbix/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /apps/zabbix/api_wrapper.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import json 3 | import requests 4 | 5 | logger = logging.getLogger() 6 | 7 | from .exceptions import ( 8 | ZabbixClientError, ResponseError,InvalidJSONError, JSONRPCError 9 | ) 10 | 11 | def dumps(id_, method, params=None, auth=None): 12 | rpc_request = { 13 | 'jsonrpc': '2.0', 14 | 'id': id_, 15 | 'method': method, 16 | "params": {} 17 | } 18 | 19 | if params is not None: 20 | rpc_request['params'] = params 21 | if auth is not None: 22 | rpc_request['auth'] = auth 23 | json_str = json.dumps(rpc_request, separators=(',', ':')) 24 | return json_str 25 | 26 | def loads(response): 27 | try: 28 | rpc_response = response.json() 29 | except ValueError as e: 30 | raise InvalidJSONError(e) 31 | 32 | if not isinstance(rpc_response, dict): 33 | raise ResponseError('Response is not a dict') 34 | 35 | if 'jsonrpc' not in rpc_response or rpc_response['jsonrpc'] != '2.0': 36 | raise ResponseError('JSON-RPC version not supported') 37 | 38 | if 'error' in rpc_response: 39 | error = rpc_response['error'] 40 | if 'code' not in error or 'message' not in error: 41 | raise ResponseError('Invalid JSON-RPC error object') 42 | 43 | code = error['code'] 44 | message = error['message'] 45 | data = error.get('data', None) 46 | 47 | if data is None: 48 | exception_message = 'Code: {0}, Message: {1}'.format(code, message) 49 | else: 50 | exception_message = ('Code: {0}, Message: {1}, ' + 51 | 'Data: {2}').format(code, message, data) 52 | raise JSONRPCError(exception_message, code=code, message=message, 53 | data=data) 54 | if 'result' not in rpc_response: 55 | raise ResponseError('Response does not contain a result object') 56 | return rpc_response 57 | 58 | 59 | class ZabbixServerProxy(object): 60 | 61 | def __init__(self, url): 62 | self.url = url if not url.endswith('/') else url[:-1] 63 | self.url += '/api_jsonrpc.php' 64 | self.headers = {"Content-Type": "application/json-rpc"} 65 | self._request_id = 0 66 | self._auth_token = None 67 | self._method_hooks = { 68 | 'apiinfo.version': self._no_auth_method, 69 | 'user.login': self._login, 70 | 'user.logout': self._logout 71 | } 72 | 73 | def __getattr__(self, name): 74 | return ZabbixObject(name, self) 75 | 76 | def call(self, method, params=None): 77 | method_lower = method.lower() 78 | 79 | if method_lower in self._method_hooks: 80 | return self._method_hooks[method_lower](method, params=params) 81 | 82 | return self._call(method, params=params, auth=self._auth_token) 83 | 84 | def _call(self, method, params=None, auth=None): 85 | self._request_id += 1 86 | request_data = dumps(self._request_id, method, params=params, auth=auth) 87 | response = requests.post(self.url, data=request_data, 88 | headers=self.headers) 89 | rpc_response = loads(response) 90 | return rpc_response['result'] 91 | 92 | def _no_auth_method(self, method, params=None): 93 | return self._call(method, params=params) 94 | 95 | def _login(self, method, params=None): 96 | self._auth_token = None 97 | 98 | # Save the new token if the request is successful 99 | self._auth_token = self._call(method, params=params) 100 | 101 | return self._auth_token 102 | 103 | def _logout(self, method, params=None): 104 | try: 105 | result = self._call(method, params=params, auth=self._auth_token) 106 | except ZabbixClientError: 107 | raise 108 | finally: 109 | self._auth_token = None 110 | 111 | return result 112 | 113 | 114 | class ZabbixObject(object): 115 | 116 | def __init__(self, name, server_proxy): 117 | self.name = name 118 | self.server_proxy = server_proxy 119 | 120 | def __getattr__(self, name): 121 | def call_wrapper(*args, **kwargs): 122 | if args and kwargs: 123 | raise ValueError('JSON-RPC 2.0 does not allow both ' + 124 | 'positional and keyword arguments') 125 | 126 | method = '{0}.{1}'.format(self.name, name) 127 | params = args or kwargs or None 128 | return self.server_proxy.call(method, params=params) 129 | 130 | if name.endswith('_'): 131 | name = name[:-1] 132 | 133 | return call_wrapper 134 | -------------------------------------------------------------------------------- /apps/zabbix/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ZabbixConfig(AppConfig): 5 | name = 'zabbix' 6 | -------------------------------------------------------------------------------- /apps/zabbix/common.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | 3 | from .api_wrapper import ZabbixServerProxy 4 | 5 | 6 | def _init(): 7 | s = ZabbixServerProxy(settings.ZABBIX_API) 8 | s.user.login(user=settings.ZABBIX_ADMIN_USER, password=settings.ZABBIX_ADMIN_PASS) 9 | return s 10 | 11 | s = _init() -------------------------------------------------------------------------------- /apps/zabbix/exceptions.py: -------------------------------------------------------------------------------- 1 | 2 | class ZabbixClientError(Exception): 3 | pass 4 | 5 | 6 | class ResponseError(ZabbixClientError): 7 | pass 8 | 9 | 10 | class InvalidJSONError(ResponseError): 11 | pass 12 | 13 | class JSONRPCError(ZabbixClientError): 14 | 15 | def __init__(self, *args, **kwargs): 16 | self.code = kwargs.pop('code', None) 17 | self.message = kwargs.pop('message', None) 18 | self.data = kwargs.pop('data', None) 19 | 20 | super(JSONRPCError, self).__init__(*args, **kwargs) -------------------------------------------------------------------------------- /apps/zabbix/models.py: -------------------------------------------------------------------------------- 1 | # This is an auto-generated Django model module. 2 | # You'll have to do the following manually to clean this up: 3 | # * Rearrange models' order 4 | # * Make sure each model has one field with primary_key=True 5 | # * Make sure each ForeignKey has `on_delete` set to the desired behavior. 6 | # * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table 7 | # Feel free to rename the models, but don't rename db_table values or field names. 8 | 9 | 10 | from django.db import models 11 | 12 | 13 | class Acknowledges(models.Model): 14 | acknowledgeid = models.BigIntegerField(primary_key=True) 15 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 16 | eventid = models.ForeignKey('Events', models.DO_NOTHING, db_column='eventid') 17 | clock = models.IntegerField() 18 | message = models.CharField(max_length=255) 19 | action = models.IntegerField() 20 | 21 | class Meta: 22 | managed = False 23 | db_table = 'acknowledges' 24 | 25 | 26 | class Actions(models.Model): 27 | actionid = models.BigIntegerField(primary_key=True) 28 | name = models.CharField(unique=True, max_length=255) 29 | eventsource = models.IntegerField() 30 | evaltype = models.IntegerField() 31 | status = models.IntegerField() 32 | esc_period = models.CharField(max_length=255) 33 | def_shortdata = models.CharField(max_length=255) 34 | def_longdata = models.TextField() 35 | r_shortdata = models.CharField(max_length=255) 36 | r_longdata = models.TextField() 37 | formula = models.CharField(max_length=255) 38 | maintenance_mode = models.IntegerField() 39 | ack_shortdata = models.CharField(max_length=255) 40 | ack_longdata = models.TextField() 41 | 42 | class Meta: 43 | managed = False 44 | db_table = 'actions' 45 | 46 | 47 | class Alerts(models.Model): 48 | alertid = models.BigIntegerField(primary_key=True) 49 | actionid = models.ForeignKey(Actions, models.DO_NOTHING, db_column='actionid') 50 | eventid = models.ForeignKey('Events', models.DO_NOTHING, db_column='eventid', related_name="alerts") 51 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid', blank=True, null=True) 52 | clock = models.IntegerField() 53 | mediatypeid = models.ForeignKey('MediaType', models.DO_NOTHING, db_column='mediatypeid', blank=True, null=True) 54 | sendto = models.CharField(max_length=100) 55 | subject = models.CharField(max_length=255) 56 | message = models.TextField() 57 | status = models.IntegerField() 58 | retries = models.IntegerField() 59 | error = models.CharField(max_length=2048) 60 | esc_step = models.IntegerField() 61 | alerttype = models.IntegerField() 62 | p_eventid = models.ForeignKey('Events', models.DO_NOTHING, db_column='p_eventid', blank=True, null=True, related_name="p_alerts") 63 | acknowledgeid = models.ForeignKey(Acknowledges, models.DO_NOTHING, db_column='acknowledgeid', blank=True, null=True) 64 | 65 | class Meta: 66 | managed = False 67 | db_table = 'alerts' 68 | 69 | 70 | class ApplicationDiscovery(models.Model): 71 | application_discoveryid = models.BigIntegerField(primary_key=True) 72 | applicationid = models.ForeignKey('Applications', models.DO_NOTHING, db_column='applicationid') 73 | application_prototypeid = models.ForeignKey('ApplicationPrototype', models.DO_NOTHING, db_column='application_prototypeid') 74 | name = models.CharField(max_length=255) 75 | lastcheck = models.IntegerField() 76 | ts_delete = models.IntegerField() 77 | 78 | class Meta: 79 | managed = False 80 | db_table = 'application_discovery' 81 | 82 | 83 | class ApplicationPrototype(models.Model): 84 | application_prototypeid = models.BigIntegerField(primary_key=True) 85 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 86 | templateid = models.ForeignKey('self', models.DO_NOTHING, db_column='templateid', blank=True, null=True) 87 | name = models.CharField(max_length=255) 88 | 89 | class Meta: 90 | managed = False 91 | db_table = 'application_prototype' 92 | 93 | 94 | class ApplicationTemplate(models.Model): 95 | application_templateid = models.BigIntegerField(primary_key=True) 96 | applicationid = models.ForeignKey('Applications', models.DO_NOTHING, db_column='applicationid', related_name="application") 97 | templateid = models.ForeignKey('Applications', models.DO_NOTHING, db_column='templateid', related_name="template") 98 | 99 | class Meta: 100 | managed = False 101 | db_table = 'application_template' 102 | unique_together = (('applicationid', 'templateid'),) 103 | 104 | 105 | class Applications(models.Model): 106 | applicationid = models.BigIntegerField(primary_key=True) 107 | hostid = models.ForeignKey('Hosts', models.DO_NOTHING, db_column='hostid') 108 | name = models.CharField(max_length=255) 109 | flags = models.IntegerField() 110 | 111 | class Meta: 112 | managed = False 113 | db_table = 'applications' 114 | unique_together = (('hostid', 'name'),) 115 | 116 | 117 | class Auditlog(models.Model): 118 | auditid = models.BigIntegerField(primary_key=True) 119 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 120 | clock = models.IntegerField() 121 | action = models.IntegerField() 122 | resourcetype = models.IntegerField() 123 | details = models.CharField(max_length=128) 124 | ip = models.CharField(max_length=39) 125 | resourceid = models.BigIntegerField() 126 | resourcename = models.CharField(max_length=255) 127 | 128 | class Meta: 129 | managed = False 130 | db_table = 'auditlog' 131 | 132 | 133 | class AuditlogDetails(models.Model): 134 | auditdetailid = models.BigIntegerField(primary_key=True) 135 | auditid = models.ForeignKey(Auditlog, models.DO_NOTHING, db_column='auditid') 136 | table_name = models.CharField(max_length=64) 137 | field_name = models.CharField(max_length=64) 138 | oldvalue = models.TextField() 139 | newvalue = models.TextField() 140 | 141 | class Meta: 142 | managed = False 143 | db_table = 'auditlog_details' 144 | 145 | 146 | class AutoregHost(models.Model): 147 | autoreg_hostid = models.BigIntegerField(primary_key=True) 148 | proxy_hostid = models.ForeignKey('Hosts', models.DO_NOTHING, db_column='proxy_hostid', blank=True, null=True) 149 | host = models.CharField(max_length=64) 150 | listen_ip = models.CharField(max_length=39) 151 | listen_port = models.IntegerField() 152 | listen_dns = models.CharField(max_length=64) 153 | host_metadata = models.CharField(max_length=255) 154 | 155 | class Meta: 156 | managed = False 157 | db_table = 'autoreg_host' 158 | 159 | 160 | class Conditions(models.Model): 161 | conditionid = models.BigIntegerField(primary_key=True) 162 | actionid = models.ForeignKey(Actions, models.DO_NOTHING, db_column='actionid') 163 | conditiontype = models.IntegerField() 164 | operator = models.IntegerField() 165 | value = models.CharField(max_length=255) 166 | value2 = models.CharField(max_length=255) 167 | 168 | class Meta: 169 | managed = False 170 | db_table = 'conditions' 171 | 172 | 173 | class Config(models.Model): 174 | configid = models.BigIntegerField(primary_key=True) 175 | refresh_unsupported = models.CharField(max_length=32) 176 | work_period = models.CharField(max_length=255) 177 | alert_usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='alert_usrgrpid', blank=True, null=True) 178 | event_ack_enable = models.IntegerField() 179 | event_expire = models.CharField(max_length=32) 180 | event_show_max = models.IntegerField() 181 | default_theme = models.CharField(max_length=128) 182 | authentication_type = models.IntegerField() 183 | ldap_host = models.CharField(max_length=255) 184 | ldap_port = models.IntegerField() 185 | ldap_base_dn = models.CharField(max_length=255) 186 | ldap_bind_dn = models.CharField(max_length=255) 187 | ldap_bind_password = models.CharField(max_length=128) 188 | ldap_search_attribute = models.CharField(max_length=128) 189 | dropdown_first_entry = models.IntegerField() 190 | dropdown_first_remember = models.IntegerField() 191 | discovery_groupid = models.ForeignKey('Groups', models.DO_NOTHING, db_column='discovery_groupid') 192 | max_in_table = models.IntegerField() 193 | search_limit = models.IntegerField() 194 | severity_color_0 = models.CharField(max_length=6) 195 | severity_color_1 = models.CharField(max_length=6) 196 | severity_color_2 = models.CharField(max_length=6) 197 | severity_color_3 = models.CharField(max_length=6) 198 | severity_color_4 = models.CharField(max_length=6) 199 | severity_color_5 = models.CharField(max_length=6) 200 | severity_name_0 = models.CharField(max_length=32) 201 | severity_name_1 = models.CharField(max_length=32) 202 | severity_name_2 = models.CharField(max_length=32) 203 | severity_name_3 = models.CharField(max_length=32) 204 | severity_name_4 = models.CharField(max_length=32) 205 | severity_name_5 = models.CharField(max_length=32) 206 | ok_period = models.CharField(max_length=32) 207 | blink_period = models.CharField(max_length=32) 208 | problem_unack_color = models.CharField(max_length=6) 209 | problem_ack_color = models.CharField(max_length=6) 210 | ok_unack_color = models.CharField(max_length=6) 211 | ok_ack_color = models.CharField(max_length=6) 212 | problem_unack_style = models.IntegerField() 213 | problem_ack_style = models.IntegerField() 214 | ok_unack_style = models.IntegerField() 215 | ok_ack_style = models.IntegerField() 216 | snmptrap_logging = models.IntegerField() 217 | server_check_interval = models.IntegerField() 218 | hk_events_mode = models.IntegerField() 219 | hk_events_trigger = models.CharField(max_length=32) 220 | hk_events_internal = models.CharField(max_length=32) 221 | hk_events_discovery = models.CharField(max_length=32) 222 | hk_events_autoreg = models.CharField(max_length=32) 223 | hk_services_mode = models.IntegerField() 224 | hk_services = models.CharField(max_length=32) 225 | hk_audit_mode = models.IntegerField() 226 | hk_audit = models.CharField(max_length=32) 227 | hk_sessions_mode = models.IntegerField() 228 | hk_sessions = models.CharField(max_length=32) 229 | hk_history_mode = models.IntegerField() 230 | hk_history_global = models.IntegerField() 231 | hk_history = models.CharField(max_length=32) 232 | hk_trends_mode = models.IntegerField() 233 | hk_trends_global = models.IntegerField() 234 | hk_trends = models.CharField(max_length=32) 235 | default_inventory_mode = models.IntegerField() 236 | 237 | class Meta: 238 | managed = False 239 | db_table = 'config' 240 | 241 | 242 | class CorrCondition(models.Model): 243 | corr_conditionid = models.BigIntegerField(primary_key=True) 244 | correlationid = models.ForeignKey('Correlation', models.DO_NOTHING, db_column='correlationid') 245 | type = models.IntegerField() 246 | 247 | class Meta: 248 | managed = False 249 | db_table = 'corr_condition' 250 | 251 | 252 | class CorrConditionGroup(models.Model): 253 | corr_conditionid = models.OneToOneField(CorrCondition, models.DO_NOTHING, db_column='corr_conditionid', primary_key=True, unique=True) 254 | operator = models.IntegerField() 255 | groupid = models.ForeignKey('Groups', models.DO_NOTHING, db_column='groupid') 256 | 257 | class Meta: 258 | managed = False 259 | db_table = 'corr_condition_group' 260 | 261 | 262 | class CorrConditionTag(models.Model): 263 | corr_conditionid = models.OneToOneField(CorrCondition, models.DO_NOTHING, db_column='corr_conditionid', primary_key=True) 264 | tag = models.CharField(max_length=255) 265 | 266 | class Meta: 267 | managed = False 268 | db_table = 'corr_condition_tag' 269 | 270 | 271 | class CorrConditionTagpair(models.Model): 272 | corr_conditionid = models.OneToOneField(CorrCondition, models.DO_NOTHING, db_column='corr_conditionid', primary_key=True) 273 | oldtag = models.CharField(max_length=255) 274 | newtag = models.CharField(max_length=255) 275 | 276 | class Meta: 277 | managed = False 278 | db_table = 'corr_condition_tagpair' 279 | 280 | 281 | class CorrConditionTagvalue(models.Model): 282 | corr_conditionid = models.OneToOneField(CorrCondition, models.DO_NOTHING, db_column='corr_conditionid', primary_key=True) 283 | tag = models.CharField(max_length=255) 284 | operator = models.IntegerField() 285 | value = models.CharField(max_length=255) 286 | 287 | class Meta: 288 | managed = False 289 | db_table = 'corr_condition_tagvalue' 290 | 291 | 292 | class CorrOperation(models.Model): 293 | corr_operationid = models.BigIntegerField(primary_key=True) 294 | correlationid = models.ForeignKey('Correlation', models.DO_NOTHING, db_column='correlationid') 295 | type = models.IntegerField() 296 | 297 | class Meta: 298 | managed = False 299 | db_table = 'corr_operation' 300 | 301 | 302 | class Correlation(models.Model): 303 | correlationid = models.BigIntegerField(primary_key=True) 304 | name = models.CharField(unique=True, max_length=255) 305 | description = models.TextField() 306 | evaltype = models.IntegerField() 307 | status = models.IntegerField() 308 | formula = models.CharField(max_length=255) 309 | 310 | class Meta: 311 | managed = False 312 | db_table = 'correlation' 313 | 314 | 315 | class Dashboard(models.Model): 316 | dashboardid = models.BigIntegerField(primary_key=True) 317 | name = models.CharField(max_length=255) 318 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 319 | private = models.IntegerField() 320 | 321 | class Meta: 322 | managed = False 323 | db_table = 'dashboard' 324 | 325 | 326 | class DashboardUser(models.Model): 327 | dashboard_userid = models.BigIntegerField(primary_key=True) 328 | dashboardid = models.ForeignKey(Dashboard, models.DO_NOTHING, db_column='dashboardid') 329 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 330 | permission = models.IntegerField() 331 | 332 | class Meta: 333 | managed = False 334 | db_table = 'dashboard_user' 335 | unique_together = (('dashboardid', 'userid'),) 336 | 337 | 338 | class DashboardUsrgrp(models.Model): 339 | dashboard_usrgrpid = models.BigIntegerField(primary_key=True) 340 | dashboardid = models.ForeignKey(Dashboard, models.DO_NOTHING, db_column='dashboardid') 341 | usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='usrgrpid') 342 | permission = models.IntegerField() 343 | 344 | class Meta: 345 | managed = False 346 | db_table = 'dashboard_usrgrp' 347 | unique_together = (('dashboardid', 'usrgrpid'),) 348 | 349 | 350 | class Dbversion(models.Model): 351 | mandatory = models.IntegerField() 352 | optional = models.IntegerField() 353 | 354 | class Meta: 355 | managed = False 356 | db_table = 'dbversion' 357 | 358 | 359 | class Dchecks(models.Model): 360 | dcheckid = models.BigIntegerField(primary_key=True) 361 | druleid = models.ForeignKey('Drules', models.DO_NOTHING, db_column='druleid') 362 | type = models.IntegerField() 363 | key_field = models.CharField(db_column='key_', max_length=512) # Field renamed because it ended with '_'. 364 | snmp_community = models.CharField(max_length=255) 365 | ports = models.CharField(max_length=255) 366 | snmpv3_securityname = models.CharField(max_length=64) 367 | snmpv3_securitylevel = models.IntegerField() 368 | snmpv3_authpassphrase = models.CharField(max_length=64) 369 | snmpv3_privpassphrase = models.CharField(max_length=64) 370 | uniq = models.IntegerField() 371 | snmpv3_authprotocol = models.IntegerField() 372 | snmpv3_privprotocol = models.IntegerField() 373 | snmpv3_contextname = models.CharField(max_length=255) 374 | 375 | class Meta: 376 | managed = False 377 | db_table = 'dchecks' 378 | 379 | 380 | class Dhosts(models.Model): 381 | dhostid = models.BigIntegerField(primary_key=True) 382 | druleid = models.ForeignKey('Drules', models.DO_NOTHING, db_column='druleid') 383 | status = models.IntegerField() 384 | lastup = models.IntegerField() 385 | lastdown = models.IntegerField() 386 | 387 | class Meta: 388 | managed = False 389 | db_table = 'dhosts' 390 | 391 | 392 | class Drules(models.Model): 393 | druleid = models.BigIntegerField(primary_key=True) 394 | proxy_hostid = models.ForeignKey('Hosts', models.DO_NOTHING, db_column='proxy_hostid', blank=True, null=True) 395 | name = models.CharField(unique=True, max_length=255) 396 | iprange = models.CharField(max_length=2048) 397 | delay = models.CharField(max_length=255) 398 | nextcheck = models.IntegerField() 399 | status = models.IntegerField() 400 | 401 | class Meta: 402 | managed = False 403 | db_table = 'drules' 404 | 405 | 406 | class Dservices(models.Model): 407 | dserviceid = models.BigIntegerField(primary_key=True) 408 | dhostid = models.ForeignKey(Dhosts, models.DO_NOTHING, db_column='dhostid') 409 | value = models.CharField(max_length=255) 410 | port = models.IntegerField() 411 | status = models.IntegerField() 412 | lastup = models.IntegerField() 413 | lastdown = models.IntegerField() 414 | dcheckid = models.ForeignKey(Dchecks, models.DO_NOTHING, db_column='dcheckid') 415 | ip = models.CharField(max_length=39) 416 | dns = models.CharField(max_length=64) 417 | 418 | class Meta: 419 | managed = False 420 | db_table = 'dservices' 421 | unique_together = (('dcheckid', 'ip', 'port'),) 422 | 423 | 424 | class Escalations(models.Model): 425 | escalationid = models.BigIntegerField(primary_key=True) 426 | actionid = models.BigIntegerField() 427 | triggerid = models.BigIntegerField(blank=True, null=True) 428 | eventid = models.BigIntegerField(blank=True, null=True) 429 | r_eventid = models.BigIntegerField(blank=True, null=True) 430 | nextcheck = models.IntegerField() 431 | esc_step = models.IntegerField() 432 | status = models.IntegerField() 433 | itemid = models.BigIntegerField(blank=True, null=True) 434 | acknowledgeid = models.BigIntegerField(blank=True, null=True) 435 | 436 | class Meta: 437 | managed = False 438 | db_table = 'escalations' 439 | unique_together = (('actionid', 'triggerid', 'itemid', 'escalationid'),) 440 | 441 | 442 | class EventRecovery(models.Model): 443 | eventid = models.OneToOneField('Events', models.DO_NOTHING, db_column='eventid', primary_key=True) 444 | r_eventid = models.ForeignKey('Events', models.DO_NOTHING, db_column='r_eventid', related_name="recovery_r_eventid") 445 | c_eventid = models.ForeignKey('Events', models.DO_NOTHING, db_column='c_eventid', blank=True, null=True, related_name="recovery_c_eventid") 446 | correlationid = models.BigIntegerField(blank=True, null=True) 447 | userid = models.BigIntegerField(blank=True, null=True) 448 | 449 | class Meta: 450 | managed = False 451 | db_table = 'event_recovery' 452 | 453 | 454 | class EventTag(models.Model): 455 | eventtagid = models.BigIntegerField(primary_key=True) 456 | eventid = models.ForeignKey('Events', models.DO_NOTHING, db_column='eventid') 457 | tag = models.CharField(max_length=255) 458 | value = models.CharField(max_length=255) 459 | 460 | class Meta: 461 | managed = False 462 | db_table = 'event_tag' 463 | 464 | 465 | class Events(models.Model): 466 | eventid = models.BigIntegerField(primary_key=True) 467 | source = models.IntegerField() 468 | object = models.IntegerField() 469 | objectid = models.BigIntegerField() 470 | clock = models.IntegerField() 471 | value = models.IntegerField() 472 | acknowledged = models.IntegerField() 473 | ns = models.IntegerField() 474 | 475 | class Meta: 476 | managed = False 477 | db_table = 'events' 478 | 479 | 480 | class Expressions(models.Model): 481 | expressionid = models.BigIntegerField(primary_key=True) 482 | regexpid = models.ForeignKey('Regexps', models.DO_NOTHING, db_column='regexpid') 483 | expression = models.CharField(max_length=255) 484 | expression_type = models.IntegerField() 485 | exp_delimiter = models.CharField(max_length=1) 486 | case_sensitive = models.IntegerField() 487 | 488 | class Meta: 489 | managed = False 490 | db_table = 'expressions' 491 | 492 | 493 | class Functions(models.Model): 494 | functionid = models.BigIntegerField(primary_key=True) 495 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 496 | triggerid = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='triggerid') 497 | function = models.CharField(max_length=12) 498 | parameter = models.CharField(max_length=255) 499 | 500 | class Meta: 501 | managed = False 502 | db_table = 'functions' 503 | 504 | 505 | class Globalmacro(models.Model): 506 | globalmacroid = models.BigIntegerField(primary_key=True) 507 | macro = models.CharField(unique=True, max_length=255) 508 | value = models.CharField(max_length=255) 509 | 510 | class Meta: 511 | managed = False 512 | db_table = 'globalmacro' 513 | 514 | 515 | class Globalvars(models.Model): 516 | globalvarid = models.BigIntegerField(primary_key=True) 517 | snmp_lastsize = models.BigIntegerField() 518 | 519 | class Meta: 520 | managed = False 521 | db_table = 'globalvars' 522 | 523 | 524 | class GraphDiscovery(models.Model): 525 | graphid = models.OneToOneField('Graphs', models.DO_NOTHING, db_column='graphid', primary_key=True, related_name="discovery_graph") 526 | parent_graphid = models.ForeignKey('Graphs', models.DO_NOTHING, db_column='parent_graphid', related_name="discovery_parent_graph") 527 | 528 | class Meta: 529 | managed = False 530 | db_table = 'graph_discovery' 531 | 532 | 533 | class GraphTheme(models.Model): 534 | graphthemeid = models.BigIntegerField(primary_key=True) 535 | theme = models.CharField(unique=True, max_length=64) 536 | backgroundcolor = models.CharField(max_length=6) 537 | graphcolor = models.CharField(max_length=6) 538 | gridcolor = models.CharField(max_length=6) 539 | maingridcolor = models.CharField(max_length=6) 540 | gridbordercolor = models.CharField(max_length=6) 541 | textcolor = models.CharField(max_length=6) 542 | highlightcolor = models.CharField(max_length=6) 543 | leftpercentilecolor = models.CharField(max_length=6) 544 | rightpercentilecolor = models.CharField(max_length=6) 545 | nonworktimecolor = models.CharField(max_length=6) 546 | 547 | class Meta: 548 | managed = False 549 | db_table = 'graph_theme' 550 | 551 | 552 | class Graphs(models.Model): 553 | graphid = models.BigIntegerField(primary_key=True) 554 | name = models.CharField(max_length=128) 555 | width = models.IntegerField() 556 | height = models.IntegerField() 557 | yaxismin = models.FloatField() 558 | yaxismax = models.FloatField() 559 | templateid = models.ForeignKey('self', models.DO_NOTHING, db_column='templateid', blank=True, null=True) 560 | show_work_period = models.IntegerField() 561 | show_triggers = models.IntegerField() 562 | graphtype = models.IntegerField() 563 | show_legend = models.IntegerField() 564 | show_3d = models.IntegerField() 565 | percent_left = models.FloatField() 566 | percent_right = models.FloatField() 567 | ymin_type = models.IntegerField() 568 | ymax_type = models.IntegerField() 569 | ymin_itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='ymin_itemid', blank=True, null=True, related_name="ymin_item") 570 | ymax_itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='ymax_itemid', blank=True, null=True, related_name="ymax_item") 571 | flags = models.IntegerField() 572 | 573 | class Meta: 574 | managed = False 575 | db_table = 'graphs' 576 | 577 | 578 | class GraphsItems(models.Model): 579 | gitemid = models.BigIntegerField(primary_key=True) 580 | graphid = models.ForeignKey(Graphs, models.DO_NOTHING, db_column='graphid') 581 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 582 | drawtype = models.IntegerField() 583 | sortorder = models.IntegerField() 584 | color = models.CharField(max_length=6) 585 | yaxisside = models.IntegerField() 586 | calc_fnc = models.IntegerField() 587 | type = models.IntegerField() 588 | 589 | class Meta: 590 | managed = False 591 | db_table = 'graphs_items' 592 | 593 | 594 | class GroupDiscovery(models.Model): 595 | groupid = models.OneToOneField('Groups', models.DO_NOTHING, db_column='groupid', primary_key=True) 596 | parent_group_prototypeid = models.ForeignKey('GroupPrototype', models.DO_NOTHING, db_column='parent_group_prototypeid') 597 | name = models.CharField(max_length=64) 598 | lastcheck = models.IntegerField() 599 | ts_delete = models.IntegerField() 600 | 601 | class Meta: 602 | managed = False 603 | db_table = 'group_discovery' 604 | 605 | 606 | class GroupPrototype(models.Model): 607 | group_prototypeid = models.BigIntegerField(primary_key=True) 608 | hostid = models.ForeignKey('Hosts', models.DO_NOTHING, db_column='hostid') 609 | name = models.CharField(max_length=255) 610 | groupid = models.ForeignKey('Groups', models.DO_NOTHING, db_column='groupid', blank=True, null=True) 611 | templateid = models.ForeignKey('self', models.DO_NOTHING, db_column='templateid', blank=True, null=True) 612 | 613 | class Meta: 614 | managed = False 615 | db_table = 'group_prototype' 616 | 617 | 618 | class Groups(models.Model): 619 | groupid = models.BigIntegerField(primary_key=True) 620 | name = models.CharField(max_length=255) 621 | internal = models.IntegerField() 622 | flags = models.IntegerField() 623 | 624 | class Meta: 625 | managed = False 626 | db_table = 'groups' 627 | 628 | 629 | class History(models.Model): 630 | itemid = models.BigIntegerField() 631 | clock = models.IntegerField() 632 | value = models.FloatField() 633 | ns = models.IntegerField() 634 | 635 | class Meta: 636 | managed = False 637 | db_table = 'history' 638 | 639 | 640 | class HistoryLog(models.Model): 641 | itemid = models.BigIntegerField() 642 | clock = models.IntegerField() 643 | timestamp = models.IntegerField() 644 | source = models.CharField(max_length=64) 645 | severity = models.IntegerField() 646 | value = models.TextField() 647 | logeventid = models.IntegerField() 648 | ns = models.IntegerField() 649 | 650 | class Meta: 651 | managed = False 652 | db_table = 'history_log' 653 | 654 | 655 | class HistoryStr(models.Model): 656 | itemid = models.BigIntegerField() 657 | clock = models.IntegerField() 658 | value = models.CharField(max_length=255) 659 | ns = models.IntegerField() 660 | 661 | class Meta: 662 | managed = False 663 | db_table = 'history_str' 664 | 665 | 666 | class HistoryText(models.Model): 667 | itemid = models.BigIntegerField() 668 | clock = models.IntegerField() 669 | value = models.TextField() 670 | ns = models.IntegerField() 671 | 672 | class Meta: 673 | managed = False 674 | db_table = 'history_text' 675 | 676 | 677 | class HistoryUint(models.Model): 678 | itemid = models.BigIntegerField() 679 | clock = models.IntegerField() 680 | value = models.BigIntegerField() 681 | ns = models.IntegerField() 682 | 683 | class Meta: 684 | managed = False 685 | db_table = 'history_uint' 686 | 687 | 688 | class HostDiscovery(models.Model): 689 | hostid = models.OneToOneField('Hosts', models.DO_NOTHING, db_column='hostid', primary_key=True, related_name="discovery_host") 690 | parent_hostid = models.ForeignKey('Hosts', models.DO_NOTHING, db_column='parent_hostid', blank=True, null=True, related_name="parent_host") 691 | parent_itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='parent_itemid', blank=True, null=True) 692 | host = models.CharField(max_length=64) 693 | lastcheck = models.IntegerField() 694 | ts_delete = models.IntegerField() 695 | 696 | class Meta: 697 | managed = False 698 | db_table = 'host_discovery' 699 | 700 | 701 | class HostInventory(models.Model): 702 | hostid = models.OneToOneField('Hosts', models.DO_NOTHING, db_column='hostid', primary_key=True) 703 | inventory_mode = models.IntegerField() 704 | type = models.CharField(max_length=64) 705 | type_full = models.CharField(max_length=64) 706 | name = models.CharField(max_length=64) 707 | alias = models.CharField(max_length=64) 708 | os = models.CharField(max_length=64) 709 | os_full = models.CharField(max_length=255) 710 | os_short = models.CharField(max_length=64) 711 | serialno_a = models.CharField(max_length=64) 712 | serialno_b = models.CharField(max_length=64) 713 | tag = models.CharField(max_length=64) 714 | asset_tag = models.CharField(max_length=64) 715 | macaddress_a = models.CharField(max_length=64) 716 | macaddress_b = models.CharField(max_length=64) 717 | hardware = models.CharField(max_length=255) 718 | hardware_full = models.TextField() 719 | software = models.CharField(max_length=255) 720 | software_full = models.TextField() 721 | software_app_a = models.CharField(max_length=64) 722 | software_app_b = models.CharField(max_length=64) 723 | software_app_c = models.CharField(max_length=64) 724 | software_app_d = models.CharField(max_length=64) 725 | software_app_e = models.CharField(max_length=64) 726 | contact = models.TextField() 727 | location = models.TextField() 728 | location_lat = models.CharField(max_length=16) 729 | location_lon = models.CharField(max_length=16) 730 | notes = models.TextField() 731 | chassis = models.CharField(max_length=64) 732 | model = models.CharField(max_length=64) 733 | hw_arch = models.CharField(max_length=32) 734 | vendor = models.CharField(max_length=64) 735 | contract_number = models.CharField(max_length=64) 736 | installer_name = models.CharField(max_length=64) 737 | deployment_status = models.CharField(max_length=64) 738 | url_a = models.CharField(max_length=255) 739 | url_b = models.CharField(max_length=255) 740 | url_c = models.CharField(max_length=255) 741 | host_networks = models.TextField() 742 | host_netmask = models.CharField(max_length=39) 743 | host_router = models.CharField(max_length=39) 744 | oob_ip = models.CharField(max_length=39) 745 | oob_netmask = models.CharField(max_length=39) 746 | oob_router = models.CharField(max_length=39) 747 | date_hw_purchase = models.CharField(max_length=64) 748 | date_hw_install = models.CharField(max_length=64) 749 | date_hw_expiry = models.CharField(max_length=64) 750 | date_hw_decomm = models.CharField(max_length=64) 751 | site_address_a = models.CharField(max_length=128) 752 | site_address_b = models.CharField(max_length=128) 753 | site_address_c = models.CharField(max_length=128) 754 | site_city = models.CharField(max_length=128) 755 | site_state = models.CharField(max_length=64) 756 | site_country = models.CharField(max_length=64) 757 | site_zip = models.CharField(max_length=64) 758 | site_rack = models.CharField(max_length=128) 759 | site_notes = models.TextField() 760 | poc_1_name = models.CharField(max_length=128) 761 | poc_1_email = models.CharField(max_length=128) 762 | poc_1_phone_a = models.CharField(max_length=64) 763 | poc_1_phone_b = models.CharField(max_length=64) 764 | poc_1_cell = models.CharField(max_length=64) 765 | poc_1_screen = models.CharField(max_length=64) 766 | poc_1_notes = models.TextField() 767 | poc_2_name = models.CharField(max_length=128) 768 | poc_2_email = models.CharField(max_length=128) 769 | poc_2_phone_a = models.CharField(max_length=64) 770 | poc_2_phone_b = models.CharField(max_length=64) 771 | poc_2_cell = models.CharField(max_length=64) 772 | poc_2_screen = models.CharField(max_length=64) 773 | poc_2_notes = models.TextField() 774 | 775 | class Meta: 776 | managed = False 777 | db_table = 'host_inventory' 778 | 779 | 780 | class Hostmacro(models.Model): 781 | hostmacroid = models.BigIntegerField(primary_key=True) 782 | hostid = models.ForeignKey('Hosts', models.DO_NOTHING, db_column='hostid') 783 | macro = models.CharField(max_length=255) 784 | value = models.CharField(max_length=255) 785 | 786 | class Meta: 787 | managed = False 788 | db_table = 'hostmacro' 789 | unique_together = (('hostid', 'macro'),) 790 | 791 | 792 | class Hosts(models.Model): 793 | hostid = models.BigIntegerField(primary_key=True) 794 | proxy_hostid = models.ForeignKey('self', models.DO_NOTHING, db_column='proxy_hostid', blank=True, null=True, related_name="proxy_host") 795 | host = models.CharField(max_length=128) 796 | status = models.IntegerField() 797 | disable_until = models.IntegerField() 798 | error = models.CharField(max_length=2048) 799 | available = models.IntegerField() 800 | errors_from = models.IntegerField() 801 | lastaccess = models.IntegerField() 802 | ipmi_authtype = models.IntegerField() 803 | ipmi_privilege = models.IntegerField() 804 | ipmi_username = models.CharField(max_length=16) 805 | ipmi_password = models.CharField(max_length=20) 806 | ipmi_disable_until = models.IntegerField() 807 | ipmi_available = models.IntegerField() 808 | snmp_disable_until = models.IntegerField() 809 | snmp_available = models.IntegerField() 810 | maintenanceid = models.ForeignKey('Maintenances', models.DO_NOTHING, db_column='maintenanceid', blank=True, null=True) 811 | maintenance_status = models.IntegerField() 812 | maintenance_type = models.IntegerField() 813 | maintenance_from = models.IntegerField() 814 | ipmi_errors_from = models.IntegerField() 815 | snmp_errors_from = models.IntegerField() 816 | ipmi_error = models.CharField(max_length=2048) 817 | snmp_error = models.CharField(max_length=2048) 818 | jmx_disable_until = models.IntegerField() 819 | jmx_available = models.IntegerField() 820 | jmx_errors_from = models.IntegerField() 821 | jmx_error = models.CharField(max_length=2048) 822 | name = models.CharField(max_length=128) 823 | flags = models.IntegerField() 824 | templateid = models.ForeignKey('self', models.DO_NOTHING, db_column='templateid', blank=True, null=True) 825 | description = models.TextField() 826 | tls_connect = models.IntegerField() 827 | tls_accept = models.IntegerField() 828 | tls_issuer = models.CharField(max_length=1024) 829 | tls_subject = models.CharField(max_length=1024) 830 | tls_psk_identity = models.CharField(max_length=128) 831 | tls_psk = models.CharField(max_length=512) 832 | 833 | class Meta: 834 | managed = False 835 | db_table = 'hosts' 836 | 837 | 838 | class HostsGroups(models.Model): 839 | hostgroupid = models.BigIntegerField(primary_key=True) 840 | hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='hostid') 841 | groupid = models.ForeignKey(Groups, models.DO_NOTHING, db_column='groupid') 842 | 843 | class Meta: 844 | managed = False 845 | db_table = 'hosts_groups' 846 | unique_together = (('hostid', 'groupid'),) 847 | 848 | 849 | class HostsTemplates(models.Model): 850 | hosttemplateid = models.BigIntegerField(primary_key=True) 851 | hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='hostid', related_name="host_template") 852 | templateid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='templateid') 853 | 854 | class Meta: 855 | managed = False 856 | db_table = 'hosts_templates' 857 | unique_together = (('hostid', 'templateid'),) 858 | 859 | 860 | class Housekeeper(models.Model): 861 | housekeeperid = models.BigIntegerField(primary_key=True) 862 | tablename = models.CharField(max_length=64) 863 | field = models.CharField(max_length=64) 864 | value = models.BigIntegerField() 865 | 866 | class Meta: 867 | managed = False 868 | db_table = 'housekeeper' 869 | 870 | 871 | class Httpstep(models.Model): 872 | httpstepid = models.BigIntegerField(primary_key=True) 873 | httptestid = models.ForeignKey('Httptest', models.DO_NOTHING, db_column='httptestid') 874 | name = models.CharField(max_length=64) 875 | no = models.IntegerField() 876 | url = models.CharField(max_length=2048) 877 | timeout = models.CharField(max_length=255) 878 | posts = models.TextField() 879 | required = models.CharField(max_length=255) 880 | status_codes = models.CharField(max_length=255) 881 | follow_redirects = models.IntegerField() 882 | retrieve_mode = models.IntegerField() 883 | post_type = models.IntegerField() 884 | 885 | class Meta: 886 | managed = False 887 | db_table = 'httpstep' 888 | 889 | 890 | class HttpstepField(models.Model): 891 | httpstep_fieldid = models.BigIntegerField(primary_key=True) 892 | httpstepid = models.ForeignKey(Httpstep, models.DO_NOTHING, db_column='httpstepid') 893 | type = models.IntegerField() 894 | name = models.CharField(max_length=255) 895 | value = models.TextField() 896 | 897 | class Meta: 898 | managed = False 899 | db_table = 'httpstep_field' 900 | 901 | 902 | class Httpstepitem(models.Model): 903 | httpstepitemid = models.BigIntegerField(primary_key=True) 904 | httpstepid = models.ForeignKey(Httpstep, models.DO_NOTHING, db_column='httpstepid') 905 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 906 | type = models.IntegerField() 907 | 908 | class Meta: 909 | managed = False 910 | db_table = 'httpstepitem' 911 | unique_together = (('httpstepid', 'itemid'),) 912 | 913 | 914 | class Httptest(models.Model): 915 | httptestid = models.BigIntegerField(primary_key=True) 916 | name = models.CharField(max_length=64) 917 | applicationid = models.ForeignKey(Applications, models.DO_NOTHING, db_column='applicationid', blank=True, null=True) 918 | nextcheck = models.IntegerField() 919 | delay = models.CharField(max_length=255) 920 | status = models.IntegerField() 921 | agent = models.CharField(max_length=255) 922 | authentication = models.IntegerField() 923 | http_user = models.CharField(max_length=64) 924 | http_password = models.CharField(max_length=64) 925 | hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='hostid') 926 | templateid = models.ForeignKey('self', models.DO_NOTHING, db_column='templateid', blank=True, null=True) 927 | http_proxy = models.CharField(max_length=255) 928 | retries = models.IntegerField() 929 | ssl_cert_file = models.CharField(max_length=255) 930 | ssl_key_file = models.CharField(max_length=255) 931 | ssl_key_password = models.CharField(max_length=64) 932 | verify_peer = models.IntegerField() 933 | verify_host = models.IntegerField() 934 | 935 | class Meta: 936 | managed = False 937 | db_table = 'httptest' 938 | unique_together = (('hostid', 'name'),) 939 | 940 | 941 | class HttptestField(models.Model): 942 | httptest_fieldid = models.BigIntegerField(primary_key=True) 943 | httptestid = models.ForeignKey(Httptest, models.DO_NOTHING, db_column='httptestid') 944 | type = models.IntegerField() 945 | name = models.CharField(max_length=255) 946 | value = models.TextField() 947 | 948 | class Meta: 949 | managed = False 950 | db_table = 'httptest_field' 951 | 952 | 953 | class Httptestitem(models.Model): 954 | httptestitemid = models.BigIntegerField(primary_key=True) 955 | httptestid = models.ForeignKey(Httptest, models.DO_NOTHING, db_column='httptestid') 956 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 957 | type = models.IntegerField() 958 | 959 | class Meta: 960 | managed = False 961 | db_table = 'httptestitem' 962 | unique_together = (('httptestid', 'itemid'),) 963 | 964 | 965 | class IconMap(models.Model): 966 | iconmapid = models.BigIntegerField(primary_key=True) 967 | name = models.CharField(unique=True, max_length=64) 968 | default_iconid = models.ForeignKey('Images', models.DO_NOTHING, db_column='default_iconid') 969 | 970 | class Meta: 971 | managed = False 972 | db_table = 'icon_map' 973 | 974 | 975 | class IconMapping(models.Model): 976 | iconmappingid = models.BigIntegerField(primary_key=True) 977 | iconmapid = models.ForeignKey(IconMap, models.DO_NOTHING, db_column='iconmapid') 978 | iconid = models.ForeignKey('Images', models.DO_NOTHING, db_column='iconid') 979 | inventory_link = models.IntegerField() 980 | expression = models.CharField(max_length=64) 981 | sortorder = models.IntegerField() 982 | 983 | class Meta: 984 | managed = False 985 | db_table = 'icon_mapping' 986 | 987 | 988 | class Ids(models.Model): 989 | table_name = models.CharField(primary_key=True, max_length=64) 990 | field_name = models.CharField(max_length=64) 991 | nextid = models.BigIntegerField() 992 | 993 | class Meta: 994 | managed = False 995 | db_table = 'ids' 996 | unique_together = (('table_name', 'field_name'),) 997 | 998 | 999 | class Images(models.Model): 1000 | imageid = models.BigIntegerField(primary_key=True) 1001 | imagetype = models.IntegerField() 1002 | name = models.CharField(unique=True, max_length=64) 1003 | image = models.TextField() 1004 | 1005 | class Meta: 1006 | managed = False 1007 | db_table = 'images' 1008 | 1009 | 1010 | class Interface(models.Model): 1011 | interfaceid = models.BigIntegerField(primary_key=True) 1012 | hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='hostid') 1013 | main = models.IntegerField() 1014 | type = models.IntegerField() 1015 | useip = models.IntegerField() 1016 | ip = models.CharField(max_length=64) 1017 | dns = models.CharField(max_length=64) 1018 | port = models.CharField(max_length=64) 1019 | bulk = models.IntegerField() 1020 | 1021 | class Meta: 1022 | managed = False 1023 | db_table = 'interface' 1024 | 1025 | 1026 | class InterfaceDiscovery(models.Model): 1027 | interfaceid = models.OneToOneField(Interface, models.DO_NOTHING, db_column='interfaceid', primary_key=True, related_name="interface") 1028 | parent_interfaceid = models.ForeignKey(Interface, models.DO_NOTHING, db_column='parent_interfaceid', related_name="parent_interface") 1029 | 1030 | class Meta: 1031 | managed = False 1032 | db_table = 'interface_discovery' 1033 | 1034 | 1035 | class ItemApplicationPrototype(models.Model): 1036 | item_application_prototypeid = models.BigIntegerField(primary_key=True) 1037 | application_prototypeid = models.ForeignKey(ApplicationPrototype, models.DO_NOTHING, db_column='application_prototypeid') 1038 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 1039 | 1040 | class Meta: 1041 | managed = False 1042 | db_table = 'item_application_prototype' 1043 | unique_together = (('application_prototypeid', 'itemid'),) 1044 | 1045 | 1046 | class ItemCondition(models.Model): 1047 | item_conditionid = models.BigIntegerField(primary_key=True) 1048 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 1049 | operator = models.IntegerField() 1050 | macro = models.CharField(max_length=64) 1051 | value = models.CharField(max_length=255) 1052 | 1053 | class Meta: 1054 | managed = False 1055 | db_table = 'item_condition' 1056 | 1057 | 1058 | class ItemDiscovery(models.Model): 1059 | itemdiscoveryid = models.BigIntegerField(primary_key=True) 1060 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid', related_name="discovery_item") 1061 | parent_itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='parent_itemid', related_name="discovery_parent_item") 1062 | key_field = models.CharField(db_column='key_', max_length=255) # Field renamed because it ended with '_'. 1063 | lastcheck = models.IntegerField() 1064 | ts_delete = models.IntegerField() 1065 | 1066 | class Meta: 1067 | managed = False 1068 | db_table = 'item_discovery' 1069 | unique_together = (('itemid', 'parent_itemid'),) 1070 | 1071 | 1072 | class ItemPreproc(models.Model): 1073 | item_preprocid = models.BigIntegerField(primary_key=True) 1074 | itemid = models.ForeignKey('Items', models.DO_NOTHING, db_column='itemid') 1075 | step = models.IntegerField() 1076 | type = models.IntegerField() 1077 | params = models.CharField(max_length=255) 1078 | 1079 | class Meta: 1080 | managed = False 1081 | db_table = 'item_preproc' 1082 | 1083 | 1084 | class Items(models.Model): 1085 | itemid = models.BigIntegerField(primary_key=True) 1086 | type = models.IntegerField() 1087 | snmp_community = models.CharField(max_length=64) 1088 | snmp_oid = models.CharField(max_length=512) 1089 | hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='hostid') 1090 | name = models.CharField(max_length=255) 1091 | key_field = models.CharField(db_column='key_', max_length=255) # Field renamed because it ended with '_'. 1092 | delay = models.CharField(max_length=1024) 1093 | history = models.CharField(max_length=255) 1094 | trends = models.CharField(max_length=255) 1095 | status = models.IntegerField() 1096 | value_type = models.IntegerField() 1097 | trapper_hosts = models.CharField(max_length=255) 1098 | units = models.CharField(max_length=255) 1099 | snmpv3_securityname = models.CharField(max_length=64) 1100 | snmpv3_securitylevel = models.IntegerField() 1101 | snmpv3_authpassphrase = models.CharField(max_length=64) 1102 | snmpv3_privpassphrase = models.CharField(max_length=64) 1103 | formula = models.CharField(max_length=255) 1104 | error = models.CharField(max_length=2048) 1105 | lastlogsize = models.BigIntegerField() 1106 | logtimefmt = models.CharField(max_length=64) 1107 | templateid = models.ForeignKey('self', models.DO_NOTHING, db_column='templateid', blank=True, null=True, related_name="template_item") 1108 | valuemapid = models.ForeignKey('Valuemaps', models.DO_NOTHING, db_column='valuemapid', blank=True, null=True) 1109 | params = models.TextField() 1110 | ipmi_sensor = models.CharField(max_length=128) 1111 | authtype = models.IntegerField() 1112 | username = models.CharField(max_length=64) 1113 | password = models.CharField(max_length=64) 1114 | publickey = models.CharField(max_length=64) 1115 | privatekey = models.CharField(max_length=64) 1116 | mtime = models.IntegerField() 1117 | flags = models.IntegerField() 1118 | interfaceid = models.ForeignKey(Interface, models.DO_NOTHING, db_column='interfaceid', blank=True, null=True) 1119 | port = models.CharField(max_length=64) 1120 | description = models.TextField() 1121 | inventory_link = models.IntegerField() 1122 | lifetime = models.CharField(max_length=255) 1123 | snmpv3_authprotocol = models.IntegerField() 1124 | snmpv3_privprotocol = models.IntegerField() 1125 | state = models.IntegerField() 1126 | snmpv3_contextname = models.CharField(max_length=255) 1127 | evaltype = models.IntegerField() 1128 | jmx_endpoint = models.CharField(max_length=255) 1129 | master_itemid = models.ForeignKey('self', models.DO_NOTHING, db_column='master_itemid', blank=True, null=True, related_name="master_item") 1130 | 1131 | class Meta: 1132 | managed = False 1133 | db_table = 'items' 1134 | unique_together = (('hostid', 'key_field'),) 1135 | 1136 | 1137 | class ItemsApplications(models.Model): 1138 | itemappid = models.BigIntegerField(primary_key=True) 1139 | applicationid = models.ForeignKey(Applications, models.DO_NOTHING, db_column='applicationid') 1140 | itemid = models.ForeignKey(Items, models.DO_NOTHING, db_column='itemid') 1141 | 1142 | class Meta: 1143 | managed = False 1144 | db_table = 'items_applications' 1145 | unique_together = (('applicationid', 'itemid'),) 1146 | 1147 | 1148 | class Maintenances(models.Model): 1149 | maintenanceid = models.BigIntegerField(primary_key=True) 1150 | name = models.CharField(unique=True, max_length=128) 1151 | maintenance_type = models.IntegerField() 1152 | description = models.TextField() 1153 | active_since = models.IntegerField() 1154 | active_till = models.IntegerField() 1155 | 1156 | class Meta: 1157 | managed = False 1158 | db_table = 'maintenances' 1159 | 1160 | 1161 | class MaintenancesGroups(models.Model): 1162 | maintenance_groupid = models.BigIntegerField(primary_key=True) 1163 | maintenanceid = models.ForeignKey(Maintenances, models.DO_NOTHING, db_column='maintenanceid') 1164 | groupid = models.ForeignKey(Groups, models.DO_NOTHING, db_column='groupid') 1165 | 1166 | class Meta: 1167 | managed = False 1168 | db_table = 'maintenances_groups' 1169 | unique_together = (('maintenanceid', 'groupid'),) 1170 | 1171 | 1172 | class MaintenancesHosts(models.Model): 1173 | maintenance_hostid = models.BigIntegerField(primary_key=True) 1174 | maintenanceid = models.ForeignKey(Maintenances, models.DO_NOTHING, db_column='maintenanceid') 1175 | hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='hostid') 1176 | 1177 | class Meta: 1178 | managed = False 1179 | db_table = 'maintenances_hosts' 1180 | unique_together = (('maintenanceid', 'hostid'),) 1181 | 1182 | 1183 | class MaintenancesWindows(models.Model): 1184 | maintenance_timeperiodid = models.BigIntegerField(primary_key=True) 1185 | maintenanceid = models.ForeignKey(Maintenances, models.DO_NOTHING, db_column='maintenanceid') 1186 | timeperiodid = models.ForeignKey('Timeperiods', models.DO_NOTHING, db_column='timeperiodid') 1187 | 1188 | class Meta: 1189 | managed = False 1190 | db_table = 'maintenances_windows' 1191 | unique_together = (('maintenanceid', 'timeperiodid'),) 1192 | 1193 | 1194 | class Mappings(models.Model): 1195 | mappingid = models.BigIntegerField(primary_key=True) 1196 | valuemapid = models.ForeignKey('Valuemaps', models.DO_NOTHING, db_column='valuemapid') 1197 | value = models.CharField(max_length=64) 1198 | newvalue = models.CharField(max_length=64) 1199 | 1200 | class Meta: 1201 | managed = False 1202 | db_table = 'mappings' 1203 | 1204 | 1205 | class Media(models.Model): 1206 | mediaid = models.BigIntegerField(primary_key=True) 1207 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1208 | mediatypeid = models.ForeignKey('MediaType', models.DO_NOTHING, db_column='mediatypeid') 1209 | sendto = models.CharField(max_length=100) 1210 | active = models.IntegerField() 1211 | severity = models.IntegerField() 1212 | period = models.CharField(max_length=1024) 1213 | 1214 | class Meta: 1215 | managed = False 1216 | db_table = 'media' 1217 | 1218 | 1219 | class MediaType(models.Model): 1220 | mediatypeid = models.BigIntegerField(primary_key=True) 1221 | type = models.IntegerField() 1222 | description = models.CharField(unique=True, max_length=100) 1223 | smtp_server = models.CharField(max_length=255) 1224 | smtp_helo = models.CharField(max_length=255) 1225 | smtp_email = models.CharField(max_length=255) 1226 | exec_path = models.CharField(max_length=255) 1227 | gsm_modem = models.CharField(max_length=255) 1228 | username = models.CharField(max_length=255) 1229 | passwd = models.CharField(max_length=255) 1230 | status = models.IntegerField() 1231 | smtp_port = models.IntegerField() 1232 | smtp_security = models.IntegerField() 1233 | smtp_verify_peer = models.IntegerField() 1234 | smtp_verify_host = models.IntegerField() 1235 | smtp_authentication = models.IntegerField() 1236 | exec_params = models.CharField(max_length=255) 1237 | maxsessions = models.IntegerField() 1238 | maxattempts = models.IntegerField() 1239 | attempt_interval = models.CharField(max_length=32) 1240 | 1241 | class Meta: 1242 | managed = False 1243 | db_table = 'media_type' 1244 | 1245 | 1246 | class Opcommand(models.Model): 1247 | operationid = models.OneToOneField('Operations', models.DO_NOTHING, db_column='operationid', primary_key=True) 1248 | type = models.IntegerField() 1249 | scriptid = models.ForeignKey('Scripts', models.DO_NOTHING, db_column='scriptid', blank=True, null=True) 1250 | execute_on = models.IntegerField() 1251 | port = models.CharField(max_length=64) 1252 | authtype = models.IntegerField() 1253 | username = models.CharField(max_length=64) 1254 | password = models.CharField(max_length=64) 1255 | publickey = models.CharField(max_length=64) 1256 | privatekey = models.CharField(max_length=64) 1257 | command = models.TextField() 1258 | 1259 | class Meta: 1260 | managed = False 1261 | db_table = 'opcommand' 1262 | 1263 | 1264 | class OpcommandGrp(models.Model): 1265 | opcommand_grpid = models.BigIntegerField(primary_key=True) 1266 | operationid = models.ForeignKey('Operations', models.DO_NOTHING, db_column='operationid') 1267 | groupid = models.ForeignKey(Groups, models.DO_NOTHING, db_column='groupid') 1268 | 1269 | class Meta: 1270 | managed = False 1271 | db_table = 'opcommand_grp' 1272 | 1273 | 1274 | class OpcommandHst(models.Model): 1275 | opcommand_hstid = models.BigIntegerField(primary_key=True) 1276 | operationid = models.ForeignKey('Operations', models.DO_NOTHING, db_column='operationid') 1277 | hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='hostid', blank=True, null=True) 1278 | 1279 | class Meta: 1280 | managed = False 1281 | db_table = 'opcommand_hst' 1282 | 1283 | 1284 | class Opconditions(models.Model): 1285 | opconditionid = models.BigIntegerField(primary_key=True) 1286 | operationid = models.ForeignKey('Operations', models.DO_NOTHING, db_column='operationid') 1287 | conditiontype = models.IntegerField() 1288 | operator = models.IntegerField() 1289 | value = models.CharField(max_length=255) 1290 | 1291 | class Meta: 1292 | managed = False 1293 | db_table = 'opconditions' 1294 | 1295 | 1296 | class Operations(models.Model): 1297 | operationid = models.BigIntegerField(primary_key=True) 1298 | actionid = models.ForeignKey(Actions, models.DO_NOTHING, db_column='actionid') 1299 | operationtype = models.IntegerField() 1300 | esc_period = models.CharField(max_length=255) 1301 | esc_step_from = models.IntegerField() 1302 | esc_step_to = models.IntegerField() 1303 | evaltype = models.IntegerField() 1304 | recovery = models.IntegerField() 1305 | 1306 | class Meta: 1307 | managed = False 1308 | db_table = 'operations' 1309 | 1310 | 1311 | class Opgroup(models.Model): 1312 | opgroupid = models.BigIntegerField(primary_key=True) 1313 | operationid = models.ForeignKey(Operations, models.DO_NOTHING, db_column='operationid') 1314 | groupid = models.ForeignKey(Groups, models.DO_NOTHING, db_column='groupid') 1315 | 1316 | class Meta: 1317 | managed = False 1318 | db_table = 'opgroup' 1319 | unique_together = (('operationid', 'groupid'),) 1320 | 1321 | 1322 | class Opinventory(models.Model): 1323 | operationid = models.OneToOneField(Operations, models.DO_NOTHING, db_column='operationid', primary_key=True) 1324 | inventory_mode = models.IntegerField() 1325 | 1326 | class Meta: 1327 | managed = False 1328 | db_table = 'opinventory' 1329 | 1330 | 1331 | class Opmessage(models.Model): 1332 | operationid = models.OneToOneField(Operations, models.DO_NOTHING, db_column='operationid', primary_key=True) 1333 | default_msg = models.IntegerField() 1334 | subject = models.CharField(max_length=255) 1335 | message = models.TextField() 1336 | mediatypeid = models.ForeignKey(MediaType, models.DO_NOTHING, db_column='mediatypeid', blank=True, null=True) 1337 | 1338 | class Meta: 1339 | managed = False 1340 | db_table = 'opmessage' 1341 | 1342 | 1343 | class OpmessageGrp(models.Model): 1344 | opmessage_grpid = models.BigIntegerField(primary_key=True) 1345 | operationid = models.ForeignKey(Operations, models.DO_NOTHING, db_column='operationid') 1346 | usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='usrgrpid') 1347 | 1348 | class Meta: 1349 | managed = False 1350 | db_table = 'opmessage_grp' 1351 | unique_together = (('operationid', 'usrgrpid'),) 1352 | 1353 | 1354 | class OpmessageUsr(models.Model): 1355 | opmessage_usrid = models.BigIntegerField(primary_key=True) 1356 | operationid = models.ForeignKey(Operations, models.DO_NOTHING, db_column='operationid') 1357 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1358 | 1359 | class Meta: 1360 | managed = False 1361 | db_table = 'opmessage_usr' 1362 | unique_together = (('operationid', 'userid'),) 1363 | 1364 | 1365 | class Optemplate(models.Model): 1366 | optemplateid = models.BigIntegerField(primary_key=True) 1367 | operationid = models.ForeignKey(Operations, models.DO_NOTHING, db_column='operationid') 1368 | templateid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='templateid') 1369 | 1370 | class Meta: 1371 | managed = False 1372 | db_table = 'optemplate' 1373 | unique_together = (('operationid', 'templateid'),) 1374 | 1375 | 1376 | class Problem(models.Model): 1377 | eventid = models.OneToOneField(Events, models.DO_NOTHING, db_column='eventid', primary_key=True, related_name="problem_event") 1378 | source = models.IntegerField() 1379 | object = models.IntegerField() 1380 | objectid = models.BigIntegerField() 1381 | clock = models.IntegerField() 1382 | ns = models.IntegerField() 1383 | r_eventid = models.ForeignKey(Events, models.DO_NOTHING, db_column='r_eventid', blank=True, null=True, related_name="problem_r_event") 1384 | r_clock = models.IntegerField() 1385 | r_ns = models.IntegerField() 1386 | correlationid = models.BigIntegerField(blank=True, null=True) 1387 | userid = models.BigIntegerField(blank=True, null=True) 1388 | 1389 | class Meta: 1390 | managed = False 1391 | db_table = 'problem' 1392 | 1393 | 1394 | class ProblemTag(models.Model): 1395 | problemtagid = models.BigIntegerField(primary_key=True) 1396 | eventid = models.ForeignKey(Problem, models.DO_NOTHING, db_column='eventid') 1397 | tag = models.CharField(max_length=255) 1398 | value = models.CharField(max_length=255) 1399 | 1400 | class Meta: 1401 | managed = False 1402 | db_table = 'problem_tag' 1403 | 1404 | 1405 | class Profiles(models.Model): 1406 | profileid = models.BigIntegerField(primary_key=True) 1407 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1408 | idx = models.CharField(max_length=96) 1409 | idx2 = models.BigIntegerField() 1410 | value_id = models.BigIntegerField() 1411 | value_int = models.IntegerField() 1412 | value_str = models.CharField(max_length=255) 1413 | source = models.CharField(max_length=96) 1414 | type = models.IntegerField() 1415 | 1416 | class Meta: 1417 | managed = False 1418 | db_table = 'profiles' 1419 | 1420 | 1421 | class ProxyAutoregHost(models.Model): 1422 | id = models.BigAutoField(primary_key=True) 1423 | clock = models.IntegerField() 1424 | host = models.CharField(max_length=64) 1425 | listen_ip = models.CharField(max_length=39) 1426 | listen_port = models.IntegerField() 1427 | listen_dns = models.CharField(max_length=64) 1428 | host_metadata = models.CharField(max_length=255) 1429 | 1430 | class Meta: 1431 | managed = False 1432 | db_table = 'proxy_autoreg_host' 1433 | 1434 | 1435 | class ProxyDhistory(models.Model): 1436 | id = models.BigAutoField(primary_key=True) 1437 | clock = models.IntegerField() 1438 | druleid = models.BigIntegerField() 1439 | ip = models.CharField(max_length=39) 1440 | port = models.IntegerField() 1441 | value = models.CharField(max_length=255) 1442 | status = models.IntegerField() 1443 | dcheckid = models.BigIntegerField(blank=True, null=True) 1444 | dns = models.CharField(max_length=64) 1445 | 1446 | class Meta: 1447 | managed = False 1448 | db_table = 'proxy_dhistory' 1449 | 1450 | 1451 | class ProxyHistory(models.Model): 1452 | id = models.BigAutoField(primary_key=True) 1453 | itemid = models.BigIntegerField() 1454 | clock = models.IntegerField() 1455 | timestamp = models.IntegerField() 1456 | source = models.CharField(max_length=64) 1457 | severity = models.IntegerField() 1458 | value = models.TextField() 1459 | logeventid = models.IntegerField() 1460 | ns = models.IntegerField() 1461 | state = models.IntegerField() 1462 | lastlogsize = models.BigIntegerField() 1463 | mtime = models.IntegerField() 1464 | flags = models.IntegerField() 1465 | 1466 | class Meta: 1467 | managed = False 1468 | db_table = 'proxy_history' 1469 | 1470 | 1471 | class Regexps(models.Model): 1472 | regexpid = models.BigIntegerField(primary_key=True) 1473 | name = models.CharField(unique=True, max_length=128) 1474 | test_string = models.TextField() 1475 | 1476 | class Meta: 1477 | managed = False 1478 | db_table = 'regexps' 1479 | 1480 | 1481 | class Rights(models.Model): 1482 | rightid = models.BigIntegerField(primary_key=True) 1483 | groupid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='groupid') 1484 | permission = models.IntegerField() 1485 | id = models.ForeignKey(Groups, models.DO_NOTHING, db_column='id') 1486 | 1487 | class Meta: 1488 | managed = False 1489 | db_table = 'rights' 1490 | 1491 | 1492 | class ScreenUser(models.Model): 1493 | screenuserid = models.BigIntegerField(primary_key=True) 1494 | screenid = models.ForeignKey('Screens', models.DO_NOTHING, db_column='screenid') 1495 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1496 | permission = models.IntegerField() 1497 | 1498 | class Meta: 1499 | managed = False 1500 | db_table = 'screen_user' 1501 | unique_together = (('screenid', 'userid'),) 1502 | 1503 | 1504 | class ScreenUsrgrp(models.Model): 1505 | screenusrgrpid = models.BigIntegerField(primary_key=True) 1506 | screenid = models.ForeignKey('Screens', models.DO_NOTHING, db_column='screenid') 1507 | usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='usrgrpid') 1508 | permission = models.IntegerField() 1509 | 1510 | class Meta: 1511 | managed = False 1512 | db_table = 'screen_usrgrp' 1513 | unique_together = (('screenid', 'usrgrpid'),) 1514 | 1515 | 1516 | class Screens(models.Model): 1517 | screenid = models.BigIntegerField(primary_key=True) 1518 | name = models.CharField(max_length=255) 1519 | hsize = models.IntegerField() 1520 | vsize = models.IntegerField() 1521 | templateid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='templateid', blank=True, null=True) 1522 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid', blank=True, null=True) 1523 | private = models.IntegerField() 1524 | 1525 | class Meta: 1526 | managed = False 1527 | db_table = 'screens' 1528 | 1529 | 1530 | class ScreensItems(models.Model): 1531 | screenitemid = models.BigIntegerField(primary_key=True) 1532 | screenid = models.ForeignKey(Screens, models.DO_NOTHING, db_column='screenid') 1533 | resourcetype = models.IntegerField() 1534 | resourceid = models.BigIntegerField() 1535 | width = models.IntegerField() 1536 | height = models.IntegerField() 1537 | x = models.IntegerField() 1538 | y = models.IntegerField() 1539 | colspan = models.IntegerField() 1540 | rowspan = models.IntegerField() 1541 | elements = models.IntegerField() 1542 | valign = models.IntegerField() 1543 | halign = models.IntegerField() 1544 | style = models.IntegerField() 1545 | url = models.CharField(max_length=255) 1546 | dynamic = models.IntegerField() 1547 | sort_triggers = models.IntegerField() 1548 | application = models.CharField(max_length=255) 1549 | max_columns = models.IntegerField() 1550 | 1551 | class Meta: 1552 | managed = False 1553 | db_table = 'screens_items' 1554 | 1555 | 1556 | class Scripts(models.Model): 1557 | scriptid = models.BigIntegerField(primary_key=True) 1558 | name = models.CharField(unique=True, max_length=255) 1559 | command = models.CharField(max_length=255) 1560 | host_access = models.IntegerField() 1561 | usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='usrgrpid', blank=True, null=True) 1562 | groupid = models.ForeignKey(Groups, models.DO_NOTHING, db_column='groupid', blank=True, null=True) 1563 | description = models.TextField() 1564 | confirmation = models.CharField(max_length=255) 1565 | type = models.IntegerField() 1566 | execute_on = models.IntegerField() 1567 | 1568 | class Meta: 1569 | managed = False 1570 | db_table = 'scripts' 1571 | 1572 | 1573 | class ServiceAlarms(models.Model): 1574 | servicealarmid = models.BigIntegerField(primary_key=True) 1575 | serviceid = models.ForeignKey('Services', models.DO_NOTHING, db_column='serviceid') 1576 | clock = models.IntegerField() 1577 | value = models.IntegerField() 1578 | 1579 | class Meta: 1580 | managed = False 1581 | db_table = 'service_alarms' 1582 | 1583 | 1584 | class Services(models.Model): 1585 | serviceid = models.BigIntegerField(primary_key=True) 1586 | name = models.CharField(max_length=128) 1587 | status = models.IntegerField() 1588 | algorithm = models.IntegerField() 1589 | triggerid = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='triggerid', blank=True, null=True) 1590 | showsla = models.IntegerField() 1591 | goodsla = models.FloatField() 1592 | sortorder = models.IntegerField() 1593 | 1594 | class Meta: 1595 | managed = False 1596 | db_table = 'services' 1597 | 1598 | 1599 | class ServicesLinks(models.Model): 1600 | linkid = models.BigIntegerField(primary_key=True) 1601 | serviceupid = models.ForeignKey(Services, models.DO_NOTHING, db_column='serviceupid', related_name="service_up_link") 1602 | servicedownid = models.ForeignKey(Services, models.DO_NOTHING, db_column='servicedownid', related_name="service_down_link") 1603 | soft = models.IntegerField() 1604 | 1605 | class Meta: 1606 | managed = False 1607 | db_table = 'services_links' 1608 | unique_together = (('serviceupid', 'servicedownid'),) 1609 | 1610 | 1611 | class ServicesTimes(models.Model): 1612 | timeid = models.BigIntegerField(primary_key=True) 1613 | serviceid = models.ForeignKey(Services, models.DO_NOTHING, db_column='serviceid') 1614 | type = models.IntegerField() 1615 | ts_from = models.IntegerField() 1616 | ts_to = models.IntegerField() 1617 | note = models.CharField(max_length=255) 1618 | 1619 | class Meta: 1620 | managed = False 1621 | db_table = 'services_times' 1622 | 1623 | 1624 | class Sessions(models.Model): 1625 | sessionid = models.CharField(primary_key=True, max_length=32) 1626 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1627 | lastaccess = models.IntegerField() 1628 | status = models.IntegerField() 1629 | 1630 | class Meta: 1631 | managed = False 1632 | db_table = 'sessions' 1633 | 1634 | 1635 | class Slides(models.Model): 1636 | slideid = models.BigIntegerField(primary_key=True) 1637 | slideshowid = models.ForeignKey('Slideshows', models.DO_NOTHING, db_column='slideshowid') 1638 | screenid = models.ForeignKey(Screens, models.DO_NOTHING, db_column='screenid') 1639 | step = models.IntegerField() 1640 | delay = models.CharField(max_length=32) 1641 | 1642 | class Meta: 1643 | managed = False 1644 | db_table = 'slides' 1645 | 1646 | 1647 | class SlideshowUser(models.Model): 1648 | slideshowuserid = models.BigIntegerField(primary_key=True) 1649 | slideshowid = models.ForeignKey('Slideshows', models.DO_NOTHING, db_column='slideshowid') 1650 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1651 | permission = models.IntegerField() 1652 | 1653 | class Meta: 1654 | managed = False 1655 | db_table = 'slideshow_user' 1656 | unique_together = (('slideshowid', 'userid'),) 1657 | 1658 | 1659 | class SlideshowUsrgrp(models.Model): 1660 | slideshowusrgrpid = models.BigIntegerField(primary_key=True) 1661 | slideshowid = models.ForeignKey('Slideshows', models.DO_NOTHING, db_column='slideshowid') 1662 | usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='usrgrpid') 1663 | permission = models.IntegerField() 1664 | 1665 | class Meta: 1666 | managed = False 1667 | db_table = 'slideshow_usrgrp' 1668 | unique_together = (('slideshowid', 'usrgrpid'),) 1669 | 1670 | 1671 | class Slideshows(models.Model): 1672 | slideshowid = models.BigIntegerField(primary_key=True) 1673 | name = models.CharField(unique=True, max_length=255) 1674 | delay = models.CharField(max_length=32) 1675 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1676 | private = models.IntegerField() 1677 | 1678 | class Meta: 1679 | managed = False 1680 | db_table = 'slideshows' 1681 | 1682 | 1683 | class SysmapElementTrigger(models.Model): 1684 | selement_triggerid = models.BigIntegerField(primary_key=True) 1685 | selementid = models.ForeignKey('SysmapsElements', models.DO_NOTHING, db_column='selementid') 1686 | triggerid = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='triggerid') 1687 | 1688 | class Meta: 1689 | managed = False 1690 | db_table = 'sysmap_element_trigger' 1691 | unique_together = (('selementid', 'triggerid'),) 1692 | 1693 | 1694 | class SysmapElementUrl(models.Model): 1695 | sysmapelementurlid = models.BigIntegerField(primary_key=True) 1696 | selementid = models.ForeignKey('SysmapsElements', models.DO_NOTHING, db_column='selementid') 1697 | name = models.CharField(max_length=255) 1698 | url = models.CharField(max_length=255) 1699 | 1700 | class Meta: 1701 | managed = False 1702 | db_table = 'sysmap_element_url' 1703 | unique_together = (('selementid', 'name'),) 1704 | 1705 | 1706 | class SysmapShape(models.Model): 1707 | sysmap_shapeid = models.BigIntegerField(primary_key=True) 1708 | sysmapid = models.ForeignKey('Sysmaps', models.DO_NOTHING, db_column='sysmapid') 1709 | type = models.IntegerField() 1710 | x = models.IntegerField() 1711 | y = models.IntegerField() 1712 | width = models.IntegerField() 1713 | height = models.IntegerField() 1714 | text = models.TextField() 1715 | font = models.IntegerField() 1716 | font_size = models.IntegerField() 1717 | font_color = models.CharField(max_length=6) 1718 | text_halign = models.IntegerField() 1719 | text_valign = models.IntegerField() 1720 | border_type = models.IntegerField() 1721 | border_width = models.IntegerField() 1722 | border_color = models.CharField(max_length=6) 1723 | background_color = models.CharField(max_length=6) 1724 | zindex = models.IntegerField() 1725 | 1726 | class Meta: 1727 | managed = False 1728 | db_table = 'sysmap_shape' 1729 | 1730 | 1731 | class SysmapUrl(models.Model): 1732 | sysmapurlid = models.BigIntegerField(primary_key=True) 1733 | sysmapid = models.ForeignKey('Sysmaps', models.DO_NOTHING, db_column='sysmapid') 1734 | name = models.CharField(max_length=255) 1735 | url = models.CharField(max_length=255) 1736 | elementtype = models.IntegerField() 1737 | 1738 | class Meta: 1739 | managed = False 1740 | db_table = 'sysmap_url' 1741 | unique_together = (('sysmapid', 'name'),) 1742 | 1743 | 1744 | class SysmapUser(models.Model): 1745 | sysmapuserid = models.BigIntegerField(primary_key=True) 1746 | sysmapid = models.ForeignKey('Sysmaps', models.DO_NOTHING, db_column='sysmapid') 1747 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1748 | permission = models.IntegerField() 1749 | 1750 | class Meta: 1751 | managed = False 1752 | db_table = 'sysmap_user' 1753 | unique_together = (('sysmapid', 'userid'),) 1754 | 1755 | 1756 | class SysmapUsrgrp(models.Model): 1757 | sysmapusrgrpid = models.BigIntegerField(primary_key=True) 1758 | sysmapid = models.ForeignKey('Sysmaps', models.DO_NOTHING, db_column='sysmapid') 1759 | usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='usrgrpid') 1760 | permission = models.IntegerField() 1761 | 1762 | class Meta: 1763 | managed = False 1764 | db_table = 'sysmap_usrgrp' 1765 | unique_together = (('sysmapid', 'usrgrpid'),) 1766 | 1767 | 1768 | class Sysmaps(models.Model): 1769 | sysmapid = models.BigIntegerField(primary_key=True) 1770 | name = models.CharField(unique=True, max_length=128) 1771 | width = models.IntegerField() 1772 | height = models.IntegerField() 1773 | backgroundid = models.ForeignKey(Images, models.DO_NOTHING, db_column='backgroundid', blank=True, null=True) 1774 | label_type = models.IntegerField() 1775 | label_location = models.IntegerField() 1776 | highlight = models.IntegerField() 1777 | expandproblem = models.IntegerField() 1778 | markelements = models.IntegerField() 1779 | show_unack = models.IntegerField() 1780 | grid_size = models.IntegerField() 1781 | grid_show = models.IntegerField() 1782 | grid_align = models.IntegerField() 1783 | label_format = models.IntegerField() 1784 | label_type_host = models.IntegerField() 1785 | label_type_hostgroup = models.IntegerField() 1786 | label_type_trigger = models.IntegerField() 1787 | label_type_map = models.IntegerField() 1788 | label_type_image = models.IntegerField() 1789 | label_string_host = models.CharField(max_length=255) 1790 | label_string_hostgroup = models.CharField(max_length=255) 1791 | label_string_trigger = models.CharField(max_length=255) 1792 | label_string_map = models.CharField(max_length=255) 1793 | label_string_image = models.CharField(max_length=255) 1794 | iconmapid = models.ForeignKey(IconMap, models.DO_NOTHING, db_column='iconmapid', blank=True, null=True) 1795 | expand_macros = models.IntegerField() 1796 | severity_min = models.IntegerField() 1797 | userid = models.ForeignKey('Users', models.DO_NOTHING, db_column='userid') 1798 | private = models.IntegerField() 1799 | 1800 | class Meta: 1801 | managed = False 1802 | db_table = 'sysmaps' 1803 | 1804 | 1805 | class SysmapsElements(models.Model): 1806 | selementid = models.BigIntegerField(primary_key=True) 1807 | sysmapid = models.ForeignKey(Sysmaps, models.DO_NOTHING, db_column='sysmapid') 1808 | elementid = models.BigIntegerField() 1809 | elementtype = models.IntegerField() 1810 | iconid_off = models.ForeignKey(Images, models.DO_NOTHING, db_column='iconid_off', blank=True, null=True, related_name="sysmap_icon_off") 1811 | iconid_on = models.ForeignKey(Images, models.DO_NOTHING, db_column='iconid_on', blank=True, null=True, related_name="sysmap_icon_on") 1812 | label = models.CharField(max_length=2048) 1813 | label_location = models.IntegerField() 1814 | x = models.IntegerField() 1815 | y = models.IntegerField() 1816 | iconid_disabled = models.ForeignKey(Images, models.DO_NOTHING, db_column='iconid_disabled', blank=True, null=True, related_name="sysmap_disabled_icon") 1817 | iconid_maintenance = models.ForeignKey(Images, models.DO_NOTHING, db_column='iconid_maintenance', blank=True, null=True, related_name="sysmap_maintenance_icon") 1818 | elementsubtype = models.IntegerField() 1819 | areatype = models.IntegerField() 1820 | width = models.IntegerField() 1821 | height = models.IntegerField() 1822 | viewtype = models.IntegerField() 1823 | use_iconmap = models.IntegerField() 1824 | application = models.CharField(max_length=255) 1825 | 1826 | class Meta: 1827 | managed = False 1828 | db_table = 'sysmaps_elements' 1829 | 1830 | 1831 | class SysmapsLinkTriggers(models.Model): 1832 | linktriggerid = models.BigIntegerField(primary_key=True) 1833 | linkid = models.ForeignKey('SysmapsLinks', models.DO_NOTHING, db_column='linkid') 1834 | triggerid = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='triggerid') 1835 | drawtype = models.IntegerField() 1836 | color = models.CharField(max_length=6) 1837 | 1838 | class Meta: 1839 | managed = False 1840 | db_table = 'sysmaps_link_triggers' 1841 | unique_together = (('linkid', 'triggerid'),) 1842 | 1843 | 1844 | class SysmapsLinks(models.Model): 1845 | linkid = models.BigIntegerField(primary_key=True) 1846 | sysmapid = models.ForeignKey(Sysmaps, models.DO_NOTHING, db_column='sysmapid') 1847 | selementid1 = models.ForeignKey(SysmapsElements, models.DO_NOTHING, db_column='selementid1', related_name="sysmapslink_selementid1") 1848 | selementid2 = models.ForeignKey(SysmapsElements, models.DO_NOTHING, db_column='selementid2', related_name="sysmapslink_selementid2") 1849 | drawtype = models.IntegerField() 1850 | color = models.CharField(max_length=6) 1851 | label = models.CharField(max_length=2048) 1852 | 1853 | class Meta: 1854 | managed = False 1855 | db_table = 'sysmaps_links' 1856 | 1857 | 1858 | class Task(models.Model): 1859 | taskid = models.BigIntegerField(primary_key=True) 1860 | type = models.IntegerField() 1861 | status = models.IntegerField() 1862 | clock = models.IntegerField() 1863 | ttl = models.IntegerField() 1864 | proxy_hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='proxy_hostid', blank=True, null=True) 1865 | 1866 | class Meta: 1867 | managed = False 1868 | db_table = 'task' 1869 | 1870 | 1871 | class TaskAcknowledge(models.Model): 1872 | taskid = models.OneToOneField(Task, models.DO_NOTHING, db_column='taskid', primary_key=True) 1873 | acknowledgeid = models.BigIntegerField() 1874 | 1875 | class Meta: 1876 | managed = False 1877 | db_table = 'task_acknowledge' 1878 | 1879 | 1880 | class TaskCloseProblem(models.Model): 1881 | taskid = models.OneToOneField(Task, models.DO_NOTHING, db_column='taskid', primary_key=True) 1882 | acknowledgeid = models.BigIntegerField() 1883 | 1884 | class Meta: 1885 | managed = False 1886 | db_table = 'task_close_problem' 1887 | 1888 | 1889 | class TaskRemoteCommand(models.Model): 1890 | taskid = models.OneToOneField(Task, models.DO_NOTHING, db_column='taskid', primary_key=True) 1891 | command_type = models.IntegerField() 1892 | execute_on = models.IntegerField() 1893 | port = models.IntegerField() 1894 | authtype = models.IntegerField() 1895 | username = models.CharField(max_length=64) 1896 | password = models.CharField(max_length=64) 1897 | publickey = models.CharField(max_length=64) 1898 | privatekey = models.CharField(max_length=64) 1899 | command = models.TextField() 1900 | alertid = models.BigIntegerField(blank=True, null=True) 1901 | parent_taskid = models.BigIntegerField() 1902 | hostid = models.BigIntegerField() 1903 | 1904 | class Meta: 1905 | managed = False 1906 | db_table = 'task_remote_command' 1907 | 1908 | 1909 | class TaskRemoteCommandResult(models.Model): 1910 | taskid = models.OneToOneField(Task, models.DO_NOTHING, db_column='taskid', primary_key=True) 1911 | status = models.IntegerField() 1912 | parent_taskid = models.BigIntegerField() 1913 | info = models.TextField() 1914 | 1915 | class Meta: 1916 | managed = False 1917 | db_table = 'task_remote_command_result' 1918 | 1919 | 1920 | class Timeperiods(models.Model): 1921 | timeperiodid = models.BigIntegerField(primary_key=True) 1922 | timeperiod_type = models.IntegerField() 1923 | every = models.IntegerField() 1924 | month = models.IntegerField() 1925 | dayofweek = models.IntegerField() 1926 | day = models.IntegerField() 1927 | start_time = models.IntegerField() 1928 | period = models.IntegerField() 1929 | start_date = models.IntegerField() 1930 | 1931 | class Meta: 1932 | managed = False 1933 | db_table = 'timeperiods' 1934 | 1935 | 1936 | class Trends(models.Model): 1937 | itemid = models.BigIntegerField(primary_key=True) 1938 | clock = models.IntegerField() 1939 | num = models.IntegerField() 1940 | value_min = models.FloatField() 1941 | value_avg = models.FloatField() 1942 | value_max = models.FloatField() 1943 | 1944 | class Meta: 1945 | managed = False 1946 | db_table = 'trends' 1947 | unique_together = (('itemid', 'clock'),) 1948 | 1949 | 1950 | class TrendsUint(models.Model): 1951 | itemid = models.BigIntegerField(primary_key=True) 1952 | clock = models.IntegerField() 1953 | num = models.IntegerField() 1954 | value_min = models.BigIntegerField() 1955 | value_avg = models.BigIntegerField() 1956 | value_max = models.BigIntegerField() 1957 | 1958 | class Meta: 1959 | managed = False 1960 | db_table = 'trends_uint' 1961 | unique_together = (('itemid', 'clock'),) 1962 | 1963 | 1964 | class TriggerDepends(models.Model): 1965 | triggerdepid = models.BigIntegerField(primary_key=True) 1966 | triggerid_down = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='triggerid_down', related_name="depend_trigger_down") 1967 | triggerid_up = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='triggerid_up', related_name="depend_trigger_up") 1968 | 1969 | class Meta: 1970 | managed = False 1971 | db_table = 'trigger_depends' 1972 | unique_together = (('triggerid_down', 'triggerid_up'),) 1973 | 1974 | 1975 | class TriggerDiscovery(models.Model): 1976 | triggerid = models.OneToOneField('Triggers', models.DO_NOTHING, db_column='triggerid', primary_key=True, related_name="discovery_trigger") 1977 | parent_triggerid = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='parent_triggerid', related_name="discovery_parent_trigger") 1978 | 1979 | class Meta: 1980 | managed = False 1981 | db_table = 'trigger_discovery' 1982 | 1983 | 1984 | class TriggerTag(models.Model): 1985 | triggertagid = models.BigIntegerField(primary_key=True) 1986 | triggerid = models.ForeignKey('Triggers', models.DO_NOTHING, db_column='triggerid') 1987 | tag = models.CharField(max_length=255) 1988 | value = models.CharField(max_length=255) 1989 | 1990 | class Meta: 1991 | managed = False 1992 | db_table = 'trigger_tag' 1993 | 1994 | 1995 | class Triggers(models.Model): 1996 | triggerid = models.BigIntegerField(primary_key=True) 1997 | expression = models.CharField(max_length=2048) 1998 | description = models.CharField(max_length=255) 1999 | url = models.CharField(max_length=255) 2000 | status = models.IntegerField() 2001 | value = models.IntegerField() 2002 | priority = models.IntegerField() 2003 | lastchange = models.IntegerField() 2004 | comments = models.TextField() 2005 | error = models.CharField(max_length=2048) 2006 | templateid = models.ForeignKey('self', models.DO_NOTHING, db_column='templateid', blank=True, null=True) 2007 | type = models.IntegerField() 2008 | state = models.IntegerField() 2009 | flags = models.IntegerField() 2010 | recovery_mode = models.IntegerField() 2011 | recovery_expression = models.CharField(max_length=2048) 2012 | correlation_mode = models.IntegerField() 2013 | correlation_tag = models.CharField(max_length=255) 2014 | manual_close = models.IntegerField() 2015 | 2016 | class Meta: 2017 | managed = False 2018 | db_table = 'triggers' 2019 | 2020 | 2021 | class Users(models.Model): 2022 | userid = models.BigIntegerField(primary_key=True) 2023 | alias = models.CharField(unique=True, max_length=100) 2024 | name = models.CharField(max_length=100) 2025 | surname = models.CharField(max_length=100) 2026 | passwd = models.CharField(max_length=32) 2027 | url = models.CharField(max_length=255) 2028 | autologin = models.IntegerField() 2029 | autologout = models.CharField(max_length=32) 2030 | lang = models.CharField(max_length=5) 2031 | refresh = models.CharField(max_length=32) 2032 | type = models.IntegerField() 2033 | theme = models.CharField(max_length=128) 2034 | attempt_failed = models.IntegerField() 2035 | attempt_ip = models.CharField(max_length=39) 2036 | attempt_clock = models.IntegerField() 2037 | rows_per_page = models.IntegerField() 2038 | 2039 | class Meta: 2040 | managed = False 2041 | db_table = 'users' 2042 | 2043 | 2044 | class UsersGroups(models.Model): 2045 | id = models.BigIntegerField(primary_key=True) 2046 | usrgrpid = models.ForeignKey('Usrgrp', models.DO_NOTHING, db_column='usrgrpid') 2047 | userid = models.ForeignKey(Users, models.DO_NOTHING, db_column='userid') 2048 | 2049 | class Meta: 2050 | managed = False 2051 | db_table = 'users_groups' 2052 | unique_together = (('usrgrpid', 'userid'),) 2053 | 2054 | 2055 | class Usrgrp(models.Model): 2056 | usrgrpid = models.BigIntegerField(primary_key=True) 2057 | name = models.CharField(unique=True, max_length=64) 2058 | gui_access = models.IntegerField() 2059 | users_status = models.IntegerField() 2060 | debug_mode = models.IntegerField() 2061 | 2062 | class Meta: 2063 | managed = False 2064 | db_table = 'usrgrp' 2065 | 2066 | 2067 | class Valuemaps(models.Model): 2068 | valuemapid = models.BigIntegerField(primary_key=True) 2069 | name = models.CharField(unique=True, max_length=64) 2070 | 2071 | class Meta: 2072 | managed = False 2073 | db_table = 'valuemaps' 2074 | 2075 | 2076 | class Widget(models.Model): 2077 | widgetid = models.BigIntegerField(primary_key=True) 2078 | dashboardid = models.ForeignKey(Dashboard, models.DO_NOTHING, db_column='dashboardid') 2079 | type = models.CharField(max_length=255) 2080 | name = models.CharField(max_length=255) 2081 | x = models.IntegerField() 2082 | y = models.IntegerField() 2083 | width = models.IntegerField() 2084 | height = models.IntegerField() 2085 | 2086 | class Meta: 2087 | managed = False 2088 | db_table = 'widget' 2089 | 2090 | 2091 | class WidgetField(models.Model): 2092 | widget_fieldid = models.BigIntegerField(primary_key=True) 2093 | widgetid = models.ForeignKey(Widget, models.DO_NOTHING, db_column='widgetid') 2094 | type = models.IntegerField() 2095 | name = models.CharField(max_length=255) 2096 | value_int = models.IntegerField() 2097 | value_str = models.CharField(max_length=255) 2098 | value_groupid = models.ForeignKey(Groups, models.DO_NOTHING, db_column='value_groupid', blank=True, null=True) 2099 | value_hostid = models.ForeignKey(Hosts, models.DO_NOTHING, db_column='value_hostid', blank=True, null=True) 2100 | value_itemid = models.ForeignKey(Items, models.DO_NOTHING, db_column='value_itemid', blank=True, null=True) 2101 | value_graphid = models.ForeignKey(Graphs, models.DO_NOTHING, db_column='value_graphid', blank=True, null=True) 2102 | value_sysmapid = models.ForeignKey(Sysmaps, models.DO_NOTHING, db_column='value_sysmapid', blank=True, null=True) 2103 | 2104 | class Meta: 2105 | managed = False 2106 | db_table = 'widget_field' 2107 | -------------------------------------------------------------------------------- /apps/zabbix/router.py: -------------------------------------------------------------------------------- 1 | from rest_framework.routers import DefaultRouter 2 | from .views import ZabbixHostStatusViewset, ProductHostStatusViewset 3 | 4 | zabbix_router = DefaultRouter() 5 | zabbix_router.register(r'zabbixStatus', ZabbixHostStatusViewset, base_name="zabbixStatus") 6 | zabbix_router.register(r'zabbixProduct', ProductHostStatusViewset, base_name="zabbixProduct") 7 | 8 | -------------------------------------------------------------------------------- /apps/zabbix/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /apps/zabbix/views.py: -------------------------------------------------------------------------------- 1 | 2 | from rest_framework.viewsets import ViewSet 3 | from rest_framework.response import Response 4 | from rest_framework.mixins import ListModelMixin 5 | from rest_framework import status, permissions 6 | 7 | from servers.models import Server 8 | from .models import Hosts, Functions, Triggers 9 | 10 | from products.models import Product 11 | 12 | 13 | class ZabbixHostStatusViewset(ViewSet, ListModelMixin): 14 | """ 15 | zabbix status 16 | """ 17 | permission_classes = (permissions.IsAuthenticated,) 18 | def list(self, request, *args, **kwargs): 19 | data = { 20 | "total_host": self.get_total_host_num(), 21 | "zabbix_total_host": self.get_zabbix_total_host_num(), 22 | "zabbix_monitor_host": self.get_zabbix_monitor_host_num(), 23 | "zabbix_not_monitor_host": self.get_zabbix_not_monitor_host_num(), 24 | "zabbix_monitor_exception_host": self.get_zabbix_monitor_exception_host_num() 25 | } 26 | return Response(data, status=status.HTTP_200_OK) 27 | 28 | 29 | def get_total_host_num(self): 30 | """ 31 | 返回CMDB中服务器总数 32 | """ 33 | try: 34 | return Server.objects.all().count() 35 | except Exception as e: 36 | return 0 37 | 38 | def get_zabbix_total_host_num(self): 39 | """ 40 | 返回zabbix中host总数 41 | """ 42 | try: 43 | return Hosts.objects.filter(status__in=[0,1]).filter(flags=0).using("zabbix").count() 44 | except Exception as e: 45 | return 0 46 | 47 | def get_zabbix_monitor_host_num(self): 48 | """ 49 | 返回zabbix中正常监控的主机数 50 | """ 51 | try: 52 | return Hosts.objects.filter(status=0).filter(flags=0).using("zabbix").count() 53 | except Exception as e: 54 | return 0 55 | 56 | def get_zabbix_not_monitor_host_num(self): 57 | """ 58 | return zabbix中,没有监控的主机数 59 | """ 60 | try: 61 | return Hosts.objects.filter(status=1).filter(flags=0).using("zabbix").count() 62 | except Exception as e: 63 | return 0 64 | 65 | def get_zabbix_monitor_exception_host_num(self): 66 | """ 67 | return zabbix中,监控异常的主机数: zabbix agent 异常 68 | """ 69 | try: 70 | return Hosts.objects.filter(status=0).filter(flags=0).filter(available=2).using("zabbix").count() 71 | except Exception as e: 72 | return 0 73 | 74 | 75 | class ProductHostStatusViewset(ViewSet, ListModelMixin): 76 | """ 77 | 以业务线为维度查看主机状态 78 | """ 79 | 80 | permission_classes = (permissions.IsAuthenticated,) 81 | def list(self, request, *args, **kwargs): 82 | data = self.get_product_status() 83 | return Response(data, status=status.HTTP_200_OK) 84 | 85 | def get_product_status(self): 86 | ret = [] 87 | for product_obj in Product.objects.filter(pid__exact=0): 88 | data = {} 89 | pm = ProductMonitorStatus(product_obj) 90 | data["name"] = product_obj.service_name 91 | data["total_host"] = pm.get_host_num() 92 | data["monitor_total"] = pm.get_monitor_host_num() 93 | data["not_monitor"] = data["total_host"] - data["monitor_total"] 94 | data["problem_disaster"] = pm.get_disaster_num() 95 | data["problem_high"] = pm.get_high_num() 96 | data["problem_average"] = pm.get_average_num() 97 | data["problem_warning"] = pm.get_warning_num() 98 | data["problem_information"] = pm.get_information_num() 99 | 100 | ret.append(data) 101 | return ret 102 | 103 | 104 | class ProductMonitorStatus(object): 105 | def __init__(self, product_obj=None): 106 | self.product = product_obj 107 | self.iplist = [] # 业务线下的所有机器的ip地址 108 | self.hosts = None # 业务线下的所有机器在zabbix中的 host对象集合 109 | self.triggerids = None 110 | self.initialize() 111 | 112 | 113 | def initialize(self): 114 | self.server_queryset = Server.objects.filter(service_id=self.product) 115 | self.iplist = [obj.manage_ip for obj in self.server_queryset] 116 | self.hosts = Hosts.objects.filter(interface__ip__in=self.iplist).using("zabbix") 117 | 118 | def get_host_num(self): 119 | return self.server_queryset.count() 120 | 121 | def get_monitor_host_num(self): 122 | try: 123 | return self.hosts.filter(status=0).filter(flags=0).using("zabbix").count() 124 | except Exception as e: 125 | return 0 126 | 127 | 128 | def get_triggerids(self): 129 | if self.triggerids is not None: 130 | return False 131 | triggerids = [] 132 | try: 133 | for host in self.hosts: 134 | for f in Functions.objects.filter(itemid__in=host.items_set.all()).using("zabbix"): 135 | triggerids.append(f.triggerid_id) 136 | except Exception as e: 137 | pass 138 | self.triggerids = triggerids 139 | 140 | def get_trigger_queryset(self): 141 | self.get_triggerids() 142 | return Triggers.objects.filter(triggerid__in=self.triggerids).filter(value__exact=1).using('zabbix') 143 | 144 | def get_disaster_num(self): 145 | queryset = self.get_trigger_queryset() 146 | try: 147 | return queryset.filter(priority__exact=5).count() 148 | except Exception as e: 149 | return 0 150 | 151 | def get_high_num(self): 152 | queryset = self.get_trigger_queryset() 153 | try: 154 | return queryset.filter(priority__exact=4).count() 155 | except Exception as e: 156 | return 0 157 | 158 | def get_average_num(self): 159 | queryset = self.get_trigger_queryset() 160 | try: 161 | return queryset.filter(priority__exact=3).count() 162 | except Exception as e: 163 | return 0 164 | 165 | def get_warning_num(self): 166 | queryset = self.get_trigger_queryset() 167 | try: 168 | return queryset.filter(priority__exact=2).count() 169 | except Exception as e: 170 | return 0 171 | 172 | def get_information_num(self): 173 | queryset = self.get_trigger_queryset() 174 | try: 175 | return queryset.filter(priority__exact=1).count() 176 | except Exception as e: 177 | return 0 178 | -------------------------------------------------------------------------------- /docs/install.md: -------------------------------------------------------------------------------- 1 | ## 在测试环境下搭建 autoAdmin 2 | 3 | ### install on Centos 7 4 | 5 | #### 安装python 3.6 6 | 7 | ##### 1 安装依赖 8 | 9 | ```bash 10 | sudo yum -y install openssl-devel readline-devel 11 | ``` 12 | 13 | 14 | 15 | ##### 2 下载并安装python 16 | 17 | ```bash 18 | wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz 19 | tar -xzf Python-3.6.6.tgz 20 | cd Python-3.6.6 21 | ./configure --prefix=/usr/local/python36 22 | sudo make 23 | sudo make install 24 | ``` 25 | 26 | 27 | 28 | ##### 3 配置pip 29 | 30 | ```bash 31 | sudo tee /etc/pip.conf <= 0: 9 | return page_size 10 | except: 11 | pass 12 | return self.page_size -------------------------------------------------------------------------------- /ops/permissions.py: -------------------------------------------------------------------------------- 1 | from rest_framework.permissions import DjangoModelPermissions 2 | 3 | class ModelPermissions(DjangoModelPermissions): 4 | 5 | def get_custom_perms(self, view, method): 6 | if hasattr(view, "extra_perm_map"): 7 | if isinstance(view.extra_perm_map, dict): 8 | return view.extra_perm_map.get(method,[]) 9 | return [] 10 | 11 | def has_permission(self, request, view): 12 | # Workaround to ensure DjangoModelPermissions are not applied 13 | # to the root view when using DefaultRouter. 14 | if getattr(view, '_ignore_model_permissions', False): 15 | return True 16 | 17 | if not request.user or ( 18 | not request.user.is_authenticated and self.authenticated_users_only): 19 | return False 20 | 21 | queryset = self._queryset(view) 22 | perms = self.get_required_permissions(request.method, queryset.model) 23 | perms.extend(self.get_custom_perms(view, request.method)) 24 | return request.user.has_perms(perms) -------------------------------------------------------------------------------- /ops/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for ops project. 3 | 4 | Generated by 'django-admin startproject' using Django 1.11.10. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.11/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/1.11/ref/settings/ 11 | """ 12 | 13 | import os 14 | import sys 15 | import datetime 16 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 17 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 18 | sys.path.insert(0, BASE_DIR) 19 | sys.path.insert(0, os.path.join(BASE_DIR, "apps")) 20 | 21 | 22 | # Quick-start development settings - unsuitable for production 23 | # See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/ 24 | 25 | 26 | # SECURITY WARNING: keep the secret key used in production secret! 27 | SECRET_KEY = 'd8b%_mva83f-u55@vz8euas$nhdg9cx8w&@03u$^$04(@^^w*&' 28 | 29 | # SECURITY WARNING: don't run with debug turned on in production! 30 | DEBUG = False 31 | ALLOWED_HOSTS = ["*"] 32 | ADMIN_LOGIN = "admin" 33 | 34 | # Application definition 35 | 36 | DOMAIN = "@reboot.com" 37 | 38 | INSTALLED_APPS = [ 39 | 'django.contrib.admin', 40 | 'django.contrib.auth', 41 | 'django.contrib.contenttypes', 42 | 'django.contrib.sessions', 43 | 'django.contrib.messages', 44 | 'django.contrib.staticfiles', 45 | 'corsheaders', 46 | 'rest_framework', 47 | 'django_filters', 48 | 'users.apps.UsersConfig', 49 | 'groups.apps.GroupsConfig', 50 | 'menu.apps.MenuConfig', 51 | 'permissions.apps.PermissionsConfig', 52 | 'products.apps.ProductConfig', 53 | 'manufacturers.apps.ManufacturersConfig', 54 | 'servers.apps.ServersConfig', 55 | 'idcs.apps.IdcsConfig', 56 | 'cabinet.apps.CabinetConfig', 57 | 'rest_framework.authtoken', 58 | 'zabbix.apps.ZabbixConfig', 59 | 60 | ] 61 | 62 | MIDDLEWARE = [ 63 | 'django.middleware.security.SecurityMiddleware', 64 | 'django.contrib.sessions.middleware.SessionMiddleware', 65 | 'corsheaders.middleware.CorsMiddleware', 66 | 'django.middleware.common.CommonMiddleware', 67 | 'django.middleware.csrf.CsrfViewMiddleware', 68 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 69 | 'django.contrib.messages.middleware.MessageMiddleware', 70 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 71 | ] 72 | 73 | CORS_ORIGIN_ALLOW_ALL = True 74 | ROOT_URLCONF = 'ops.urls' 75 | 76 | AUTH_USER_MODEL = "users.User" 77 | 78 | TEMPLATES = [ 79 | { 80 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 81 | 'DIRS': [], 82 | 'APP_DIRS': True, 83 | 'OPTIONS': { 84 | 'context_processors': [ 85 | 'django.template.context_processors.debug', 86 | 'django.template.context_processors.request', 87 | 'django.contrib.auth.context_processors.auth', 88 | 'django.contrib.messages.context_processors.messages', 89 | ], 90 | }, 91 | }, 92 | ] 93 | 94 | WSGI_APPLICATION = 'ops.wsgi.application' 95 | 96 | 97 | # Database 98 | # https://docs.djangoproject.com/en/1.11/ref/settings/#databases 99 | 100 | DATABASES = { 101 | 'default': { 102 | 'ENGINE': 'django.db.backends.mysql', 103 | 'NAME': "devops", 104 | 'USER': 'root', 105 | 'PASSWORD': "123456", 106 | 'HOST': "127.0.0.1", 107 | 'PORT': "3307", 108 | 'OPTIONS': { 109 | 'init_command': "SET storage_engine=INNODB;SET sql_mode='STRICT_TRANS_TABLES'" 110 | } 111 | }, 112 | # "zabbix": { 113 | # 'ENGINE': 'django.db.backends.mysql', 114 | # 'NAME': "zabbix", 115 | # 'USER': 'zabbix', 116 | # 'PASSWORD': "zabbix", 117 | # 'HOST': "192.168.20.116", 118 | # 'OPTIONS': { 119 | # 'init_command': "SET storage_engine=INNODB;SET sql_mode='STRICT_TRANS_TABLES'" 120 | # } 121 | # } 122 | } 123 | 124 | 125 | # Password validation 126 | # https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators 127 | 128 | AUTH_PASSWORD_VALIDATORS = [ 129 | { 130 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 131 | }, 132 | { 133 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 134 | }, 135 | { 136 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 137 | }, 138 | { 139 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 140 | }, 141 | ] 142 | 143 | 144 | # Internationalization 145 | # https://docs.djangoproject.com/en/1.11/topics/i18n/ 146 | 147 | LANGUAGE_CODE = 'zh-hans' 148 | 149 | TIME_ZONE = 'Asia/Shanghai' 150 | 151 | USE_I18N = True 152 | 153 | USE_L10N = True 154 | 155 | USE_TZ = False 156 | 157 | 158 | # Static files (CSS, JavaScript, Images) 159 | # https://docs.djangoproject.com/en/1.11/howto/static-files/ 160 | 161 | STATIC_URL = '/static/' 162 | 163 | REST_FRAMEWORK = { 164 | 'DEFAULT_FILTER_BACKENDS': ("django_filters.rest_framework.DjangoFilterBackend",), 165 | 'DEFAULT_AUTHENTICATION_CLASSES': ( 166 | 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 167 | 'rest_framework.authentication.SessionAuthentication', 168 | 'rest_framework.authentication.BasicAuthentication', 169 | ), 170 | 'DEFAULT_PERMISSION_CLASSES': ( 171 | 'ops.permissions.ModelPermissions', 172 | ), 173 | 'DEFAULT_PAGINATION_CLASS': 'ops.paginations.Pagination', 174 | 'PAGE_SIZE': 10 175 | } 176 | 177 | 178 | JWT_AUTH = { 179 | 'JWT_EXPIRATION_DELTA': datetime.timedelta(minutes=360), 180 | 'JWT_AUTH_HEADER_PREFIX': 'JWT', 181 | } 182 | 183 | 184 | # zabbix 185 | ZABBIX_API = "http://192.168.1.1/zabbix/" 186 | ZABBIX_ADMIN_USER = "Admin" 187 | ZABBIX_ADMIN_PASS = "zabbix" 188 | ZABBIX_DEFAULT_HOSTGROUP = "2" 189 | 190 | 191 | 192 | # 需要过滤掉的网卡设备名 193 | FILTER_NETWORK_DEVICE = ["docker", "veth", "tun", "sit", "br"] 194 | 195 | 196 | LOGGING = { 197 | 'version': 1, 198 | 'disable_existing_loggers': False, 199 | 'formatters': { 200 | 'verbose': {'format': '%(asctime)s %(levelname)s %(message)s'}, 201 | 'simple': {'format': '%(levelname)s %(message)s'}, 202 | 'default': { 203 | 'format': '%(asctime)s [%(name)s:%(lineno)d] [%(levelname)s] - %(message)s', 204 | 'datefmt': '%Y-%m-%d %H:%M:%S' 205 | } 206 | }, 207 | 'handlers': { 208 | 'null': { 209 | 'level':'DEBUG', 210 | 'class':'logging.NullHandler', 211 | }, 212 | 'sentry': { 213 | 'level': 'ERROR', 214 | 'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler', 215 | 'tags': {'custom-tag': 'x'}, 216 | }, 217 | 'console':{ 218 | 'level':'DEBUG', 219 | 'class':'logging.StreamHandler', 220 | 'formatter': 'default' 221 | }, 222 | 'django':{ 223 | 'level': 'DEBUG', 224 | 'class': 'logging.FileHandler', 225 | 'filename': os.path.join(BASE_DIR, 'logs', 'django.log'), 226 | 'formatter': 'default' 227 | 228 | }, 229 | 'root_handler': { 230 | 'level': 'DEBUG', 231 | 'class': 'logging.handlers.TimedRotatingFileHandler', 232 | 'formatter': 'default', 233 | 'filename': os.path.join(BASE_DIR, 'logs', 'server.log'), 234 | 'when': 'D', 235 | 'interval': 1, 236 | 'encoding': 'utf8', 237 | }, 238 | 'django_request_handler':{ 239 | 'level': 'DEBUG', 240 | 'class': 'logging.handlers.TimedRotatingFileHandler', 241 | 'formatter': 'default', 242 | 'filename': os.path.join(BASE_DIR, 'logs', 'request.log'), 243 | 'when': 'D', 244 | 'interval': 7, 245 | 'encoding': 'utf8', 246 | }, 247 | 'django_db_backends_handler':{ 248 | 'level': 'DEBUG', 249 | 'class': 'logging.handlers.TimedRotatingFileHandler', 250 | 'formatter': 'verbose', 251 | 'filename': os.path.join(BASE_DIR, 'logs', 'db_backends.log'), 252 | 'when': 'D', 253 | 'interval': 7, 254 | } 255 | }, 256 | 'loggers' : { 257 | 'django': { 258 | 'level': 'DEBUG', 259 | 'handlers': ['django'], 260 | 'propagate': False 261 | }, 262 | 'django.request': { 263 | 'handlers': ['django_request_handler'], 264 | 'level': 'DEBUG', 265 | 'propagate': False, 266 | }, 267 | 'django.db.backends':{ 268 | 'handlers': ['django_db_backends_handler'], 269 | 'level': 'DEBUG', 270 | 'propagate': False, 271 | } 272 | }, 273 | 'root':{ 274 | 'level': 'DEBUG', 275 | 'handlers': ['root_handler'] 276 | } 277 | } 278 | 279 | -------------------------------------------------------------------------------- /ops/settings_dev.py: -------------------------------------------------------------------------------- 1 | from .settings import * 2 | 3 | DEBUG = True 4 | 5 | DATABASES = { 6 | 'default': { 7 | 'ENGINE': 'django.db.backends.mysql', 8 | 'NAME': "devops", 9 | 'USER': 'root', 10 | 'PASSWORD': "123456", 11 | 'HOST': "127.0.0.1", 12 | 'OPTIONS': { 13 | 'init_command': "SET storage_engine=INNODB;SET sql_mode='STRICT_TRANS_TABLES'" 14 | } 15 | }, 16 | # "zabbix": { 17 | # 'ENGINE': 'django.db.backends.mysql', 18 | # 'NAME': "zabbix", 19 | # 'USER': 'zabbix', 20 | # 'PASSWORD': "zabbix", 21 | # 'HOST': "192.168.20.116", 22 | # 'OPTIONS': { 23 | # 'init_command': "SET storage_engine=INNODB;SET sql_mode='STRICT_TRANS_TABLES'" 24 | # } 25 | # } 26 | } 27 | LOGGING = {} -------------------------------------------------------------------------------- /ops/urls.py: -------------------------------------------------------------------------------- 1 | """ops URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.11/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | from django.conf.urls import url, include 17 | 18 | 19 | from rest_framework.routers import DefaultRouter 20 | from rest_framework.documentation import include_docs_urls 21 | from rest_framework_jwt.views import obtain_jwt_token 22 | 23 | 24 | 25 | from users.router import user_router 26 | from groups.router import group_router 27 | from menu.router import menu_router 28 | from cabinet.router import cabinet_router 29 | from servers.router import servers_router 30 | from idcs.router import idc_router 31 | from manufacturers.router import manufacturer_router 32 | from permissions.router import permission_router 33 | from products.router import products_router 34 | from zabbix.router import zabbix_router 35 | 36 | router = DefaultRouter() 37 | 38 | 39 | router.registry.extend(user_router.registry) 40 | router.registry.extend(group_router.registry) 41 | router.registry.extend(idc_router.registry) 42 | router.registry.extend(menu_router.registry) 43 | router.registry.extend(cabinet_router.registry) 44 | router.registry.extend(servers_router.registry) 45 | router.registry.extend(manufacturer_router.registry) 46 | router.registry.extend(permission_router.registry) 47 | router.registry.extend(products_router.registry) 48 | router.registry.extend(zabbix_router.registry) 49 | 50 | 51 | urlpatterns = [ 52 | url(r'^', include(router.urls)), 53 | url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 54 | url(r'^api-token-auth/', obtain_jwt_token), 55 | url(r'^docs/', include_docs_urls("开源运维平台")) 56 | ] 57 | 58 | -------------------------------------------------------------------------------- /ops/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for ops 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/1.11/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", "ops.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | asn1crypto==0.24.0 2 | bcrypt==3.1.4 3 | certifi==2018.1.18 4 | cffi==1.11.5 5 | chardet==3.0.4 6 | coreapi==2.3.3 7 | coreschema==0.0.4 8 | cryptography==2.2.1 9 | decorator==4.2.1 10 | Django==1.11.11 11 | django-cors-headers==2.2.0 12 | django-filter==1.1.0 13 | djangorestframework==3.7.7 14 | djangorestframework-jwt==1.11.0 15 | idna==2.6 16 | ipython==6.2.1 17 | ipython-genutils==0.2.0 18 | itypes==1.1.0 19 | jedi==0.11.1 20 | Jinja2==2.10 21 | Markdown==2.6.11 22 | MarkupSafe==1.0 23 | mysqlclient==1.3.12 24 | paramiko==2.4.1 25 | parso==0.1.1 26 | pexpect==4.4.0 27 | pickleshare==0.7.4 28 | prompt-toolkit==1.0.15 29 | ptyprocess==0.5.2 30 | pyasn1==0.4.2 31 | pycparser==2.18 32 | Pygments==2.2.0 33 | PyJWT==1.6.1 34 | PyNaCl==1.2.1 35 | pytz==2018.3 36 | raven==6.7.0 37 | requests==2.18.4 38 | simplegeneric==0.8.1 39 | six==1.11.0 40 | traitlets==4.3.2 41 | uritemplate==3.0.0 42 | urllib3==1.22 43 | wcwidth==0.1.7 44 | -------------------------------------------------------------------------------- /scripts/import_menu.py: -------------------------------------------------------------------------------- 1 | #/usr/bin/env python 2 | # 导入菜单 3 | 4 | import sys 5 | import os 6 | 7 | project_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) 8 | sys.path.append(project_dir) 9 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ops.settings") 10 | 11 | import django 12 | django.setup() 13 | 14 | 15 | from menu.models import Menu 16 | 17 | menus = [ 18 | { 19 | "path": "/", 20 | "label": "Dashboard", 21 | "icon": "", 22 | "show": True, 23 | "children": [] 24 | }, 25 | { 26 | "path": "/resources", 27 | "label": "资源管理", 28 | "icon": "user", 29 | "show": True, 30 | "children": [ 31 | { 32 | "path": "/idc", 33 | "label": "IDC机房", 34 | "icon": "user", 35 | "show": True, 36 | }, 37 | { 38 | "path": "/ip", 39 | "label": "IP管理", 40 | "icon": "user", 41 | "show": False, 42 | }, 43 | { 44 | "path": "/product", 45 | "label": "业务线管理", 46 | "icon": "user", 47 | "show": True, 48 | }, 49 | { 50 | "path": "/manufacturer", 51 | "label": "制造商", 52 | "icon": "user", 53 | "show": False, 54 | }, 55 | { 56 | "path": "/server", 57 | "label": "服务器", 58 | "icon": "user", 59 | "show": True, 60 | }, 61 | { 62 | "path": "/product_model", 63 | "label": "机器型号", 64 | "icon": "user", 65 | "show": False, 66 | }, 67 | { 68 | "path": "/cabinet", 69 | "label": "机柜管理", 70 | "icon": "user", 71 | "show": True, 72 | }, 73 | { 74 | "path": "/network_device", 75 | "label": "网卡管理", 76 | "icon": "user", 77 | "show": False, 78 | } 79 | ] 80 | }, 81 | { 82 | "path": "/monitor", 83 | "label": "监控管理", 84 | "icon": "user", 85 | "show": True, 86 | "children": [ 87 | { 88 | "path": "/zabbix", 89 | "label": "Zabbix", 90 | "icon": "", 91 | "show": True 92 | } 93 | ] 94 | }, 95 | { 96 | "path": "/users", 97 | "label": "用户管理", 98 | "icon": "user", 99 | "show": True, 100 | "children": [ 101 | { 102 | "path": "/group/groupPermission", 103 | "label": "权限列表", 104 | "icon": "", 105 | "show": False, 106 | }, 107 | { 108 | "path": "/list", 109 | "label": "用户列表", 110 | "icon": "", 111 | "show": True, 112 | }, 113 | { 114 | "path": "/group", 115 | "label": "角色", 116 | "icon": "", 117 | "show": True, 118 | } 119 | ] 120 | } 121 | ] 122 | 123 | def _import_menu(path, label, icon, show, parent, *args, **kwargs): 124 | menu = Menu() 125 | menu.path = path 126 | menu.title = label 127 | menu.icon = icon 128 | menu.show = show 129 | menu.parent = parent 130 | menu.save() 131 | return menu 132 | 133 | 134 | 135 | def import_menus(): 136 | for menu in menus: 137 | children = menu.pop("children", []) 138 | menu["parent"] = None 139 | menu_obj = _import_menu(**menu) 140 | for child in children: 141 | child["parent"] = menu_obj 142 | _import_menu(**child) 143 | 144 | 145 | def run(): 146 | if Menu.objects.count() != 0: 147 | print("已经有菜单了,不需要再重复导入!") 148 | sys.exit(0) 149 | 150 | import_menus() 151 | 152 | 153 | if __name__ == "__main__": 154 | run() --------------------------------------------------------------------------------