6 Commits
v2.01 ... v2.07

Author SHA1 Message Date
RobbieHan
4fbdc88743 scan config 2018-12-29 20:19:34 +08:00
RobbieHan
860ae14d4c code management 2018-12-19 21:41:50 +08:00
RobbieHan
00f7112b67 logging 2018-12-15 15:34:27 +08:00
RobbieHan
ba936d7f9e create cmdb app 2018-12-10 20:32:45 +08:00
RobbieHan
c399b77703 remove .idea 2018-11-27 12:11:16 +08:00
RobbieHan
894fe29e15 change to mysql 2018-11-27 01:05:11 +08:00
35 changed files with 1181 additions and 847 deletions

3
.gitattributes vendored Normal file
View File

@@ -0,0 +1,3 @@
*.js linguist-language=python
*.css linguist-language=python
*.html linguist-language=python

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
.idea

15
.idea/deployment.xml generated
View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="PublishConfigData" autoUpload="Always" serverName="SMP_Remote_Server">
<serverData>
<paths name="SMP_Remote_Server">
<serverdata>
<mappings>
<mapping deploy="/" local="$PROJECT_DIR$" web="/" />
</mappings>
</serverdata>
</paths>
</serverData>
<option name="myAutoUpload" value="ALWAYS" />
</component>
</project>

View File

@@ -1,3 +0,0 @@
<component name="ProjectDictionaryState">
<dictionary name="RobbieHan" />
</component>

4
.idea/misc.xml generated
View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Remote Python 3.6.6 (ssh://root@172.16.3.100:22/root/.virtualenvs/sandboxMP/bin/python)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/sandboxMP.iml" filepath="$PROJECT_DIR$/.idea/sandboxMP.iml" />
</modules>
</component>
</project>

32
.idea/sandboxMP.iml generated
View File

@@ -1,32 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="FacetManager">
<facet type="django" name="Django">
<configuration>
<option name="rootFolder" value="$MODULE_DIR$" />
<option name="settingsModule" value="sandboxMP/settings.py" />
<option name="manageScript" value="$MODULE_DIR$/manage.py" />
<option name="environment" value="&lt;map/&gt;" />
<option name="doNotUseTestRunner" value="false" />
</configuration>
</facet>
</component>
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/apps" isTestSource="false" />
</content>
<orderEntry type="jdk" jdkName="Remote Python 3.6.6 (ssh://root@172.16.3.100:22/root/.virtualenvs/sandboxMP/bin/python)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TemplatesService">
<option name="TEMPLATE_CONFIGURATION" value="Django" />
<option name="TEMPLATE_FOLDERS">
<list>
<option value="$MODULE_DIR$/../sandboxMP\templates" />
</list>
</option>
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

15
.idea/webServers.xml generated
View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="WebServers">
<option name="servers">
<webServer id="9e8a87b0-abd9-463e-b579-b05e0bb96893" name="SMP_Remote_Server" url="http://172.16.3.100">
<fileTransfer host="172.16.3.100" port="22" rootFolder="/root/project_file" accessType="SFTP">
<advancedOptions>
<advancedOptions dataProtectionLevel="Private" />
</advancedOptions>
<option name="port" value="22" />
</fileTransfer>
</webServer>
</option>
</component>
</project>

752
.idea/workspace.xml generated
View File

@@ -1,752 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="80da5b45-7eca-459a-bbe3-5443bc141768" name="Default" comment="">
<change beforePath="$PROJECT_DIR$/.idea/misc.xml" afterPath="$PROJECT_DIR$/.idea/misc.xml" />
<change beforePath="$PROJECT_DIR$/.idea/sandboxMP.iml" afterPath="$PROJECT_DIR$/.idea/sandboxMP.iml" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" afterPath="$PROJECT_DIR$/.idea/workspace.xml" />
<change beforePath="$PROJECT_DIR$/requirements/dev" afterPath="" />
<change beforePath="$PROJECT_DIR$/requirements/pro" afterPath="" />
<change beforePath="$PROJECT_DIR$/sandboxMP/settings.py" afterPath="$PROJECT_DIR$/sandboxMP/settings.py" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="DjangoConsoleOptions" custom-start-script="import sys; print('Python %s on %s' % (sys.version, sys.platform))&#10;import django; print('Django %s' % django.get_version())&#10;sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])&#10;if 'setup' in dir(django): django.setup()&#10;import django_manage_shell; django_manage_shell.run(PROJECT_ROOT)">
<option name="myCustomStartScript" value="import sys; print('Python %s on %s' % (sys.version, sys.platform))&#10;import django; print('Django %s' % django.get_version())&#10;sys.path.extend([WORKING_DIR_AND_PYTHON_PATHS])&#10;if 'setup' in dir(django): django.setup()&#10;import django_manage_shell; django_manage_shell.run(PROJECT_ROOT)" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="settings.py" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/sandboxMP/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="29" column="19" lean-forward="false" selection-start-line="29" selection-start-column="19" selection-end-line="29" selection-end-column="19" />
<folding>
<element signature="e#310#319#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="views_user.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/apps/system/views_user.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="515">
<caret line="61" column="27" lean-forward="false" selection-start-line="61" selection-start-column="27" selection-end-line="61" selection-end-column="27" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="HTML File" />
<option value="Python Script" />
</list>
</option>
</component>
<component name="FindInProjectRecents">
<findStrings>
<find>reverse</find>
<find>OA</find>
</findStrings>
</component>
<component name="Git.Settings">
<option name="ROOT_SYNC" value="DONT_SYNC" />
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<option value="$PROJECT_DIR$/apps/system/mixin.py" />
<option value="$PROJECT_DIR$/templates/system/system.html" />
<option value="$PROJECT_DIR$/sandboxMP/urls.py" />
<option value="$PROJECT_DIR$/apps/system/tests.py" />
<option value="$PROJECT_DIR$/templates/system/structure/structure_create.html" />
<option value="$PROJECT_DIR$/templates/system/structure/strueture_users.html" />
<option value="$PROJECT_DIR$/templates/system/structure/strueture_user.html" />
<option value="$PROJECT_DIR$/templates/system/structure/structure_user.html" />
<option value="$PROJECT_DIR$/templates/system/users/user_create.html" />
<option value="$PROJECT_DIR$/templates/system/users/user_detail.html" />
<option value="$PROJECT_DIR$/templates/base-static.html" />
<option value="$PROJECT_DIR$/templates/system/users/passwd_change.html" />
<option value="$PROJECT_DIR$/apps/system/forms.py" />
<option value="$PROJECT_DIR$/apps/system/views.menu.py" />
<option value="$PROJECT_DIR$/apps/system/apps.py" />
<option value="$PROJECT_DIR$/templates/system/menu_list.html" />
<option value="$PROJECT_DIR$/templates/system/role_create.html" />
<option value="$PROJECT_DIR$/templates/system/role_update.html" />
<option value="$PROJECT_DIR$/templates/system/role_role2user.html" />
<option value="$PROJECT_DIR$/templates/system/role_role2menu.html" />
<option value="$PROJECT_DIR$/apps/system/urls.py" />
<option value="$PROJECT_DIR$/templates/system/menu_form.html" />
<option value="$PROJECT_DIR$/templates/system/menu_update.html" />
<option value="$PROJECT_DIR$/apps/system/milddleware.py" />
<option value="$PROJECT_DIR$/apps/milddleware.py" />
<option value="$PROJECT_DIR$/templates/head-footer.html" />
<option value="$PROJECT_DIR$/templates/system/structure/structure.html" />
<option value="$PROJECT_DIR$/templates/system/users/user.html" />
<option value="$PROJECT_DIR$/templates/system/role.html" />
<option value="$PROJECT_DIR$/apps/system/middleware.py" />
<option value="$PROJECT_DIR$/apps/system/models.py" />
<option value="$PROJECT_DIR$/apps/custom.py" />
<option value="$PROJECT_DIR$/apps/system/views.py" />
<option value="$PROJECT_DIR$/apps/system/views_menu.py" />
<option value="$PROJECT_DIR$/apps/system/views_role.py" />
<option value="$PROJECT_DIR$/apps/system/views_structure.py" />
<option value="$PROJECT_DIR$/apps/system/views_user.py" />
<option value="$PROJECT_DIR$/templates/base-left.html" />
<option value="$PROJECT_DIR$/templates/system/index.html" />
<option value="$PROJECT_DIR$/templates/system/system_index1.html" />
<option value="$PROJECT_DIR$/templates/system/system_index.html" />
<option value="$PROJECT_DIR$/requirements/dev" />
<option value="$PROJECT_DIR$/requirements/pro" />
<option value="$PROJECT_DIR$/sandboxMP/settings.py" />
</list>
</option>
</component>
<component name="JsBuildToolGruntFileManager" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsBuildToolPackageJson" detection-done="true" sorting="DEFINITION_ORDER" />
<component name="JsGulpfileManager">
<detection-done>true</detection-done>
<sorting>DEFINITION_ORDER</sorting>
</component>
<component name="ProjectFrameBounds" extendedState="6">
<option name="x" value="-8" />
<option name="y" value="-8" />
<option name="width" value="1936" />
<option name="height" value="1056" />
</component>
<component name="ProjectInspectionProfilesVisibleTreeState">
<entry key="Project Default">
<profile-state>
<expanded-state>
<State>
<id />
</State>
</expanded-state>
<selected-state>
<State>
<id>AngularJS</id>
</State>
</selected-state>
</profile-state>
</entry>
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="true" />
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
<manualOrder />
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
<path>
<item name="sandboxMP" type="b2602c69:ProjectViewProjectNode" />
<item name="sandboxMP" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="sandboxMP" type="b2602c69:ProjectViewProjectNode" />
<item name="sandboxMP" type="462c0819:PsiDirectoryNode" />
<item name="sandboxMP" type="462c0819:PsiDirectoryNode" />
</path>
</expand>
<select />
</subPane>
</pane>
<pane id="Scratches" />
</panes>
</component>
<component name="PropertiesComponent">
<property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
<property name="last_opened_file_path" value="C:/Program Files/Git/bin/git.exe" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="DefaultHtmlFileTemplate" value="HTML File" />
<property name="WebServerToolWindowPanel.toolwindow.show.size" value="false" />
<property name="WebServerToolWindowPanel.toolwindow.show.date" value="false" />
<property name="WebServerToolWindowPanel.toolwindow.show.permissions" value="false" />
<property name="WebServerToolWindowPanel.toolwindow.highlight.symlinks" value="true" />
<property name="WebServerToolWindowPanel.toolwindow.highlight.mappings" value="true" />
</component>
<component name="PyConsoleOptionsProvider">
<option name="myPythonConsoleState">
<console-settings is-module-sdk="true">
<option name="myUseModuleSdk" value="true" />
</console-settings>
</option>
</component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\ProjectFile\sandboxMP\templates" />
<recent name="D:\ProjectFile\sandboxMP\templates\system\users" />
<recent name="D:\ProjectFile\sandboxMP\templates\system" />
<recent name="D:\ProjectFile\sandboxMP\templates\system\structure" />
<recent name="D:\ProjectFile\sandboxMP\apps\system" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\ProjectFile\sandboxMP\templates\system" />
<recent name="D:\ProjectFile\sandboxMP\apps" />
</key>
</component>
<component name="RunDashboard">
<option name="ruleStates">
<list>
<RuleState>
<option name="name" value="ConfigurationTypeDashboardGroupingRule" />
</RuleState>
<RuleState>
<option name="name" value="StatusDashboardGroupingRule" />
</RuleState>
</list>
</option>
</component>
<component name="RunManager" selected="Django server.SMP_Remote">
<configuration name="SMP_Remote" type="Python.DjangoServer" factoryName="Django server">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
<env name="DJANGO_SETTINGS_MODULE" value="sandboxMP.settings" />
</envs>
<option name="SDK_HOME" value="ssh://root@172.16.3.100:22/root/.virtualenvs/sandboxMP/bin/python" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="sandboxMP" />
<option name="launchJavascriptDebuger" value="false" />
<option name="port" value="8000" />
<option name="host" value="172.16.3.100" />
<option name="additionalOptions" value="" />
<option name="browserUrl" value="" />
<option name="runTestServer" value="false" />
<option name="runNoReload" value="false" />
<option name="useCustomRunCommand" value="false" />
<option name="customRunCommand" value="" />
</configuration>
<configuration name="sandboxMP" type="Python.DjangoServer" factoryName="Django server">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
<env name="DJANGO_SETTINGS_MODULE" value="sandboxMP.settings" />
</envs>
<option name="SDK_HOME" value="" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="sandboxMP" />
<option name="launchJavascriptDebuger" value="false" />
<option name="port" value="8000" />
<option name="host" value="" />
<option name="additionalOptions" value="" />
<option name="browserUrl" value="" />
<option name="runTestServer" value="false" />
<option name="runNoReload" value="false" />
<option name="useCustomRunCommand" value="false" />
<option name="customRunCommand" value="" />
</configuration>
<list size="2">
<item index="0" class="java.lang.String" itemvalue="Django server.sandboxMP" />
<item index="1" class="java.lang.String" itemvalue="Django server.SMP_Remote" />
</list>
</component>
<component name="ShelveChangesManager" show_recycled="false">
<option name="remove_strategy" value="false" />
</component>
<component name="SvnConfiguration">
<configuration />
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="80da5b45-7eca-459a-bbe3-5443bc141768" name="Default" comment="" />
<created>1539589405377</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1539589405377</updated>
</task>
<servers />
</component>
<component name="TodoView">
<todo-panel id="selected-file">
<is-autoscroll-to-source value="true" />
</todo-panel>
<todo-panel id="all">
<are-packages-shown value="true" />
<is-autoscroll-to-source value="true" />
</todo-panel>
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
<editor active="true" />
<layout>
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.29634643" sideWeight="0.50716335" order="7" side_tool="true" content_ui="tabs" />
<window_info id="File Transfer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.27529925" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2383025" sideWeight="0.49283668" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Mongo Explorer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.14232409" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Docker" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="SciView" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.18656716" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.28281462" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.24156693" sideWeight="0.5042644" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.18498367" sideWeight="0.49573562" order="2" side_tool="false" content_ui="tabs" />
<window_info id="manage.py@sandboxMP" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.34912044" sideWeight="0.5" order="8" side_tool="false" content_ui="tabs" />
<window_info id="Mongo Explorer" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.3297062" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Remote Host" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32995737" sideWeight="0.5" order="-1" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.26972282" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Docker" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="SciView" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.18656716" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.28281462" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="1" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State>
<option name="RECENTLY_FILTERED_USER_GROUPS">
<collection />
</option>
<option name="RECENTLY_FILTERED_BRANCH_GROUPS">
<collection />
</option>
<option name="COLUMN_ORDER">
<list>
<option value="0" />
<option value="1" />
<option value="2" />
<option value="3" />
</list>
</option>
</State>
</value>
</entry>
</map>
</option>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<default-breakpoints>
<breakpoint type="python-exception">
<properties notifyOnTerminate="true" exception="BaseException">
<option name="notifyOnTerminate" value="true" />
</properties>
</breakpoint>
</default-breakpoints>
<option name="time" value="38" />
</breakpoint-manager>
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/contrib/auth/decorators.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-459">
<caret line="9" column="57" lean-forward="false" selection-start-line="9" selection-start-column="57" selection-end-line="9" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/sandboxMP/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="29" column="63" lean-forward="true" selection-start-line="29" selection-start-column="63" selection-end-line="30" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/db/models/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="100" column="8" lean-forward="false" selection-start-line="100" selection-start-column="8" selection-end-line="100" selection-end-column="8" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/utils/encoding.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1649">
<caret line="121" column="4" lean-forward="false" selection-start-line="121" selection-start-column="4" selection-end-line="121" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/contrib/flatpages/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="595">
<caret line="39" column="22" lean-forward="false" selection-start-line="39" selection-start-column="22" selection-end-line="39" selection-end-column="22" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/db/models/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-204">
<caret line="0" column="0" lean-forward="false" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/forms/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="230">
<caret line="472" column="4" lean-forward="false" selection-start-line="472" selection-start-column="4" selection-end-line="472" selection-end-column="4" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/users/login.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="170">
<caret line="10" column="57" lean-forward="true" selection-start-line="10" selection-start-column="57" selection-end-line="10" selection-end-column="57" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/views/generic/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="11" column="11" lean-forward="false" selection-start-line="11" selection-start-column="11" selection-end-line="11" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="432">
<caret line="127" column="0" lean-forward="false" selection-start-line="127" selection-start-column="0" selection-end-line="127" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/apps.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="85">
<caret line="5" column="0" lean-forward="true" selection-start-line="5" selection-start-column="0" selection-end-line="5" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/views/generic/base.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="197">
<caret line="130" column="33" lean-forward="true" selection-start-line="130" selection-start-column="4" selection-end-line="130" selection-end-column="33" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/shortcuts.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="342">
<caret line="56" column="50" lean-forward="true" selection-start-line="56" selection-start-column="21" selection-end-line="56" selection-end-column="50" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/http/response.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="-1063">
<caret line="475" column="6" lean-forward="false" selection-start-line="475" selection-start-column="6" selection-end-line="475" selection-end-column="6" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/role_update.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="657">
<caret line="80" column="14" lean-forward="false" selection-start-line="80" selection-start-column="14" selection-end-line="80" selection-end-column="14" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/role_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="504">
<caret line="70" column="11" lean-forward="true" selection-start-line="70" selection-start-column="11" selection-end-line="70" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/views/generic/detail.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="272">
<caret line="20" column="0" lean-forward="false" selection-start-line="20" selection-start-column="0" selection-end-line="25" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/views/generic/edit.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="289">
<caret line="69" column="39" lean-forward="true" selection-start-line="69" selection-start-column="39" selection-end-line="69" selection-end-column="39" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/role_role2user.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="563">
<caret line="98" column="20" lean-forward="false" selection-start-line="98" selection-start-column="20" selection-end-line="98" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/role_role2menu.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="2097">
<caret line="177" column="13" lean-forward="true" selection-start-line="177" selection-start-column="13" selection-end-line="177" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/menu_update.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="153">
<caret line="48" column="11" lean-forward="false" selection-start-line="48" selection-start-column="11" selection-end-line="48" selection-end-column="11" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="510">
<caret line="30" column="92" lean-forward="true" selection-start-line="30" selection-start-column="92" selection-end-line="30" selection-end-column="92" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/core/servers/basehttp.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="401">
<caret line="58" column="0" lean-forward="true" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/sandboxMP/wsgi.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="11" column="49" lean-forward="true" selection-start-line="11" selection-start-column="49" selection-end-line="11" selection-end-column="49" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/milddleware.py" />
<entry file="file://$PROJECT_DIR$/apps/system/mixin.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="11" column="35" lean-forward="true" selection-start-line="11" selection-start-column="35" selection-end-line="11" selection-end-column="35" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/utils/module_loading.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="221">
<caret line="16" column="0" lean-forward="false" selection-start-line="16" selection-start-column="0" selection-end-line="16" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/importlib/__init__.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="231">
<caret line="125" column="0" lean-forward="false" selection-start-line="125" selection-start-column="0" selection-end-line="125" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/core/handlers/exception.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="340">
<caret line="34" column="0" lean-forward="false" selection-start-line="34" selection-start-column="0" selection-end-line="34" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/Envs/sandboxMP/Lib/site-packages/django/utils/deprecation.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="497">
<caret line="89" column="0" lean-forward="false" selection-start-line="89" selection-start-column="0" selection-end-line="89" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/menu_form.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="51" column="26" lean-forward="false" selection-start-line="51" selection-start-column="26" selection-end-line="51" selection-end-column="26" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/menu_list.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="204">
<caret line="60" column="0" lean-forward="false" selection-start-line="60" selection-start-column="0" selection-end-line="66" selection-end-column="13" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/role.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="540">
<caret line="71" column="19" lean-forward="false" selection-start-line="71" selection-start-column="19" selection-end-line="71" selection-end-column="19" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/structure/structure.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="310">
<caret line="59" column="0" lean-forward="false" selection-start-line="59" selection-start-column="0" selection-end-line="65" selection-end-column="9" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/head-footer.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="306">
<caret line="18" column="85" lean-forward="false" selection-start-line="18" selection-start-column="85" selection-end-line="18" selection-end-column="85" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/custom.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="340">
<caret line="20" column="49" lean-forward="true" selection-start-line="20" selection-start-column="49" selection-end-line="20" selection-end-column="49" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/views.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="170">
<caret line="10" column="0" lean-forward="true" selection-start-line="10" selection-start-column="0" selection-end-line="10" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/views_menu.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="204">
<caret line="18" column="36" lean-forward="true" selection-start-line="18" selection-start-column="36" selection-end-line="18" selection-end-column="36" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/views_role.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="187">
<caret line="19" column="52" lean-forward="false" selection-start-line="19" selection-start-column="52" selection-end-line="19" selection-end-column="52" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/views_structure.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="254">
<caret line="21" column="58" lean-forward="false" selection-start-line="21" selection-start-column="58" selection-end-line="21" selection-end-column="58" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/models.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="22" column="0" lean-forward="false" selection-start-line="22" selection-start-column="0" selection-end-line="22" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/base-left.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="255">
<caret line="66" column="21" lean-forward="false" selection-start-line="66" selection-start-column="21" selection-end-line="66" selection-end-column="21" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/middleware.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="470">
<caret line="96" column="45" lean-forward="false" selection-start-line="96" selection-start-column="45" selection-end-line="96" selection-end-column="45" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/users/user.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="238">
<caret line="14" column="50" lean-forward="true" selection-start-line="14" selection-start-column="50" selection-end-line="14" selection-end-column="50" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/templates/system/system_index1.html" />
<entry file="file://$PROJECT_DIR$/templates/invoice.html" />
<entry file="file://$PROJECT_DIR$/templates/system/system_index.html">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="33">
<caret line="2" column="0" lean-forward="true" selection-start-line="2" selection-start-column="0" selection-end-line="2" selection-end-column="0" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/requirements/pro.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="17">
<caret line="1" column="13" lean-forward="true" selection-start-line="1" selection-start-column="13" selection-end-line="1" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/apps/system/views_user.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="515">
<caret line="61" column="27" lean-forward="false" selection-start-line="61" selection-start-column="27" selection-end-line="61" selection-end-column="27" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/requirements/dev.txt">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="17">
<caret line="1" column="13" lean-forward="false" selection-start-line="1" selection-start-column="13" selection-end-line="1" selection-end-column="13" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/sandboxMP/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="493">
<caret line="29" column="19" lean-forward="false" selection-start-line="29" selection-start-column="19" selection-end-line="29" selection-end-column="19" />
<folding>
<element signature="e#310#319#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
<component name="masterDetails">
<states>
<state key="ScopeChooserConfigurable.UI">
<settings>
<splitter-proportions>
<option name="proportions">
<list>
<option value="0.2" />
</list>
</option>
</splitter-proportions>
</settings>
</state>
</states>
</component>
</project>

0
apps/cmdb/__init__.py Normal file
View File

3
apps/cmdb/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

5
apps/cmdb/apps.py Normal file
View File

@@ -0,0 +1,5 @@
from django.apps import AppConfig
class CmdbConfig(AppConfig):
name = 'cmdb'

46
apps/cmdb/forms.py Normal file
View File

@@ -0,0 +1,46 @@
# @Time : 2018/12/19 16:13
# @Author : RobbieHan
# @File : forms.py
from django import forms
from .models import Code
class CodeCreateForm(forms.ModelForm):
class Meta:
model = Code
fields = '__all__'
error_messages = {
'key': {'required': 'key不能为空'},
'value': {'required': 'value不能为空'}
}
def clean(self):
cleaned_data = super(CodeCreateForm, self).clean()
key = cleaned_data.get('key')
value = cleaned_data.get('value')
if Code.objects.filter(key=key).count():
raise forms.ValidationError('key{}已存在'.format(key))
if Code.objects.filter(value=value).count():
raise forms.ValidationError('value: {}已存在'.format(value))
class CodeUpdateForm(CodeCreateForm):
def clean(self):
cleaned_data = self.cleaned_data
key = cleaned_data.get('key')
value = cleaned_data.get('value')
if self.instance:
matching_code = Code.objects.exclude(pk=self.instance.pk)
if matching_code.filter(key=key).exists():
msg = 'key{} 已经存在'.format(key)
raise forms.ValidationError(msg)
if matching_code.filter(value=value).exists():
msg = 'value{} 已经存在'.format(value)
raise forms.ValidationError(msg)

View File

22
apps/cmdb/models.py Normal file
View File

@@ -0,0 +1,22 @@
from django.db import models
# Create your models here.
class AbstractMode(models.Model):
parent = models.ForeignKey(
'self', blank=True, null=True, on_delete=models.SET_NULL, related_name='child'
)
class Meta:
abstract = True
class Code(AbstractMode):
key = models.CharField(max_length=80, verbose_name='')
value = models.CharField(max_length=80, verbose_name='')
desc = models.BooleanField(default=True, verbose_name='备注')
class Meta:
verbose_name = '字典'
verbose_name_plural = verbose_name

22
apps/cmdb/tests.py Normal file
View File

@@ -0,0 +1,22 @@
from django.test import TestCase
# Create your tests here.
from django.views.generic.base import View
from django.shortcuts import HttpResponse
import logging
from .models import Code
info_logger = logging.getLogger('sandbox_info')
error_logger = logging.getLogger('sandbox_error')
class TestLoggingView(View):
def get(self, request):
print('a')
info_logger.info('The system print a letter "a" ')
try:
Code.objects.get(id=100)
except Exception as e:
error_logger.error(e)
return HttpResponse("OK!")

17
apps/cmdb/urls.py Normal file
View File

@@ -0,0 +1,17 @@
from django.urls import path
from .views import CmdbView
from . import views_code, views_scan
app_name = 'cmdb'
urlpatterns = [
path('', CmdbView.as_view(), name='index'),
path('portal/code/', views_code.CodeView.as_view(), name='portal-code'),
path('portal/code/create/', views_code.CodeCreateView.as_view(), name='portal-code-create'),
path('portal/code/list/', views_code.CodeListView.as_view(), name='portal-code-list'),
path('portal/code/update/', views_code.CodeUpdateView.as_view(), name='portal-code-update'),
path('portal/code/delete/', views_code.CodeDeleteView.as_view(), name='portal-code-delete'),
path('portal/scan_config/', views_scan.ScanConfigView.as_view(), name='portal-scan_config'),
]

9
apps/cmdb/views.py Normal file
View File

@@ -0,0 +1,9 @@
from django.views.generic import TemplateView
from system.mixin import LoginRequiredMixin
from custom import BreadcrumbMixin
class CmdbView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
template_name = 'cmdb/cmdb_index.html'

53
apps/cmdb/views_code.py Normal file
View File

@@ -0,0 +1,53 @@
# @Time : 2018/12/19 13:31
# @Author : RobbieHan
# @File : views_code.py.py
from django.views.generic import TemplateView
from system.mixin import LoginRequiredMixin
from custom import (BreadcrumbMixin, SandboxCreateView,
SandboxListView, SandboxUpdateView, SandboxDeleteView)
from .models import Code
from .forms import CodeCreateForm, CodeUpdateForm
class CodeView(LoginRequiredMixin, BreadcrumbMixin, TemplateView):
template_name = 'cmdb/code.html'
def get_context_data(self):
context = dict(code_parent=Code.objects.filter(parent=None))
return context
class CodeCreateView(SandboxCreateView):
model = Code
form_class = CodeCreateForm
template_name_suffix = '_create'
def get_context_data(self, **kwargs):
kwargs['code_parent'] = Code.objects.filter(parent=None)
return super().get_context_data(**kwargs)
class CodeListView(SandboxListView):
model = Code
fields = ['id', 'key', 'value', 'parent__value']
def get(self, request):
if 'parent' in request.GET and request.GET['parent']:
self.filters = dict(parent__key=request.GET['parent'])
return super().get(request)
class CodeUpdateView(SandboxUpdateView):
model = Code
form_class = CodeUpdateForm
template_name_suffix = '_update'
def get_context_data(self, **kwargs):
kwargs['code_parent'] = Code.objects.filter(parent=None)
return super().get_context_data(**kwargs)
class CodeDeleteView(SandboxDeleteView):
model = Code

54
apps/cmdb/views_scan.py Normal file
View File

@@ -0,0 +1,54 @@
# @Time : 2018/12/29 19:25
# @Author : RobbieHan
# @File : views_scan.py
import ast
import logging
from ruamel import yaml
from django.views.generic import View
from django.http import JsonResponse
from django.shortcuts import render
from system.mixin import LoginRequiredMixin
from custom import BreadcrumbMixin
from utils.sandbox_utils import ConfigFileMixin
from system.models import Menu
error_logger = logging.getLogger('sandbox_error')
class ScanConfigView(LoginRequiredMixin, BreadcrumbMixin, ConfigFileMixin, View):
def get(self, request):
menu = Menu.get_menu_by_request_url(request.path_info)
template_name = 'cmdb/scan_config.html'
context = self.get_conf_content()
context.update(menu)
return render(request, template_name, context)
def post(self, request):
ret = dict(result=False)
config = dict()
hosts = request.POST
try:
config['net_address'] = ast.literal_eval(hosts['net_address'])
config['ssh_username'] = hosts['ssh_username']
config['ssh_port'] = hosts['ssh_port']
config['ssh_password'] = hosts['ssh_password']
config['ssh_private_key'] = hosts['ssh_private_key']
config['commands'] = ast.literal_eval(hosts['commands'])
config['auth_type'] = hosts['auth_type']
config['scan_type'] = hosts['scan_type']
config['email'] = hosts['email']
config['send_email'] = hosts['send_email']
data = dict(hosts=config)
config_file = self.get_config_file()
with open(config_file, 'w', encoding='utf-8') as f:
yaml.dump(data, f, Dumper=yaml.RoundTripDumper, indent=4)
ret['result'] = True
except Exception as e:
error_logger.error(e)
return JsonResponse(ret)

View File

@@ -3,10 +3,13 @@
# @File : custom.py
import json
import re
from django.views.generic import CreateView, UpdateView
from django.views.generic import CreateView, UpdateView, View
from django.shortcuts import HttpResponse
from django.http import Http404
from django.http import Http404, JsonResponse
from django.db.models.query import QuerySet
from django.core.exceptions import ImproperlyConfigured
from system.mixin import LoginRequiredMixin
from system.models import Menu
@@ -42,6 +45,69 @@ class SandboxGetObjectMixin:
return obj
class SandboxMultipleObjectMixin:
filters = {}
fields = []
queryset = None
model = None
def get_queryset(self):
if self.queryset is not None:
queryset = self.queryset
if isinstance(queryset, QuerySet):
queryset = queryset.all()
elif self.model is not None:
queryset = self.model._default_manager.all()
else:
raise ImproperlyConfigured(
"%(cls)s is missing a QuerySet. Define "
"%(cls)s.model, %(cls)s.queryset."
% {'cls': self.__class__.__name__}
)
return queryset
def get_datatables_paginator(self, request):
datatables = request.GET
draw = int(datatables.get('draw'))
start = int(datatables.get('start'))
length = int(datatables.get('length'))
order_column = datatables.get('order[0][column]')
order_dir = datatables.get('order[0][dir]')
order_field = datatables.get('columns[{}][data]'.format(order_column))
queryset = self.get_queryset()
if order_dir == 'asc':
queryset = queryset.order_by(order_field)
else:
queryset = queryset.order_by('-{0}'.format(order_field))
record_total_count = queryset.count()
filters = self.get_filters()
fields = self.get_fields()
if filters:
queryset = queryset.filter(**self.filters)
if fields:
queryset = queryset.values(*self.fields)
record_filter_count = queryset.count()
object_list = queryset[start:(start + length)]
data = list(object_list)
return {
'draw': draw,
'recordsTotal': record_total_count,
'recordsFiltered': record_filter_count,
'data': data,
}
def get_filters(self):
return self.filters
def get_fields(self):
return self.fields
class SandboxEditViewMixin:
def post(self, request, *args, **kwargs):
@@ -50,6 +116,11 @@ class SandboxEditViewMixin:
if form.is_valid():
form.save()
res['result'] = True
else:
pattern = '<li>.*?<ul class=.*?><li>(.*?)</li>'
form_errors = str(form.errors)
errors = re.findall(pattern, form_errors)
res['error'] = errors[0]
return HttpResponse(json.dumps(res), content_type='application/json')
@@ -65,3 +136,27 @@ class SandboxUpdateView(LoginRequiredMixin, SandboxEditViewMixin, SandboxGetObje
def post(self, request, *args, **kwargs):
self.object = self.get_object()
return super().post(request, *args, **kwargs)
class SandboxListView(LoginRequiredMixin, SandboxMultipleObjectMixin, View):
"""
JsonResponse some json of objects, set by `self.model` or `self.queryset`.
"""
def get(self, request):
context = self.get_datatables_paginator(request)
return JsonResponse(context)
class SandboxDeleteView(LoginRequiredMixin, SandboxMultipleObjectMixin, View):
def post(self, request):
context = dict(result=False)
queryset = self.get_queryset()
if 'id' in request.POST and request.POST['id']:
id_list = map(int, request.POST['id'].split(','))
queryset.filter(id__in=id_list).delete()
context['result'] = True
else:
raise AttributeError("Sandbox delete view %s must be called with id. "
% self.__class__.__name__)
return JsonResponse(context)

3
apps/utils/__init__.py Normal file
View File

@@ -0,0 +1,3 @@
# @Time : 2018/12/29 16:26
# @Author : RobbieHan
# @File : __init__.py.py

View File

@@ -0,0 +1,74 @@
# @Time : 2018/12/29 19:22
# @Author : RobbieHan
# @File : sandbox_utils.py
import os
from django.conf import settings
import yaml
import logging
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sandboxMP.settings')
error_logger = logging.getLogger('sandbox_error')
class ConfigFileMixin:
config_file = None
def get_config_file(self):
"""
Return 'config_file' that will be used to look up the scan hosts IP,
network, range of IP, or other config settings.
This method is called by the default implementation of get_hosts(),
"""
if self.config_file is None:
config_file = os.path.join(os.path.join(settings.BASE_DIR, 'config'), 'scanhosts.yml')
if os.path.exists(config_file):
return config_file
else:
msg = ' %(cls)s is missing a config file. Define %(cls)s.config_file, ' \
'or override %(cls)s.get_config_file().' % {'cls': self.__class__.__name__}
error_logger.error(msg)
raise ValueError(msg)
return self.config_file
def get_conf_content(self, *key):
"""
Get the configuration content from config file .
Example ssh_password, commands, email which is in the config file.
"""
_config = self.get_config_file()
with open(_config) as f:
content = yaml.load(f)
if key is not None:
try:
num = 0
while num < len(key):
content = content[key[num]]
num += 1
except Exception as e:
msg = '%(exc)s is not in %(config)s.' % {
'exc': e,
'config': _config
}
error_logger.error(msg)
raise ValueError(msg)
return content
def get_commands(self):
"""
Get the commands from config file.
"""
key = ['hosts', 'commands']
return self.get_conf_content(*key)
def get_net_address(self):
"""
Return the hosts that will be used to scan.
Subclasses can override this to return any hosts.
"""
key = ['hosts', 'net_address']
return self.get_conf_content(*key)

18
config/scanhosts.yml Normal file
View File

@@ -0,0 +1,18 @@
hosts:
net_address:
- '172.16.3.0/24'
- '172.16.2.100-105'
ssh_username: 'root'
ssh_port: '22'
ssh_password: '1234@abcd.com'
ssh_private_key: '/root/.ssh/id_rsa'
commands:
sys_hostname: 'hostname'
mac_address: 'cat /sys/class/net/[^tsbvl]*/address'
sn_number: 'dmidecode -s system-serial-number'
os_type: 'cat /etc/redhat-release'
device_type: 'echo `dmidecode -s system-manufacturer && dmidecode -s system-product-name`'
email: 'robbie_han@outlook.com'
send_email: 'false'
scan_type: 'basic_scan'
auth_type: 'private_key'

View File

@@ -1,2 +1 @@
django==2.1.2
pillow==5.3.0
-r pro.txt

View File

@@ -1,2 +1,14 @@
django==2.1.2
pillow==5.3.0
pillow==5.3.0
mysqlclient==1.3.13
ipython==7.1.1
pyyaml==3.13
ruamel.yaml==0.15.80
python-nmap==0.6.1
redis==3.0.1
pymongo==3.7.1
paramiko==2.4.2
pycrypto==2.6.1
celery==4.2.1
celery-once==2.0.0
flower==0.9.2

View File

@@ -40,6 +40,7 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'system',
'cmdb',
]
MIDDLEWARE = [
@@ -81,14 +82,24 @@ WSGI_APPLICATION = 'sandboxMP.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sandboxMP',
'HOST': '127.0.0.1',
'USER': 'ddadmin',
'PASSWORD': '1234@abcd.com',
'PORT': '3306'
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
@@ -143,10 +154,63 @@ SAFE_URL = [r'^/$',
'/media/',
'/admin/',
'/ckeditor/',
'/test/',
]
# session timeout
SESSION_COOKIE_AGE = 60 * 20
SESSION_EXPIRE_AT_BROWSER_CLOSE = True
SESSION_SAVE_EVERY_REQUEST = True
SESSION_SAVE_EVERY_REQUEST = True
# logging config
BASE_LOG_DIR = os.path.join(BASE_DIR, 'slogs')
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': '[%(asctime)s][task_id:%(name)s][%(levelname)s]'
'[%(filename)s:%(lineno)d][%(message)s]'
},
'simple': {
'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_LOG_DIR, "sandbox_info.log"),
'maxBytes': 1024 * 1024 * 50,
'backupCount': 3,
'formatter': 'simple',
'encoding': 'utf-8',
},
'error': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(BASE_LOG_DIR, "sandbox_err.log"),
'backupCount': 5,
'formatter': 'standard',
'encoding': 'utf-8',
}
},
'loggers': {
'sandbox_info': {
'handlers': ['default'],
'level': 'INFO',
'propagate': True,
},
'sandbox_error': {
'handlers': ['error'],
'level': 'ERROR',
}
}
}

View File

@@ -20,7 +20,7 @@ from django.urls import re_path
from django.views.static import serve
from system.views_user import IndexView, LoginView, LogoutView
from cmdb.tests import TestLoggingView
urlpatterns = [
path('admin/', admin.site.urls),
@@ -28,6 +28,9 @@ urlpatterns = [
path('login/', LoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
path('system/', include('system.urls', namespace='system')),
path('cmdb/', include('cmdb.urls', namespace='cmdb')),
path('test/', TestLoggingView.as_view()),
]
@@ -35,4 +38,4 @@ if settings.DEBUG:
urlpatterns += [
re_path(r'^media/(?P<path>.*)$', serve, {"document_root": settings.MEDIA_ROOT}),
]
]

View File

@@ -2,7 +2,7 @@ var DATATABLES_CONSTANT = {
// datatables常量
DATA_TABLES : {
DEFAULT_OPTION : { // DataTables初始化选项
SERVER_SIDE_OPTION : { // DataTables初始化选项
oLanguage : {
sProcessing : "处理中...",
sLengthMenu : "每页 _MENU_ 项",//"显示 _MENU_ 项结果,",

View File

@@ -0,0 +1,20 @@
{% extends "base-left.html" %}
{% load staticfiles %}
{% block css %}{% endblock %}
{% block content %}
<!-- Main content -->
<section class="content">
这里是配置管理首页临时内容
</section>
<!-- /.content -->
{% endblock %}
{% block javascripts %}
{% endblock %}

274
templates/cmdb/code.html Normal file
View File

@@ -0,0 +1,274 @@
{% extends "base-left.html" %}
{% load staticfiles %}
{% block css %}
<link rel="stylesheet" href="{% static 'plugins/datatables/jquery.dataTables.min.css' %}">
<link rel="stylesheet" href="{% static 'js/plugins/layer/skin/layer.css' %}">
<link rel="stylesheet" href="{% static 'plugins/select2/select2.min.css' %}">
{% endblock %}
{% block content %}
<!-- Main content -->
<section class="content">
<div id="devlist">
<div class="box box-primary" id="liebiao">
<div class="box-header">
<div class="btn-group pull-left">
<button type="button" id="btnRefresh" class="btn btn-default">
<i class="glyphicon glyphicon-repeat"></i>刷新
</button>
</div>
<div class="btn-group pull-left">&nbsp</div>
<div class="btn-group pull-left">
<button type="button" id="btnCreate" class="btn btn-default">
<i class="glyphicon glyphicon-plus"></i>新增
</button>
</div>
<div class="btn-group pull-left">&nbsp</div>
<div class="btn-group pull-left">
<button type="button" id="btnDelete" class="btn btn-default">
<i class="glyphicon glyphicon-trash"></i>删除
</button>
</div>
<div class="pull-right">
<form class="form-inline" id="queryForm">
<div class="form-group searchArea margin-r-5 margin-top-5">
<label>字典分类</label>
<select class="form-control inputText select2" name="parent" id="parent">
<option style='text-align:center' value="">---所有---</option>
{% for code in code_parent %}
<option value={{ code.key}}>{{ code.value }}</option>
{% endfor %}
</select>
</div>
</form>
</div>
</div>
<div class="box-body">
<table id="dtbList" class="display" cellspacing="0" width="100%">
<thead>
<tr valign="middle">
<th><input type="checkbox" id="checkAll"></th>
<th>ID</th>
<th>KEY</th>
<th>VALUE</th>
<th>所属</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
<br> <br>
</div>
</div>
</div>
</section>
<!-- /.content -->
{% endblock %}
{% block javascripts %}
<script src="{% static 'plugins/datatables/jquery.dataTables.min.js' %}"></script>
<script src="{% static 'plugins/datatables/dataTables.const-1.js' %}"></script>
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>
<script src="{% static 'plugins/select2/select2.full.min.js' %}"></script>
<script type="text/javascript">
// 菜单选中高亮
$(function () {
$('#CMDB-PORTAL').addClass('active');
$('#CDMB-PORTAL-CODE').addClass('active');
});
// datatables 初始化配置
var oDataTable = null;
$(function () {
oDataTable = initTable();
function initTable() {
var oTable = $('#dtbList').DataTable($.extend(true, {},
DATATABLES_CONSTANT.DATA_TABLES.SERVER_SIDE_OPTION,
{
ajax: {
"url": "{% url 'cmdb:portal-code-list' %}",
"data": function (d) {
d.parent = $("#parent").val();
}
},
columns: [
DATATABLES_CONSTANT.DATA_TABLES.COLUMN.CHECKBOX,
{
data: "id",
width: "5%",
},
{
data: "key",
//width : "20%",
},
{
data: "value",
//width : "20%",
},
{
data: "parent__value",
//width : "20%",
},
{
data: "id",
width: "10%",
bSortable: "false",
render: function (data, type, row, meta) {
var ret = "";
var ret = "<button title='详情' onclick='doUpdate("
+ data + ")'><i class='glyphicon glyphicon-pencil'></i></button>";
ret = ret + "<button title='删除' onclick='doDelete("
+ data + ")'><i class='glyphicon glyphicon-trash'></i></button>";
return ret;
}
}],
}));
return oTable;
}
});
//select2
$(function () {
//Initialize Select2 Elements
$(".select2").select2();
});
//过滤刷新接口获取新的数据
$("#parent").change(function () {
oDataTable.ajax.reload();
});
// 刷新数据
$("#btnRefresh").click(function () {
oDataTable.ajax.reload();
});
//新建字典
$("#btnCreate").click(function () {
layer.open({
type: 2,
title: '新增',
shadeClose: false,
maxmin: true,
area: ['800px', '400px'],
content: "{% url 'cmdb:portal-code-create' %}",
end: function () {
//关闭时做的事情
oDataTable.ajax.reload();
}
});
});
//修改字典
function doUpdate(id) {
layer.open({
type: 2,
title: '编辑',
shadeClose: false,
maxmin: true,
area: ['800px', '400px'],
content: ["{% url 'cmdb:portal-code-update' %}" + '?id=' + id, 'no'],
end: function () {
oDataTable.ajax.reload();
}
});
}
//checkbox全选
$("#checkAll").on("click", function () {
if ($(this).prop("checked") === true) {
$("input[name='checkList']").prop("checked", $(this).prop("checked"));
$('#example tbody tr').addClass('selected');
} else {
$("input[name='checkList']").prop("checked", false);
$('#example tbody tr').removeClass('selected');
}
});
//批量删除
$("#btnDelete").click(function () {
if ($("input[name='checkList']:checked").length == 0) {
layer.msg("请选择要删除的记录");
return;
}
var arrId = new Array();
$("input[name='checkList']:checked").each(function () {
//alert($(this).val());
arrId.push($(this).val());
});
sId = arrId.join(',');
layer.alert('确定删除吗?', {
title: '提示'
, icon: 3 //0:感叹号 1对号 2差号 3问号 4小锁 5哭脸 6笑脸
, time: 0 //不自动关闭
, btn: ['YES', 'NO']
, yes: function (index) {
layer.close(index);
$.ajax({
type: "POST",
url: "{% url 'cmdb:portal-code-delete' %}",
data: {"id": sId, csrfmiddlewaretoken: '{{ csrf_token }}'},
cache: false,
success: function (msg) {
if (msg.result) {
layer.alert("操作成功", {icon: 1});
oDataTable.ajax.reload();
} else {
//alert(msg.message);
layer.alert("操作失败", {icon: 2});
}
return;
}
});
}
});
});
//删除单个数据
function doDelete(id) {
layer.alert('确定删除吗?', {
title: '提示'
, icon: 3 //0:感叹号 1对号 2差号 3问号 4小锁 5哭脸 6笑脸
, time: 0 //不自动关闭
, btn: ['YES', 'NO']
, yes: function (index) {
layer.close(index);
$.ajax({
type: "POST",
url: "{% url 'cmdb:portal-code-delete' %}",
data: {"id": id, csrfmiddlewaretoken: '{{ csrf_token }}'},
cache: false,
success: function (msg) {
if (msg.result) {
layer.alert('删除成功', {icon: 1});
oDataTable.ajax.reload();
} else {
//alert(msg.message);
layer.alert('删除失败', {icon: 2});
}
return;
}
});
}
});
}
</script>
{% endblock %}

View File

@@ -0,0 +1,97 @@
{% extends 'base-layer.html' %}
{% load staticfiles %}
{% block css %}
<link rel="stylesheet" href="{% static 'plugins/select2/select2.min.css' %}">
<!-- iCheck for checkboxes and radio inputs -->
{% endblock %}
{% block main %}
<div class="box box-danger">
<form class="form-horizontal" id="addForm" method="post">
{% csrf_token %}
<div class="box-body">
<fieldset>
<legend>
<h4>新建字典</h4>
</legend>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">KEY</label>
<div class="col-sm-3">
<input class="form-control" name="key" type="text"/>
</div>
<label class="col-sm-2 control-label">VALUE</label>
<div class="col-sm-3">
<input class="form-control" name="value" type="text" />
</div>
</div>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">父菜单</label>
<div class="col-sm-3">
<select class="form-control select2" name="parent">
<option value=""></option>
{% for parent in code_parent %}
<option value={{ parent.id }}> {{ parent.value }} </option>
{% endfor %}
</select>
</div>
<label class="col-sm-2 control-label">描述信息</label>
<div class="col-sm-3">
<input class="form-control" id="desc" name="desc" type="text" />
</div>
</div>
</fieldset>
</div>
<div class="box-footer ">
<div class="row span7 text-center ">
<button type="button" id="btnCancel" class="btn btn-default margin-right ">重置</button>
<button type="button" id="btnSave" class="btn btn-info margin-right ">保存</button>
</div>
</div>
</form>
</div>
{% endblock %}
{% block javascripts %}
<script src="{% static 'plugins/select2/select2.full.min.js' %}"></script>
<script type="text/javascript">
$("#btnSave").click(function () {
var data = $("#addForm").serialize();
$.ajax({
type: $("#addForm").attr('method'),
url: "{% url 'cmdb:portal-code-create' %}",
data: data,
cache: false,
success: function (msg) {
if (msg.result) {
layer.alert('数据保存成功!', {icon: 1}, function (index) {
parent.layer.closeAll(); //关闭所有弹窗
});
} else {
layer.alert(msg.error, {icon: 5});
//$('errorMessage').html(msg.message)
}
return;
}
});
});
/*点取消刷新新页面*/
$("#btnCancel").click(function () {
window.location.reload();
});
$(function () {
//Initialize Select2 Elements
$(".select2").select2();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,99 @@
{% extends 'base-layer.html' %}
{% load staticfiles %}
{% block css %}
<link rel="stylesheet" href="{% static 'plugins/select2/select2.min.css' %}">
<!-- iCheck for checkboxes and radio inputs -->
{% endblock %}
{% block main %}
<div class="box box-danger">
<form class="form-horizontal" id="addForm" method="post">
<input type="hidden" name='id' type='text' value="{{ code.id }}"/>
{% csrf_token %}
<div class="box-body">
<fieldset>
<legend>
<h4>修改字典</h4>
</legend>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">KEY</label>
<div class="col-sm-3">
<input class="form-control" name="key" type="text" value="{{ code.key }}"/>
</div>
<label class="col-sm-2 control-label">VALUE</label>
<div class="col-sm-3">
<input class="form-control" name="value" type="text" value="{{ code.value }}"/>
</div>
</div>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">父菜单</label>
<div class="col-sm-3">
<select class="form-control select2" name="parent">
<option value={{ code.parent.id }}> {{ code.parent.value }} </option>
<option value=""></option>
{% for parent in code_parent %}
<option value={{ parent.id }}> {{ parent.value }} </option>
{% endfor %}
</select>
</div>
<label class="col-sm-2 control-label">描述信息</label>
<div class="col-sm-3">
<input class="form-control" id="desc" name="desc" type="text" />
</div>
</div>
</fieldset>
</div>
<div class="box-footer ">
<div class="row span7 text-center ">
<button type="button" id="btnCancel" class="btn btn-default margin-right ">重置</button>
<button type="button" id="btnSave" class="btn btn-info margin-right ">保存</button>
</div>
</div>
</form>
</div>
{% endblock %}
{% block javascripts %}
<script src="{% static 'plugins/select2/select2.full.min.js' %}"></script>
<script type="text/javascript">
$("#btnSave").click(function () {
var data = $("#addForm").serialize();
$.ajax({
type: $("#addForm").attr('method'),
url: "{% url 'cmdb:portal-code-update' %}",
data: data,
cache: false,
success: function (msg) {
if (msg.result) {
layer.alert('数据保存成功!', {icon: 1}, function (index) {
parent.layer.closeAll(); //关闭所有弹窗
});
} else {
layer.alert(msg.error, {icon: 5});
//$('errorMessage').html(msg.message)
}
return;
}
});
});
/*点取消刷新新页面*/
$("#btnCancel").click(function () {
window.location.reload();
});
$(function () {
//Initialize Select2 Elements
$(".select2").select2();
});
</script>
{% endblock %}

View File

@@ -0,0 +1,176 @@
{% extends "base-left.html" %}
{% load staticfiles %}
{% block css %}
<link rel="stylesheet" href="{% static 'js/plugins/layer/skin/layer.css' %}">
{% endblock %}
{% block content %}
<!-- Main content -->
<section class="content">
<div class="row">
<div class="col-md-8">
<!-- Horizontal Form -->
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">扫面参数配置</h3>
</div>
<!-- /.box-header -->
<!-- form start -->
<form class="form-horizontal" id="addForm" method="post">
{% csrf_token %}
<div class="box-body">
<div class="form-group">
<label class="col-sm-2 control-label">扫描网段</label>
<div class="col-sm-10">
<input class="form-control" id="net_address" name="net_address" value="{{ hosts.net_address }}">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">登陆用户</label>
<div class="col-sm-10">
<input class="form-control" id="ssh_username" name="ssh_username" value="{{ hosts.ssh_username }}">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">SSH端口</label>
<div class="col-sm-10">
<input class="form-control" id="ssh_port" name="ssh_port" value="{{ hosts.ssh_port }}">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">登陆密码</label>
<div class="col-sm-10">
<input class="form-control" type="password" id="ssh_password" name="ssh_password" value="{{ hosts.ssh_password }}">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">密钥路径</label>
<div class="col-sm-10">
<input class="form-control" id="ssh_private_key" name="ssh_private_key" value="{{ hosts.ssh_private_key }}">
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">运行命令</label>
<div class="col-sm-10">
<textarea class="form-control" rows="5" id="commands" name="commands" readonly>{{ hosts.commands }}</textarea>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">认证方式</label>
<div class="col-sm-4">
<select class="form-control" name="auth_type">
<option value="password" {% ifequal hosts.auth_type 'password' %}selected="selected"{% endifequal %}>密码认证</option>
<option value="private_key" {% ifequal hosts.auth_type 'private_key' %}selected="selected"{% endifequal %}>私钥认证</option>
</select>
</div>
<label class="col-sm-2 control-label">扫描方式</label>
<div class="col-sm-4">
<select class="form-control" name="scan_type">
<option value="basic_scan" {% ifequal hosts.scan_type 'basic_scan' %}selected="selected"{% endifequal %}>基础扫描</option>
<option value="enhanced_scan" {% ifequal hosts.scan_type 'enhanced_scan' %}selected="selected"{% endifequal %}>加强扫描</option>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">收件邮箱</label>
<div class="col-sm-10">
<input class="form-control" id="email" name="email" value="{{ hosts.email }}">
</div>
</div>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">发送邮件</label>
<div class="col-sm-10">
<label class="control-label">
<input type="radio" class="minimal" name="send_email" value="true" {% ifequal hosts.send_email 'true' %}checked{% endifequal %}>
</label>
<label class="control-label">
<input type="radio" class="minimal" name="send_email" value="false" {% ifequal hosts.send_email 'false' %}checked{% endifequal %}>
</label>
</div>
</div>
</div>
<!-- /.box-body -->
<div class="box-footer">
<span class="pull-right">
<button type="button" id="btnCancel" class="btn btn-default">取消</button>
<button type="button" id="btnSave" class="btn btn-info">保存</button>
</span>
</div>
<!-- /.box-footer -->
</form>
</div>
</div>
<div class="col-sm-4">
<div class="box box-default">
<div class="box-header with-border">
<h3 class="box-title">参数配置说明</h3>
</div><!-- /.box-header -->
<div class="box-body">
<a class="product-title"><strong>扫描网段</strong><span class="label label-danger pull-right">必填参数</span></a>
<p><small>网络扫描地址列表列表中可以包含一个或多个网段也可以是一个或多个地址区间例如['192.168.100.0/24', '192.168.100.10-20']</small></p>
<a class="product-title"><strong>登陆用户</strong><span class="label label-danger pull-right">必填参数</span></a>
<p><small>系统登陆测试使用的用户名默认root</small></p>
<a class="product-title"><strong>登陆密码</strong><span class="label label-danger pull-right">可选参数</span></a>
<p><small>系统登陆测试使用的密码如过认证方式为密码认证必须填写密码信息</small></p>
<a class="product-title"><strong>密钥路径</strong><span class="label label-primary pull-right">可选参数</span></a>
<p><small>系统登陆测试使用的密钥存放路径如过认证方式为私钥认证必须填写密钥路径</small></p>
<a class="product-title"><strong>运行命令</strong><span class="label label-default pull-right">预定义参数</span></a>
<p><small>登陆系统后运行的基本命令用来获取系统基本信息当扫描方式为加强扫描时才会执行运行命令运行命令为预定义禁止修改</small></p>
<a class="product-title"><strong>认证方式</strong><span class="label label-primary pull-right">可选参数</span></a>
<p><small>系统登陆认证方式包括密码认证和私钥认证两种方式当扫描方式为加强扫描时需要设定认证方式</small></p>
<a class="product-title"><strong>扫描方式</strong><span class="label label-primary pull-right">可选参数</span></a>
<p><small>系统扫描方式包括基本扫描和加强扫描当设置为加强扫描时会登陆系统执行运行命令获取系统信息</small></p>
<a class="product-title"><strong>收件邮箱</strong><span class="label label-primary pull-right">可选参数</span></a>
<p><small>用于接收扫描结果邮件可以通过发送邮件选项设置是否发送通知邮件</small></p>
</div><!-- /.box-body -->
</div><!-- /.box -->
</div>
<!-- /.box -->
</div>
</section>
<!-- /.content -->
{% endblock %}
{% block javascripts %}
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>
<script type="text/javascript">
// 菜单选中高亮
$(function () {
$('#CMDB-PORTAL').addClass('active');
$('#CMDB-PORTAL-SCAN_CONFIG').addClass('active');
});
$("#btnSave").click(function () {
var hosts = $("#addForm").serialize();
$.ajax({
type: $("#addForm").attr('method'),
url: "{% url 'cmdb:portal-scan_config' %}",
cache: false,
data: hosts,
success: function (msg) {
if (msg.result) {
layer.alert('数据保存成功!', {icon: 1});
} else {
layer.alert('数据保存失败', {icon: 5});
//$('errorMessage').html(msg.message)
}
},
});
});
/*点取消刷新新页面*/
$("#btnCancel").click(function () {
window.location.reload();
});
</script>
{% endblock %}