diff --git a/src/cli.ts b/src/cli.ts index 8115b31d..f0baa5bb 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -193,6 +193,8 @@ program '--space ', 'the target Kibana spaces for the pushed monitors — spaces help you organise pushed monitors.' ) + .option('--proxy_uri ', 'proxy uri to use when pushing to kibana') + .option('--proxy_token ', 'auth token to use the proxy') .option('-y, --yes', 'skip all questions and run non-interactively') .addOption(pattern) .addOption(tags) diff --git a/src/common_types.ts b/src/common_types.ts index 476ccb8e..4551f94e 100644 --- a/src/common_types.ts +++ b/src/common_types.ts @@ -263,6 +263,8 @@ export type PushOptions = Partial & retestOnFailure?: MonitorConfig['retestOnFailure']; enabled?: boolean; grepOpts?: GrepOptions; + proxy_uri?: string; + proxy_token?: string; }; export type ProjectSettings = { diff --git a/src/locations/index.ts b/src/locations/index.ts index d5acf09e..28b6fef4 100644 --- a/src/locations/index.ts +++ b/src/locations/index.ts @@ -49,6 +49,7 @@ export async function getLocations(options: LocationCmdOptions) { url: generateURL(options, 'location'), method: 'GET', auth: options.auth, + proxyAgent: null, // for now we don't support proxy with this. }); return resp.locations; } diff --git a/src/push/kibana_api.ts b/src/push/kibana_api.ts index 123a38aa..290f90b5 100644 --- a/src/push/kibana_api.ts +++ b/src/push/kibana_api.ts @@ -34,7 +34,7 @@ import { sendRequest, APIMonitorError, } from './request'; -import { generateURL } from './utils'; +import { build_proxy_settings, generateURL } from './utils'; // Default batch size for bulk put / delete export const BATCH_SIZE = parseInt(process.env.CHUNK_SIZE) || 250; @@ -57,6 +57,7 @@ export async function bulkPutMonitors( method: 'PUT', auth: options.auth, body: JSON.stringify({ monitors: schemas }), + proxyAgent: build_proxy_settings(options.proxy_uri, options.proxy_token), }); const { failedMonitors } = resp; @@ -103,6 +104,7 @@ const fetchMonitors = async (options: PushOptions, afterKey?: string) => { url, method: 'GET', auth: options.auth, + proxyAgent: build_proxy_settings(options.proxy_uri, options.proxy_token), }); return { afterKey: resp.after_key, @@ -124,6 +126,7 @@ export async function bulkDeleteMonitors( method: 'DELETE', auth: options.auth, body: JSON.stringify({ monitors: monitorIDs }), + proxyAgent: build_proxy_settings(options.proxy_uri, options.proxy_token), }); } @@ -138,6 +141,7 @@ export async function getVersion(options: PushOptions) { url: generateURL(options, 'status'), method: 'GET', auth: options.auth, + proxyAgent: build_proxy_settings(options?.proxy_uri, options?.proxy_token), }); return data.kibana.version; @@ -169,6 +173,7 @@ export async function createMonitorsLegacy({ method: 'PUT', auth: options.auth, body: JSON.stringify(schema), + proxyAgent: build_proxy_settings(options.proxy_uri, options.proxy_token), }); const resBody = await handleError(statusCode, url, body); diff --git a/src/push/request.ts b/src/push/request.ts index ef97399b..c0fbd314 100644 --- a/src/push/request.ts +++ b/src/push/request.ts @@ -32,6 +32,7 @@ import { indent, symbols } from '../helpers'; const { version } = require('../../package.json'); export type APIRequestOptions = { + proxyAgent: Dispatcher; url: string; method: Dispatcher.HttpMethod; auth: string; @@ -39,7 +40,7 @@ export type APIRequestOptions = { }; export async function sendRequest(options: APIRequestOptions) { - return await request(options.url, { + const request_options = { method: options.method, body: options.body, headers: { @@ -51,7 +52,9 @@ export async function sendRequest(options: APIRequestOptions) { }, // align with the default timeout of the kibana route headersTimeout: 2 * 60 * 1000, - }); + }; + if (options.proxyAgent) request_options['dispatcher'] = options.proxyAgent; + return await request(options.url, request_options); } export async function sendReqAndHandleError( diff --git a/src/push/utils.ts b/src/push/utils.ts index 9beb67e4..5b28ff48 100644 --- a/src/push/utils.ts +++ b/src/push/utils.ts @@ -28,6 +28,7 @@ import { progress, removeTrailingSlash } from '../helpers'; import { green, red, grey, yellow, Colorize, bold } from 'kleur/colors'; import { PushOptions } from '../common_types'; import { Monitor } from '../dsl/monitor'; +import { ProxyAgent } from 'undici'; export function logDiff>( newIDs: T, @@ -199,3 +200,14 @@ export function normalizeMonitorName(p: string, replacement = '_') { p = p.replace(/[:]+/g, replacement); return p; } + +export function build_proxy_settings(proxy_uri: string, proxy_auth: string) { + let proxyAgent = null; + if (proxy_uri) { + proxyAgent = new ProxyAgent({ + uri: proxy_uri, + token: proxy_auth, + }); + } + return proxyAgent; +}