#!/usr/bin/env node const fetch = require('node-fetch'); const colors = require('colors'); const os = require('os'); const fs = require('fs'); const getopts = require('getopts'); const homeDir = os.homedir(); const configFile = `${homeDir}/.grafana-find.json`; if (!fs.existsSync(configFile)) { console.error(`Configuration file not found: ${configFile}`.red); process.exit(1); } /* Pedir contraseƱa ----------------- const readline = require('readline'); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const answer = await new Promise(resolve => { rl.question('Are you sure? (Default: no) [yes|no] ', resolve); }); rl.close(); */ const findAll = `WHERE d.name LIKE '%EQUIPO %'`; const apiKey = `Bearer eyJrIjoiaHczdnZsOGd5M0xNUHJwZ3V4MGpvQzV0QVNGblpySloiLCJuIjoiZmluZEFsbF9HcmFmYW5hIiwiaWQiOjF9`; const config = require(configFile); const grafanaUrl = config.grafanaUrl; const grafanaApi = `${grafanaUrl}/api`; const urlDashboards = `${grafanaApi}/search`; const urlUID = `${grafanaApi}/dashboards/uid/`; let numberOfDashboards = 0; let numberOfObjects = 0; let numberOfVariables = 0; let titlePanels = new Array; const regexRawSQL = new RegExp(findAll, 'i'); async function main(){ console.clear(); console.log(colors.green.bold(`-------------------- Starting process --------------------`)); let responseAllUID = await fetch(urlDashboards, { method: "GET", headers: { "Authorization": apiKey, } }); let allUID = await responseAllUID.json(); for (let i=0; i < allUID.length; i++) { let url = urlUID + allUID[i].uid; let response = await fetch(url, { method: "GET", headers: { "Authorization": apiKey, } }); let data = await response.json(); let isFound = false; const dashboard = data.dashboard; if (dashboard) { if (dashboard.panels) for (const panel of dashboard.panels) { if (panel.targets) for (const target of panel.targets) { isFound = regexRawSQL.test(target.rawSql); if (isFound) { if (panel.title) titlePanels.push(panel.title); else titlePanels.push("?"); numberOfObjects++; } } } if (dashboard.templating) for (const list of dashboard.templating.list) { isFound = regexRawSQL.test(list.query); if (isFound) { numberOfVariables++; numberOfObjects++; } } } if (isFound) { const linkUrl = `${grafanaUrl}/d/${allUID[i].uid}`; if (titlePanels.length) console.log(colors.yellow(linkUrl), colors.white(titlePanels.toString().split(","))); else console.log(colors.yellow(linkUrl)); if (numberOfVariables) console.log(colors.magenta(`> ${numberOfVariables} variables`)); numberOfDashboards++; } titlePanels.pop(); numberOfVariables=0; } if (numberOfDashboards==0) console.log(`No results found`.red); else console.log(colors.green.bold(`---- Have been found ${numberOfObjects} results in ${numberOfDashboards} dashboards ----`)); } main();