diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 00000000..2361b073
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,23 @@
+{
+ "recommendations": [
+ // frontend
+ "dbaeumer.vscode-eslint",
+ "esbenp.prettier-vscode",
+ "editorconfig.editorconfig",
+ "johnsoncodehk.volar",
+ "wayou.vscode-todo-highlight",
+
+ // python
+ "matangover.mypy",
+ "ms-python.python",
+
+ // golang
+ "golang.go"
+ ],
+ "unwantedRecommendations": [
+ "octref.vetur",
+ "hookyqr.beautify",
+ "dbaeumer.jshint",
+ "ms-vscode.vscode-typescript-tslint-plugin"
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 1a0fb602..dacaf37e 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,86 +1,75 @@
{
- "python.defaultInterpreterPath": "api/tacticalrmm/env/bin/python",
- "python.languageServer": "Pylance",
- "python.analysis.extraPaths": [
- "api/tacticalrmm",
- "api/env",
- ],
- "python.analysis.diagnosticSeverityOverrides": {
- "reportUnusedImport": "error",
- "reportDuplicateImport": "error",
- "reportGeneralTypeIssues": "none"
- },
- "python.analysis.typeCheckingMode": "basic",
- "mypy.runUsingActiveInterpreter": true,
- "python.linting.enabled": true,
- "python.linting.mypyEnabled": true,
- "python.linting.mypyArgs": [
- "--ignore-missing-imports",
- "--follow-imports=silent",
- "--show-column-numbers",
- "--strict"
- ],
- "python.formatting.provider": "black",
- "editor.formatOnSave": true,
- "vetur.format.defaultFormatter.js": "prettier",
- "vetur.format.defaultFormatterOptions": {
- "prettier": {
- "semi": true,
- "printWidth": 120,
- "tabWidth": 2,
- "useTabs": false,
- "arrowParens": "avoid",
- }
- },
- "vetur.format.options.tabSize": 2,
- "vetur.format.options.useTabs": false,
+ "python.defaultInterpreterPath": "api/tacticalrmm/env/bin/python",
+ "python.languageServer": "Pylance",
+ "python.analysis.extraPaths": ["api/tacticalrmm", "api/env"],
+ "python.analysis.diagnosticSeverityOverrides": {
+ "reportUnusedImport": "error",
+ "reportDuplicateImport": "error",
+ "reportGeneralTypeIssues": "none"
+ },
+ "python.analysis.typeCheckingMode": "basic",
+ "python.linting.enabled": true,
+ "python.linting.mypyEnabled": true,
+ "python.linting.mypyArgs": [
+ "--ignore-missing-imports",
+ "--follow-imports=silent",
+ "--show-column-numbers",
+ "--strict"
+ ],
+ "python.linting.ignorePatterns": [
+ "**/site-packages/**/*.py",
+ ".vscode/*.py",
+ "**env/**"
+ ],
+ "python.formatting.provider": "black",
+ "mypy.targets": ["api/tacticalrmm"],
+ "mypy.runUsingActiveInterpreter": true,
+ "editor.bracketPairColorization.enabled": true,
+ "editor.guides.bracketPairs": true,
+ "editor.formatOnSave": true,
+ "editor.defaultFormatter": "esbenp.prettier-vscode",
+ "editor.codeActionsOnSave": ["source.fixAll.eslint"],
+ "eslint.validate": ["javascript", "javascriptreact", "typescript", "vue"],
+ "typescript.tsdk": "node_modules/typescript/lib",
+ "files.watcherExclude": {
"files.watcherExclude": {
- "files.watcherExclude": {
- "**/.git/objects/**": true,
- "**/.git/subtree-cache/**": true,
- "**/node_modules/": true,
- "/node_modules/**": true,
- "**/env/": true,
- "/env/**": true,
- "**/__pycache__": true,
- "/__pycache__/**": true,
- "**/.cache": true,
- "**/.eggs": true,
- "**/.ipynb_checkpoints": true,
- "**/.mypy_cache": true,
- "**/.pytest_cache": true,
- "**/*.egg-info": true,
- "**/*.feather": true,
- "**/*.parquet*": true,
- "**/*.pyc": true,
- "**/*.zip": true
- },
+ "**/.git/objects/**": true,
+ "**/.git/subtree-cache/**": true,
+ "**/node_modules/": true,
+ "/node_modules/**": true,
+ "**/env/": true,
+ "/env/**": true,
+ "**/__pycache__": true,
+ "/__pycache__/**": true,
+ "**/.cache": true,
+ "**/.eggs": true,
+ "**/.ipynb_checkpoints": true,
+ "**/.mypy_cache": true,
+ "**/.pytest_cache": true,
+ "**/*.egg-info": true,
+ "**/*.feather": true,
+ "**/*.parquet*": true,
+ "**/*.pyc": true,
+ "**/*.zip": true
+ }
+ },
+ "go.useLanguageServer": true,
+ "[go]": {
+ "editor.formatOnSave": true,
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": false
},
- "go.useLanguageServer": true,
- "[go]": {
- "editor.formatOnSave": true,
- "editor.codeActionsOnSave": {
- "source.organizeImports": false,
- },
- "editor.snippetSuggestions": "none",
- },
- "[go.mod]": {
- "editor.formatOnSave": true,
- "editor.codeActionsOnSave": {
- "source.organizeImports": true,
- },
- },
- "gopls": {
- "usePlaceholders": true,
- "completeUnimported": true,
- "staticcheck": true,
- },
- "mypy.targets": [
- "api/tacticalrmm"
- ],
- "python.linting.ignorePatterns": [
- "**/site-packages/**/*.py",
- ".vscode/*.py",
- "**env/**"
- ]
-}
\ No newline at end of file
+ "editor.snippetSuggestions": "none"
+ },
+ "[go.mod]": {
+ "editor.formatOnSave": true,
+ "editor.codeActionsOnSave": {
+ "source.organizeImports": true
+ }
+ },
+ "gopls": {
+ "usePlaceholders": true,
+ "completeUnimported": true,
+ "staticcheck": true
+ }
+}
diff --git a/web/.babelrc b/web/.babelrc
deleted file mode 100644
index 18c19dbc..00000000
--- a/web/.babelrc
+++ /dev/null
@@ -1,19 +0,0 @@
-{
- "plugins": ["@babel/plugin-syntax-dynamic-import"],
- "env": {
- "test": {
- "plugins": ["dynamic-import-node"],
- "presets": [
- [
- "@babel/preset-env",
- {
- "modules": "commonjs",
- "targets": {
- "node": "current"
- }
- }
- ]
- ]
- }
- }
-}
diff --git a/web/.editorconfig b/web/.editorconfig
new file mode 100644
index 00000000..9d08a1a8
--- /dev/null
+++ b/web/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/web/.eslintignore b/web/.eslintignore
new file mode 100644
index 00000000..47d6d521
--- /dev/null
+++ b/web/.eslintignore
@@ -0,0 +1,9 @@
+/dist
+/src-bex/www
+/src-capacitor
+/src-cordova
+/.quasar
+/node_modules
+.eslintrc.js
+babel.config.js
+/src-ssr
diff --git a/web/.eslintrc.js b/web/.eslintrc.js
new file mode 100644
index 00000000..11a7aef4
--- /dev/null
+++ b/web/.eslintrc.js
@@ -0,0 +1,88 @@
+module.exports = {
+ // https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy
+ // This option interrupts the configuration hierarchy at this file
+ // Remove this if you have an higher level ESLint config file (it usually happens into a monorepos)
+ root: true,
+
+ // https://eslint.vuejs.org/user-guide/#how-to-use-a-custom-parser
+ // Must use parserOptions instead of "parser" to allow vue-eslint-parser to keep working
+ // `parser: 'vue-eslint-parser'` is already included with any 'plugin:vue/**' config and should be omitted
+ parserOptions: {
+ parser: require.resolve("@typescript-eslint/parser"),
+ extraFileExtensions: [".vue"],
+ },
+
+ env: {
+ browser: true,
+ es2021: true,
+ node: true,
+ "vue/setup-compiler-macros": true,
+ },
+
+ // Rules order is important, please avoid shuffling them
+ extends: [
+ // Base ESLint recommended rules
+ // 'eslint:recommended',
+
+ // https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#usage
+ // ESLint typescript rules
+ "plugin:@typescript-eslint/recommended",
+
+ // Uncomment any of the lines below to choose desired strictness,
+ // but leave only one uncommented!
+ // See https://eslint.vuejs.org/rules/#available-rules
+ "plugin:vue/vue3-essential", // Priority A: Essential (Error Prevention)
+ // 'plugin:vue/vue3-strongly-recommended', // Priority B: Strongly Recommended (Improving Readability)
+ // 'plugin:vue/vue3-recommended', // Priority C: Recommended (Minimizing Arbitrary Choices and Cognitive Overhead)
+
+ // https://github.com/prettier/eslint-config-prettier#installation
+ // usage with Prettier, provided by 'eslint-config-prettier'.
+ "prettier",
+ ],
+
+ plugins: [
+ // required to apply rules which need type information
+ "@typescript-eslint",
+
+ // https://eslint.vuejs.org/user-guide/#why-doesn-t-it-work-on-vue-files
+ // required to lint *.vue files
+ "vue",
+
+ // https://github.com/typescript-eslint/typescript-eslint/issues/389#issuecomment-509292674
+ // Prettier has not been included as plugin to avoid performance impact
+ // add it as an extension for your IDE
+ ],
+
+ globals: {
+ ga: "readonly", // Google Analytics
+ cordova: "readonly",
+ __statics: "readonly",
+ __QUASAR_SSR__: "readonly",
+ __QUASAR_SSR_SERVER__: "readonly",
+ __QUASAR_SSR_CLIENT__: "readonly",
+ __QUASAR_SSR_PWA__: "readonly",
+ process: "readonly",
+ Capacitor: "readonly",
+ chrome: "readonly",
+ },
+
+ // add your custom rules here
+ rules: {
+ "prefer-promise-reject-errors": "off",
+
+ quotes: ["warn", "double", { avoidEscape: true }],
+
+ // this rule, if on, would require explicit return type on the `render` function
+ "@typescript-eslint/explicit-function-return-type": "off",
+
+ // in plain CommonJS modules, you can't use `import foo = require('foo')` to pass this rule, so it has to be disabled
+ "@typescript-eslint/no-var-requires": "off",
+
+ // The core 'no-unused-vars' rules (in the eslint:recommended ruleset)
+ // does not work with type definitions
+ "no-unused-vars": "off",
+
+ // allow debugger during development only
+ "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off",
+ },
+};
diff --git a/web/.postcssrc.js b/web/.postcssrc.js
index 1174fe52..f2ec6b31 100644
--- a/web/.postcssrc.js
+++ b/web/.postcssrc.js
@@ -3,6 +3,6 @@
module.exports = {
plugins: [
// to edit target browsers: use "browserslist" field in package.json
- require('autoprefixer')
- ]
-}
+ require("autoprefixer"),
+ ],
+};
diff --git a/web/.prettierrc b/web/.prettierrc
new file mode 100644
index 00000000..dc6958fe
--- /dev/null
+++ b/web/.prettierrc
@@ -0,0 +1,4 @@
+{
+ "singleQuote": false,
+ "semi": true
+}
diff --git a/web/babel.config.js b/web/babel.config.js
index 1952e0c2..ab0385b4 100644
--- a/web/babel.config.js
+++ b/web/babel.config.js
@@ -1,18 +1,14 @@
-const fs = require('fs-extra')
-let extend = undefined
+/* eslint-disable */
-/**
- * The .babelrc file has been created to assist Jest for transpiling.
- * You should keep your application's babel rules in this file.
- */
-
-if (fs.existsSync('./.babelrc')) {
- extend = './.babelrc'
-}
-
-module.exports = {
- presets: [
- '@quasar/babel-preset-app'
- ],
- extends: extend
-}
+module.exports = (api) => {
+ return {
+ presets: [
+ [
+ "@quasar/babel-preset-app",
+ api.caller((caller) => caller && caller.target === "node")
+ ? { targets: { node: "current" } }
+ : {},
+ ],
+ ],
+ };
+};
diff --git a/web/package-lock.json b/web/package-lock.json
index 1d6f171d..90227ae6 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -11,10 +11,12 @@
"@quasar/extras": "^1.13.5",
"apexcharts": "^3.35.0",
"axios": "^0.26.1",
+ "core-js": "^3.6.5",
"dotenv": "^16.0.0",
"qrcode.vue": "^3.3.3",
"quasar": "^2.6.6",
"vue": "^3.2.31",
+ "vue-router": "^4.0.0",
"vue3-ace-editor": "^2.2.2",
"vue3-apexcharts": "^1.4.1",
"vuedraggable": "^4.1.0",
@@ -22,7 +24,19 @@
},
"devDependencies": {
"@quasar/app-webpack": "^3.5.1",
- "@quasar/cli": "^1.3.2"
+ "@quasar/cli": "^1.3.2",
+ "@types/node": "^12.20.21",
+ "@typescript-eslint/eslint-plugin": "^5.10.0",
+ "@typescript-eslint/parser": "^5.10.0",
+ "eslint": "^8.10.0",
+ "eslint-config-prettier": "^8.1.0",
+ "eslint-plugin-vue": "^8.5.0",
+ "prettier": "^2.5.1"
+ },
+ "engines": {
+ "node": ">= 12.22.1",
+ "npm": ">= 6.13.4",
+ "yarn": ">= 1.21.1"
}
},
"node_modules/@ampproject/remapping": {
@@ -1816,6 +1830,91 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@eslint/eslintrc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz",
+ "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.1",
+ "globals": "^13.9.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.13.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
+ "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
"node_modules/@jridgewell/resolve-uri": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
@@ -2297,9 +2396,9 @@
"dev": true
},
"node_modules/@types/node": {
- "version": "17.0.25",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz",
- "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==",
+ "version": "12.20.49",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.49.tgz",
+ "integrity": "sha512-5e6QNb9bkeh4Hni4ktLqUZuUqnGTX/kou2aZkXyxtuYaHXgBm+In1SHR9V+7kDzWzjB08KC2uqt2doDi7cuAAA==",
"dev": true
},
"node_modules/@types/parse-json": {
@@ -2374,6 +2473,228 @@
"@types/node": "*"
}
},
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz",
+ "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.21.0",
+ "@typescript-eslint/type-utils": "5.21.0",
+ "@typescript-eslint/utils": "5.21.0",
+ "debug": "^4.3.2",
+ "functional-red-black-tree": "^1.0.1",
+ "ignore": "^5.1.8",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz",
+ "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.21.0",
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/typescript-estree": "5.21.0",
+ "debug": "^4.3.2"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz",
+ "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/visitor-keys": "5.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz",
+ "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "5.21.0",
+ "debug": "^4.3.2",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz",
+ "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz",
+ "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/visitor-keys": "5.21.0",
+ "debug": "^4.3.2",
+ "globby": "^11.0.4",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz",
+ "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "@typescript-eslint/scope-manager": "5.21.0",
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/typescript-estree": "5.21.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz",
+ "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.21.0",
+ "eslint-visitor-keys": "^3.0.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@vue/compiler-core": {
"version": "3.2.33",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz",
@@ -2694,6 +3015,15 @@
"acorn": "^8"
}
},
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
"node_modules/acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
@@ -4218,7 +4548,6 @@
"version": "3.22.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz",
"integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==",
- "dev": true,
"hasInstallScript": true,
"funding": {
"type": "opencollective",
@@ -4918,6 +5247,12 @@
"node": ">=4.0.0"
}
},
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
"node_modules/deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
@@ -5039,6 +5374,18 @@
"node": ">=6"
}
},
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -5368,6 +5715,90 @@
"node": ">=0.8.0"
}
},
+ "node_modules/eslint": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
+ "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/eslintrc": "^1.2.2",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.6.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
+ "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
+ "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.0.1",
+ "postcss-selector-parser": "^6.0.9",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
"node_modules/eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -5381,6 +5812,147 @@
"node": ">=8.0.0"
}
},
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.13.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
+ "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
+ "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.7.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
"node_modules/esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
@@ -5394,6 +5966,27 @@
"node": ">=4"
}
},
+ "node_modules/esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
@@ -5664,6 +6257,12 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
"node_modules/fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -5709,6 +6308,18 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
"node_modules/file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
@@ -5885,6 +6496,25 @@
"node": ">=8"
}
},
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "dev": true
+ },
"node_modules/follow-redirects": {
"version": "1.14.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
@@ -6102,6 +6732,12 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "node_modules/functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -7270,6 +7906,12 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
"node_modules/json5": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
@@ -7403,6 +8045,19 @@
"safe-buffer": "~5.1.0"
}
},
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/lilconfig": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
@@ -7501,6 +8156,12 @@
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
"dev": true
},
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
"node_modules/lodash.template": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
@@ -7941,6 +8602,12 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -8219,6 +8886,23 @@
"opener": "bin/opener-bin.js"
}
},
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/ora": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz",
@@ -9340,6 +10024,15 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
@@ -9349,6 +10042,21 @@
"node": ">=4"
}
},
+ "node_modules/prettier": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
+ "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
"node_modules/pretty-error": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
@@ -9632,6 +10340,18 @@
"@babel/runtime": "^7.8.4"
}
},
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
"node_modules/regexpu-core": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz",
@@ -10995,6 +11715,12 @@
"node": ">= 8"
}
},
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
"node_modules/through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -11143,6 +11869,27 @@
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
"dev": true
},
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -11155,6 +11902,18 @@
"node": "*"
}
},
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
@@ -11442,6 +12201,12 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
"node_modules/validate-npm-package-name": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
@@ -11472,6 +12237,52 @@
"@vue/shared": "3.2.33"
}
},
+ "node_modules/vue-eslint-parser": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+ "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/vue-loader": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz",
@@ -11490,8 +12301,6 @@
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.14.tgz",
"integrity": "sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==",
- "dev": true,
- "peer": true,
"dependencies": {
"@vue/devtools-api": "^6.0.0"
},
@@ -12060,6 +12869,15 @@
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true
},
+ "node_modules/word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -13461,6 +14279,72 @@
"to-fast-properties": "^2.0.0"
}
},
+ "@eslint/eslintrc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz",
+ "integrity": "sha512-lTVWHs7O2hjBFZunXTZYnYqtB9GakA1lnxIf+gKq2nY5gxkkNi/lQvveW6t8gFdOHTg6nG50Xs95PrLqVpcaLg==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.3.1",
+ "globals": "^13.9.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "globals": {
+ "version": "13.13.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
+ "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
+ }
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.9.5",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.5.tgz",
+ "integrity": "sha512-ObyMyWxZiCu/yTisA7uzx81s40xR2fD5Cg/2Kq7G02ajkNubJf6BopgDTmDyc3U7sXpNKM8cYOw7s7Tyr+DnCw==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
"@jridgewell/resolve-uri": {
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
@@ -13852,9 +14736,9 @@
"dev": true
},
"@types/node": {
- "version": "17.0.25",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.25.tgz",
- "integrity": "sha512-wANk6fBrUwdpY4isjWrKTufkrXdu1D2YHCot2fD/DfWxF5sMrVSA+KN7ydckvaTCh0HiqX9IVl0L5/ZoXg5M7w==",
+ "version": "12.20.49",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.49.tgz",
+ "integrity": "sha512-5e6QNb9bkeh4Hni4ktLqUZuUqnGTX/kou2aZkXyxtuYaHXgBm+In1SHR9V+7kDzWzjB08KC2uqt2doDi7cuAAA==",
"dev": true
},
"@types/parse-json": {
@@ -13929,6 +14813,129 @@
"@types/node": "*"
}
},
+ "@typescript-eslint/eslint-plugin": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.21.0.tgz",
+ "integrity": "sha512-fTU85q8v5ZLpoZEyn/u1S2qrFOhi33Edo2CZ0+q1gDaWWm0JuPh3bgOyU8lM0edIEYgKLDkPFiZX2MOupgjlyg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.21.0",
+ "@typescript-eslint/type-utils": "5.21.0",
+ "@typescript-eslint/utils": "5.21.0",
+ "debug": "^4.3.2",
+ "functional-red-black-tree": "^1.0.1",
+ "ignore": "^5.1.8",
+ "regexpp": "^3.2.0",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.21.0.tgz",
+ "integrity": "sha512-8RUwTO77hstXUr3pZoWZbRQUxXcSXafZ8/5gpnQCfXvgmP9gpNlRGlWzvfbEQ14TLjmtU8eGnONkff8U2ui2Eg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.21.0",
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/typescript-estree": "5.21.0",
+ "debug": "^4.3.2"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.21.0.tgz",
+ "integrity": "sha512-XTX0g0IhvzcH/e3393SvjRCfYQxgxtYzL3UREteUneo72EFlt7UNoiYnikUtmGVobTbhUDByhJ4xRBNe+34kOQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/visitor-keys": "5.21.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.21.0.tgz",
+ "integrity": "sha512-MxmLZj0tkGlkcZCSE17ORaHl8Th3JQwBzyXL/uvC6sNmu128LsgjTX0NIzy+wdH2J7Pd02GN8FaoudJntFvSOw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/utils": "5.21.0",
+ "debug": "^4.3.2",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.21.0.tgz",
+ "integrity": "sha512-XnOOo5Wc2cBlq8Lh5WNvAgHzpjnEzxn4CJBwGkcau7b/tZ556qrWXQz4DJyChYg8JZAD06kczrdgFPpEQZfDsA==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.21.0.tgz",
+ "integrity": "sha512-Y8Y2T2FNvm08qlcoSMoNchh9y2Uj3QmjtwNMdRQkcFG7Muz//wfJBGBxh8R7HAGQFpgYpdHqUpEoPQk+q9Kjfg==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/visitor-keys": "5.21.0",
+ "debug": "^4.3.2",
+ "globby": "^11.0.4",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.5",
+ "tsutils": "^3.21.0"
+ },
+ "dependencies": {
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ }
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.21.0.tgz",
+ "integrity": "sha512-q/emogbND9wry7zxy7VYri+7ydawo2HDZhRZ5k6yggIvXa7PvBbAAZ4PFH/oZLem72ezC4Pr63rJvDK/sTlL8Q==",
+ "dev": true,
+ "requires": {
+ "@types/json-schema": "^7.0.9",
+ "@typescript-eslint/scope-manager": "5.21.0",
+ "@typescript-eslint/types": "5.21.0",
+ "@typescript-eslint/typescript-estree": "5.21.0",
+ "eslint-scope": "^5.1.1",
+ "eslint-utils": "^3.0.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.21.0.tgz",
+ "integrity": "sha512-SX8jNN+iHqAF0riZQMkm7e8+POXa/fXw5cxL+gjpyP+FI+JVNhii53EmQgDAfDcBpFekYSlO0fGytMQwRiMQCA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.21.0",
+ "eslint-visitor-keys": "^3.0.0"
+ }
+ },
"@vue/compiler-core": {
"version": "3.2.33",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.33.tgz",
@@ -14233,6 +15240,13 @@
"dev": true,
"requires": {}
},
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
"acorn-walk": {
"version": "8.2.0",
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
@@ -15405,8 +16419,7 @@
"core-js": {
"version": "3.22.0",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.0.tgz",
- "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ==",
- "dev": true
+ "integrity": "sha512-8h9jBweRjMiY+ORO7bdWSeWfHhLPO7whobj7Z2Bl0IDo00C228EdGgH7FE4jGumbEjzcFfkfW8bXgdkEDhnwHQ=="
},
"core-js-compat": {
"version": "3.22.0",
@@ -15923,6 +16936,12 @@
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true
},
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
"deepmerge": {
"version": "4.2.2",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
@@ -16019,6 +17038,15 @@
"@leichtgewicht/ip-codec": "^2.0.1"
}
},
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
"dom-converter": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz",
@@ -16288,6 +17316,133 @@
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
+ "eslint": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.14.0.tgz",
+ "integrity": "sha512-3/CE4aJX7LNEiE3i6FeodHmI/38GZtWCsAtsymScmzYapx8q1nVVb+eLcLSzATmCPXw5pT4TqVs1E0OmxAd9tw==",
+ "dev": true,
+ "requires": {
+ "@eslint/eslintrc": "^1.2.2",
+ "@humanwhocodes/config-array": "^0.9.2",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-utils": "^3.0.0",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^6.0.1",
+ "globals": "^13.6.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "regexpp": "^3.2.0",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "globals": {
+ "version": "13.13.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
+ "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.5.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz",
+ "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-vue": {
+ "version": "8.7.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-8.7.1.tgz",
+ "integrity": "sha512-28sbtm4l4cOzoO1LtzQPxfxhQABararUb1JtqusQqObJpWX2e/gmVyeYVfepizPFne0Q5cILkYGiBoV36L12Wg==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.0.1",
+ "postcss-selector-parser": "^6.0.9",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^8.0.1"
+ }
+ },
"eslint-scope": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
@@ -16298,12 +17453,63 @@
"estraverse": "^4.1.1"
}
},
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.3.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
+ "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.7.0",
+ "acorn-jsx": "^5.3.1",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
"esprima": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
"dev": true
},
+ "esquery": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
+ "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
"esrecurse": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
@@ -16512,6 +17718,12 @@
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
"dev": true
},
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
"fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -16548,6 +17760,15 @@
"escape-string-regexp": "^1.0.5"
}
},
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
"file-loader": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
@@ -16682,6 +17903,22 @@
}
}
},
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.5",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz",
+ "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==",
+ "dev": true
+ },
"follow-redirects": {
"version": "1.14.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
@@ -16835,6 +18072,12 @@
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
+ "functional-red-black-tree": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
+ "dev": true
+ },
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
@@ -17707,6 +18950,12 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
"json5": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz",
@@ -17822,6 +19071,16 @@
}
}
},
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
"lilconfig": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
@@ -17908,6 +19167,12 @@
"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
"dev": true
},
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
"lodash.template": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
@@ -18245,6 +19510,12 @@
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
"integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w=="
},
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
"negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
@@ -18441,6 +19712,20 @@
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"dev": true
},
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
"ora": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/ora/-/ora-5.4.0.tgz",
@@ -19225,12 +20510,24 @@
"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
"dev": true
},
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
"prepend-http": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
"integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
"dev": true
},
+ "prettier": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
+ "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
+ "dev": true
+ },
"pretty-error": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz",
@@ -19451,6 +20748,12 @@
"@babel/runtime": "^7.8.4"
}
},
+ "regexpp": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
+ "dev": true
+ },
"regexpu-core": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz",
@@ -20488,6 +21791,12 @@
}
}
},
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
"through": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
@@ -20602,6 +21911,23 @@
"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
"dev": true
},
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
"tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
@@ -20611,6 +21937,15 @@
"safe-buffer": "^5.0.1"
}
},
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
"type-fest": {
"version": "0.21.3",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
@@ -20816,6 +22151,12 @@
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
"dev": true
},
+ "v8-compile-cache": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
+ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
+ "dev": true
+ },
"validate-npm-package-name": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz",
@@ -20843,6 +22184,39 @@
"@vue/shared": "3.2.33"
}
},
+ "vue-eslint-parser": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+ "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
"vue-loader": {
"version": "17.0.0",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.0.0.tgz",
@@ -20858,8 +22232,6 @@
"version": "4.0.14",
"resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.14.tgz",
"integrity": "sha512-wAO6zF9zxA3u+7AkMPqw9LjoUCjSxfFvINQj3E/DceTt6uEz1XZLraDhdg2EYmvVwTBSGlLYsUw8bDmx0754Mw==",
- "dev": true,
- "peer": true,
"requires": {
"@vue/devtools-api": "^6.0.0"
}
@@ -21285,6 +22657,12 @@
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
"dev": true
},
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
diff --git a/web/package.json b/web/package.json
index 2edad4ec..4a3da77d 100644
--- a/web/package.json
+++ b/web/package.json
@@ -6,13 +6,14 @@
"scripts": {
"serve": "quasar dev",
"build": "quasar build",
- "test:e2e": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress open\"",
- "test:e2e:ci": "cross-env E2E_TEST=true start-test \"quasar dev\" http-get://localhost:8080 \"cypress run\""
+ "lint": "eslint --ext .js,.ts,.vue ./",
+ "format": "prettier --write \"**/*.{js,ts,vue,,html,md,json}\" --ignore-path .gitignore"
},
"dependencies": {
"@quasar/extras": "^1.13.5",
"apexcharts": "^3.35.0",
"axios": "^0.26.1",
+ "core-js": "^3.6.5",
"dotenv": "^16.0.0",
"qrcode.vue": "^3.3.3",
"quasar": "^2.6.6",
@@ -20,16 +21,34 @@
"vue3-ace-editor": "^2.2.2",
"vue3-apexcharts": "^1.4.1",
"vuedraggable": "^4.1.0",
+ "vue-router": "^4.0.0",
"vuex": "^4.0.2"
},
"devDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.10.0",
+ "@typescript-eslint/parser": "^5.10.0",
+ "eslint": "^8.10.0",
+ "eslint-plugin-vue": "^8.5.0",
+ "eslint-config-prettier": "^8.1.0",
+ "prettier": "^2.5.1",
+ "@types/node": "^12.20.21",
"@quasar/app-webpack": "^3.5.1",
"@quasar/cli": "^1.3.2"
},
"browserslist": [
- "last 2 Chrome versions",
- "last 2 Firefox versions",
- "last 2 Edge versions",
- "last 1 Safari versions"
- ]
-}
\ No newline at end of file
+ "last 10 Chrome versions",
+ "last 10 Firefox versions",
+ "last 4 Edge versions",
+ "last 7 Safari versions",
+ "last 8 Android versions",
+ "last 8 ChromeAndroid versions",
+ "last 8 FirefoxAndroid versions",
+ "last 10 iOS versions",
+ "last 5 Opera versions"
+ ],
+ "engines": {
+ "node": ">= 12.22.1",
+ "npm": ">= 6.13.4",
+ "yarn": ">= 1.21.1"
+ }
+}
diff --git a/web/quasar.conf.js b/web/quasar.conf.js
index 232bc6a5..cf0832d8 100644
--- a/web/quasar.conf.js
+++ b/web/quasar.conf.js
@@ -1,38 +1,48 @@
-require('dotenv').config();
-const path = require('path');
+require("dotenv").config();
+const path = require("path");
module.exports = function () {
return {
- supportTS: false,
+ supportTS: {
+ tsCheckerConfig: {
+ eslint: {
+ enabled: true,
+ files: "./src/**/*.{ts,tsx,js,jsx,vue}",
+ },
+ },
+ },
// https://quasar.dev/quasar-cli/cli-documentation/prefetch-feature
// preFetch: true,
- boot: [
- 'axios',
- ],
+ boot: ["axios"],
// https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-css
- css: [
- 'app.sass'
- ],
+ css: ["app.sass"],
// https://github.com/quasarframework/quasar/tree/dev/extras
extras: [
// 'ionicons-v4',
- 'mdi-v5',
- 'fontawesome-v5',
+ "mdi-v5",
+ "fontawesome-v5",
// 'eva-icons',
// 'themify',
// 'line-awesome',
// 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both!
- 'roboto-font', // optional, you are not bound to it
- 'material-icons', // optional, you are not bound to it
+ "roboto-font", // optional, you are not bound to it
+ "material-icons", // optional, you are not bound to it
],
// Full list of options: https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-build
build: {
- env: { DEV_API: process.env.DEV_URL, PROD_API: process.env.PROD_URL, DOCKER_BUILD: process.env.DOCKER_BUILD },
- vueRouterMode: 'history', // available values: 'hash', 'history'
+ env: {
+ DEV_API: process.env.DEV_URL,
+ PROD_API: process.env.PROD_URL,
+ DOCKER_BUILD: process.env.DOCKER_BUILD,
+ },
+ vueRouterMode: "history", // available values: 'hash', 'history'
distDir: "dist/",
- devtool: process.env.NODE_ENV === "production" ? "cheap-module-eval-source-map" : "source-map",
+ devtool:
+ process.env.NODE_ENV === "production"
+ ? "cheap-module-eval-source-map"
+ : "source-map",
// Add dependencies for transpiling with Babel (Array of regexes)
// (from node_modules, which are by default not transpiled).
@@ -52,8 +62,8 @@ module.exports = function () {
extendWebpack(cfg) {
cfg.resolve.alias = {
...cfg.resolve.alias,
- "@": path.resolve(__dirname, './src'),
- }
+ "@": path.resolve(__dirname, "./src"),
+ };
},
},
@@ -62,36 +72,30 @@ module.exports = function () {
https: false,
host: process.env.DEV_HOST,
port: process.env.DEV_PORT,
- open: false
+ open: false,
},
// https://quasar.dev/quasar-cli/quasar-conf-js#Property%3A-framework
framework: {
- iconSet: 'material-icons', // Quasar icon set
- lang: 'en-US', // Quasar language pack
+ iconSet: "material-icons", // Quasar icon set
+ lang: "en-US", // Quasar language pack
// Quasar plugins
- plugins: [
- 'Dialog',
- 'Loading',
- 'LoadingBar',
- 'Meta',
- 'Notify'
- ],
+ plugins: ["Dialog", "Loading", "LoadingBar", "Meta", "Notify"],
config: {
loadingBar: {
- size: "4px"
+ size: "4px",
},
notify: {
position: "top",
timeout: 2000,
textColor: "white",
- actions: [{ icon: "close", color: "white" }]
+ actions: [{ icon: "close", color: "white" }],
},
loading: {
- delay: 50
- }
- }
+ delay: 50,
+ },
+ },
},
// animations: 'all', // --- includes all animations
@@ -100,7 +104,7 @@ module.exports = function () {
// https://quasar.dev/quasar-cli/developing-ssr/configuring-ssr
ssr: {
- pwa: false
- }
- }
-}
+ pwa: false,
+ },
+ };
+};
diff --git a/web/src/App.vue b/web/src/App.vue
index 29b30e7d..01da8640 100644
--- a/web/src/App.vue
+++ b/web/src/App.vue
@@ -96,4 +96,4 @@ body
.min-width
min-width: 0px !important
-
\ No newline at end of file
+
diff --git a/web/src/api/accounts.js b/web/src/api/accounts.js
index 3ca976a6..16e35091 100644
--- a/web/src/api/accounts.js
+++ b/web/src/api/accounts.js
@@ -1,57 +1,63 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/accounts"
+const baseUrl = "/accounts";
// user api functions
export async function fetchUsers(params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/users/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/users/`, { params: params });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
// role api function
export async function fetchRoles(params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/roles/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/roles/`, { params: params });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function removeRole(id) {
- const { data } = await axios.delete(`${baseUrl}/roles/${id}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/roles/${id}/`);
+ return data;
}
-export async function saveRole(payload) {
- const { data } = await axios.post(`${baseUrl}/roles/`, payload)
- return data
+export async function saveRole(role) {
+ const { data } = await axios.post(`${baseUrl}/roles/`, role);
+ return data;
}
-export async function editRole(id, payload) {
- const { data } = await axios.put(`${baseUrl}/roles/${id}/`, payload)
- return data
+export async function editRole(id, role) {
+ const { data } = await axios.put(`${baseUrl}/roles/${id}/`, role);
+ return data;
}
// api key api functions
export async function fetchAPIKeys(params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/apikeys/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/apikeys/`, { params: params });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
-export async function saveAPIKey(payload) {
- const { data } = await axios.post(`${baseUrl}/apikeys/`, payload)
- return data
+export async function saveAPIKey(apiKey) {
+ const { data } = await axios.post(`${baseUrl}/apikeys/`, apiKey);
+ return data;
}
-export async function editAPIKey(payload) {
- const { data } = await axios.put(`${baseUrl}/apikeys/${payload.id}/`, payload)
- return data
+export async function editAPIKey(id, apiKey) {
+ const { data } = await axios.put(`${baseUrl}/apikeys/${id}/`, apiKey);
+ return data;
}
export async function removeAPIKey(id) {
- const { data } = await axios.delete(`${baseUrl}/apikeys/${id}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/apikeys/${id}/`);
+ return data;
}
diff --git a/web/src/api/agents.js b/web/src/api/agents.js
index bf0ab2ce..046ff87d 100644
--- a/web/src/api/agents.js
+++ b/web/src/api/agents.js
@@ -1,167 +1,234 @@
-import axios from "axios"
+import axios from "axios";
import { openURL } from "quasar";
-import { router } from "@/router"
+import { router } from "@/router";
-const baseUrl = "/agents"
+const baseUrl = "/agents";
export function runTakeControl(agent_id) {
const url = router.resolve(`/takecontrol/${agent_id}`).href;
- openURL(url, null, { popup: true, scrollbars: false, location: false, status: false, toolbar: false, menubar: false, width: 1600, height: 900 });
+ openURL(url, null, {
+ popup: true,
+ scrollbars: false,
+ location: false,
+ status: false,
+ toolbar: false,
+ menubar: false,
+ width: 1600,
+ height: 900,
+ });
}
export function openAgentWindow(agent_id) {
const url = router.resolve(`/agents/${agent_id}`).href;
- openURL(url, null, { popup: true, scrollbars: false, location: false, status: false, toolbar: false, menubar: false, width: 1600, height: 900 });
+ openURL(url, null, {
+ popup: true,
+ scrollbars: false,
+ location: false,
+ status: false,
+ toolbar: false,
+ menubar: false,
+ width: 1600,
+ height: 900,
+ });
}
export function runRemoteBackground(agent_id, agentPlatform) {
- const url = router.resolve(`/remotebackground/${agent_id}?agentPlatform=${agentPlatform}`).href;
- openURL(url, null, { popup: true, scrollbars: false, location: false, status: false, toolbar: false, menubar: false, width: 1280, height: 900 });
+ const url = router.resolve(
+ `/remotebackground/${agent_id}?agentPlatform=${agentPlatform}`
+ ).href;
+ openURL(url, null, {
+ popup: true,
+ scrollbars: false,
+ location: false,
+ status: false,
+ toolbar: false,
+ menubar: false,
+ width: 1280,
+ height: 900,
+ });
}
export async function fetchAgents(params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/`, { params: params });
+ return data;
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
export async function fetchAgent(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function editAgent(agent_id, payload) {
- const { data } = await axios.put(`${baseUrl}/${agent_id}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/${agent_id}/`, payload);
+ return data;
}
export async function removeAgent(agent_id) {
- const { data } = await axios.delete(`${baseUrl}/${agent_id}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/${agent_id}/`);
+ return data;
}
export async function fetchAgentHistory(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/history/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/history/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function fetchAgentChecks(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/checks/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/checks/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function fetchAgentTasks(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/tasks/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/tasks/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function sendAgentRecovery(agent_id, payload) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/recover/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/recover/`, payload);
+ return data;
}
export async function sendAgentCommand(agent_id, payload) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/cmd/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/cmd/`, payload);
+ return data;
}
export async function refreshAgentWMI(agent_id) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/wmi/`)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/wmi/`);
+ return data;
}
export async function runScript(agent_id, payload) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/runscript/`, payload)
- return data
+ const { data } = await axios.post(
+ `${baseUrl}/${agent_id}/runscript/`,
+ payload
+ );
+ return data;
}
export async function runBulkAction(payload) {
- const { data } = await axios.post(`${baseUrl}/actions/bulk/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/actions/bulk/`, payload);
+ return data;
}
export async function fetchAgentProcesses(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/processes/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/processes/`, {
+ params: params,
+ });
+ return data;
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
export async function killAgentProcess(agent_id, pid, params = {}) {
- const { data } = await axios.delete(`${baseUrl}/${agent_id}/processes/${pid}/`, { params: params })
- return data
+ const { data } = await axios.delete(
+ `${baseUrl}/${agent_id}/processes/${pid}/`,
+ { params: params }
+ );
+ return data;
}
export async function fetchAgentEventLog(agent_id, logType, days, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/eventlog/${logType}/${days}/`, { params: params })
- return data
+ const { data } = await axios.get(
+ `${baseUrl}/${agent_id}/eventlog/${logType}/${days}/`,
+ { params: params }
+ );
+ return data;
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
export async function fetchAgentMeshCentralURLs(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/meshcentral/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/meshcentral/`, {
+ params: params,
+ });
+ return data;
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
export async function scheduleAgentReboot(agent_id, payload) {
- const { data } = await axios.patch(`${baseUrl}/${agent_id}/reboot/`, payload)
- return data
+ const { data } = await axios.patch(`${baseUrl}/${agent_id}/reboot/`, payload);
+ return data;
}
export async function agentRebootNow(agent_id) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/reboot/`)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/reboot/`);
+ return data;
}
export async function sendAgentRecoverMesh(agent_id, params = {}) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/meshcentral/recover/`, { params: params })
- return data
+ const { data } = await axios.post(
+ `${baseUrl}/${agent_id}/meshcentral/recover/`,
+ { params: params }
+ );
+ return data;
}
export async function sendAgentPing(agent_id, params = {}) {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/ping/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/ping/`, {
+ params: params,
+ });
+ return data;
}
// agent notes
export async function fetchAgentNotes(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/notes/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/notes/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function saveAgentNote(payload) {
- const { data } = await axios.post(`${baseUrl}/notes/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/notes/`, payload);
+ return data;
}
export async function editAgentNote(pk, payload) {
- const { data } = await axios.put(`${baseUrl}/notes/${pk}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/notes/${pk}/`, payload);
+ return data;
}
export async function removeAgentNote(pk) {
- const { data } = await axios.delete(`${baseUrl}/notes/${pk}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/notes/${pk}/`);
+ return data;
}
diff --git a/web/src/api/automation.js b/web/src/api/automation.js
index 296d0914..7041b3ba 100644
--- a/web/src/api/automation.js
+++ b/web/src/api/automation.js
@@ -1,15 +1,17 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/automation"
+const baseUrl = "/automation";
export async function sendPatchPolicyReset(payload) {
- const { data } = await axios.post(`${baseUrl}/patchpolicy/reset/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/patchpolicy/reset/`, payload);
+ return data;
}
export async function fetchPolicyChecks(id) {
- try {
- const { data } = await axios.get(`${baseUrl}/policies/${id}/checks/`)
- return data
- } catch (e) { console.error(e) }
-}
\ No newline at end of file
+ try {
+ const { data } = await axios.get(`${baseUrl}/policies/${id}/checks/`);
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
+}
diff --git a/web/src/api/checks.js b/web/src/api/checks.js
index bd280252..080f5915 100644
--- a/web/src/api/checks.js
+++ b/web/src/api/checks.js
@@ -1,37 +1,37 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/checks"
+const baseUrl = "/checks";
export async function fetchChecks(params = {}) {
- try {
- const { data } = await axios.get(`${baseUrl}/`, { params: params })
- return data
- } catch (e) {
- console.error(e)
- }
+ try {
+ const { data } = await axios.get(`${baseUrl}/`, { params: params });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function saveCheck(payload) {
- const { data } = await axios.post(`${baseUrl}/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/`, payload);
+ return data;
}
export async function updateCheck(id, payload) {
- const { data } = await axios.put(`${baseUrl}/${id}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/${id}/`, payload);
+ return data;
}
export async function removeCheck(id) {
- const { data } = await axios.delete(`${baseUrl}/${id}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/${id}/`);
+ return data;
}
export async function resetCheck(id) {
- const { data } = await axios.post(`${baseUrl}/${id}/reset/`)
- return data
+ const { data } = await axios.post(`${baseUrl}/${id}/reset/`);
+ return data;
}
export async function runAgentChecks(agent_id) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/run/`)
- return data
-}
\ No newline at end of file
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/run/`);
+ return data;
+}
diff --git a/web/src/api/clients.js b/web/src/api/clients.js
index faa9c6ef..e160a7a7 100644
--- a/web/src/api/clients.js
+++ b/web/src/api/clients.js
@@ -1,81 +1,95 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/clients"
+const baseUrl = "/clients";
// client endpoints
export async function fetchClients() {
try {
- const { data } = await axios.get(`${baseUrl}/`)
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/`);
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function fetchClient(id) {
try {
- const { data } = await axios.get(`${baseUrl}/${id}/`)
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/${id}/`);
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function saveClient(payload) {
- const { data } = await axios.post(`${baseUrl}/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/`, payload);
+ return data;
}
export async function editClient(id, payload) {
- const { data } = await axios.put(`${baseUrl}/${id}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/${id}/`, payload);
+ return data;
}
export async function removeClient(id, params = {}) {
- const { data } = await axios.delete(`${baseUrl}/${id}/`, { params: params })
- return data
+ const { data } = await axios.delete(`${baseUrl}/${id}/`, { params: params });
+ return data;
}
// site endpoints
export async function fetchSites() {
try {
- const { data } = await axios.get(`${baseUrl}/sites/`)
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/sites/`);
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function fetchSite(id) {
try {
- const { data } = await axios.get(`${baseUrl}/sites/${id}/`)
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/sites/${id}/`);
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function saveSite(payload) {
- const { data } = await axios.post(`${baseUrl}/sites/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/sites/`, payload);
+ return data;
}
export async function editSite(id, payload) {
- const { data } = await axios.put(`${baseUrl}/sites/${id}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/sites/${id}/`, payload);
+ return data;
}
export async function removeSite(id, params = {}) {
- const { data } = await axios.delete(`${baseUrl}/sites/${id}/`, { params: params })
- return data
+ const { data } = await axios.delete(`${baseUrl}/sites/${id}/`, {
+ params: params,
+ });
+ return data;
}
// deployment endpoints
export async function fetchDeployments() {
try {
- const { data } = await axios.get(`${baseUrl}/deployments/`)
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/deployments/`);
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function saveDeployment(payload) {
- const { data } = await axios.post(`${baseUrl}/deployments/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/deployments/`, payload);
+ return data;
}
export async function removeDeployment(id, params = {}) {
- const { data } = await axios.delete(`${baseUrl}/deployments/${id}/`, { params: params })
- return data
-}
\ No newline at end of file
+ const { data } = await axios.delete(`${baseUrl}/deployments/${id}/`, {
+ params: params,
+ });
+ return data;
+}
diff --git a/web/src/api/core.js b/web/src/api/core.js
index a78b41c7..b448827c 100644
--- a/web/src/api/core.js
+++ b/web/src/api/core.js
@@ -1,30 +1,40 @@
-import axios from "axios"
+import axios from "axios";
import { openURL } from "quasar";
-const baseUrl = "/core"
+const baseUrl = "/core";
export async function fetchCustomFields(params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/customfields/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/customfields/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function fetchDashboardInfo(params = {}) {
- const { data } = await axios.get(`${baseUrl}/dashinfo/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/dashinfo/`, { params: params });
+ return data;
}
export async function fetchURLActions(params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/urlaction/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/urlaction/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function runURLAction(payload) {
try {
- const { data } = await axios.patch(`${baseUrl}/urlaction/run/`, payload)
- openURL(data)
- } catch (e) { console.error(e) }
-}
\ No newline at end of file
+ const { data } = await axios.patch(`${baseUrl}/urlaction/run/`, payload);
+ openURL(data);
+ } catch (e) {
+ console.error(e);
+ }
+}
diff --git a/web/src/api/logs.js b/web/src/api/logs.js
index 0462626a..4251aa28 100644
--- a/web/src/api/logs.js
+++ b/web/src/api/logs.js
@@ -1,35 +1,37 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/logs"
+const baseUrl = "/logs";
export async function fetchDebugLog(payload) {
try {
- const { data } = await axios.patch(`${baseUrl}/debug/`, payload)
- return data
- } catch (e) { }
+ const { data } = await axios.patch(`${baseUrl}/debug/`, payload);
+ return data;
+ } catch (e) {}
}
export async function fetchAuditLog(payload) {
- const { data } = await axios.patch(`${baseUrl}/audit/`, payload)
- return data
+ const { data } = await axios.patch(`${baseUrl}/audit/`, payload);
+ return data;
}
// pending actions
export async function fetchPendingActions(params = {}) {
- const { data } = await axios.get(`${baseUrl}/pendingactions/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/pendingactions/`, {
+ params: params,
+ });
+ return data;
}
export async function fetchAgentPendingActions(agent_id) {
try {
- const { data } = await axios.get(`/agents/${agent_id}/pendingactions/`)
- return data
+ const { data } = await axios.get(`/agents/${agent_id}/pendingactions/`);
+ return data;
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
export async function deletePendingAction(id) {
- const { data } = await axios.delete(`${baseUrl}/pendingactions/${id}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/pendingactions/${id}/`);
+ return data;
}
diff --git a/web/src/api/scripts.js b/web/src/api/scripts.js
index e37e7b98..c3d9c18c 100644
--- a/web/src/api/scripts.js
+++ b/web/src/api/scripts.js
@@ -1,62 +1,67 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/scripts"
+const baseUrl = "/scripts";
// script operations
export async function fetchScripts(params = {}) {
- const { data } = await axios.get(`${baseUrl}/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/`, { params: params });
+ return data;
}
export async function testScript(agent_id, payload) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/test/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/test/`, payload);
+ return data;
}
export async function saveScript(payload) {
- const { data } = await axios.post(`${baseUrl}/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/`, payload);
+ return data;
}
export async function editScript(payload) {
- const { data } = await axios.put(`${baseUrl}/${payload.id}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/${payload.id}/`, payload);
+ return data;
}
export async function removeScript(id) {
- const { data } = await axios.delete(`${baseUrl}/${id}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/${id}/`);
+ return data;
}
export async function downloadScript(id, params = {}) {
- const { data } = await axios.get(`${baseUrl}/${id}/download/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/${id}/download/`, {
+ params: params,
+ });
+ return data;
}
-
// script snippet operations
export async function fetchScriptSnippets(params = {}) {
- const { data } = await axios.get(`${baseUrl}/snippets/`, { params: params })
- return data
-
+ const { data } = await axios.get(`${baseUrl}/snippets/`, { params: params });
+ return data;
}
export async function saveScriptSnippet(payload) {
- const { data } = await axios.post(`${baseUrl}/snippets/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/snippets/`, payload);
+ return data;
}
export async function fetchScriptSnippet(id, params = {}) {
- const { data } = await axios.get(`${baseUrl}/snippets/${id}/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/snippets/${id}/`, {
+ params: params,
+ });
+ return data;
}
export async function editScriptSnippet(payload) {
- const { data } = await axios.put(`${baseUrl}/snippets/${payload.id}/`, payload)
- return data
+ const { data } = await axios.put(
+ `${baseUrl}/snippets/${payload.id}/`,
+ payload
+ );
+ return data;
}
export async function removeScriptSnippet(id) {
- const { data } = await axios.delete(`${baseUrl}/snippets/${id}/`)
- return data
-}
\ No newline at end of file
+ const { data } = await axios.delete(`${baseUrl}/snippets/${id}/`);
+ return data;
+}
diff --git a/web/src/api/services.js b/web/src/api/services.js
index ddd9a045..dcaf38fc 100644
--- a/web/src/api/services.js
+++ b/web/src/api/services.js
@@ -1,31 +1,41 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/services"
+const baseUrl = "/services";
export async function getAgentServices(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/`, {
+ params: params,
+ });
+ return data;
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
export async function getAgentServiceDetails(agent_id, svcname, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/${svcname}/`, { params: params })
- return data
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/${svcname}/`, {
+ params: params,
+ });
+ return data;
} catch (e) {
- console.error(e)
+ console.error(e);
}
}
export async function editAgentServiceStartType(agent_id, svcname, payload) {
- const { data } = await axios.put(`${baseUrl}/${agent_id}/${svcname}/`, payload)
- return data
+ const { data } = await axios.put(
+ `${baseUrl}/${agent_id}/${svcname}/`,
+ payload
+ );
+ return data;
}
export async function sendAgentServiceAction(agent_id, svcname, payload) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/${svcname}/`, payload)
- return data
+ const { data } = await axios.post(
+ `${baseUrl}/${agent_id}/${svcname}/`,
+ payload
+ );
+ return data;
}
diff --git a/web/src/api/software.js b/web/src/api/software.js
index 22c525e0..e1df9e2b 100644
--- a/web/src/api/software.js
+++ b/web/src/api/software.js
@@ -1,35 +1,37 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/software"
+const baseUrl = "/software";
export async function fetchChocosSoftware(params = {}) {
- try {
- const { data } = await axios.get(`${baseUrl}/chocos/`, { params: params })
- return data
- } catch (e) {
- console.error(e)
- }
+ try {
+ const { data } = await axios.get(`${baseUrl}/chocos/`, { params: params });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function fetchAgentSoftware(agent_id, params = {}) {
- try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params })
- return data.software
- } catch (e) {
- console.error(e)
- }
+ try {
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/`, {
+ params: params,
+ });
+ return data.software;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function installAgentSoftware(agent_id, payload) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/`, payload);
+ return data;
}
export async function refreshAgentSoftware(agent_id) {
- try {
- const { data } = await axios.put(`${baseUrl}/${agent_id}/`)
- return data
- } catch (e) {
- console.error(e)
- }
-}
\ No newline at end of file
+ try {
+ const { data } = await axios.put(`${baseUrl}/${agent_id}/`);
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
+}
diff --git a/web/src/api/tasks.js b/web/src/api/tasks.js
index 28480a1a..8ac767b3 100644
--- a/web/src/api/tasks.js
+++ b/web/src/api/tasks.js
@@ -1,32 +1,32 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/tasks"
+const baseUrl = "/tasks";
export async function fetchTasks(params = {}) {
- try {
- const { data } = await axios.get(`${baseUrl}/`, { params: params })
- return data
- } catch (e) {
- console.error(e)
- }
+ try {
+ const { data } = await axios.get(`${baseUrl}/`, { params: params });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function saveTask(payload) {
- const { data } = await axios.post(`${baseUrl}/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/`, payload);
+ return data;
}
export async function updateTask(id, payload) {
- const { data } = await axios.put(`${baseUrl}/${id}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/${id}/`, payload);
+ return data;
}
export async function removeTask(id) {
- const { data } = await axios.delete(`${baseUrl}/${id}/`)
- return data
+ const { data } = await axios.delete(`${baseUrl}/${id}/`);
+ return data;
}
export async function runTask(id, payload) {
- const { data } = await axios.post(`${baseUrl}/${id}/run/`, payload)
- return data
+ const { data } = await axios.post(`${baseUrl}/${id}/run/`, payload);
+ return data;
}
diff --git a/web/src/api/winupdates.js b/web/src/api/winupdates.js
index 96515a47..4d6ef4df 100644
--- a/web/src/api/winupdates.js
+++ b/web/src/api/winupdates.js
@@ -1,26 +1,30 @@
-import axios from "axios"
+import axios from "axios";
-const baseUrl = "/winupdate"
+const baseUrl = "/winupdate";
// win updates api functions
export async function fetchAgentUpdates(agent_id, params = {}) {
try {
- const { data } = await axios.get(`${baseUrl}/${agent_id}/`, { params: params })
- return data
- } catch (e) { console.error(e) }
+ const { data } = await axios.get(`${baseUrl}/${agent_id}/`, {
+ params: params,
+ });
+ return data;
+ } catch (e) {
+ console.error(e);
+ }
}
export async function runAgentUpdateScan(agent_id) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/scan/`)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/scan/`);
+ return data;
}
export async function runAgentUpdateInstall(agent_id) {
- const { data } = await axios.post(`${baseUrl}/${agent_id}/install/`)
- return data
+ const { data } = await axios.post(`${baseUrl}/${agent_id}/install/`);
+ return data;
}
export async function editAgentUpdate(id, payload) {
- const { data } = await axios.put(`${baseUrl}/${id}/`, payload)
- return data
+ const { data } = await axios.put(`${baseUrl}/${id}/`, payload);
+ return data;
}
diff --git a/web/src/boot/axios.js b/web/src/boot/axios.js
index dfe73a3c..1468fdfc 100644
--- a/web/src/boot/axios.js
+++ b/web/src/boot/axios.js
@@ -1,5 +1,5 @@
-import axios from 'axios';
-import { Notify } from "quasar"
+import axios from "axios";
+import { Notify } from "quasar";
export const getBaseUrl = () => {
if (process.env.NODE_ENV === "production") {
@@ -14,12 +14,11 @@ export const getBaseUrl = () => {
};
export default function ({ app, router, store }) {
-
app.config.globalProperties.$axios = axios;
axios.interceptors.request.use(
function (config) {
- config.baseURL = getBaseUrl()
+ config.baseURL = getBaseUrl();
const token = store.state.token;
if (token != null) {
config.headers.Authorization = `Token ${token}`;
@@ -36,10 +35,10 @@ export default function ({ app, router, store }) {
return response;
},
async function (error) {
- let text
+ let text;
if (!error.response) {
- text = error.message
+ text = error.message;
}
// unauthorized
else if (error.response.status === 401) {
@@ -48,25 +47,22 @@ export default function ({ app, router, store }) {
// perms
else if (error.response.status === 403) {
// don't notify user if method is GET
- if (error.config.method === "get" || error.config.method === "patch") return Promise.reject({ ...error });
+ if (error.config.method === "get" || error.config.method === "patch")
+ return Promise.reject({ ...error });
text = error.response.data.detail;
}
// catch all for other 400 error messages
else if (error.response.status >= 400 && error.response.status < 500) {
-
if (error.config.responseType === "blob") {
- text = (await error.response.data.text()).replace(/^"|"$/g, '')
- }
-
- else if (error.response.data.non_field_errors) {
- text = error.response.data.non_field_errors[0]
-
+ text = (await error.response.data.text()).replace(/^"|"$/g, "");
+ } else if (error.response.data.non_field_errors) {
+ text = error.response.data.non_field_errors[0];
} else {
if (typeof error.response.data === "string") {
- text = error.response.data
+ text = error.response.data;
} else if (typeof error.response.data === "object") {
- let [key, value] = Object.entries(error.response.data)[0]
- text = key + ": " + value[0]
+ let [key, value] = Object.entries(error.response.data)[0];
+ text = key + ": " + value[0];
}
}
}
@@ -75,13 +71,14 @@ export default function ({ app, router, store }) {
Notify.create({
color: "negative",
message: text ? text : "",
- caption: error.response ? error.response.status + ": " + error.response.statusText : "",
- timeout: 2500
- })
+ caption: error.response
+ ? error.response.status + ": " + error.response.statusText
+ : "",
+ timeout: 2500,
+ });
}
return Promise.reject({ ...error });
}
);
}
-
diff --git a/web/src/components/AdminManager.vue b/web/src/components/AdminManager.vue
index 8ff6d71c..6c9a1abd 100644
--- a/web/src/components/AdminManager.vue
+++ b/web/src/components/AdminManager.vue
@@ -2,7 +2,15 @@
- User Administration
+ User Administration
Close
@@ -10,7 +18,17 @@
-
+
-
+
-
+
@@ -64,14 +90,24 @@
-
+
Reset Password
-
+
@@ -97,7 +133,9 @@
{{ props.row.username }}
{{ props.row.first_name }} {{ props.row.last_name }}
{{ props.row.email }}
- {{ formatDate(props.row.last_login) }}
+ {{
+ formatDate(props.row.last_login)
+ }}
Never
{{ props.row.last_login_ip }}
@@ -118,7 +156,7 @@ import UserResetPasswordForm from "@/components/modals/admin/UserResetPasswordFo
export default {
name: "AdminManager",
mixins: [mixins],
- setup(props) {
+ setup() {
// setup vuex
const store = useStore();
const formatDate = computed(() => store.getters.formatDate);
@@ -131,8 +169,19 @@ export default {
return {
users: [],
columns: [
- { name: "is_active", label: "Active", field: "is_active", align: "left" },
- { name: "username", label: "Username", field: "username", align: "left", sortable: true },
+ {
+ name: "is_active",
+ label: "Active",
+ field: "is_active",
+ align: "left",
+ },
+ {
+ name: "username",
+ label: "Username",
+ field: "username",
+ align: "left",
+ sortable: true,
+ },
{
name: "name",
label: "Name",
@@ -174,7 +223,7 @@ export default {
this.$q.loading.show();
this.$axios
.get("/accounts/users/")
- .then(r => {
+ .then((r) => {
this.users = r.data;
this.$q.loading.hide();
})
@@ -190,13 +239,10 @@ export default {
ok: { label: "Delete", color: "negative" },
})
.onOk(() => {
- this.$axios
- .delete(`/accounts/${user.id}/users/`)
- .then(() => {
- this.getUsers();
- this.notifySuccess(`User ${user.username} was deleted!`);
- })
- .catch(e => {});
+ this.$axios.delete(`/accounts/${user.id}/users/`).then(() => {
+ this.getUsers();
+ this.notifySuccess(`User ${user.username} was deleted!`);
+ });
});
},
showEditUserModal(user) {
@@ -224,19 +270,18 @@ export default {
if (user.username === this.logged_in_user) {
return;
}
- let text = !user.is_active ? "User enabled successfully" : "User disabled successfully";
+ let text = !user.is_active
+ ? "User enabled successfully"
+ : "User disabled successfully";
const data = {
id: user.id,
is_active: !user.is_active,
};
- this.$axios
- .put(`/accounts/${data.id}/users/`, data)
- .then(() => {
- this.notifySuccess(text);
- })
- .catch(e => {});
+ this.$axios.put(`/accounts/${data.id}/users/`, data).then(() => {
+ this.notifySuccess(text);
+ });
},
ResetPassword(user) {
this.$q
@@ -262,19 +307,21 @@ export default {
ok: { label: "Reset", color: "positive" },
})
.onOk(() => {
- this.$axios.put("/accounts/users/reset_totp/", data).then(response => {
- this.notifySuccess(response.data, 4000);
- });
+ this.$axios
+ .put("/accounts/users/reset_totp/", data)
+ .then((response) => {
+ this.notifySuccess(response.data, 4000);
+ });
});
},
},
computed: {
...mapState({
- logged_in_user: state => state.username,
+ logged_in_user: (state) => state.username,
}),
},
mounted() {
this.getUsers();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/AgentTable.vue b/web/src/components/AgentTable.vue
index aac85132..81e51dcb 100644
--- a/web/src/components/AgentTable.vue
+++ b/web/src/components/AgentTable.vue
@@ -2,7 +2,10 @@
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
{{ sms_overdue_text }}
@@ -111,18 +122,26 @@
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
{{ email_overdue_text }}
@@ -130,18 +149,30 @@
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
{{ dashboard_overdue_text }}
@@ -149,42 +180,88 @@
-
+
Microsoft Windows
-
+
Linux
-
+
Maintenance Mode Enabled
-
+
Checks failing
-
+
Checks warning
-
+
Checks info
-
+
Checks passing
- {{ props.row.client_name }}
+ {{
+ props.row.client_name
+ }}
{{ props.row.site_name }}
{{ props.row.hostname }}
- {{ props.row.description }}
+ {{
+ props.row.description
+ }}
- {{ props.row.logged_username }}
+ {{
+ props.row.logged_username
+ }}
{{ props.row.logged_username }}
-
+
Patches Pending
@@ -197,28 +274,49 @@
color="warning"
class="cursor-pointer"
>
- Pending Action Count: {{ props.row.pending_actions_count }}
+ Pending Action Count:
+ {{ props.row.pending_actions_count }}
-
+
Reboot required
-
+
Agent overdue
-
+
Agent offline
Agent online
- {{ formatDate(props.row.last_seen) }}
- {{ bootTime(props.row.boot_time) }}
+ {{
+ formatDate(props.row.last_seen)
+ }}
+ {{
+ bootTime(props.row.boot_time)
+ }}
@@ -269,7 +367,7 @@ export default {
const params = lowerTerms.trim().split(" ");
// parse search text and set variables
- params.forEach(param => {
+ params.forEach((param) => {
if (param.includes("is:")) {
advancedFilter = true;
let filter = param.split(":")[1];
@@ -277,22 +375,30 @@ export default {
if (filter === "actionspending") actions = true;
else if (filter === "checksfailing") checks = true;
else if (filter === "rebootneeded") reboot = true;
- else if (filter === "online" || filter === "offline" || filter === "expired" || filter === "overdue")
+ else if (
+ filter === "online" ||
+ filter === "offline" ||
+ filter === "expired" ||
+ filter === "overdue"
+ )
availability = filter;
} else {
search = param + "";
}
});
- return rows.filter(row => {
+ return rows.filter((row) => {
if (advancedFilter) {
if (checks && !row.checks.has_failing_checks) return false;
if (patches && !row.has_patches_pending) return false;
if (actions && row.pending_actions_count === 0) return false;
if (reboot && !row.needs_reboot) return false;
- if (availability === "online" && row.status !== "online") return false;
- else if (availability === "offline" && row.status !== "offline") return false;
- else if (availability === "overdue" && row.status !== "overdue") return false;
+ if (availability === "online" && row.status !== "online")
+ return false;
+ else if (availability === "offline" && row.status !== "offline")
+ return false;
+ else if (availability === "overdue" && row.status !== "overdue")
+ return false;
else if (availability === "expired") {
let now = new Date();
let lastSeen = date.extractDate(row.last_seen, "MM DD YYYY HH:mm");
@@ -302,9 +408,10 @@ export default {
}
// Normal text filter
- return cols.some(col => {
+ return cols.some((col) => {
const val = cellValue(col, row) + "";
- const haystack = val === "undefined" || val === "null" ? "" : val.toLowerCase();
+ const haystack =
+ val === "undefined" || val === "null" ? "" : val.toLowerCase();
return haystack.indexOf(search) !== -1;
});
});
@@ -354,18 +461,17 @@ export default {
[db_field]: !alert_action,
};
const alertColor = !alert_action ? "positive" : "info";
- this.$axios
- .put(`/agents/${agent.agent_id}/`, data)
- .then(r => {
- this.$q.notify({
- color: alertColor,
- textColor: "black",
- icon: "fas fa-check-circle",
- message: `${capitalize(category)} alerts will now be ${action} when ${agent.hostname} is overdue.`,
- timeout: 5000,
- });
- })
- .catch(e => {});
+ this.$axios.put(`/agents/${agent.agent_id}/`, data).then(() => {
+ this.$q.notify({
+ color: alertColor,
+ textColor: "black",
+ icon: "fas fa-check-circle",
+ message: `${capitalize(category)} alerts will now be ${action} when ${
+ agent.hostname
+ } is overdue.`,
+ timeout: 5000,
+ });
+ });
},
agentClass(status) {
if (status === "offline") {
@@ -417,4 +523,3 @@ export default {
},
};
-
diff --git a/web/src/components/AlertsIcon.vue b/web/src/components/AlertsIcon.vue
index 671f128a..13742ca4 100644
--- a/web/src/components/AlertsIcon.vue
+++ b/web/src/components/AlertsIcon.vue
@@ -1,6 +1,8 @@
- {{ alertsCountText() }}
+ {{
+ alertsCountText()
+ }}
No New Alerts
@@ -8,28 +10,49 @@
{{ alert.client }} - {{ alert.site }} - {{ alert.hostname }} {{ alert.client }} - {{ alert.site }} -
+ {{ alert.hostname }}
-
+
{{ alert.message }}
- {{ getTimeLapse(alert.alert_time) }}
+ {{
+ getTimeLapse(alert.alert_time)
+ }}
-
+
Snooze alert
-
+
Resolve alert
- View All Alerts ({{ alertsCount }})
+ View All Alerts ({{ alertsCount }})
@@ -43,7 +66,7 @@ import { getTimeLapse } from "@/utils/format";
export default {
name: "AlertsIcon",
mixins: [mixins],
- setup(props) {
+ setup() {
return {
getTimeLapse,
};
@@ -60,7 +83,7 @@ export default {
},
computed: {
badgeColor() {
- const severities = this.topAlerts.map(alert => alert.severity);
+ const severities = this.topAlerts.map((alert) => alert.severity);
if (severities.includes("error")) return this.errorColor;
else if (severities.includes("warning")) return this.warningColor;
@@ -69,13 +92,10 @@ export default {
},
methods: {
getAlerts() {
- this.$axios
- .patch("alerts/", { top: 10 })
- .then(r => {
- this.alertsCount = r.data.alerts_count;
- this.topAlerts = r.data.alerts;
- })
- .catch(e => {});
+ this.$axios.patch("alerts/", { top: 10 }).then((r) => {
+ this.alertsCount = r.data.alerts_count;
+ this.topAlerts = r.data.alerts;
+ });
},
showOverview() {
this.$q
@@ -94,11 +114,11 @@ export default {
prompt: {
model: "",
type: "number",
- isValid: val => !!val && val > 0 && val < 9999,
+ isValid: (val) => !!val && val > 0 && val < 9999,
},
cancel: true,
})
- .onOk(days => {
+ .onOk((days) => {
this.$q.loading.show();
const data = {
@@ -109,12 +129,12 @@ export default {
this.$axios
.put(`alerts/${alert.id}/`, data)
- .then(r => {
+ .then(() => {
this.getAlerts();
this.$q.loading.hide();
this.notifySuccess(`The alert has been snoozed for ${days} days`);
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -129,12 +149,12 @@ export default {
this.$axios
.put(`alerts/${alert.id}/`, data)
- .then(r => {
+ .then(() => {
this.getAlerts();
this.$q.loading.hide();
this.notifySuccess("The alert has been resolved");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -161,4 +181,4 @@ export default {
clearInterval(this.poll);
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/AlertsManager.vue b/web/src/components/AlertsManager.vue
index f57fc645..31fef4e4 100644
--- a/web/src/components/AlertsManager.vue
+++ b/web/src/components/AlertsManager.vue
@@ -3,7 +3,15 @@
- Alerts Manager
+ Alerts Manager
Close
@@ -11,7 +19,17 @@
-
+
-
+
Edit
-
+
@@ -82,7 +108,11 @@
-
+
@@ -98,30 +128,59 @@
-
+
-
- Alert template has agent alert settings
+
+ Alert template has agent alert settings
-
- Alert template has check alert settings
+
+ Alert template has check alert settings
-
- Alert template has task alert settings
+
+ Alert template has task alert settings
{{ props.row.name }}
- Default
@@ -131,7 +190,9 @@
style="cursor: pointer; text-decoration: underline"
class="text-primary"
@click="showTemplateApplied(props.row)"
- >Show where template is applied ({{ props.row.applied_count }})Show where template is applied ({{
+ props.row.applied_count
+ }})
@@ -175,10 +236,27 @@ export default {
selectedTemplate: null,
templates: [],
columns: [
- { name: "is_active", label: "Active", field: "is_active", align: "left" },
- { name: "agent_settings", label: "Agent Settings", field: "agent_settings" },
- { name: "check_settings", label: "Check Settings", field: "check_settings" },
- { name: "task_settings", label: "Task Settings", field: "task_settings" },
+ {
+ name: "is_active",
+ label: "Active",
+ field: "is_active",
+ align: "left",
+ },
+ {
+ name: "agent_settings",
+ label: "Agent Settings",
+ field: "agent_settings",
+ },
+ {
+ name: "check_settings",
+ label: "Check Settings",
+ field: "check_settings",
+ },
+ {
+ name: "task_settings",
+ label: "Task Settings",
+ field: "task_settings",
+ },
{ name: "name", label: "Name", field: "name", align: "left" },
{
name: "applied_to",
@@ -217,11 +295,11 @@ export default {
this.$q.loading.show();
this.$axios
.get("alerts/templates/")
- .then(r => {
+ .then((r) => {
this.templates = r.data;
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -244,12 +322,14 @@ export default {
this.$q.loading.show();
this.$axios
.delete(`alerts/templates/${template.id}/`)
- .then(r => {
+ .then(() => {
this.refresh();
this.$q.loading.hide();
- this.notifySuccess(`Alert template ${template.name} was deleted!`);
+ this.notifySuccess(
+ `Alert template ${template.name} was deleted!`
+ );
})
- .catch(error => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -297,23 +377,23 @@ export default {
});
},
toggleEnabled(template) {
- let text = !template.is_active ? "Template enabled successfully" : "Template disabled successfully";
+ let text = !template.is_active
+ ? "Template enabled successfully"
+ : "Template disabled successfully";
const data = {
id: template.id,
is_active: !template.is_active,
};
- this.$axios
- .put(`alerts/templates/${template.id}/`, data)
- .then(r => {
- this.notifySuccess(text);
- this.$store.dispatch("refreshDashboard");
- })
- .catch(error => {});
+ this.$axios.put(`alerts/templates/${template.id}/`, data).then(() => {
+ this.notifySuccess(text);
+ this.$store.dispatch("refreshDashboard");
+ });
},
rowSelectedClass(id, selectedTemplate) {
- if (selectedTemplate && selectedTemplate.id === id) return this.$q.dark.isActive ? "highlight-dark" : "highlight";
+ if (selectedTemplate && selectedTemplate.id === id)
+ return this.$q.dark.isActive ? "highlight-dark" : "highlight";
},
show() {
this.$refs.dialog.show();
@@ -329,4 +409,4 @@ export default {
this.getTemplates();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/FileBar.vue b/web/src/components/FileBar.vue
index 719618d9..c0e1d141 100644
--- a/web/src/components/FileBar.vue
+++ b/web/src/components/FileBar.vue
@@ -51,7 +51,11 @@
Manage Deployments
-
+
Update Agents
@@ -87,11 +91,20 @@
User Administration
-
+
Global Settings
-
+
Code Signing
@@ -102,7 +115,11 @@
-
+
Bulk Command
@@ -114,7 +131,11 @@
Bulk Patch Management
-
+
Server Maintenance
@@ -160,7 +181,12 @@
-
+
@@ -199,7 +225,7 @@ import AdminManager from "@/components/AdminManager";
import InstallAgent from "@/components/modals/agents/InstallAgent";
import AuditManager from "@/components/logs/AuditManager";
import BulkAction from "@/components/modals/agents/BulkAction";
-import Deployment from "@/components/clients/Deployment";
+import DeploymentTable from "@/components/clients/DeploymentTable";
import ServerMaintenance from "@/components/modals/core/ServerMaintenance";
import CodeSign from "@/components/modals/coresettings/CodeSign";
import PermissionsManager from "@/components/accounts/PermissionsManager";
@@ -214,7 +240,6 @@ export default {
AdminManager,
ServerMaintenance,
CodeSign,
- PermissionsManager,
},
data() {
return {
@@ -235,8 +260,7 @@ export default {
clearCache() {
this.$axios
.get("/core/clearcache/")
- .then(r => this.notifySuccess(r.data))
- .catch(() => {});
+ .then((r) => this.notifySuccess(r.data));
},
openHelp(mode) {
let url;
@@ -248,10 +272,12 @@ export default {
url = "https://docs.tacticalrmm.com";
break;
case "bug":
- url = "https://github.com/amidaware/tacticalrmm/issues/new?template=bug_report.md";
+ url =
+ "https://github.com/amidaware/tacticalrmm/issues/new?template=bug_report.md";
break;
case "feature":
- url = "https://github.com/amidaware/tacticalrmm/issues/new?template=feature_request.md";
+ url =
+ "https://github.com/amidaware/tacticalrmm/issues/new?template=feature_request.md";
break;
case "discord":
url = "https://discord.gg/upGTkWp";
@@ -349,7 +375,7 @@ export default {
},
showDeployments() {
this.$q.dialog({
- component: Deployment,
+ component: DeploymentTable,
});
},
},
diff --git a/web/src/components/SubTableTabs.vue b/web/src/components/SubTableTabs.vue
index 74eadb4e..f6dadc38 100644
--- a/web/src/components/SubTableTabs.vue
+++ b/web/src/components/SubTableTabs.vue
@@ -1,6 +1,8 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
@@ -156,7 +198,18 @@ export default {
props: {
activeTabs: {
type: Array,
- default: ["summary", "checks", "tasks", "patches", "software", "history", "notes", "assets", "debug", "audit"],
+ default: () => [
+ "summary",
+ "checks",
+ "tasks",
+ "patches",
+ "software",
+ "history",
+ "notes",
+ "assets",
+ "debug",
+ "audit",
+ ],
},
},
setup(props) {
@@ -165,4 +218,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/accounts/PermissionsManager.vue b/web/src/components/accounts/PermissionsManager.vue
index 090120b7..03d96503 100644
--- a/web/src/components/accounts/PermissionsManager.vue
+++ b/web/src/components/accounts/PermissionsManager.vue
@@ -9,7 +9,10 @@
-
+
-
+
@@ -34,7 +47,11 @@
Edit
-
+
@@ -50,7 +67,12 @@
{{ props.row.name }}
-
+
{{ props.row.user_count }}
@@ -75,14 +97,26 @@ import RolesForm from "@/components/accounts/RolesForm";
// static data
const columns = [
{ name: "name", label: "Name", field: "name", align: "left", sortable: true },
- { name: "is_superuser", label: "Superuser", field: "is_superuser", align: "left", sortable: true },
- { name: "user_count", label: "Assigned Users", field: "user_count", align: "left", sortable: true },
+ {
+ name: "is_superuser",
+ label: "Superuser",
+ field: "is_superuser",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "user_count",
+ label: "Assigned Users",
+ field: "user_count",
+ align: "left",
+ sortable: true,
+ },
];
export default {
name: "PermissionsManager",
emits: [...useDialogPluginComponent.emits],
- setup(props) {
+ setup() {
// setup quasar
const $q = useQuasar();
const { dialogRef, onDialogHide } = useDialogPluginComponent();
@@ -153,4 +187,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/accounts/RolesForm.vue b/web/src/components/accounts/RolesForm.vue
index ca5fe739..cc4a0bd0 100644
--- a/web/src/components/accounts/RolesForm.vue
+++ b/web/src/components/accounts/RolesForm.vue
@@ -14,7 +14,7 @@
dense
outlined
v-model="localRole.name"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
@@ -31,10 +31,22 @@
-
-
-
-
+
+
+
+
@@ -42,38 +54,116 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Core
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -81,9 +171,18 @@
-
-
-
+
+
+
@@ -91,12 +190,30 @@
-
-
-
-
-
-
+
+
+
+
+
+
@@ -131,8 +248,14 @@
-
-
+
+
@@ -140,9 +263,18 @@
-
-
-
+
+
+
@@ -150,10 +282,22 @@
-
-
-
-
+
+
+
+
@@ -161,8 +305,14 @@
-
-
+
+
@@ -170,10 +320,22 @@
-
-
-
-
+
+
+
+
@@ -181,7 +343,10 @@
-
+
@@ -189,8 +354,14 @@
-
-
+
+
@@ -198,13 +369,23 @@
-
+
-
+
@@ -323,7 +504,9 @@ export default {
async function onSubmit() {
loading.value = true;
try {
- const result = props.role ? await editRole(role.value.id, role.value) : await saveRole(role.value);
+ const result = props.role
+ ? await editRole(role.value.id, role.value)
+ : await saveRole(role.value);
notifySuccess(result);
onDialogOK();
} catch (e) {
@@ -334,7 +517,8 @@ export default {
watch(
() => role.value.is_superuser,
- (newValue, oldValue) => {
+ (newValue) => {
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
Object.keys(role.value).forEach((key, index) => {
if (typeof role.value[key] === "boolean") {
role.value[key] = newValue;
@@ -358,4 +542,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/AgentActionMenu.vue b/web/src/components/agents/AgentActionMenu.vue
index 403e2226..4d7c9324 100644
--- a/web/src/components/agents/AgentActionMenu.vue
+++ b/web/src/components/agents/AgentActionMenu.vue
@@ -15,7 +15,12 @@
Pending Agent Actions
-
+
@@ -39,7 +44,9 @@
dense
clickable
v-close-popup
- @click="runURLAction({ agent_id: agent.agent_id, action: action.id })"
+ @click="
+ runURLAction({ agent_id: agent.agent_id, action: action.id })
+ "
>
{{ action.name }}
@@ -85,7 +92,11 @@
-
+
@@ -98,7 +109,11 @@
- {{ agent.maintenance_mode ? "Disable Maintenance Mode" : "Enable Maintenance Mode" }}
+ {{
+ agent.maintenance_mode
+ ? "Disable Maintenance Mode"
+ : "Enable Maintenance Mode"
+ }}
@@ -215,7 +230,7 @@ export default {
props: {
agent: !Object,
},
- setup(props) {
+ setup() {
// setup quasar
const $q = useQuasar();
@@ -252,7 +267,9 @@ export default {
urlActions.value = await fetchURLActions();
if (urlActions.value.length === 0) {
- notifyWarning("No URL Actions configured. Go to Settings > Global Settings > URL Actions");
+ notifyWarning(
+ "No URL Actions configured. Go to Settings > Global Settings > URL Actions"
+ );
return;
}
} catch (e) {}
@@ -283,9 +300,11 @@ export default {
menuLoading.value = true;
try {
- const data = await fetchScripts({ showCommunityScripts: store.state.showCommunityScripts });
+ const data = await fetchScripts({
+ showCommunityScripts: store.state.showCommunityScripts,
+ });
- const scripts = data.filter(script => !!script.favorite);
+ const scripts = data.filter((script) => !!script.favorite);
if (scripts.length === 0) {
notifyWarning("You don't have any scripts favorited!");
@@ -293,7 +312,7 @@ export default {
}
favoriteScripts.value = scripts
- .map(script => ({
+ .map((script) => ({
label: script.name,
value: script.id,
timeout: script.default_timeout,
@@ -311,8 +330,12 @@ export default {
};
try {
- const result = await editAgent(agent.agent_id, data);
- notifySuccess(`Maintenance mode was ${agent.maintenance_mode ? "disabled" : "enabled"} on ${agent.hostname}`);
+ await editAgent(agent.agent_id, data);
+ notifySuccess(
+ `Maintenance mode was ${
+ agent.maintenance_mode ? "disabled" : "enabled"
+ } on ${agent.hostname}`
+ );
store.commit("setRefreshSummaryTab", true);
refreshDashboard();
} catch (e) {
@@ -322,7 +345,7 @@ export default {
async function runPatchStatusScan(agent) {
try {
- const result = await runAgentUpdateScan(agent.agent_id);
+ await runAgentUpdateScan(agent.agent_id);
notifySuccess(`Scan will be run shortly on ${agent.hostname}`);
} catch (e) {
console.error(e);
@@ -365,7 +388,7 @@ export default {
}).onOk(async () => {
$q.loading.show();
try {
- const result = await agentRebootNow(agent.agent_id);
+ await agentRebootNow(agent.agent_id);
notifySuccess(`${agent.hostname} will now be restarted`);
$q.loading.hide();
} catch (e) {
@@ -402,8 +425,8 @@ export default {
if (data.status === "offline") {
$q.dialog({
title: "Agent offline",
- message: `${agent.hostname} cannot be contacted.
- Would you like to continue with the uninstall?
+ message: `${agent.hostname} cannot be contacted.
+ Would you like to continue with the uninstall?
If so, the agent will need to be manually uninstalled from the computer.`,
cancel: { label: "No", color: "negative" },
ok: { label: "Yes", color: "positive" },
@@ -426,21 +449,25 @@ export default {
function deleteAgent(agent) {
$q.dialog({
- title: `Please type yes in the box below to confirm deletion.`,
+ title:
+ 'Please type yes in the box below to confirm deletion.',
prompt: {
model: "",
type: "text",
- isValid: val => val === "yes",
+ isValid: (val) => val === "yes",
},
cancel: true,
ok: { label: "Uninstall", color: "negative" },
persistent: true,
html: true,
- }).onOk(async val => {
+ }).onOk(async () => {
try {
const data = await removeAgent(agent.agent_id);
notifySuccess(data);
- refreshDashboard(false /* clearTreeSelected */, true /* clearSubTable */);
+ refreshDashboard(
+ false /* clearTreeSelected */,
+ true /* clearSubTable */
+ );
} catch (e) {
console.error(e);
}
@@ -474,4 +501,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/AssetsTab.vue b/web/src/components/agents/AssetsTab.vue
index 002409d6..6f75bd71 100644
--- a/web/src/components/agents/AssetsTab.vue
+++ b/web/src/components/agents/AssetsTab.vue
@@ -87,7 +87,7 @@ import WmiDetail from "@/components/agents/WmiDetail";
export default {
name: "AssetsTab",
components: { WmiDetail },
- setup(props) {
+ setup() {
// setup vuex
const store = useStore();
const selectedAgent = computed(() => store.state.selectedRow);
@@ -105,7 +105,7 @@ export default {
loading.value = false;
}
- watch(selectedAgent, (newValue, oldValue) => {
+ watch(selectedAgent, (newValue) => {
if (newValue) {
getWMIData();
}
@@ -125,4 +125,3 @@ export default {
},
};
-
diff --git a/web/src/components/agents/AuditTab.vue b/web/src/components/agents/AuditTab.vue
index d9ef08c8..0671158d 100644
--- a/web/src/components/agents/AuditTab.vue
+++ b/web/src/components/agents/AuditTab.vue
@@ -30,4 +30,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/AutomatedTasksTab.vue b/web/src/components/agents/AutomatedTasksTab.vue
index 4693fdf0..31d5b230 100644
--- a/web/src/components/agents/AutomatedTasksTab.vue
+++ b/web/src/components/agents/AutomatedTasksTab.vue
@@ -1,461 +1,574 @@
-
- No agent selected
-
- Only supported for Windows agents at this time
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Enabled
-
-
-
-
-
-
-
- SMS Alert
-
-
-
-
-
-
-
- Email Alert
-
-
-
-
-
-
-
- Dashboard Alert
-
-
-
-
-
-
-
-
-
-
-
- Collector Task
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Run task now
-
-
-
-
-
- Edit
-
-
-
-
-
- Delete
-
-
-
- Close
-
-
-
-
-
-
-
-
-
-
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
-
-
-
-
-
-
-
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
-
-
-
-
-
-
-
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
-
-
-
-
-
-
-
- This task is managed by a policy
-
-
-
-
-
-
- The task updates a custom field on the agent
-
-
-
-
-
-
- Passing
-
-
-
-
- Informational
-
-
- Warning
-
-
- Error
-
-
-
-
- {{ props.row.name }}
-
- Will sync on next agent checkin
- Synced with agent
- Pending deletion on agent
- Waiting for task creation on agent
-
- output
-
- Awaiting output
- {{ formatDate(props.row.task_result.last_run) }}
- Has not run yet
- {{ props.row.schedule }}
-
-
- {{ truncateText(props.row.check_name, 40) }}
- {{ props.row.check_name }}
-
-
-
-
-
-
-
-
-
-
+
+ No agent selected
+
+ Only supported for Windows agents at this time
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Enabled
+
+
+
+
+
+
+
+ SMS Alert
+
+
+
+
+
+
+
+ Email Alert
+
+
+
+
+
+
+
+ Dashboard Alert
+
+
+
+
+
+
+
+
+
+
+
+ Collector Task
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Run task now
+
+
+
+
+
+ Edit
+
+
+
+
+
+ Delete
+
+
+
+ Close
+
+
+
+
+
+
+
+
+
+
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
+
+
+
+
+
+
+
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
+
+
+
+
+
+
+
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
+
+
+
+
+
+
+
+ This task is managed by a policy
+
+
+
+
+
+
+ The task updates a custom field on the agent
+
+
+
+
+
+
+ Passing
+
+
+
+
+ Informational
+
+
+ Warning
+
+
+ Error
+
+
+
+
+ {{ props.row.name }}
+
+ Will sync on next agent checkin
+ Synced with agent
+ Pending deletion on agent
+ Waiting for task creation on agent
+
+ output
+
+ Awaiting output
+ {{
+ formatDate(props.row.task_result.last_run)
+ }}
+ Has not run yet
+ {{ props.row.schedule }}
+
+
+ {{ truncateText(props.row.check_name, 40) }}
+ {{
+ props.row.check_name
+ }}
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/agents/ChecksTab.vue b/web/src/components/agents/ChecksTab.vue
index abee6927..1351b818 100644
--- a/web/src/components/agents/ChecksTab.vue
+++ b/web/src/components/agents/ChecksTab.vue
@@ -1,540 +1,679 @@
-
- No agent selected
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Disk Space Check
-
-
-
-
-
- Ping Check
-
-
-
-
-
- CPU Load Check
-
-
-
-
-
- Memory Check
-
-
-
-
-
- Windows Service Check
-
-
-
-
-
- Script Check
-
-
-
-
-
- Event Log Check
-
-
-
-
-
-
-
-
-
-
- SMS Alert
-
-
-
-
-
-
- Email Alert
-
-
-
-
-
-
- Dashboard Alert
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Edit
-
-
-
-
-
- Delete
-
-
-
-
-
-
- Reset Check Status
-
-
-
- Close
-
-
-
-
-
-
-
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
-
-
-
-
-
-
-
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
-
-
-
-
-
-
-
- Setting is overridden by alert template: {{ props.row.alert_template.name }}
-
-
-
-
-
-
-
- This check is managed by a policy
-
-
-
-
- This check is overriden by a policy
-
-
-
-
-
-
-
- Passing
-
-
-
-
- Informational
-
-
- Warning
-
-
- Error
-
-
-
-
-
-
- {{ truncateText(props.row.readable_desc, 40) }}
- {{ props.row.readable_desc }}
-
-
-
- Show Run History
-
- Last Output
- Last Output
- Last Output
- {{ props.row.check_result.more_info }}
-
- {{ props.row.check_result.last_run ? formatDate(props.row.check_result.last_run) : "Never" }}
- {{ props.row.assignedtasks.length }} Tasks
- {{ props.row.assignedtasks[0].name }}
-
-
-
-
-
-
-
-
-
+
+ No agent selected
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Disk Space Check
+
+
+
+
+
+ Ping Check
+
+
+
+
+
+ CPU Load Check
+
+
+
+
+
+ Memory Check
+
+
+
+
+
+ Windows Service Check
+
+
+
+
+
+ Script Check
+
+
+
+
+
+ Event Log Check
+
+
+
+
+
+
+
+
+
+
+ SMS Alert
+
+
+
+
+
+
+ Email Alert
+
+
+
+
+
+
+ Dashboard Alert
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Edit
+
+
+
+
+
+ Delete
+
+
+
+
+
+
+ Reset Check Status
+
+
+
+ Close
+
+
+
+
+
+
+
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
+
+
+
+
+
+
+
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
+
+
+
+
+
+
+
+
+ Setting is overridden by alert template:
+ {{ props.row.alert_template.name }}
+
+
+
+
+
+
+
+
+ This check is managed by a policy
+
+
+
+
+ This check is overriden by a policy
+
+
+
+
+
+
+
+ Passing
+
+
+
+
+ Informational
+
+
+ Warning
+
+
+ Error
+
+
+
+
+
+
+ {{ truncateText(props.row.readable_desc, 40) }}
+ {{
+ props.row.readable_desc
+ }}
+
+
+
+ Show Run History
+
+ Last Output
+ Last Output
+ Last Output
+ {{ props.row.check_result.more_info }}
+
+ {{
+ props.row.check_result.last_run
+ ? formatDate(props.row.check_result.last_run)
+ : "Never"
+ }}
+ {{ props.row.assignedtasks.length }} Tasks
+ {{
+ props.row.assignedtasks[0].name
+ }}
+
+
+
+
+
+
+
+
diff --git a/web/src/components/agents/DebugTab.vue b/web/src/components/agents/DebugTab.vue
index 591d259b..f8623053 100644
--- a/web/src/components/agents/DebugTab.vue
+++ b/web/src/components/agents/DebugTab.vue
@@ -30,4 +30,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/HistoryTab.vue b/web/src/components/agents/HistoryTab.vue
index 8591775f..26dcd3a4 100644
--- a/web/src/components/agents/HistoryTab.vue
+++ b/web/src/components/agents/HistoryTab.vue
@@ -2,7 +2,10 @@
No agent selected
-
+
@@ -80,7 +90,7 @@ const columns = [
field: "type",
align: "left",
sortable: true,
- format: (val, row) => formatTableColumnText(val),
+ format: (val) => formatTableColumnText(val),
},
/* {
name: "status",
@@ -93,13 +103,28 @@ const columns = [
{
name: "command",
label: "Script/Command",
- field: row => (row.type === "script_run" || row.type === "task_run" ? row.script_name : row.command),
+ field: (row) =>
+ row.type === "script_run" || row.type === "task_run"
+ ? row.script_name
+ : row.command,
+ align: "left",
+ sortable: true,
+ format: (val) => truncateText(val, 30),
+ },
+ {
+ name: "username",
+ label: "Initiated By",
+ field: "username",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "output",
+ label: "Output",
+ field: "output",
align: "left",
sortable: true,
- format: (val, row) => truncateText(val, 30),
},
- { name: "username", label: "Initiated By", field: "username", align: "left", sortable: true },
- { name: "output", label: "Output", field: "output", align: "left", sortable: true },
];
export default {
@@ -126,7 +151,7 @@ export default {
loading.value = false;
}
- watch(selectedAgent, (newValue, oldValue) => {
+ watch(selectedAgent, (newValue) => {
if (newValue) {
getHistory();
}
@@ -185,4 +210,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/NotesTab.vue b/web/src/components/agents/NotesTab.vue
index c4e6768d..edee5bef 100644
--- a/web/src/components/agents/NotesTab.vue
+++ b/web/src/components/agents/NotesTab.vue
@@ -16,8 +16,23 @@
no-data-label="No notes"
>
-
-
+
+
@@ -31,21 +46,31 @@
-
{{ formatDate(props.row.entry_time) }}
+
+ {{ formatDate(props.row.entry_time) }}
+
{{ props.row.username }}
-
+
Edit
-
+
@@ -71,7 +96,12 @@
import { ref, computed, watch, onMounted } from "vue";
import { useStore } from "vuex";
import { useQuasar } from "quasar";
-import { fetchAgentNotes, editAgentNote, saveAgentNote, removeAgentNote } from "@/api/agents";
+import {
+ fetchAgentNotes,
+ editAgentNote,
+ saveAgentNote,
+ removeAgentNote,
+} from "@/api/agents";
import { notifySuccess } from "@/utils/notify";
// ui imports
@@ -101,7 +131,7 @@ export default {
components: {
ExportTableBtn,
},
- setup(props) {
+ setup() {
// setup vuex
const store = useStore();
const selectedAgent = computed(() => store.state.selectedRow);
@@ -134,7 +164,7 @@ export default {
prompt: {
model: noteText,
type: "textarea",
- isValid: val => !!val,
+ isValid: (val) => !!val,
},
style: "width: 30vw; max-width: 50vw;",
ok: { label: "Add" },
@@ -142,7 +172,10 @@ export default {
}).onOk(async () => {
loading.value = true;
try {
- const result = await saveAgentNote({ agent_id: selectedAgent.value, note: noteText.value });
+ const result = await saveAgentNote({
+ agent_id: selectedAgent.value,
+ note: noteText.value,
+ });
notifySuccess(result);
await getNotes();
} catch (e) {
@@ -158,12 +191,12 @@ export default {
prompt: {
model: note.note,
type: "textarea",
- isValid: val => !!val,
+ isValid: (val) => !!val,
},
style: "width: 30vw; max-width: 50vw;",
ok: { label: "Save" },
cancel: true,
- }).onOk(async data => {
+ }).onOk(async (data) => {
loading.value = true;
try {
const result = await editAgentNote(note.pk, { note: data });
@@ -194,7 +227,7 @@ export default {
});
}
- watch(selectedAgent, (newValue, oldValue) => {
+ watch(selectedAgent, (newValue) => {
if (newValue) {
getNotes();
}
@@ -231,4 +264,4 @@ export default {
.notes-card
width: 100%
max-width: 20vw
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/SoftwareTab.vue b/web/src/components/agents/SoftwareTab.vue
index 3ff24485..aed05bda 100644
--- a/web/src/components/agents/SoftwareTab.vue
+++ b/web/src/components/agents/SoftwareTab.vue
@@ -5,7 +5,10 @@
-
-
+
+
-
+
@@ -73,7 +98,7 @@ const columns = [
label: "Installed On",
field: "install_date",
sortable: false,
- format: (val, row) => {
+ format: (val) => {
return val === "01/01/1" || val === "01-1-01" ? "" : val;
},
},
@@ -98,7 +123,7 @@ export default {
components: {
ExportTableBtn,
},
- setup(props) {
+ setup() {
// setup quasar
const $q = useQuasar();
@@ -140,7 +165,7 @@ export default {
});
}
- watch(selectedAgent, (newValue, oldValue) => {
+ watch(selectedAgent, (newValue) => {
if (newValue) {
getSoftware();
}
@@ -170,4 +195,3 @@ export default {
},
};
-
diff --git a/web/src/components/agents/SummaryTab.vue b/web/src/components/agents/SummaryTab.vue
index 88492b86..0d73a459 100644
--- a/web/src/components/agents/SummaryTab.vue
+++ b/web/src/components/agents/SummaryTab.vue
@@ -1,13 +1,27 @@
No agent selected
-
+
-
+
{{ summary.hostname }}
- • Maintenance Mode
+
+ • Maintenance Mode
+
• {{ summary.operating_system }} • Agent v{{ summary.version }}
-
+
{{ summary.checks.passing }} checks passing
-
+
{{ summary.checks.failing }} checks failing
-
+
{{ summary.checks.warning }} checks warning
-
+
{{ summary.checks.info }} checks info
{{ summary.checks.total }} checks awaiting first synchronization {{ summary.checks.total }} checks awaiting first
+ synchronization
No checks
@@ -147,7 +186,12 @@
// composition imports
import { ref, computed, watch, onMounted } from "vue";
import { useStore } from "vuex";
-import { fetchAgent, refreshAgentWMI, runTakeControl, openAgentWindow } from "@/api/agents";
+import {
+ fetchAgent,
+ refreshAgentWMI,
+ runTakeControl,
+ openAgentWindow,
+} from "@/api/agents";
import { notifySuccess } from "@/utils/notify";
// ui imports
@@ -158,7 +202,7 @@ export default {
components: {
AgentActionMenu,
},
- setup(props) {
+ setup() {
// vuex setup
const store = useStore();
const selectedAgent = computed(() => store.state.selectedRow);
@@ -185,6 +229,7 @@ export default {
const entries = Object.entries(summary.value.disks);
const ret = [];
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
for (let [k, v] of entries) {
ret.push(v);
}
@@ -210,13 +255,13 @@ export default {
loading.value = false;
}
- watch(selectedAgent, (newValue, oldValue) => {
+ watch(selectedAgent, (newValue) => {
if (newValue) {
getSummary();
}
});
- watch(refreshSummaryTab, (newValue, oldValue) => {
+ watch(refreshSummaryTab, (newValue) => {
if (newValue && selectedAgent.value) {
getSummary();
}
@@ -245,4 +290,3 @@ export default {
},
};
-
diff --git a/web/src/components/agents/WinUpdateTab.vue b/web/src/components/agents/WinUpdateTab.vue
index 6161fe6c..aa1440f0 100644
--- a/web/src/components/agents/WinUpdateTab.vue
+++ b/web/src/components/agents/WinUpdateTab.vue
@@ -6,7 +6,10 @@
-
-
-
+
+
+
-
+
@@ -78,27 +111,55 @@
-
+
Do Nothing
-
+
Approve
-
+
Ignore
-
+
Inherit
-
+
Installed
-
+
Pending
-
+
Ignored
@@ -108,9 +169,11 @@
{{ !props.row.severity ? "Other" : props.row.severity }}
{{ truncateText(props.row.title, 50) }}
- {{
- truncateText(props.row.description, 50)
- }}
+ {{ truncateText(props.row.description, 50) }}
{{ formatDate(props.row.date_installed) }}
@@ -124,7 +187,12 @@
import { ref, computed, watch, inject, onMounted } from "vue";
import { useStore } from "vuex";
import { useQuasar } from "quasar";
-import { fetchAgentUpdates, editAgentUpdate, runAgentUpdateScan, runAgentUpdateInstall } from "@/api/winupdates";
+import {
+ fetchAgentUpdates,
+ editAgentUpdate,
+ runAgentUpdateScan,
+ runAgentUpdateInstall,
+} from "@/api/winupdates";
import { notifySuccess } from "@/utils/notify";
import { truncateText } from "@/utils/format";
@@ -176,7 +244,7 @@ const columns = [
export default {
name: "WindowsUpdates",
components: { ExportTableBtn },
- setup(props) {
+ setup() {
// setup vuex
const store = useStore();
const selectedAgent = computed(() => store.state.selectedRow);
@@ -243,7 +311,7 @@ export default {
function showUpdateDetails(update) {
let support_urls = "";
- update.more_info_urls.forEach(u => {
+ update.more_info_urls.forEach((u) => {
support_urls += `${u} `;
});
let cats = update.categories.join(", ");
@@ -259,7 +327,7 @@ export default {
});
}
- watch(selectedAgent, (newValue, oldValue) => {
+ watch(selectedAgent, (newValue) => {
if (newValue) {
getUpdates();
}
@@ -295,4 +363,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/WmiDetail.vue b/web/src/components/agents/WmiDetail.vue
index dbd2b2cd..c3cf9930 100644
--- a/web/src/components/agents/WmiDetail.vue
+++ b/web/src/components/agents/WmiDetail.vue
@@ -4,7 +4,9 @@
{{ k }}:
- {{ v }}
+ {{
+ v
+ }}
@@ -21,7 +23,7 @@ import { uid } from "quasar";
export default {
name: "WmiDetail",
props: { info: !Object },
- setup(props) {
+ setup() {
// setup vuex
const store = useStore();
const tabHeight = computed(() => store.state.tabHeight);
@@ -33,4 +35,3 @@ export default {
},
};
-
diff --git a/web/src/components/agents/remotebg/EventLogManager.vue b/web/src/components/agents/remotebg/EventLogManager.vue
index b858523f..08c3acd0 100644
--- a/web/src/components/agents/remotebg/EventLogManager.vue
+++ b/web/src/components/agents/remotebg/EventLogManager.vue
@@ -5,16 +5,28 @@
-
+
- {{ logType }} log total records: {{ events.length }}
+ {{ logType }} log total records: {{ events.length }}
-
+
-
+
-
+
@@ -55,9 +84,11 @@
{{ props.row.eventID }}
{{ props.row.time }}
- {{
- truncateText(props.row.message, 30)
- }}
+ {{ truncateText(props.row.message, 30) }}
@@ -77,11 +108,35 @@ import ExportTableBtn from "@/components/ui/ExportTableBtn";
// static data
const columns = [
- { name: "eventType", label: "Type", field: "eventType", align: "left", sortable: true },
- { name: "source", label: "Source", field: "source", align: "left", sortable: true },
- { name: "eventID", label: "Event ID", field: "eventID", align: "left", sortable: true },
+ {
+ name: "eventType",
+ label: "Type",
+ field: "eventType",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "source",
+ label: "Source",
+ field: "source",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "eventID",
+ label: "Event ID",
+ field: "eventID",
+ align: "left",
+ sortable: true,
+ },
{ name: "time", label: "Time", field: "time", align: "left", sortable: true },
- { name: "message", label: "Message (click to view full)", field: "message", align: "left", sortable: true },
+ {
+ name: "message",
+ label: "Message (click to view full)",
+ field: "message",
+ align: "left",
+ sortable: true,
+ },
];
const lastDaysOptions = [1, 2, 3, 4, 5, 10, 30, 60, 90, 180, 360, 9999];
@@ -112,7 +167,11 @@ export default {
async function getEventLog() {
loading.value = true;
- events.value = await fetchAgentEventLog(props.agent_id, logType.value, days.value);
+ events.value = await fetchAgentEventLog(
+ props.agent_id,
+ logType.value,
+ days.value
+ );
loading.value = false;
}
@@ -149,4 +208,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/agents/remotebg/ProcessManager.vue b/web/src/components/agents/remotebg/ProcessManager.vue
index 0019a811..22764826 100644
--- a/web/src/components/agents/remotebg/ProcessManager.vue
+++ b/web/src/components/agents/remotebg/ProcessManager.vue
@@ -1,7 +1,10 @@
-
-
+
+
@@ -29,10 +48,23 @@
size="sm"
color="grey"
/>
-
+
-
+
Refresh interval (seconds)
@@ -43,13 +75,21 @@
-
+
-
+
@@ -73,7 +113,11 @@
\ No newline at end of file
+
diff --git a/web/src/components/agents/remotebg/ServiceDetail.vue b/web/src/components/agents/remotebg/ServiceDetail.vue
index c2951fb9..96fac5de 100644
--- a/web/src/components/agents/remotebg/ServiceDetail.vue
+++ b/web/src/components/agents/remotebg/ServiceDetail.vue
@@ -1,4 +1,4 @@
-
+
@@ -23,7 +23,9 @@
Description:
- {{ service.description }}
+ {{
+ service.description
+ }}
@@ -61,7 +63,10 @@
-
+
@@ -86,7 +91,10 @@
// composition imports
import { ref, computed, onMounted } from "vue";
import { useDialogPluginComponent } from "quasar";
-import { editAgentServiceStartType, sendAgentServiceAction } from "@/api/services";
+import {
+ editAgentServiceStartType,
+ sendAgentServiceAction,
+} from "@/api/services";
import { notifySuccess } from "@/utils/notify";
// static data
@@ -124,7 +132,10 @@ export default {
const loading = ref(false);
const startupTypeEdited = computed(() => {
- if (props.service.start_type.toLowerCase() === "automatic" && props.service.autodelay)
+ if (
+ props.service.start_type.toLowerCase() === "automatic" &&
+ props.service.autodelay
+ )
return startupType.value !== "autodelay";
else return props.service.start_type.toLowerCase() !== startupType.value;
});
@@ -132,7 +143,11 @@ export default {
async function sendServiceAction(service, action) {
loading.value = true;
try {
- const result = await sendAgentServiceAction(props.agent_id, service.name, { sv_action: action });
+ const result = await sendAgentServiceAction(
+ props.agent_id,
+ service.name,
+ { sv_action: action }
+ );
notifySuccess(result);
onDialogOK();
} catch (e) {
@@ -143,12 +158,17 @@ export default {
async function editServiceStartup() {
const data = {
- startType: startupType.value === "automatic" ? "auto" : startupType.value,
+ startType:
+ startupType.value === "automatic" ? "auto" : startupType.value,
};
loading.value = true;
try {
- const result = await editAgentServiceStartType(props.agent_id, props.service.name, data);
+ const result = await editAgentServiceStartType(
+ props.agent_id,
+ props.service.name,
+ data
+ );
notifySuccess(result);
onDialogOK();
} catch (e) {
@@ -158,7 +178,10 @@ export default {
}
onMounted(() => {
- if (props.service.start_type.toLowerCase() === "automatic" && props.service.autodelay)
+ if (
+ props.service.start_type.toLowerCase() === "automatic" &&
+ props.service.autodelay
+ )
startupType.value = "autodelay";
else startupType.value = props.service.start_type.toLowerCase();
});
diff --git a/web/src/components/agents/remotebg/ServicesManager.vue b/web/src/components/agents/remotebg/ServicesManager.vue
index f263ab53..608e5408 100644
--- a/web/src/components/agents/remotebg/ServicesManager.vue
+++ b/web/src/components/agents/remotebg/ServicesManager.vue
@@ -5,7 +5,10 @@
-
+
-
+
@@ -57,13 +69,18 @@
{{ props.row.name }}
{{
- props.row.start_type.toLowerCase() === "automatic" && props.row.autodelay
+ props.row.start_type.toLowerCase() === "automatic" &&
+ props.row.autodelay
? `${props.row.start_type} (Delayed)`
: `${props.row.start_type}`
}}
- {{ props.row.pid === 0 ? "" : props.row.pid }}
+ {{
+ props.row.pid === 0 ? "" : props.row.pid
+ }}
{{ props.row.status }}
- {{ props.row.username ? props.row.username : "LocalSystem" }}
+ {{
+ props.row.username ? props.row.username : "LocalSystem"
+ }}
@@ -185,7 +202,11 @@ export default {
loading.value = true;
try {
- const result = await sendAgentServiceAction(props.agent_id, service.name, { sv_action: action });
+ const result = await sendAgentServiceAction(
+ props.agent_id,
+ service.name,
+ { sv_action: action }
+ );
notifySuccess(result);
await getServices();
} catch (e) {
@@ -218,4 +239,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/automation/AutomationManager.vue b/web/src/components/automation/AutomationManager.vue
index 5100f31d..71f4b0e9 100644
--- a/web/src/components/automation/AutomationManager.vue
+++ b/web/src/components/automation/AutomationManager.vue
@@ -1,494 +1,586 @@
-
-
-
-
-
- Automation Manager
-
-
- Close
-
-
-
-
-
-
-
-
-
-
-
-
-
- Enable Policy
-
-
-
-
-
-
-
- Enforce Policy (Will override Agent tasks/checks)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Edit
-
-
-
-
-
-
- Copy
-
-
-
-
-
-
- Delete
-
-
-
-
-
-
-
-
- Show Relations
-
-
-
-
-
-
- Policy Exclusions
-
-
-
-
-
-
- {{ patchPolicyText(props.row) }}
-
-
-
-
-
-
- {{ alertTemplateText(props.row) }}
-
-
-
-
-
- Close
-
-
-
-
-
-
-
-
-
-
-
-
- {{ props.row.name }}
- Default Server
- Default Workstation
-
- {{ props.row.desc }}
-
- {{ `Show Relations (${props.row.agents_count})` }}
-
-
- {{
- `Show Policy Exclusions (${
- props.row.excluded_agents.length +
- props.row.excluded_clients.length +
- props.row.excluded_sites.length
- })`
- }}
-
-
- {{ patchPolicyText(props.row) }}
-
-
- {{ alertTemplateText(props.row) }}
-
-
-
- Create a copy of this policy
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+
+ Automation Manager
+
+
+ Close
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Enable Policy
+
+
+
+
+
+
+
+ Enforce Policy (Will override Agent
+ tasks/checks)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Edit
+
+
+
+
+
+
+ Copy
+
+
+
+
+
+
+ Delete
+
+
+
+
+
+
+
+
+ Show Relations
+
+
+
+
+
+
+ Policy Exclusions
+
+
+
+
+
+
+ {{
+ patchPolicyText(props.row)
+ }}
+
+
+
+
+
+
+ {{
+ alertTemplateText(props.row)
+ }}
+
+
+
+
+
+ Close
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.row.name }}
+ Default Server
+ Default Workstation
+
+ {{ props.row.desc }}
+
+ {{ `Show Relations (${props.row.agents_count})` }}
+
+
+ {{
+ `Show Policy Exclusions (${
+ props.row.excluded_agents.length +
+ props.row.excluded_clients.length +
+ props.row.excluded_sites.length
+ })`
+ }}
+
+
+ {{ patchPolicyText(props.row) }}
+
+
+ {{ alertTemplateText(props.row) }}
+
+
+
+ Create a copy of this policy
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/automation/PolicyAutomatedTasksTab.vue b/web/src/components/automation/PolicyAutomatedTasksTab.vue
index f9db819e..c01e60b3 100644
--- a/web/src/components/automation/PolicyAutomatedTasksTab.vue
+++ b/web/src/components/automation/PolicyAutomatedTasksTab.vue
@@ -1,10 +1,30 @@
-
-
+
+
- Click on a policy to see the tasks
+ Click on a policy to see the tasks
There are no tasks added to this policy
@@ -62,7 +84,7 @@
-
+
@@ -73,7 +95,11 @@
Run task now
-
+
@@ -102,7 +128,9 @@
@@ -110,7 +138,9 @@
@@ -118,7 +148,9 @@
@@ -126,14 +158,24 @@
-
- The task updates a custom field on the agent
+
+ The task updates a custom field on the agent
{{ props.row.name }}
@@ -173,8 +215,20 @@ export default {
{ name: "smsalert", field: "text_alert", align: "left" },
{ name: "emailalert", field: "email_alert", align: "left" },
{ name: "dashboardalert", field: "dashboard_alert", align: "left" },
- { name: "collector", label: "Collector", field: "custom_field", align: "left", sortable: true },
- { name: "name", label: "Name", field: "name", align: "left", sortable: true },
+ {
+ name: "collector",
+ label: "Collector",
+ field: "custom_field",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "name",
+ label: "Name",
+ field: "name",
+ align: "left",
+ sortable: true,
+ },
{
name: "schedule",
label: "Schedule",
@@ -214,23 +268,23 @@ export default {
this.$q.loading.show();
this.$axios
.get(`/automation/policies/${this.selectedPolicy}/tasks/`)
- .then(r => {
+ .then((r) => {
this.tasks = r.data;
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
editTask(task, data) {
this.$axios
.put(`/tasks/${task.id}/`, data)
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.notifySuccess(r.data);
this.getTasks();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -266,18 +320,20 @@ export default {
},
runTask(task) {
if (!task.enabled) {
- this.notifyError("Task cannot be run when it's disabled. Enable it first.");
+ this.notifyError(
+ "Task cannot be run when it's disabled. Enable it first."
+ );
return;
}
this.$q.loading.show();
this.$axios
.post(`/automation/tasks/${task.id}/run/`)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.notifySuccess("The task was initated on all affected agents");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -293,12 +349,12 @@ export default {
this.$q.loading.show();
this.$axios
.delete(`/tasks/${task.id}/`)
- .then(r => {
+ .then(() => {
this.getTasks();
this.$q.loading.hide();
this.notifySuccess("Task was deleted successfully");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -309,4 +365,3 @@ export default {
},
};
-
diff --git a/web/src/components/automation/PolicyChecksTab.vue b/web/src/components/automation/PolicyChecksTab.vue
index b610dd70..b52dc99a 100644
--- a/web/src/components/automation/PolicyChecksTab.vue
+++ b/web/src/components/automation/PolicyChecksTab.vue
@@ -1,8 +1,23 @@
-
-
+
+
@@ -50,7 +65,10 @@
- Click on a policy to see the checks
+ Click on a policy to see the checks
There are no checks added to this policy
@@ -96,11 +116,19 @@
-
+
-
+
@@ -115,7 +143,11 @@
-
+
@@ -133,21 +165,31 @@
@@ -160,8 +202,12 @@
>See Status
- {{ props.row.assignedtasks.length }} Tasks
- {{ props.row.assignedtasks[0].name }}
+ {{ props.row.assignedtasks.length }} Tasks
+ {{
+ props.row.assignedtasks[0].name
+ }}
@@ -194,9 +240,21 @@ export default {
{ name: "smsalert", field: "text_alert", align: "left" },
{ name: "emailalert", field: "email_alert", align: "left" },
{ name: "dashboardalert", field: "dashboard_alert", align: "left" },
- { name: "desc", field: "readable_desc", label: "Description", align: "left", sortable: true },
+ {
+ name: "desc",
+ field: "readable_desc",
+ label: "Description",
+ align: "left",
+ sortable: true,
+ },
{ name: "status", label: "Status", field: "status", align: "left" },
- { name: "assigned_task", label: "Assigned Tasks", field: "assigned_task", align: "left", sortable: true },
+ {
+ name: "assigned_task",
+ label: "Assigned Tasks",
+ field: "assigned_task",
+ align: "left",
+ sortable: true,
+ },
],
pagination: {
rowsPerPage: 0,
@@ -215,11 +273,11 @@ export default {
this.$q.loading.show();
this.$axios
.get(`/automation/policies/${this.selectedPolicy}/checks/`)
- .then(r => {
+ .then((r) => {
this.checks = r.data;
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -240,7 +298,7 @@ export default {
const color = !action ? "positive" : "warning";
this.$axios
.put(`/checks/${id}/`, data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.$q.notify({
color: color,
@@ -248,7 +306,7 @@ export default {
message: `${alert_type} alerts ${act}`,
});
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -263,12 +321,12 @@ export default {
this.$q.loading.show();
this.$axios
.delete(`/checks/${check.id}/`)
- .then(r => {
+ .then(() => {
this.getChecks();
this.$q.loading.hide();
this.notifySuccess("Check Deleted!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -310,4 +368,3 @@ export default {
},
};
-
diff --git a/web/src/components/automation/PolicyOverview.vue b/web/src/components/automation/PolicyOverview.vue
index cb1720d7..3ce2ad49 100644
--- a/web/src/components/automation/PolicyOverview.vue
+++ b/web/src/components/automation/PolicyOverview.vue
@@ -2,7 +2,14 @@
- Policy Overview
+ Policy Overview
Close
@@ -36,7 +43,12 @@
-
+
{
+ .then((r) => {
this.processTreeDataFromApi(r.data);
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -152,7 +164,8 @@ export default {
disabled = " (disabled)";
}
- const label = client.workstation_policy.name + " (Workstations)" + disabled;
+ const label =
+ client.workstation_policy.name + " (Workstations)" + disabled;
client_temp["children"].push({
label: label,
icon: "policy",
@@ -201,7 +214,8 @@ export default {
disabled = " (disabled)";
}
- const label = site.workstation_policy.name + " (Workstations)" + disabled;
+ const label =
+ site.workstation_policy.name + " (Workstations)" + disabled;
site_temp["children"].push({
label: label,
icon: "policy",
diff --git a/web/src/components/automation/modals/PolicyAdd.vue b/web/src/components/automation/modals/PolicyAdd.vue
index 6ea20bce..a4cde74e 100644
--- a/web/src/components/automation/modals/PolicyAdd.vue
+++ b/web/src/components/automation/modals/PolicyAdd.vue
@@ -42,16 +42,29 @@
filterable
/>
-
- This {{ type }} will not inherit from higher policies
+
+ This {{ type }} will not inherit from higher policies
- No Automation Policies have been setup. Go to Settings > Automation Manager
+ No Automation Policies have been setup. Go to Settings > Automation
+ Manager
-
+
@@ -142,12 +155,12 @@ export default {
this.$axios
.put(url, data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Policies Updated Successfully!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -155,15 +168,15 @@ export default {
this.$q.loading.show();
this.$axios
.get("/automation/policies/")
- .then(r => {
- this.options = r.data.map(policy => ({
+ .then((r) => {
+ this.options = r.data.map((policy) => ({
label: policy.name,
value: policy.id,
}));
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -194,4 +207,4 @@ export default {
}
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/automation/modals/PolicyExclusions.vue b/web/src/components/automation/modals/PolicyExclusions.vue
index 67954123..84705924 100644
--- a/web/src/components/automation/modals/PolicyExclusions.vue
+++ b/web/src/components/automation/modals/PolicyExclusions.vue
@@ -77,12 +77,12 @@ export default {
onSubmit() {
this.$axios
.put(`automation/policies/${this.policy.id}/`, this.localPolicy)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Policy exclusions added");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -90,12 +90,17 @@ export default {
this.$q.loading.show();
this.$axios
.get("/clients/")
- .then(r => {
- this.clientOptions = r.data.map(client => ({ label: client.name, value: client.id }));
+ .then((r) => {
+ this.clientOptions = r.data.map((client) => ({
+ label: client.name,
+ value: client.id,
+ }));
- r.data.forEach(client => {
+ r.data.forEach((client) => {
this.siteOptions.push({ category: client.name });
- client.sites.forEach(site => this.siteOptions.push({ label: site.name, value: site.id }));
+ client.sites.forEach((site) =>
+ this.siteOptions.push({ label: site.name, value: site.id })
+ );
});
this.$q.loading.hide();
})
@@ -104,7 +109,9 @@ export default {
});
},
getOptions() {
- this.getAgentOptions("id").then(options => (this.agentOptions = Object.freeze(options)));
+ this.getAgentOptions("id").then(
+ (options) => (this.agentOptions = Object.freeze(options))
+ );
this.getClientsandSites();
},
show() {
@@ -131,4 +138,4 @@ export default {
this.getOptions();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/automation/modals/PolicyForm.vue b/web/src/components/automation/modals/PolicyForm.vue
index 47269207..5c535936 100644
--- a/web/src/components/automation/modals/PolicyForm.vue
+++ b/web/src/components/automation/modals/PolicyForm.vue
@@ -18,7 +18,12 @@
Name:
-
+
@@ -85,12 +90,12 @@ export default {
if (this.editing) {
this.$axios
.put(`/automation/policies/${data.id}/`, data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Policy edited!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
} else {
@@ -100,12 +105,14 @@ export default {
this.$axios
.post("/automation/policies/", data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
- this.notifySuccess("Policy added. Now you can add Tasks and Checks!");
+ this.notifySuccess(
+ "Policy added. Now you can add Tasks and Checks!"
+ );
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
}
@@ -135,4 +142,4 @@ export default {
}
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/automation/modals/PolicyStatus.vue b/web/src/components/automation/modals/PolicyStatus.vue
index 3256720e..c5548a11 100644
--- a/web/src/components/automation/modals/PolicyStatus.vue
+++ b/web/src/components/automation/modals/PolicyStatus.vue
@@ -1,244 +1,296 @@
-
-
-
-
- {{ title.slice(0, 27) }}
-
-
- Close
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ props.row.hostname }}
-
-
-
- Passing
-
-
-
-
- Informational
-
-
- Warning
-
-
- Error
-
-
-
-
- Awaiting First Synchronization
- Will sync on next agent checkin
- Synced with agent
- Pending deletion on agent
- Waiting for task creation on agent
-
-
-
- output
-
-
- output
-
-
- output
-
- {{
- props.row.history_info
- }}
- {{ props.row.more_info }}
- Awaiting Output
-
- {{ props.row.last_run ? formatDate(props.row.last_run) : "Never" }}
-
-
-
-
-
-
-
-
-
+
+
+
+
+ {{ title.slice(0, 27) }}
+
+
+ Close
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ props.row.hostname }}
+
+
+
+ Passing
+
+
+
+
+ Informational
+
+
+ Warning
+
+
+ Error
+
+
+
+
+ Awaiting First Synchronization
+ Will sync on next agent checkin
+ Synced with agent
+ Pending deletion on agent
+ Waiting for task creation on agent
+
+
+
+ output
+
+
+ output
+
+
+ output
+
+ {{ props.row.history_info }}
+ {{
+ props.row.more_info
+ }}
+ Awaiting Output
+
+ {{
+ props.row.last_run ? formatDate(props.row.last_run) : "Never"
+ }}
+
+
+
+
+
+
+
+
+
diff --git a/web/src/components/automation/modals/RelationsView.vue b/web/src/components/automation/modals/RelationsView.vue
index 4b794524..45a76436 100644
--- a/web/src/components/automation/modals/RelationsView.vue
+++ b/web/src/components/automation/modals/RelationsView.vue
@@ -10,13 +10,17 @@
- This policy is set as the Default Server Policy.
+ This policy
+ is set as the Default Server Policy.
- This policy is set as the Default Workstation Policy.
+ This policy
+ is set as the Default Workstation Policy.
@@ -41,7 +45,10 @@
-
+
{{ item.name }}
@@ -51,7 +58,10 @@
-
+
{{ item.name }}
@@ -66,7 +76,10 @@
-
+
{{ item.name }}
{{ item.client_name }}
@@ -77,7 +90,10 @@
-
+
{{ item.name }}
{{ item.client_name }}
@@ -150,13 +166,13 @@ export default {
this.$axios
.get(`/automation/policies/${this.policy.id}/related/`)
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.related = r.data;
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/CpuLoadCheck.vue b/web/src/components/checks/CpuLoadCheck.vue
index f4eaf0d1..c2ef1f0f 100644
--- a/web/src/components/checks/CpuLoadCheck.vue
+++ b/web/src/components/checks/CpuLoadCheck.vue
@@ -17,7 +17,10 @@
type="number"
v-model.number="state.warning_threshold"
label="Warning Threshold (%)"
- :rules="[val => val >= 0 || 'Minimum threshold is 0', val => val < 100 || 'Maximum threshold is 99']"
+ :rules="[
+ (val) => val >= 0 || 'Minimum threshold is 0',
+ (val) => val < 100 || 'Maximum threshold is 99',
+ ]"
/>
@@ -27,7 +30,10 @@
type="number"
v-model.number="state.error_threshold"
label="Error Threshold (%)"
- :rules="[val => val >= 0 || 'Minimum threshold is 0', val => val < 100 || 'Maximum threshold is 99']"
+ :rules="[
+ (val) => val >= 0 || 'Minimum threshold is 0',
+ (val) => val < 100 || 'Maximum threshold is 99',
+ ]"
/>
@@ -53,7 +59,14 @@
-
+
@@ -107,4 +120,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/DiskSpaceCheck.vue b/web/src/components/checks/DiskSpaceCheck.vue
index 3a65a71c..e4ceb5c3 100644
--- a/web/src/components/checks/DiskSpaceCheck.vue
+++ b/web/src/components/checks/DiskSpaceCheck.vue
@@ -19,7 +19,7 @@
v-model="state.disk"
:options="diskOptions"
label="Disk"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
@@ -29,7 +29,10 @@
type="number"
v-model.number="state.warning_threshold"
label="Warning Threshold Remaining (%)"
- :rules="[val => val >= 0 || 'Minimum threshold is 0', val => val < 100 || 'Maximum threshold is 99']"
+ :rules="[
+ (val) => val >= 0 || 'Minimum threshold is 0',
+ (val) => val < 100 || 'Maximum threshold is 99',
+ ]"
/>
@@ -39,7 +42,10 @@
type="number"
v-model.number="state.error_threshold"
label="Error Threshold Remaining (%)"
- :rules="[val => val >= 0 || 'Minimum threshold is 0', val => val < 100 || 'Maximum threshold is 99']"
+ :rules="[
+ (val) => val >= 0 || 'Minimum threshold is 0',
+ (val) => val < 100 || 'Maximum threshold is 99',
+ ]"
/>
@@ -65,7 +71,14 @@
-
+
@@ -121,4 +134,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/EventLogCheck.vue b/web/src/components/checks/EventLogCheck.vue
index 38b6eed9..f02a5565 100644
--- a/web/src/components/checks/EventLogCheck.vue
+++ b/web/src/components/checks/EventLogCheck.vue
@@ -17,7 +17,7 @@
outlined
v-model="state.name"
label="Descriptive Name"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
@@ -48,16 +48,29 @@
outlined
v-model="state.event_id"
label="Event ID (Use * to match every event ID)"
- :rules="[val => validateEventID(val) || 'Invalid Event ID']"
+ :rules="[(val) => validateEventID(val) || 'Invalid Event ID']"
/>
-
+
-
-
+
+
Event Type:
-
-
-
-
-
+
+
+
+
+
@@ -126,7 +164,14 @@
-
+
@@ -152,7 +197,15 @@ export default {
const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
// check logic
- const { state, loading, submit, failOptions, logNameOptions, failWhenOptions, severityOptions } = useCheckModal({
+ const {
+ state,
+ loading,
+ submit,
+ failOptions,
+ logNameOptions,
+ failWhenOptions,
+ severityOptions,
+ } = useCheckModal({
editCheck: props.check,
initialState: {
...props.parent,
@@ -188,17 +241,18 @@ export default {
}
}
- watch(eventMessage, (newValue, oldValue) => {
+ watch(eventMessage, () => {
state.value.event_message = null;
});
- watch(eventSource, (newValue, oldValue) => {
+ watch(eventSource, () => {
state.value.event_source = null;
});
function beforeSubmit() {
// format check data for saving
- state.value.event_id_is_wildcard = state.value.event_id === "*" ? true : false;
+ state.value.event_id_is_wildcard =
+ state.value.event_id === "*" ? true : false;
if (state.value.event_source === "") state.value.event_source = null;
if (state.value.event_message === "") state.value.event_message = null;
@@ -228,4 +282,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/EventLogCheckOutput.vue b/web/src/components/checks/EventLogCheckOutput.vue
index 8bc88b62..0c4265c8 100644
--- a/web/src/components/checks/EventLogCheckOutput.vue
+++ b/web/src/components/checks/EventLogCheckOutput.vue
@@ -12,7 +12,10 @@
-
+
-
+
@@ -50,23 +63,51 @@ import ExportTableBtn from "@/components/ui/ExportTableBtn";
// static data
const columns = [
- { name: "eventType", label: "Type", field: "eventType", align: "left", sortable: true },
- { name: "source", label: "Source", field: "source", align: "left", sortable: true },
- { name: "eventID", label: "Event ID", field: "eventID", align: "left", sortable: true },
+ {
+ name: "eventType",
+ label: "Type",
+ field: "eventType",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "source",
+ label: "Source",
+ field: "source",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "eventID",
+ label: "Event ID",
+ field: "eventID",
+ align: "left",
+ sortable: true,
+ },
{ name: "time", label: "Time", field: "time", align: "left", sortable: true },
- { name: "message", label: "Message", field: "message", align: "left", sortable: true },
+ {
+ name: "message",
+ label: "Message",
+ field: "message",
+ align: "left",
+ sortable: true,
+ },
];
export default {
name: "EventLogCheckOutput",
components: { ExportTableBtn },
emits: [...useDialogPluginComponent.emits],
props: { evtLogData: !Object },
- setup(props) {
+ setup() {
// setup quasar
const { dialogRef, onDialogHide } = useDialogPluginComponent();
const filter = ref("");
- const pagination = ref({ rowsPerPage: 0, sortBy: "time", descending: true });
+ const pagination = ref({
+ rowsPerPage: 0,
+ sortBy: "time",
+ descending: true,
+ });
return {
// reactive data
@@ -82,4 +123,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/MemCheck.vue b/web/src/components/checks/MemCheck.vue
index 2fbd126a..ff760f6b 100644
--- a/web/src/components/checks/MemCheck.vue
+++ b/web/src/components/checks/MemCheck.vue
@@ -17,7 +17,10 @@
type="number"
v-model.number="state.warning_threshold"
label="Warning Threshold (%)"
- :rules="[val => val >= 0 || 'Minimum threshold is 0', val => val < 100 || 'Maximum threshold is 99']"
+ :rules="[
+ (val) => val >= 0 || 'Minimum threshold is 0',
+ (val) => val < 100 || 'Maximum threshold is 99',
+ ]"
/>
@@ -27,7 +30,10 @@
type="number"
v-model.number="state.error_threshold"
label="Error Threshold (%)"
- :rules="[val => val >= 0 || 'Minimum threshold is 0', val => val < 100 || 'Maximum threshold is 99']"
+ :rules="[
+ (val) => val >= 0 || 'Minimum threshold is 0',
+ (val) => val < 100 || 'Maximum threshold is 99',
+ ]"
/>
@@ -53,7 +59,14 @@
-
+
@@ -107,4 +120,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/PingCheck.vue b/web/src/components/checks/PingCheck.vue
index e835898f..10428a80 100644
--- a/web/src/components/checks/PingCheck.vue
+++ b/web/src/components/checks/PingCheck.vue
@@ -17,11 +17,17 @@
dense
v-model="state.name"
label="Descriptive Name"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
-
+
-
+
@@ -84,18 +97,19 @@ export default {
const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
// check logic
- const { state, loading, submit, failOptions, severityOptions } = useCheckModal({
- editCheck: props.check,
- initialState: {
- ...props.parent,
- check_type: "ping",
- name: null,
- ip: null,
- alert_severity: "warning",
- fails_b4_alert: 1,
- run_interval: 0,
- },
- });
+ const { state, loading, submit, failOptions, severityOptions } =
+ useCheckModal({
+ editCheck: props.check,
+ initialState: {
+ ...props.parent,
+ check_type: "ping",
+ name: null,
+ ip: null,
+ alert_severity: "warning",
+ fails_b4_alert: 1,
+ run_interval: 0,
+ },
+ });
return {
// reactive data
@@ -115,23 +129,5 @@ export default {
onDialogOK,
};
},
- data() {
- return {
- pingcheck: {
- check_type: "ping",
- name: null,
- ip: null,
- alert_severity: "warning",
- fails_b4_alert: 1,
- run_interval: 0,
- },
- severityOptions: [
- { label: "Informational", value: "info" },
- { label: "Warning", value: "warning" },
- { label: "Error", value: "error" },
- ],
- failOptions: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
- };
- },
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/ScriptCheck.vue b/web/src/components/checks/ScriptCheck.vue
index 06146fbd..18322d32 100644
--- a/web/src/components/checks/ScriptCheck.vue
+++ b/web/src/components/checks/ScriptCheck.vue
@@ -16,7 +16,7 @@
-
+
-
+
@@ -120,26 +132,27 @@ export default {
const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
// setup script dropdown
- const { script, scriptOptions, defaultTimeout, defaultArgs } = useScriptDropdown(
- props.check ? props.check.script : undefined,
- { onMount: true }
- );
+ const { script, scriptOptions, defaultTimeout, defaultArgs } =
+ useScriptDropdown(props.check ? props.check.script : undefined, {
+ onMount: true,
+ });
// check logic
- const { state, loading, submit, failOptions, severityOptions } = useCheckModal({
- editCheck: props.check,
- initialState: {
- ...props.parent,
- script,
- script_args: defaultArgs,
- timeout: defaultTimeout,
- check_type: "script",
- fails_b4_alert: 1,
- info_return_codes: [],
- warning_return_codes: [],
- run_interval: 0,
- },
- });
+ const { state, loading, submit, failOptions, severityOptions } =
+ useCheckModal({
+ editCheck: props.check,
+ initialState: {
+ ...props.parent,
+ script,
+ script_args: defaultArgs,
+ timeout: defaultTimeout,
+ check_type: "script",
+ fails_b4_alert: 1,
+ info_return_codes: [],
+ warning_return_codes: [],
+ run_interval: 0,
+ },
+ });
return {
// reactive data
@@ -162,4 +175,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/ScriptOutput.vue b/web/src/components/checks/ScriptOutput.vue
index cebf4703..8dd60718 100644
--- a/web/src/components/checks/ScriptOutput.vue
+++ b/web/src/components/checks/ScriptOutput.vue
@@ -47,7 +47,7 @@ export default {
name: "ScriptOutput",
emits: [...useDialogPluginComponent.emits],
props: { scriptInfo: !Object },
- setup(props) {
+ setup() {
// setup vuex
const store = useStore();
const formatDate = computed(() => store.getters.formatDate);
@@ -65,4 +65,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/checks/WinSvcCheck.vue b/web/src/components/checks/WinSvcCheck.vue
index b3748408..547eb6dd 100644
--- a/web/src/components/checks/WinSvcCheck.vue
+++ b/web/src/components/checks/WinSvcCheck.vue
@@ -19,10 +19,15 @@
val="default"
label="Choose from defaults"
/>
-
+
-
+
-
+
-
+
-
+
@@ -132,7 +153,14 @@ export default {
const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
// check logic
- const { state, loading, submit, failOptions, severityOptions, serviceOptions } = useCheckModal({
+ const {
+ state,
+ loading,
+ submit,
+ failOptions,
+ severityOptions,
+ serviceOptions,
+ } = useCheckModal({
editCheck: props.check,
initialState: {
...props.parent,
@@ -151,17 +179,19 @@ export default {
watch(
() => state.value.svc_name,
- (newvalue, oldValue) => {
+ () => {
// prevent error when in manual mode
try {
- state.value.svc_display_name = serviceOptions.value.find(i => i.value === state.value.svc_name).label;
+ state.value.svc_display_name = serviceOptions.value.find(
+ (i) => i.value === state.value.svc_name
+ ).label;
} catch {}
}
);
watch(
() => state.value.svc_policy_mode,
- (newValue, oldValue) => {
+ () => {
state.value.svc_name = null;
state.value.svc_display_name = null;
}
@@ -199,4 +229,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/clients/ClientsForm.vue b/web/src/components/clients/ClientsForm.vue
index 21be0857..f09256ec 100644
--- a/web/src/components/clients/ClientsForm.vue
+++ b/web/src/components/clients/ClientsForm.vue
@@ -15,12 +15,12 @@
dense
v-model="state.name"
label="Name"
- :rules="[val => (val && val.length > 0) || '*Required']"
+ :rules="[(val) => (val && val.length > 0) || '*Required']"
/>
- Custom Fields
+
+ Custom Fields
+
-
+
@@ -67,7 +77,9 @@ export default {
const { dialogRef, onDialogOK, onDialogHide } = useDialogPluginComponent();
// clients form logic
- const state = !!props.client ? ref(Object.assign({}, props.client)) : ref({ name: "" });
+ const state = !!props.client
+ ? ref(Object.assign({}, props.client))
+ : ref({ name: "" });
const site = ref({ name: "" });
const custom_fields = ref({});
const customFields = ref([]);
@@ -78,10 +90,15 @@ export default {
const data = {
client: state.value,
site: site.value,
- custom_fields: formatCustomFields(customFields.value, custom_fields.value),
+ custom_fields: formatCustomFields(
+ customFields.value,
+ custom_fields.value
+ ),
};
try {
- const result = !!props.client ? await editClient(props.client.id, data) : await saveClient(data);
+ const result = !!props.client
+ ? await editClient(props.client.id, data)
+ : await saveClient(data);
notifySuccess(result);
onDialogOK();
} catch (e) {
@@ -95,7 +112,9 @@ export default {
const data = await fetchClient(props.client.id);
for (let field of customFields.value) {
- const value = data.custom_fields.find(value => value.field === field.id);
+ const value = data.custom_fields.find(
+ (value) => value.field === field.id
+ );
if (field.type === "multiple") {
if (value) custom_fields.value[field.name] = value.value;
@@ -113,7 +132,7 @@ export default {
onMounted(async () => {
const fields = await fetchCustomFields({ model: "client" });
- customFields.value = fields.filter(field => !field.hide_in_ui);
+ customFields.value = fields.filter((field) => !field.hide_in_ui);
if (props.client) getClientCustomFieldValues();
});
@@ -134,4 +153,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/clients/ClientsManager.vue b/web/src/components/clients/ClientsManager.vue
index 2030c10d..24be8758 100644
--- a/web/src/components/clients/ClientsManager.vue
+++ b/web/src/components/clients/ClientsManager.vue
@@ -2,7 +2,14 @@
- Clients Manager
+ Clients Manager
Close
@@ -11,7 +18,10 @@
-
+
@@ -35,17 +53,29 @@
-
+
-
+
Edit
-
+
@@ -105,13 +135,18 @@ import SitesTable from "@/components/clients/SitesTable";
const columns = [
{ name: "name", label: "Name", field: "name", align: "left" },
{ name: "sites", label: "Sites", field: "sites", align: "left" },
- { name: "agent_count", label: "Total Agents", field: "agent_count", align: "left" },
+ {
+ name: "agent_count",
+ label: "Total Agents",
+ field: "agent_count",
+ align: "left",
+ },
];
export default {
name: "ClientsManager",
emits: [...useDialogPluginComponent.emits],
- setup(props) {
+ setup() {
// setup quasar dialog
const $q = useQuasar();
const { dialogRef, onDialogHide } = useDialogPluginComponent();
@@ -215,4 +250,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/clients/DeleteClient.vue b/web/src/components/clients/DeleteClient.vue
index 3864169f..7d083c26 100644
--- a/web/src/components/clients/DeleteClient.vue
+++ b/web/src/components/clients/DeleteClient.vue
@@ -10,7 +10,8 @@
- There are no valid sites to move agents to. Add another site and try again
+ There are no valid sites to move agents to. Add another site and try
+ again
@@ -84,7 +88,9 @@ export default {
try {
const result =
props.type === "client"
- ? await removeClient(props.object.id, { move_to_site: site.value })
+ ? await removeClient(props.object.id, {
+ move_to_site: site.value,
+ })
: await removeSite(props.object.id, { move_to_site: site.value });
notifySuccess(result);
onDialogOK();
@@ -102,10 +108,19 @@ export default {
if (props.type === "client") {
// filter out client that is being deleted
- siteOptions.value = Object.freeze(formatSiteOptions(clients.filter(client => client.id !== props.object.id)));
+ siteOptions.value = Object.freeze(
+ formatSiteOptions(
+ clients.filter((client) => client.id !== props.object.id)
+ )
+ );
} else {
// filter out site that is being dleted
- clients.forEach(client => (client.sites = client.sites.filter(site => site.id !== props.object.id)));
+ clients.forEach(
+ (client) =>
+ (client.sites = client.sites.filter(
+ (site) => site.id !== props.object.id
+ ))
+ );
siteOptions.value = Object.freeze(formatSiteOptions(clients));
}
}
@@ -127,4 +142,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/clients/Deployment.vue b/web/src/components/clients/DeploymentTable.vue
similarity index 76%
rename from web/src/components/clients/Deployment.vue
rename to web/src/components/clients/DeploymentTable.vue
index 6d17ced0..8a5376ca 100644
--- a/web/src/components/clients/Deployment.vue
+++ b/web/src/components/clients/DeploymentTable.vue
@@ -2,7 +2,14 @@
-
+
Manage Deployments
@@ -11,7 +18,10 @@
-
+
@@ -48,13 +62,20 @@
{{ props.row.site_name }}
{{ props.row.mon_type }}
64 bit 32 bit 64 bit 32 bit
- {{ formatDate(props.row.expiry) }}
- {{ formatDate(props.row.created) }}
+ {{
+ formatDate(props.row.expiry)
+ }}
+ {{
+ formatDate(props.row.created)
+ }}
- {{ props.row.install_flags }}
+ {{
+ props.row.install_flags
+ }}
\ No newline at end of file
+
diff --git a/web/src/components/clients/NewDeployment.vue b/web/src/components/clients/NewDeployment.vue
index 919164bc..01688e7a 100644
--- a/web/src/components/clients/NewDeployment.vue
+++ b/web/src/components/clients/NewDeployment.vue
@@ -10,7 +10,7 @@
Agent Type
-
-
+
+
-
+
@@ -44,7 +60,14 @@
-
+
@@ -57,7 +80,10 @@ import { useDialogPluginComponent, date } from "quasar";
import { useSiteDropdown } from "@/composables/clients";
import { saveDeployment } from "@/api/clients";
import { notifySuccess } from "@/utils/notify";
-import { formatDateInputField, formatDateStringwithTimezone } from "@/utils/format";
+import {
+ formatDateInputField,
+ formatDateStringwithTimezone,
+} from "@/utils/format";
// ui imports
import TacticalDropdown from "@/components/ui/TacticalDropdown";
@@ -67,7 +93,7 @@ export default {
TacticalDropdown,
},
emits: [...useDialogPluginComponent.emits],
- setup(props) {
+ setup() {
// setup quasar dialog
const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
@@ -94,7 +120,8 @@ export default {
...state.value,
};
- if (data.expires) data.expires = formatDateStringwithTimezone(data.expires);
+ if (data.expires)
+ data.expires = formatDateStringwithTimezone(data.expires);
try {
const result = await saveDeployment(data);
@@ -121,4 +148,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/clients/SitesForm.vue b/web/src/components/clients/SitesForm.vue
index e38efbae..3e2cdd03 100644
--- a/web/src/components/clients/SitesForm.vue
+++ b/web/src/components/clients/SitesForm.vue
@@ -16,22 +16,38 @@
:options="clientOptions"
outlined
mapOptions
- :rules="[val => !!val || 'Client is required']"
+ :rules="[(val) => !!val || 'Client is required']"
filterable
/>
-
+
- Custom Fields
+
+ Custom Fields
+
-
+
@@ -72,7 +88,9 @@ export default {
const { clientOptions } = useClientDropdown(true);
// sites for logic
- const state = !!props.site ? ref(Object.assign({}, props.site)) : ref({ client: props.client, name: "" });
+ const state = !!props.site
+ ? ref(Object.assign({}, props.site))
+ : ref({ client: props.client, name: "" });
const custom_fields = ref({});
const customFields = ref([]);
const loading = ref(false);
@@ -81,10 +99,15 @@ export default {
loading.value = true;
const data = {
site: state.value,
- custom_fields: formatCustomFields(customFields.value, custom_fields.value),
+ custom_fields: formatCustomFields(
+ customFields.value,
+ custom_fields.value
+ ),
};
try {
- const result = !!props.site ? await editSite(props.site.id, data) : await saveSite(data);
+ const result = !!props.site
+ ? await editSite(props.site.id, data)
+ : await saveSite(data);
notifySuccess(result);
onDialogOK();
} catch (e) {
@@ -98,7 +121,9 @@ export default {
const data = await fetchSite(props.site.id);
for (let field of customFields.value) {
- const value = data.custom_fields.find(value => value.field === field.id);
+ const value = data.custom_fields.find(
+ (value) => value.field === field.id
+ );
if (field.type === "multiple") {
if (value) custom_fields.value[field.name] = value.value;
@@ -118,7 +143,7 @@ export default {
$q.loading.show();
try {
const fields = await fetchCustomFields({ model: "site" });
- customFields.value = fields.filter(field => !field.hide_in_ui);
+ customFields.value = fields.filter((field) => !field.hide_in_ui);
if (props.site) getSiteCustomFieldValues();
} catch (e) {
console.error(e);
@@ -143,4 +168,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/clients/SitesTable.vue b/web/src/components/clients/SitesTable.vue
index ae9c27e6..baa77320 100644
--- a/web/src/components/clients/SitesTable.vue
+++ b/web/src/components/clients/SitesTable.vue
@@ -2,7 +2,14 @@
- Sites for {{ client.name }}
+ Sites for {{ client.name }}
Close
@@ -18,13 +25,25 @@
virtual-scroll
:rows-per-page-options="[0]"
no-data-label="No Sites"
- :table-class="{ 'table-bgcolor': !$q.dark.isActive, 'table-bgcolor-dark': $q.dark.isActive }"
+ :table-class="{
+ 'table-bgcolor': !$q.dark.isActive,
+ 'table-bgcolor-dark': $q.dark.isActive,
+ }"
class="settings-tbl-sticky"
style="height: 65vh"
:loading="loading"
>
-
+
@@ -34,17 +53,29 @@
-
+
-
+
Edit
-
+
@@ -85,7 +116,12 @@ import DeleteClient from "@/components/clients/DeleteClient";
// static data
const columns = [
{ name: "name", label: "Name", field: "name", align: "left" },
- { name: "agent_count", label: "Total Agents", field: "agent_count", align: "left" },
+ {
+ name: "agent_count",
+ label: "Total Agents",
+ field: "agent_count",
+ align: "left",
+ },
];
export default {
@@ -182,4 +218,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/core/APIKeysForm.vue b/web/src/components/core/APIKeysForm.vue
index 78c539f0..7720141c 100644
--- a/web/src/components/core/APIKeysForm.vue
+++ b/web/src/components/core/APIKeysForm.vue
@@ -14,7 +14,13 @@
-
+
@@ -48,7 +54,13 @@
-
+
@@ -62,7 +74,10 @@ import { useDialogPluginComponent } from "quasar";
import { saveAPIKey, editAPIKey } from "@/api/accounts";
import { useUserDropdown } from "@/composables/accounts";
import { notifySuccess } from "@/utils/notify";
-import { formatDateInputField, formatDateStringwithTimezone } from "@/utils/format";
+import {
+ formatDateInputField,
+ formatDateStringwithTimezone,
+} from "@/utils/format";
// ui imports
import TacticalDropdown from "@/components/ui/TacticalDropdown.vue";
@@ -80,7 +95,9 @@ export default {
const { userOptions } = useUserDropdown(true);
// setup api key form logic
- const key = props.APIKey ? ref(Object.assign({}, props.APIKey)) : ref({ name: "", expiration: null });
+ const key = props.APIKey
+ ? ref(Object.assign({}, props.APIKey))
+ : ref({ name: "", expiration: null });
const loading = ref(false);
// remove Z from date string
@@ -88,7 +105,9 @@ export default {
key.value.expiration = formatDateInputField(key.value.expiration);
}
- const title = computed(() => (props.APIKey ? "Edit API Key" : "Add API Key"));
+ const title = computed(() =>
+ props.APIKey ? "Edit API Key" : "Add API Key"
+ );
async function submitForm() {
loading.value = true;
@@ -98,10 +117,13 @@ export default {
};
// convert date to local timezone if exists
- if (data.expiration) data.expiration = formatDateStringwithTimezone(data.expiration);
+ if (data.expiration)
+ data.expiration = formatDateStringwithTimezone(data.expiration);
try {
- const result = props.APIKey ? await editAPIKey(data) : await saveAPIKey(data);
+ const result = props.APIKey
+ ? await editAPIKey(data)
+ : await saveAPIKey(data);
onDialogOK();
notifySuccess(result);
loading.value = false;
@@ -128,4 +150,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/core/APIKeysTable.vue b/web/src/components/core/APIKeysTable.vue
index cb19602a..8f7b31cf 100644
--- a/web/src/components/core/APIKeysTable.vue
+++ b/web/src/components/core/APIKeysTable.vue
@@ -3,7 +3,14 @@
-
+
@@ -65,7 +76,11 @@
{{ formatDate(props.row.created_time) }}
-
+
Copy API Key to clipboard
@@ -215,4 +230,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/graphs/CheckGraph.vue b/web/src/components/graphs/CheckGraph.vue
index 4cae7010..b3de2699 100644
--- a/web/src/components/graphs/CheckGraph.vue
+++ b/web/src/components/graphs/CheckGraph.vue
@@ -1,8 +1,18 @@
-
+
-
+
{{ title }}
@@ -112,11 +122,13 @@ export default {
seriesName() {
if (this.check.check_type === "cpuload") return "CPU Load";
else if (this.check.check_type === "memory") return "Memory Usage";
- else if (this.check.check_type === "diskspace") return "Disk Space Remaining";
+ else if (this.check.check_type === "diskspace")
+ return "Disk Space Remaining";
else if (this.check.check_type === "script") return "Script Results";
else if (this.check.check_type === "eventlog") return "Status";
else if (this.check.check_type === "winsvc") return "Status";
else if (this.check.check_type === "ping") return "Status";
+ else return "";
},
},
methods: {
@@ -124,8 +136,10 @@ export default {
this.$q.loading.show();
this.$axios
- .patch(`/checks/${this.check.check_result.id}/history/`, { timeFilter: this.timeFilter })
- .then(r => {
+ .patch(`/checks/${this.check.check_result.id}/history/`, {
+ timeFilter: this.timeFilter,
+ })
+ .then((r) => {
this.history = Object.freeze(r.data);
// save copy of data to reference results in chart tooltip
@@ -139,7 +153,7 @@ export default {
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -208,7 +222,7 @@ export default {
min: 0,
max: 100,
labels: {
- formatter: (val, index) => {
+ formatter: (val) => {
return val + "%";
},
},
@@ -227,7 +241,7 @@ export default {
forceNiceScale: true,
labels: {
minWidth: 50,
- formatter: (val, index) => {
+ formatter: (val) => {
if (val === 0) return "Passing";
else if (val === 1) return "Failing";
else return "";
@@ -238,17 +252,29 @@ export default {
// customize the yaxis tooltip to include more information
this.chartOptions["tooltip"]["y"] = {
title: {
- formatter: val => {
+ formatter: () => {
return "";
},
},
- formatter: (value, { series, seriesIndex, dataPointIndex, w }) => {
+ formatter: (value, { dataPointIndex }) => {
let formatted = "";
if (this.check.check_type === "script") {
- formatted += "Return Code: " + this.results[dataPointIndex].results.retcode + " ";
- formatted += "Std Out: " + this.results[dataPointIndex].results.stdout + " ";
- formatted += "Err Out: " + this.results[dataPointIndex].results.errout + " ";
- formatted += "Execution Time: " + this.results[dataPointIndex].results.execution_time + " ";
+ formatted +=
+ "Return Code: " +
+ this.results[dataPointIndex].results.retcode +
+ " ";
+ formatted +=
+ "Std Out: " +
+ this.results[dataPointIndex].results.stdout +
+ " ";
+ formatted +=
+ "Err Out: " +
+ this.results[dataPointIndex].results.errout +
+ " ";
+ formatted +=
+ "Execution Time: " +
+ this.results[dataPointIndex].results.execution_time +
+ " ";
} else {
formatted += this.results[dataPointIndex].results;
}
diff --git a/web/src/components/logs/AuditLogDetailModal.vue b/web/src/components/logs/AuditLogDetailModal.vue
index 03183695..b37ae35a 100644
--- a/web/src/components/logs/AuditLogDetailModal.vue
+++ b/web/src/components/logs/AuditLogDetailModal.vue
@@ -47,4 +47,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/logs/AuditManager.vue b/web/src/components/logs/AuditManager.vue
index d7b49652..df29904c 100644
--- a/web/src/components/logs/AuditManager.vue
+++ b/web/src/components/logs/AuditManager.vue
@@ -14,8 +14,13 @@
:rows="auditLogs"
:columns="columns"
class="tabs-tbl-sticky"
- :table-class="{ 'table-bgcolor': !$q.dark.isActive, 'table-bgcolor-dark': $q.dark.isActive }"
- :style="{ 'max-height': tabHeight ? tabHeight : `${$q.screen.height - 33}px` }"
+ :table-class="{
+ 'table-bgcolor': !$q.dark.isActive,
+ 'table-bgcolor-dark': $q.dark.isActive,
+ }"
+ :style="{
+ 'max-height': tabHeight ? tabHeight : `${$q.screen.height - 33}px`,
+ }"
row-key="id"
dense
binary-state-sort
@@ -27,7 +32,15 @@
:loading="loading"
>
-
+
-
+
@@ -160,9 +176,27 @@ const columns = [
align: "left",
sortable: true,
},
- { name: "username", label: "Username", field: "username", align: "left", sortable: true },
- { name: "agent", label: "Agent", field: "agent", align: "left", sortable: true },
- { name: "client", label: "Client", field: "site", align: "left", sortable: true },
+ {
+ name: "username",
+ label: "Username",
+ field: "username",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "agent",
+ label: "Agent",
+ field: "agent",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "client",
+ label: "Client",
+ field: "site",
+ align: "left",
+ sortable: true,
+ },
{ name: "site", label: "Site", field: "site", align: "left", sortable: true },
{
name: "action",
@@ -170,7 +204,7 @@ const columns = [
field: "action",
align: "left",
sortable: true,
- format: (val, row) => formatTableColumnText(val),
+ format: (val) => formatTableColumnText(val),
},
{
name: "object_type",
@@ -178,10 +212,22 @@ const columns = [
field: "object_type",
align: "left",
sortable: true,
- format: (val, row) => formatTableColumnText(val),
+ format: (val) => formatTableColumnText(val),
+ },
+ {
+ name: "message",
+ label: "Message",
+ field: "message",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "client_ip",
+ label: "Client IP",
+ field: "ip_address",
+ align: "left",
+ sortable: true,
},
- { name: "message", label: "Message", field: "message", align: "left", sortable: true },
- { name: "client_ip", label: "Client IP", field: "ip_address", align: "left", sortable: true },
];
const agentActionOptions = [
@@ -292,12 +338,17 @@ export default {
pagination: pagination.value,
};
- if (agentFilter.value && agentFilter.value.length > 0) data["agentFilter"] = agentFilter.value;
- else if (clientFilter.value && clientFilter.value.length > 0) data["clientFilter"] = clientFilter.value;
- if (userFilter.value && userFilter.value.length > 0) data["userFilter"] = userFilter.value;
+ if (agentFilter.value && agentFilter.value.length > 0)
+ data["agentFilter"] = agentFilter.value;
+ else if (clientFilter.value && clientFilter.value.length > 0)
+ data["clientFilter"] = clientFilter.value;
+ if (userFilter.value && userFilter.value.length > 0)
+ data["userFilter"] = userFilter.value;
if (timeFilter.value) data["timeFilter"] = timeFilter.value;
- if (actionFilter.value && actionFilter.value.length > 0) data["actionFilter"] = actionFilter.value;
- if (objectFilter.value && objectFilter.value.length > 0) data["objectFilter"] = objectFilter.value;
+ if (actionFilter.value && actionFilter.value.length > 0)
+ data["actionFilter"] = actionFilter.value;
+ if (objectFilter.value && objectFilter.value.length > 0)
+ data["objectFilter"] = objectFilter.value;
try {
const { audit_logs, total } = await fetchAuditLog(data);
auditLogs.value = audit_logs;
@@ -349,7 +400,7 @@ export default {
watch([userFilter, actionFilter, timeFilter], search);
watch(
() => props.agent,
- (newValue, oldValue) => {
+ (newValue) => {
if (newValue) {
agentFilter.value = [props.agent];
search();
@@ -389,14 +440,18 @@ export default {
clientOptions,
agentOptions,
columns,
- actionOptions: props.agent ? [...agentActionOptions] : [...agentActionOptions, ...actionOptions],
+ actionOptions: props.agent
+ ? [...agentActionOptions]
+ : [...agentActionOptions, ...actionOptions],
objectOptions,
timeOptions,
filterTypeOptions,
//computed
tableNoDataText: computed(() =>
- searched.value ? "No data found. Try to refine you search" : "Click search to find audit logs"
+ searched.value
+ ? "No data found. Try to refine you search"
+ : "Click search to find audit logs"
),
// methods
@@ -408,4 +463,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/logs/DebugLog.vue b/web/src/components/logs/DebugLog.vue
index 7713c552..dd9e6ace 100644
--- a/web/src/components/logs/DebugLog.vue
+++ b/web/src/components/logs/DebugLog.vue
@@ -1,16 +1,28 @@
- Debug Log
+ Debug Log
Close
-
+
-
-
-
-
+
+
+
+
-
+
@@ -79,7 +126,7 @@
\ No newline at end of file
+
diff --git a/web/src/components/logs/PendingActions.vue b/web/src/components/logs/PendingActions.vue
index b32d18d5..fcfe0395 100644
--- a/web/src/components/logs/PendingActions.vue
+++ b/web/src/components/logs/PendingActions.vue
@@ -2,14 +2,28 @@
-
- {{ agent ? `Pending Actions for ${agent.hostname}` : "All Pending Actions" }}
+
+ {{
+ agent
+ ? `Pending Actions for ${agent.hostname}`
+ : "All Pending Actions"
+ }}
@@ -63,9 +84,13 @@
- {{ getNextAgentUpdateTime() }}
+ {{
+ getNextAgentUpdateTime()
+ }}
{{
- props.row.action_type === "schedreboot" ? formatDate(props.row.due) : props.row.due
+ props.row.action_type === "schedreboot"
+ ? formatDate(props.row.due)
+ : props.row.due
}}
Completed
@@ -73,7 +98,12 @@
{{ props.row.hostname }}
{{ props.row.client }}
{{ props.row.site }}
-
+
{
try {
- return actions.value.filter(action => action.status === "completed").length;
+ return actions.value.filter((action) => action.status === "completed")
+ .length;
} catch (e) {
console.error(e);
return 0;
@@ -147,7 +206,8 @@ export default {
const filteredActions = computed(() => {
if (showCompleted.value) return actions.value;
- else return actions.value.filter(action => action.status !== "completed");
+ else
+ return actions.value.filter((action) => action.status !== "completed");
});
function showOutput(details) {
@@ -217,4 +277,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/admin/UserForm.vue b/web/src/components/modals/admin/UserForm.vue
index f33435d2..00428a93 100644
--- a/web/src/components/modals/admin/UserForm.vue
+++ b/web/src/components/modals/admin/UserForm.vue
@@ -15,7 +15,7 @@
outlined
dense
v-model="localUser.username"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
class="q-pa-none"
/>
@@ -28,7 +28,7 @@
dense
v-model="localUser.password"
:type="isPwd ? 'password' : 'text'"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
class="q-pa-none"
>
@@ -48,7 +48,7 @@
outlined
dense
v-model="localUser.email"
- :rules="[val => isValidEmail(val) || 'Invalid email']"
+ :rules="[(val) => isValidEmail(val) || 'Invalid email']"
class="q-pa-none"
/>
@@ -68,13 +68,19 @@
Active:
-
+
Role:
No roles have been created. Create some from Settings > Permissions Manager No roles have been created. Create some from Settings >
+ Permissions Manager
-
+
@@ -135,17 +146,17 @@ export default {
return this.user ? "Edit User" : "Add User";
},
...mapState({
- logged_in_user: state => state.username,
+ logged_in_user: (state) => state.username,
}),
},
methods: {
getRoles() {
- this.$axios
- .get("/accounts/roles/")
- .then(r => {
- this.roles = r.data.map(role => ({ label: role.name, value: role.id }));
- })
- .catch(() => {});
+ this.$axios.get("/accounts/roles/").then((r) => {
+ this.roles = r.data.map((role) => ({
+ label: role.name,
+ value: role.id,
+ }));
+ });
},
onSubmit() {
this.$q.loading.show();
@@ -171,7 +182,7 @@ export default {
} else {
this.$axios
.post("/accounts/users/", this.localUser)
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess(`User ${r.data} was added!`);
@@ -201,4 +212,4 @@ export default {
if (this.user) Object.assign(this.localUser, this.user);
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/admin/UserResetPasswordForm.vue b/web/src/components/modals/admin/UserResetPasswordForm.vue
index 5b177ad0..bc993ada 100644
--- a/web/src/components/modals/admin/UserResetPasswordForm.vue
+++ b/web/src/components/modals/admin/UserResetPasswordForm.vue
@@ -15,7 +15,7 @@
dense
v-model="password"
:type="isPwd ? 'password' : 'text'"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
>
{
+ .then(() => {
this.onOk();
this.$q.loading.hide();
this.notifySuccess("User Password Reset!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -83,4 +83,4 @@ export default {
},
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/AgentDownload.vue b/web/src/components/modals/agents/AgentDownload.vue
index 74ff703e..dcb03183 100644
--- a/web/src/components/modals/agents/AgentDownload.vue
+++ b/web/src/components/modals/agents/AgentDownload.vue
@@ -11,7 +11,8 @@
- Download the agent then run the following command from an elevated command prompt on the device you want to add.
+ Download the agent then run the following command from an elevated
+ command prompt on the device you want to add.
@@ -38,15 +39,23 @@
- -local-mesh "C:\\<some folder or path>\\meshagent.exe"
+ -local-mesh "C:\\<some folder or
+ path>\\meshagent.exe"
To skip downloading the Mesh Agent during the install.
- -meshdir "C:\Program Files\Your Company Name\Mesh Agent"
+ -meshdir "C:\Program Files\Your Company Name\Mesh Agent"
- Specify full path to the directory containing MeshAgent.exe if using custom agent branding
+ Specify full path to the directory containing MeshAgent.exe if
+ using custom agent branding
@@ -74,8 +83,15 @@
- Note: the auth token above will be valid for {{ info.expires }} hours.
-
+
+ Note: the auth token above will be valid for {{ info.expires }} hours.
+
+
@@ -88,4 +104,4 @@ export default {
mixins: [mixins],
props: ["info"],
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/AgentRecovery.vue b/web/src/components/modals/agents/AgentRecovery.vue
index be2c6e03..8ad809ff 100644
--- a/web/src/components/modals/agents/AgentRecovery.vue
+++ b/web/src/components/modals/agents/AgentRecovery.vue
@@ -12,18 +12,32 @@
-
+
- Fix issues with the Mesh Agent which handles take control, live terminal and file browser.
+ Fix issues with the Mesh Agent which handles take control, live
+ terminal and file browser.
Fix issues with the Tactical RMM Agent service.
-
+
@@ -57,7 +71,10 @@ export default {
async function sendRecovery() {
loading.value = true;
try {
- const result = await sendAgentRecovery(props.agent.agent_id, state.value);
+ const result = await sendAgentRecovery(
+ props.agent.agent_id,
+ state.value
+ );
notifySuccess(result);
onDialogOK();
} catch (e) {
@@ -80,4 +97,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/BulkAction.vue b/web/src/components/modals/agents/BulkAction.vue
index 01936465..f57450c2 100644
--- a/web/src/components/modals/agents/BulkAction.vue
+++ b/web/src/components/modals/agents/BulkAction.vue
@@ -24,7 +24,7 @@
@@ -132,7 +132,7 @@
label="Command"
stack-label
:placeholder="cmdPlaceholder(state.shell)"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
@@ -145,7 +145,10 @@
style="max-width: 150px"
label="Timeout (seconds)"
stack-label
- :rules="[val => !!val || '*Required', val => val >= 5 || 'Minimum is 5 seconds']"
+ :rules="[
+ (val) => !!val || '*Required',
+ (val) => val >= 5 || 'Minimum is 5 seconds',
+ ]"
/>
@@ -162,14 +165,26 @@
-
- If the agent is offline, a pending action will be created to run on agent checkin
+
+ If the agent is offline, a pending action will be created to run
+ on agent checkin
-
+
@@ -227,7 +242,9 @@ export default {
setup(props) {
// setup vuex store
const store = useStore();
- const showCommunityScripts = computed(() => store.state.showCommunityScripts);
+ const showCommunityScripts = computed(
+ () => store.state.showCommunityScripts
+ );
const shellOptions = computed(() => {
if (state.value.osType === "windows") {
@@ -244,8 +261,10 @@ export default {
});
const filteredOsTypeOptions = computed(() => {
- if (props.mode === "command") return osTypeOptions.filter(i => i.value !== "all");
- else if (props.mode === "patch") return osTypeOptions.filter(i => i.value === "windows");
+ if (props.mode === "command")
+ return osTypeOptions.filter((i) => i.value !== "all");
+ else if (props.mode === "patch")
+ return osTypeOptions.filter((i) => i.value === "windows");
return osTypeOptions;
});
@@ -253,7 +272,13 @@ export default {
const { dialogRef, onDialogHide } = useDialogPluginComponent();
// dropdown setup
- const { script, scriptOptions, defaultTimeout, defaultArgs, getScriptOptions } = useScriptDropdown();
+ const {
+ script,
+ scriptOptions,
+ defaultTimeout,
+ defaultArgs,
+ getScriptOptions,
+ } = useScriptDropdown();
const { agents, agentOptions, getAgentOptions } = useAgentDropdown();
const { site, siteOptions, getSiteOptions } = useSiteDropdown();
const { client, clientOptions, getClientOptions } = useClientDropdown();
@@ -280,7 +305,7 @@ export default {
watch(
() => state.value.target,
- (newValue, oldValue) => {
+ () => {
client.value = null;
site.value = null;
agents.value = [];
@@ -289,7 +314,7 @@ export default {
watch(
() => state.value.osType,
- (newValue, oldValue) => {
+ (newValue) => {
state.value.custom_shell = null;
if (newValue === "windows") {
@@ -329,7 +354,7 @@ export default {
return removeExtraOptionCategories(
scriptOptions.value.filter(
- script =>
+ (script) =>
script.category ||
!script.supported_platforms ||
script.supported_platforms.length === 0 ||
@@ -376,4 +401,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/EditAgent.vue b/web/src/components/modals/agents/EditAgent.vue
index 5d280812..7f672683 100644
--- a/web/src/components/modals/agents/EditAgent.vue
+++ b/web/src/components/modals/agents/EditAgent.vue
@@ -18,7 +18,12 @@
@@ -240,25 +291,28 @@ export default {
// editing patch policy
if (this.editing) {
this.$axios
- .put(`/automation/patchpolicy/${this.winupdatepolicy.id}/`, this.winupdatepolicy)
- .then(response => {
+ .put(
+ `/automation/patchpolicy/${this.winupdatepolicy.id}/`,
+ this.winupdatepolicy
+ )
+ .then(() => {
this.$q.loading.hide();
this.$emit("close");
this.notifySuccess("Patch policy was edited successfully!");
})
- .catch(error => {
+ .catch(() => {
this.$q.loading.hide();
});
} else {
// adding patch policy
this.$axios
.post("/automation/patchpolicy/", this.winupdatepolicy)
- .then(response => {
+ .then(() => {
this.$q.loading.hide();
this.$emit("close");
this.notifySuccess("Patch policy was created successfully!");
})
- .catch(error => {
+ .catch(() => {
this.$q.loading.hide();
});
}
@@ -275,12 +329,12 @@ export default {
this.$q.loading.show();
this.$axios
.delete(`/automation/patchpolicy/${policy.id}/`)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.$emit("close");
this.notifySuccess("Patch policy was deleted successfully!");
})
- .catch(error => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -304,4 +358,4 @@ export default {
}
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/RebootLater.vue b/web/src/components/modals/agents/RebootLater.vue
index df49259a..43465938 100644
--- a/web/src/components/modals/agents/RebootLater.vue
+++ b/web/src/components/modals/agents/RebootLater.vue
@@ -21,7 +21,15 @@
-
+
@@ -55,7 +63,7 @@ export default {
loading.value = true;
try {
- const result = await scheduleAgentReboot(props.agent.agent_id, state.value);
+ await scheduleAgentReboot(props.agent.agent_id, state.value);
$q.dialog({
title: "Reboot pending",
style: "width: 40vw",
@@ -83,4 +91,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/RunScript.vue b/web/src/components/modals/agents/RunScript.vue
index 068a9b0d..0aa33085 100644
--- a/web/src/components/modals/agents/RunScript.vue
+++ b/web/src/components/modals/agents/RunScript.vue
@@ -1,14 +1,36 @@
-
+
Run a script on {{ agent.hostname }}
-
- Minimize
+
+ Minimize
-
- Maximize
+
+ Maximize
Close
@@ -17,7 +39,7 @@
-
-
+
+
@@ -45,15 +78,33 @@
/>
-
+
-
-
+
+
-
+
-
+
-
+
{{ ret }}
@@ -109,7 +173,10 @@ import { useScriptDropdown } from "@/composables/scripts";
import { useCustomFieldDropdown } from "@/composables/core";
import { runScript } from "@/api/agents";
import { notifySuccess } from "@/utils/notify";
-import { formatScriptSyntax, removeExtraOptionCategories } from "@/utils/format";
+import {
+ formatScriptSyntax,
+ removeExtraOptionCategories,
+} from "@/utils/format";
//ui imports
import TacticalDropdown from "@/components/ui/TacticalDropdown";
@@ -136,10 +203,11 @@ export default {
const { dialogRef, onDialogHide } = useDialogPluginComponent();
// setup dropdowns
- const { script, scriptOptions, defaultTimeout, defaultArgs, syntax, link } = useScriptDropdown(props.script, {
- onMount: true,
- filterByPlatform: props.agent.plat,
- });
+ const { script, scriptOptions, defaultTimeout, defaultArgs, syntax, link } =
+ useScriptDropdown(props.script, {
+ onMount: true,
+ filterByPlatform: props.agent.plat,
+ });
const { customFieldOptions } = useCustomFieldDropdown({ onMount: true });
// main run script functionaity
@@ -177,7 +245,7 @@ export default {
const filteredScriptOptions = computed(() => {
return removeExtraOptionCategories(
scriptOptions.value.filter(
- script =>
+ (script) =>
script.category ||
!script.supported_platforms ||
script.supported_platforms.length === 0 ||
@@ -187,7 +255,10 @@ export default {
});
// watchers
- watch([() => state.value.output, () => state.value.emailMode], () => (state.value.emails = []));
+ watch(
+ [() => state.value.output, () => state.value.emailMode],
+ () => (state.value.emails = [])
+ );
return {
// reactive data
@@ -214,4 +285,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/SendCommand.vue b/web/src/components/modals/agents/SendCommand.vue
index c8ad7a33..f055a6ff 100644
--- a/web/src/components/modals/agents/SendCommand.vue
+++ b/web/src/components/modals/agents/SendCommand.vue
@@ -1,6 +1,14 @@
-
-
+
+
Send command on {{ agent.hostname }}
@@ -20,9 +28,27 @@
label="Bash"
@update:model-value="state.custom_shell = null"
/>
-
-
-
+
+
+
@@ -32,7 +58,7 @@
label="Custom shell"
stack-label
placeholder="/usr/bin/python3"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
@@ -45,9 +71,9 @@
label="Timeout (seconds)"
stack-label
:rules="[
- val => !!val || '*Required',
- val => val >= 10 || 'Minimum is 10 seconds',
- val => val <= 3600 || 'Maximum is 3600 seconds',
+ (val) => !!val || '*Required',
+ (val) => val >= 10 || 'Minimum is 10 seconds',
+ (val) => val <= 3600 || 'Maximum is 3600 seconds',
]"
/>
@@ -58,14 +84,26 @@
label="Command"
stack-label
:placeholder="cmdPlaceholder(state.shell)"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
-
+
-
+
{{ ret }}
@@ -128,4 +166,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/agents/UpdateAgents.vue b/web/src/components/modals/agents/UpdateAgents.vue
index c220c5e3..9c5f5d94 100644
--- a/web/src/components/modals/agents/UpdateAgents.vue
+++ b/web/src/components/modals/agents/UpdateAgents.vue
@@ -16,14 +16,32 @@
Select Version
-
+
Select Agent
-
-
+
+
{
+ .then((r) => {
this.versions = r.data.versions;
this.version = r.data.versions[0];
this.agents = r.data.agents;
@@ -72,18 +90,15 @@ export default {
},
update() {
const data = { agent_ids: this.group };
- this.$axios
- .post("/agents/update/", data)
- .then(r => {
- this.$emit("close");
- this.notifySuccess("Agents will now be updated");
- })
- .catch(e => {});
+ this.$axios.post("/agents/update/", data).then(() => {
+ this.$emit("close");
+ this.notifySuccess("Agents will now be updated");
+ });
},
},
computed: {
agentIds() {
- return this.agents.map(k => k.agent_id);
+ return this.agents.map((k) => k.agent_id);
},
agentOptions() {
const options = [];
diff --git a/web/src/components/modals/alerts/AlertExclusions.vue b/web/src/components/modals/alerts/AlertExclusions.vue
index b8b7c96f..8eec3f7d 100644
--- a/web/src/components/modals/alerts/AlertExclusions.vue
+++ b/web/src/components/modals/alerts/AlertExclusions.vue
@@ -47,8 +47,14 @@
-
-
+
+
@@ -90,12 +96,12 @@ export default {
this.$q.loading.show();
this.$axios
.put(`alerts/templates/${this.template.id}/`, this.localTemplate)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Alert Template exclusions added");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -103,12 +109,17 @@ export default {
this.$q.loading.show();
this.$axios
.get("/clients/")
- .then(r => {
- this.clientOptions = r.data.map(client => ({ label: client.name, value: client.id }));
+ .then((r) => {
+ this.clientOptions = r.data.map((client) => ({
+ label: client.name,
+ value: client.id,
+ }));
- r.data.forEach(client => {
+ r.data.forEach((client) => {
this.siteOptions.push({ category: client.name });
- client.sites.forEach(site => this.siteOptions.push({ label: site.name, value: site.id }));
+ client.sites.forEach((site) =>
+ this.siteOptions.push({ label: site.name, value: site.id })
+ );
});
this.$q.loading.hide();
})
@@ -117,7 +128,9 @@ export default {
});
},
getOptions() {
- this.getAgentOptions("id").then(options => (this.agentOptions = Object.freeze(options)));
+ this.getAgentOptions("id").then(
+ (options) => (this.agentOptions = Object.freeze(options))
+ );
this.getClientsandSites();
},
show() {
@@ -141,8 +154,9 @@ export default {
this.localTemplate.excluded_sites = this.template.excluded_sites;
this.localTemplate.excluded_agents = this.template.excluded_agents;
this.localTemplate.exclude_servers = this.template.exclude_servers;
- this.localTemplate.exclude_workstations = this.template.exclude_workstations;
+ this.localTemplate.exclude_workstations =
+ this.template.exclude_workstations;
this.getOptions();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/alerts/AlertTemplateAdd.vue b/web/src/components/modals/alerts/AlertTemplateAdd.vue
index 9f6beab1..d53ba997 100644
--- a/web/src/components/modals/alerts/AlertTemplateAdd.vue
+++ b/web/src/components/modals/alerts/AlertTemplateAdd.vue
@@ -22,10 +22,18 @@
>
- No Alert Templates have been setup. Go to Settings > Alerts Manager
+
+ No Alert Templates have been setup. Go to Settings > Alerts Manager
+
-
+
@@ -86,12 +94,12 @@ export default {
const text = this.selectedTemplate ? "assigned" : "removed";
this.$axios
.put(url, data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess(`Alert Template ${text} successfully!`);
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -99,14 +107,14 @@ export default {
this.$q.loading.show();
this.$axios
.get("/alerts/templates/")
- .then(r => {
- this.options = r.data.map(template => ({
+ .then((r) => {
+ this.options = r.data.map((template) => ({
label: template.name,
value: template.id,
}));
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -129,4 +137,4 @@ export default {
this.selectedTemplate = this.object.alert_template;
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/alerts/AlertTemplateForm.vue b/web/src/components/modals/alerts/AlertTemplateForm.vue
index 39e18bed..eb1994e4 100644
--- a/web/src/components/modals/alerts/AlertTemplateForm.vue
+++ b/web/src/components/modals/alerts/AlertTemplateForm.vue
@@ -8,8 +8,20 @@
Close
-
-
+
+
-
+
- Email Settings (Overrides global email settings)
+
+ Email Settings (Overrides global email settings)
+
-
+
Email recipients
-
+
{{ email }}
-
+
@@ -53,22 +87,39 @@
-
+
- SMS Settings (Overrides global SMS settings)
+
+ SMS Settings (Overrides global SMS settings)
+
SMS recipients
-
+
{{ num }}
-
+
@@ -99,7 +150,8 @@
Alert Failure Settings
- The selected script will run when an alert is triggered. This script will run on any online agent.
+ The selected script will run when an alert is triggered. This
+ script will run on any online agent.
@@ -119,14 +171,22 @@
@update:model-value="setScriptDefaults('failure')"
>
-
+
- {{
- scope.opt.category
- }}
+ {{ scope.opt.category }}
@@ -152,9 +212,9 @@
v-model.number="template.action_timeout"
dense
:rules="[
- val => !!val || 'Failure action timeout is required',
- val => val > 0 || 'Timeout must be greater than 0',
- val => val <= 60 || 'Timeout must be 60 or less',
+ (val) => !!val || 'Failure action timeout is required',
+ (val) => val > 0 || 'Timeout must be greater than 0',
+ (val) => val <= 60 || 'Timeout must be 60 or less',
]"
/>
@@ -163,7 +223,8 @@
Alert Resolved Settings
- The selected script will run when an alert is resolved. This script will run on any online agent.
+ The selected script will run when an alert is resolved. This
+ script will run on any online agent.
@@ -183,14 +244,22 @@
@update:model-value="setScriptDefaults('resolved')"
>
-
+
- {{
- scope.opt.category
- }}
+ {{ scope.opt.category }}
@@ -216,9 +285,9 @@
v-model.number="template.resolved_action_timeout"
dense
:rules="[
- val => !!val || 'Resolved action timeout is required',
- val => val > 0 || 'Timeout must be greater than 0',
- val => val <= 60 || 'Timeout must be 60 or less',
+ (val) => !!val || 'Resolved action timeout is required',
+ (val) => val > 0 || 'Timeout must be greater than 0',
+ (val) => val <= 60 || 'Timeout must be 60 or less',
]"
/>
@@ -226,16 +295,34 @@
Run actions only on
- The selected script will only run on the following types of alerts
+
+ The selected script will only run on the following types of
+ alerts
+
-
+
-
+
-
+
@@ -246,9 +333,11 @@
Alert Failure Settings
- Select what notifications should be sent when an agent is overdue. Enabled will override the agent
- notification setting sand always notify. Not configured will use what notification settings are
- configured on the agent. Disabled will override the agent notification settings and never notify.
+ Select what notifications should be sent when an agent is
+ overdue. Enabled will override the agent notification setting
+ sand always notify. Not configured will use what notification
+ settings are configured on the agent. Disabled will override
+ the agent notification settings and never notify.
@@ -282,19 +371,34 @@
type="number"
v-model.number="template.agent_periodic_alert_days"
dense
- :rules="[val => val >= 0 || 'Periodic days must be 0 or greater']"
+ :rules="[
+ (val) => val >= 0 || 'Periodic days must be 0 or greater',
+ ]"
/>
Alert Resolved Settings
- Select what notifications should be sent when an overdue agent is back online.
+
+ Select what notifications should be sent when an overdue agent
+ is back online.
+
-
-
+
+
@@ -305,9 +409,11 @@
Alert Failure Settings
- Select what notifications are sent when a check fails. Enabled will override the check notification
- settings and always notify. Not configured will use the notification settings configured on the check.
- Disabled will override the check notification settings and never notify.
+ Select what notifications are sent when a check fails. Enabled
+ will override the check notification settings and always
+ notify. Not configured will use the notification settings
+ configured on the check. Disabled will override the check
+ notification settings and never notify.
@@ -391,19 +497,34 @@
type="number"
v-model.number="template.check_periodic_alert_days"
dense
- :rules="[val => val >= 0 || 'Periodic days must be 0 or greater']"
+ :rules="[
+ (val) => val >= 0 || 'Periodic days must be 0 or greater',
+ ]"
/>
Alert Resolved Settings
- Select what notifications are sent when a failed check is resolved.
+
+ Select what notifications are sent when a failed check is
+ resolved.
+
-
-
+
+
@@ -414,9 +535,11 @@
Alert Failure Settings
- Select what notifications are sent when an automated task fails. Enabled will override the task
- notification settings and always notify. Not configured will use the notification settings configured
- on the task. Disabled will override the task notification settings and never notify.
+ Select what notifications are sent when an automated task
+ fails. Enabled will override the task notification settings
+ and always notify. Not configured will use the notification
+ settings configured on the task. Disabled will override the
+ task notification settings and never notify.
@@ -500,19 +623,34 @@
type="number"
v-model.number="template.task_periodic_alert_days"
dense
- :rules="[val => val >= 0 || 'Periodic days must be 0 or greater']"
+ :rules="[
+ (val) => val >= 0 || 'Periodic days must be 0 or greater',
+ ]"
/>
Alert Resolved Settings
- Select what notifications are sent when a failed task is resolved.
+
+ Select what notifications are sent when a failed task is
+ resolved.
+
-
-
+
+
@@ -526,7 +664,12 @@
label="Back"
class="q-mr-xs"
/>
-
+
@@ -615,10 +758,14 @@ export default {
methods: {
setScriptDefaults(type) {
if (type === "failure") {
- const script = this.scriptOptions.find(i => i.value === this.template.action);
+ const script = this.scriptOptions.find(
+ (i) => i.value === this.template.action
+ );
this.template.action_args = script.args;
} else if (type === "resolved") {
- const script = this.scriptOptions.find(i => i.value === this.template.resolved_action);
+ const script = this.scriptOptions.find(
+ (i) => i.value === this.template.resolved_action
+ );
this.template.resolved_action_args = script.args;
}
},
@@ -628,14 +775,14 @@ export default {
title: "Add email",
prompt: {
model: "",
- isValid: val => this.isValidEmail(val),
+ isValid: (val) => this.isValidEmail(val),
type: "email",
},
cancel: true,
ok: { label: "Add", color: "primary" },
persistent: false,
})
- .onOk(data => {
+ .onOk((data) => {
this.template.email_recipients.push(data);
});
},
@@ -653,16 +800,16 @@ export default {
ok: { label: "Add", color: "primary" },
persistent: false,
})
- .onOk(data => {
+ .onOk((data) => {
this.template.text_recipients.push(data);
});
},
removeEmail(email) {
- const removed = this.template.email_recipients.filter(k => k !== email);
+ const removed = this.template.email_recipients.filter((k) => k !== email);
this.template.email_recipients = removed;
},
removeSMSNumber(num) {
- const removed = this.template.text_recipients.filter(k => k !== num);
+ const removed = this.template.text_recipients.filter((k) => k !== num);
this.template.text_recipients = removed;
},
onSubmit() {
@@ -676,23 +823,23 @@ export default {
if (this.editing) {
this.$axios
.put(`alerts/templates/${this.template.id}/`, this.template)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Alert Template edited!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
} else {
this.$axios
.post("alerts/templates/", this.template)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
- this.notifySuccess(`Alert Template was added!`);
+ this.notifySuccess("Alert Template was added!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
}
@@ -712,7 +859,9 @@ export default {
},
},
mounted() {
- this.getScriptOptions(this.showCommunityScripts).then(options => (this.scriptOptions = Object.freeze(options)));
+ this.getScriptOptions(this.showCommunityScripts).then(
+ (options) => (this.scriptOptions = Object.freeze(options))
+ );
// Copy alertTemplate prop locally
if (this.editing) Object.assign(this.template, this.alertTemplate);
},
diff --git a/web/src/components/modals/alerts/AlertTemplateRelated.vue b/web/src/components/modals/alerts/AlertTemplateRelated.vue
index 98c665ba..74f38a93 100644
--- a/web/src/components/modals/alerts/AlertTemplateRelated.vue
+++ b/web/src/components/modals/alerts/AlertTemplateRelated.vue
@@ -100,13 +100,13 @@ export default {
this.$axios
.get(`/alerts/templates/${this.template.id}/related/`)
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.related = r.data;
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/alerts/AlertsOverview.vue b/web/src/components/modals/alerts/AlertsOverview.vue
index bd89a53c..9780a931 100644
--- a/web/src/components/modals/alerts/AlertsOverview.vue
+++ b/web/src/components/modals/alerts/AlertsOverview.vue
@@ -1,5 +1,11 @@
-
+
@@ -40,11 +46,29 @@
/>
-
+
-
-
+
+
@@ -55,7 +79,10 @@
Alerts
-
+
-
+
@@ -83,7 +118,11 @@
Snooze alerts
-
+
@@ -147,7 +186,9 @@
- {{ capitalize(props.row.severity) }}
+ {{
+ capitalize(props.row.severity)
+ }}
@@ -184,7 +225,7 @@ export default {
name: "AlertsOverview",
emits: ["hide"],
mixins: [mixins],
- setup(props) {
+ setup() {
// setup vuex store
const store = useStore();
const formatDate = computed(() => store.getters.formatDate);
@@ -225,17 +266,35 @@ export default {
align: "left",
sortable: true,
},
- { name: "hostname", label: "Agent", field: "hostname", align: "left", sortable: true },
+ {
+ name: "hostname",
+ label: "Agent",
+ field: "hostname",
+ align: "left",
+ sortable: true,
+ },
{
name: "alert_type",
label: "Type",
field: "alert_type",
align: "left",
sortable: true,
- format: a => this.capitalize(a, true),
+ format: (a) => this.capitalize(a, true),
+ },
+ {
+ name: "severity",
+ label: "Severity",
+ field: "severity",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "message",
+ label: "Message",
+ field: "message",
+ align: "left",
+ sortable: true,
},
- { name: "severity", label: "Severity", field: "severity", align: "left", sortable: true },
- { name: "message", label: "Message", field: "message", align: "left", sortable: true },
{
name: "resolve_on",
label: "Resolved On",
@@ -261,10 +320,12 @@ export default {
},
computed: {
noDataText() {
- return this.searched ? "No data found. Try to refine you search" : "Click search to find alerts";
+ return this.searched
+ ? "No data found. Try to refine you search"
+ : "Click search to find alerts";
},
visibleColumns() {
- return this.columns.map(column => {
+ return this.columns.map((column) => {
if (column.name === "snoozed_until") {
if (this.includeSnoozed) return column.name;
} else if (column.name === "resolve_on") {
@@ -277,12 +338,11 @@ export default {
},
methods: {
getClients() {
- this.$axios
- .get("/clients/")
- .then(r => {
- this.clientsOptions = Object.freeze(r.data.map(client => ({ label: client.name, value: client.id })));
- })
- .catch(e => {});
+ this.$axios.get("/clients/").then((r) => {
+ this.clientsOptions = Object.freeze(
+ r.data.map((client) => ({ label: client.name, value: client.id }))
+ );
+ });
},
search() {
this.$q.loading.show();
@@ -295,17 +355,19 @@ export default {
resolvedFilter: this.includeResolved,
};
- if (this.clientFilter.length > 0) data["clientFilter"] = this.clientFilter;
+ if (this.clientFilter.length > 0)
+ data["clientFilter"] = this.clientFilter;
if (this.timeFilter) data["timeFilter"] = this.timeFilter;
- if (this.severityFilter.length > 0) data["severityFilter"] = this.severityFilter;
+ if (this.severityFilter.length > 0)
+ data["severityFilter"] = this.severityFilter;
this.$axios
.patch("/alerts/", data)
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.alerts = Object.freeze(r.data);
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -317,11 +379,11 @@ export default {
prompt: {
model: "",
type: "number",
- isValid: val => !!val && val > 0 && val < 9999,
+ isValid: (val) => !!val && val > 0 && val < 9999,
},
cancel: true,
})
- .onOk(days => {
+ .onOk((days) => {
this.$q.loading.show();
const data = {
@@ -332,12 +394,12 @@ export default {
this.$axios
.put(`alerts/${alert.id}/`, data)
- .then(r => {
+ .then(() => {
this.search();
this.$q.loading.hide();
this.notifySuccess(`The alert has been snoozed for ${days} days`);
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -352,12 +414,12 @@ export default {
this.$axios
.put(`alerts/${alert.id}/`, data)
- .then(r => {
+ .then(() => {
this.search();
this.$q.loading.hide();
- this.notifySuccess(`The alert has been unsnoozed`);
+ this.notifySuccess("The alert has been unsnoozed");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -371,12 +433,12 @@ export default {
this.$axios
.put(`alerts/${alert.id}/`, data)
- .then(r => {
+ .then(() => {
this.search();
this.$q.loading.hide();
this.notifySuccess("The alert has been resolved");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -384,18 +446,18 @@ export default {
this.$q.loading.show();
const data = {
- alerts: alerts.map(alert => alert.id),
+ alerts: alerts.map((alert) => alert.id),
bulk_action: "resolve",
};
this.$axios
.post("alerts/bulk/", data)
- .then(r => {
+ .then(() => {
this.search();
this.$q.loading.hide();
this.notifySuccess("Alerts were resolved");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -407,27 +469,27 @@ export default {
prompt: {
model: "",
type: "number",
- isValid: val => !!val && val > 0 && val < 9999,
+ isValid: (val) => !!val && val > 0 && val < 9999,
},
cancel: true,
})
- .onOk(days => {
+ .onOk((days) => {
this.$q.loading.show();
const data = {
- alerts: alerts.map(alert => alert.id),
+ alerts: alerts.map((alert) => alert.id),
bulk_action: "snooze",
snooze_days: days,
};
this.$axios
.post("alerts/bulk/", data)
- .then(r => {
+ .then(() => {
this.search();
this.$q.loading.hide();
this.notifySuccess(`Alerts were snoozed for ${days} days`);
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
});
diff --git a/web/src/components/modals/core/ServerMaintenance.vue b/web/src/components/modals/core/ServerMaintenance.vue
index 141dcc44..2b7f6818 100644
--- a/web/src/components/modals/core/ServerMaintenance.vue
+++ b/web/src/components/modals/core/ServerMaintenance.vue
@@ -13,7 +13,7 @@
Removes agent check results
-
+
Removes completed pending actions
@@ -38,7 +42,12 @@
-
+
@@ -85,14 +94,14 @@ export default {
this.$axios
.post("core/servermaintenance/", data)
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.notifySuccess(r.data);
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/CodeSign.vue b/web/src/components/modals/coresettings/CodeSign.vue
index 5fe8cc21..e2b26b91 100644
--- a/web/src/components/modals/coresettings/CodeSign.vue
+++ b/web/src/components/modals/coresettings/CodeSign.vue
@@ -13,7 +13,10 @@
class="full-width"
@click="doCodeSign"
>
-
Force all existing agents to be updated to the code-signed version
+
Force all existing agents to be updated to the code-signed
+ version
@@ -25,7 +28,7 @@
dense
v-model="settings.token"
class="col-9 q-pa-none"
- :rules="[val => !!val || 'Token is required']"
+ :rules="[(val) => !!val || 'Token is required']"
/>
@@ -49,22 +52,19 @@ export default {
},
methods: {
getToken() {
- this.$axios
- .get("/core/codesign/")
- .then(r => {
- this.settings = r.data;
- })
- .catch(e => {});
+ this.$axios.get("/core/codesign/").then((r) => {
+ this.settings = r.data;
+ });
},
editToken() {
this.$q.loading.show();
this.$axios
.patch("/core/codesign/", this.settings)
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.notifySuccess(r.data);
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -72,7 +72,7 @@ export default {
this.$q.loading.show();
this.$axios
.post("/core/codesign/")
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.notifySuccess(r.data);
})
@@ -85,4 +85,4 @@ export default {
this.getToken();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/CustomFields.vue b/web/src/components/modals/coresettings/CustomFields.vue
index bb9fbaa2..be784f3c 100644
--- a/web/src/components/modals/coresettings/CustomFields.vue
+++ b/web/src/components/modals/coresettings/CustomFields.vue
@@ -34,7 +34,10 @@
-
+
@@ -74,13 +77,13 @@ export default {
},
computed: {
agentFields() {
- return this.customFields.filter(field => field.model === "agent");
+ return this.customFields.filter((field) => field.model === "agent");
},
siteFields() {
- return this.customFields.filter(field => field.model === "site");
+ return this.customFields.filter((field) => field.model === "site");
},
clientFields() {
- return this.customFields.filter(field => field.model === "client");
+ return this.customFields.filter((field) => field.model === "client");
},
},
methods: {
@@ -88,12 +91,12 @@ export default {
this.$q.loading.show();
this.$axios
- .get(`/core/customfields/`)
- .then(r => {
+ .get("/core/customfields/")
+ .then((r) => {
this.$q.loading.hide();
this.customFields = r.data;
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -114,4 +117,4 @@ export default {
this.getCustomFields();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/CustomFieldsForm.vue b/web/src/components/modals/coresettings/CustomFieldsForm.vue
index 2061a0fb..e969e931 100644
--- a/web/src/components/modals/coresettings/CustomFieldsForm.vue
+++ b/web/src/components/modals/coresettings/CustomFieldsForm.vue
@@ -20,12 +20,18 @@
dense
:disable="editing"
v-model="localField.model"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
-
+
@@ -39,11 +45,13 @@
dense
:disable="editing"
v-model="localField.type"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
-
+
-
+
@@ -185,7 +197,9 @@ export default {
},
defaultValueRules() {
if (this.localField.required) {
- return [val => !!val || `Default Value needs to be set for required fields`];
+ return [
+ (val) => !!val || "Default Value needs to be set for required fields",
+ ];
} else {
return [];
}
@@ -202,23 +216,23 @@ export default {
if (this.editing) {
this.$axios
.put(`/core/customfields/${data.id}/`, data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Custom field edited!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
} else {
this.$axios
.post("/core/customfields/", data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Custom field added!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
}
@@ -252,4 +266,4 @@ export default {
if (this.model) this.localField.model = this.model;
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/CustomFieldsTable.vue b/web/src/components/modals/coresettings/CustomFieldsTable.vue
index 62557942..46b10ba4 100644
--- a/web/src/components/modals/coresettings/CustomFieldsTable.vue
+++ b/web/src/components/modals/coresettings/CustomFieldsTable.vue
@@ -13,7 +13,11 @@
>
-
+
@@ -23,7 +27,11 @@
Edit
-
+
@@ -54,13 +62,17 @@
{{ props.row.default_value_bool }}
- {{ props.row.default_values_multiple }}
+ {{
+ props.row.default_values_multiple
+ }}
{{ truncateText(props.row.default_value_string) }}
- {{
- props.row.default_value_string
- }}
+ {{ props.row.default_value_string }}
@@ -104,9 +116,27 @@ export default {
align: "left",
sortable: true,
},
- { name: "hide_in_ui", label: "Hide in UI", field: "hide_in_ui", align: "left", sortable: true },
- { name: "default_value", label: "Default Value", field: "default_value", align: "left", sortable: true },
- { name: "required", label: "Required", field: "required", align: "left", sortable: true },
+ {
+ name: "hide_in_ui",
+ label: "Hide in UI",
+ field: "hide_in_ui",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "default_value",
+ label: "Default Value",
+ field: "default_value",
+ align: "left",
+ sortable: true,
+ },
+ {
+ name: "required",
+ label: "Required",
+ field: "required",
+ align: "left",
+ sortable: true,
+ },
],
};
},
@@ -134,12 +164,12 @@ export default {
this.$q.loading.show();
this.$axios
.delete(`/core/customfields/${field.id}/`)
- .then(r => {
+ .then(() => {
this.refresh();
this.$q.loading.hide();
this.notifySuccess(`Custom Field ${field.name} was deleted!`);
})
- .catch(error => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -149,4 +179,4 @@ export default {
},
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/EditCoreSettings.vue b/web/src/components/modals/coresettings/EditCoreSettings.vue
index 618a92f2..46bcb500 100644
--- a/web/src/components/modals/coresettings/EditCoreSettings.vue
+++ b/web/src/components/modals/coresettings/EditCoreSettings.vue
@@ -22,13 +22,21 @@
-
+
General
-
+
Runs at 35mins past every hour
@@ -47,7 +55,12 @@
Default date format:
-
+
Click to see formatting options
@@ -122,7 +139,9 @@
/>
- Clear faults on agents that haven't checked in after (days):
+
+ Clear faults on agents that haven't checked in after (days):
+
Reset Patch Policy on Agents:
-
+
@@ -160,7 +183,12 @@
Recipients
-
+
Host:
-
+
Port:
@@ -211,7 +244,9 @@
type="number"
filled
class="q-pa-none"
- :rules="[val => (val > 0 && val <= 65535) || 'Invalid Port']"
+ :rules="[
+ (val) => (val > 0 && val <= 65535) || 'Invalid Port',
+ ]"
/>
@@ -221,12 +256,23 @@
class="q-pa-none"
/>
-
+
Username:
-
+
-
+
Password:
Recipients
-
+
Twilio Account SID:
-
+
Twilio Auth Token:
-
+
@@ -328,29 +387,53 @@
v-model="settings.mesh_username"
class="col-6"
:rules="[
- val => (val == val.toLowerCase() && val != val.toUpperCase()) || 'Username must be all lowercase',
+ (val) =>
+ (val == val.toLowerCase() &&
+ val != val.toUpperCase()) ||
+ 'Username must be all lowercase',
]"
/>
Mesh Site:
-
+
Mesh Token:
-
+
Mesh Device Group Name:
-
+
- Disable Auto Login for Remote Control and Remote background:
+
+ Disable Auto Login for Remote Control and Remote background:
+
-
+
@@ -429,7 +512,11 @@
{
- this.settings = r.data;
- this.allTimezones = Object.freeze(r.data.all_timezones);
- this.ready = true;
- })
- .catch(e => {});
+ this.$axios.get("/core/settings/").then((r) => {
+ this.settings = r.data;
+ this.allTimezones = Object.freeze(r.data.all_timezones);
+ this.ready = true;
+ });
},
getPolicies() {
this.$q.loading.show();
this.$axios
.get("/automation/policies/")
- .then(r => {
- this.policies = r.data.map(policy => ({ label: policy.name, value: policy.id }));
+ .then((r) => {
+ this.policies = r.data.map((policy) => ({
+ label: policy.name,
+ value: policy.id,
+ }));
this.$q.loading.hide();
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
getAlertTemplates() {
- this.$axios
- .get("alerts/templates/")
- .then(r => {
- this.alertTemplateOptions = r.data.map(template => ({ label: template.name, value: template.id }));
- })
- .catch(e => {});
+ this.$axios.get("alerts/templates/").then((r) => {
+ this.alertTemplateOptions = r.data.map((template) => ({
+ label: template.name,
+ value: template.id,
+ }));
+ });
},
showResetPatchPolicy() {
this.$q.dialog({
@@ -549,14 +636,14 @@ export default {
title: "Add email",
prompt: {
model: "",
- isValid: val => this.isValidEmail(val),
+ isValid: (val) => this.isValidEmail(val),
type: "email",
},
cancel: true,
ok: { label: "Add", color: "primary" },
persistent: false,
})
- .onOk(data => {
+ .onOk((data) => {
this.settings.email_alert_recipients.push(data);
});
},
@@ -574,16 +661,20 @@ export default {
ok: { label: "Add", color: "primary" },
persistent: false,
})
- .onOk(data => {
+ .onOk((data) => {
this.settings.sms_alert_recipients.push(data);
});
},
removeEmail(email) {
- const removed = this.settings.email_alert_recipients.filter(k => k !== email);
+ const removed = this.settings.email_alert_recipients.filter(
+ (k) => k !== email
+ );
this.settings.email_alert_recipients = removed;
},
removeSMSNumber(num) {
- const removed = this.settings.sms_alert_recipients.filter(k => k !== num);
+ const removed = this.settings.sms_alert_recipients.filter(
+ (k) => k !== num
+ );
this.settings.sms_alert_recipients = removed;
},
editSettings() {
@@ -591,13 +682,13 @@ export default {
delete this.settings.all_timezones;
this.$axios
.put("/core/settings/", this.settings)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
if (this.emailTest) {
this.$q.loading.show({ message: "Sending test email..." });
this.$axios
.post("/core/emailtest/")
- .then(r => {
+ .then((r) => {
this.emailTest = false;
this.$q.loading.hide();
this.getCoreSettings();
@@ -611,7 +702,7 @@ export default {
this.$q.loading.show({ message: "Sending test SMS..." });
this.$axios
.post("/core/smstest/")
- .then(r => {
+ .then((r) => {
this.smsTest = false;
this.$q.loading.hide();
this.getCoreSettings();
@@ -637,4 +728,4 @@ export default {
this.getAlertTemplates();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/KeyStoreForm.vue b/web/src/components/modals/coresettings/KeyStoreForm.vue
index 1c8b9936..14f378e8 100644
--- a/web/src/components/modals/coresettings/KeyStoreForm.vue
+++ b/web/src/components/modals/coresettings/KeyStoreForm.vue
@@ -11,12 +11,24 @@
-
+
-
+
@@ -63,23 +75,23 @@ export default {
if (this.editing) {
this.$axios
.put(`/core/keystore/${data.id}/`, data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Key was edited!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
} else {
this.$axios
.post("/core/keystore/", data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Key was added!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
}
@@ -103,4 +115,4 @@ export default {
if (this.globalKey) Object.assign(this.localKey, this.globalKey);
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/KeyStoreTable.vue b/web/src/components/modals/coresettings/KeyStoreTable.vue
index c6454132..6eb98048 100644
--- a/web/src/components/modals/coresettings/KeyStoreTable.vue
+++ b/web/src/components/modals/coresettings/KeyStoreTable.vue
@@ -3,7 +3,14 @@
-
+
@@ -97,11 +108,11 @@ export default {
this.$axios
.get("/core/keystore/")
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.keystore = r.data;
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -137,12 +148,12 @@ export default {
this.$q.loading.show();
this.$axios
.delete(`/core/keystore/${key.id}/`)
- .then(r => {
+ .then(() => {
this.getKeyStore();
this.$q.loading.hide();
this.notifySuccess(`key: ${key.name} was deleted!`);
})
- .catch(error => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -152,4 +163,4 @@ export default {
this.getKeyStore();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/ResetPatchPolicy.vue b/web/src/components/modals/coresettings/ResetPatchPolicy.vue
index 8f771972..7352320b 100644
--- a/web/src/components/modals/coresettings/ResetPatchPolicy.vue
+++ b/web/src/components/modals/coresettings/ResetPatchPolicy.vue
@@ -9,18 +9,25 @@
- Reset the patch policies for agents in a specific client or site. You can also leave the client and site blank
- to reset the patch policy for all agents. (This might take a while)
+ Reset the patch policies for agents in a specific client or site. You
+ can also leave the client and site blank to reset the patch policy for
+ all agents. (This might take a while)
-
+
@@ -83,7 +94,7 @@ export default {
TacticalDropdown,
},
emits: [...useDialogPluginComponent.emits],
- setup(props) {
+ setup() {
// setup quasar dialog plugin
const { dialogRef, onDialogHide, onDialogOK } = useDialogPluginComponent();
@@ -100,7 +111,7 @@ export default {
const target = ref("all");
const loading = ref(false);
- watch(target, (newValue, oldValue) => {
+ watch(target, () => {
state.value.client = null;
state.value.site = null;
});
@@ -141,4 +152,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/URLActionsForm.vue b/web/src/components/modals/coresettings/URLActionsForm.vue
index 37d45ee3..9c40bf0d 100644
--- a/web/src/components/modals/coresettings/URLActionsForm.vue
+++ b/web/src/components/modals/coresettings/URLActionsForm.vue
@@ -11,12 +11,23 @@
-
+
-
+
@@ -26,7 +37,7 @@
outlined
dense
v-model="localAction.pattern"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
/>
@@ -75,23 +86,23 @@ export default {
if (this.editing) {
this.$axios
.put(`/core/urlaction/${data.id}/`, data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("Url Action was edited!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
} else {
this.$axios
.post("/core/urlaction/", data)
- .then(r => {
+ .then(() => {
this.$q.loading.hide();
this.onOk();
this.notifySuccess("URL Action was added!");
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
}
@@ -115,4 +126,4 @@ export default {
if (this.action) Object.assign(this.localAction, this.action);
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/URLActionsTable.vue b/web/src/components/modals/coresettings/URLActionsTable.vue
index d8c1480b..847ef019 100644
--- a/web/src/components/modals/coresettings/URLActionsTable.vue
+++ b/web/src/components/modals/coresettings/URLActionsTable.vue
@@ -3,7 +3,14 @@
-
+
@@ -108,11 +119,11 @@ export default {
this.$axios
.get("/core/urlaction/")
- .then(r => {
+ .then((r) => {
this.$q.loading.hide();
this.actions = r.data;
})
- .catch(e => {
+ .catch(() => {
this.$q.loading.hide();
});
},
@@ -148,12 +159,12 @@ export default {
this.$q.loading.show();
this.$axios
.delete(`/core/urlaction/${action.id}/`)
- .then(r => {
+ .then(() => {
this.getURLActions();
this.$q.loading.hide();
this.notifySuccess(`URL Action: ${action.name} was deleted!`);
})
- .catch(error => {
+ .catch(() => {
this.$q.loading.hide();
});
});
@@ -163,4 +174,4 @@ export default {
this.getURLActions();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/modals/coresettings/UserPreferences.vue b/web/src/components/modals/coresettings/UserPreferences.vue
index 99330ab9..dd235893 100644
--- a/web/src/components/modals/coresettings/UserPreferences.vue
+++ b/web/src/components/modals/coresettings/UserPreferences.vue
@@ -14,7 +14,12 @@
-
+
User Interface
@@ -34,7 +39,10 @@
@update:model-value="url_action = null"
/>
-
+
URL Action:
Click to see formatting options
@@ -192,7 +204,7 @@ export default {
};
},
watch: {
- agentDblClickAction(new_value, old_value) {
+ agentDblClickAction(new_value) {
if (new_value === "urlaction") {
this.getURLActions();
}
@@ -203,33 +215,35 @@ export default {
openURL(url);
},
getURLActions() {
- this.$axios
- .get("/core/urlaction/")
- .then(r => {
- if (r.data.length === 0) {
- this.notifyWarning("No URL Actions configured. Go to Settings > Global Settings > URL Actions");
- return;
- }
- this.urlActions = r.data.map(action => ({ label: action.name, value: action.id }));
- })
- .catch(() => {});
+ this.$axios.get("/core/urlaction/").then((r) => {
+ if (r.data.length === 0) {
+ this.notifyWarning(
+ "No URL Actions configured. Go to Settings > Global Settings > URL Actions"
+ );
+ return;
+ }
+ this.urlActions = r.data.map((action) => ({
+ label: action.name,
+ value: action.id,
+ }));
+ });
},
getUserPrefs() {
- this.$axios
- .get("/core/dashinfo/")
- .then(r => {
- this.agentDblClickAction = r.data.dbl_click_action;
- this.url_action = r.data.url_action;
- this.defaultAgentTblTab = r.data.default_agent_tbl_tab;
- this.clientTreeSort = r.data.client_tree_sort;
- this.loading_bar_color = r.data.loading_bar_color;
- this.clear_search_when_switching = r.data.clear_search_when_switching;
- this.date_format = r.data.date_format;
- })
- .catch(e => {});
+ this.$axios.get("/core/dashinfo/").then((r) => {
+ this.agentDblClickAction = r.data.dbl_click_action;
+ this.url_action = r.data.url_action;
+ this.defaultAgentTblTab = r.data.default_agent_tbl_tab;
+ this.clientTreeSort = r.data.client_tree_sort;
+ this.loading_bar_color = r.data.loading_bar_color;
+ this.clear_search_when_switching = r.data.clear_search_when_switching;
+ this.date_format = r.data.date_format;
+ });
},
editUserPrefs() {
- if (this.agentDblClickAction === "urlaction" && this.url_action === null) {
+ if (
+ this.agentDblClickAction === "urlaction" &&
+ this.url_action === null
+ ) {
this.notifyError("Select a URL Action");
return;
}
@@ -242,14 +256,11 @@ export default {
clear_search_when_switching: this.clear_search_when_switching,
date_format: this.date_format,
};
- this.$axios
- .patch("/accounts/users/ui/", data)
- .then(r => {
- this.notifySuccess("Preferences were saved!");
- this.$store.dispatch("loadTree");
- this.onOk();
- })
- .catch(e => {});
+ this.$axios.patch("/accounts/users/ui/", data).then(() => {
+ this.notifySuccess("Preferences were saved!");
+ this.$store.dispatch("loadTree");
+ this.onOk();
+ });
},
show() {
this.$refs.dialog.show();
@@ -269,4 +280,4 @@ export default {
this.getUserPrefs();
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/scripts/ScriptFormModal.vue b/web/src/components/scripts/ScriptFormModal.vue
index 3dc0a69d..7589358c 100644
--- a/web/src/components/scripts/ScriptFormModal.vue
+++ b/web/src/components/scripts/ScriptFormModal.vue
@@ -1,24 +1,60 @@
-
-
+
+
{{ title }}
-
- Minimize
+
+ Minimize
-
- Maximize
+
+ Maximize
Close
-
- Shell/Python
- scripts on Linux/Mac need a shebang at the top of the script e.g. #!/bin/bash or
- #!/usr/bin/python3 Add one to get rid of this warning. Ignore if windows.
+
+
+ Shell/Python scripts on Linux/Mac need a shebang at the top of the
+ script e.g. #!/bin/bash or #!/usr/bin/python3 Add one to get rid of this warning. Ignore if windows.
@@ -28,10 +64,16 @@
:readonly="readonly"
v-model="formScript.name"
label="Name"
- :rules="[val => !!val || '*Required']"
+ :rules="[(val) => !!val || '*Required']"
hide-bottom-space
/>
-
+
-
+
@@ -194,7 +248,12 @@ export default {
// script form logic
const script = props.script
? ref(Object.assign({}, { ...props.script, script_body: "" }))
- : ref({ shell: "powershell", default_timeout: 90, args: [], script_body: "" });
+ : ref({
+ shell: "powershell",
+ default_timeout: 90,
+ args: [],
+ script_body: "",
+ });
if (props.clone) script.value.name = `(Copy) ${script.value.name}`;
const maximized = ref(false);
@@ -204,6 +263,8 @@ export default {
const missingShebang = computed(() => {
if (script.value.shell === "shell" || script.value.shell === "python") {
return !script.value.script_body.includes("#!");
+ } else {
+ return false;
}
});
@@ -230,9 +291,11 @@ export default {
// get code if editing or cloning script
if (props.script)
- downloadScript(script.value.id, { with_snippets: props.readonly }).then(r => {
- script.value.script_body = r.code;
- });
+ downloadScript(script.value.id, { with_snippets: props.readonly }).then(
+ (r) => {
+ script.value.script_body = r.code;
+ }
+ );
async function submitForm() {
loading.value = true;
@@ -301,4 +364,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/scripts/ScriptManager.vue b/web/src/components/scripts/ScriptManager.vue
index 1b3b1e75..88325cf3 100644
--- a/web/src/components/scripts/ScriptManager.vue
+++ b/web/src/components/scripts/ScriptManager.vue
@@ -11,7 +11,14 @@
}"
>
- Script Manager
+ Script Manager
Close
@@ -61,7 +68,11 @@
flat
no-caps
class="q-ml-sm"
- :label="showCommunityScripts ? 'Hide Community Scripts' : 'Show Community Scripts'"
+ :label="
+ showCommunityScripts
+ ? 'Hide Community Scripts'
+ : 'Show Community Scripts'
+ "
:icon="showCommunityScripts ? 'visibility_off' : 'visibility'"
@click="setShowCommunityScripts(!showCommunityScripts)"
/>
@@ -71,13 +82,23 @@
flat
no-caps
class="q-ml-sm"
- :label="showHiddenScripts ? 'Hide Hidden Scripts' : 'Show Hidden Scripts'"
+ :label="
+ showHiddenScripts ? 'Hide Hidden Scripts' : 'Show Hidden Scripts'
+ "
:icon="showHiddenScripts ? 'visibility_off' : 'visibility'"
@click="showHiddenScripts = !showHiddenScripts"
/>
-
+
@@ -87,7 +108,10 @@
-
+
@@ -47,7 +56,8 @@ export default {
},
inheritAttrs: false,
setup() {
- const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } = useDialogPluginComponent();
+ const { dialogRef, onDialogHide, onDialogOK, onDialogCancel } =
+ useDialogPluginComponent();
return {
// quasar dialog plugin
@@ -58,4 +68,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/ui/ExportTableBtn.vue b/web/src/components/ui/ExportTableBtn.vue
index f7cf0e91..4109e93d 100644
--- a/web/src/components/ui/ExportTableBtn.vue
+++ b/web/src/components/ui/ExportTableBtn.vue
@@ -19,4 +19,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/components/ui/TacticalDropdown.vue b/web/src/components/ui/TacticalDropdown.vue
index 60c97ca4..cd5e83a0 100644
--- a/web/src/components/ui/TacticalDropdown.vue
+++ b/web/src/components/ui/TacticalDropdown.vue
@@ -2,7 +2,7 @@
$emit('update:modelValue', value)"
+ @update:model-value="(value) => $emit('update:modelValue', value)"
:options="filtered ? filteredOptions : options"
:model-value="modelValue"
:map-options="mapOptions"
@@ -25,13 +25,21 @@
:key="mapOptions ? scope.opt.value : scope.opt"
>
-
+
- {{ scope.opt.cat }}
+ {{
+ scope.opt.cat
+ }}
- {{
- scope.opt.category
- }}
+ {{ scope.opt.category }}
@@ -58,11 +66,11 @@ export default {
},
options: !Array,
},
- setup(props, context) {
+ setup(props) {
const filtered = ref(false);
const filteredOptions = ref(props.options);
- function filterFn(val, update, abort) {
+ function filterFn(val, update) {
update(() => {
if (val === "") {
filtered.value = false;
@@ -71,10 +79,14 @@ export default {
const needle = val.toLowerCase();
if (!props.mapOptions)
- filteredOptions.value = props.options.filter(v => v.toLowerCase().indexOf(needle) > -1);
+ filteredOptions.value = props.options.filter(
+ (v) => v.toLowerCase().indexOf(needle) > -1
+ );
else
- filteredOptions.value = props.options.filter(v => {
- return !v.category ? v.label.toLowerCase().indexOf(needle) > -1 : false;
+ filteredOptions.value = props.options.filter((v) => {
+ return !v.category
+ ? v.label.toLowerCase().indexOf(needle) > -1
+ : false;
});
}
});
@@ -92,4 +104,4 @@ export default {
};
},
};
-
\ No newline at end of file
+
diff --git a/web/src/composables/accounts.js b/web/src/composables/accounts.js
index 3767c582..cb05f5ac 100644
--- a/web/src/composables/accounts.js
+++ b/web/src/composables/accounts.js
@@ -1,39 +1,37 @@
-
-import { ref, onMounted } from "vue"
-import { fetchUsers } from "@/api/accounts"
-import { formatUserOptions } from "@/utils/format"
+import { ref, onMounted } from "vue";
+import { fetchUsers } from "@/api/accounts";
+import { formatUserOptions } from "@/utils/format";
export function useUserDropdown(onMount = false) {
-
- const userOptions = ref([])
- const userDropdownLoading = ref(false)
+ const userOptions = ref([]);
+ const userDropdownLoading = ref(false);
async function getUserOptions(flat = false) {
- userOptions.value = formatUserOptions(await fetchUsers(), flat)
+ userOptions.value = formatUserOptions(await fetchUsers(), flat);
}
function getDynamicUserOptions(val, update, abort) {
if (!val || val.length < 2) {
- abort()
- return
+ abort();
+ return;
}
update(async () => {
- userDropdownLoading.value = true
+ userDropdownLoading.value = true;
const params = {
- search: val.toLowerCase()
- }
+ search: val.toLowerCase(),
+ };
- const options = await fetchUsers(params)
+ const options = await fetchUsers(params);
- userOptions.value = options.map(user => user.username)
- userDropdownLoading.value = false
- })
+ userOptions.value = options.map((user) => user.username);
+ userDropdownLoading.value = false;
+ });
}
if (onMount) {
- onMounted(getUserOptions())
+ onMounted(getUserOptions());
}
return {
@@ -43,6 +41,6 @@ export function useUserDropdown(onMount = false) {
//methods
getUserOptions,
- getDynamicUserOptions
- }
+ getDynamicUserOptions,
+ };
}
diff --git a/web/src/composables/agents.js b/web/src/composables/agents.js
index 3f1fccb5..68d13efe 100644
--- a/web/src/composables/agents.js
+++ b/web/src/composables/agents.js
@@ -1,17 +1,19 @@
-
-import { ref } from "vue"
-import { fetchAgents } from "@/api/agents"
-import { formatAgentOptions } from "@/utils/format"
+import { ref } from "vue";
+import { fetchAgents } from "@/api/agents";
+import { formatAgentOptions } from "@/utils/format";
// agent dropdown
export function useAgentDropdown() {
- const agent = ref(null)
- const agents = ref([])
- const agentOptions = ref([])
+ const agent = ref(null);
+ const agents = ref([]);
+ const agentOptions = ref([]);
// specifing flat returns an array of hostnames versus {value:id, label: hostname}
async function getAgentOptions(flat = false) {
- agentOptions.value = formatAgentOptions(await fetchAgents({ detail: false }), flat)
+ agentOptions.value = formatAgentOptions(
+ await fetchAgents({ detail: false }),
+ flat
+ );
}
return {
@@ -21,17 +23,18 @@ export function useAgentDropdown() {
agentOptions,
//methods
- getAgentOptions
- }
+ getAgentOptions,
+ };
}
export function cmdPlaceholder(shell) {
if (shell === "cmd") return "rmdir /S /Q C:\\Windows\\System32";
- else if (shell === "powershell") return "Remove-Item -Recurse -Force C:\\Windows\\System32";
+ else if (shell === "powershell")
+ return "Remove-Item -Recurse -Force C:\\Windows\\System32";
else return "rm -rf --no-preserve-root /";
}
export const agentPlatformOptions = [
{ value: "windows", label: "Windows" },
- { value: "linux", label: "Linux" }
-]
\ No newline at end of file
+ { value: "linux", label: "Linux" },
+];
diff --git a/web/src/composables/checks.js b/web/src/composables/checks.js
index 77d00e41..e2776c16 100644
--- a/web/src/composables/checks.js
+++ b/web/src/composables/checks.js
@@ -1,35 +1,50 @@
-
-import { ref, onMounted } from "vue"
-import { updateCheck, saveCheck } from "@/api/checks"
+import { ref, onMounted } from "vue";
+import { updateCheck, saveCheck } from "@/api/checks";
import { fetchAgentChecks } from "@/api/agents";
import { fetchPolicyChecks } from "@/api/automation";
import { formatCheckOptions } from "@/utils/format";
-import { fetchAgent } from "@/api/agents"
+import { fetchAgent } from "@/api/agents";
import { isValidThreshold } from "@/utils/validation";
-import { notifySuccess } from "@/utils/notify"
+import { notifySuccess } from "@/utils/notify";
// for check add/edit modals
// pass as an object {editCheck: props.check, initialState: {default form values for adding check} }
export function useCheckModal({ editCheck, initialState }) {
-
const check = editCheck
? ref(Object.assign({}, editCheck))
: ref(initialState);
- const loading = ref(false)
+ const loading = ref(false);
// save check function
async function submit(onOk) {
- if (check.value.check_type === "cpuload" || check.value.check_type === "memory") {
- if (!isValidThreshold(check.value.warning_threshold, check.value.error_threshold)) return;
- }
- else if (check.value.check_type === "diskspace") {
- if (!isValidThreshold(check.value.warning_threshold, check.value.error_threshold, true)) return;
+ if (
+ check.value.check_type === "cpuload" ||
+ check.value.check_type === "memory"
+ ) {
+ if (
+ !isValidThreshold(
+ check.value.warning_threshold,
+ check.value.error_threshold
+ )
+ )
+ return;
+ } else if (check.value.check_type === "diskspace") {
+ if (
+ !isValidThreshold(
+ check.value.warning_threshold,
+ check.value.error_threshold,
+ true
+ )
+ )
+ return;
}
loading.value = true;
try {
- const result = editCheck ? await updateCheck(check.value.id, check.value) : await saveCheck(check.value);
+ const result = editCheck
+ ? await updateCheck(check.value.id, check.value)
+ : await saveCheck(check.value);
notifySuccess(result);
onOk();
} catch (e) {
@@ -45,42 +60,57 @@ export function useCheckModal({ editCheck, initialState }) {
{ label: "Informational", value: "info" },
{ label: "Warning", value: "warning" },
{ label: "Error", value: "error" },
- ]
+ ];
- const logNameOptions = ["Application", "System", "Security"]
+ const logNameOptions = ["Application", "System", "Security"];
const failWhenOptions = [
{ label: "Log contains", value: "contains" },
{ label: "Log does not contain", value: "not_contains" },
- ]
+ ];
- const diskOptions = ref('A:,B:,C:,D:,E:,F:,G:,H:,I:,J:,K:,L:,M:,N:,O:,P:,Q:,R:,S:,T:,U:,V:,W:,X:,Y:,Z:'.split(','))
+ const diskOptions = ref(
+ "A:,B:,C:,D:,E:,F:,G:,H:,I:,J:,K:,L:,M:,N:,O:,P:,Q:,R:,S:,T:,U:,V:,W:,X:,Y:,Z:".split(
+ ","
+ )
+ );
- const serviceOptions = ref(Object.freeze(defaultServiceOptions))
+ const serviceOptions = ref(Object.freeze(defaultServiceOptions));
async function getAgentDiskOptions() {
- const { disks } = await fetchAgent(check.value.agent)
- diskOptions.value = disks.map(disk => disk.device)
- check.value.disk = diskOptions.value[0]
+ const { disks } = await fetchAgent(check.value.agent);
+ diskOptions.value = disks.map((disk) => disk.device);
+ check.value.disk = diskOptions.value[0];
}
async function getAgentServiceOptions() {
- const { services } = await fetchAgent(check.value.agent)
+ const { services } = await fetchAgent(check.value.agent);
- const tmp = services.map(service => ({ label: service.display_name, value: service.name }))
- serviceOptions.value = Object.freeze(tmp.sort((a, b) => a.label.localeCompare(b.label)))
- check.value.svc_name = serviceOptions.value[0].value
- check.value.svc_display_name = serviceOptions.value[0].label
+ const tmp = services.map((service) => ({
+ label: service.display_name,
+ value: service.name,
+ }));
+ serviceOptions.value = Object.freeze(
+ tmp.sort((a, b) => a.label.localeCompare(b.label))
+ );
+ check.value.svc_name = serviceOptions.value[0].value;
+ check.value.svc_display_name = serviceOptions.value[0].label;
}
onMounted(async () => {
- if (!editCheck && check.value.check_type === "diskspace" && check.value.agent) {
- await getAgentDiskOptions()
+ if (
+ !editCheck &&
+ check.value.check_type === "diskspace" &&
+ check.value.agent
+ ) {
+ await getAgentDiskOptions();
+ } else if (
+ !editCheck &&
+ check.value.check_type === "winsvc" &&
+ check.value.agent
+ ) {
+ await getAgentServiceOptions();
}
-
- else if (!editCheck && check.value.check_type === "winsvc" && check.value.agent) {
- await getAgentServiceOptions()
- }
- })
+ });
return {
//data
@@ -94,21 +124,26 @@ export function useCheckModal({ editCheck, initialState }) {
serviceOptions,
// methods
- submit
- }
+ submit,
+ };
}
export function useCheckDropdown() {
- const check = ref(null)
- const checks = ref([])
- const checkOptions = ref([])
+ const check = ref(null);
+ const checks = ref([]);
+ const checkOptions = ref([]);
async function getCheckOptions({ agent, policy }, flat = false) {
if (!agent && !policy) {
- console.error("Need to specify agent or policy object when calling getCheckOptions")
- return
+ console.error(
+ "Need to specify agent or policy object when calling getCheckOptions"
+ );
+ return;
}
- checkOptions.value = formatCheckOptions(agent ? await fetchAgentChecks(agent) : await fetchPolicyChecks(policy), flat)
+ checkOptions.value = formatCheckOptions(
+ agent ? await fetchAgentChecks(agent) : await fetchPolicyChecks(policy),
+ flat
+ );
}
return {
@@ -118,1106 +153,1106 @@ export function useCheckDropdown() {
checkOptions,
//methods
- getCheckOptions
- }
+ getCheckOptions,
+ };
}
-
export const defaultServiceOptions = [
{
value: "AJRouter",
- label: "AllJoyn Router Service"
+ label: "AllJoyn Router Service",
},
{
value: "ALG",
- label: "Application Layer Gateway Service"
+ label: "Application Layer Gateway Service",
},
{
value: "AppIDSvc",
- label: "Application Identity"
+ label: "Application Identity",
},
{
value: "Appinfo",
- label: "Application Information"
+ label: "Application Information",
},
{
value: "AppMgmt",
- label: "Application Management"
+ label: "Application Management",
},
{
value: "AppReadiness",
- label: "App Readiness"
+ label: "App Readiness",
},
{
value: "AppVClient",
- label: "Microsoft App-V Client"
+ label: "Microsoft App-V Client",
},
{
value: "AppXSvc",
- label: "AppX Deployment Service (AppXSVC)"
+ label: "AppX Deployment Service (AppXSVC)",
},
{
value: "AssignedAccessManagerSvc",
- label: "AssignedAccessManager Service"
+ label: "AssignedAccessManager Service",
},
{
value: "atashost",
- label: "WebEx Service Host for Support Center"
+ label: "WebEx Service Host for Support Center",
},
{
value: "AudioEndpointBuilder",
- label: "Windows Audio Endpoint Builder"
+ label: "Windows Audio Endpoint Builder",
},
{
value: "Audiosrv",
- label: "Windows Audio"
+ label: "Windows Audio",
},
{
value: "autotimesvc",
- label: "Cellular Time"
+ label: "Cellular Time",
},
{
value: "AxInstSV",
- label: "ActiveX Installer (AxInstSV)"
+ label: "ActiveX Installer (AxInstSV)",
},
{
value: "BDESVC",
- label: "BitLocker Drive Encryption Service"
+ label: "BitLocker Drive Encryption Service",
},
{
value: "BFE",
- label: "Base Filtering Engine"
+ label: "Base Filtering Engine",
},
{
value: "BITS",
- label: "Background Intelligent Transfer Service"
+ label: "Background Intelligent Transfer Service",
},
{
value: "Bonjour Service",
- label: "Bonjour Service"
+ label: "Bonjour Service",
},
{
value: "BrokerInfrastructure",
- label: "Background Tasks Infrastructure Service"
+ label: "Background Tasks Infrastructure Service",
},
{
value: "BTAGService",
- label: "Bluetooth Audio Gateway Service"
+ label: "Bluetooth Audio Gateway Service",
},
{
value: "BthAvctpSvc",
- label: "AVCTP service"
+ label: "AVCTP service",
},
{
value: "bthserv",
- label: "Bluetooth Support Service"
+ label: "Bluetooth Support Service",
},
{
value: "camsvc",
- label: "Capability Access Manager Service"
+ label: "Capability Access Manager Service",
},
{
value: "CDPSvc",
- label: "Connected Devices Platform Service"
+ label: "Connected Devices Platform Service",
},
{
value: "CertPropSvc",
- label: "Certificate Propagation"
+ label: "Certificate Propagation",
},
{
value: "ClipSVC",
- label: "Client License Service (ClipSVC)"
+ label: "Client License Service (ClipSVC)",
},
{
value: "COMSysApp",
- label: "COM+ System Application"
+ label: "COM+ System Application",
},
{
value: "CoreMessagingRegistrar",
- label: "CoreMessaging"
+ label: "CoreMessaging",
},
{
value: "cphs",
- label: "Intel(R) Content Protection HECI Service"
+ label: "Intel(R) Content Protection HECI Service",
},
{
value: "cplspcon",
- label: "Intel(R) Content Protection HDCP Service"
+ label: "Intel(R) Content Protection HDCP Service",
},
{
value: "CryptSvc",
- label: "Cryptographic Services"
+ label: "Cryptographic Services",
},
{
value: "CscService",
- label: "Offline Files"
+ label: "Offline Files",
},
{
value: "DcomLaunch",
- label: "DCOM Server Process Launcher"
+ label: "DCOM Server Process Launcher",
},
{
value: "defragsvc",
- label: "Optimize drives"
+ label: "Optimize drives",
},
{
value: "DeviceAssociationService",
- label: "Device Association Service"
+ label: "Device Association Service",
},
{
value: "DeviceInstall",
- label: "Device Install Service"
+ label: "Device Install Service",
},
{
value: "DevQueryBroker",
- label: "DevQuery Background Discovery Broker"
+ label: "DevQuery Background Discovery Broker",
},
{
value: "Dhcp",
- label: "DHCP Client"
+ label: "DHCP Client",
},
{
value: "diagnosticshub.standardcollector.service",
- label: "Microsoft (R) Diagnostics Hub Standard Collector Service"
+ label: "Microsoft (R) Diagnostics Hub Standard Collector Service",
},
{
value: "diagsvc",
- label: "Diagnostic Execution Service"
+ label: "Diagnostic Execution Service",
},
{
value: "DiagTrack",
- label: "Connected User Experiences and Telemetry"
+ label: "Connected User Experiences and Telemetry",
},
{
value: "DispBrokerDesktopSvc",
- label: "Display Policy Service"
+ label: "Display Policy Service",
},
{
value: "DisplayEnhancementService",
- label: "Display Enhancement Service"
+ label: "Display Enhancement Service",
},
{
value: "DmEnrollmentSvc",
- label: "Device Management Enrollment Service"
+ label: "Device Management Enrollment Service",
},
{
value: "dmwappushservice",
- label: "Device Management Wireless Application Protocol (WAP) Push message Routing Service"
+ label:
+ "Device Management Wireless Application Protocol (WAP) Push message Routing Service",
},
{
value: "Dnscache",
- label: "DNS Client"
+ label: "DNS Client",
},
{
value: "DoSvc",
- label: "Delivery Optimization"
+ label: "Delivery Optimization",
},
{
value: "dot3svc",
- label: "Wired AutoConfig"
+ label: "Wired AutoConfig",
},
{
value: "DPS",
- label: "Diagnostic Policy Service"
+ label: "Diagnostic Policy Service",
},
{
value: "DsmSvc",
- label: "Device Setup Manager"
+ label: "Device Setup Manager",
},
{
value: "DsSvc",
- label: "Data Sharing Service"
+ label: "Data Sharing Service",
},
{
value: "DusmSvc",
- label: "Data Usage"
+ label: "Data Usage",
},
{
value: "Eaphost",
- label: "Extensible Authentication Protocol"
+ label: "Extensible Authentication Protocol",
},
{
value: "EFS",
- label: "Encrypting File System (EFS)"
+ label: "Encrypting File System (EFS)",
},
{
value: "embeddedmode",
- label: "Embedded Mode"
+ label: "Embedded Mode",
},
{
value: "EntAppSvc",
- label: "Enterprise App Management Service"
+ label: "Enterprise App Management Service",
},
{
value: "EventLog",
- label: "Windows Event Log"
+ label: "Windows Event Log",
},
{
value: "EventSystem",
- label: "COM+ Event System"
+ label: "COM+ Event System",
},
{
value: "Fax",
- label: "Fax"
+ label: "Fax",
},
{
value: "fdPHost",
- label: "Function Discovery Provider Host"
+ label: "Function Discovery Provider Host",
},
{
value: "FDResPub",
- label: "Function Discovery Resource Publication"
+ label: "Function Discovery Resource Publication",
},
{
value: "fhsvc",
- label: "File History Service"
+ label: "File History Service",
},
{
value: "FontCache",
- label: "Windows Font Cache Service"
+ label: "Windows Font Cache Service",
},
{
value: "FrameServer",
- label: "Windows Camera Frame Server"
+ label: "Windows Camera Frame Server",
},
{
value: "GoogleChromeElevationService",
- label: "Google Chrome Elevation Service"
+ label: "Google Chrome Elevation Service",
},
{
value: "gpsvc",
- label: "Group Policy Client"
+ label: "Group Policy Client",
},
{
value: "GraphicsPerfSvc",
- label: "GraphicsPerfSvc"
+ label: "GraphicsPerfSvc",
},
{
value: "hidserv",
- label: "Human Interface Device Service"
+ label: "Human Interface Device Service",
},
{
value: "hns",
- label: "Host Network Service"
+ label: "Host Network Service",
},
{
value: "HvHost",
- label: "HV Host Service"
+ label: "HV Host Service",
},
{
value: "ibtsiva",
- label: "Intel Bluetooth Service"
+ label: "Intel Bluetooth Service",
},
{
value: "icssvc",
- label: "Windows Mobile Hotspot Service"
+ label: "Windows Mobile Hotspot Service",
},
{
value: "IKEEXT",
- label: "IKE and AuthIP IPsec Keying Modules"
+ label: "IKE and AuthIP IPsec Keying Modules",
},
{
value: "InstallService",
- label: "Microsoft Store Install Service"
+ label: "Microsoft Store Install Service",
},
{
value: "iphlpsvc",
- label: "IP Helper"
+ label: "IP Helper",
},
{
value: "IpxlatCfgSvc",
- label: "IP Translation Configuration Service"
+ label: "IP Translation Configuration Service",
},
{
value: "KeyIso",
- label: "CNG Key Isolation"
+ label: "CNG Key Isolation",
},
{
value: "KtmRm",
- label: "KtmRm for Distributed Transaction Coordinator"
+ label: "KtmRm for Distributed Transaction Coordinator",
},
{
value: "LanmanServer",
- label: "Server"
+ label: "Server",
},
{
value: "LanmanWorkstation",
- label: "Workstation"
+ label: "Workstation",
},
{
value: "lfsvc",
- label: "Geolocation Service"
+ label: "Geolocation Service",
},
{
value: "LicenseManager",
- label: "Windows License Manager Service"
+ label: "Windows License Manager Service",
},
{
value: "lltdsvc",
- label: "Link-Layer Topology Discovery Mapper"
+ label: "Link-Layer Topology Discovery Mapper",
},
{
value: "lmhosts",
- label: "TCP/IP NetBIOS Helper"
+ label: "TCP/IP NetBIOS Helper",
},
{
value: "LSM",
- label: "Local Session Manager"
+ label: "Local Session Manager",
},
{
value: "LxpSvc",
- label: "Language Experience Service"
+ label: "Language Experience Service",
},
{
value: "LxssManager",
- label: "LxssManager"
+ label: "LxssManager",
},
{
value: "MapsBroker",
- label: "Downloaded Maps Manager"
+ label: "Downloaded Maps Manager",
},
{
value: "mpssvc",
- label: "Windows Defender Firewall"
+ label: "Windows Defender Firewall",
},
{
value: "MSDTC",
- label: "Distributed Transaction Coordinator"
+ label: "Distributed Transaction Coordinator",
},
{
value: "MSiSCSI",
- label: "Microsoft iSCSI Initiator Service"
+ label: "Microsoft iSCSI Initiator Service",
},
{
value: "msiserver",
- label: "Windows Installer"
+ label: "Windows Installer",
},
{
value: "NaturalAuthentication",
- label: "Natural Authentication"
+ label: "Natural Authentication",
},
{
value: "NcaSvc",
- label: "Network Connectivity Assistant"
+ label: "Network Connectivity Assistant",
},
{
value: "NcbService",
- label: "Network Connection Broker"
+ label: "Network Connection Broker",
},
{
value: "NcdAutoSetup",
- label: "Network Connected Devices Auto-Setup"
+ label: "Network Connected Devices Auto-Setup",
},
{
value: "Net Driver HPZ12",
- label: "Net Driver HPZ12"
+ label: "Net Driver HPZ12",
},
{
value: "Netlogon",
- label: "Netlogon"
+ label: "Netlogon",
},
{
value: "Netman",
- label: "Network Connections"
+ label: "Network Connections",
},
{
value: "netprofm",
- label: "Network List Service"
+ label: "Network List Service",
},
{
value: "NetSetupSvc",
- label: "Network Setup Service"
+ label: "Network Setup Service",
},
{
value: "NetTcpPortSharing",
- label: "Net.Tcp Port Sharing Service"
+ label: "Net.Tcp Port Sharing Service",
},
{
value: "NgcCtnrSvc",
- label: "Microsoft Passport Container"
+ label: "Microsoft Passport Container",
},
{
value: "NgcSvc",
- label: "Microsoft Passport"
+ label: "Microsoft Passport",
},
{
value: "NlaSvc",
- label: "Network Location Awareness"
+ label: "Network Location Awareness",
},
{
value: "nsi",
- label: "Network Store Interface Service"
+ label: "Network Store Interface Service",
},
{
value: "nvagent",
- label: "Network Virtualization Service"
+ label: "Network Virtualization Service",
},
{
value: "OpenVPNService",
- label: "OpenVPNService"
+ label: "OpenVPNService",
},
{
value: "OpenVPNServiceInteractive",
- label: "OpenVPN Interactive Service"
+ label: "OpenVPN Interactive Service",
},
{
value: "OpenVPNServiceLegacy",
- label: "OpenVPN Legacy Service"
+ label: "OpenVPN Legacy Service",
},
{
value: "ose64",
- label: "Office 64 Source Engine"
+ label: "Office 64 Source Engine",
},
{
value: "p2pimsvc",
- label: "Peer Networking Identity Manager"
+ label: "Peer Networking Identity Manager",
},
{
value: "p2psvc",
- label: "Peer Networking Grouping"
+ label: "Peer Networking Grouping",
},
{
value: "PcaSvc",
- label: "Program Compatibility Assistant Service"
+ label: "Program Compatibility Assistant Service",
},
{
value: "PeerDistSvc",
- label: "BranchCache"
+ label: "BranchCache",
},
{
value: "perceptionsimulation",
- label: "Windows Perception Simulation Service"
+ label: "Windows Perception Simulation Service",
},
{
value: "PerfHost",
- label: "Performance Counter DLL Host"
+ label: "Performance Counter DLL Host",
},
{
value: "PhoneSvc",
- label: "Phone Service"
+ label: "Phone Service",
},
{
value: "pla",
- label: "Performance Logs & Alerts"
+ label: "Performance Logs & Alerts",
},
{
value: "PlugPlay",
- label: "Plug and Play"
+ label: "Plug and Play",
},
{
value: "Pml Driver HPZ12",
- label: "Pml Driver HPZ12"
+ label: "Pml Driver HPZ12",
},
{
value: "PNRPAutoReg",
- label: "PNRP Machine Name Publication Service"
+ label: "PNRP Machine Name Publication Service",
},
{
value: "PNRPsvc",
- label: "Peer Name Resolution Protocol"
+ label: "Peer Name Resolution Protocol",
},
{
value: "PolicyAgent",
- label: "IPsec Policy Agent"
+ label: "IPsec Policy Agent",
},
{
value: "Power",
- label: "Power"
+ label: "Power",
},
{
value: "PrintNotify",
- label: "Printer Extensions and Notifications"
+ label: "Printer Extensions and Notifications",
},
{
value: "ProfSvc",
- label: "User Profile Service"
+ label: "User Profile Service",
},
{
value: "PushToInstall",
- label: "Windows PushToInstall Service"
+ label: "Windows PushToInstall Service",
},
{
value: "QWAVE",
- label: "Quality Windows Audio Video Experience"
+ label: "Quality Windows Audio Video Experience",
},
{
value: "RasAuto",
- label: "Remote Access Auto Connection Manager"
+ label: "Remote Access Auto Connection Manager",
},
{
value: "RasMan",
- label: "Remote Access Connection Manager"
+ label: "Remote Access Connection Manager",
},
{
value: "RemoteAccess",
- label: "Routing and Remote Access"
+ label: "Routing and Remote Access",
},
{
value: "RemoteRegistry",
- label: "Remote Registry"
+ label: "Remote Registry",
},
{
value: "RetailDemo",
- label: "Retail Demo Service"
+ label: "Retail Demo Service",
},
{
value: "RmSvc",
- label: "Radio Management Service"
+ label: "Radio Management Service",
},
{
value: "RpcEptMapper",
- label: "RPC Endpoint Mapper"
+ label: "RPC Endpoint Mapper",
},
{
value: "RpcLocator",
- label: "Remote Procedure Call (RPC) Locator"
+ label: "Remote Procedure Call (RPC) Locator",
},
{
value: "RpcSs",
- label: "Remote Procedure Call (RPC)"
+ label: "Remote Procedure Call (RPC)",
},
{
value: "SamSs",
- label: "Security Accounts Manager"
+ label: "Security Accounts Manager",
},
{
value: "SCardSvr",
- label: "Smart Card"
+ label: "Smart Card",
},
{
value: "ScDeviceEnum",
- label: "Smart Card Device Enumeration Service"
+ label: "Smart Card Device Enumeration Service",
},
{
value: "Schedule",
- label: "Task Scheduler"
+ label: "Task Scheduler",
},
{
value: "SCPolicySvc",
- label: "Smart Card Removal Policy"
+ label: "Smart Card Removal Policy",
},
{
value: "SDRSVC",
- label: "Windows Backup"
+ label: "Windows Backup",
},
{
value: "seclogon",
- label: "Secondary Logon"
+ label: "Secondary Logon",
},
{
value: "SecurityHealthService",
- label: "Windows Security Service"
+ label: "Windows Security Service",
},
{
value: "SEMgrSvc",
- label: "Payments and NFC/SE Manager"
+ label: "Payments and NFC/SE Manager",
},
{
value: "SENS",
- label: "System Event Notification Service"
+ label: "System Event Notification Service",
},
{
value: "Sense",
- label: "Windows Defender Advanced Threat Protection Service"
+ label: "Windows Defender Advanced Threat Protection Service",
},
{
value: "SensorDataService",
- label: "Sensor Data Service"
+ label: "Sensor Data Service",
},
{
value: "SensorService",
- label: "Sensor Service"
+ label: "Sensor Service",
},
{
value: "SensrSvc",
- label: "Sensor Monitoring Service"
+ label: "Sensor Monitoring Service",
},
{
value: "SessionEnv",
- label: "Remote Desktop Configuration"
+ label: "Remote Desktop Configuration",
},
{
value: "SgrmBroker",
- label: "System Guard Runtime Monitor Broker"
+ label: "System Guard Runtime Monitor Broker",
},
{
value: "SharedAccess",
- label: "Internet Connection Sharing (ICS)"
+ label: "Internet Connection Sharing (ICS)",
},
{
value: "SharedRealitySvc",
- label: "Spatial Data Service"
+ label: "Spatial Data Service",
},
{
value: "ShellHWDetection",
- label: "Shell Hardware Detection"
+ label: "Shell Hardware Detection",
},
{
value: "shpamsvc",
- label: "Shared PC Account Manager"
+ label: "Shared PC Account Manager",
},
{
value: "smphost",
- label: "Microsoft Storage Spaces SMP"
+ label: "Microsoft Storage Spaces SMP",
},
{
value: "SmsRouter",
- label: "Microsoft Windows SMS Router Service."
+ label: "Microsoft Windows SMS Router Service.",
},
{
value: "SNMPTRAP",
- label: "SNMP Trap"
+ label: "SNMP Trap",
},
{
value: "spectrum",
- label: "Windows Perception Service"
+ label: "Windows Perception Service",
},
{
value: "Spooler",
- label: "Print Spooler"
+ label: "Print Spooler",
},
{
value: "sppsvc",
- label: "Software Protection"
+ label: "Software Protection",
},
{
value: "SSDPSRV",
- label: "SSDP Discovery"
+ label: "SSDP Discovery",
},
{
value: "ssh-agent",
- label: "OpenSSH Authentication Agent"
+ label: "OpenSSH Authentication Agent",
},
{
value: "sshd",
- label: "OpenSSH SSH Server"
+ label: "OpenSSH SSH Server",
},
{
value: "SstpSvc",
- label: "Secure Socket Tunneling Protocol Service"
+ label: "Secure Socket Tunneling Protocol Service",
},
{
value: "StateRepository",
- label: "State Repository Service"
+ label: "State Repository Service",
},
{
value: "stisvc",
- label: "Windows Image Acquisition (WIA)"
+ label: "Windows Image Acquisition (WIA)",
},
{
value: "StorSvc",
- label: "Storage Service"
+ label: "Storage Service",
},
{
value: "svsvc",
- label: "Spot Verifier"
+ label: "Spot Verifier",
},
{
value: "swprv",
- label: "Microsoft Software Shadow Copy Provider"
+ label: "Microsoft Software Shadow Copy Provider",
},
{
value: "SynTPEnhService",
- label: "SynTPEnh Caller Service"
+ label: "SynTPEnh Caller Service",
},
{
value: "SysMain",
- label: "SysMain"
+ label: "SysMain",
},
{
value: "SystemEventsBroker",
- label: "System Events Broker"
+ label: "System Events Broker",
},
{
value: "TabletInputService",
- label: "Touch Keyboard and Handwriting Panel Service"
+ label: "Touch Keyboard and Handwriting Panel Service",
},
{
value: "TapiSrv",
- label: "Telephony"
+ label: "Telephony",
},
{
value: "TermService",
- label: "Remote Desktop Services"
+ label: "Remote Desktop Services",
},
{
value: "RDMS",
- label: "Remote Desktop Management"
+ label: "Remote Desktop Management",
},
{
value: "TermServLicensing",
- label: "Remote Desktop Licensing"
+ label: "Remote Desktop Licensing",
},
{
value: "TSGateway",
- label: "Remote Desktop Gateway"
+ label: "Remote Desktop Gateway",
},
{
value: "Tssdis",
- label: "Remote Desktop Connection Broker"
+ label: "Remote Desktop Connection Broker",
},
{
value: "MMS",
- label: "Acronis Managed Machine Service"
+ label: "Acronis Managed Machine Service",
},
{
value: "Themes",
- label: "Themes"
+ label: "Themes",
},
{
value: "TieringEngineService",
- label: "Storage Tiers Management"
+ label: "Storage Tiers Management",
},
{
value: "TimeBrokerSvc",
- label: "Time Broker"
+ label: "Time Broker",
},
{
value: "TokenBroker",
- label: "Web Account Manager"
+ label: "Web Account Manager",
},
{
value: "TrkWks",
- label: "Distributed Link Tracking Client"
+ label: "Distributed Link Tracking Client",
},
{
value: "TroubleshootingSvc",
- label: "Recommended Troubleshooting Service"
+ label: "Recommended Troubleshooting Service",
},
{
value: "TrustedInstaller",
- label: "Windows Modules Installer"
+ label: "Windows Modules Installer",
},
{
value: "tzautoupdate",
- label: "Auto Time Zone Updater"
+ label: "Auto Time Zone Updater",
},
{
value: "UevAgentService",
- label: "User Experience Virtualization Service"
+ label: "User Experience Virtualization Service",
},
{
value: "UmRdpService",
- label: "Remote Desktop Services UserMode Port Redirector"
+ label: "Remote Desktop Services UserMode Port Redirector",
},
{
value: "upnphost",
- label: "UPnP Device Host"
+ label: "UPnP Device Host",
},
{
value: "UserManager",
- label: "User Manager"
+ label: "User Manager",
},
{
value: "UsoSvc",
- label: "Update Orchestrator Service"
+ label: "Update Orchestrator Service",
},
{
value: "VacSvc",
- label: "Volumetric Audio Compositor Service"
+ label: "Volumetric Audio Compositor Service",
},
{
value: "VaultSvc",
- label: "Credential Manager"
+ label: "Credential Manager",
},
{
value: "vds",
- label: "Virtual Disk"
+ label: "Virtual Disk",
},
{
value: "vmcompute",
- label: "Hyper-V Host Compute Service"
+ label: "Hyper-V Host Compute Service",
},
{
value: "vmicguestinterface",
- label: "Hyper-V Guest Service Interface"
+ label: "Hyper-V Guest Service Interface",
},
{
value: "vmicheartbeat",
- label: "Hyper-V Heartbeat Service"
+ label: "Hyper-V Heartbeat Service",
},
{
value: "vmickvpexchange",
- label: "Hyper-V Data Exchange Service"
+ label: "Hyper-V Data Exchange Service",
},
{
value: "vmicrdv",
- label: "Hyper-V Remote Desktop Virtualization Service"
+ label: "Hyper-V Remote Desktop Virtualization Service",
},
{
value: "vmicshutdown",
- label: "Hyper-V Guest Shutdown Service"
+ label: "Hyper-V Guest Shutdown Service",
},
{
value: "vmictimesync",
- label: "Hyper-V Time Synchronization Service"
+ label: "Hyper-V Time Synchronization Service",
},
{
value: "vmicvmsession",
- label: "Hyper-V PowerShell Direct Service"
+ label: "Hyper-V PowerShell Direct Service",
},
{
value: "vmicvss",
- label: "Hyper-V Volume Shadow Copy Requestor"
+ label: "Hyper-V Volume Shadow Copy Requestor",
},
{
value: "VSS",
- label: "Volume Shadow Copy"
+ label: "Volume Shadow Copy",
},
{
value: "W32Time",
- label: "Windows Time"
+ label: "Windows Time",
},
{
value: "WaaSMedicSvc",
- label: "Windows Update Medic Service"
+ label: "Windows Update Medic Service",
},
{
value: "WalletService",
- label: "WalletService"
+ label: "WalletService",
},
{
value: "WarpJITSvc",
- label: "WarpJITSvc"
+ label: "WarpJITSvc",
},
{
value: "wbengine",
- label: "Block Level Backup Engine Service"
+ label: "Block Level Backup Engine Service",
},
{
value: "WbioSrvc",
- label: "Windows Biometric Service"
+ label: "Windows Biometric Service",
},
{
value: "Wcmsvc",
- label: "Windows Connection Manager"
+ label: "Windows Connection Manager",
},
{
value: "wcncsvc",
- label: "Windows Connect Now - Config Registrar"
+ label: "Windows Connect Now - Config Registrar",
},
{
value: "WdiServiceHost",
- label: "Diagnostic Service Host"
+ label: "Diagnostic Service Host",
},
{
value: "WdiSystemHost",
- label: "Diagnostic System Host"
+ label: "Diagnostic System Host",
},
{
value: "WdNisSvc",
- label: "Windows Defender Antivirus Network Inspection Service"
+ label: "Windows Defender Antivirus Network Inspection Service",
},
{
value: "WebClient",
- label: "WebClient"
+ label: "WebClient",
},
{
value: "Wecsvc",
- label: "Windows Event Collector"
+ label: "Windows Event Collector",
},
{
value: "WEPHOSTSVC",
- label: "Windows Encryption Provider Host Service"
+ label: "Windows Encryption Provider Host Service",
},
{
value: "wercplsupport",
- label: "Problem Reports and Solutions Control Panel Support"
+ label: "Problem Reports and Solutions Control Panel Support",
},
{
value: "WerSvc",
- label: "Windows Error Reporting Service"
+ label: "Windows Error Reporting Service",
},
{
value: "WFDSConMgrSvc",
- label: "Wi-Fi Direct Services Connection Manager Service"
+ label: "Wi-Fi Direct Services Connection Manager Service",
},
{
value: "WiaRpc",
- label: "Still Image Acquisition Events"
+ label: "Still Image Acquisition Events",
},
{
value: "WinDefend",
- label: "Windows Defender Antivirus Service"
+ label: "Windows Defender Antivirus Service",
},
{
value: "WinHttpAutoProxySvc",
- label: "WinHTTP Web Proxy Auto-Discovery Service"
+ label: "WinHTTP Web Proxy Auto-Discovery Service",
},
{
value: "Winmgmt",
- label: "Windows Management Instrumentation"
+ label: "Windows Management Instrumentation",
},
{
value: "WinRM",
- label: "Windows Remote Management (WS-Management)"
+ label: "Windows Remote Management (WS-Management)",
},
{
value: "wisvc",
- label: "Windows Insider Service"
+ label: "Windows Insider Service",
},
{
value: "WlanSvc",
- label: "WLAN AutoConfig"
+ label: "WLAN AutoConfig",
},
{
value: "wlidsvc",
- label: "Microsoft Account Sign-in Assistant"
+ label: "Microsoft Account Sign-in Assistant",
},
{
value: "wlpasvc",
- label: "Local Profile Assistant Service"
+ label: "Local Profile Assistant Service",
},
{
value: "WManSvc",
- label: "Windows Management Service"
+ label: "Windows Management Service",
},
{
value: "wmiApSrv",
- label: "WMI Performance Adapter"
+ label: "WMI Performance Adapter",
},
{
value: "WMPNetworkSvc",
- label: "Windows Media Player Network Sharing Service"
+ label: "Windows Media Player Network Sharing Service",
},
{
value: "workfolderssvc",
- label: "Work Folders"
+ label: "Work Folders",
},
{
value: "WpcMonSvc",
- label: "Parental Controls"
+ label: "Parental Controls",
},
{
value: "WPDBusEnum",
- label: "Portable Device Enumerator Service"
+ label: "Portable Device Enumerator Service",
},
{
value: "WpnService",
- label: "Windows Push Notifications System Service"
+ label: "Windows Push Notifications System Service",
},
{
value: "wscsvc",
- label: "Security Center"
+ label: "Security Center",
},
{
value: "WSearch",
- label: "Windows Search"
+ label: "Windows Search",
},
{
value: "wuauserv",
- label: "Windows Update"
+ label: "Windows Update",
},
{
value: "WwanSvc",
- label: "WWAN AutoConfig"
+ label: "WWAN AutoConfig",
},
{
value: "XblAuthManager",
- label: "Xbox Live Auth Manager"
+ label: "Xbox Live Auth Manager",
},
{
value: "XblGameSave",
- label: "Xbox Live Game Save"
+ label: "Xbox Live Game Save",
},
{
value: "XboxGipSvc",
- label: "Xbox Accessory Management Service"
+ label: "Xbox Accessory Management Service",
},
{
value: "XboxNetApiSvc",
- label: "Xbox Live Networking Service"
+ label: "Xbox Live Networking Service",
},
{
value: "YMC",
- label: "YMC"
+ label: "YMC",
},
{
value: "AarSvc_35b28a",
- label: "Agent Activation Runtime_35b28a"
+ label: "Agent Activation Runtime_35b28a",
},
{
value: "BcastDVRUserService_35b28a",
- label: "GameDVR and Broadcast User Service_35b28a"
+ label: "GameDVR and Broadcast User Service_35b28a",
},
{
value: "BluetoothUserService_35b28a",
- label: "Bluetooth User Support Service_35b28a"
+ label: "Bluetooth User Support Service_35b28a",
},
{
value: "CaptureService_35b28a",
- label: "CaptureService_35b28a"
+ label: "CaptureService_35b28a",
},
{
value: "cbdhsvc_35b28a",
- label: "Clipboard User Service_35b28a"
+ label: "Clipboard User Service_35b28a",
},
{
value: "CDPUserSvc_35b28a",
- label: "Connected Devices Platform User Service_35b28a"
+ label: "Connected Devices Platform User Service_35b28a",
},
{
value: "ConsentUxUserSvc_35b28a",
- label: "ConsentUX_35b28a"
+ label: "ConsentUX_35b28a",
},
{
value: "CredentialEnrollmentManagerUserSvc_35b28a",
- label: "CredentialEnrollmentManagerUserSvc_35b28a"
+ label: "CredentialEnrollmentManagerUserSvc_35b28a",
},
{
value: "DeviceAssociationBrokerSvc_35b28a",
- label: "DeviceAssociationBroker_35b28a"
+ label: "DeviceAssociationBroker_35b28a",
},
{
value: "DevicePickerUserSvc_35b28a",
- label: "DevicePicker_35b28a"
+ label: "DevicePicker_35b28a",
},
{
value: "DevicesFlowUserSvc_35b28a",
- label: "DevicesFlow_35b28a"
+ label: "DevicesFlow_35b28a",
},
{
value: "LxssManagerUser_35b28a",
- label: "LxssManagerUser_35b28a"
+ label: "LxssManagerUser_35b28a",
},
{
value: "MessagingService_35b28a",
- label: "MessagingService_35b28a"
+ label: "MessagingService_35b28a",
},
{
value: "OneSyncSvc_35b28a",
- label: "Sync Host_35b28a"
+ label: "Sync Host_35b28a",
},
{
value: "PimIndexMaintenanceSvc_35b28a",
- label: "Contact Data_35b28a"
+ label: "Contact Data_35b28a",
},
{
value: "PrintWorkflowUserSvc_35b28a",
- label: "PrintWorkflow_35b28a"
+ label: "PrintWorkflow_35b28a",
},
{
value: "UnistoreSvc_35b28a",
- label: "User Data Storage_35b28a"
+ label: "User Data Storage_35b28a",
},
{
value: "UserDataSvc_35b28a",
- label: "User Data Access_35b28a"
+ label: "User Data Access_35b28a",
},
{
value: "WpnUserService_35b28a",
- label: "Windows Push Notifications User Service_35b28a"
+ label: "Windows Push Notifications User Service_35b28a",
},
{
value: "Mesh Agent",
- label: "Mesh Agent background service"
+ label: "Mesh Agent background service",
},
{
value: "salt-minion",
- label: "salt-minion"
+ label: "salt-minion",
},
{
value: "tacticalagent",
- label: "Tactical RMM Agent"
- }
-].sort((a, b) => a.label.localeCompare(b.label))
\ No newline at end of file
+ label: "Tactical RMM Agent",
+ },
+].sort((a, b) => a.label.localeCompare(b.label));
diff --git a/web/src/composables/clients.js b/web/src/composables/clients.js
index a09ce678..91c00dd6 100644
--- a/web/src/composables/clients.js
+++ b/web/src/composables/clients.js
@@ -1,18 +1,17 @@
-
-import { ref, onMounted } from "vue"
-import { fetchClients } from "@/api/clients"
-import { formatClientOptions, formatSiteOptions } from "@/utils/format"
+import { ref, onMounted } from "vue";
+import { fetchClients } from "@/api/clients";
+import { formatClientOptions, formatSiteOptions } from "@/utils/format";
export function useClientDropdown(onMount = false) {
- const client = ref(null)
- const clients = ref([])
- const clientOptions = ref([])
+ const client = ref(null);
+ const clients = ref([]);
+ const clientOptions = ref([]);
async function getClientOptions(flat = false) {
- clientOptions.value = formatClientOptions(await fetchClients(), flat)
+ clientOptions.value = formatClientOptions(await fetchClients(), flat);
}
- if (onMount) onMounted(getClientOptions)
+ if (onMount) onMounted(getClientOptions);
return {
//data
@@ -21,20 +20,20 @@ export function useClientDropdown(onMount = false) {
clientOptions,
//methods
- getClientOptions
- }
+ getClientOptions,
+ };
}
export function useSiteDropdown(onMount = false) {
- const site = ref(null)
- const sites = ref([])
- const siteOptions = ref([])
+ const site = ref(null);
+ const sites = ref([]);
+ const siteOptions = ref([]);
async function getSiteOptions() {
- siteOptions.value = formatSiteOptions(await fetchClients())
+ siteOptions.value = formatSiteOptions(await fetchClients());
}
- if (onMount) onMounted(getSiteOptions)
+ if (onMount) onMounted(getSiteOptions);
return {
//data
@@ -43,6 +42,6 @@ export function useSiteDropdown(onMount = false) {
siteOptions,
//methods
- getSiteOptions
- }
-}
\ No newline at end of file
+ getSiteOptions,
+ };
+}
diff --git a/web/src/composables/core.js b/web/src/composables/core.js
index 9e082d88..0df7b09f 100644
--- a/web/src/composables/core.js
+++ b/web/src/composables/core.js
@@ -1,28 +1,28 @@
-
-import { ref, onMounted } from "vue"
-import { fetchCustomFields } from "@/api/core"
-import { formatCustomFieldOptions } from "@/utils/format"
+import { ref, onMounted } from "vue";
+import { fetchCustomFields } from "@/api/core";
+import { formatCustomFieldOptions } from "@/utils/format";
export function useCustomFieldDropdown({ onMount = false }) {
-
- const customFieldOptions = ref([])
+ const customFieldOptions = ref([]);
// type can be "client", "site", or "agent"
async function getCustomFieldOptions(model = null, flat = false) {
+ const params = {};
- const params = {}
-
- if (model) params[model] = model
- customFieldOptions.value = formatCustomFieldOptions(await fetchCustomFields(params), flat)
+ if (model) params[model] = model;
+ customFieldOptions.value = formatCustomFieldOptions(
+ await fetchCustomFields(params),
+ flat
+ );
}
- if (onMount) onMounted(getCustomFieldOptions)
+ if (onMount) onMounted(getCustomFieldOptions);
return {
//data
customFieldOptions,
//methods
- getCustomFieldOptions
- }
+ getCustomFieldOptions,
+ };
}
diff --git a/web/src/composables/scripts.js b/web/src/composables/scripts.js
index 93384f21..e76dfa5b 100644
--- a/web/src/composables/scripts.js
+++ b/web/src/composables/scripts.js
@@ -1,39 +1,47 @@
-import { ref, watch, computed, onMounted } from "vue"
-import { useStore } from "vuex"
-import { fetchScripts } from "@/api/scripts"
-import { formatScriptOptions } from "@/utils/format"
+import { ref, watch, computed, onMounted } from "vue";
+import { useStore } from "vuex";
+import { fetchScripts } from "@/api/scripts";
+import { formatScriptOptions } from "@/utils/format";
// script dropdown
export function useScriptDropdown(setScript = null, { onMount = false } = {}) {
- const scriptOptions = ref([])
- const defaultTimeout = ref(30)
- const defaultArgs = ref([])
- const script = ref(setScript)
- const syntax = ref("")
- const link = ref("")
- const baseUrl = "https://github.com/amidaware/community-scripts/blob/main/scripts/"
+ const scriptOptions = ref([]);
+ const defaultTimeout = ref(30);
+ const defaultArgs = ref([]);
+ const script = ref(setScript);
+ const syntax = ref("");
+ const link = ref("");
+ const baseUrl =
+ "https://github.com/amidaware/community-scripts/blob/main/scripts/";
// specify parameters to filter out community scripts
async function getScriptOptions(showCommunityScripts = false) {
- scriptOptions.value = Object.freeze(formatScriptOptions(await fetchScripts({ showCommunityScripts })))
+ scriptOptions.value = Object.freeze(
+ formatScriptOptions(await fetchScripts({ showCommunityScripts }))
+ );
}
// watch scriptPk for changes and update the default timeout and args
- watch([script, scriptOptions], (newValue, oldValue) => {
+ watch([script, scriptOptions], () => {
if (script.value && scriptOptions.value.length > 0) {
- const tmpScript = scriptOptions.value.find(i => i.value === script.value);
+ const tmpScript = scriptOptions.value.find(
+ (i) => i.value === script.value
+ );
defaultTimeout.value = tmpScript.timeout;
defaultArgs.value = tmpScript.args;
- syntax.value = tmpScript.syntax
- link.value = tmpScript.script_type === "builtin" ? `${baseUrl}${tmpScript.filename}` : null
+ syntax.value = tmpScript.syntax;
+ link.value =
+ tmpScript.script_type === "builtin"
+ ? `${baseUrl}${tmpScript.filename}`
+ : null;
}
- })
+ });
// vuex show community scripts
- const store = useStore()
- const showCommunityScripts = computed(() => store.state.showCommunityScripts)
+ const store = useStore();
+ const showCommunityScripts = computed(() => store.state.showCommunityScripts);
- if (onMount) onMounted(() => getScriptOptions(showCommunityScripts.value))
+ if (onMount) onMounted(() => getScriptOptions(showCommunityScripts.value));
return {
//data
@@ -45,13 +53,13 @@ export function useScriptDropdown(setScript = null, { onMount = false } = {}) {
link,
//methods
- getScriptOptions
- }
+ getScriptOptions,
+ };
}
export const shellOptions = [
{ label: "Powershell", value: "powershell" },
{ label: "Batch", value: "cmd" },
{ label: "Python", value: "python" },
- { label: "Shell", value: "shell" }
-];
\ No newline at end of file
+ { label: "Shell", value: "shell" },
+];
diff --git a/web/src/env.d.ts b/web/src/env.d.ts
new file mode 100644
index 00000000..eb03ecbf
--- /dev/null
+++ b/web/src/env.d.ts
@@ -0,0 +1,9 @@
+/* eslint-disable */
+
+declare namespace NodeJS {
+ interface ProcessEnv {
+ NODE_ENV: string;
+ VUE_ROUTER_MODE: "hash" | "history" | "abstract" | undefined;
+ VUE_ROUTER_BASE: string | undefined;
+ }
+}
diff --git a/web/src/index.template.html b/web/src/index.template.html
index 6d03261d..71650d89 100644
--- a/web/src/index.template.html
+++ b/web/src/index.template.html
@@ -1,24 +1,22 @@
+
+ <%= productName %>
-
-
- <%= productName %>
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
+
+
+
+