Commit d036ef7f authored by guanghongwei's avatar guanghongwei

Merge branch 'dev' of ssh://172.10.10.9:2001/opt/jumpserver into dev

parents 2ca299a3 b2118563
jumpserver
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false" />
</project>
<component name="InspectionProjectProfileManager">
<profile version="1.0" is_locked="false">
<option name="myName" value="Project Default" />
<option name="myLocal" value="false" />
<inspection_tool class="SqlDialectInspection" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>
\ No newline at end of file
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="jdk" jdkName="Python 2.7.6 (C:/Python27/python.exe)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.6 (C:/Python27/python.exe)" project-jdk-type="Python SDK" />
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/jumpserver.iml" filepath="$PROJECT_DIR$/.idea/jumpserver.iml" />
</modules>
</component>
</project>
<component name="DependencyValidationManager">
<state>
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
</state>
</component>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="3a3feb99-ffa7-4370-b111-c1793a147bed" name="Default" comment="">
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/.idea/jumpserver.iml" afterPath="$PROJECT_DIR$/.idea/jumpserver.iml" />
<change type="MODIFICATION" beforePath="$PROJECT_DIR$/jumpserver.py" afterPath="$PROJECT_DIR$/jumpserver.py" />
</list>
<ignored path="jumpserver.iws" />
<ignored path=".idea/workspace.xml" />
<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="ChangesViewManager" flattened_view="true" show_ignored="false" />
<component name="CreatePatchCommitExecutor">
<option name="PATCH_PATH" value="" />
</component>
<component name="DaemonCodeAnalyzer">
<disable_hints />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FavoritesManager">
<favorites_list name="jumpserver" />
</component>
<component name="FileEditorManager">
<leaf>
<file leaf-file-name="views.py" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/views.py">
<provider selected="true" editor-type-id="text-editor">
<state line="38" column="0" selection-start="1129" selection-end="1129" vertical-scroll-proportion="0.0" vertical-offset="418" max-vertical-offset="19817">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="jumpserver.py" pinned="false" current="true" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/jumpserver.py">
<provider selected="true" editor-type-id="text-editor">
<state line="111" column="39" selection-start="3028" selection-end="3028" vertical-scroll-proportion="-5.6809607" vertical-offset="5421" max-vertical-offset="6004">
<folding>
<element signature="e#36#45#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="models.py" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/UserManage/models.py">
<provider selected="true" editor-type-id="text-editor">
<state line="28" column="4" selection-start="848" selection-end="855" vertical-scroll-proportion="0.0" vertical-offset="532" max-vertical-offset="1026">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="urls.py" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state line="35" column="43" selection-start="1202" selection-end="1202" vertical-scroll-proportion="0.0" vertical-offset="665" max-vertical-offset="817">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="settings.py" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state line="56" column="48" selection-start="1521" selection-end="1521" vertical-scroll-proportion="0.0" vertical-offset="1064" max-vertical-offset="2451">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="showUser.html" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/showUser.html">
<provider selected="true" editor-type-id="text-editor">
<state line="31" column="40" selection-start="1091" selection-end="1091" vertical-scroll-proportion="0.0" vertical-offset="386" max-vertical-offset="1083">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="showSudo.html" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/showSudo.html">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="32" selection-start="437" selection-end="437" vertical-scroll-proportion="0.0" vertical-offset="247" max-vertical-offset="456">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="jumpserver.conf" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/jumpserver.conf">
<provider selected="true" editor-type-id="text-editor">
<state line="17" column="33" selection-start="359" selection-end="359" vertical-scroll-proportion="0.0" vertical-offset="323" max-vertical-offset="437">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="upFile.html" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/upFile.html">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="45" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="912">
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="log_handler.py" pinned="false" current="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/log_handler.py">
<provider selected="true" editor-type-id="text-editor">
<state line="82" column="17" selection-start="2150" selection-end="2150" vertical-scroll-proportion="0.0" vertical-offset="1558" max-vertical-offset="1938">
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FindManager">
<FindUsagesManager>
<setting name="OPEN_NEW_TAB" value="false" />
</FindUsagesManager>
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="IdeDocumentHistory">
<option name="changedFiles">
<list>
<option value="$PROJECT_DIR$/shell.conf" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/index.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/Assets/models.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/UserManage/forms.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/chgKey.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/error.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/addGroup.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/showGroup.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/chgGroup.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/chgUser.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/chgPass.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/chgSudo.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/showSudo.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/info.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/upFile.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/downFile.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/addAssets.html" />
<option value="$PROJECT_DIR$/pip-requirement.txt" />
<option value="$PROJECT_DIR$/webroot/AutoSa/AutoSa/settings.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/AutoSa/templatetags/mytags.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/loghandler.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/logHistory.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/base.html" />
<option value="$PROJECT_DIR$/scripts/pip-requirement.txt" />
<option value="$PROJECT_DIR$/webroot/AutoSa/UserManage/models.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/AutoSa/urls.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/showUser.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/addUser.html" />
<option value="$PROJECT_DIR$/webroot/AutoSa/log_handler.py" />
<option value="$PROJECT_DIR$/webroot/AutoSa/templates/logView.html" />
<option value="$PROJECT_DIR$/jumpserver.conf" />
<option value="$PROJECT_DIR$/webroot/AutoSa/AutoSa/views.py" />
<option value="$PROJECT_DIR$/jumpserver.py" />
</list>
</option>
</component>
<component name="ProjectFrameBounds">
<option name="x" value="-8" />
<option name="y" value="-8" />
<option name="width" value="1382" />
<option name="height" value="744" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="2" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectReloadState">
<option name="STATE" value="0" />
</component>
<component name="ProjectView">
<navigator currentView="ProjectPane" proportions="" version="1" splitterProportion="0.5">
<flattenPackages />
<showMembers />
<showModules />
<showLibraryContents />
<hideEmptyPackages />
<abbreviatePackageNames />
<autoscrollToSource />
<autoscrollFromSource />
<sortByType />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="jumpserver" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="jumpserver" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="jumpserver" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="jumpserver" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="jumpserver" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="webroot" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="jumpserver" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="jumpserver" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="webroot" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="AutoSa" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
</subPane>
</pane>
</panes>
</component>
<component name="PropertiesComponent">
<property name="options.lastSelected" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
<property name="options.splitter.main.proportions" value="0.3" />
<property name="options.splitter.details.proportions" value="0.2" />
<property name="options.searchVisible" value="true" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="FullScreen" value="false" />
<property name="DefaultHtmlFileTemplate" value="Html5" />
<property name="SearchEverywhereHistory" value="&#10;《" />
</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="MoveFile.RECENT_KEYS">
<recent name="C:\Users\ThinkPad\jumpserver\webroot\AutoSa" />
<recent name="C:\Users\ThinkPad\jumpserver\webroot\AutoSa\AutoSa" />
</key>
</component>
<component name="RunManager">
<configuration default="true" type="DjangoTestsConfigurationType" factoryName="Django tests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</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="jumpserver" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="TARGET" value="" />
<option name="SETTINGS_FILE" value="" />
<option name="CUSTOM_SETTINGS" value="false" />
<option name="USE_OPTIONS" value="false" />
<option name="OPTIONS" value="" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="py.test">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<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="jumpserver" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="testToRun" value="" />
<option name="keywords" value="" />
<option name="params" value="" />
<option name="USE_PARAM" value="false" />
<option name="USE_KEYWORD" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Nosetests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<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="jumpserver" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="PARAMS" value="" />
<option name="USE_PARAM" value="false" />
<method />
</configuration>
<configuration default="true" type="PythonConfigurationType" factoryName="Python">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</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="jumpserver" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="PARAMETERS" value="" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Unittests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<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="jumpserver" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<option name="PUREUNITTEST" value="true" />
<option name="PARAMS" value="" />
<option name="USE_PARAM" value="false" />
<method />
</configuration>
<configuration default="true" type="JavascriptDebugType" factoryName="JavaScript Debug" singleton="true">
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Doctests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<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="jumpserver" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<method />
</configuration>
<configuration default="true" type="tests" factoryName="Attests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<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="jumpserver" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="FOLDER_NAME" value="" />
<option name="TEST_TYPE" value="TEST_SCRIPT" />
<option name="PATTERN" value="" />
<option name="USE_PATTERN" value="false" />
<method />
</configuration>
<list size="0" />
</component>
<component name="ShelveChangesManager" show_recycled="false" />
<component name="SvnConfiguration" maxAnnotateRevisions="500" myUseAcceleration="nothing" myAutoUpdateAfterCommit="false" cleanupOnStartRun="false" SSL_PROTOCOLS="all">
<option name="USER" value="" />
<option name="PASSWORD" value="" />
<option name="mySSHConnectionTimeout" value="30000" />
<option name="mySSHReadTimeout" value="30000" />
<option name="LAST_MERGED_REVISION" />
<option name="MERGE_DRY_RUN" value="false" />
<option name="MERGE_DIFF_USE_ANCESTRY" value="true" />
<option name="UPDATE_LOCK_ON_DEMAND" value="false" />
<option name="IGNORE_SPACES_IN_MERGE" value="false" />
<option name="CHECK_NESTED_FOR_QUICK_MERGE" value="false" />
<option name="IGNORE_SPACES_IN_ANNOTATE" value="true" />
<option name="SHOW_MERGE_SOURCES_IN_ANNOTATE" value="true" />
<option name="FORCE_UPDATE" value="false" />
<option name="IGNORE_EXTERNALS" value="false" />
<myIsUseDefaultProxy>false</myIsUseDefaultProxy>
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="3a3feb99-ffa7-4370-b111-c1793a147bed" name="Default" comment="" />
<created>1410786645479</created>
<updated>1410786645479</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="-8" y="-8" width="1382" height="744" extended-state="6" />
<editor active="true" />
<layout>
<window_info id="Changes" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" 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" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" weight="0.14787701" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" 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" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="7" side_tool="true" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" 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" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="0" 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" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.33" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="SLIDING" type="SLIDING" visible="false" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
</layout>
</component>
<component name="Vcs.Log.UiProperties">
<option name="RECENTLY_FILTERED_USER_GROUPS">
<collection />
</option>
</component>
<component name="VcsContentAnnotationSettings">
<option name="myLimit" value="2678400000" />
</component>
<component name="VcsManagerConfiguration">
<option name="myTodoPanelSettings">
<TodoPanelSettings />
</option>
</component>
<component name="XDebuggerManager">
<breakpoint-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/downFile.html">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="18" selection-start="1290" selection-end="1290" vertical-scroll-proportion="0.0" vertical-offset="105" max-vertical-offset="798">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jumpserver.py">
<provider selected="true" editor-type-id="text-editor">
<state line="61" column="20" selection-start="1546" selection-end="1546" vertical-scroll-proportion="0.0" vertical-offset="1159" max-vertical-offset="5757">
<folding>
<element signature="e#36#45#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jumpserver.conf">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="0" selection-start="167" selection-end="167" vertical-scroll-proportion="0.0" vertical-offset="228" max-vertical-offset="437">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/logView.html">
<provider selected="true" editor-type-id="text-editor">
<state line="35" column="46" selection-start="1299" selection-end="1299" vertical-scroll-proportion="0.0" vertical-offset="329" max-vertical-offset="1235" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
<state line="5" column="31" selection-start="106" selection-end="106" vertical-scroll-proportion="0.0" vertical-offset="2280" max-vertical-offset="2964" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/perms.html">
<provider selected="true" editor-type-id="text-editor">
<state line="16" column="32" selection-start="664" selection-end="664" vertical-scroll-proportion="0.0" vertical-offset="304" max-vertical-offset="760" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
<state line="135" column="11" selection-start="6455" selection-end="6455" vertical-scroll-proportion="0.0" vertical-offset="2219" max-vertical-offset="2850" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/info.html">
<provider selected="true" editor-type-id="text-editor">
<state line="31" column="30" selection-start="957" selection-end="957" vertical-scroll-proportion="0.0" vertical-offset="414" max-vertical-offset="1140" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/addUser.html">
<provider selected="true" editor-type-id="text-editor">
<state line="21" column="23" selection-start="689" selection-end="689" vertical-scroll-proportion="0.0" vertical-offset="171" max-vertical-offset="1862" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/UserManage/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state line="19" column="28" selection-start="791" selection-end="791" vertical-scroll-proportion="0.0" vertical-offset="57" max-vertical-offset="931" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/UserManage/models.py">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="38" selection-start="432" selection-end="432" vertical-scroll-proportion="0.0" vertical-offset="285" max-vertical-offset="589" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/Assets/models.py">
<provider selected="true" editor-type-id="text-editor">
<state line="14" column="0" selection-start="396" selection-end="396" vertical-scroll-proportion="0.0" vertical-offset="266" max-vertical-offset="437" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="38" selection-start="641" selection-end="641" vertical-scroll-proportion="0.0" vertical-offset="418" max-vertical-offset="2432" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state line="23" column="33" selection-start="747" selection-end="747" vertical-scroll-proportion="0.0" vertical-offset="437" max-vertical-offset="589">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jumpserver.conf">
<provider selected="true" editor-type-id="text-editor">
<state line="14" column="22" selection-start="259" selection-end="259" vertical-scroll-proportion="0.0" vertical-offset="266" max-vertical-offset="513" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/index.html">
<provider selected="true" editor-type-id="text-editor">
<state line="9" column="33" selection-start="265" selection-end="265" vertical-scroll-proportion="0.0" vertical-offset="171" max-vertical-offset="855" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state line="22" column="38" selection-start="641" selection-end="641" vertical-scroll-proportion="0.0" vertical-offset="1473" max-vertical-offset="2432" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state line="23" column="33" selection-start="747" selection-end="747" vertical-scroll-proportion="0.0" vertical-offset="437" max-vertical-offset="589">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/index.html">
<provider selected="true" editor-type-id="text-editor">
<state line="25" column="5" selection-start="890" selection-end="890" vertical-scroll-proportion="-14.428572" vertical-offset="71" max-vertical-offset="836" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/login.html">
<provider selected="true" editor-type-id="text-editor">
<state line="10" column="0" selection-start="357" selection-end="432" vertical-scroll-proportion="-6.785714" vertical-offset="0" max-vertical-offset="1425" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/error.html">
<provider selected="true" editor-type-id="text-editor">
<state line="106" column="0" selection-start="2131" selection-end="2131" vertical-scroll-proportion="0.93153155" vertical-offset="1497" max-vertical-offset="2318" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/showAssets.html">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="-0.23243243" vertical-offset="129" max-vertical-offset="741" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/context_processors.py">
<provider selected="true" editor-type-id="text-editor">
<state line="6" column="40" selection-start="159" selection-end="164" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="228" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/showGroup.html">
<provider selected="true" editor-type-id="text-editor">
<state line="23" column="46" selection-start="848" selection-end="848" vertical-scroll-proportion="0.0" vertical-offset="85" max-vertical-offset="703" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/chgGroup.html">
<provider selected="true" editor-type-id="text-editor">
<state line="18" column="55" selection-start="623" selection-end="623" vertical-scroll-proportion="0.0" vertical-offset="342" max-vertical-offset="874" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/chgPass.html">
<provider selected="true" editor-type-id="text-editor">
<state line="12" column="29" selection-start="431" selection-end="431" vertical-scroll-proportion="0.0" vertical-offset="228" max-vertical-offset="1026" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/chgUser.html">
<provider selected="true" editor-type-id="text-editor">
<state line="57" column="36" selection-start="2610" selection-end="2615" vertical-scroll-proportion="1.4378378" vertical-offset="285" max-vertical-offset="1539" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/UserManage/forms.py">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="28" selection-start="316" selection-end="316" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="950" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/addGroup.html">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="45" vertical-scroll-proportion="-0.0" vertical-offset="0" max-vertical-offset="665" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/chgKey.html">
<provider selected="true" editor-type-id="text-editor">
<state line="4" column="35" selection-start="126" selection-end="173" vertical-scroll-proportion="-2.7142856" vertical-offset="0" max-vertical-offset="1026" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/info.html">
<provider selected="true" editor-type-id="text-editor">
<state line="32" column="0" selection-start="980" selection-end="980" vertical-scroll-proportion="0.0" vertical-offset="608" max-vertical-offset="1140" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/perms.html">
<provider selected="true" editor-type-id="text-editor">
<state line="16" column="32" selection-start="664" selection-end="664" vertical-scroll-proportion="0.0" vertical-offset="304" max-vertical-offset="760" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/chgSudo.html">
<provider selected="true" editor-type-id="text-editor">
<state line="32" column="16" selection-start="1608" selection-end="1608" vertical-scroll-proportion="0.0" vertical-offset="570" max-vertical-offset="1311" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/Assets/views.py">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="0" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="583" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/downFile.html">
<provider selected="true" editor-type-id="text-editor">
<state line="27" column="18" selection-start="1290" selection-end="1290" vertical-scroll-proportion="0.0" vertical-offset="105" max-vertical-offset="798">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/Assets/models.py">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="0" selection-start="64" selection-end="64" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="418" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/templatetags/mytags.py">
<provider selected="true" editor-type-id="text-editor">
<state line="11" column="17" selection-start="256" selection-end="256" vertical-scroll-proportion="0.32590052" vertical-offset="0" max-vertical-offset="583" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/base.html">
<provider selected="true" editor-type-id="text-editor">
<state line="2" column="6" selection-start="29" selection-end="29" vertical-scroll-proportion="0.0" vertical-offset="2223" max-vertical-offset="2926" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/addAssets.html">
<provider selected="true" editor-type-id="text-editor">
<state line="41" column="52" selection-start="1892" selection-end="1892" vertical-scroll-proportion="-11.678572" vertical-offset="452" max-vertical-offset="1007" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/urls.py">
<provider selected="true" editor-type-id="text-editor">
<state line="35" column="43" selection-start="1202" selection-end="1202" vertical-scroll-proportion="0.0" vertical-offset="177" max-vertical-offset="760">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/settings.py">
<provider selected="true" editor-type-id="text-editor">
<state line="56" column="48" selection-start="1521" selection-end="1521" vertical-scroll-proportion="0.0" vertical-offset="723" max-vertical-offset="2432">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/showUser.html">
<provider selected="true" editor-type-id="text-editor">
<state line="31" column="40" selection-start="1091" selection-end="1091" vertical-scroll-proportion="0.0" vertical-offset="386" max-vertical-offset="1083">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/showSudo.html">
<provider selected="true" editor-type-id="text-editor">
<state line="13" column="32" selection-start="437" selection-end="437" vertical-scroll-proportion="0.0" vertical-offset="247" max-vertical-offset="456">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/addUser.html">
<provider selected="true" editor-type-id="text-editor">
<state line="76" column="18" selection-start="3126" selection-end="3126" vertical-scroll-proportion="-8.964286" vertical-offset="1193" max-vertical-offset="1976" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/log_handler.py">
<provider selected="true" editor-type-id="text-editor">
<state line="82" column="17" selection-start="2150" selection-end="2150" vertical-scroll-proportion="0.0" vertical-offset="1336" max-vertical-offset="1900">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/UserManage/models.py">
<provider selected="true" editor-type-id="text-editor">
<state line="28" column="4" selection-start="848" selection-end="855" vertical-scroll-proportion="0.0" vertical-offset="405" max-vertical-offset="1026">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/upFile.html">
<provider selected="true" editor-type-id="text-editor">
<state line="0" column="0" selection-start="0" selection-end="45" vertical-scroll-proportion="-0.0" vertical-offset="0" max-vertical-offset="912">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/templates/logView.html">
<provider selected="true" editor-type-id="text-editor">
<state line="15" column="29" selection-start="435" selection-end="435" vertical-scroll-proportion="0.5135135" vertical-offset="0" max-vertical-offset="1368" />
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jumpserver.conf">
<provider selected="true" editor-type-id="text-editor">
<state line="17" column="33" selection-start="359" selection-end="359" vertical-scroll-proportion="0.0" vertical-offset="0" max-vertical-offset="437">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/webroot/AutoSa/AutoSa/views.py">
<provider selected="true" editor-type-id="text-editor">
<state line="38" column="0" selection-start="1129" selection-end="1129" vertical-scroll-proportion="0.0" vertical-offset="418" max-vertical-offset="19817">
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/jumpserver.py">
<provider selected="true" editor-type-id="text-editor">
<state line="111" column="39" selection-start="3028" selection-end="3028" vertical-scroll-proportion="-5.6809607" vertical-offset="5421" max-vertical-offset="6004">
<folding>
<element signature="e#36#45#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
</project>
......@@ -18,9 +18,7 @@ import paramiko
import pxssh
import pexpect
cur_dir = os.path.dirname(__file__)
if not cur_dir:
cur_dir = "./"
cur_dir = os.path.abspath(os.path.dirname(__file__))
sys.path.append('%s/webroot/AutoSa/' % cur_dir)
os.environ['DJANGO_SETTINGS_MODULE'] = 'AutoSa.settings'
......
pexpect==3.3
django-socketio==0.3.9
gevent-socketio==0.2.1
sphinx-me==0.3
django==1.7.1
gevent-websocket==0.9.3
gevent==1.0.1
greenlet==0.4.5
python-ldap==2.4.18
paramiko==1.15.1
pycrypto==2.6.1
ecdsa>=0.11
MySQL-python==1.2.5
python-ldap==2.4.18
......@@ -2,11 +2,18 @@ from django.db import models
from UserManage.models import User
class IDC(models.Model):
name = models.CharField(max_length=20)
def __unicode__(self):
return self.name
class Assets(models.Model):
id = models.AutoField(primary_key=True)
ip = models.CharField(max_length=20)
port = models.IntegerField(max_length=5)
idc = models.CharField(max_length=50)
idc = models.ForeignKey(IDC)
comment = models.CharField(max_length=100, blank=True, null=True)
def __unicode__(self):
......@@ -15,4 +22,6 @@ class Assets(models.Model):
class AssetsUser(models.Model):
uid = models.ForeignKey(User)
aid = models.ForeignKey(Assets)
\ No newline at end of file
aid = models.ForeignKey(Assets)
......@@ -20,6 +20,9 @@ urlpatterns = patterns('',
(r'^showGroup/$', views.showGroup),
(r'^addGroup/$', views.addGroup),
(r'^chgGroup/$', views.chgGroup),
(r'^showIDC/$', views.showIDC),
(r'^addIDC/$', views.addIDC),
(r'^chgIDC/$', views.chgIDC),
(r'^showSudo/$', views.showSudo),
(r'^chgSudo/$', views.chgSudo),
(r'^showAssets/$', views.showAssets),
......
......@@ -5,7 +5,7 @@ from django.template import RequestContext
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from UserManage.models import User, Group, Logs, Pid
from Assets.models import Assets, AssetsUser
from Assets.models import Assets, AssetsUser, IDC
import subprocess
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
......@@ -290,7 +290,11 @@ def downKey(request):
username = request.GET.get('username')
filename = '%s/%s' % (rsa_dir, username)
f = open(filename)
try:
f = open(filename)
except IOError:
error = u'密钥文件不存在'
return render_to_response('info.html', {'error': error})
data = f.read()
f.close()
response = HttpResponse(data, content_type='application/octet-stream')
......@@ -320,9 +324,21 @@ def showUser(request):
error = ''
if is_super_user(request):
users = User.objects.all()
users_all = User.objects.all()
else:
users = group_member(request.session.get('username'))
users_all = group_member(request.session.get('username'))
paginator = Paginator(users_all, 20)
try:
page = int(request.GET.get('page', 1))
except ValueError:
page = 1
try:
users = paginator.page(page)
except (EmptyPage, InvalidPage):
users = paginator.page(paginator.num_pages)
if request.method == 'POST':
selected_user = request.REQUEST.getlist('selected')
......@@ -376,7 +392,9 @@ def addUser(request):
if request.method == 'POST':
form = UserAddForm(request.POST)
if form.is_valid():
if not form.is_valid():
return HttpResponse('error')
else:
user = form.cleaned_data
username = user['username']
password = user['password']
......@@ -584,13 +602,18 @@ def chgGroup(request):
error = ''
msg = ''
if request.method == 'GET':
group_id = request.GET.get('id')
group = Group.objects.get(id=group_id)
group_id = request.GET.get('id', None)
if group_id:
group = Group.objects.get(id=group_id)
else:
return HttpResponseRedirect('/showGroup/')
else:
group_id = request.POST.get('id')
group_name = request.POST.get('name')
if not group_name:
error = u'不能为空'
return render_to_response('info.html', {'error': error})
else:
group = Group.objects.get(id=group_id)
group.name = group_name
......@@ -601,6 +624,67 @@ def chgGroup(request):
context_instance=RequestContext(request))
@superuser_required
def showIDC(request):
error = ''
msg = ''
idcs = IDC.objects.all()
if request.method == 'POST':
selected_idc = request.REQUEST.getlist('selected')
if selected_idc:
for idc_id in selected_idc:
idc = IDC.objects.get(id=idc_id)
idc.delete()
msg = '删除成功'
return render_to_response('showIDC.html',
{'idcs': idcs, 'error': error, 'msg': msg, 'asset_menu': 'active'},
context_instance=RequestContext(request))
@superuser_required
def chgIDC(request):
error = ''
msg = ''
if request.method == 'GET':
idc_id = request.GET.get('id', None)
if not idc_id:
return HttpResponseRedirect('/showIDC/')
else:
idc = IDC.objects.get(id=idc_id)
else:
idc_id = request.POST.get('id')
idc_name = request.POST.get('name')
if not idc_name:
error = u'不能为空'
return render_to_response('info.html', {'error': error})
else:
idc = Group.objects.get(id=idc_id)
idc.name = idc_name
idc.save()
msg = u'修改成功'
return render_to_response('chgGroup.html', {'idc': idc, 'error': error, 'msg': msg, 'asset_menu': 'active'},
context_instance=RequestContext(request))
@superuser_required
def addIDC(request):
error = ''
msg = ''
if request.method == 'POST':
idc_name = request.POST.get('name')
if idc_name:
idc = IDC(name=idc_name)
idc.save()
msg = u'%s IDC添加成功' % idc_name
else:
error = u'不能为空'
return render_to_response('addIDC.html',
{'error': error, 'msg': msg, 'user_menu': 'active'},
context_instance=RequestContext(request))
@admin_required
def showSudo(request):
if request.method == 'GET':
......@@ -680,13 +764,25 @@ def showAssets(request):
"""查看服务器"""
info = ''
if request.session.get('admin') < 2:
assets = []
assets_all = []
username = request.session.get('username')
user = User.objects.get(username=username)
for asset in user.assetsuser_set.all().order_by('ip'):
assets.append(asset.aid)
assets_all.append(asset.aid)
else:
assets = Assets.objects.all().order_by('ip')
assets_all = Assets.objects.all().order_by('ip')
paginator = Paginator(assets_all, 20)
try:
page = int(request.GET.get('page', 1))
except ValueError:
page = 1
try:
assets = paginator.page(page)
except (EmptyPage, InvalidPage):
assets = paginator.page(paginator.num_pages)
if request.method == 'POST':
if request.session.get('admin') < 2:
return HttpResponseRedirect('/showAssets/')
......@@ -704,12 +800,15 @@ def addAssets(request):
"""添加服务器"""
error = ''
msg = ''
idcs = IDC.objects.all()
if request.method == 'POST':
ip = request.POST.get('ip')
port = request.POST.get('port')
idc = request.POST.get('idc')
comment = request.POST.get('comment')
idc = IDC.objects.get(id=idc)
if '' in (ip, port):
error = '带*号内容不能为空。'
elif Assets.objects.filter(ip=ip):
......@@ -719,7 +818,7 @@ def addAssets(request):
asset.save()
msg = u'%s 添加成功' % ip
return render_to_response('addAssets.html', {'msg': msg, 'error': error, 'asset_menu': 'active'},
return render_to_response('addAssets.html', {'msg': msg, 'error': error, 'idcs': idcs, 'asset_menu': 'active'},
context_instance=RequestContext(request))
......@@ -727,9 +826,21 @@ def addAssets(request):
def showPerm(request):
"""查看权限"""
if is_super_user(request):
users = User.objects.all()
users_all = User.objects.all()
else:
users = group_member(request.session.get('username'))
users_all = group_member(request.session.get('username'))
paginator = Paginator(users_all, 20)
try:
page = int(request.GET.get('page', 1))
except ValueError:
page = 1
try:
users = paginator.page(page)
except (EmptyPage, InvalidPage):
users = paginator.page(paginator.num_pages)
if request.method == 'POST':
assets_del = request.REQUEST.getlist('selected')
......@@ -737,7 +848,7 @@ def showPerm(request):
user = User.objects.get(username=username)
for asset_id in assets_del:
asset = Assets.objects.get(id=asset_id)
asset = Assets.objects.get(id=int(asset_id))
asset_user_del = AssetsUser.objects.get(uid=user, aid=asset)
asset_user_del.delete()
return HttpResponseRedirect('/showPerm/?username=%s' % username)
......@@ -820,7 +931,7 @@ def chgPass(request):
if not is_admin_role(request):
oldpass = request.POST.get('oldpass')
if oldpass != user.password:
if md5_crypt(oldpass) != user.password:
error = '原来密码不正确'
if password != password_again:
......@@ -829,7 +940,7 @@ def chgPass(request):
if error:
return render_to_response('info.html', {'error': error})
user.password = password
user.password = md5_crypt(password)
user.save()
return render_to_response('info.html', {'msg': '修改密码成功'})
......@@ -857,10 +968,11 @@ def chgKey(request):
user = User.objects.get(username=username)
password = request.POST.get('password')
password_again = request.POST.get('password_again')
jm = PyCrypt(key)
if not is_admin_role(request):
oldpass = request.POST.get('oldpass')
if oldpass != user.key_pass:
if jm.encrypt(oldpass) != user.key_pass:
error = '原来密码不正确'
if password != password_again:
......@@ -873,12 +985,11 @@ def chgKey(request):
return render_to_response('info.html', {'error': error})
keyfile = '%s/%s' % (rsa_dir, username)
jm = PyCrypt(key)
ret = bash('ssh-keygen -p -P %s -N %s -f %s' % (jm.decrypt(user.key_pass), password, keyfile))
if ret != 0:
error = '更改私钥密码错误'
return render_to_response('info.html', {'error': error})
user.key_pass = password
user.key_pass = jm.encrypt(password)
user.save()
return render_to_response('info.html', {'msg': '修改密码成功'})
......@@ -962,7 +1073,7 @@ def downFile(request):
(time.strftime('%Y/%m/%d %H:%M:%S'), username, host, path))
f.close()
wrapper = FileWrapper(open(download_file))
response = HttpResponse(wrapper, mimetype='application/octet-stream')
response = HttpResponse(wrapper, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=%s' % os.path.basename(path)
return response
......@@ -975,7 +1086,7 @@ def downFile(request):
def logView(request):
thirtyDayAgo = (datetime.datetime.now() - datetime.timedelta(30))
thirtyDayAgoStamp = int(time.mktime(thirtyDayAgo.timetuple()))
logs_all = Logs.objects.filter(start_time__gt=thirtyDayAgoStamp)
logs_all = Logs.objects.filter(start_time__gt=thirtyDayAgoStamp).order_by("-id")
paginator = Paginator(logs_all, 20)
try:
......@@ -1015,7 +1126,7 @@ def killSession(request):
if pid:
pid = pid[0]
os.kill(pid.cpid, 9)
return HttpResponse('ok')
return render_to_response('info.html', {'msg': u'结束会话成功,返回中.'})
......
......@@ -39,8 +39,10 @@ class UserAddForm(forms.Form):
return password_again
def clean_key_pass_again(self):
key_pass = self.cleaned_data['key_pass']
key_pass_again = self.cleaned_data['key_pass_again']
key_pass = self.data['key_pass']
key_pass_again = self.data['key_pass_again']
if key_pass != key_pass_again:
raise forms.ValidationError('Key Password input twice not match. ')
if len(key_pass) < 6:
raise forms.ValidationError('Key Password input twice not match. ')
return key_pass_again
\ No newline at end of file
......@@ -24,7 +24,7 @@ def log_hanler(logid):
ret2 = os.system('cat %s | grep "\[.*@.*\][\$\#]" >> %s.his' % (filename, filename))
ret3 = os.system('cat %s | grep "EndTime" >> %s.his' % (filename, filename))
if (ret1 + ret2 + ret3) == 0:
print 'Handler % ok.' % filename
print 'Handler %s ok.' % filename
def set_finish(id):
......
#!/bin/bash
./manage.py runserver 0.0.0.0:80
./manage.py runserver 0.0.0.0:80 &> access.log &
./log_handler.py &> handler.log &
......@@ -27,19 +27,39 @@ $.fn.webSocket = function(opt){
return new Date().getTime()+""+Math.floor(Math.random()*899+100);
};
var init = function(){
message.id = genUid();
message.filename = $this.attr('filename');
var init = function(e){
var socket = io.connect('ws://172.10.10.9:3000');
//告诉服务器端有用户登录
socket.emit('login', {userid:message.id, filename:message.filename});
socket.on('message',function(obj){
window.console.log(obj.content);
});
var node = $(e.target);
message.id = genUid();
message.filename = node.attr('filename');
BootstrapDialog.show({message:function(){
var escapeString = function (html){
var elem = document.createElement('div')
var txt = document.createTextNode(html)
elem.appendChild(txt)
return elem.innerHTML;
}
var tag = $('<div id="log" style="height:300px;overflow: auto;"></div>');
//告诉服务器端有用户登录
socket.emit('login', {userid:message.id, filename:message.filename});
socket.on('message',function(obj){
//去除log中的颜色控制字符
var regx = /\x1B\[([0-9]{1,3}((;[0-9]{1,3})*)?)?[m|K]/g;
tag.append('<p>'+escapeString(obj.content.replace(regx,''))+'</p>');
});
return tag[0];
} ,
title:'日志',
onhide:function(){
socket.emit('disconnect');
}});
}
$this.on("click",function(){
init();
$this.on("click",function(e){
init(e);
return false;
});
}
......@@ -28,8 +28,17 @@
<div class="form-group">
<label for="idc" class="col-sm-2 control-label">IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" class="form-control" id="idc" name="idc" placeholder="IDC">
<select name="idc" id="idc" class="form-control">
{% for idc in idcs %}
<option value="{{ idc.id }}">{{ idc.name }}</option>
{% endfor %}
</select>
</div>
<div class="col-sm-4">
<a href="/addIDC/">添加IDC</a>
<a href="/showIDC/">删除IDC</a>
</div>
</div>
<div class="form-group">
<label for="comment" class="col-sm-2 control-label">备注<span style="color: red"></span></label>
......
{% extends 'base.html' %}
{% block content %}
<form class="form-horizontal" role="form" method="post" action="" >
<fieldset >
<legend>添加IDC</legend>
{% if error %}
<div class="alert alert-danger">
{{ error }}
</div>
{% endif %}
{% if msg %}
<div class="alert alert-success">
{{ msg }}
</div>
{% endif %}
<div class="form-group">
<label for="name" class="col-sm-2 control-label">IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" class="form-control" id="name" name="name" placeholder="IDC">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<button class="btn btn-primary">添加</button>
</div>
</div>
</fieldset>
</form>
{% endblock %}
\ No newline at end of file
......@@ -26,7 +26,7 @@
{% endfor %}
</tbody>
</table>
<button class="btn btn-primary">删除</button></td>
<button class="btn btn-success">删除</button></td>
</form>
{% endblock %} %}
\ No newline at end of file
......@@ -2,8 +2,8 @@
<html>
<head>
<meta charset="utf-8">
<title>运维管理系统</title>
<link rel="shortcut icon" type="image/x-icon" href="http://img.youlu.com/web/favicon.gif" />
<title>Jumpserver</title>
<link rel="shortcut icon" type="image/x-icon" href="" />
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5js"></script>
......@@ -12,19 +12,20 @@
<link href="/static/css/bootstrap-dialog.css" rel="stylesheet">
<link href="/static/css/main.css" rel="stylesheet">
<script src="/static/js/main.js"></script>
<script src="/static/js/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/js/bootstrap-dialog.js"></script>
<script src="http://172.10.10.9:3000/socket.io/socket.io.js"></script>
<script src="/static/js/main.js"></script>
</head>
<body>
{% if not admin %}
<nav class="navbar navbar-inverse navbar-static-top" role="navigation">
<div class="navbar-header"> <a class="navbar-brand" href="#">运维管理系统</a> </div>
<div class="navbar-header"> <a class="navbar-brand" href="#">Jumpserver</a> </div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="{{ index }}"><a href="/">主页</a></li>
......@@ -73,7 +74,7 @@
</div>
{% else %}
<nav class="navbar navbar-inverse navbar-static-top" role="navigation">
<div class="navbar-header"> <a class="navbar-brand" href="#">运维管理系统</a> </div>
<div class="navbar-header"> <a class="navbar-brand" href="#">Jumpserver</a> </div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
<li class="{{ index }}"><a href="/">主页</a></li>
......
......@@ -2,7 +2,7 @@
{% block content %}
<form class="form-horizontal" role="form" method="post" action="/chgGroup/" >
<fieldset >
<legend>修改用户信息</legend>
<legend>修改属组信息</legend>
{% if error %}
<div class="alert alert-danger">
{{ error }}
......
{% extends 'base.html' %}
{% block content %}
<form class="form-horizontal" role="form" method="post" action="/chgGroup/" >
<fieldset >
<legend>修改IDC信息</legend>
{% if error %}
<div class="alert alert-danger">
{{ error }}
</div>
{% endif %}
{% if msg %}
<div class="alert alert-success">
{{ msg }}
</div>
{% endif %}
<div class="form-group">
<div class="col-sm-4">
<input type="text" id="id" name="id" value="{{ idc.id }}" hidden="hidden">
</div>
</div>
<div class="form-group">
<label for="oldname" class="col-sm-2 control-label">原来IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" id="oldname" name="oldname" class="form-control" value="{{ idc.name }}" readOnly="readOnly">
</div>
</div>
<div class="form-group">
<label for="name" class="col-sm-2 control-label">IDC<span style="color: red"> *</span></label>
<div class="col-sm-4">
<input type="text" id="name" name="name" class="form-control" placeholder="IDC">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-4">
<button class="btn btn-primary">修改</button>
</div>
</div>
</fieldset>
</form>
{% endblock %}
\ No newline at end of file
......@@ -28,7 +28,7 @@
<td><a href="/logHistory/?id={{ log.id }}" class="log_command">统计</a></td>
<td>阻断</td>
{% else %}
<td><span class='monitor' filename="{{ log.logfile }}">监控</span></td>
<td><a class='monitor' filename="{{ log.logfile }}">监控</a></td>
<td>命令统计</td>
<td><a href="/killSession/?id={{ log.id }}">阻断</a> </td>
{% endif %}
......@@ -46,6 +46,7 @@
}});
return false;
})
$(".monitor").webSocket()
</script>
<!--<button class="btn btn-primary">删除</button>-->
</form>
......
......@@ -33,4 +33,19 @@
</table>
<button class="btn btn-primary">删除</button></td>
</form>
<nav>
<ul class="pager">
{% if assets.has_previous %}
<li><a href="?page={{ assets.previous_page_number }}">上一页</a></li>
{% endif %}
<span class="current">
Page {{ assets.number }} of {{ assets.paginator.num_pages }}.
</span>
{% if assets.has_next %}
<li><a href="?page={{ assets.next_page_number }}">下一页</a></li>
{% endif %}
</ul>
</nav>
{% endblock %}
\ No newline at end of file
{% extends 'base.html' %}
{% block content %}
<form method="post" action="">
{% if info %}
<p class="alert alert-success">
{{ info }}
</p>
{% endif %}
<table class="table table-striped table-hover table-condensed">
<thead>
<tr>
<th><input onclick="selectAll()" type="checkbox" name="select_all" style="select_all" id="select_all"/></th>
<th>ID</th>
<th>IDC</th>
<th>修改</th>
</tr>
</thead>
<tbody>
{% for idc in idcs %}
<tr>
<td><input type="checkbox" name="selected" value="{{ idc.id }}"></td>
<td>{{ idc.id }}</td>
<td>{{ idc.name }}</td>
<td><a href="/chgIDC/?id={{ idc.id }}">修改</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<button class="btn btn-primary">删除</button>
</form>
{% endblock %}
\ No newline at end of file
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var spawn = require('child_process').spawn;
var Tail = require('tail').Tail;
app.get('/', function(req, res){
res.send('<h1>Welcome Realtime Server</h1>');
});
//在线用户
var onlineUsers = {};
//当前在线人数
var onlineCount = 0;
io.on('connection', function(socket){
console.log('a user connected');
//监听新用户加入
socket.on('login', function(obj){
//将新加入用户的唯一标识当作socket的名称,后面退出的时候会用到
socket.name = obj.userid;
socket.fileName = obj.filename;
var tail = new Tail(obj.filename);
console.log(obj.filename);
tail.on('line',function(data) {
console.log(data);
var newData = {userid:obj.userid,username:obj.username,content:data};
socket.emit('message',newData);
});
// var tail = spawn("tail", ['-f', obj.filename]);
// tail.stdout.on('data',function(data){
// var content = data.toString();
// console.log(content);
// var newData = {userid:obj.userid,username:obj.username,content:content};
// socket.emit('message',newData);
// });
socket.tail = tail;
//检查在线列表,如果不在里面就加入
if(!onlineUsers.hasOwnProperty(obj.userid)) {
onlineUsers[obj.userid] = obj.username;
//在线人数+1
onlineCount++;
}
//向所有客户端广播用户加入
io.emit('login', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});
console.log(obj.username+'加入了聊天室');
});
//监听用户退出
socket.on('disconnect', function(){
//将退出的用户从在线列表中删除
if(onlineUsers.hasOwnProperty(socket.name)) {
//退出用户的信息
var obj = {userid:socket.name, username:onlineUsers[socket.name]};
if( socket.tail){
socket.tail.unwatch();
}
//删除
delete onlineUsers[socket.name];
//在线人数-1
onlineCount--;
//向所有客户端广播用户退出
io.emit('logout', {onlineUsers:onlineUsers, onlineCount:onlineCount, user:obj});
console.log(obj.username+'退出了聊天室');
}
});
//监听用户发布聊天内容
socket.on('message', function(obj){
//向所有客户端广播发布的消息
io.emit('message', obj);
socket.emit('message',obj);
console.log(obj.username+'说:'+obj.content);
});
});
http.listen(3000, function(){
console.log('listening on *:3000');
});
{
"name": "web-socket",
"version": "0.0.1",
"description": "my first realtime server",
"dependencies": {
"express": "~4.10.1",
"socket.io": "~1.2.0",
"node-tail": "0.0.4",
"tail": "~0.4.0"
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment