import { defineComponent, onMounted, ref, watch, onUnmounted, nextTick } from 'vue' import { CTitleBanner } from '../../../components/CTitleBanner' import { CDateTime } from '../../../components/CDateTime' import { CMyFieldDb } from '../../../components/CMyFieldDb' import { useQuasar } from 'quasar' import { useI18n } from '@/boot/i18n' import { useUserStore } from '@store/UserStore' import { useGlobalStore } from '@store/globalStore' import { useCircuitStore } from '@store/CircuitStore' import { tools } from '@store/Modules/tools' import { costanti } from '@costanti' import { shared_consts } from '@src/common/shared_vuejs' export default defineComponent({ name: 'server', components: { CTitleBanner, CDateTime, CMyFieldDb }, props: {}, setup() { const $q = useQuasar() const { t } = useI18n() const circuitStore = useCircuitStore() const messages = ref('') const input = ref('') const scriptName = ref('') const inputRequired = ref(false) const inputPrompt = ref('') const statusWs = ref('') let ws: any = null; const ris = ref('') const riga = ref(0) const numpersone = ref(7) const date_start = ref(new Date()) const col = ref(0) const placca = ref('') const valmin = ref(200) const circuitId = ref('') const valmax = ref(400) const defmin = ref(shared_consts.CIRCUIT_PARAMS.SCOPERTO_MIN_GRP) const defmax = ref(shared_consts.CIRCUIT_PARAMS.SCOPERTO_MAX_GRP) const defpersmin = ref(100) const defpersmax = ref(200) const search_username = ref('') const replace_username = ref('') const incaricamento = ref(false) const myarrscript = ref([]) const myarroptionsdir = ref([]) const myarrdir = ref([]) const mydir = ref('') const scrollArea = ref(null) const globalStore = useGlobalStore() watch(() => mydir.value, async (to: any, from: any) => { // ... // console.log('Watching ' + mydir.value) myarrscript.value = [] if (mydir.value) myarrscript.value = await getArrayByScript('ls "admin_scripts/' + mydir.value + '/"', 'sh') }) watch(() => messages.value, async (to: any, from: any) => { await nextTick(); // Aspetta che il DOM si aggiorni scrollToBottom(); }); async function eseguiScriptSenzaConferma(script: string, ritornaout: boolean, dir: string, listafiles: boolean, extfiles: string, withinput: boolean) { // console.log('eseguiScriptSenzaConferma ' + script) const mydata = { script, dir, tokcheck: "php8.1_version_762321HSD121nJDokq@?!aFS.tar.gz", listafiles, extfiles, withinput } const risfunz = await globalStore.execScript({ mydata }) if (ritornaout) { if (listafiles) { return risfunz.arrout } else { return risfunz.stdout } } else { return risfunz } } async function getArrayByScript(script: string, extfiles: string) { let mystr = 'admin_scripts/' if (mydir.value) { mystr += mydir.value } return await eseguiScriptSenzaConferma(script, true, mystr, true, extfiles, false) } async function mounted() { myarrdir.value = await getArrayByScript('cd admin_scripts; ls -d */', '') myarroptionsdir.value = [] if (myarrdir.value) { for (let i = 0; i < myarrdir.value.length; i++) { const opt = { label: myarrdir.value[i].label, value: myarrdir.value[i].value } myarroptionsdir.value.push(opt) } } if (myarrdir.value && myarrdir.value.length > 0) { mydir.value = myarrdir.value[0].value } connectWebSocket() scrollToBottom() } const scrollToBottom = () => { nextTick(() => { if (scrollArea.value) { const el = scrollArea.value.$el; let scrollHeight = el.scrollHeight if (el) { // Use el.scrollIntoView() to instantly scroll to the element scrollArea.value.setScrollPosition('vertical', 10000) } } }) }; onUnmounted(() => { if (ws) { ws.close(); statusWs.value = 'CLOSE'; } }); function EseguiScript(script: string) { const userStore = useUserStore() $q.dialog({ message: t('dialog.continue') + ' ' + script + ' ?', ok: { label: t('dialog.yes'), push: true, }, cancel: { label: t('dialog.cancel'), }, title: 'Funzione:', }).onOk(async () => { incaricamento.value = true $q.loading.show({ message: t('otherpages.update') }) const risfunz = await eseguiScriptSenzaConferma(script, false, '', false, '', true) $q.loading.hide() // await globalStore.loadSite() incaricamento.value = false console.log('EseguiScript', risfunz) //write the string of the time now let timenowstr = '✅ Eseguito alle ' + tools.getstrTimeAll(Date.now()) + ' -> ' + '
' if (risfunz.stderr) ris.value = timenowstr + '' + 'ERRORE: ' + risfunz.stderr + '
' + ris.value if (risfunz.stdout) ris.value = timenowstr + risfunz.stdout + '
' + ris.value }) } const connectWebSocket = () => { let myurlws = tools.getWssUrl() ws = new WebSocket(myurlws) const input = ref(''); console.log('connectWebSocket ... ' + myurlws) ws.onmessage = (event: any) => { const data = JSON.parse(event.data); if (data.type === 'output' || data.type === 'error') { messages.value += data.data; scrollToBottom() } else if (data.type === 'input_required') { inputRequired.value = true; inputPrompt.value = data.prompt; } else if (data.type === 'close') { messages.value += '\n' + data.data } }; ws.onclose = () => { statusWs.value = 'CLOSE'; messages.value += '\nConnessione chiusa. Riconnessione...' setTimeout(connectWebSocket, 5000); }; }; const startScript = (scriptName: string) => { if (ws && ws.readyState === WebSocket.OPEN && scriptName) { // ('Start Script ', ws) statusWs.value = 'OPEN' // messages.value = '' // Pulisce i messaggi precedenti inputRequired.value = false; let timenowstr = '
✅ Eseguito alle ' + tools.getstrTimeAll(Date.now()) + ' -> ' + '
' messages.value += timenowstr ws.send(JSON.stringify({ type: 'start_script', scriptName, dir: mydir.value })); } }; const sendInput = () => { if (ws && ws.readyState === WebSocket.OPEN) { ws.send(JSON.stringify({ type: 'input', data: input.value })); // messages.value.push(input.value + '\n') input.value = ''; inputRequired.value = false; } }; onMounted(mounted) return { EseguiScript, tools, costanti, search_username, replace_username, valmin, valmax, defmin, defmax, defpersmin, defpersmax, circuitId, circuitStore, incaricamento, ris, myarrscript, mydir, myarrdir, myarroptionsdir, messages, input, scriptName, startScript, sendInput, inputRequired, inputPrompt, statusWs, scrollArea, } }, })