├── .gitignore ├── LICENSE ├── README.md ├── VERSION ├── __init__.py ├── app.yml ├── asgi.py ├── bastion ├── __init__.py ├── admin.py ├── apps.py ├── audit │ ├── __init__.py │ └── audit_views.py ├── component │ ├── __init__.py │ ├── audit.py │ ├── batch_operation_component.py │ ├── common.py │ ├── core.py │ ├── credential.py │ ├── network_proxy.py │ ├── resource.py │ ├── strategy.py │ └── strategy_v2.py ├── constant.py ├── core │ ├── __init__.py │ ├── consumers.py │ ├── guacamole │ │ ├── __init__.py │ │ ├── client.py │ │ ├── component.py │ │ ├── exceptions.py │ │ └── instruction.py │ ├── status_code.py │ ├── terminal │ │ ├── __init__.py │ │ └── component.py │ └── views.py ├── credential │ ├── __init__.py │ └── credential_views.py ├── forms │ ├── __init__.py │ ├── batch_form.py │ ├── core_form.py │ ├── forms.py │ ├── network_proxy_form.py │ ├── strategy_from.py │ └── strategy_v2_form.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_init_script.py │ ├── 0003_init_command_script.py │ ├── 0004_init_iam_system.py │ ├── 0005_init_iam_action.py │ ├── 0006_init_iam_action_v2.py │ ├── 0007_init_iam_action_v3.py │ ├── 0008_auto_20211126_1238.py │ ├── 0009_init_default_group.py │ ├── 0010_init_iam_action_v4.py │ └── __init__.py ├── models.py ├── resource │ ├── __init__.py │ ├── batch_views.py │ ├── network_proxy_views.py │ └── resource_views.py ├── routing.py ├── strategy │ ├── __init__.py │ ├── views.py │ └── views_v2.py ├── tests.py ├── urls.py ├── utils │ ├── __init__.py │ ├── base_model.py │ ├── base_views.py │ ├── constants.py │ ├── create_iam.py │ ├── data_repair.py │ ├── decorator.py │ ├── encryption.py │ ├── esb_api.py │ ├── iam.py │ ├── init_action.py │ ├── init_action_v2.py │ ├── init_action_v3.py │ ├── init_action_v4.py │ ├── init_command_script.py │ ├── init_default_group.py │ ├── init_iam_system.py │ ├── init_script.py │ ├── menu_json.py │ ├── middleware.py │ └── status_code.py └── views.py ├── blueapps ├── __init__.py ├── account │ ├── __init__.py │ ├── admin.py │ ├── apps.py │ ├── backends.py │ ├── components │ │ ├── __init__.py │ │ ├── bk_jwt │ │ │ ├── __init__.py │ │ │ ├── backends.py │ │ │ └── middlewares.py │ │ ├── bk_token │ │ │ ├── __init__.py │ │ │ ├── backends.py │ │ │ ├── forms.py │ │ │ ├── middlewares.py │ │ │ └── models.py │ │ ├── null │ │ │ └── __init__.py │ │ └── weixin │ │ │ ├── __init__.py │ │ │ ├── backends.py │ │ │ ├── forms.py │ │ │ └── middlewares.py │ ├── conf.py │ ├── decorators.py │ ├── forms.py │ ├── handlers │ │ ├── __init__.py │ │ └── response.py │ ├── middlewares.py │ ├── migrations │ │ ├── 0001_initial.py │ │ ├── 0002_init_superuser.py │ │ ├── 0003_verifyinfo.py │ │ └── __init__.py │ ├── models.py │ ├── readme.md │ ├── sites │ │ ├── __init__.py │ │ ├── default.py │ │ └── open │ │ │ ├── __init__.py │ │ │ └── conf.py │ ├── static │ │ └── account │ │ │ └── login.js │ ├── templates │ │ └── account │ │ │ ├── login_page.html │ │ │ └── login_success.html │ ├── urls.py │ ├── utils │ │ ├── __init__.py │ │ ├── http.py │ │ └── sms.py │ └── views.py ├── conf │ ├── __init__.py │ ├── database.py │ ├── default_settings.py │ ├── environ.py │ ├── log.py │ └── sites │ │ ├── __init__.py │ │ └── open │ │ └── __init__.py ├── contrib │ ├── __init__.py │ └── bk_commands │ │ ├── __init__.py │ │ ├── management │ │ ├── __init__.py │ │ ├── commands │ │ │ ├── __init__.py │ │ │ ├── init.py │ │ │ ├── startexample.py │ │ │ ├── startweixin.py │ │ │ └── startwxapp.py │ │ └── templates.py │ │ └── test.py ├── core │ ├── __init__.py │ ├── celery │ │ ├── __init__.py │ │ └── celery.py │ ├── exceptions │ │ ├── __init__.py │ │ ├── base.py │ │ └── middleware.py │ ├── handler │ │ ├── __init__.py │ │ └── wsgi.py │ ├── sites │ │ ├── __init__.py │ │ └── middleware.py │ └── wsgi.py ├── middleware │ ├── __init__.py │ ├── bkui │ │ ├── __init__.py │ │ └── middlewares.py │ ├── request_provider.py │ └── xss │ │ ├── __init__.py │ │ ├── decorators.py │ │ ├── middlewares.py │ │ ├── pxfilter.py │ │ └── utils.py ├── patch │ ├── __init__.py │ ├── log.py │ ├── settings_open_saas.py │ └── settings_paas_services.py ├── template │ ├── __init__.py │ ├── backends │ │ ├── __init__.py │ │ └── mako.py │ └── context_processors.py └── utils │ ├── __init__.py │ ├── esbclient.py │ ├── logger.py │ ├── request_provider.py │ ├── sites │ ├── __init__.py │ ├── clouds │ │ └── __init__.py │ ├── ieod │ │ └── __init__.py │ ├── open │ │ └── __init__.py │ ├── qcloud │ │ └── __init__.py │ └── tencent │ │ └── __init__.py │ └── unique.py ├── blueking ├── __init__.py ├── component │ ├── README.md │ ├── __init__.py │ ├── apis │ │ ├── __init__.py │ │ ├── bk_login.py │ │ ├── bk_paas.py │ │ ├── cc.py │ │ ├── cmsi.py │ │ ├── gse.py │ │ ├── job.py │ │ └── sops.py │ ├── base.py │ ├── client.py │ ├── collections.py │ ├── compat.py │ ├── conf.py │ ├── exceptions.py │ ├── shortcuts.py │ └── utils.py └── tests │ ├── README.md │ ├── __init__.py │ ├── test_client.py │ ├── test_shortcuts.py │ ├── test_utils.py │ └── utils │ ├── __init__.py │ └── utils.py ├── config ├── __init__.py ├── default.py ├── dev.py ├── prod.py └── stag.py ├── docker ├── Dockerfile ├── README.md ├── supervisord.conf └── websocket.ini ├── docs ├── .gitkeep ├── blueking.md ├── develop.md ├── static │ ├── .gitkeep │ ├── bastion-deploy.png │ └── bastion-update.png └── update.md ├── frontend ├── .browserslistrc ├── .editorconfig ├── .env.development ├── .env.preview ├── .eslintrc.js ├── .gitattributes ├── .gitignore ├── .prettierrc ├── .travis.yml ├── README.md ├── babel.config.js ├── config │ ├── plugin.config.js │ └── themePluginConfig.js ├── docs │ ├── add-page-loading-animate.md │ ├── load-on-demand.md │ ├── multi-tabs.md │ └── webpack-bundle-analyzer.md ├── jest.config.js ├── jsconfig.json ├── package-lock.json ├── package.json ├── postcss.config.js ├── public │ ├── avatar2.jpg │ ├── css │ │ └── asciinema-player.css │ ├── index.html │ ├── js │ │ └── asciinema-player.js │ ├── loading │ │ ├── loading.css │ │ ├── loading.html │ │ └── option2 │ │ │ ├── html_code_segment.html │ │ │ ├── loading.css │ │ │ └── loading.svg │ └── logo.png ├── run-server.bat ├── src │ ├── App.vue │ ├── api │ │ ├── access-strategy.js │ │ ├── agent.js │ │ ├── command-group.js │ │ ├── command-strategy.js │ │ ├── command.js │ │ ├── credential.js │ │ ├── dataBase.js │ │ ├── group.js │ │ ├── home.js │ │ ├── host-group-console.js │ │ ├── host.js │ │ ├── link-check.js │ │ ├── linuxfile.js │ │ ├── login.js │ │ ├── menu.js │ │ ├── messageManage.js │ │ ├── navSetting.js │ │ ├── networkProxy.js │ │ ├── page-auth.js │ │ ├── resource-credential.js │ │ ├── session.js │ │ ├── user-admin.js │ │ ├── user-group-admin.js │ │ ├── user.js │ │ └── windowsfile.js │ ├── assets │ │ ├── background.svg │ │ ├── home_smile.png │ │ ├── icons │ │ │ └── bx-analyse.svg │ │ ├── image │ │ │ ├── authorization_expired.png │ │ │ ├── conversation.png │ │ │ ├── function_not_authorized.png │ │ │ ├── not_authorized.png │ │ │ ├── platform_not_authorized.png │ │ │ ├── resources.png │ │ │ ├── strategy.png │ │ │ └── voucher.png │ │ ├── left_close.png │ │ ├── left_open.png │ │ ├── logo-reverse.png │ │ ├── logo.png │ │ ├── logo.svg │ │ ├── nav.png │ │ ├── no-auth.png │ │ ├── ops-logo.png │ │ ├── remote_host.png │ │ ├── right_close.png │ │ └── right_open.png │ ├── components │ │ ├── ArticleListContent │ │ │ ├── ArticleListContent.vue │ │ │ └── index.js │ │ ├── AvatarList │ │ │ ├── Item.jsx │ │ │ ├── List.jsx │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── Charts │ │ │ ├── Bar.vue │ │ │ ├── ChartCard.vue │ │ │ ├── Liquid.vue │ │ │ ├── MiniArea.vue │ │ │ ├── MiniBar.vue │ │ │ ├── MiniProgress.vue │ │ │ ├── MiniSmoothArea.vue │ │ │ ├── Radar.vue │ │ │ ├── RankList.vue │ │ │ ├── TagCloud.vue │ │ │ ├── TransferBar.vue │ │ │ ├── Trend.vue │ │ │ ├── chart.less │ │ │ └── smooth.area.less │ │ ├── Dialog.js │ │ ├── Editor │ │ │ ├── QuillEditor.vue │ │ │ └── WangEditor.vue │ │ ├── Ellipsis │ │ │ ├── Ellipsis.vue │ │ │ ├── index.js │ │ │ └── index.md │ │ ├── Exception │ │ │ ├── ExceptionPage.vue │ │ │ ├── index.js │ │ │ └── type.js │ │ ├── FooterToolbar │ │ │ ├── FooterToolBar.vue │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── GlobalFooter │ │ │ └── index.vue │ │ ├── GlobalHeader │ │ │ ├── AvatarDropdown.vue │ │ │ ├── BtnGroup.vue │ │ │ ├── NavMenu.vue │ │ │ └── RightContent.vue │ │ ├── IconSelector │ │ │ ├── IconSelector.vue │ │ │ ├── README.md │ │ │ ├── icons.js │ │ │ └── index.js │ │ ├── MultiTab │ │ │ ├── MultiTab.vue │ │ │ ├── events.js │ │ │ ├── index.js │ │ │ └── index.less │ │ ├── NProgress │ │ │ └── nprogress.less │ │ ├── NoticeIcon │ │ │ ├── NoticeIcon.vue │ │ │ └── index.js │ │ ├── NumberInfo │ │ │ ├── NumberInfo.vue │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── PageLoading │ │ │ └── index.jsx │ │ ├── Search │ │ │ ├── GlobalSearch.jsx │ │ │ └── index.less │ │ ├── SelectLang │ │ │ ├── index.jsx │ │ │ └── index.less │ │ ├── SelectTime │ │ │ ├── index.js │ │ │ └── index.vue │ │ ├── SettingDrawer │ │ │ ├── SettingDrawer.vue │ │ │ ├── SettingItem.vue │ │ │ ├── index.js │ │ │ ├── settingConfig.js │ │ │ └── themeColor.js │ │ ├── StandardFormRow │ │ │ ├── StandardFormRow.vue │ │ │ └── index.js │ │ ├── Table │ │ │ ├── README.md │ │ │ └── index.js │ │ ├── TagSelect │ │ │ ├── TagSelectOption.jsx │ │ │ └── index.jsx │ │ ├── TextArea │ │ │ ├── index.jsx │ │ │ └── style.less │ │ ├── Tree │ │ │ └── Tree.jsx │ │ ├── Trend │ │ │ ├── Trend.vue │ │ │ ├── index.js │ │ │ ├── index.less │ │ │ └── index.md │ │ ├── _util │ │ │ ├── BaseMenu.js │ │ │ └── util.js │ │ ├── index.js │ │ ├── index.less │ │ ├── searchBox │ │ │ ├── index.js │ │ │ └── index.vue │ │ └── tools │ │ │ └── TwoStepCaptcha.vue │ ├── config │ │ ├── defaultSettings.js │ │ ├── router.config.js │ │ └── themeColor.js │ ├── core │ │ ├── bootstrap.js │ │ ├── directives │ │ │ └── action.js │ │ ├── icons.js │ │ ├── lazy_use.js │ │ └── use.js │ ├── global.less │ ├── layouts │ │ ├── BasicLayout.less │ │ ├── BasicLayout.vue │ │ ├── BlankLayout.vue │ │ ├── PageView.vue │ │ ├── RouteView.vue │ │ ├── UserLayout.vue │ │ └── index.js │ ├── locales │ │ ├── index.js │ │ └── lang │ │ │ ├── en-US.js │ │ │ └── zh-CN.js │ ├── main.js │ ├── permission.js │ ├── router │ │ ├── README.md │ │ ├── generator-routers.js │ │ └── index.js │ ├── store │ │ ├── app-mixin.js │ │ ├── device-mixin.js │ │ ├── getters.js │ │ ├── i18n-mixin.js │ │ ├── index.js │ │ ├── modules │ │ │ ├── app.js │ │ │ ├── async-router.js │ │ │ ├── btnAuth.js │ │ │ ├── permission.js │ │ │ └── user.js │ │ └── mutation-types.js │ ├── utils │ │ ├── axios.js │ │ ├── domUtil.js │ │ ├── filter.js │ │ ├── helper │ │ │ └── permission.js │ │ ├── pageAuth.js │ │ ├── permissions.js │ │ ├── request.js │ │ ├── routeConvert.js │ │ ├── screenArr.js │ │ ├── screenLog.js │ │ ├── util.js │ │ ├── utils.less │ │ └── zmodem_browser.js │ └── views │ │ ├── accessPolicy │ │ ├── commandPolicy │ │ │ ├── components │ │ │ │ ├── CommandGroup │ │ │ │ │ ├── components │ │ │ │ │ │ └── ControlCommandGroup.vue │ │ │ │ │ ├── index.js │ │ │ │ │ └── index.vue │ │ │ │ ├── CommandList │ │ │ │ │ ├── components │ │ │ │ │ │ └── ControlCommand.vue │ │ │ │ │ ├── index.js │ │ │ │ │ └── index.vue │ │ │ │ └── PolicyList │ │ │ │ │ ├── components │ │ │ │ │ ├── ControlPolicy.vue │ │ │ │ │ └── components │ │ │ │ │ │ ├── Step1 │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── index.vue │ │ │ │ │ │ └── Step2 │ │ │ │ │ │ ├── components │ │ │ │ │ │ ├── Command.vue │ │ │ │ │ │ └── CommandGroup.vue │ │ │ │ │ │ ├── index.js │ │ │ │ │ │ └── index.vue │ │ │ │ │ ├── index.js │ │ │ │ │ ├── index.vue │ │ │ │ │ └── policyListInfo │ │ │ │ │ ├── components │ │ │ │ │ ├── Command.vue │ │ │ │ │ └── CommandGroup.vue │ │ │ │ │ ├── index.js │ │ │ │ │ └── index.vue │ │ │ ├── index.js │ │ │ └── index.vue │ │ └── visitPolicy │ │ │ ├── components │ │ │ ├── ControlVisitPolicy.vue │ │ │ └── components │ │ │ │ ├── Step1.vue │ │ │ │ ├── Step2 │ │ │ │ ├── components │ │ │ │ │ ├── Group.vue │ │ │ │ │ └── User.vue │ │ │ │ ├── index.js │ │ │ │ └── index.vue │ │ │ │ └── Step3 │ │ │ │ ├── components │ │ │ │ ├── PasswordVoucher.vue │ │ │ │ ├── SSHKey.vue │ │ │ │ └── VoucherGroup.vue │ │ │ │ ├── index.js │ │ │ │ └── index.vue │ │ │ ├── index.js │ │ │ ├── index.vue │ │ │ └── visitPolicyInfo │ │ │ ├── components │ │ │ ├── Group.vue │ │ │ ├── PasswordVoucher.vue │ │ │ ├── SSHKey.vue │ │ │ ├── User.vue │ │ │ └── VoucherGroup.vue │ │ │ ├── index.js │ │ │ └── index.vue │ │ ├── auditManagement │ │ ├── auditHistory.vue │ │ ├── components │ │ │ ├── playerModel.vue │ │ │ └── windowsPlayer.vue │ │ ├── historical.vue │ │ ├── historicalDetails.vue │ │ ├── online.vue │ │ └── operationLog.vue │ │ ├── components │ │ ├── AuthModal │ │ │ ├── index.js │ │ │ └── index.vue │ │ └── ContentHeader │ │ │ ├── index.js │ │ │ └── index.vue │ │ ├── console │ │ ├── components │ │ │ ├── ControlFontSize.vue │ │ │ ├── FileSend.vue │ │ │ ├── Linux.vue │ │ │ ├── TreeNodeChild.vue │ │ │ └── uploadModal.vue │ │ ├── console.vue │ │ ├── remoteLinux.vue │ │ └── webWindows.vue │ │ ├── exception │ │ ├── 403.vue │ │ ├── 404.vue │ │ ├── 500.vue │ │ ├── error.vue │ │ └── noAuth.vue │ │ ├── home │ │ └── home.vue │ │ ├── resources │ │ ├── dataBase.vue │ │ ├── dataBaseDetails.vue │ │ ├── host.vue │ │ ├── hostDetails.vue │ │ └── modal │ │ │ ├── LoginHostModal.vue │ │ │ ├── addDataBase.vue │ │ │ ├── addDataBaseGroup.vue │ │ │ ├── addFromCmdb.vue │ │ │ ├── addGroup.vue │ │ │ ├── addHost.vue │ │ │ ├── addHostFromCmdb.vue │ │ │ └── batchAddition.vue │ │ ├── safe │ │ ├── authorizationDatabase.vue │ │ └── authorizationHost.vue │ │ ├── setting │ │ ├── networkProxy │ │ │ ├── model │ │ │ │ ├── addNetworkProxy.vue │ │ │ │ ├── relationDataBase.vue │ │ │ │ └── relationHost.vue │ │ │ ├── networkProxy.vue │ │ │ └── networkProxyDetails.vue │ │ └── userManage │ │ │ ├── components │ │ │ ├── Group │ │ │ │ ├── components │ │ │ │ │ ├── ControlGroup.vue │ │ │ │ │ ├── PreviewUser.vue │ │ │ │ │ └── importUser.vue │ │ │ │ ├── index.js │ │ │ │ └── index.vue │ │ │ └── User │ │ │ │ ├── components │ │ │ │ └── ImportUser.vue │ │ │ │ ├── index.js │ │ │ │ └── index.vue │ │ │ ├── index.js │ │ │ └── index.vue │ │ └── voucher │ │ ├── group.vue │ │ ├── groupDetails.vue │ │ ├── model │ │ ├── addGroup.vue │ │ ├── addPassword.vue │ │ ├── addSsh.vue │ │ ├── addvoucher.vue │ │ └── associatedResources.vue │ │ ├── password.vue │ │ ├── passwordDetails.vue │ │ ├── ssh.vue │ │ └── sshDetails.vue ├── tests │ └── unit │ │ └── .eslintrc.js ├── vue.config.js └── yarn.lock ├── index ├── __init__.py ├── admin.py ├── apps.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py ├── install ├── add_env_blueking.py ├── auto_add.py ├── bastion-install.sh ├── bastion_esb │ ├── __init__.py │ ├── bastion │ │ ├── __init__.py │ │ ├── get_cache_token.py │ │ └── toolkit │ │ │ ├── __init__.py │ │ │ ├── configs.py │ │ │ └── tools.py │ └── esb_doc │ │ ├── __init__.py │ │ └── get_link_token.md ├── build.sh ├── conf │ ├── settings_production.py.websocket │ └── settings_production.py.websocket.init ├── init_iam │ ├── __init__.py │ ├── init_action.py │ └── init_iam_system.py └── install.config.example ├── manage.py ├── opsany-bastion.png ├── package-lock.json ├── requirements.txt ├── runtime.txt ├── settings.py ├── static ├── assets │ ├── background.5825f033.svg │ ├── background.a568162c.svg │ ├── logo.b36f7a7f.svg │ └── logo.f3103225.svg ├── avatar2.jpg ├── css │ ├── app.019e6117.css.gz │ ├── app.1fecc41d.css.gz │ ├── app.285c40bb.css.gz │ ├── app.37081288.css.gz │ ├── app.5d7df5aa.css.gz │ ├── app.61a78f4d.css.gz │ ├── app.98ed4a23.css │ ├── app.98ed4a23.css.gz │ ├── app.d50e69db.css.gz │ ├── app.ea92f5a9.css.gz │ ├── app.ebf33190.css │ ├── app.ebf33190.css.gz │ ├── asciinema-player.css │ ├── asciinema-player.css.gz │ ├── chunk-011e82c5.77bca524.css │ ├── chunk-01624106.4b006a95.css │ ├── chunk-02633ef1.f5f66bb2.css │ ├── chunk-05fa21f6.adf7a6d6.css │ ├── chunk-090964d8.d14c2167.css │ ├── chunk-0b17f900.55242fa7.css │ ├── chunk-0b207afe.00d9204e.css │ ├── chunk-0bfd1d3b.8cf73e6f.css.gz │ ├── chunk-0d9f612a.d3437ec2.css │ ├── chunk-0e1c3f6c.0c94e852.css │ ├── chunk-12d51ddd.1ad558e5.css │ ├── chunk-12ec570e.b953c688.css │ ├── chunk-1a0b2b5c.a8a68973.css │ ├── chunk-1a7b3b92.14ebf83b.css │ ├── chunk-2abf4a79.364510c0.css │ ├── chunk-2bfdc242.e06f2390.css │ ├── chunk-2df1b604.f3367566.css │ ├── chunk-30758dfc.cf2771ec.css │ ├── chunk-31241ef2.eeaeef32.css │ ├── chunk-3168254b.f9920608.css │ ├── chunk-33e99cce.16644974.css │ ├── chunk-3455b73a.a117a340.css │ ├── chunk-3888ae3e.eb3eddc0.css │ ├── chunk-40aea158.9b6183bc.css │ ├── chunk-430c3000.b4a69e88.css │ ├── chunk-44658e0c.bf712af1.css │ ├── chunk-48659421.4142f3e4.css │ ├── chunk-50dd65dd.738aae87.css │ ├── chunk-55cec527.8cf73e6f.css.gz │ ├── chunk-58ec3541.e2fa8469.css │ ├── chunk-5cc48762.430cebac.css │ ├── chunk-5cc48762.430cebac.css.gz │ ├── chunk-60eda19b.5f706984.css │ ├── chunk-624a048b.ff186017.css │ ├── chunk-62dd3c96.b3e549d3.css │ ├── chunk-63f37384.8cf73e6f.css.gz │ ├── chunk-64bedeae.310d3ae5.css │ ├── chunk-64c39154.9cb2bf59.css │ ├── chunk-66929e3b.34313ec6.css │ ├── chunk-68d3718b.b7557ece.css │ ├── chunk-6938f9b8.be2db2f8.css │ ├── chunk-6a65e99e.94417bf8.css │ ├── chunk-6a709f79.82654e3e.css │ ├── chunk-6af86718.46a17afc.css │ ├── chunk-6c510798.99901381.css │ ├── chunk-6ce6de1e.0a336615.css │ ├── chunk-73df7949.9de63886.css │ ├── chunk-740dd5c8.8cf73e6f.css │ ├── chunk-740dd5c8.8cf73e6f.css.gz │ ├── chunk-74e0d0a6.504da865.css │ ├── chunk-78db90a6.846c0066.css │ ├── chunk-795bb688.6a1e5818.css │ ├── chunk-7b6ca736.d7babba0.css │ ├── chunk-7b6dfdbc.cd3459f2.css │ ├── chunk-7daab5f9.389c1bf0.css │ ├── chunk-81aa5316.ef463902.css │ ├── chunk-9585a008.0cd9633e.css │ ├── chunk-9aefbc4c.d0619e25.css │ ├── chunk-a2f2d7fa.6d3e7fde.css │ ├── chunk-c01e793a.385433c7.css │ ├── chunk-c26aaecc.e7c0d219.css │ ├── chunk-d5dec398.8cf73e6f.css.gz │ ├── chunk-d68bb5ce.055f4115.css │ ├── chunk-e58265d8.8cf73e6f.css.gz │ ├── chunk-e6df9160.ab8c2474.css │ ├── chunk-e8f2939e.57b8fff5.css │ ├── chunk-vendors.995993b1.css.gz │ ├── chunk-vendors.a7631610.css │ ├── chunk-vendors.a7631610.css.gz │ ├── error.135d66d6.css │ ├── error.1c40ccb7.css │ ├── fail.b63ee882.css │ └── fail.fdb673e0.css ├── img │ ├── authorization_expired.3d95508f.png │ ├── function_not_authorized.5a8ed9c3.png │ ├── no-auth.cea6aff4.png │ ├── not_authorized.7d30926b.png │ ├── ops-logo.d35433bb.png │ └── platform_not_authorized.8e05bf34.png ├── index.html ├── js │ ├── app.03462b4a.js.gz │ ├── app.0d467df0.js.gz │ ├── app.0f167e7a.js.gz │ ├── app.0fb5feb2.js.gz │ ├── app.0fc4bc66.js.gz │ ├── app.16090c8f.js.gz │ ├── app.1de42670.js.gz │ ├── app.246f93c4.js.gz │ ├── app.253bc463.js.gz │ ├── app.27453d83.js.gz │ ├── app.27fcddae.js.gz │ ├── app.2b9a7041.js.gz │ ├── app.326114e0.js.gz │ ├── app.331e4af2.js.gz │ ├── app.401a20c7.js.gz │ ├── app.43babfe2.js.gz │ ├── app.481b93eb.js.gz │ ├── app.4c0e6a2e.js.gz │ ├── app.58e71f87.js.gz │ ├── app.68563477.js.gz │ ├── app.6b6e82cc.js.gz │ ├── app.6e59fdf3.js.gz │ ├── app.73ee0b83.js.gz │ ├── app.75eb4fe8.js.gz │ ├── app.7aa77404.js.gz │ ├── app.7e774167.js.gz │ ├── app.7f75ad31.js.gz │ ├── app.81754102.js.gz │ ├── app.8ac04f93.js.gz │ ├── app.8acab021.js.gz │ ├── app.8c3ba6c4.js.gz │ ├── app.8cb9d572.js.gz │ ├── app.8d854b3e.js.gz │ ├── app.95c43bf2.js.gz │ ├── app.967ef477.js.gz │ ├── app.9681f36c.js.gz │ ├── app.9b3484c4.js.gz │ ├── app.9e24ea21.js.gz │ ├── app.9e6c4e21.js.gz │ ├── app.a317a640.js │ ├── app.a317a640.js.gz │ ├── app.a5dbe4b2.js.gz │ ├── app.a6cc2131.js.gz │ ├── app.ae2cf56b.js.gz │ ├── app.b0504c39.js.gz │ ├── app.b1e02108.js.gz │ ├── app.b21ed608.js.gz │ ├── app.b7e0f467.js.gz │ ├── app.c1ba643f.js.gz │ ├── app.c5785fb1.js.gz │ ├── app.ca6215d0.js.gz │ ├── app.ccba7ea2.js.gz │ ├── app.d391194e.js.gz │ ├── app.d7244fd8.js.gz │ ├── app.d78a8294.js.gz │ ├── app.d8b1f42f.js.gz │ ├── app.d949850e.js.gz │ ├── app.dccb3197.js.gz │ ├── app.e3d4e8c2.js.gz │ ├── app.e9d77e87.js.gz │ ├── app.ee5afbda.js.gz │ ├── app.efec4820.js.gz │ ├── app.f071a45a.js │ ├── app.f071a45a.js.gz │ ├── app.f2605cf7.js.gz │ ├── app.f4d970bb.js.gz │ ├── app.fed4f572.js.gz │ ├── asciinema-player.js │ ├── asciinema-player.js.gz │ ├── chunk-011e82c5.0ad1e9f7.js │ ├── chunk-011e82c5.0ad1e9f7.js.gz │ ├── chunk-01624106.f1a6e58c.js │ ├── chunk-01ec29fd.d6d994cf.js.gz │ ├── chunk-02633ef1.9ab47fce.js │ ├── chunk-02633ef1.9ab47fce.js.gz │ ├── chunk-02633ef1.a680d19e.js │ ├── chunk-02633ef1.a680d19e.js.gz │ ├── chunk-02633ef1.b6b8a773.js.gz │ ├── chunk-0349ce9e.263e07e7.js.gz │ ├── chunk-0349ce9e.740736b0.js.gz │ ├── chunk-0349ce9e.ab0d7396.js.gz │ ├── chunk-0349ce9e.b0660ff1.js.gz │ ├── chunk-0349ce9e.d18de7f8.js.gz │ ├── chunk-05fa21f6.743f1a9a.js │ ├── chunk-05fa21f6.743f1a9a.js.gz │ ├── chunk-08284dd4.6bd6d639.js.gz │ ├── chunk-090964d8.4ecbfe5e.js │ ├── chunk-09484404.2074e4e3.js.gz │ ├── chunk-0a5aa114.26dbe387.js.gz │ ├── chunk-0a8658f8.51ac2bd7.js.gz │ ├── chunk-0b17f900.a4667cf2.js │ ├── chunk-0b207afe.596ed78f.js │ ├── chunk-0b207afe.596ed78f.js.gz │ ├── chunk-0bfd1d3b.47c9ef3d.js.gz │ ├── chunk-0bfd1d3b.882cff25.js.gz │ ├── chunk-0bfd1d3b.c5788b02.js.gz │ ├── chunk-0bfd1d3b.cb727fbc.js.gz │ ├── chunk-0c5e241d.01c799a2.js.gz │ ├── chunk-0d9f612a.72255313.js │ ├── chunk-0e1c3f6c.4f30c59b.js │ ├── chunk-0edbadb3.5be93e2a.js.gz │ ├── chunk-0fefdb7c.13ff7107.js.gz │ ├── chunk-10908d7f.2a59da90.js.gz │ ├── chunk-10908d7f.f14bcb1c.js.gz │ ├── chunk-112e279e.8334a83e.js │ ├── chunk-112e279e.8334a83e.js.gz │ ├── chunk-12d51ddd.e2df24e3.js │ ├── chunk-12ec570e.7789408d.js │ ├── chunk-12ec570e.7789408d.js.gz │ ├── chunk-13403366.c54f247a.js.gz │ ├── chunk-14cd8511.1a9140e0.js.gz │ ├── chunk-14cd8511.51445ad9.js.gz │ ├── chunk-1a0b2b5c.cf0de628.js │ ├── chunk-1a7b3b92.2b063395.js │ ├── chunk-1bb0e80c.aa324237.js.gz │ ├── chunk-1ce91c43.39951165.js.gz │ ├── chunk-1ce91c43.d94f8d25.js.gz │ ├── chunk-1d40cac5.16e4e852.js.gz │ ├── chunk-1dae0a5d.02b66d32.js.gz │ ├── chunk-1db14380.cb299650.js.gz │ ├── chunk-1e119f10.8114f16e.js.gz │ ├── chunk-1fa0d614.3b68fb0b.js.gz │ ├── chunk-21311082.ce1360fe.js.gz │ ├── chunk-2267bdc2.62f2ba1a.js.gz │ ├── chunk-2431c2b6.a5c9b473.js.gz │ ├── chunk-2472b8ba.555416f3.js.gz │ ├── chunk-24a93f69.7f69db2b.js.gz │ ├── chunk-261a2018.fa89e7b6.js.gz │ ├── chunk-29dff3bb.b058b9bd.js.gz │ ├── chunk-2abf4a79.4a9714cb.js │ ├── chunk-2b185ec5.0c36549c.js.gz │ ├── chunk-2b185ec5.5d5d42c6.js.gz │ ├── chunk-2b185ec5.6514cb1c.js.gz │ ├── chunk-2b1a2474.14f72d40.js │ ├── chunk-2b1a2474.da73487a.js │ ├── chunk-2bfdc242.f82bcd90.js │ ├── chunk-2d209b21.9fd5e548.js.gz │ ├── chunk-2d20fa8d.9e51d467.js.gz │ ├── chunk-2da89e80.60b223c7.js.gz │ ├── chunk-2df1b604.acec3504.js │ ├── chunk-2df2825a.fdec68c9.js.gz │ ├── chunk-30758dfc.c3d5d0f3.js │ ├── chunk-30c8d119.02715029.js.gz │ ├── chunk-31241ef2.0bf39a37.js │ ├── chunk-3168254b.fa96f893.js │ ├── chunk-33e99cce.4d37ad1d.js │ ├── chunk-344cc402.100a4754.js.gz │ ├── chunk-344cc402.e18796fc.js.gz │ ├── chunk-3455b73a.813c7539.js │ ├── chunk-3455b73a.813c7539.js.gz │ ├── chunk-347c31d1.5f6a5e30.js.gz │ ├── chunk-36650146.d7e70752.js │ ├── chunk-3888ae3e.2301e4ce.js │ ├── chunk-38a4603b.ca89dcc1.js.gz │ ├── chunk-3b7b7e50.14cb864e.js.gz │ ├── chunk-3b8391a7.7ebd6c81.js.gz │ ├── chunk-3b8391a7.8e572d15.js.gz │ ├── chunk-3b8391a7.a72a41c3.js.gz │ ├── chunk-3b8391a7.d95ee1f0.js.gz │ ├── chunk-40aea158.89446653.js │ ├── chunk-430c3000.c473120e.js │ ├── chunk-43d8e85c.69fd1cc1.js.gz │ ├── chunk-44658e0c.b4b44053.js │ ├── chunk-48659421.cb0ab8aa.js │ ├── chunk-49e0a490.944bc1da.js.gz │ ├── chunk-4c0ecb98.b2a17298.js.gz │ ├── chunk-50dd65dd.c53939ba.js │ ├── chunk-51933dcd.39e4838a.js.gz │ ├── chunk-53fdf1bf.20e79a51.js.gz │ ├── chunk-55cec527.7f28f3ab.js.gz │ ├── chunk-58ec3541.60237bc1.js │ ├── chunk-5a2189bb.02d7f264.js.gz │ ├── chunk-5c3ae606.ba13e40c.js.gz │ ├── chunk-5cc48762.211b32b4.js │ ├── chunk-5cc48762.211b32b4.js.gz │ ├── chunk-5f7fa5c2.b4c09aee.js.gz │ ├── chunk-60eda19b.cecee11a.js │ ├── chunk-60eda19b.cecee11a.js.gz │ ├── chunk-624a048b.73ce56d5.js │ ├── chunk-624c336a.1ef61051.js.gz │ ├── chunk-62dd3c96.57660860.js │ ├── chunk-63f37384.31d816c5.js.gz │ ├── chunk-63f37384.3403dc39.js.gz │ ├── chunk-63f37384.5cae8755.js.gz │ ├── chunk-64b4540c.7de5ead5.js.gz │ ├── chunk-64bedeae.4835d608.js │ ├── chunk-64bedeae.4835d608.js.gz │ ├── chunk-64c39154.5f43080f.js │ ├── chunk-64eb4f4c.44109589.js.gz │ ├── chunk-6679e19e.5ec84af8.js.gz │ ├── chunk-66929e3b.3c95111f.js │ ├── chunk-672bcd2c.3f0ae9ae.js.gz │ ├── chunk-67712dd2.9c43fd4e.js.gz │ ├── chunk-68ba6051.b27b9632.js.gz │ ├── chunk-68caa1f1.aa3251f3.js.gz │ ├── chunk-68d3718b.fc12d2dd.js │ ├── chunk-6938f9b8.555d5b72.js │ ├── chunk-699f1385.7aea2788.js.gz │ ├── chunk-6a65e99e.b2077492.js │ ├── chunk-6a65e99e.b2077492.js.gz │ ├── chunk-6a709f79.57afaf81.js │ ├── chunk-6a709f79.57afaf81.js.gz │ ├── chunk-6a950ac5.c1267fbf.js.gz │ ├── chunk-6af86718.827abeb9.js │ ├── chunk-6c510798.c26d6425.js │ ├── chunk-6ce6de1e.3bcfe6ba.js │ ├── chunk-6ef8885f.1d18f32d.js.gz │ ├── chunk-6f161320.befd821b.js.gz │ ├── chunk-72eaece6.9147f8a1.js.gz │ ├── chunk-739ab948.39138336.js.gz │ ├── chunk-739ab948.7fdb93f5.js.gz │ ├── chunk-739ab948.f218951e.js.gz │ ├── chunk-73df7949.c04a2fa6.js │ ├── chunk-740dd5c8.3728d269.js │ ├── chunk-740dd5c8.3728d269.js.gz │ ├── chunk-740dd5c8.397cad7c.js.gz │ ├── chunk-74e0d0a6.e6edf665.js │ ├── chunk-7798706e.73e67971.js.gz │ ├── chunk-788cfa89.52aec264.js.gz │ ├── chunk-78db90a6.0c535a56.js │ ├── chunk-795bb688.65c24cd2.js │ ├── chunk-7b6ca736.794aac47.js │ ├── chunk-7b6dfdbc.044d6021.js │ ├── chunk-7c5ee4b6.a34768d1.js.gz │ ├── chunk-7daab5f9.82d161e4.js │ ├── chunk-7e8c4e64.6f97e3c2.js.gz │ ├── chunk-7f7412be.98bf8f7d.js.gz │ ├── chunk-81aa5316.ed9d79e7.js │ ├── chunk-8f4c8070.1a1675f3.js.gz │ ├── chunk-91e4d73e.d3769a81.js.gz │ ├── chunk-9585a008.0954ee22.js │ ├── chunk-95d3ed08.7846ba4a.js.gz │ ├── chunk-95d3ed08.968a16f5.js.gz │ ├── chunk-9644b8b2.34bf0c85.js.gz │ ├── chunk-98775768.3e6862d6.js.gz │ ├── chunk-9aefbc4c.2f358119.js │ ├── chunk-a2f2d7fa.9a0ca599.js │ ├── chunk-ad58d1dc.07dc9a4e.js │ ├── chunk-ad58d1dc.ffe99d59.js │ ├── chunk-b7db2b34.13597ce2.js.gz │ ├── chunk-c01e793a.5c710cb8.js │ ├── chunk-c26aaecc.364d7128.js │ ├── chunk-c26aaecc.364d7128.js.gz │ ├── chunk-c54ca3ca.324f30e2.js.gz │ ├── chunk-c68890a8.97ad7d33.js.gz │ ├── chunk-d1b3d51c.f2d73cfb.js.gz │ ├── chunk-d5dec398.15587e1b.js.gz │ ├── chunk-d5dec398.1819df82.js.gz │ ├── chunk-d68bb5ce.8a296df4.js │ ├── chunk-db0e83f0.f115908f.js.gz │ ├── chunk-dd3d8a14.232c99b5.js.gz │ ├── chunk-dd3d8a14.48b014fc.js.gz │ ├── chunk-dd3d8a14.4ab595fc.js.gz │ ├── chunk-dd3d8a14.6bc45f3a.js.gz │ ├── chunk-dd3d8a14.be4e896a.js.gz │ ├── chunk-dd3d8a14.c8617372.js.gz │ ├── chunk-dff0a482.25abdca6.js.gz │ ├── chunk-e1da80e8.75564fe6.js.gz │ ├── chunk-e58265d8.8f39092f.js.gz │ ├── chunk-e6df9160.40c5ebf9.js │ ├── chunk-e6df9160.40c5ebf9.js.gz │ ├── chunk-e8f2939e.6c67c7f2.js │ ├── chunk-e8f2939e.6c67c7f2.js.gz │ ├── chunk-ed57deb0.d984dfaf.js.gz │ ├── chunk-f14de8f8.4fde624c.js.gz │ ├── chunk-f57c8b94.950823d4.js.gz │ ├── chunk-f57c8b94.b53250c4.js.gz │ ├── chunk-f57c8b94.f8757fcb.js.gz │ ├── chunk-f6b5184c.bc640806.js.gz │ ├── chunk-fe62f1ae.edfa0eee.js.gz │ ├── chunk-fe62f1ae.f594444f.js.gz │ ├── chunk-vendors.05ba0f99.js.gz │ ├── chunk-vendors.2fabffc9.js.gz │ ├── chunk-vendors.af9f0a86.js │ ├── chunk-vendors.af9f0a86.js.gz │ ├── chunk-vendors.b00c409f.js.gz │ ├── chunk-vendors.c6aad1c7.js │ ├── chunk-vendors.c6aad1c7.js.gz │ ├── chunk-vendors.efdf40cf.js.gz │ ├── error.6854266d.js │ ├── error.ddd82941.js │ ├── fail.2d32b7c2.js │ ├── fail.8d555f56.js │ ├── lang-zh-CN.67e0935d.js │ └── lang-zh-CN.8bc91e27.js ├── loading │ ├── loading.css │ ├── loading.html │ └── option2 │ │ ├── html_code_segment.html │ │ ├── loading.css │ │ └── loading.svg └── logo.png ├── templates └── index.html ├── urls.py ├── websocket-requirements.txt └── wsgi.py /README.md: -------------------------------------------------------------------------------- 1 | # OpsAny开源堡垒机 2 | 3 | opsany-bastion是OpsAny产品系列中首个开源的项目,使用Apache2.0开源协议,兼容腾讯蓝鲸社区版6.x。使用腾讯蓝鲸社区版和企业版用户可以快速通过【生产环境部署】文档进行安装。 4 | 5 | ## 优势 6 | 7 | - 开源:Apache 2.0开源协议,商用无限制。 8 | - 兼容腾讯蓝鲸社区版和企业版,线上快速部署和安装。 9 | - 无插件:仅需浏览器即可使用,推荐使用Google Chrome。 10 | - 持续改进: 每4周一个版本迭代,持续维护。 11 | 12 | ## 系统组成 13 | 14 | - Websocket服务:8004端口,需要独立使用Docker部署一个Websocket服务,用于连接主机和网络设备等。 15 | - Guacd服务:4822端口,需要独立使用Docker部署一个guacd服务,用于连接Windows主机。 16 | - bastion应用: 需要构建一个SaaS的压缩包,然后在蓝鲸开发者中心,Smart应用进行上传部署即可。 17 | 18 | > 注意:蓝鲸6.0自带的Docker无NAT网卡,需要独立的主机部署websocket和guacd服务。 19 | 20 | ## 开发和部署 21 | 22 | - [生产环境部署](docs/blueking.md) 23 | - [生产环境更新](docs/update.md) 24 | - [开发环境部署](docs/develop.md) 25 | 26 | ## 社区支持 27 | 28 | 请访问[OpsAny官方网站](https://www.opsany.com/) 自行寻找入口。 29 | 30 | > 我们推崇熟人社交,我们坚信技术人就应该相互学习,彼此协作。所以最新消息以社区微信群为第一通知渠道。没有找到社区群入口?在官网下载申请后,收到的邮件中有二维码哦。当然也可能是因为缘分还未到,把问题留给时间吧。 31 | 32 | -------------------------------------------------------------------------------- /VERSION: -------------------------------------------------------------------------------- 1 | 3.1.0.75 2 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/__init__.py -------------------------------------------------------------------------------- /asgi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | ASGI entrypoint. Configures Django and then runs the application 4 | defined in the ASGI_APPLICATION setting. 5 | """ 6 | 7 | import os 8 | import django 9 | from channels.routing import get_default_application 10 | 11 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") 12 | django.setup() 13 | application = get_default_application() -------------------------------------------------------------------------------- /bastion/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/__init__.py -------------------------------------------------------------------------------- /bastion/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /bastion/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class BastionConfig(AppConfig): 5 | name = 'bastion' 6 | -------------------------------------------------------------------------------- /bastion/audit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/audit/__init__.py -------------------------------------------------------------------------------- /bastion/component/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/component/__init__.py -------------------------------------------------------------------------------- /bastion/constant.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/constant.py -------------------------------------------------------------------------------- /bastion/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/core/__init__.py -------------------------------------------------------------------------------- /bastion/core/guacamole/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/core/guacamole/__init__.py -------------------------------------------------------------------------------- /bastion/core/guacamole/exceptions.py: -------------------------------------------------------------------------------- 1 | """ 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2014 - 2016 Mohab Usama 5 | """ 6 | 7 | 8 | class GuacamoleError(Exception): 9 | def __init__(self, message): 10 | super(GuacamoleError, self).__init__( 11 | 'Guacamole Protocol Error. %s' % message 12 | ) 13 | 14 | 15 | class InvalidInstruction(Exception): 16 | def __init__(self, message): 17 | super(InvalidInstruction, self).__init__( 18 | 'Invalid Guacamole Instruction! %s' % message 19 | ) 20 | -------------------------------------------------------------------------------- /bastion/core/terminal/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/core/terminal/__init__.py -------------------------------------------------------------------------------- /bastion/credential/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/credential/__init__.py -------------------------------------------------------------------------------- /bastion/forms/__init__.py: -------------------------------------------------------------------------------- 1 | def first_error_message(form): 2 | error_data = form.errors.as_data() 3 | error_data_list = list(error_data.items()) 4 | error_message = error_data_list[0][1][0].message 5 | message = "{}".format(error_message) 6 | return message 7 | 8 | -------------------------------------------------------------------------------- /bastion/migrations/0002_init_script.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | from bastion.utils.init_script import init_default_group 5 | 6 | 7 | def run_init(apps, schema_editor): 8 | pass 9 | # init_default_group() 10 | 11 | 12 | class Migration(migrations.Migration): 13 | 14 | dependencies = [ 15 | ('bastion', '0001_initial'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(run_init) 20 | ] -------------------------------------------------------------------------------- /bastion/migrations/0003_init_command_script.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | 5 | from bastion.utils.init_command_script import init_command 6 | 7 | 8 | def run_init(apps, schema_editor): 9 | init_command() 10 | 11 | 12 | class Migration(migrations.Migration): 13 | 14 | dependencies = [ 15 | ('bastion', '0002_init_script'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(run_init) 20 | ] -------------------------------------------------------------------------------- /bastion/migrations/0004_init_iam_system.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | 5 | from bastion.utils.create_iam import init_system_to_iam 6 | 7 | 8 | def run_init(apps, schema_editor): 9 | init_system_to_iam() 10 | 11 | 12 | class Migration(migrations.Migration): 13 | 14 | dependencies = [ 15 | ('bastion', '0003_init_command_script'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(run_init) 20 | ] -------------------------------------------------------------------------------- /bastion/migrations/0005_init_iam_action.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | 5 | from bastion.utils.init_action import add_action_to_system 6 | 7 | 8 | def run_init(apps, schema_editor): 9 | add_action_to_system() 10 | 11 | 12 | class Migration(migrations.Migration): 13 | 14 | dependencies = [ 15 | ('bastion', '0004_init_iam_system'), 16 | ] 17 | 18 | operations = [ 19 | migrations.RunPython(run_init) 20 | ] -------------------------------------------------------------------------------- /bastion/migrations/0006_init_iam_action_v2.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | from bastion.utils.init_action_v2 import add_action_to_system 5 | 6 | 7 | def run_init(apps, schema_editor): 8 | add_action_to_system() 9 | 10 | 11 | class Migration(migrations.Migration): 12 | 13 | dependencies = [ 14 | ('bastion', '0005_init_iam_action'), 15 | ] 16 | 17 | operations = [ 18 | migrations.RunPython(run_init) 19 | ] -------------------------------------------------------------------------------- /bastion/migrations/0007_init_iam_action_v3.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | from bastion.utils.init_action_v3 import add_action_to_system 5 | 6 | 7 | def run_init(apps, schema_editor): 8 | add_action_to_system() 9 | 10 | 11 | class Migration(migrations.Migration): 12 | 13 | dependencies = [ 14 | ('bastion', '0006_init_iam_action_v2'), 15 | ] 16 | 17 | operations = [ 18 | migrations.RunPython(run_init) 19 | ] -------------------------------------------------------------------------------- /bastion/migrations/0009_init_default_group.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | from bastion.utils.init_default_group import init_default_group 5 | 6 | 7 | def run_init(apps, schema_editor): 8 | init_default_group() 9 | 10 | 11 | class Migration(migrations.Migration): 12 | 13 | dependencies = [ 14 | ('bastion', '0008_auto_20211126_1238'), 15 | ] 16 | 17 | operations = [ 18 | migrations.RunPython(run_init) 19 | ] -------------------------------------------------------------------------------- /bastion/migrations/0010_init_iam_action_v4.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 2.2.6 on 2020-10-09 10:25 2 | 3 | from django.db import migrations 4 | from bastion.utils.init_action_v4 import add_action_to_system 5 | 6 | 7 | def run_init(apps, schema_editor): 8 | add_action_to_system() 9 | 10 | 11 | class Migration(migrations.Migration): 12 | 13 | dependencies = [ 14 | ('bastion', '0009_init_default_group'), 15 | ] 16 | 17 | operations = [ 18 | migrations.RunPython(run_init) 19 | ] -------------------------------------------------------------------------------- /bastion/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/migrations/__init__.py -------------------------------------------------------------------------------- /bastion/resource/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/resource/__init__.py -------------------------------------------------------------------------------- /bastion/routing.py: -------------------------------------------------------------------------------- 1 | from bastion.core.consumers import WebSSH, GuacamoleWebsocket 2 | from django.urls import re_path 3 | 4 | from channels.auth import AuthMiddlewareStack 5 | from channels.routing import ProtocolTypeRouter, URLRouter 6 | 7 | websocket_urlpatterns = [ 8 | re_path(r'^ws/bastion/terminalchannel/$', WebSSH), 9 | re_path(r'^ws/bastion/guacamole/$', GuacamoleWebsocket), 10 | ] 11 | application = ProtocolTypeRouter({ 12 | # (http->django views is added by default) 13 | 'websocket': AuthMiddlewareStack( 14 | URLRouter( 15 | websocket_urlpatterns 16 | ) 17 | ), 18 | }) -------------------------------------------------------------------------------- /bastion/strategy/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/strategy/__init__.py -------------------------------------------------------------------------------- /bastion/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | 5 | -------------------------------------------------------------------------------- /bastion/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/bastion/utils/__init__.py -------------------------------------------------------------------------------- /bastion/utils/constants.py: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | # 内网正则校验 4 | PRIVATE_IP_PATTERN = re.compile(r'^(127\.0\.0\.1)|(localhost)|(10\.\d{1,3}\.\d{1,3}\.\d{1,3})|(172\.((1[6-9])|(2\d)|(3[01]))\.\d{1,3}\.\d{1,3})|(192\.168\.\d{1,3}\.\d{1,3})$') 5 | # IP正则校验 6 | IP_PATTERN = re.compile(r'((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}') 7 | # 英文正则校验 8 | ENGLISH_PATTERN = re.compile(r'[a-zA-Z]+') 9 | 10 | # Model config 11 | BLOCK_TYPE = [1, 2] 12 | # IP限制类型 1 无 2 黑名单 3 白名单 13 | IP_LIMIT = [1, 2, 3] 14 | -------------------------------------------------------------------------------- /bastion/utils/init_command_script.py: -------------------------------------------------------------------------------- 1 | from bastion.models import CommandGroupModel, CommandModel, CommandGroupRelationshipModel 2 | 3 | 4 | def init_command(): 5 | command_list = ["rm", "reboot", "shutdown", "init", "mkfs", "fdisk", "dd"] 6 | command_group, _ = CommandGroupModel.objects.update_or_create( 7 | name="危险命令", 8 | defaults={ 9 | "description": "System default command group: Danger Command" 10 | } 11 | ) 12 | for command in command_list: 13 | command_query, _ = CommandModel.objects.update_or_create( 14 | command=command, 15 | defaults={ 16 | "block_type": 1 17 | } 18 | ) 19 | CommandGroupRelationshipModel.objects.update_or_create(command=command_query, command_group=command_group) 20 | -------------------------------------------------------------------------------- /bastion/utils/init_script.py: -------------------------------------------------------------------------------- 1 | from bastion.models import HostGroupModel 2 | 3 | 4 | def init_default_group(): 5 | dic = { 6 | "id": 1, 7 | "name": "默认分组", 8 | "description": "默认分组", 9 | "create_time": "2008-08-08 10:10:10.888888", 10 | "update_time": "2008-08-08 10:10:10.888888" 11 | } 12 | 13 | obj = HostGroupModel.fetch_all(id=1) 14 | if obj: 15 | obj.update(**dic) 16 | else: 17 | HostGroupModel.create(**dic) 18 | 19 | -------------------------------------------------------------------------------- /bastion/utils/middleware.py: -------------------------------------------------------------------------------- 1 | from django.utils.deprecation import MiddlewareMixin 2 | 3 | 4 | ENV = {"dev": "", "prod": "o", "stag": "t"} 5 | 6 | 7 | class LocalLoginDebugMiddleware(MiddlewareMixin): 8 | def process_view(self, request, view, arg, kwarg): 9 | 10 | import platform 11 | # print("platform.system()", platform.system()) 12 | if (not request.COOKIES.get("bk_token")) and (platform.system() == "Windows"): 13 | request.COOKIES.update(**{"bk_token": "7g42UwSWOJdx-Rxp9N3Vv9zA1BbL6gnu2lmGn1iWX18"}) 14 | return None 15 | -------------------------------------------------------------------------------- /blueapps/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | VERSION = '3.1.0' 3 | __version__ = VERSION 4 | 5 | 6 | RUN_VER = "" 7 | 8 | 9 | def get_run_ver(): 10 | from django.conf import settings 11 | try: 12 | return settings.RUN_VER 13 | except AttributeError: 14 | return RUN_VER 15 | -------------------------------------------------------------------------------- /blueapps/account/apps.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.apps import AppConfig 3 | from django.utils.translation import ugettext_lazy as _ 4 | 5 | 6 | class AccountConfig(AppConfig): 7 | 8 | name = 'blueapps.account' 9 | verbose_name = _('account') 10 | -------------------------------------------------------------------------------- /blueapps/account/backends.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from blueapps.account.conf import ConfFixture 3 | from blueapps.account.utils import load_backend 4 | 5 | if hasattr(ConfFixture, 'USER_BACKEND'): 6 | UserBackend = load_backend(ConfFixture.USER_BACKEND) 7 | 8 | if hasattr(ConfFixture, 'WEIXIN_BACKEND'): 9 | WeixinBackend = load_backend(ConfFixture.WEIXIN_BACKEND) 10 | 11 | if hasattr(ConfFixture, 'RIO_BACKEND'): 12 | RioBackend = load_backend(ConfFixture.RIO_BACKEND) 13 | 14 | if hasattr(ConfFixture, 'BK_JWT_BACKEND'): 15 | BkJwtBackend = load_backend(ConfFixture.BK_JWT_BACKEND) 16 | -------------------------------------------------------------------------------- /blueapps/account/components/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/account/components/__init__.py -------------------------------------------------------------------------------- /blueapps/account/components/bk_jwt/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/account/components/bk_jwt/__init__.py -------------------------------------------------------------------------------- /blueapps/account/components/bk_token/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/account/components/bk_token/__init__.py -------------------------------------------------------------------------------- /blueapps/account/components/bk_token/forms.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django import forms 3 | 4 | 5 | class AuthenticationForm(forms.Form): 6 | # bk_token format: KH7P4-VSFi_nOEoV3kj0ytcs0uZnGOegIBLV-eM3rw8 7 | bk_token = forms.CharField() 8 | -------------------------------------------------------------------------------- /blueapps/account/components/bk_token/models.py: -------------------------------------------------------------------------------- 1 | # -*- coding=utf-8 -*- 2 | from blueapps.account.models import ( 3 | User as BaseUser, 4 | UserManager as BaseUserManager 5 | ) 6 | 7 | 8 | class UserProxyManager(BaseUserManager): 9 | pass 10 | 11 | 12 | class UserProxy(BaseUser): 13 | objects = UserProxyManager() 14 | 15 | class Meta: 16 | proxy = True 17 | -------------------------------------------------------------------------------- /blueapps/account/components/null/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.utils.deprecation import MiddlewareMixin 3 | 4 | 5 | class NullMiddleware(MiddlewareMixin): 6 | pass 7 | 8 | 9 | class NullBackend(object): 10 | 11 | def authenticate(self, **kwargs): 12 | return None 13 | -------------------------------------------------------------------------------- /blueapps/account/components/weixin/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/account/components/weixin/__init__.py -------------------------------------------------------------------------------- /blueapps/account/components/weixin/forms.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django import forms 3 | 4 | 5 | class WeixinAuthenticationForm(forms.Form): 6 | 7 | # code 格式: ... 8 | code = forms.CharField() 9 | state = forms.CharField() 10 | -------------------------------------------------------------------------------- /blueapps/account/decorators.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from functools import wraps 3 | 4 | 5 | def login_exempt(view_func): 6 | """"Mark a view function as being exempt from login view protection""" 7 | def wrapped_view(*args, **kwargs): 8 | return view_func(*args, **kwargs) 9 | wrapped_view.login_exempt = True 10 | return wraps(view_func)(wrapped_view) 11 | 12 | 13 | def login_exempt_v2(view_func): 14 | """"Mark a view function as being exempt from login view protection""" 15 | def wrapped_view(*args, **kwargs): 16 | return view_func(*args, **kwargs) 17 | wrapped_view.login_exempt_v2 = True 18 | return wraps(view_func)(wrapped_view) -------------------------------------------------------------------------------- /blueapps/account/forms.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django import forms 3 | 4 | from blueapps.account.models import User 5 | 6 | 7 | class UserCreationForm(forms.ModelForm): 8 | 9 | class Meta: 10 | model = User 11 | fields = ('username',) 12 | -------------------------------------------------------------------------------- /blueapps/account/handlers/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/account/handlers/__init__.py -------------------------------------------------------------------------------- /blueapps/account/migrations/0002_init_superuser.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.db import migrations 3 | from django.conf import settings 4 | 5 | 6 | def load_data(apps, schema_editor): 7 | """ 8 | 添加用户为管理员 9 | """ 10 | User = apps.get_model("account", "User") 11 | for name in settings.INIT_SUPERUSER: 12 | User.objects.update_or_create( 13 | username=name, 14 | defaults={'is_staff': True, 'is_active': True, 'is_superuser': True} 15 | ) 16 | 17 | 18 | class Migration(migrations.Migration): 19 | dependencies = [ 20 | ('account', '0001_initial') 21 | ] 22 | operations = [ 23 | migrations.RunPython(load_data) 24 | ] 25 | -------------------------------------------------------------------------------- /blueapps/account/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/account/migrations/__init__.py -------------------------------------------------------------------------------- /blueapps/account/sites/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /blueapps/account/sites/open/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/account/sites/open/__init__.py -------------------------------------------------------------------------------- /blueapps/account/urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.conf.urls import url 3 | 4 | from blueapps.account import views 5 | 6 | app_name = 'account' 7 | 8 | urlpatterns = [ 9 | url(r'^login_success/$', views.login_success, name="login_success"), 10 | url(r'^login_page/$', views.login_page, name="login_page"), 11 | url(r'^send_code/$', views.send_code_view, name="send_code"), 12 | url(r'^get_user_info/$', views.get_user_info, name="get_user_info") 13 | ] 14 | -------------------------------------------------------------------------------- /blueapps/account/utils/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.utils.module_loading import import_string 3 | 4 | 5 | def load_backend(backend): 6 | path = 'blueapps.account.components.{backend}'.format(backend=backend) 7 | return import_string(path) 8 | -------------------------------------------------------------------------------- /blueapps/conf/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | blueapps.conf 3 | ============= 4 | """ 5 | 6 | 7 | class BlueSettings(object): 8 | 9 | def __init__(self): 10 | from django.conf import settings as django_settings 11 | from blueapps.conf import default_settings 12 | 13 | self._django_settings = django_settings 14 | self._default_settings = default_settings 15 | 16 | def __getattr__(self, key): 17 | if key == key.upper(): 18 | if hasattr(self._django_settings, key): 19 | return getattr(self._django_settings, key) 20 | elif hasattr(self._default_settings, key): 21 | return getattr(self._default_settings, key) 22 | 23 | raise AttributeError("%r object has no attribute %r" 24 | % (self.__class__.__name__, key)) 25 | 26 | 27 | settings = BlueSettings() 28 | -------------------------------------------------------------------------------- /blueapps/conf/sites/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/conf/sites/__init__.py -------------------------------------------------------------------------------- /blueapps/conf/sites/open/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /blueapps/contrib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/contrib/__init__.py -------------------------------------------------------------------------------- /blueapps/contrib/bk_commands/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @created: 2017/6/7 4 | @desc: 5 | """ 6 | from django.conf import settings 7 | from django.core.management import execute_from_command_line 8 | 9 | 10 | def bk_admin(argv=None): 11 | if not settings.configured: 12 | settings.configure() 13 | settings.INSTALLED_APPS += ("blueapps.contrib.bk_commands",) 14 | return execute_from_command_line(argv) 15 | -------------------------------------------------------------------------------- /blueapps/contrib/bk_commands/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/contrib/bk_commands/management/__init__.py -------------------------------------------------------------------------------- /blueapps/contrib/bk_commands/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/contrib/bk_commands/management/commands/__init__.py -------------------------------------------------------------------------------- /blueapps/contrib/bk_commands/test.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | @author: 蓝鲸 4 | @created: 2017/6/14 5 | @desc: 6 | """ 7 | import sys 8 | 9 | from blueapps.contrib.bk_commands import bk_admin 10 | 11 | bk_admin(sys.argv) 12 | -------------------------------------------------------------------------------- /blueapps/core/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/core/__init__.py -------------------------------------------------------------------------------- /blueapps/core/celery/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from blueapps.core.celery.celery import app as celery_app # noqa 3 | -------------------------------------------------------------------------------- /blueapps/core/exceptions/__init__.py: -------------------------------------------------------------------------------- 1 | from blueapps.core.exceptions.base import * # noqa 2 | -------------------------------------------------------------------------------- /blueapps/core/handler/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/core/handler/__init__.py -------------------------------------------------------------------------------- /blueapps/core/handler/wsgi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from django.core.handlers.wsgi import WSGIHandler 3 | from django.conf import settings 4 | 5 | 6 | class BkWSGIHandler(WSGIHandler): 7 | def __call__(self, environ, start_response): 8 | script_name = environ.get('HTTP_X_SCRIPT_NAME') 9 | if script_name is not None: 10 | if script_name == '/': 11 | # '/'的含义:独立域名,不启用script_name 12 | script_name = '' 13 | environ['SCRIPT_NAME'] = script_name 14 | settings.FORCE_SCRIPT_NAME = settings.SITE_URL = '%s/' % script_name 15 | 16 | # 如果没有独立域名的配置,需要不断的适配,否则可以直接使用 17 | if not settings.STATIC_URL.startswith("http"): 18 | settings.STATIC_URL = '%sstatic/' % settings.SITE_URL 19 | return super(BkWSGIHandler, self).__call__(environ, start_response) 20 | -------------------------------------------------------------------------------- /blueapps/core/sites/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/core/sites/__init__.py -------------------------------------------------------------------------------- /blueapps/core/wsgi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import django 3 | from blueapps.core.handler.wsgi import BkWSGIHandler 4 | 5 | 6 | def get_wsgi_application(): 7 | """ 8 | The public interface to Django's WSGI support. Should return a WSGI 9 | callable. 10 | 11 | Allows us to avoid making django.core.handlers.WSGIHandler public API, in 12 | case the internal WSGI implementation changes or moves in the future. 13 | """ 14 | django.setup(set_prefix=False) 15 | return BkWSGIHandler() 16 | -------------------------------------------------------------------------------- /blueapps/middleware/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/middleware/__init__.py -------------------------------------------------------------------------------- /blueapps/middleware/bkui/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/middleware/bkui/__init__.py -------------------------------------------------------------------------------- /blueapps/middleware/bkui/middlewares.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from __future__ import unicode_literals 4 | 5 | from django.urls import resolve 6 | from django.conf import settings 7 | 8 | 9 | class BkuiPageMiddleware(object): 10 | 11 | def __init__(self, get_response): 12 | self.get_response = get_response 13 | 14 | def __call__(self, request): 15 | response = self.get_response(request) 16 | 17 | # 判断是否发生404的问题,及BKUI的 18 | if response.status_code == 404 and settings.IS_BKUI_HISTORY_MODE: 19 | home_view_func = resolve('/') 20 | return home_view_func.func(request) 21 | 22 | return response 23 | -------------------------------------------------------------------------------- /blueapps/middleware/request_provider.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from blueapps.utils.request_provider import RequestProvider 3 | 4 | __all__ = ["RequestProvider"] 5 | -------------------------------------------------------------------------------- /blueapps/middleware/xss/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/middleware/xss/__init__.py -------------------------------------------------------------------------------- /blueapps/patch/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/patch/__init__.py -------------------------------------------------------------------------------- /blueapps/template/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/template/__init__.py -------------------------------------------------------------------------------- /blueapps/template/backends/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/template/backends/__init__.py -------------------------------------------------------------------------------- /blueapps/utils/logger.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | __all__ = ['logger', 'logger_celery'] 4 | 5 | logger = logging.getLogger('app') 6 | logger_celery = logging.getLogger('celery') 7 | -------------------------------------------------------------------------------- /blueapps/utils/sites/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueapps/utils/sites/__init__.py -------------------------------------------------------------------------------- /blueapps/utils/sites/clouds/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import logging 3 | from bkoauth import get_access_token_by_user 4 | 5 | from blueapps.account import get_user_model 6 | 7 | logger = logging.getLogger('blueapps') 8 | 9 | 10 | def get_component_client_common_args(): 11 | """ 12 | 获取ComponentClient需要的common_args 13 | @return: 14 | { 15 | access_token = 'xxx' 16 | } 17 | @rtype: dict 18 | """ 19 | try: 20 | last_login_user = \ 21 | get_user_model().objects.all().order_by("-last_login")[0] 22 | except IndexError: 23 | logger.exception("There is not a last_login_user") 24 | raise IndexError("There is not a last_login_user") 25 | access_token = get_access_token_by_user( 26 | last_login_user.username).access_token 27 | return dict(access_token=access_token) 28 | -------------------------------------------------------------------------------- /blueapps/utils/sites/ieod/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import logging 3 | from bkoauth import get_access_token_by_user 4 | from blueapps.account import get_user_model 5 | 6 | logger = logging.getLogger('blueapps') 7 | 8 | 9 | def get_component_client_common_args(): 10 | """ 11 | 获取ComponentClient需要的common_args 12 | @return: 13 | { 14 | access_token = 'xxx' 15 | } 16 | @rtype: dict 17 | """ 18 | try: 19 | last_login_user = \ 20 | get_user_model().objects.all().order_by("-last_login")[0] 21 | except IndexError: 22 | logger.exception("There is not a last_login_user") 23 | raise IndexError("There is not a last_login_user") 24 | access_token = get_access_token_by_user( 25 | last_login_user.username).access_token 26 | return dict(access_token=access_token) 27 | -------------------------------------------------------------------------------- /blueapps/utils/sites/open/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import logging 3 | from blueapps.account import get_user_model 4 | 5 | logger = logging.getLogger('blueapps') 6 | 7 | 8 | def get_component_client_common_args(): 9 | """ 10 | 获取ComponentClient需要的common_args 11 | @return: 12 | { 13 | bk_username = 'xxx' 14 | } 15 | @rtype: dict 16 | """ 17 | try: 18 | last_login_user = \ 19 | get_user_model().objects.all().order_by("-last_login")[0] 20 | except IndexError: 21 | logger.exception("There is not a last_login_user") 22 | raise IndexError("There is not a last_login_user") 23 | username = last_login_user.username 24 | return dict(bk_username=username) 25 | -------------------------------------------------------------------------------- /blueapps/utils/sites/qcloud/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import logging 3 | from bkoauth import get_access_token_by_user 4 | from blueapps.account import get_user_model 5 | 6 | logger = logging.getLogger('blueapps') 7 | 8 | 9 | def get_component_client_common_args(): 10 | """ 11 | 获取ComponentClient需要的common_args 12 | @return: 13 | { 14 | access_token = 'xxx' 15 | } 16 | @rtype: dict 17 | """ 18 | try: 19 | last_login_user = \ 20 | get_user_model().objects.all().order_by("-last_login")[0] 21 | except IndexError: 22 | logger.exception("There is not a last_login_user") 23 | raise IndexError("There is not a last_login_user") 24 | access_token = get_access_token_by_user( 25 | last_login_user.username).access_token 26 | return dict(access_token=access_token) 27 | -------------------------------------------------------------------------------- /blueapps/utils/sites/tencent/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import logging 3 | from bkoauth import get_access_token_by_user 4 | from blueapps.account import get_user_model 5 | 6 | logger = logging.getLogger('blueapps') 7 | 8 | 9 | def get_component_client_common_args(): 10 | """ 11 | 获取ComponentClient需要的common_args 12 | @return: 13 | { 14 | access_token = 'xxx' 15 | } 16 | @rtype: dict 17 | """ 18 | try: 19 | last_login_user = \ 20 | get_user_model().objects.all().order_by("-last_login")[0] 21 | except IndexError: 22 | logger.warn("There is not a last_login_user") 23 | raise IndexError("There is not a last_login_user") 24 | access_token = get_access_token_by_user( 25 | last_login_user.username).access_token 26 | return dict(access_token=access_token) 27 | -------------------------------------------------------------------------------- /blueapps/utils/unique.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | import uuid 4 | 5 | 6 | def uniqid(): 7 | return uuid.uuid3( 8 | uuid.uuid1(), 9 | uuid.uuid4().hex 10 | ).hex 11 | -------------------------------------------------------------------------------- /blueking/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | __author__ = u"蓝鲸智云" 3 | -------------------------------------------------------------------------------- /blueking/component/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /blueking/component/apis/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /blueking/component/apis/bk_paas.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from ..base import ComponentAPI 3 | 4 | 5 | class CollectionsBkPaas(object): 6 | """Collections of BK_PAAS APIS""" 7 | 8 | def __init__(self, client): 9 | self.client = client 10 | 11 | self.get_app_info = ComponentAPI( 12 | client=self.client, method='GET', 13 | path='/api/c/compapi{bk_api_ver}/bk_paas/get_app_info/', 14 | description=u'获取应用信息' 15 | ) 16 | -------------------------------------------------------------------------------- /blueking/component/collections.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """Collections for component client""" 3 | from .apis.bk_login import CollectionsBkLogin 4 | from .apis.bk_paas import CollectionsBkPaas 5 | from .apis.cc import CollectionsCC 6 | from .apis.cmsi import CollectionsCMSI 7 | from .apis.gse import CollectionsGSE 8 | from .apis.job import CollectionsJOB 9 | from .apis.sops import CollectionsSOPS 10 | 11 | 12 | # Available components 13 | AVAILABLE_COLLECTIONS = { 14 | 'bk_login': CollectionsBkLogin, 15 | 'bk_paas': CollectionsBkPaas, 16 | 'cc': CollectionsCC, 17 | 'cmsi': CollectionsCMSI, 18 | 'gse': CollectionsGSE, 19 | 'job': CollectionsJOB, 20 | 'sops': CollectionsSOPS, 21 | } 22 | -------------------------------------------------------------------------------- /blueking/component/compat.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import sys 3 | 4 | _ver = sys.version_info 5 | 6 | is_py2 = (_ver[0] == 2) 7 | 8 | is_py3 = (_ver[0] == 3) 9 | 10 | 11 | if is_py2: 12 | from urlparse import urlparse 13 | 14 | str = unicode 15 | 16 | elif is_py3: 17 | from urllib.parse import urlparse # noqa 18 | 19 | str = str 20 | -------------------------------------------------------------------------------- /blueking/component/conf.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """Django project settings 3 | """ 4 | 5 | 6 | try: 7 | from django.conf import settings 8 | 9 | APP_CODE = settings.APP_ID 10 | SECRET_KEY = settings.APP_TOKEN 11 | COMPONENT_SYSTEM_HOST = getattr(settings, 'BK_PAAS_INNER_HOST', settings.BK_PAAS_HOST) 12 | DEFAULT_BK_API_VER = getattr(settings, 'DEFAULT_BK_API_VER', 'v2') 13 | except Exception: 14 | APP_CODE = '' 15 | SECRET_KEY = '' 16 | COMPONENT_SYSTEM_HOST = '' 17 | DEFAULT_BK_API_VER = 'v2' 18 | 19 | CLIENT_ENABLE_SIGNATURE = False 20 | -------------------------------------------------------------------------------- /blueking/component/exceptions.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | class ComponentBaseException(Exception): 5 | pass 6 | 7 | 8 | class ComponentAPIException(ComponentBaseException): 9 | """Exception for Component API""" 10 | 11 | def __init__(self, api_obj, error_message, resp=None): 12 | self.api_obj = api_obj 13 | self.error_message = error_message 14 | self.resp = resp 15 | 16 | if self.resp is not None: 17 | error_message = '%s, resp=%s' % (error_message, self.resp.text) 18 | super(ComponentAPIException, self).__init__(error_message) 19 | -------------------------------------------------------------------------------- /blueking/tests/README.md: -------------------------------------------------------------------------------- 1 | # 完善测试数据 2 | 3 | - 更新 blueking/tests/utils/utils.py 中 load_tests_settings 返回的数据为有效值 4 | - 更新 conf/default.py 中 APP_ID、APP_TOKEN、BK_PAAS_HOST 为有效值 5 | 6 | # 执行测试 7 | 8 | ``` 9 | python manage.py test --keepdb blueking.tests.test_client 10 | python manage.py test --keepdb blueking.tests.test_shortcuts 11 | python manage.py test --keepdb blueking.tests.test_utils 12 | ``` 13 | -------------------------------------------------------------------------------- /blueking/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueking/tests/__init__.py -------------------------------------------------------------------------------- /blueking/tests/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/blueking/tests/utils/__init__.py -------------------------------------------------------------------------------- /blueking/tests/utils/utils.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | 4 | def get_user_model(): 5 | try: 6 | from account.models import BkUser as User 7 | except Exception: 8 | from django.contrib.auth.models import User 9 | return User 10 | 11 | 12 | def load_tests_settings(): 13 | return { 14 | 'valid_app': { 15 | 'bk_app_code': '', 16 | 'bk_app_secret': '', 17 | }, 18 | 'bk_user': { 19 | 'bk_username': 'admin', 20 | 'bk_token': '', 21 | } 22 | } 23 | 24 | 25 | tests_settings = load_tests_settings() 26 | -------------------------------------------------------------------------------- /docker/README.md: -------------------------------------------------------------------------------- 1 | # 使用说明 2 | 3 | Websocket镜像和Bastion堡垒机的代码是一致的,只需要删除掉无用的静态文件即可。 4 | 5 | ## 构建镜像 6 | 7 | docker build -t opsany/opsany-paas-websocket:v3.2.8 . 8 | -------------------------------------------------------------------------------- /docker/websocket.ini: -------------------------------------------------------------------------------- 1 | [program:websocket] 2 | command=uvicorn --proxy-headers --host 0.0.0.0 --port 8004 asgi:application --workers 4 3 | directory=/opt/opsany/websocket 4 | environment=BK_ENV="production",BK_LOG_DIR="/opt/opsany/logs",APP_ID="opsany-bastion" 5 | startsecs=0 6 | stopwaitsecs=0 7 | autostart=true 8 | autorestart=true 9 | redirect_stderr=true 10 | stdout_logfile=/opt/opsany/logs/paas_websocket.log 11 | -------------------------------------------------------------------------------- /docs/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/docs/.gitkeep -------------------------------------------------------------------------------- /docs/static/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/docs/static/.gitkeep -------------------------------------------------------------------------------- /docs/static/bastion-deploy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/docs/static/bastion-deploy.png -------------------------------------------------------------------------------- /docs/static/bastion-update.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/docs/static/bastion-update.png -------------------------------------------------------------------------------- /frontend/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not ie <= 10 4 | -------------------------------------------------------------------------------- /frontend/.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset=utf-8 3 | end_of_line=lf 4 | insert_final_newline=false 5 | indent_style=space 6 | indent_size=4 7 | 8 | [{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}] 9 | indent_style=space 10 | indent_size=2 11 | 12 | [{*.jhm,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl}] 13 | indent_style=space 14 | indent_size=2 15 | 16 | [{.babelrc,.stylelintrc,jest.config,.eslintrc,.prettierrc,*.json,*.jsb3,*.jsb2,*.bowerrc}] 17 | indent_style=space 18 | indent_size=2 19 | 20 | [*.svg] 21 | indent_style=space 22 | indent_size=2 23 | 24 | [*.js.map] 25 | indent_style=space 26 | indent_size=2 27 | 28 | [*.less] 29 | indent_style=space 30 | indent_size=2 31 | 32 | [*.vue] 33 | indent_style=space 34 | indent_size=2 35 | 36 | [{.analysis_options,*.yml,*.yaml}] 37 | indent_style=space 38 | indent_size=2 39 | 40 | -------------------------------------------------------------------------------- /frontend/.env.development: -------------------------------------------------------------------------------- 1 | NODE_ENV=development 2 | VUE_APP_PREVIEW=true 3 | VUE_APP_API_BASE_URL=/api -------------------------------------------------------------------------------- /frontend/.env.preview: -------------------------------------------------------------------------------- 1 | NODE_ENV=production 2 | VUE_APP_PREVIEW=true 3 | VUE_APP_API_BASE_URL=/api -------------------------------------------------------------------------------- /frontend/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /frontend/.gitattributes: -------------------------------------------------------------------------------- 1 | public/* linguist-vendored -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | 14 | # Editor directories and files 15 | .idea 16 | .vscode 17 | *.suo 18 | *.ntvs* 19 | *.njsproj 20 | *.sln 21 | *.sw* 22 | -------------------------------------------------------------------------------- /frontend/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "semi": false, 4 | "singleQuote": true 5 | } 6 | -------------------------------------------------------------------------------- /frontend/.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - 10.15.0 4 | cache: yarn 5 | script: 6 | - yarn 7 | - yarn run lint --no-fix && yarn run build 8 | -------------------------------------------------------------------------------- /frontend/babel.config.js: -------------------------------------------------------------------------------- 1 | const IS_PROD = ['production', 'prod'].includes(process.env.NODE_ENV) 2 | 3 | const plugins = [] 4 | if (IS_PROD) { 5 | plugins.push('transform-remove-console') 6 | } 7 | 8 | // lazy load ant-design-vue 9 | // if your use import on Demand, Use this code 10 | plugins.push(['import', { 11 | 'libraryName': 'ant-design-vue', 12 | 'libraryDirectory': 'es', 13 | 'style': true // `style: true` 会加载 less 文件 14 | }]) 15 | 16 | module.exports = { 17 | presets: [ 18 | '@vue/cli-plugin-babel/preset', 19 | [ 20 | '@babel/preset-env', 21 | { 22 | 'useBuiltIns': 'entry', 23 | 'corejs': 3 24 | } 25 | ] 26 | ], 27 | plugins 28 | } 29 | -------------------------------------------------------------------------------- /frontend/docs/add-page-loading-animate.md: -------------------------------------------------------------------------------- 1 | 为首屏增加 加载动画 2 | ==== 3 | 4 | 5 | 6 | ## 需求 7 | 8 | > 为了缓解用户第一次访问时,加载 JS 过大所导致用户等待白屏时间过长导致的用户体验不好,进行的一个优化动效。 9 | 10 | 11 | 12 | ## 实现方案 13 | 14 | 1. 将 动画加载 dom 元素放在 #app 内,Vue 生命周期开始时,会自动清掉 #app 下的所有元素。 15 | 2. 将 动画加载 dom 元素放在 body 下,Vue 生命周期开始时 App.vue (created, mounted) 调用 `@/utils/utll` 下的 removeLoadingAnimate(#id, timeout) 则会移除加载动画 16 | 17 | 最后一步: 18 | ​ 将样式插入到 `public/index.html` 文件的 `` 最好写成内联 `` 19 | 20 | 21 | 22 | ---- 23 | 24 | 目前提供有两个样式,均在 `public/loading` 文件夹内。且 pro 已经默认使用了一套 loading 动画方案,可以直接参考 `public/index.html` 25 | 26 | 27 | ## 写在最后 28 | 29 | 目前 pro 有页面 overflow 显示出浏览器滚动条时,页面会抖动一下的问题。 30 | 31 | 欢迎各位提供能解决的方案和实现 demo。如果在条件允许的情况下,建议请直接使用 pro 进行改造,也欢迎直接 PR 到 pro 的仓库 32 | -------------------------------------------------------------------------------- /frontend/docs/multi-tabs.md: -------------------------------------------------------------------------------- 1 | 多(页签)标签 模式 2 | ==== 3 | 4 | 5 | ## 让框架支持打开的页面增加多标签,可随时切换 6 | 7 | ### 关于如何移除该功能 组件 8 | 1. 移除 `/src/layouts/BasicLayout.vue` L44, L69, L80 9 | ```vue 10 | // L44 11 | 12 | 13 | // L69 14 | import MultiTab from '@/components/MultiTab' 15 | 16 | // L80 17 | MultiTab, 18 | ``` 19 | 2. 移除 `/src/config/defaultSettings.js` L25 20 | 21 | 3. 移除 `src/store/modules/app.js` L27, L76-L79, L118-L120 22 | 23 | 4. 移除 `src/utils/mixin.js` L21 24 | 25 | 5. 删除组件目录 `src/components/MultiTab` 26 | 27 | > 以上 `L x` 均代表行N ,如 L3 = 行3 28 | 29 | -------------------------------------------------------------------------------- /frontend/docs/webpack-bundle-analyzer.md: -------------------------------------------------------------------------------- 1 | 先增加依赖 2 | 3 | ```bash 4 | // npm 5 | $ npm install --save-dev webpack-bundle-analyzer 6 | 7 | // or yarn 8 | $ yarn add webpack-bundle-analyzer -D 9 | ``` 10 | 11 | 配置文件 `vue.config.js` 增加 `configureWebpack.plugins` 参数 12 | 13 | ``` 14 | const path = require('path') 15 | const webpack = require('webpack') 16 | const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin 17 | 18 | function resolve (dir) { 19 | return path.join(__dirname, dir) 20 | } 21 | 22 | // vue.config.js 23 | module.exports = { 24 | configureWebpack: { 25 | plugins: [ 26 | // Ignore all locale files of moment.js 27 | new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/), 28 | // 依赖大小分析工具 29 | new BundleAnalyzerPlugin(), 30 | ] 31 | }, 32 | 33 | 34 | ... 35 | } 36 | ``` 37 | 38 | 39 | 40 | 启动 `cli` 的 `build` 命令进行项目编译,编译完成时,会自动运行一个 http://localhost:8888 的地址,完整显示了支持库依赖 -------------------------------------------------------------------------------- /frontend/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | moduleFileExtensions: [ 3 | 'js', 4 | 'jsx', 5 | 'json', 6 | 'vue' 7 | ], 8 | transform: { 9 | '^.+\\.vue$': 'vue-jest', 10 | '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub', 11 | '^.+\\.jsx?$': 'babel-jest' 12 | }, 13 | moduleNameMapper: { 14 | '^@/(.*)$': '/src/$1' 15 | }, 16 | snapshotSerializers: [ 17 | 'jest-serializer-vue' 18 | ], 19 | testMatch: [ 20 | '**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)' 21 | ], 22 | testURL: 'http://localhost/' 23 | } 24 | -------------------------------------------------------------------------------- /frontend/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "baseUrl": ".", 5 | "paths": { 6 | "@/*": ["src/*"] 7 | } 8 | }, 9 | "exclude": ["node_modules", "dist"], 10 | "include": ["src/**/*"] 11 | } 12 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | autoprefixer: {} 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /frontend/public/avatar2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/public/avatar2.jpg -------------------------------------------------------------------------------- /frontend/public/loading/loading.html: -------------------------------------------------------------------------------- 1 |
Loading
-------------------------------------------------------------------------------- /frontend/public/loading/option2/loading.css: -------------------------------------------------------------------------------- 1 | .preloading-animate{background:#ffffff;width:100%;height:100%;position:fixed;left:0;top:0;z-index:299;}.preloading-animate .preloading-wrapper{position:absolute;width:5rem;height:5rem;left:50%;top:50%;transform:translate(-50%,-50%);}.preloading-animate .preloading-wrapper .preloading-balls{font-size:5rem;} -------------------------------------------------------------------------------- /frontend/public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/public/logo.png -------------------------------------------------------------------------------- /frontend/run-server.bat: -------------------------------------------------------------------------------- 1 | npm run serve -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 35 | -------------------------------------------------------------------------------- /frontend/src/api/access-strategy.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | const url = 'access-strategy-v2/' //访问策略 3 | export const getAccessStrategy = (data = {}) => { 4 | return request({ 5 | url, 6 | method: "get", 7 | params: data 8 | }) 9 | } 10 | export const addAccessStrategy = (data = {}) => { 11 | return request({ 12 | url, 13 | method: "post", 14 | data 15 | }) 16 | } 17 | export const editAccessStrategy = (data = {}) => { 18 | return request({ 19 | url, 20 | method: "put", 21 | data 22 | }) 23 | } 24 | export const delAccessStrategy = (data = {}) => { 25 | return request({ 26 | url, 27 | method: "delete", 28 | data 29 | }) 30 | } 31 | 32 | export const editAccessStrategyStatus = (data = {}) => { 33 | return request({ 34 | url: 'strategy-status/', 35 | method: "put", 36 | data 37 | }) 38 | } -------------------------------------------------------------------------------- /frontend/src/api/agent.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 从cmdb获取主机数据 4 | export const getAgent = (data = {}) => { 5 | return request({ 6 | url: "get-agent/", 7 | method: "get", 8 | params: data 9 | }) 10 | } -------------------------------------------------------------------------------- /frontend/src/api/command-group.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | const url = 'command-group/' //命令组 3 | export const getCommandGroup = (data = {}) => { 4 | return request({ 5 | url, 6 | method: "get", 7 | params: data 8 | }) 9 | } 10 | export const addCommandGroup = (data = {}) => { 11 | return request({ 12 | url, 13 | method: "post", 14 | data 15 | }) 16 | } 17 | export const editCommandGroup = (data = {}) => { 18 | return request({ 19 | url, 20 | method: "put", 21 | data 22 | }) 23 | } 24 | export const delCommandGroup = (data = {}) => { 25 | return request({ 26 | url, 27 | method: "delete", 28 | data 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/api/command-strategy.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | const url = 'command-strategy-v2/' //访问策略 3 | export const getCommandStrategy = (data = {}) => { 4 | return request({ 5 | url, 6 | method: "get", 7 | params: data 8 | }) 9 | } 10 | export const addCommandStrategy = (data = {}) => { 11 | return request({ 12 | url, 13 | method: "post", 14 | data 15 | }) 16 | } 17 | export const editCommandStrategy = (data = {}) => { 18 | return request({ 19 | url, 20 | method: "put", 21 | data 22 | }) 23 | } 24 | export const delCommandStrategy = (data = {}) => { 25 | return request({ 26 | url, 27 | method: "delete", 28 | data 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/api/command.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | const url = 'command/' //命令 3 | export const getCommand = (data = {}) => { 4 | return request({ 5 | url, 6 | method: "get", 7 | params: data 8 | }) 9 | } 10 | export const addCommand = (data = {}) => { 11 | return request({ 12 | url, 13 | method: "post", 14 | data 15 | }) 16 | } 17 | export const editCommand = (data = {}) => { 18 | return request({ 19 | url, 20 | method: "put", 21 | data 22 | }) 23 | } 24 | export const delCommand = (data = {}) => { 25 | return request({ 26 | url, 27 | method: "delete", 28 | data 29 | }) 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/api/credential.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | // 获取凭证数据 3 | export const getCredential = (data = {}) => { 4 | return request({ 5 | url: "credential/", 6 | method: "get", 7 | params: data 8 | }) 9 | } 10 | // 新建凭证 11 | export const addCredential = (data = {}) => { 12 | return request({ 13 | url: "credential/", 14 | method: "post", 15 | data 16 | }) 17 | } 18 | // 修改凭证 19 | export const editCredential = (data = {}) => { 20 | return request({ 21 | url: "credential/", 22 | method: "put", 23 | data 24 | }) 25 | } 26 | // 删除凭证 27 | export const delCredential = (data = {}) => { 28 | return request({ 29 | url: "credential/", 30 | method: "delete", 31 | data 32 | }) 33 | } -------------------------------------------------------------------------------- /frontend/src/api/home.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | // 获取凭证数据 3 | export const getHome = (data = {}) => { 4 | return request({ 5 | url: "home-page/", 6 | method: "get", 7 | params: data 8 | }) 9 | } -------------------------------------------------------------------------------- /frontend/src/api/host-group-console.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取主机列表(树类型) 4 | export const getHostGroupList = (data = {}) => { 5 | return request({ 6 | url: "host-group-console/", 7 | method: "get", 8 | params: data 9 | }) 10 | } 11 | 12 | -------------------------------------------------------------------------------- /frontend/src/api/link-check.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 获取凭证数据 4 | export const linkCheck = (data = {}) => { 5 | return request({ 6 | url: "link-check-v2/", 7 | method: "post", 8 | data 9 | }) 10 | } 11 | 12 | // 获取凭证数据 13 | export const getLinkCheck = (data = {}) => { 14 | return request({ 15 | url: "link-check-v2/", 16 | method: "get", 17 | params: data 18 | }) 19 | } 20 | -------------------------------------------------------------------------------- /frontend/src/api/linuxfile.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | import config from '@/config/defaultSettings' 3 | import { stringifyUrl } from '@/utils/util' 4 | const url = 'linux-file/' 5 | export const getLinuxFileInfo = (data = {}) => { 6 | return request({ 7 | url, 8 | method: "get", 9 | params: data 10 | }) 11 | } 12 | export const downLoadFile = (data = {}) => { 13 | return config.baseUrl + url + stringifyUrl(data) 14 | } 15 | export const uploadLinuxFile = (data = {}) => { 16 | return request({ 17 | url, 18 | method: "post", 19 | data 20 | }) 21 | } 22 | export const delLinuxFile = (data = {}) => { 23 | return request({ 24 | url, 25 | method: "delete", 26 | data 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /frontend/src/api/menu.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | /** 4 | * @deprecated 获取菜单列表 5 | * @param {data} Object 6 | * @returns Promise 7 | */ 8 | 9 | export const getMenuList = (data = {}) => { 10 | return request({ 11 | url: "get-menu/", 12 | method: "get", 13 | params: data 14 | }) 15 | } -------------------------------------------------------------------------------- /frontend/src/api/messageManage.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | 4 | /** 5 | * @deprecated 消息管理 6 | * @param {data} Object 7 | * @returns Promise 8 | */ 9 | 10 | //获取消息列表 --头部导航 11 | export const getUserMessageList = (data = {}) => { 12 | return request({ 13 | url: "get-user-message/", 14 | method: "get", 15 | params: data 16 | }) 17 | } 18 | 19 | //全部已读 20 | export const readAllMessage = (data = {}) => { 21 | return request({ 22 | url: "read-all-message/", 23 | method: "get", 24 | params: data 25 | }) 26 | } 27 | -------------------------------------------------------------------------------- /frontend/src/api/navSetting.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | /** 4 | * @deprecated 获取收藏的导航 5 | * @param {data} Object 6 | * @returns Promise 7 | */ 8 | export const getNavList = (data = {}) => { 9 | return request({ 10 | url: "get-nav-and-collection/", 11 | method: "get", 12 | params: data 13 | }) 14 | } 15 | 16 | 17 | /** 18 | * @deprecated 收藏/取消收藏 19 | * @param {data} Object 20 | * @returns Promise 21 | */ 22 | //上传图标 23 | export const collection = (data = {}) => { 24 | return request({ 25 | url: "collection/", 26 | method: "post", 27 | data 28 | }) 29 | } 30 | -------------------------------------------------------------------------------- /frontend/src/api/page-auth.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export const getPageAuth = (data = {}) => { 4 | return request({ 5 | url: "authentication/", 6 | method: "get", 7 | params: data 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /frontend/src/api/resource-credential.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | // 获取凭证数据 --新版 3 | // GET获取资源凭证 4 | // ?data_type=ssh 5 | // ?data_type=password 6 | // ?data_type=group 7 | // ?data_type=host&host_id= 8 | export const getResourceCredential = (data = {}) => { 9 | return request({ 10 | url: "resource-credential/", 11 | method: "get", 12 | params: data 13 | }) 14 | } 15 | -------------------------------------------------------------------------------- /frontend/src/api/user-admin.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | const url = 'bk-user-admin/' 3 | 4 | //获取用户列表 5 | export const getUserAdmin = (data = {}) => { 6 | return request({ 7 | url, 8 | method: "get", 9 | params: data 10 | }) 11 | } 12 | 13 | //删除某个用户 14 | export const delUserAdmin = (data = {}) => { 15 | return request({ 16 | url, 17 | method: "delete", 18 | data 19 | }) 20 | } 21 | 22 | //导入用户 23 | export const addUserAdmin = (data = {}) => { 24 | return request({ 25 | url, 26 | method: "post", 27 | data 28 | }) 29 | } 30 | 31 | -------------------------------------------------------------------------------- /frontend/src/api/user-group-admin.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | const url = 'bk-user-group-admin/' 3 | 4 | //获取用户组列表 5 | export const getUserGroupAdmin = (data = {}) => { 6 | return request({ 7 | url, 8 | method: "get", 9 | params: data 10 | }) 11 | } 12 | 13 | //删除某个用户组 14 | export const delUserGroupAdmin = (data = {}) => { 15 | return request({ 16 | url, 17 | method: "delete", 18 | data 19 | }) 20 | } 21 | 22 | //新增用户组 23 | export const addUserGroupAdmin = (data = {}) => { 24 | return request({ 25 | url, 26 | method: "post", 27 | data 28 | }) 29 | } 30 | 31 | //编辑用户组 32 | export const editUserGroupAdmin = (data = {}) => { 33 | return request({ 34 | url, 35 | method: "put", 36 | data 37 | }) 38 | } 39 | 40 | -------------------------------------------------------------------------------- /frontend/src/api/user.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | /** 4 | * @deprecated 用户信息相关 5 | * @param {data} Object 6 | * @returns Promise 7 | */ 8 | //获取用户信息 9 | export const getUserInfo = (data = {}) => { 10 | return request({ 11 | url: "user-info/", 12 | method: "get", 13 | params: data 14 | }) 15 | } 16 | 17 | 18 | /** 19 | * @deprecated 上传头像 20 | * @param {data} Object 21 | * @returns Promise 22 | */ 23 | //上传图标 24 | export const uploadHeadImg = (data = {}) => { 25 | return request({ 26 | url: "user-icon/", 27 | method: "post", 28 | data 29 | }) 30 | } 31 | 32 | //获取所有用户列表 33 | export const getUserList = (data = {}) => { 34 | return request({ 35 | url: "user/", 36 | method: "get", 37 | params: data 38 | }) 39 | } 40 | 41 | //获取所有用户组列表 42 | export const getUserGroupList = (data = {}) => { 43 | return request({ 44 | url: "group/", 45 | method: "get", 46 | params: data 47 | }) 48 | } 49 | -------------------------------------------------------------------------------- /frontend/src/api/windowsfile.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | import config from '@/config/defaultSettings' 3 | import { stringifyUrl } from '@/utils/util' 4 | const url = 'windows-file/' 5 | export const getWinFileInfo = (data = {}) => { 6 | return request({ 7 | url, 8 | method: "get", 9 | params: data 10 | }) 11 | } 12 | export const downLoadWinFile = (data = {}) => { 13 | return config.baseUrl + url + stringifyUrl(data) 14 | } 15 | export const uploadWinFile = (data = {}) => { 16 | return request({ 17 | url, 18 | method: "post", 19 | data 20 | }) 21 | } 22 | export const delWinFile = (data = {}) => { 23 | return request({ 24 | url, 25 | method: "delete", 26 | data 27 | }) 28 | } 29 | -------------------------------------------------------------------------------- /frontend/src/assets/home_smile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/home_smile.png -------------------------------------------------------------------------------- /frontend/src/assets/image/authorization_expired.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/authorization_expired.png -------------------------------------------------------------------------------- /frontend/src/assets/image/conversation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/conversation.png -------------------------------------------------------------------------------- /frontend/src/assets/image/function_not_authorized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/function_not_authorized.png -------------------------------------------------------------------------------- /frontend/src/assets/image/not_authorized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/not_authorized.png -------------------------------------------------------------------------------- /frontend/src/assets/image/platform_not_authorized.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/platform_not_authorized.png -------------------------------------------------------------------------------- /frontend/src/assets/image/resources.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/resources.png -------------------------------------------------------------------------------- /frontend/src/assets/image/strategy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/strategy.png -------------------------------------------------------------------------------- /frontend/src/assets/image/voucher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/image/voucher.png -------------------------------------------------------------------------------- /frontend/src/assets/left_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/left_close.png -------------------------------------------------------------------------------- /frontend/src/assets/left_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/left_open.png -------------------------------------------------------------------------------- /frontend/src/assets/logo-reverse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/logo-reverse.png -------------------------------------------------------------------------------- /frontend/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/logo.png -------------------------------------------------------------------------------- /frontend/src/assets/nav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/nav.png -------------------------------------------------------------------------------- /frontend/src/assets/no-auth.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/no-auth.png -------------------------------------------------------------------------------- /frontend/src/assets/ops-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/ops-logo.png -------------------------------------------------------------------------------- /frontend/src/assets/remote_host.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/remote_host.png -------------------------------------------------------------------------------- /frontend/src/assets/right_close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/right_close.png -------------------------------------------------------------------------------- /frontend/src/assets/right_open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/frontend/src/assets/right_open.png -------------------------------------------------------------------------------- /frontend/src/components/ArticleListContent/index.js: -------------------------------------------------------------------------------- 1 | import ArticleListContent from './ArticleListContent' 2 | 3 | export default ArticleListContent 4 | -------------------------------------------------------------------------------- /frontend/src/components/AvatarList/Item.jsx: -------------------------------------------------------------------------------- 1 | import PropTypes from 'ant-design-vue/es/_util/vue-types' 2 | import { Tooltip, Avatar } from 'ant-design-vue' 3 | import { getSlotOptions } from 'ant-design-vue/lib/_util/props-util' 4 | import { warning } from 'ant-design-vue/lib/vc-util/warning' 5 | 6 | export const AvatarListItemProps = { 7 | tips: PropTypes.string.def(null), 8 | src: PropTypes.string.def('') 9 | } 10 | 11 | const Item = { 12 | __ANT_AVATAR_CHILDREN: true, 13 | name: 'AvatarListItem', 14 | props: AvatarListItemProps, 15 | created () { 16 | warning(getSlotOptions(this.$parent).__ANT_AVATAR_LIST, 'AvatarListItem must be a subcomponent of AvatarList') 17 | }, 18 | render () { 19 | const AvatarDom = 20 | return this.tips && {AvatarDom} || 21 | } 22 | } 23 | 24 | export default Item 25 | -------------------------------------------------------------------------------- /frontend/src/components/AvatarList/index.js: -------------------------------------------------------------------------------- 1 | import AvatarList from './List' 2 | import Item from './Item' 3 | 4 | export { 5 | AvatarList, 6 | Item as AvatarListItem 7 | } 8 | 9 | export default AvatarList 10 | -------------------------------------------------------------------------------- /frontend/src/components/Charts/chart.less: -------------------------------------------------------------------------------- 1 | .antv-chart-mini { 2 | position: relative; 3 | width: 100%; 4 | 5 | .chart-wrapper { 6 | position: absolute; 7 | bottom: -28px; 8 | width: 100%; 9 | 10 | /* margin: 0 -5px; 11 | overflow: hidden;*/ 12 | } 13 | } -------------------------------------------------------------------------------- /frontend/src/components/Charts/smooth.area.less: -------------------------------------------------------------------------------- 1 | @import "../index"; 2 | 3 | @smoothArea-prefix-cls: ~"@{ant-pro-prefix}-smooth-area"; 4 | 5 | .@{smoothArea-prefix-cls} { 6 | position: relative; 7 | width: 100%; 8 | 9 | .chart-wrapper { 10 | position: absolute; 11 | bottom: -28px; 12 | width: 100%; 13 | } 14 | } -------------------------------------------------------------------------------- /frontend/src/components/Ellipsis/index.js: -------------------------------------------------------------------------------- 1 | import Ellipsis from './Ellipsis' 2 | 3 | export default Ellipsis 4 | -------------------------------------------------------------------------------- /frontend/src/components/Ellipsis/index.md: -------------------------------------------------------------------------------- 1 | # Ellipsis 文本自动省略号 2 | 3 | 文本过长自动处理省略号,支持按照文本长度和最大行数两种方式截取。 4 | 5 | 6 | 7 | 引用方式: 8 | 9 | ```javascript 10 | import Ellipsis from '@/components/Ellipsis' 11 | 12 | export default { 13 | components: { 14 | Ellipsis 15 | } 16 | } 17 | ``` 18 | 19 | 20 | 21 | ## 代码演示 [demo](https://pro.loacg.com/test/home) 22 | 23 | ```html 24 | 25 | There were injuries alleged in three cases in 2015, and a 26 | fourth incident in September, according to the safety recall report. After meeting with US regulators in October, the firm decided to issue a voluntary recall. 27 | 28 | ``` 29 | 30 | 31 | 32 | ## API 33 | 34 | 35 | 参数 | 说明 | 类型 | 默认值 36 | ----|------|-----|------ 37 | tooltip | 移动到文本展示完整内容的提示 | boolean | - 38 | length | 在按照长度截取下的文本最大字符数,超过则截取省略 | number | - -------------------------------------------------------------------------------- /frontend/src/components/Exception/index.js: -------------------------------------------------------------------------------- 1 | import ExceptionPage from './ExceptionPage.vue' 2 | export default ExceptionPage 3 | -------------------------------------------------------------------------------- /frontend/src/components/Exception/type.js: -------------------------------------------------------------------------------- 1 | const types = { 2 | 403: { 3 | img: 'https://gw.alipayobjects.com/zos/rmsportal/wZcnGqRDyhPOEYFcZDnb.svg', 4 | title: '403', 5 | desc: '抱歉,你无权访问该页面' 6 | }, 7 | 404: { 8 | img: 'https://gw.alipayobjects.com/zos/rmsportal/KpnpchXsobRgLElEozzI.svg', 9 | title: '404', 10 | desc: '抱歉,你访问的页面不存在或仍在开发中' 11 | }, 12 | 500: { 13 | img: 'https://gw.alipayobjects.com/zos/rmsportal/RVRUAYdCGeYNBWoKiIwB.svg', 14 | title: '500', 15 | desc: '抱歉,服务器出错了' 16 | } 17 | } 18 | 19 | export default types 20 | -------------------------------------------------------------------------------- /frontend/src/components/FooterToolbar/index.js: -------------------------------------------------------------------------------- 1 | import FooterToolBar from './FooterToolBar' 2 | import './index.less' 3 | 4 | export default FooterToolBar 5 | -------------------------------------------------------------------------------- /frontend/src/components/FooterToolbar/index.less: -------------------------------------------------------------------------------- 1 | @import "../index"; 2 | 3 | @footer-toolbar-prefix-cls: ~"@{ant-pro-prefix}-footer-toolbar"; 4 | 5 | .@{footer-toolbar-prefix-cls} { 6 | position: fixed; 7 | width: 100%; 8 | bottom: 0; 9 | right: 0; 10 | height: 56px; 11 | line-height: 56px; 12 | box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.03); 13 | background: #fff; 14 | border-top: 1px solid #e8e8e8; 15 | padding: 0 24px; 16 | z-index: 9; 17 | 18 | &:after { 19 | content: ""; 20 | display: block; 21 | clear: both; 22 | } 23 | } -------------------------------------------------------------------------------- /frontend/src/components/FooterToolbar/index.md: -------------------------------------------------------------------------------- 1 | # FooterToolbar 底部工具栏 2 | 3 | 固定在底部的工具栏。 4 | 5 | 6 | 7 | ## 何时使用 8 | 9 | 固定在内容区域的底部,不随滚动条移动,常用于长页面的数据搜集和提交工作。 10 | 11 | 12 | 13 | 引用方式: 14 | 15 | ```javascript 16 | import FooterToolBar from '@/components/FooterToolbar' 17 | 18 | export default { 19 | components: { 20 | FooterToolBar 21 | } 22 | } 23 | ``` 24 | 25 | 26 | 27 | ## 代码演示 28 | 29 | ```html 30 | 31 | 提交 32 | 33 | ``` 34 | 或 35 | ```html 36 | 37 | 提交 38 | 39 | ``` 40 | 41 | 42 | ## API 43 | 44 | 参数 | 说明 | 类型 | 默认值 45 | ----|------|-----|------ 46 | children (slot) | 工具栏内容,向右对齐 | - | - 47 | extra | 额外信息,向左对齐 | String, Object | - 48 | 49 | -------------------------------------------------------------------------------- /frontend/src/components/GlobalFooter/index.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 18 | -------------------------------------------------------------------------------- /frontend/src/components/IconSelector/README.md: -------------------------------------------------------------------------------- 1 | IconSelector 2 | ==== 3 | 4 | > 图标选择组件,常用于为某一个数据设定一个图标时使用 5 | > eg: 设定菜单列表时,为每个菜单设定一个图标 6 | 7 | 该组件由 [@Saraka](https://github.com/saraka-tsukai) 封装 8 | 9 | 10 | 11 | ### 使用方式 12 | 13 | ```vue 14 | 19 | 20 | 39 | ``` 40 | 41 | 42 | 43 | ### 事件 44 | 45 | 46 | | 名称 | 说明 | 类型 | 默认值 | 47 | | ------ | -------------------------- | ------ | ------ | 48 | | change | 当改变了 `icon` 选中项触发 | String | - | 49 | -------------------------------------------------------------------------------- /frontend/src/components/IconSelector/index.js: -------------------------------------------------------------------------------- 1 | import IconSelector from './IconSelector' 2 | export default IconSelector 3 | -------------------------------------------------------------------------------- /frontend/src/components/MultiTab/events.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | export default new Vue() 3 | -------------------------------------------------------------------------------- /frontend/src/components/MultiTab/index.less: -------------------------------------------------------------------------------- 1 | @import '../index'; 2 | 3 | @multi-tab-prefix-cls: ~"@{ant-pro-prefix}-multi-tab"; 4 | @multi-tab-wrapper-prefix-cls: ~"@{ant-pro-prefix}-multi-tab-wrapper"; 5 | 6 | /* 7 | .topmenu .@{multi-tab-prefix-cls} { 8 | max-width: 1200px; 9 | margin: -23px auto 24px auto; 10 | } 11 | */ 12 | .@{multi-tab-prefix-cls} { 13 | margin: -23px -24px 24px -24px; 14 | background: #fff; 15 | } 16 | 17 | .topmenu .@{multi-tab-wrapper-prefix-cls} { 18 | max-width: 1200px; 19 | margin: 0 auto; 20 | } 21 | 22 | .topmenu.content-width-Fluid .@{multi-tab-wrapper-prefix-cls} { 23 | max-width: 100%; 24 | margin: 0 auto; 25 | } 26 | -------------------------------------------------------------------------------- /frontend/src/components/NoticeIcon/index.js: -------------------------------------------------------------------------------- 1 | import NoticeIcon from './NoticeIcon' 2 | export default NoticeIcon 3 | -------------------------------------------------------------------------------- /frontend/src/components/NumberInfo/index.js: -------------------------------------------------------------------------------- 1 | import NumberInfo from './NumberInfo' 2 | 3 | export default NumberInfo 4 | -------------------------------------------------------------------------------- /frontend/src/components/NumberInfo/index.md: -------------------------------------------------------------------------------- 1 | # NumberInfo 数据文本 2 | 3 | 常用在数据卡片中,用于突出展示某个业务数据。 4 | 5 | 6 | 7 | 引用方式: 8 | 9 | ```javascript 10 | import NumberInfo from '@/components/NumberInfo' 11 | 12 | export default { 13 | components: { 14 | NumberInfo 15 | } 16 | } 17 | ``` 18 | 19 | 20 | 21 | ## 代码演示 [demo](https://pro.loacg.com/test/home) 22 | 23 | ```html 24 | 29 | ``` 30 | 31 | 32 | 33 | ## API 34 | 35 | 参数 | 说明 | 类型 | 默认值 36 | ----|------|-----|------ 37 | title | 标题 | ReactNode\|string | - 38 | subTitle | 子标题 | ReactNode\|string | - 39 | total | 总量 | ReactNode\|string | - 40 | subTotal | 子总量 | ReactNode\|string | - 41 | status | 增加状态 | 'up \| down' | - 42 | theme | 状态样式 | string | 'light' 43 | gap | 设置数字和描述之间的间距(像素)| number | 8 44 | -------------------------------------------------------------------------------- /frontend/src/components/Search/index.less: -------------------------------------------------------------------------------- 1 | @import "~ant-design-vue/es/style/themes/default"; 2 | 3 | .global-search-wrapper { 4 | position: fixed; 5 | top: 0; 6 | left: 0; 7 | right: 0; 8 | bottom: 0; 9 | z-index: @zindex-modal-mask; 10 | background: @modal-mask-bg; 11 | 12 | .global-search-box { 13 | position: absolute; 14 | top: 20%; 15 | left: 50%; 16 | width: 450px; 17 | transform: translate(-50%, -50%); 18 | 19 | .global-search-tips { 20 | color: @white; 21 | font-size: @font-size-lg; 22 | text-align: right; 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /frontend/src/components/SelectLang/index.less: -------------------------------------------------------------------------------- 1 | @import "~ant-design-vue/es/style/themes/default"; 2 | 3 | @header-menu-prefix-cls: ~'@{ant-prefix}-pro-header-menu'; 4 | @header-drop-down-prefix-cls: ~'@{ant-prefix}-pro-drop-down'; 5 | 6 | .@{header-menu-prefix-cls} { 7 | 8 | .anticon { 9 | margin-right: 8px; 10 | } 11 | .ant-dropdown-menu-item { 12 | min-width: 160px; 13 | } 14 | } 15 | 16 | .@{header-drop-down-prefix-cls} { 17 | 18 | line-height: @layout-header-height; 19 | vertical-align: top; 20 | cursor: pointer; 21 | 22 | > i { 23 | font-size: 16px !important; 24 | transform: none !important; 25 | 26 | svg { 27 | position: relative; 28 | top: -1px; 29 | } 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /frontend/src/components/SelectTime/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/components/SettingDrawer/SettingItem.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 24 | 25 | 39 | -------------------------------------------------------------------------------- /frontend/src/components/SettingDrawer/index.js: -------------------------------------------------------------------------------- 1 | import SettingDrawer from './SettingDrawer' 2 | export default SettingDrawer 3 | -------------------------------------------------------------------------------- /frontend/src/components/StandardFormRow/index.js: -------------------------------------------------------------------------------- 1 | import StandardFormRow from './StandardFormRow' 2 | 3 | export default StandardFormRow 4 | -------------------------------------------------------------------------------- /frontend/src/components/TextArea/style.less: -------------------------------------------------------------------------------- 1 | .ant-textarea-limit { 2 | position: relative; 3 | 4 | .limit { 5 | position: absolute; 6 | color: #909399; 7 | background: #fff; 8 | font-size: 12px; 9 | bottom: 5px; 10 | right: 10px; 11 | } 12 | } -------------------------------------------------------------------------------- /frontend/src/components/Trend/Trend.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 38 | 39 | 42 | -------------------------------------------------------------------------------- /frontend/src/components/Trend/index.js: -------------------------------------------------------------------------------- 1 | import Trend from './Trend.vue' 2 | 3 | export default Trend 4 | -------------------------------------------------------------------------------- /frontend/src/components/Trend/index.less: -------------------------------------------------------------------------------- 1 | @import "../index"; 2 | 3 | @trend-prefix-cls: ~"@{ant-pro-prefix}-trend"; 4 | 5 | .@{trend-prefix-cls} { 6 | display: inline-block; 7 | font-size: @font-size-base; 8 | line-height: 22px; 9 | 10 | .up, 11 | .down { 12 | margin-left: 4px; 13 | position: relative; 14 | top: 1px; 15 | 16 | i { 17 | font-size: 12px; 18 | transform: scale(0.83); 19 | } 20 | } 21 | 22 | .item-text { 23 | display: inline-block; 24 | margin-left: 8px; 25 | color: rgba(0,0,0,.85); 26 | } 27 | 28 | .up { 29 | color: @red-6; 30 | } 31 | .down { 32 | color: @green-6; 33 | top: -1px; 34 | } 35 | 36 | &.reverse-color .up { 37 | color: @green-6; 38 | } 39 | &.reverse-color .down { 40 | color: @red-6; 41 | } 42 | } -------------------------------------------------------------------------------- /frontend/src/components/Trend/index.md: -------------------------------------------------------------------------------- 1 | # Trend 趋势标记 2 | 3 | 趋势符号,标记上升和下降趋势。通常用绿色代表“好”,红色代表“不好”,股票涨跌场景除外。 4 | 5 | 6 | 7 | 引用方式: 8 | 9 | ```javascript 10 | import Trend from '@/components/Trend' 11 | 12 | export default { 13 | components: { 14 | Trend 15 | } 16 | } 17 | ``` 18 | 19 | 20 | 21 | ## 代码演示 [demo](https://pro.loacg.com/test/home) 22 | 23 | ```html 24 | 5% 25 | ``` 26 | 或 27 | ```html 28 | 29 | 工资 30 | 5% 31 | 32 | ``` 33 | 或 34 | ```html 35 | 5% 36 | ``` 37 | 38 | 39 | ## API 40 | 41 | | 参数 | 说明 | 类型 | 默认值 | 42 | |----------|------------------------------------------|-------------|-------| 43 | | flag | 上升下降标识:`up|down` | string | - | 44 | | reverseColor | 颜色反转 | Boolean | false | 45 | 46 | -------------------------------------------------------------------------------- /frontend/src/components/index.less: -------------------------------------------------------------------------------- 1 | @import "~ant-design-vue/lib/style/index"; 2 | 3 | // The prefix to use on all css classes from ant-pro. 4 | @ant-pro-prefix : ant-pro; 5 | @ant-global-sider-zindex : 106; 6 | @ant-global-header-zindex : 105; -------------------------------------------------------------------------------- /frontend/src/components/searchBox/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName -------------------------------------------------------------------------------- /frontend/src/components/searchBox/index.vue: -------------------------------------------------------------------------------- 1 | 8 | 23 | -------------------------------------------------------------------------------- /frontend/src/config/themeColor.js: -------------------------------------------------------------------------------- 1 | const themeColor = { 2 | 'primary-color': '#0ba360', 3 | // #0d9257, //primary-color按下之后的颜色 4 | 'table-header-bg': "#e6f6ef", 5 | 'table-row-hover-bg': "#f6fcfa", 6 | 'border-radius-base':'2px', 7 | } 8 | 9 | module.exports = themeColor -------------------------------------------------------------------------------- /frontend/src/core/icons.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Custom icon list 3 | * All icons are loaded here for easy management 4 | * @see https://vue.ant.design/components/icon/#Custom-Font-Icon 5 | * 6 | * 自定义图标加载表 7 | * 所有图标均从这里加载,方便管理 8 | */ 9 | import bxAnaalyse from '@/assets/icons/bx-analyse.svg?inline' // path to your '*.svg?inline' file. 10 | 11 | export { bxAnaalyse } 12 | -------------------------------------------------------------------------------- /frontend/src/core/use.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | // base library 4 | import Antd from 'ant-design-vue' 5 | import Viser from 'viser-vue' 6 | import VueCropper from 'vue-cropper' 7 | import 'ant-design-vue/dist/antd.less' 8 | 9 | // ext library 10 | import VueClipboard from 'vue-clipboard2' 11 | import MultiTab from '@/components/MultiTab' 12 | import PageLoading from '@/components/PageLoading' 13 | import PermissionHelper from '@/utils/helper/permission' 14 | // import '@/components/use' 15 | import './directives/action' 16 | 17 | VueClipboard.config.autoSetContainer = true 18 | 19 | Vue.use(Antd) 20 | Vue.use(Viser) 21 | Vue.use(MultiTab) 22 | Vue.use(PageLoading) 23 | Vue.use(VueClipboard) 24 | Vue.use(PermissionHelper) 25 | Vue.use(VueCropper) 26 | -------------------------------------------------------------------------------- /frontend/src/layouts/BlankLayout.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /frontend/src/layouts/PageView.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /frontend/src/layouts/RouteView.vue: -------------------------------------------------------------------------------- 1 | 33 | -------------------------------------------------------------------------------- /frontend/src/layouts/index.js: -------------------------------------------------------------------------------- 1 | import UserLayout from './UserLayout' 2 | import BlankLayout from './BlankLayout' 3 | import BasicLayout from './BasicLayout' 4 | import RouteView from './RouteView' 5 | import PageView from './PageView' 6 | 7 | export { UserLayout, BasicLayout, BlankLayout, RouteView, PageView } 8 | -------------------------------------------------------------------------------- /frontend/src/locales/lang/zh-CN.js: -------------------------------------------------------------------------------- 1 | import antd from 'ant-design-vue/es/locale-provider/zh_CN' 2 | import momentCN from 'moment/locale/zh-cn' 3 | 4 | const components = { 5 | antLocale: antd, 6 | momentName: 'zh-cn', 7 | momentLocale: momentCN 8 | } 9 | 10 | const locale = { 11 | 'message': '-', 12 | 'menu.home': '主页', 13 | 'menu.dashboard': '仪表盘', 14 | 'menu.dashboard.analysis': '分析页', 15 | 'menu.dashboard.monitor': '监控页', 16 | 'menu.dashboard.workplace': '工作台' 17 | } 18 | 19 | export default { 20 | ...components, 21 | ...locale 22 | } 23 | -------------------------------------------------------------------------------- /frontend/src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import { constantRouterMap, asyncRouterMap, detailRouterMap } from '@/config/router.config' 4 | 5 | Vue.use(Router) 6 | 7 | export default new Router({ 8 | mode: 'hash', 9 | scrollBehavior: () => ({ y: 0 }), 10 | routes: constantRouterMap, 11 | // routes: constantRouterMap.concat(asyncRouterMap), // -- 若不是服务器返回的菜单 可改为.concat(asyncRouterMap) 注意detailRouterMap要放在父级路由下 12 | 13 | }) -------------------------------------------------------------------------------- /frontend/src/store/app-mixin.js: -------------------------------------------------------------------------------- 1 | import { mapState } from 'vuex' 2 | 3 | const baseMixin = { 4 | computed: { 5 | ...mapState({ 6 | layout: state => state.app.layout, 7 | navTheme: state => state.app.theme, 8 | primaryColor: state => state.app.color, 9 | colorWeak: state => state.app.weak, 10 | fixedHeader: state => state.app.fixedHeader, 11 | fixedSidebar: state => state.app.fixedSidebar, 12 | contentWidth: state => state.app.contentWidth, 13 | autoHideHeader: state => state.app.autoHideHeader, 14 | 15 | isMobile: state => state.app.isMobile, 16 | sideCollapsed: state => state.app.sideCollapsed, 17 | multiTab: state => state.app.multiTab 18 | }), 19 | isTopMenu () { 20 | return this.layout === 'topmenu' 21 | } 22 | }, 23 | methods: { 24 | isSideMenu () { 25 | return !this.isTopMenu 26 | } 27 | } 28 | } 29 | 30 | export { 31 | baseMixin 32 | } 33 | -------------------------------------------------------------------------------- /frontend/src/store/device-mixin.js: -------------------------------------------------------------------------------- 1 | import { mapState } from 'vuex' 2 | 3 | const deviceMixin = { 4 | computed: { 5 | ...mapState({ 6 | isMobile: state => state.app.isMobile 7 | }) 8 | } 9 | } 10 | 11 | export { deviceMixin } 12 | -------------------------------------------------------------------------------- /frontend/src/store/getters.js: -------------------------------------------------------------------------------- 1 | const getters = { 2 | isMobile: state => state.app.isMobile, 3 | lang: state => state.app.lang, 4 | theme: state => state.app.theme, 5 | color: state => state.app.color, 6 | token: state => state.user.token, 7 | avatar: state => state.user.avatar, 8 | nickname: state => state.user.name, 9 | welcome: state => state.user.welcome, 10 | roles: state => state.user.roles, 11 | userInfo: state => state.user.info, 12 | addRouters: state => state.permission.addRouters, 13 | multiTab: state => state.app.multiTab 14 | } 15 | 16 | export default getters 17 | -------------------------------------------------------------------------------- /frontend/src/store/i18n-mixin.js: -------------------------------------------------------------------------------- 1 | import { mapState } from 'vuex' 2 | 3 | const i18nMixin = { 4 | computed: { 5 | ...mapState({ 6 | currentLang: state => state.app.lang 7 | }) 8 | }, 9 | methods: { 10 | setLang (lang) { 11 | this.$store.dispatch('setLang', lang) 12 | } 13 | } 14 | } 15 | 16 | export default i18nMixin 17 | -------------------------------------------------------------------------------- /frontend/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | 4 | import app from './modules/app' 5 | import user from './modules/user' 6 | import btnAuth from './modules/btnAuth' 7 | // import permission from './modules/permission' 8 | 9 | import permission from './modules/async-router' //后端返回的菜单 10 | import getters from './getters' 11 | 12 | Vue.use(Vuex) 13 | 14 | export default new Vuex.Store({ 15 | modules: { 16 | app, 17 | user, 18 | permission, 19 | btnAuth, 20 | }, 21 | state: { 22 | 23 | }, 24 | mutations: { 25 | 26 | }, 27 | actions: { 28 | 29 | }, 30 | getters 31 | }) -------------------------------------------------------------------------------- /frontend/src/store/modules/async-router.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 向后端请求用户的菜单,动态生成路由 3 | */ 4 | import { constantRouterMap } from '@/config/router.config' 5 | import { generatorDynamicRouter } from '@/router/generator-routers' 6 | 7 | const permission = { 8 | state: { 9 | routers: constantRouterMap, 10 | addRouters: [] 11 | }, 12 | mutations: { 13 | SET_ROUTERS: (state, routers) => { 14 | state.addRouters = routers 15 | state.routers = constantRouterMap.concat(routers) 16 | } 17 | }, 18 | actions: { 19 | GenerateRoutes({ commit }) { 20 | return new Promise(resolve => { 21 | generatorDynamicRouter().then(routers => { 22 | commit('SET_ROUTERS', routers) 23 | resolve() 24 | }) 25 | }) 26 | } 27 | } 28 | } 29 | 30 | export default permission -------------------------------------------------------------------------------- /frontend/src/store/modules/btnAuth.js: -------------------------------------------------------------------------------- 1 | const btnAuth = { 2 | state: { 3 | btnAuth: {}, 4 | }, 5 | mutations: { 6 | SET_BTNAUTH: (state, data) => { 7 | state.btnAuth = data 8 | } 9 | }, 10 | actions: { 11 | GenerateBtnAuth({ commit },data) { 12 | commit('SET_BTNAUTH', data) 13 | } 14 | } 15 | } 16 | 17 | export default btnAuth 18 | -------------------------------------------------------------------------------- /frontend/src/store/mutation-types.js: -------------------------------------------------------------------------------- 1 | export const ACCESS_TOKEN = 'Access-Token' 2 | 3 | export const SIDEBAR_TYPE = 'sidebar_type' 4 | export const TOGGLE_MOBILE_TYPE = 'is_mobile' 5 | export const TOGGLE_NAV_THEME = 'nav_theme' 6 | export const TOGGLE_LAYOUT = 'layout' 7 | export const TOGGLE_FIXED_HEADER = 'fixed_header' 8 | export const TOGGLE_FIXED_SIDEBAR = 'fixed_sidebar' 9 | export const TOGGLE_CONTENT_WIDTH = 'content_width' 10 | export const TOGGLE_HIDE_HEADER = 'auto_hide_header' 11 | export const TOGGLE_COLOR = 'color' 12 | export const TOGGLE_WEAK = 'weak' 13 | export const TOGGLE_MULTI_TAB = 'multi_tab' 14 | export const APP_LANGUAGE = 'app_language' 15 | 16 | export const CONTENT_WIDTH_TYPE = { 17 | Fluid: 'Fluid', 18 | Fixed: 'Fixed' 19 | } 20 | 21 | export const NAV_THEME = { 22 | LIGHT: 'light', 23 | DARK: 'dark' 24 | } 25 | -------------------------------------------------------------------------------- /frontend/src/utils/axios.js: -------------------------------------------------------------------------------- 1 | const VueAxios = { 2 | vm: {}, 3 | // eslint-disable-next-line no-unused-vars 4 | install (Vue, instance) { 5 | if (this.installed) { 6 | return 7 | } 8 | this.installed = true 9 | 10 | if (!instance) { 11 | // eslint-disable-next-line no-console 12 | console.error('You have to install axios') 13 | return 14 | } 15 | 16 | Vue.axios = instance 17 | 18 | Object.defineProperties(Vue.prototype, { 19 | axios: { 20 | get: function get () { 21 | return instance 22 | } 23 | }, 24 | $http: { 25 | get: function get () { 26 | return instance 27 | } 28 | } 29 | }) 30 | } 31 | } 32 | 33 | export { 34 | VueAxios 35 | } 36 | -------------------------------------------------------------------------------- /frontend/src/utils/domUtil.js: -------------------------------------------------------------------------------- 1 | import config from '@/config/defaultSettings' 2 | 3 | export const setDocumentTitle = function (title) { 4 | document.title = title 5 | const ua = navigator.userAgent 6 | // eslint-disable-next-line 7 | const regex = /\bMicroMessenger\/([\d\.]+)/ 8 | if (regex.test(ua) && /ip(hone|od|ad)/i.test(ua)) { 9 | const i = document.createElement('iframe') 10 | i.src = '/favicon.ico' 11 | i.style.display = 'none' 12 | i.onload = function () { 13 | setTimeout(function () { 14 | i.remove() 15 | }, 9) 16 | } 17 | document.body.appendChild(i) 18 | } 19 | } 20 | 21 | export const domTitle = config.title 22 | -------------------------------------------------------------------------------- /frontend/src/utils/filter.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import moment from 'moment' 3 | import 'moment/locale/zh-cn' 4 | moment.locale('zh-cn') 5 | 6 | Vue.filter('NumberFormat', function (value) { 7 | if (!value) { 8 | return '0' 9 | } 10 | const intPartFormat = value.toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,') // 将整数部分逢三一断 11 | return intPartFormat 12 | }) 13 | 14 | Vue.filter('dayjs', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { 15 | return moment(dataStr).format(pattern) 16 | }) 17 | 18 | Vue.filter('moment', function (dataStr, pattern = 'YYYY-MM-DD HH:mm:ss') { 19 | return moment(dataStr).format(pattern) 20 | }) 21 | -------------------------------------------------------------------------------- /frontend/src/utils/pageAuth.js: -------------------------------------------------------------------------------- 1 | import router from '@/router' 2 | import { getPageAuth as getPageAuthApi } from '@/api/page-auth' 3 | 4 | const replaceRouter = () => { 5 | router.push({ name: 'noAuth' }) 6 | } 7 | 8 | export const getPageAuth = (vm, action_id = "") => { 9 | return new Promise((resolve, reject) => { 10 | setTimeout(() => { 11 | vm.$loading.show() 12 | }, 0); 13 | getPageAuthApi({ action_id }).then(res => { 14 | if (!res.data) replaceRouter() 15 | return resolve(res.data) 16 | }).catch(() => { 17 | replaceRouter() 18 | return resolve(false) 19 | }).finally(() => { 20 | setTimeout(() => { 21 | vm.$loading.hide() 22 | }, 0); 23 | }) 24 | }) 25 | } -------------------------------------------------------------------------------- /frontend/src/utils/permissions.js: -------------------------------------------------------------------------------- 1 | export function actionToObject (json) { 2 | try { 3 | return JSON.parse(json) 4 | } catch (e) { 5 | console.log('err', e.message) 6 | } 7 | return [] 8 | } 9 | -------------------------------------------------------------------------------- /frontend/src/utils/routeConvert.js: -------------------------------------------------------------------------------- 1 | import cloneDeep from 'lodash.clonedeep' 2 | 3 | export function convertRoutes (nodes) { 4 | if (!nodes) return null 5 | 6 | nodes = cloneDeep(nodes) 7 | 8 | let queue = Array.isArray(nodes) ? nodes.concat() : [nodes] 9 | 10 | while (queue.length) { 11 | const levelSize = queue.length 12 | 13 | for (let i = 0; i < levelSize; i++) { 14 | const node = queue.shift() 15 | 16 | if (!node.children || !node.children.length) continue 17 | 18 | node.children.forEach(child => { 19 | // 转化相对路径 20 | if (child.path[0] !== '/' && !child.path.startsWith('http')) { 21 | child.path = node.path.replace(/(\w*)[/]*$/, `$1/${child.path}`) 22 | } 23 | }) 24 | 25 | queue = queue.concat(node.children) 26 | } 27 | } 28 | 29 | return nodes 30 | } 31 | -------------------------------------------------------------------------------- /frontend/src/utils/screenArr.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { width: 800, height: 600, key: 1 }, 3 | { width: 1024, height: 768, key: 2 }, 4 | { width: 1280, height: 720, key: 3 }, 5 | { width: 1280, height: 800, key: 4 }, 6 | { width: 1280, height: 1024, key: 5 }, 7 | { width: 1366, height: 768, key: 6 }, 8 | { width: 1440, height: 900, key: 7 }, 9 | { width: 1920, height: 1080, key: 8 }, 10 | { width: 1920, height: 1200, key: 9 }, 11 | { width: 2160, height: 1440, key: 10 }, 12 | { width: 2560, height: 1600, key: 11 }, 13 | { width: 2880, height: 1800, key: 12 }, 14 | ] -------------------------------------------------------------------------------- /frontend/src/utils/screenLog.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | export const printANSI = () => { 3 | console.warn('[app]: app is opend') 4 | } 5 | -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/commandPolicy/components/CommandGroup/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/commandPolicy/components/CommandList/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/commandPolicy/components/PolicyList/components/components/Step1/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/commandPolicy/components/PolicyList/components/components/Step2/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/commandPolicy/components/PolicyList/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/commandPolicy/components/PolicyList/policyListInfo/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/commandPolicy/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/visitPolicy/components/components/Step2/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/visitPolicy/components/components/Step3/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/visitPolicy/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/accessPolicy/visitPolicy/visitPolicyInfo/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue' 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/components/AuthModal/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue'; 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/components/ContentHeader/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue'; 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/exception/403.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | 38 | -------------------------------------------------------------------------------- /frontend/src/views/exception/404.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 19 | 20 | 38 | -------------------------------------------------------------------------------- /frontend/src/views/exception/500.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /frontend/src/views/setting/userManage/components/Group/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue'; 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/setting/userManage/components/User/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue'; 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/src/views/setting/userManage/index.js: -------------------------------------------------------------------------------- 1 | import moduleName from './index.vue'; 2 | export default moduleName; -------------------------------------------------------------------------------- /frontend/tests/unit/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | env: { 3 | jest: true 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /index/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/index/__init__.py -------------------------------------------------------------------------------- /index/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /index/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class IndexConfig(AppConfig): 5 | name = 'index' 6 | -------------------------------------------------------------------------------- /index/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/index/migrations/__init__.py -------------------------------------------------------------------------------- /index/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /index/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | 5 | -------------------------------------------------------------------------------- /index/urls.py: -------------------------------------------------------------------------------- 1 | from django.urls import path 2 | from index.views import * 3 | 4 | urlpatterns = [ 5 | path("", vue), 6 | ] -------------------------------------------------------------------------------- /index/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | from blueapps.account.decorators import login_exempt_v2 5 | 6 | 7 | @login_exempt_v2 8 | def vue(request): 9 | return render(request, 'index.html') 10 | # SITE_URL = "http://127.0.0.1:8000" 11 | # return render(request, 'index.html', {"SITE_URL": SITE_URL}) 12 | -------------------------------------------------------------------------------- /install/bastion_esb/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/install/bastion_esb/__init__.py -------------------------------------------------------------------------------- /install/bastion_esb/bastion/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/install/bastion_esb/bastion/__init__.py -------------------------------------------------------------------------------- /install/bastion_esb/bastion/toolkit/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/install/bastion_esb/bastion/toolkit/__init__.py -------------------------------------------------------------------------------- /install/bastion_esb/bastion/toolkit/configs.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from esb.utils import SmartHost 3 | 4 | 5 | # 系统名的小写形式,与系统包名保持一致 6 | SYSTEM_NAME = 'BASTION' 7 | 8 | host = SmartHost( 9 | # 需要填入系统正式环境的域名地址 10 | host_prod='paas.bksingle.com', 11 | ) 12 | -------------------------------------------------------------------------------- /install/bastion_esb/bastion/toolkit/tools.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | -------------------------------------------------------------------------------- /install/bastion_esb/esb_doc/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/install/bastion_esb/esb_doc/__init__.py -------------------------------------------------------------------------------- /install/init_iam/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/install/init_iam/__init__.py -------------------------------------------------------------------------------- /install/install.config.example: -------------------------------------------------------------------------------- 1 | # config file for opsany bastion -- https://www.opsany.com/ 2 | # ================================================= 3 | 4 | # Install Path 5 | INSTALL_PATH="/data/bkce/opsany-bastion" 6 | 7 | # Paas Domain 8 | PAAS_DOMAIN_NAME="ce.bktencent.com" 9 | BASTION_APP_TOKEN=b7d83351-0f0a-4918-adaa-a4860bc2fced 10 | 11 | # For Docker Hub 12 | #PAAS_DOCKER_REG="opsany" 13 | 14 | #For Aliyun 15 | PAAS_DOCKER_REG="registry.cn-beijing.aliyuncs.com/opsany" 16 | #PAAS_DOCKER_REG="registry-vpc.cn-beijing.aliyuncs.com/opsany" 17 | 18 | # PAAS Config 19 | UPLOAD_PATH="${INSTALL_PATH}/uploads" 20 | 21 | # MySQL 22 | MYSQL_HOST=mysql-default.service.consul 23 | MYSQL_PORT=3306 24 | MYSQL_PASSWORD=OpsAny@2020 25 | MYSQL_BASTION_PASSWORD=OpsAny@2020 26 | 27 | # Redis 28 | REDIS_HOST=REDIS_HOST=redis.service.consul 29 | REDIS_PORT=6379 30 | REDIS_PASSWORD=OpsAny@2020 31 | 32 | # Websocket 33 | WEBSOCKET_GUACD_HOST="192.168.56.11" 34 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /opsany-bastion.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/opsany-bastion.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "opsany-bastion", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 工程预装模块 3 | # 需要额外的python包,可直接在文件后面添加 4 | # 请确保指定的包和版本号,可通过pip安装 5 | 6 | # blueapps requirement 7 | Django==2.2.6 8 | mysqlclient==1.4.4 9 | MarkupSafe==1.1 10 | Mako==1.0.6 11 | requests==2.25.0 12 | urllib3==1.26.2 13 | redis==2.10.6 14 | celery==3.1.25 15 | django-celery==3.2.1 16 | python-json-logger==0.1.7 17 | whitenoise==3.3.0 18 | six==1.11.0 19 | uwsgi==2.0.19.1 20 | #daphne==2.2.1 21 | 22 | #v2 requirement 23 | httplib2==0.9.1 24 | 25 | # terminal 26 | bcrypt==3.2.0 27 | pycrypto==2.6.1 28 | cryptography==3.3.1 29 | django-cors-headers==3.2.1 30 | paramiko==2.7.2 31 | #channels==2.1.4 32 | #channels-redis==2.3.1 33 | django_redis==4.11.0 34 | gunicorn==19.9.0 35 | gevent==21.1.2 36 | XlsxWriter==1.2.8 37 | xlrd==1.2.0 38 | bk-iam==1.1.20 39 | #uvicorn==0.11.8 40 | -------------------------------------------------------------------------------- /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.6.7 2 | -------------------------------------------------------------------------------- /static/avatar2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/avatar2.jpg -------------------------------------------------------------------------------- /static/css/app.019e6117.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.019e6117.css.gz -------------------------------------------------------------------------------- /static/css/app.1fecc41d.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.1fecc41d.css.gz -------------------------------------------------------------------------------- /static/css/app.285c40bb.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.285c40bb.css.gz -------------------------------------------------------------------------------- /static/css/app.37081288.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.37081288.css.gz -------------------------------------------------------------------------------- /static/css/app.5d7df5aa.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.5d7df5aa.css.gz -------------------------------------------------------------------------------- /static/css/app.61a78f4d.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.61a78f4d.css.gz -------------------------------------------------------------------------------- /static/css/app.98ed4a23.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.98ed4a23.css.gz -------------------------------------------------------------------------------- /static/css/app.d50e69db.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.d50e69db.css.gz -------------------------------------------------------------------------------- /static/css/app.ea92f5a9.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.ea92f5a9.css.gz -------------------------------------------------------------------------------- /static/css/app.ebf33190.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/app.ebf33190.css.gz -------------------------------------------------------------------------------- /static/css/asciinema-player.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/asciinema-player.css.gz -------------------------------------------------------------------------------- /static/css/chunk-0b17f900.55242fa7.css: -------------------------------------------------------------------------------- 1 | h3[data-v-007d7773]{font-weight:1000;font-size:14px}footer[data-v-007d7773]{position:absolute;bottom:0;z-index:3;background:#fff;width:100%;left:0;padding:15px;border-top:1px solid #e8e8e8}.drawer_title[data-v-007d7773]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;font-size:1.17em}[data-v-007d7773] .ant-alert{padding:1px 30px 2px 37px}[data-v-007d7773] .ant-alert-icon{top:5.5px}[data-v-007d7773] .ant-alert-close-icon{top:1px}.top_search[data-v-717e8236]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding-bottom:12px}.table_cell[data-v-717e8236]{margin:-10px}.table_cell p[data-v-717e8236]{margin:0;padding:10px;height:42px}.table_cell p[data-v-717e8236]:nth-of-type(2){border-top:1px solid #e8e8e8} -------------------------------------------------------------------------------- /static/css/chunk-0bfd1d3b.8cf73e6f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-0bfd1d3b.8cf73e6f.css.gz -------------------------------------------------------------------------------- /static/css/chunk-0d9f612a.d3437ec2.css: -------------------------------------------------------------------------------- 1 | .center[data-v-484260f7]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-484260f7]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-484260f7]{font-size:24px;color:#333} -------------------------------------------------------------------------------- /static/css/chunk-12d51ddd.1ad558e5.css: -------------------------------------------------------------------------------- 1 | footer[data-v-0de4ef22]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:2}.password_main[data-v-f2a41fb8]{background:#fff}.search_box[data-v-f2a41fb8]{height:52px} -------------------------------------------------------------------------------- /static/css/chunk-1a0b2b5c.a8a68973.css: -------------------------------------------------------------------------------- 1 | footer[data-v-0bf39215]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:2}.password_main[data-v-25027e0f]{background:#fff}.search_box[data-v-25027e0f]{height:52px} -------------------------------------------------------------------------------- /static/css/chunk-1a7b3b92.14ebf83b.css: -------------------------------------------------------------------------------- 1 | .content[data-v-73c487fc]{padding-top:80px;margin:0 auto;text-align:center}.content img[data-v-73c487fc]{width:340px;height:340px}.content div[data-v-73c487fc]{padding-left:50px} -------------------------------------------------------------------------------- /static/css/chunk-2bfdc242.e06f2390.css: -------------------------------------------------------------------------------- 1 | .auditHistory_main[data-v-0247b3e4]{background:#fff}.auditHistory_main .search_box[data-v-0247b3e4]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-2df1b604.f3367566.css: -------------------------------------------------------------------------------- 1 | [data-v-21c9ba51] .ant-modal{margin:0;padding:0}[data-v-21c9ba51] .ant-modal /deep/ .ant-modal-body{padding:0}#player_box[data-v-21c9ba51]{width:100%;height:calc(100vh - 108px);z-index:0;overflow-y:scroll;position:relative;background:#000}#player_box>div[data-v-21c9ba51]{width:100%;height:calc(100vh - 108px);margin:0 auto}.icons[data-v-21c9ba51]{font-size:100px;opacity:0;color:#0ba360;position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:all .2s;transition:all .2s}.history_main[data-v-47ee15e6]{background:#fff}.history_main .search_box[data-v-47ee15e6]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-31241ef2.eeaeef32.css: -------------------------------------------------------------------------------- 1 | footer[data-v-2bfcd38d]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:2}.group_main[data-v-5053d367]{background:#fff}.search_box[data-v-5053d367]{height:52px} -------------------------------------------------------------------------------- /static/css/chunk-3168254b.f9920608.css: -------------------------------------------------------------------------------- 1 | [data-v-68d08ea0] .ant-modal{margin:0;padding:0}[data-v-68d08ea0] .ant-modal /deep/ .ant-modal-body{padding:0}#player_box[data-v-68d08ea0]{width:100%;height:calc(100vh - 108px);z-index:0;overflow-y:scroll;position:relative;background:#000}#player_box>div[data-v-68d08ea0]{width:100%;height:calc(100vh - 108px);margin:0 auto}.icons[data-v-68d08ea0]{font-size:100px;opacity:0;color:#0ba360;position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);-webkit-transition:all .2s;transition:all .2s}.history_main[data-v-402dc2d7]{background:#fff}.history_main .search_box[data-v-402dc2d7]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-33e99cce.16644974.css: -------------------------------------------------------------------------------- 1 | .block[data-v-4880a658]{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.block img[data-v-4880a658]{width:360px;height:360px}.block .block_right[data-v-4880a658]{margin:0 0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.block .block_right p[data-v-4880a658]{margin:0 0 30px 0;color:#333;font-size:24px} -------------------------------------------------------------------------------- /static/css/chunk-430c3000.b4a69e88.css: -------------------------------------------------------------------------------- 1 | .content[data-v-24dd4a8e]{padding-top:80px;margin:0 auto;text-align:center}.content img[data-v-24dd4a8e]{width:340px;height:340px}.content div[data-v-24dd4a8e]{padding-left:50px} -------------------------------------------------------------------------------- /static/css/chunk-44658e0c.bf712af1.css: -------------------------------------------------------------------------------- 1 | .auditHistory_main[data-v-f4191668]{background:#fff}.auditHistory_main .search_box[data-v-f4191668]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-48659421.4142f3e4.css: -------------------------------------------------------------------------------- 1 | footer[data-v-0d9b3e0d]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:2}.password_main[data-v-3607fda5]{background:#fff}.search_box[data-v-3607fda5]{height:52px} -------------------------------------------------------------------------------- /static/css/chunk-50dd65dd.738aae87.css: -------------------------------------------------------------------------------- 1 | .operationLog_main[data-v-10e044f8]{background:#fff}.operationLog_main .search_box[data-v-10e044f8]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-55cec527.8cf73e6f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-55cec527.8cf73e6f.css.gz -------------------------------------------------------------------------------- /static/css/chunk-5cc48762.430cebac.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-5cc48762.430cebac.css.gz -------------------------------------------------------------------------------- /static/css/chunk-63f37384.8cf73e6f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-63f37384.8cf73e6f.css.gz -------------------------------------------------------------------------------- /static/css/chunk-64c39154.9cb2bf59.css: -------------------------------------------------------------------------------- 1 | .online_main[data-v-77ef36cc]{background:#fff}.online_main .search_box[data-v-77ef36cc]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-66929e3b.34313ec6.css: -------------------------------------------------------------------------------- 1 | h3[data-v-0691ba2e]{font-weight:1000;font-size:14px}footer[data-v-0691ba2e]{position:absolute;bottom:0;z-index:3;background:#fff;width:100%;left:0;padding:15px;border-top:1px solid #e8e8e8}.drawer_title[data-v-0691ba2e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;margin:0;font-size:1.17em}[data-v-0691ba2e] .ant-alert{padding:1px 30px 2px 37px}[data-v-0691ba2e] .ant-alert-icon{top:5.5px}[data-v-0691ba2e] .ant-alert-close-icon{top:1px}.top_search[data-v-69529706]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding-bottom:12px}.table_cell[data-v-69529706]{margin:-10px}.table_cell p[data-v-69529706]{margin:0;padding:10px;height:42px}.table_cell p[data-v-69529706]:nth-of-type(2){border-top:1px solid #e8e8e8} -------------------------------------------------------------------------------- /static/css/chunk-68d3718b.b7557ece.css: -------------------------------------------------------------------------------- 1 | .operationLog_main[data-v-c2c4bc90]{background:#fff}.operationLog_main .search_box[data-v-c2c4bc90]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-6938f9b8.be2db2f8.css: -------------------------------------------------------------------------------- 1 | .main[data-v-f1c4ca3e]{background:#fff}.search_box[data-v-f1c4ca3e]{margin:0 0 20px 0}.content[data-v-f1c4ca3e]{padding:20px}.content .infomation[data-v-f1c4ca3e]{margin:0 0 20px 0}.content .infomation .info[data-v-f1c4ca3e]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.content .infomation .info span[data-v-f1c4ca3e]{-webkit-box-flex:0px;-ms-flex:0px 1 1;flex:0px 1 1} -------------------------------------------------------------------------------- /static/css/chunk-6af86718.46a17afc.css: -------------------------------------------------------------------------------- 1 | .block[data-v-0ca2af12]{display:-webkit-box;display:-ms-flexbox;display:flex;position:absolute;top:50%;left:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.block img[data-v-0ca2af12]{width:360px;height:360px}.block .block_right[data-v-0ca2af12]{margin:0 0 0 100px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.block .block_right p[data-v-0ca2af12]{margin:0 0 30px 0;color:#333;font-size:24px} -------------------------------------------------------------------------------- /static/css/chunk-6c510798.99901381.css: -------------------------------------------------------------------------------- 1 | .online_main[data-v-363a394c]{background:#fff}.online_main .search_box[data-v-363a394c]{height:60px} -------------------------------------------------------------------------------- /static/css/chunk-740dd5c8.8cf73e6f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-740dd5c8.8cf73e6f.css.gz -------------------------------------------------------------------------------- /static/css/chunk-78db90a6.846c0066.css: -------------------------------------------------------------------------------- 1 | .time_item[data-v-76785c1b] .ant-form-item-control{line-height:normal!important;margin-top:10px}.bottom_btns[data-v-57270630]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:1}.top_search[data-v-764a3795]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding-bottom:10px}.search_box[data-v-764a3795]{margin-bottom:10px} -------------------------------------------------------------------------------- /static/css/chunk-795bb688.6a1e5818.css: -------------------------------------------------------------------------------- 1 | footer[data-v-5381b1ac]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:2}.password_main[data-v-4dcf551b]{background:#fff}.search_box[data-v-4dcf551b]{height:52px} -------------------------------------------------------------------------------- /static/css/chunk-7b6dfdbc.cd3459f2.css: -------------------------------------------------------------------------------- 1 | .center[data-v-59389742]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-59389742]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-59389742]{font-size:24px;color:#333} -------------------------------------------------------------------------------- /static/css/chunk-9aefbc4c.d0619e25.css: -------------------------------------------------------------------------------- 1 | footer[data-v-84d02bce]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:2}.group_main[data-v-aa827eb0]{background:#fff}.search_box[data-v-aa827eb0]{height:52px} -------------------------------------------------------------------------------- /static/css/chunk-c01e793a.385433c7.css: -------------------------------------------------------------------------------- 1 | .time_item[data-v-da59ef10] .ant-form-item-control{line-height:normal!important;margin-top:10px}.bottom_btns[data-v-524c2771]{position:absolute;right:0;bottom:0;width:100%;border-top:1px solid #e9e9e9;padding:10px 16px;background:#fff;text-align:right;z-index:1}.top_search[data-v-2f222dea]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding-bottom:10px}.search_box[data-v-2f222dea]{margin-bottom:10px} -------------------------------------------------------------------------------- /static/css/chunk-d5dec398.8cf73e6f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-d5dec398.8cf73e6f.css.gz -------------------------------------------------------------------------------- /static/css/chunk-d68bb5ce.055f4115.css: -------------------------------------------------------------------------------- 1 | .main[data-v-61634e02]{background:#fff}.search_box[data-v-61634e02]{margin:0 0 20px 0}.content[data-v-61634e02]{padding:20px}.content .infomation[data-v-61634e02]{margin:0 0 20px 0}.content .infomation .info[data-v-61634e02]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.content .infomation .info span[data-v-61634e02]{-webkit-box-flex:0px;-ms-flex:0px 1 1;flex:0px 1 1} -------------------------------------------------------------------------------- /static/css/chunk-e58265d8.8cf73e6f.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-e58265d8.8cf73e6f.css.gz -------------------------------------------------------------------------------- /static/css/chunk-vendors.995993b1.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-vendors.995993b1.css.gz -------------------------------------------------------------------------------- /static/css/chunk-vendors.a7631610.css.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/css/chunk-vendors.a7631610.css.gz -------------------------------------------------------------------------------- /static/css/error.135d66d6.css: -------------------------------------------------------------------------------- 1 | .center[data-v-59389742]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-59389742]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-59389742]{font-size:24px;color:#333}.center[data-v-0c49e004]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-0c49e004]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-0c49e004]{font-size:24px;color:#333} -------------------------------------------------------------------------------- /static/css/error.1c40ccb7.css: -------------------------------------------------------------------------------- 1 | .center[data-v-484260f7]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-484260f7]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-484260f7]{font-size:24px;color:#333}.center[data-v-3bc4021a]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-3bc4021a]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-3bc4021a]{font-size:24px;color:#333} -------------------------------------------------------------------------------- /static/css/fail.b63ee882.css: -------------------------------------------------------------------------------- 1 | .center[data-v-0c49e004]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-0c49e004]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-0c49e004]{font-size:24px;color:#333} -------------------------------------------------------------------------------- /static/css/fail.fdb673e0.css: -------------------------------------------------------------------------------- 1 | .center[data-v-3bc4021a]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%}img[data-v-3bc4021a]{width:360px;height:360px;margin:-100px 0 50px 0}p[data-v-3bc4021a]{font-size:24px;color:#333} -------------------------------------------------------------------------------- /static/img/authorization_expired.3d95508f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/img/authorization_expired.3d95508f.png -------------------------------------------------------------------------------- /static/img/function_not_authorized.5a8ed9c3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/img/function_not_authorized.5a8ed9c3.png -------------------------------------------------------------------------------- /static/img/no-auth.cea6aff4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/img/no-auth.cea6aff4.png -------------------------------------------------------------------------------- /static/img/not_authorized.7d30926b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/img/not_authorized.7d30926b.png -------------------------------------------------------------------------------- /static/img/ops-logo.d35433bb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/img/ops-logo.d35433bb.png -------------------------------------------------------------------------------- /static/img/platform_not_authorized.8e05bf34.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/img/platform_not_authorized.8e05bf34.png -------------------------------------------------------------------------------- /static/js/app.03462b4a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.03462b4a.js.gz -------------------------------------------------------------------------------- /static/js/app.0d467df0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.0d467df0.js.gz -------------------------------------------------------------------------------- /static/js/app.0f167e7a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.0f167e7a.js.gz -------------------------------------------------------------------------------- /static/js/app.0fb5feb2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.0fb5feb2.js.gz -------------------------------------------------------------------------------- /static/js/app.0fc4bc66.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.0fc4bc66.js.gz -------------------------------------------------------------------------------- /static/js/app.16090c8f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.16090c8f.js.gz -------------------------------------------------------------------------------- /static/js/app.1de42670.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.1de42670.js.gz -------------------------------------------------------------------------------- /static/js/app.246f93c4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.246f93c4.js.gz -------------------------------------------------------------------------------- /static/js/app.253bc463.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.253bc463.js.gz -------------------------------------------------------------------------------- /static/js/app.27453d83.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.27453d83.js.gz -------------------------------------------------------------------------------- /static/js/app.27fcddae.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.27fcddae.js.gz -------------------------------------------------------------------------------- /static/js/app.2b9a7041.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.2b9a7041.js.gz -------------------------------------------------------------------------------- /static/js/app.326114e0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.326114e0.js.gz -------------------------------------------------------------------------------- /static/js/app.331e4af2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.331e4af2.js.gz -------------------------------------------------------------------------------- /static/js/app.401a20c7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.401a20c7.js.gz -------------------------------------------------------------------------------- /static/js/app.43babfe2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.43babfe2.js.gz -------------------------------------------------------------------------------- /static/js/app.481b93eb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.481b93eb.js.gz -------------------------------------------------------------------------------- /static/js/app.4c0e6a2e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.4c0e6a2e.js.gz -------------------------------------------------------------------------------- /static/js/app.58e71f87.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.58e71f87.js.gz -------------------------------------------------------------------------------- /static/js/app.68563477.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.68563477.js.gz -------------------------------------------------------------------------------- /static/js/app.6b6e82cc.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.6b6e82cc.js.gz -------------------------------------------------------------------------------- /static/js/app.6e59fdf3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.6e59fdf3.js.gz -------------------------------------------------------------------------------- /static/js/app.73ee0b83.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.73ee0b83.js.gz -------------------------------------------------------------------------------- /static/js/app.75eb4fe8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.75eb4fe8.js.gz -------------------------------------------------------------------------------- /static/js/app.7aa77404.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.7aa77404.js.gz -------------------------------------------------------------------------------- /static/js/app.7e774167.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.7e774167.js.gz -------------------------------------------------------------------------------- /static/js/app.7f75ad31.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.7f75ad31.js.gz -------------------------------------------------------------------------------- /static/js/app.81754102.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.81754102.js.gz -------------------------------------------------------------------------------- /static/js/app.8ac04f93.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.8ac04f93.js.gz -------------------------------------------------------------------------------- /static/js/app.8acab021.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.8acab021.js.gz -------------------------------------------------------------------------------- /static/js/app.8c3ba6c4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.8c3ba6c4.js.gz -------------------------------------------------------------------------------- /static/js/app.8cb9d572.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.8cb9d572.js.gz -------------------------------------------------------------------------------- /static/js/app.8d854b3e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.8d854b3e.js.gz -------------------------------------------------------------------------------- /static/js/app.95c43bf2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.95c43bf2.js.gz -------------------------------------------------------------------------------- /static/js/app.967ef477.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.967ef477.js.gz -------------------------------------------------------------------------------- /static/js/app.9681f36c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.9681f36c.js.gz -------------------------------------------------------------------------------- /static/js/app.9b3484c4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.9b3484c4.js.gz -------------------------------------------------------------------------------- /static/js/app.9e24ea21.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.9e24ea21.js.gz -------------------------------------------------------------------------------- /static/js/app.9e6c4e21.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.9e6c4e21.js.gz -------------------------------------------------------------------------------- /static/js/app.a317a640.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.a317a640.js.gz -------------------------------------------------------------------------------- /static/js/app.a5dbe4b2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.a5dbe4b2.js.gz -------------------------------------------------------------------------------- /static/js/app.a6cc2131.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.a6cc2131.js.gz -------------------------------------------------------------------------------- /static/js/app.ae2cf56b.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.ae2cf56b.js.gz -------------------------------------------------------------------------------- /static/js/app.b0504c39.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.b0504c39.js.gz -------------------------------------------------------------------------------- /static/js/app.b1e02108.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.b1e02108.js.gz -------------------------------------------------------------------------------- /static/js/app.b21ed608.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.b21ed608.js.gz -------------------------------------------------------------------------------- /static/js/app.b7e0f467.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.b7e0f467.js.gz -------------------------------------------------------------------------------- /static/js/app.c1ba643f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.c1ba643f.js.gz -------------------------------------------------------------------------------- /static/js/app.c5785fb1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.c5785fb1.js.gz -------------------------------------------------------------------------------- /static/js/app.ca6215d0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.ca6215d0.js.gz -------------------------------------------------------------------------------- /static/js/app.ccba7ea2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.ccba7ea2.js.gz -------------------------------------------------------------------------------- /static/js/app.d391194e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.d391194e.js.gz -------------------------------------------------------------------------------- /static/js/app.d7244fd8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.d7244fd8.js.gz -------------------------------------------------------------------------------- /static/js/app.d78a8294.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.d78a8294.js.gz -------------------------------------------------------------------------------- /static/js/app.d8b1f42f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.d8b1f42f.js.gz -------------------------------------------------------------------------------- /static/js/app.d949850e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.d949850e.js.gz -------------------------------------------------------------------------------- /static/js/app.dccb3197.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.dccb3197.js.gz -------------------------------------------------------------------------------- /static/js/app.e3d4e8c2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.e3d4e8c2.js.gz -------------------------------------------------------------------------------- /static/js/app.e9d77e87.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.e9d77e87.js.gz -------------------------------------------------------------------------------- /static/js/app.ee5afbda.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.ee5afbda.js.gz -------------------------------------------------------------------------------- /static/js/app.efec4820.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.efec4820.js.gz -------------------------------------------------------------------------------- /static/js/app.f071a45a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.f071a45a.js.gz -------------------------------------------------------------------------------- /static/js/app.f2605cf7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.f2605cf7.js.gz -------------------------------------------------------------------------------- /static/js/app.f4d970bb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.f4d970bb.js.gz -------------------------------------------------------------------------------- /static/js/app.fed4f572.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/app.fed4f572.js.gz -------------------------------------------------------------------------------- /static/js/asciinema-player.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/asciinema-player.js.gz -------------------------------------------------------------------------------- /static/js/chunk-011e82c5.0ad1e9f7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-011e82c5.0ad1e9f7.js.gz -------------------------------------------------------------------------------- /static/js/chunk-01ec29fd.d6d994cf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-01ec29fd.d6d994cf.js.gz -------------------------------------------------------------------------------- /static/js/chunk-02633ef1.9ab47fce.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-02633ef1.9ab47fce.js.gz -------------------------------------------------------------------------------- /static/js/chunk-02633ef1.a680d19e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-02633ef1.a680d19e.js.gz -------------------------------------------------------------------------------- /static/js/chunk-02633ef1.b6b8a773.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-02633ef1.b6b8a773.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0349ce9e.263e07e7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0349ce9e.263e07e7.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0349ce9e.740736b0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0349ce9e.740736b0.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0349ce9e.ab0d7396.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0349ce9e.ab0d7396.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0349ce9e.b0660ff1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0349ce9e.b0660ff1.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0349ce9e.d18de7f8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0349ce9e.d18de7f8.js.gz -------------------------------------------------------------------------------- /static/js/chunk-05fa21f6.743f1a9a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-05fa21f6.743f1a9a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-08284dd4.6bd6d639.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-08284dd4.6bd6d639.js.gz -------------------------------------------------------------------------------- /static/js/chunk-09484404.2074e4e3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-09484404.2074e4e3.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0a5aa114.26dbe387.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0a5aa114.26dbe387.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0a8658f8.51ac2bd7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0a8658f8.51ac2bd7.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0b207afe.596ed78f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0b207afe.596ed78f.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0bfd1d3b.47c9ef3d.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0bfd1d3b.47c9ef3d.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0bfd1d3b.882cff25.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0bfd1d3b.882cff25.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0bfd1d3b.c5788b02.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0bfd1d3b.c5788b02.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0bfd1d3b.cb727fbc.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0bfd1d3b.cb727fbc.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0c5e241d.01c799a2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0c5e241d.01c799a2.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0d9f612a.72255313.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-0d9f612a"],{2161:function(t,e,n){t.exports=n.p+"img/platform_not_authorized.8e05bf34.png"},"3a01":function(t,e,n){},"887e":function(t,e,n){"use strict";var a=n("3a01"),c=n.n(a);c.a},e409:function(t,e,n){"use strict";n.r(e);var a=function(){var t=this,e=t.$createElement;t._self._c;return t._m(0)},c=[function(){var t=this,e=t.$createElement,a=t._self._c||e;return a("div",{staticClass:"center"},[a("img",{attrs:{src:n("2161"),alt:""}}),a("p",[t._v("您暂未授权此平台,请联系管理员授权")])])}],r=n("2af9"),s={components:{ExceptionPage:r["a"]}},i=s,o=(n("887e"),n("2877")),u=Object(o["a"])(i,a,c,!1,null,"484260f7",null);e["default"]=u.exports}}]); -------------------------------------------------------------------------------- /static/js/chunk-0edbadb3.5be93e2a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0edbadb3.5be93e2a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-0fefdb7c.13ff7107.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-0fefdb7c.13ff7107.js.gz -------------------------------------------------------------------------------- /static/js/chunk-10908d7f.2a59da90.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-10908d7f.2a59da90.js.gz -------------------------------------------------------------------------------- /static/js/chunk-10908d7f.f14bcb1c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-10908d7f.f14bcb1c.js.gz -------------------------------------------------------------------------------- /static/js/chunk-112e279e.8334a83e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-112e279e.8334a83e.js.gz -------------------------------------------------------------------------------- /static/js/chunk-12ec570e.7789408d.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-12ec570e.7789408d.js.gz -------------------------------------------------------------------------------- /static/js/chunk-13403366.c54f247a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-13403366.c54f247a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-14cd8511.1a9140e0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-14cd8511.1a9140e0.js.gz -------------------------------------------------------------------------------- /static/js/chunk-14cd8511.51445ad9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-14cd8511.51445ad9.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1a7b3b92.2b063395.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-1a7b3b92"],{"2bcc":function(n,t,o){},"431f":function(n,t,o){"use strict";var c=o("2bcc"),i=o.n(c);i.a},"9a3c":function(n,t,o){"use strict";o.r(t);var c=function(){var n=this,t=n.$createElement,c=n._self._c||t;return c("div",[c("div",{staticClass:"content"},[c("img",{attrs:{src:o("eb2b"),alt:""}}),c("div",[n._v(" 您没有权限访问或操作此资源,请联系管理员申请权限。"),c("a-button",{attrs:{type:"link"},on:{click:n.pushRouter}},[n._v("去申请")])],1)])])},i=[],a={data:function(){return{}},methods:{pushRouter:function(){var n=window.location.origin;window.open(n+"/o/bk_iam/apply-join-user-group")}},mounted:function(){}},e=a,u=(o("431f"),o("2877")),r=Object(u["a"])(e,c,i,!1,null,"73c487fc",null);t["default"]=r.exports},eb2b:function(n,t,o){n.exports=o.p+"img/no-auth.cea6aff4.png"}}]); -------------------------------------------------------------------------------- /static/js/chunk-1bb0e80c.aa324237.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1bb0e80c.aa324237.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1ce91c43.39951165.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1ce91c43.39951165.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1ce91c43.d94f8d25.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1ce91c43.d94f8d25.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1d40cac5.16e4e852.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1d40cac5.16e4e852.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1dae0a5d.02b66d32.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1dae0a5d.02b66d32.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1db14380.cb299650.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1db14380.cb299650.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1e119f10.8114f16e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1e119f10.8114f16e.js.gz -------------------------------------------------------------------------------- /static/js/chunk-1fa0d614.3b68fb0b.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-1fa0d614.3b68fb0b.js.gz -------------------------------------------------------------------------------- /static/js/chunk-21311082.ce1360fe.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-21311082.ce1360fe.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2267bdc2.62f2ba1a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2267bdc2.62f2ba1a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2431c2b6.a5c9b473.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2431c2b6.a5c9b473.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2472b8ba.555416f3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2472b8ba.555416f3.js.gz -------------------------------------------------------------------------------- /static/js/chunk-24a93f69.7f69db2b.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-24a93f69.7f69db2b.js.gz -------------------------------------------------------------------------------- /static/js/chunk-261a2018.fa89e7b6.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-261a2018.fa89e7b6.js.gz -------------------------------------------------------------------------------- /static/js/chunk-29dff3bb.b058b9bd.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-29dff3bb.b058b9bd.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2b185ec5.0c36549c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2b185ec5.0c36549c.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2b185ec5.5d5d42c6.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2b185ec5.5d5d42c6.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2b185ec5.6514cb1c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2b185ec5.6514cb1c.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2d209b21.9fd5e548.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2d209b21.9fd5e548.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2d20fa8d.9e51d467.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2d20fa8d.9e51d467.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2da89e80.60b223c7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2da89e80.60b223c7.js.gz -------------------------------------------------------------------------------- /static/js/chunk-2df2825a.fdec68c9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-2df2825a.fdec68c9.js.gz -------------------------------------------------------------------------------- /static/js/chunk-30c8d119.02715029.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-30c8d119.02715029.js.gz -------------------------------------------------------------------------------- /static/js/chunk-344cc402.100a4754.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-344cc402.100a4754.js.gz -------------------------------------------------------------------------------- /static/js/chunk-344cc402.e18796fc.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-344cc402.e18796fc.js.gz -------------------------------------------------------------------------------- /static/js/chunk-3455b73a.813c7539.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-3455b73a.813c7539.js.gz -------------------------------------------------------------------------------- /static/js/chunk-347c31d1.5f6a5e30.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-347c31d1.5f6a5e30.js.gz -------------------------------------------------------------------------------- /static/js/chunk-38a4603b.ca89dcc1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-38a4603b.ca89dcc1.js.gz -------------------------------------------------------------------------------- /static/js/chunk-3b7b7e50.14cb864e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-3b7b7e50.14cb864e.js.gz -------------------------------------------------------------------------------- /static/js/chunk-3b8391a7.7ebd6c81.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-3b8391a7.7ebd6c81.js.gz -------------------------------------------------------------------------------- /static/js/chunk-3b8391a7.8e572d15.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-3b8391a7.8e572d15.js.gz -------------------------------------------------------------------------------- /static/js/chunk-3b8391a7.a72a41c3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-3b8391a7.a72a41c3.js.gz -------------------------------------------------------------------------------- /static/js/chunk-3b8391a7.d95ee1f0.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-3b8391a7.d95ee1f0.js.gz -------------------------------------------------------------------------------- /static/js/chunk-430c3000.c473120e.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-430c3000"],{"51e6":function(n,t,o){"use strict";var e=o("d893"),i=o.n(e);i.a},"9a3c":function(n,t,o){"use strict";o.r(t);var e=function(){var n=this,t=n.$createElement,e=n._self._c||t;return e("div",[e("div",{staticClass:"content"},[e("img",{attrs:{src:o("eb2b"),alt:""}}),e("div",[n._v(" 您没有权限访问或操作此资源,请联系管理员申请权限。"),e("a-button",{attrs:{type:"link"},on:{click:n.pushRouter}},[n._v("去申请")])],1)])])},i=[],a={data:function(){return{}},methods:{pushRouter:function(){var n=window.location.origin;window.open(n+"/o/bk_iam/apply-join-user-group")}},mounted:function(){}},u=a,c=(o("51e6"),o("2877")),r=Object(c["a"])(u,e,i,!1,null,"24dd4a8e",null);t["default"]=r.exports},d893:function(n,t,o){},eb2b:function(n,t,o){n.exports=o.p+"img/no-auth.cea6aff4.png"}}]); -------------------------------------------------------------------------------- /static/js/chunk-43d8e85c.69fd1cc1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-43d8e85c.69fd1cc1.js.gz -------------------------------------------------------------------------------- /static/js/chunk-49e0a490.944bc1da.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-49e0a490.944bc1da.js.gz -------------------------------------------------------------------------------- /static/js/chunk-4c0ecb98.b2a17298.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-4c0ecb98.b2a17298.js.gz -------------------------------------------------------------------------------- /static/js/chunk-51933dcd.39e4838a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-51933dcd.39e4838a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-53fdf1bf.20e79a51.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-53fdf1bf.20e79a51.js.gz -------------------------------------------------------------------------------- /static/js/chunk-55cec527.7f28f3ab.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-55cec527.7f28f3ab.js.gz -------------------------------------------------------------------------------- /static/js/chunk-5a2189bb.02d7f264.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-5a2189bb.02d7f264.js.gz -------------------------------------------------------------------------------- /static/js/chunk-5c3ae606.ba13e40c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-5c3ae606.ba13e40c.js.gz -------------------------------------------------------------------------------- /static/js/chunk-5cc48762.211b32b4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-5cc48762.211b32b4.js.gz -------------------------------------------------------------------------------- /static/js/chunk-5f7fa5c2.b4c09aee.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-5f7fa5c2.b4c09aee.js.gz -------------------------------------------------------------------------------- /static/js/chunk-60eda19b.cecee11a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-60eda19b.cecee11a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-624c336a.1ef61051.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-624c336a.1ef61051.js.gz -------------------------------------------------------------------------------- /static/js/chunk-63f37384.31d816c5.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-63f37384.31d816c5.js.gz -------------------------------------------------------------------------------- /static/js/chunk-63f37384.3403dc39.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-63f37384.3403dc39.js.gz -------------------------------------------------------------------------------- /static/js/chunk-63f37384.5cae8755.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-63f37384.5cae8755.js.gz -------------------------------------------------------------------------------- /static/js/chunk-64b4540c.7de5ead5.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-64b4540c.7de5ead5.js.gz -------------------------------------------------------------------------------- /static/js/chunk-64bedeae.4835d608.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-64bedeae.4835d608.js.gz -------------------------------------------------------------------------------- /static/js/chunk-64eb4f4c.44109589.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-64eb4f4c.44109589.js.gz -------------------------------------------------------------------------------- /static/js/chunk-6679e19e.5ec84af8.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-6679e19e.5ec84af8.js.gz -------------------------------------------------------------------------------- /static/js/chunk-672bcd2c.3f0ae9ae.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-672bcd2c.3f0ae9ae.js.gz -------------------------------------------------------------------------------- /static/js/chunk-67712dd2.9c43fd4e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-67712dd2.9c43fd4e.js.gz -------------------------------------------------------------------------------- /static/js/chunk-68ba6051.b27b9632.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-68ba6051.b27b9632.js.gz -------------------------------------------------------------------------------- /static/js/chunk-68caa1f1.aa3251f3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-68caa1f1.aa3251f3.js.gz -------------------------------------------------------------------------------- /static/js/chunk-699f1385.7aea2788.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-699f1385.7aea2788.js.gz -------------------------------------------------------------------------------- /static/js/chunk-6a65e99e.b2077492.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-6a65e99e.b2077492.js.gz -------------------------------------------------------------------------------- /static/js/chunk-6a709f79.57afaf81.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-6a709f79.57afaf81.js.gz -------------------------------------------------------------------------------- /static/js/chunk-6a950ac5.c1267fbf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-6a950ac5.c1267fbf.js.gz -------------------------------------------------------------------------------- /static/js/chunk-6ef8885f.1d18f32d.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-6ef8885f.1d18f32d.js.gz -------------------------------------------------------------------------------- /static/js/chunk-6f161320.befd821b.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-6f161320.befd821b.js.gz -------------------------------------------------------------------------------- /static/js/chunk-72eaece6.9147f8a1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-72eaece6.9147f8a1.js.gz -------------------------------------------------------------------------------- /static/js/chunk-739ab948.39138336.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-739ab948.39138336.js.gz -------------------------------------------------------------------------------- /static/js/chunk-739ab948.7fdb93f5.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-739ab948.7fdb93f5.js.gz -------------------------------------------------------------------------------- /static/js/chunk-739ab948.f218951e.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-739ab948.f218951e.js.gz -------------------------------------------------------------------------------- /static/js/chunk-740dd5c8.3728d269.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-740dd5c8.3728d269.js.gz -------------------------------------------------------------------------------- /static/js/chunk-740dd5c8.397cad7c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-740dd5c8.397cad7c.js.gz -------------------------------------------------------------------------------- /static/js/chunk-7798706e.73e67971.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-7798706e.73e67971.js.gz -------------------------------------------------------------------------------- /static/js/chunk-788cfa89.52aec264.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-788cfa89.52aec264.js.gz -------------------------------------------------------------------------------- /static/js/chunk-7b6dfdbc.044d6021.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["chunk-7b6dfdbc"],{2161:function(t,n,e){t.exports=e.p+"img/platform_not_authorized.8e05bf34.png"},"703d":function(t,n,e){},af30:function(t,n,e){"use strict";var a=e("703d"),c=e.n(a);c.a},e409:function(t,n,e){"use strict";e.r(n);var a=function(){var t=this,n=t.$createElement;t._self._c;return t._m(0)},c=[function(){var t=this,n=t.$createElement,a=t._self._c||n;return a("div",{staticClass:"center"},[a("img",{attrs:{src:e("2161"),alt:""}}),a("p",[t._v("您暂未授权此平台,请联系管理员授权")])])}],r=e("2af9"),s={components:{ExceptionPage:r["a"]}},i=s,o=(e("af30"),e("2877")),u=Object(o["a"])(i,a,c,!1,null,"59389742",null);n["default"]=u.exports}}]); -------------------------------------------------------------------------------- /static/js/chunk-7c5ee4b6.a34768d1.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-7c5ee4b6.a34768d1.js.gz -------------------------------------------------------------------------------- /static/js/chunk-7e8c4e64.6f97e3c2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-7e8c4e64.6f97e3c2.js.gz -------------------------------------------------------------------------------- /static/js/chunk-7f7412be.98bf8f7d.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-7f7412be.98bf8f7d.js.gz -------------------------------------------------------------------------------- /static/js/chunk-8f4c8070.1a1675f3.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-8f4c8070.1a1675f3.js.gz -------------------------------------------------------------------------------- /static/js/chunk-91e4d73e.d3769a81.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-91e4d73e.d3769a81.js.gz -------------------------------------------------------------------------------- /static/js/chunk-95d3ed08.7846ba4a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-95d3ed08.7846ba4a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-95d3ed08.968a16f5.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-95d3ed08.968a16f5.js.gz -------------------------------------------------------------------------------- /static/js/chunk-9644b8b2.34bf0c85.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-9644b8b2.34bf0c85.js.gz -------------------------------------------------------------------------------- /static/js/chunk-98775768.3e6862d6.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-98775768.3e6862d6.js.gz -------------------------------------------------------------------------------- /static/js/chunk-b7db2b34.13597ce2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-b7db2b34.13597ce2.js.gz -------------------------------------------------------------------------------- /static/js/chunk-c26aaecc.364d7128.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-c26aaecc.364d7128.js.gz -------------------------------------------------------------------------------- /static/js/chunk-c54ca3ca.324f30e2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-c54ca3ca.324f30e2.js.gz -------------------------------------------------------------------------------- /static/js/chunk-c68890a8.97ad7d33.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-c68890a8.97ad7d33.js.gz -------------------------------------------------------------------------------- /static/js/chunk-d1b3d51c.f2d73cfb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-d1b3d51c.f2d73cfb.js.gz -------------------------------------------------------------------------------- /static/js/chunk-d5dec398.15587e1b.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-d5dec398.15587e1b.js.gz -------------------------------------------------------------------------------- /static/js/chunk-d5dec398.1819df82.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-d5dec398.1819df82.js.gz -------------------------------------------------------------------------------- /static/js/chunk-db0e83f0.f115908f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-db0e83f0.f115908f.js.gz -------------------------------------------------------------------------------- /static/js/chunk-dd3d8a14.232c99b5.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-dd3d8a14.232c99b5.js.gz -------------------------------------------------------------------------------- /static/js/chunk-dd3d8a14.48b014fc.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-dd3d8a14.48b014fc.js.gz -------------------------------------------------------------------------------- /static/js/chunk-dd3d8a14.4ab595fc.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-dd3d8a14.4ab595fc.js.gz -------------------------------------------------------------------------------- /static/js/chunk-dd3d8a14.6bc45f3a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-dd3d8a14.6bc45f3a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-dd3d8a14.be4e896a.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-dd3d8a14.be4e896a.js.gz -------------------------------------------------------------------------------- /static/js/chunk-dd3d8a14.c8617372.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-dd3d8a14.c8617372.js.gz -------------------------------------------------------------------------------- /static/js/chunk-dff0a482.25abdca6.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-dff0a482.25abdca6.js.gz -------------------------------------------------------------------------------- /static/js/chunk-e1da80e8.75564fe6.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-e1da80e8.75564fe6.js.gz -------------------------------------------------------------------------------- /static/js/chunk-e58265d8.8f39092f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-e58265d8.8f39092f.js.gz -------------------------------------------------------------------------------- /static/js/chunk-e6df9160.40c5ebf9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-e6df9160.40c5ebf9.js.gz -------------------------------------------------------------------------------- /static/js/chunk-e8f2939e.6c67c7f2.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-e8f2939e.6c67c7f2.js.gz -------------------------------------------------------------------------------- /static/js/chunk-ed57deb0.d984dfaf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-ed57deb0.d984dfaf.js.gz -------------------------------------------------------------------------------- /static/js/chunk-f14de8f8.4fde624c.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-f14de8f8.4fde624c.js.gz -------------------------------------------------------------------------------- /static/js/chunk-f57c8b94.950823d4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-f57c8b94.950823d4.js.gz -------------------------------------------------------------------------------- /static/js/chunk-f57c8b94.b53250c4.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-f57c8b94.b53250c4.js.gz -------------------------------------------------------------------------------- /static/js/chunk-f57c8b94.f8757fcb.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-f57c8b94.f8757fcb.js.gz -------------------------------------------------------------------------------- /static/js/chunk-f6b5184c.bc640806.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-f6b5184c.bc640806.js.gz -------------------------------------------------------------------------------- /static/js/chunk-fe62f1ae.edfa0eee.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-fe62f1ae.edfa0eee.js.gz -------------------------------------------------------------------------------- /static/js/chunk-fe62f1ae.f594444f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-fe62f1ae.f594444f.js.gz -------------------------------------------------------------------------------- /static/js/chunk-vendors.05ba0f99.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-vendors.05ba0f99.js.gz -------------------------------------------------------------------------------- /static/js/chunk-vendors.2fabffc9.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-vendors.2fabffc9.js.gz -------------------------------------------------------------------------------- /static/js/chunk-vendors.af9f0a86.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-vendors.af9f0a86.js.gz -------------------------------------------------------------------------------- /static/js/chunk-vendors.b00c409f.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-vendors.b00c409f.js.gz -------------------------------------------------------------------------------- /static/js/chunk-vendors.c6aad1c7.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-vendors.c6aad1c7.js.gz -------------------------------------------------------------------------------- /static/js/chunk-vendors.efdf40cf.js.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/js/chunk-vendors.efdf40cf.js.gz -------------------------------------------------------------------------------- /static/js/fail.2d32b7c2.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["fail"],{"576b":function(t,n,e){t.exports=e.p+"img/function_not_authorized.5a8ed9c3.png"},"7fa6":function(t,n,e){},cc89:function(t,n,e){"use strict";e.r(n);var c=function(){var t=this,n=t.$createElement;t._self._c;return t._m(0)},a=[function(){var t=this,n=t.$createElement,c=t._self._c||n;return c("div",{staticClass:"center"},[c("img",{attrs:{src:e("576b"),alt:""}}),c("p",[t._v("您暂未授权此功能,请联系管理员授权")])])}],i=e("2af9"),r={components:{ExceptionPage:i["a"]}},s=r,o=(e("fe8d"),e("2877")),f=Object(o["a"])(s,c,a,!1,null,"3bc4021a",null);n["default"]=f.exports},fe8d:function(t,n,e){"use strict";var c=e("7fa6"),a=e.n(c);a.a}}]); -------------------------------------------------------------------------------- /static/js/fail.8d555f56.js: -------------------------------------------------------------------------------- 1 | (window["webpackJsonp"]=window["webpackJsonp"]||[]).push([["fail"],{"54bb":function(t,n,e){},"576b":function(t,n,e){t.exports=e.p+"img/function_not_authorized.5a8ed9c3.png"},"909f":function(t,n,e){"use strict";var c=e("54bb"),a=e.n(c);a.a},cc89:function(t,n,e){"use strict";e.r(n);var c=function(){var t=this,n=t.$createElement;t._self._c;return t._m(0)},a=[function(){var t=this,n=t.$createElement,c=t._self._c||n;return c("div",{staticClass:"center"},[c("img",{attrs:{src:e("576b"),alt:""}}),c("p",[t._v("您暂未授权此功能,请联系管理员授权")])])}],i=e("2af9"),r={components:{ExceptionPage:i["a"]}},s=r,o=(e("909f"),e("2877")),u=Object(o["a"])(s,c,a,!1,null,"0c49e004",null);n["default"]=u.exports}}]); -------------------------------------------------------------------------------- /static/loading/loading.html: -------------------------------------------------------------------------------- 1 |
Loading
-------------------------------------------------------------------------------- /static/loading/option2/loading.css: -------------------------------------------------------------------------------- 1 | .preloading-animate{background:#ffffff;width:100%;height:100%;position:fixed;left:0;top:0;z-index:299;}.preloading-animate .preloading-wrapper{position:absolute;width:5rem;height:5rem;left:50%;top:50%;transform:translate(-50%,-50%);}.preloading-animate .preloading-wrapper .preloading-balls{font-size:5rem;} -------------------------------------------------------------------------------- /static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/unixhot/opsany-bastion/f84e9a1aa567f9bf6e50939d761d8ec2e26915fb/static/logo.png -------------------------------------------------------------------------------- /urls.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | from django.conf.urls import include, url 4 | from django.contrib import admin 5 | 6 | urlpatterns = [ 7 | url(r'^admin/', admin.site.urls), 8 | url(r'^account/', include('blueapps.account.urls')), 9 | url(r'^', include('index.urls')), 10 | url(r'^api/bastion/v0_1/', include('bastion.urls')), 11 | ] 12 | -------------------------------------------------------------------------------- /websocket-requirements.txt: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 工程预装模块 3 | # 需要额外的python包,可直接在文件后面添加 4 | # 请确保指定的包和版本号,可通过pip安装 5 | 6 | # blueapps requirement 7 | Django==2.2.6 8 | mysqlclient==1.4.4 9 | MarkupSafe==1.1 10 | Mako==1.0.6 11 | requests==2.25.0 12 | urllib3==1.26.2 13 | redis==2.10.6 14 | celery==3.1.25 15 | django-celery==3.2.1 16 | python-json-logger==0.1.7 17 | whitenoise==3.3.0 18 | six==1.11.0 19 | uwsgi==2.0.19.1 20 | daphne==2.2.1 21 | 22 | #v2 requirement 23 | httplib2==0.9.1 24 | 25 | # terminal 26 | bcrypt==3.2.0 27 | pycrypto==2.6.1 28 | cryptography==3.3.1 29 | django-cors-headers==3.2.1 30 | paramiko==2.7.2 31 | channels==2.1.4 32 | channels-redis==2.3.1 33 | django_redis==4.11.0 34 | gunicorn==19.9.0 35 | gevent==21.1.2 36 | XlsxWriter==1.2.8 37 | xlrd==1.2.0 38 | bk-iam==1.1.20 39 | uvicorn==0.11.8 40 | -------------------------------------------------------------------------------- /wsgi.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | """ 3 | WSGI config for project. 4 | 5 | It exposes the WSGI callable as a module-level variable named ``application``. 6 | 7 | For more information on this file, see 8 | https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/ 9 | """ 10 | 11 | import os 12 | 13 | from blueapps.core.wsgi import get_wsgi_application 14 | 15 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") 16 | 17 | application = get_wsgi_application() 18 | --------------------------------------------------------------------------------