Compare commits
	
		
			37 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 
						 | 
					b4b63826dc | ||
| 
						 | 
					45e2690a81 | ||
| 
						 | 
					2ff504db09 | ||
| 
						 | 
					0c89e58d8c | ||
| 
						 | 
					e1dc75e2d8 | ||
| 
						 | 
					8f1c694071 | ||
| 
						 | 
					e837c494cb | ||
| 
						 | 
					13f0f117da | ||
| 
						 | 
					0b6ae80777 | ||
| 
						 | 
					cfe1cb2dbf | ||
| 
						 | 
					e1dc8050e3 | ||
| 
						 | 
					3e6365574e | ||
| 
						 | 
					5114ff40aa | ||
| 
						 | 
					6ea7c92b20 | ||
| 
						 | 
					20d534eab0 | ||
| 
						 | 
					1b2286c4f8 | ||
| 
						 | 
					8207f30234 | ||
| 
						 | 
					68036f6837 | ||
| 
						 | 
					03fae45ac5 | ||
| 
						 | 
					c2591c9e7d | ||
| 
						 | 
					7fcbe6fbd8 | ||
| 
						 | 
					a2f472ef9c | ||
| 
						 | 
					8403ac0e93 | ||
| 
						 | 
					b7a91563b0 | ||
| 
						 | 
					ab19afca16 | ||
| 
						 | 
					f24c6a7a80 | ||
| 
						 | 
					99490bf859 | ||
| 
						 | 
					72cdeeaa6a | ||
| 
						 | 
					1eca4d605b | ||
| 
						 | 
					52ee98f6f8 | ||
| 
						 | 
					d270b877c9 | ||
| 
						 | 
					fd8b2a1d98 | ||
| 
						 | 
					f518043d8d | ||
| 
						 | 
					cc2335558d | ||
| 
						 | 
					a8a171ba2c | ||
| 
						 | 
					24a63f477e | ||
| 
						 | 
					ddeb6293a1 | 
							
								
								
									
										12
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										12
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							@@ -1,12 +1,12 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "web",
 | 
			
		||||
  "version": "0.101.45",
 | 
			
		||||
  "version": "0.101.47",
 | 
			
		||||
  "lockfileVersion": 3,
 | 
			
		||||
  "requires": true,
 | 
			
		||||
  "packages": {
 | 
			
		||||
    "": {
 | 
			
		||||
      "name": "web",
 | 
			
		||||
      "version": "0.101.45",
 | 
			
		||||
      "version": "0.101.47",
 | 
			
		||||
      "dependencies": {
 | 
			
		||||
        "@quasar/extras": "1.16.12",
 | 
			
		||||
        "@vueuse/core": "10.11.0",
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
        "monaco-editor": "0.50.0",
 | 
			
		||||
        "pinia": "2.1.7",
 | 
			
		||||
        "qrcode": "1.5.3",
 | 
			
		||||
        "quasar": "2.16.5",
 | 
			
		||||
        "quasar": "2.16.6",
 | 
			
		||||
        "vue": "3.4.31",
 | 
			
		||||
        "vue-router": "4.4.0",
 | 
			
		||||
        "vue3-apexcharts": "1.5.3",
 | 
			
		||||
@@ -6068,9 +6068,9 @@
 | 
			
		||||
      }
 | 
			
		||||
    },
 | 
			
		||||
    "node_modules/quasar": {
 | 
			
		||||
      "version": "2.16.5",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.16.5.tgz",
 | 
			
		||||
      "integrity": "sha512-9pjKOg/ZpbbBaKDLIkIKgd2JLaX+R3H2jKDPrlkHD56rp7L8WdxFZhxnG5JVfvW94pCNGtlepjgnli8wRhVFCQ==",
 | 
			
		||||
      "version": "2.16.6",
 | 
			
		||||
      "resolved": "https://registry.npmjs.org/quasar/-/quasar-2.16.6.tgz",
 | 
			
		||||
      "integrity": "sha512-nFFS/WniZy052wUNr0UHxc46KVB0hVg7IlBpVScxQAANQxL5uJVqaiw0z2CEM8IM+MCObXANqxHX/m7woG7zIw==",
 | 
			
		||||
      "license": "MIT",
 | 
			
		||||
      "engines": {
 | 
			
		||||
        "node": ">= 10.18.1",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "web",
 | 
			
		||||
  "version": "0.101.46",
 | 
			
		||||
  "version": "0.101.47",
 | 
			
		||||
  "private": true,
 | 
			
		||||
  "productName": "Tactical RMM",
 | 
			
		||||
  "scripts": {
 | 
			
		||||
@@ -20,7 +20,7 @@
 | 
			
		||||
    "monaco-editor": "0.50.0",
 | 
			
		||||
    "pinia": "2.1.7",
 | 
			
		||||
    "qrcode": "1.5.3",
 | 
			
		||||
    "quasar": "2.16.5",
 | 
			
		||||
    "quasar": "2.16.6",
 | 
			
		||||
    "vue": "3.4.31",
 | 
			
		||||
    "vue-router": "4.4.0",
 | 
			
		||||
    "vue3-apexcharts": "1.5.3",
 | 
			
		||||
 
 | 
			
		||||
@@ -20,12 +20,18 @@
 | 
			
		||||
        </div>
 | 
			
		||||
        <br />
 | 
			
		||||
        <div v-if="scriptInfo.stdout">
 | 
			
		||||
          Standard Output
 | 
			
		||||
          <script-output-copy-clip
 | 
			
		||||
            label="Standard Output"
 | 
			
		||||
            :data="scriptInfo.stdout"
 | 
			
		||||
          />
 | 
			
		||||
          <q-separator />
 | 
			
		||||
          <pre>{{ scriptInfo.stdout }}</pre>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div v-if="scriptInfo.stderr">
 | 
			
		||||
          Standard Error
 | 
			
		||||
          <script-output-copy-clip
 | 
			
		||||
            label="Standard Error"
 | 
			
		||||
            :data="scriptInfo.stderr"
 | 
			
		||||
          />
 | 
			
		||||
          <q-separator />
 | 
			
		||||
          <pre>{{ scriptInfo.stderr }}</pre>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -43,8 +49,13 @@ import { computed } from "vue";
 | 
			
		||||
import { useStore } from "vuex";
 | 
			
		||||
import { useDialogPluginComponent } from "quasar";
 | 
			
		||||
 | 
			
		||||
import ScriptOutputCopyClip from "@/components/scripts/ScriptOutputCopyClip.vue";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "ScriptOutput",
 | 
			
		||||
  components: {
 | 
			
		||||
    ScriptOutputCopyClip,
 | 
			
		||||
  },
 | 
			
		||||
  emits: [...useDialogPluginComponent.emits],
 | 
			
		||||
  props: { scriptInfo: !Object },
 | 
			
		||||
  setup() {
 | 
			
		||||
 
 | 
			
		||||
@@ -175,6 +175,8 @@
 | 
			
		||||
          class="q-pl-md q-pr-md q-pt-none q-ma-none scroll"
 | 
			
		||||
          style="max-height: 50vh"
 | 
			
		||||
        >
 | 
			
		||||
          <script-output-copy-clip label="Output" :data="ret" />
 | 
			
		||||
          <q-separator />
 | 
			
		||||
          <pre>{{ ret }}</pre>
 | 
			
		||||
        </q-card-section>
 | 
			
		||||
      </q-form>
 | 
			
		||||
@@ -195,6 +197,7 @@ import { formatScriptSyntax } from "@/utils/format";
 | 
			
		||||
 | 
			
		||||
//ui imports
 | 
			
		||||
import TacticalDropdown from "@/components/ui/TacticalDropdown.vue";
 | 
			
		||||
import ScriptOutputCopyClip from "@/components/scripts/ScriptOutputCopyClip.vue";
 | 
			
		||||
 | 
			
		||||
// types
 | 
			
		||||
import type { Agent } from "@/types/agents";
 | 
			
		||||
 
 | 
			
		||||
@@ -104,6 +104,9 @@
 | 
			
		||||
            type="submit"
 | 
			
		||||
          />
 | 
			
		||||
        </q-card-actions>
 | 
			
		||||
        <q-card-section v-if="ret !== null"
 | 
			
		||||
          ><script-output-copy-clip label="Output" :data="ret" /> <q-separator
 | 
			
		||||
        /></q-card-section>
 | 
			
		||||
        <q-card-section
 | 
			
		||||
          v-if="ret !== null"
 | 
			
		||||
          class="q-pl-md q-pr-md q-pt-none q-ma-none scroll"
 | 
			
		||||
@@ -124,8 +127,13 @@ import { sendAgentCommand } from "@/api/agents";
 | 
			
		||||
import { cmdPlaceholder } from "@/composables/agents";
 | 
			
		||||
import { runAsUserToolTip } from "@/constants/constants";
 | 
			
		||||
 | 
			
		||||
import ScriptOutputCopyClip from "@/components/scripts/ScriptOutputCopyClip.vue";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "SendCommand",
 | 
			
		||||
  components: {
 | 
			
		||||
    ScriptOutputCopyClip,
 | 
			
		||||
  },
 | 
			
		||||
  emits: [...useDialogPluginComponent.emits],
 | 
			
		||||
  props: {
 | 
			
		||||
    agent: !Object,
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,10 @@
 | 
			
		||||
    @show="loadEditor"
 | 
			
		||||
    @before-hide="cleanupEditors"
 | 
			
		||||
  >
 | 
			
		||||
    <q-card class="q-dialog-plugin" style="width: 60vw">
 | 
			
		||||
    <q-card
 | 
			
		||||
      class="q-dialog-plugin"
 | 
			
		||||
      :style="`width: ${props.type === 'web' ? 50 : 60}vw; max-width: ${props.type === 'web' ? 60 : 70}vw`"
 | 
			
		||||
    >
 | 
			
		||||
      <q-bar>
 | 
			
		||||
        {{
 | 
			
		||||
          props.action
 | 
			
		||||
@@ -71,7 +74,6 @@
 | 
			
		||||
 | 
			
		||||
        <q-card-section v-show="type === 'rest'">
 | 
			
		||||
          <q-toolbar>
 | 
			
		||||
            <q-space />
 | 
			
		||||
            <q-tabs v-model="tab" dense shrink>
 | 
			
		||||
              <q-tab
 | 
			
		||||
                name="body"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										26
									
								
								src/components/scripts/ScriptOutputCopyClip.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/components/scripts/ScriptOutputCopyClip.vue
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <div class="row q-gutter-sm items-center">
 | 
			
		||||
    <div class="col-auto">{{ label }}</div>
 | 
			
		||||
    <div class="col-auto">
 | 
			
		||||
      <q-btn dense flat size="md" icon="content_copy" @click="copyText">
 | 
			
		||||
        <q-tooltip>Copy to Clipboard</q-tooltip>
 | 
			
		||||
      </q-btn>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script setup lang="ts">
 | 
			
		||||
import { copyOutput } from "@/utils/helpers";
 | 
			
		||||
 | 
			
		||||
const props = defineProps({
 | 
			
		||||
  label: String,
 | 
			
		||||
  data: {
 | 
			
		||||
    type: String,
 | 
			
		||||
    required: true,
 | 
			
		||||
  },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const copyText = () => {
 | 
			
		||||
  copyOutput(props.data);
 | 
			
		||||
};
 | 
			
		||||
</script>
 | 
			
		||||
@@ -18,12 +18,12 @@
 | 
			
		||||
        </div>
 | 
			
		||||
        <br />
 | 
			
		||||
        <div v-if="ret.stdout">
 | 
			
		||||
          Standard Output
 | 
			
		||||
          <script-output-copy-clip label="Standard Output" :data="ret.stdout" />
 | 
			
		||||
          <q-separator />
 | 
			
		||||
          <pre>{{ ret.stdout }}</pre>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div v-if="ret.stderr">
 | 
			
		||||
          Standard Error
 | 
			
		||||
          <script-output-copy-clip label="Standard Error" :data="ret.stderr" />
 | 
			
		||||
          <q-separator />
 | 
			
		||||
          <pre>{{ ret.stderr }}</pre>
 | 
			
		||||
        </div>
 | 
			
		||||
@@ -38,9 +38,13 @@
 | 
			
		||||
import { ref, onMounted } from "vue";
 | 
			
		||||
import { testScript, testScriptOnServer } from "@/api/scripts";
 | 
			
		||||
import { useDialogPluginComponent } from "quasar";
 | 
			
		||||
import ScriptOutputCopyClip from "@/components/scripts/ScriptOutputCopyClip.vue";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "TestScriptModal",
 | 
			
		||||
  components: {
 | 
			
		||||
    ScriptOutputCopyClip,
 | 
			
		||||
  },
 | 
			
		||||
  emits: [...useDialogPluginComponent.emits],
 | 
			
		||||
  props: {
 | 
			
		||||
    script: !Object,
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								src/utils/helpers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/utils/helpers.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
import { copyToClipboard } from "quasar";
 | 
			
		||||
import { notifySuccess } from "@/utils/notify";
 | 
			
		||||
 | 
			
		||||
export function copyOutput(val: string) {
 | 
			
		||||
  copyToClipboard(val).then(() => {
 | 
			
		||||
    notifySuccess("Copied to clipboard");
 | 
			
		||||
  });
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user