connection://http/instance
http://example.com
>,
+ scheme: "string",
+ required: true
+ },
+ {
+ name: "username",
+ description: <>Username for HTTP Basic Auth>,
+ scheme: EnvVar,
+ },
+ {
+ name: "password",
+ description: <>Password for HTTP Basic Auth>,
+ scheme: EnvVar,
+ }
+];
diff --git a/mission-control/src/components/Feature.jsx b/mission-control/src/components/Feature.jsx
new file mode 100644
index 00000000..f1ccede8
--- /dev/null
+++ b/mission-control/src/components/Feature.jsx
@@ -0,0 +1,50 @@
+
+import React from 'react';
+import { FeatureBody } from './FeatureBody';
+export function Feature({ image, title, subtitle, url, left = true, children, }) {
+
+ var icon = image
+ if ((typeof image) === 'string') {
+ icon =
+ }
+ if (left) {
+ return (
+ {title}
++ {children} +
++ Aggregate alerts, run synthetic checks / tests against your services and infrastructure. +
++ Generate synthetic traffic, run queries against various datasources, or even run full integration test suites to verify the health of your services and infrastructure. +
++ Consolidate alerts across your monitoring stack and create alerts from non-traditional sources like SQL, NoSQL and CI/CD pipelines. +
++ Batteries including support for HTTP, DNS, ICMP, LDAP, Prometheus, SQL, Mongo, Redis, Github, Azure Devops, JMeter, K6, Playwright, Newman/Postman, SMB, SFTP, +
++ Canary checker is 100% open source under the Apache 2.0 license. We welcome contributions from our awesome community. +
+ +
+Support for Canary Checker is available as part of the Flanksource Mission Control Internal Developer Platform + +
docs
directory.
+ >
+ ),
+ },
+ {
+ title: 'Powered by React',
+ Svg: require('@site/static/img/undraw_docusaurus_react.svg').default,
+ description: (
+ <>
+ Extend or customize your website layout by reusing React. Docusaurus can
+ be extended while reusing the same header and footer.
+ >
+ ),
+ },
+];
+
+function Feature({Svg, title, description}) {
+ return (
+ {description}
+Field | +Description | +Scheme | +Required | +
---|---|---|---|
{arg.name} |
+ {arg.description} | +{arg.scheme} |
+ {arg.required ? 'Yes' : 'No'} | +
: wrapped inside (not inline).
+ var pre = env.element.parentElement;
+ if (!pre || !/pre/i.test(pre.nodeName) || // Abort only if neither the nor the have the class
+ (!CLASS_PATTERN.test(pre.className) && !CLASS_PATTERN.test(env.element.className))) {
+ commandLine.complete = true;
+ return;
+ }
+
+ // The element might be highlighted multiple times, so we just remove the previous prompt
+ var existingPrompt = env.element.querySelector('.' + PROMPT_CLASS);
+ if (existingPrompt) {
+ existingPrompt.remove();
+ }
+
+ var codeLines = env.code.split('\n');
+
+ commandLine.numberOfLines = codeLines.length;
+ /** @type {string[]} */
+ var outputLines = commandLine.outputLines = [];
+
+ var outputSections = pre.getAttribute('data-output');
+ var outputFilter = pre.getAttribute('data-filter-output');
+ if (outputSections !== null) { // The user specified the output lines. -- cwells
+ outputSections.split(',').forEach(function (section) {
+ var range = section.split('-');
+ var outputStart = parseInt(range[0], 10);
+ var outputEnd = range.length === 2 ? parseInt(range[1], 10) : outputStart;
+
+ if (!isNaN(outputStart) && !isNaN(outputEnd)) {
+ if (outputStart < 1) {
+ outputStart = 1;
+ }
+ if (outputEnd > codeLines.length) {
+ outputEnd = codeLines.length;
+ }
+ // Convert start and end to 0-based to simplify the arrays. -- cwells
+ outputStart--;
+ outputEnd--;
+ // Save the output line in an array and clear it in the code so it's not highlighted. -- cwells
+ for (var j = outputStart; j <= outputEnd; j++) {
+ outputLines[j] = codeLines[j];
+ codeLines[j] = '';
+ }
+ }
+ });
+ } else if (outputFilter) { // Treat lines beginning with this string as output. -- cwells
+ for (var i = 0; i < codeLines.length; i++) {
+ if (startsWith(codeLines[i], outputFilter)) { // This line is output. -- cwells
+ outputLines[i] = codeLines[i].slice(outputFilter.length);
+ codeLines[i] = '';
+ }
+ }
+ }
+
+ var continuationLineIndicies = commandLine.continuationLineIndicies = new Set();
+ var lineContinuationStr = pre.getAttribute('data-continuation-str');
+ var continuationFilter = pre.getAttribute('data-filter-continuation');
+
+ // Identify code lines where the command has continued onto subsequent
+ // lines and thus need a different prompt. Need to do this after the output
+ // lines have been removed to ensure we don't pick up a continuation string
+ // in an output line.
+ for (var j = 0; j < codeLines.length; j++) {
+ var line = codeLines[j];
+ if (!line) {
+ continue;
+ }
+
+ // Record the next line as a continuation if this one ends in a continuation str.
+ if (lineContinuationStr && endsWith(line, lineContinuationStr)) {
+ continuationLineIndicies.add(j + 1);
+ }
+ // Record this line as a continuation if marked with a continuation prefix
+ // (that we will remove).
+ if (j > 0 && continuationFilter && startsWith(line, continuationFilter)) {
+ codeLines[j] = line.slice(continuationFilter.length);
+ continuationLineIndicies.add(j);
+ }
+ }
+
+ env.code = codeLines.join('\n');
+ });
+
+ Prism.hooks.add('before-insert', function (env) {
+ var commandLine = getCommandLineInfo(env);
+
+ if (commandLine.complete) {
+ return;
+ }
+
+ // Reinsert the output lines into the highlighted code. -- cwells
+ var codeLines = env.highlightedCode.split('\n');
+ var outputLines = commandLine.outputLines || [];
+ for (var i = 0, l = codeLines.length; i < l; i++) {
+ // Add spans to allow distinction of input/output text for styling
+ if (outputLines.hasOwnProperty(i)) {
+ // outputLines were removed from codeLines so missed out on escaping
+ // of markup so do it here.
+ codeLines[i] = ''
+ + Prism.util.encode(outputLines[i]) + '';
+ } else {
+ codeLines[i] = ''
+ + codeLines[i] + '';
+ }
+ }
+ env.highlightedCode = codeLines.join('\n');
+ });
+
+ Prism.hooks.add('complete', function (env) {
+ if (!hasCommandLineInfo(env)) {
+ // the previous hooks never ran
+ return;
+ }
+
+ var commandLine = getCommandLineInfo(env);
+
+ if (commandLine.complete) {
+ return;
+ }
+
+ var pre = env.element.parentElement;
+ if (CLASS_PATTERN.test(env.element.className)) { // Remove the class "command-line" from the
+ env.element.className = env.element.className.replace(CLASS_PATTERN, ' ');
+ }
+ if (!CLASS_PATTERN.test(pre.className)) { // Add the class "command-line" to the
+ pre.className += ' command-line';
+ }
+
+ function getAttribute(key, defaultValue) {
+ return (pre.getAttribute(key) || defaultValue).replace(/"/g, '"');
+ }
+
+ // Create the "rows" that will become the command-line prompts. -- cwells
+ var promptLines = '';
+ var rowCount = commandLine.numberOfLines || 0;
+ var promptText = getAttribute('data-prompt', '');
+ var promptLine;
+ if (promptText !== '') {
+ promptLine = '';
+ } else {
+ var user = getAttribute('data-user', 'user');
+ var host = getAttribute('data-host', 'localhost');
+ promptLine = '';
+ }
+
+ var continuationLineIndicies = commandLine.continuationLineIndicies || new Set();
+ var continuationPromptText = getAttribute('data-continuation-prompt', '>');
+ var continuationPromptLine = '';
+
+ // Assemble all the appropriate prompt/continuation lines
+ for (var j = 0; j < rowCount; j++) {
+ if (continuationLineIndicies.has(j)) {
+ promptLines += continuationPromptLine;
+ } else {
+ promptLines += promptLine;
+ }
+ }
+
+ // Create the wrapper element. -- cwells
+ var prompt = document.createElement('span');
+ prompt.className = PROMPT_CLASS;
+ prompt.innerHTML = promptLines;
+
+ // Remove the prompt from the output lines. -- cwells
+ var outputLines = commandLine.outputLines || [];
+ for (var i = 0, l = outputLines.length; i < l; i++) {
+ if (outputLines.hasOwnProperty(i)) {
+ var node = prompt.children[i];
+ node.removeAttribute('data-user');
+ node.removeAttribute('data-host');
+ node.removeAttribute('data-prompt');
+ }
+ }
+
+ env.element.insertBefore(prompt, env.element.firstChild);
+ commandLine.complete = true;
+ });
+
+}());
diff --git a/mission-control/src/theme/prism-include-languages.js b/mission-control/src/theme/prism-include-languages.js
new file mode 100644
index 00000000..18f884e7
--- /dev/null
+++ b/mission-control/src/theme/prism-include-languages.js
@@ -0,0 +1,29 @@
+import siteConfig from '@generated/docusaurus.config';
+
+export default function prismIncludeLanguages(PrismObject) {
+ const {
+ themeConfig: { prism },
+ } = siteConfig;
+ const { additionalLanguages } = prism;
+ // Prism components work on the Prism instance on the window, while prism-
+ // react-renderer uses its own Prism instance. We temporarily mount the
+ // instance onto window, import components to enhance it, then remove it to
+ // avoid polluting global namespace.
+ // You can mutate PrismObject: registering plugins, deleting languages... As
+ // long as you don't re-assign it
+ globalThis.Prism = PrismObject;
+ require('./prism-jq')
+ require('./prism-log')
+ require('./prism-promql')
+ require('./prism-regex')
+ require('./prism-shell-session')
+ require('./prism-command-line')
+ require('./prism-yaml')
+ require('./prism-bash')
+
+ additionalLanguages.forEach((lang) => {
+ // eslint-disable-next-line global-require, import/no-dynamic-require
+ require(`prismjs/components/prism-${lang}`);
+ });
+
+}
diff --git a/mission-control/src/theme/prism-jq.js b/mission-control/src/theme/prism-jq.js
new file mode 100644
index 00000000..3cc030e7
--- /dev/null
+++ b/mission-control/src/theme/prism-jq.js
@@ -0,0 +1,69 @@
+(function (Prism) {
+
+ var interpolation = /\\\((?:[^()]|\([^()]*\))*\)/.source;
+ var string = RegExp(/(^|[^\\])"(?:[^"\r\n\\]|\\[^\r\n(]|__)*"/.source.replace(/__/g, function () { return interpolation; }));
+ var stringInterpolation = {
+ 'interpolation': {
+ pattern: RegExp(/((?:^|[^\\])(?:\\{2})*)/.source + interpolation),
+ lookbehind: true,
+ inside: {
+ 'content': {
+ pattern: /^(\\\()[\s\S]+(?=\)$)/,
+ lookbehind: true,
+ inside: null // see below
+ },
+ 'punctuation': /^\\\(|\)$/
+ }
+ }
+ };
+
+ var jq = Prism.languages.jq = {
+ 'comment': /#.*/,
+ 'property': {
+ pattern: RegExp(string.source + /(?=\s*:(?!:))/.source),
+ lookbehind: true,
+ greedy: true,
+ inside: stringInterpolation
+ },
+ 'string': {
+ pattern: string,
+ lookbehind: true,
+ greedy: true,
+ inside: stringInterpolation
+ },
+
+ 'function': {
+ pattern: /(\bdef\s+)[a-z_]\w+/i,
+ lookbehind: true
+ },
+
+ 'variable': /\B\$\w+/,
+ 'property-literal': {
+ pattern: /\b[a-z_]\w*(?=\s*:(?!:))/i,
+ alias: 'property'
+ },
+ 'keyword': /\b(?:as|break|catch|def|elif|else|end|foreach|if|import|include|label|module|modulemeta|null|reduce|then|try|while)\b/,
+ 'boolean': /\b(?:false|true)\b/,
+ 'number': /(?:\b\d+\.|\B\.)?\b\d+(?:[eE][+-]?\d+)?\b/,
+
+ 'operator': [
+ {
+ pattern: /\|=?/,
+ alias: 'pipe'
+ },
+ /\.\.|[!=<>]?=|\?\/\/|\/\/=?|[-+*/%]=?|[<>?]|\b(?:and|not|or)\b/
+ ],
+ 'c-style-function': {
+ pattern: /\b[a-z_]\w*(?=\s*\()/i,
+ alias: 'function'
+ },
+ 'punctuation': /::|[()\[\]{},:;]|\.(?=\s*[\[\w$])/,
+ 'dot': {
+ pattern: /\./,
+ alias: 'important'
+ }
+ };
+
+ stringInterpolation.interpolation.inside.content.inside = jq;
+
+}(Prism));
diff --git a/mission-control/src/theme/prism-log.js b/mission-control/src/theme/prism-log.js
new file mode 100644
index 00000000..d84defcb
--- /dev/null
+++ b/mission-control/src/theme/prism-log.js
@@ -0,0 +1,120 @@
+// This is a language definition for generic log files.
+// Since there is no one log format, this language definition has to support all formats to some degree.
+//
+// Based on https://github.com/MTDL9/vim-log-highlighting
+
+Prism.languages.log = {
+ 'string': {
+ // Single-quoted strings must not be confused with plain text. E.g. Can't isn't Susan's Chris' toy
+ pattern: /"(?:[^"\\\r\n]|\\.)*"|'(?![st] | \w)(?:[^'\\\r\n]|\\.)*'/,
+ greedy: true,
+ },
+
+ 'exception': {
+ pattern: /(^|[^\w.])[a-z][\w.]*(?:Error|Exception):.*(?:(?:\r\n?|\n)[ \t]*(?:at[ \t].+|\.{3}.*|Caused by:.*))+(?:(?:\r\n?|\n)[ \t]*\.\.\. .*)?/,
+ lookbehind: true,
+ greedy: true,
+ alias: ['javastacktrace', 'language-javastacktrace'],
+ inside: Prism.languages['javastacktrace'] || {
+ 'keyword': /\bat\b/,
+ 'function': /[a-z_][\w$]*(?=\()/,
+ 'punctuation': /[.:()]/
+ }
+ },
+
+ 'level': [
+ {
+ pattern: /\b(?:ALERT|CRIT|CRITICAL|EMERG|EMERGENCY|ERR|ERROR|FAILURE|FATAL|SEVERE)\b/,
+ alias: ['error', 'important']
+ },
+ {
+ pattern: /\b(?:WARN|WARNING|WRN)\b/,
+ alias: ['warning', 'important']
+ },
+ {
+ pattern: /\b(?:DISPLAY|INF|INFO|NOTICE|STATUS)\b/,
+ alias: ['info', 'keyword']
+ },
+ {
+ pattern: /\b(?:DBG|DEBUG|FINE)\b/,
+ alias: ['debug', 'keyword']
+ },
+ {
+ pattern: /\b(?:FINER|FINEST|TRACE|TRC|VERBOSE|VRB)\b/,
+ alias: ['trace', 'comment']
+ }
+ ],
+
+ 'property': {
+ pattern: /((?:^|[\]|])[ \t]*)[a-z_](?:[\w-]|\b\/\b)*(?:[. ]\(?\w(?:[\w-]|\b\/\b)*\)?)*:(?=\s)/im,
+ lookbehind: true
+ },
+
+ 'separator': {
+ pattern: /(^|[^-+])-{3,}|={3,}|\*{3,}|- - /m,
+ lookbehind: true,
+ alias: 'comment'
+ },
+
+ 'url': /\b(?:file|ftp|https?):\/\/[^\s|,;'"]*[^\s|,;'">.]/,
+ 'email': {
+ pattern: /(^|\s)[-\w+.]+@[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)+(?=\s)/,
+ lookbehind: true,
+ alias: 'url'
+ },
+
+ 'ip-address': {
+ pattern: /\b(?:\d{1,3}(?:\.\d{1,3}){3})\b/,
+ alias: 'constant'
+ },
+ 'mac-address': {
+ pattern: /\b[a-f0-9]{2}(?::[a-f0-9]{2}){5}\b/i,
+ alias: 'constant'
+ },
+ 'domain': {
+ pattern: /(^|\s)[a-z][a-z0-9-]*(?:\.[a-z][a-z0-9-]*)*\.[a-z][a-z0-9-]+(?=\s)/,
+ lookbehind: true,
+ alias: 'constant'
+ },
+
+ 'uuid': {
+ pattern: /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b/i,
+ alias: 'constant'
+ },
+ 'hash': {
+ pattern: /\b(?:[a-f0-9]{32}){1,2}\b/i,
+ alias: 'constant'
+ },
+
+ 'file-path': {
+ pattern: /\b[a-z]:[\\/][^\s|,;:(){}\[\]"']+|(^|[\s:\[\](>|])\.{0,2}\/\w[^\s|,;:(){}\[\]"']*/i,
+ lookbehind: true,
+ greedy: true,
+ alias: 'string'
+ },
+
+ 'date': {
+ pattern: RegExp(
+ /\b\d{4}[-/]\d{2}[-/]\d{2}(?:T(?=\d{1,2}:)|(?=\s\d{1,2}:))/.source +
+ '|' +
+ /\b\d{1,4}[-/ ](?:\d{1,2}|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)[-/ ]\d{2,4}T?\b/.source +
+ '|' +
+ /\b(?:(?:Fri|Mon|Sat|Sun|Thu|Tue|Wed)(?:\s{1,2}(?:Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep))?|Apr|Aug|Dec|Feb|Jan|Jul|Jun|Mar|May|Nov|Oct|Sep)\s{1,2}\d{1,2}\b/.source,
+ 'i'
+ ),
+ alias: 'number'
+ },
+ 'time': {
+ pattern: /\b\d{1,2}:\d{1,2}:\d{1,2}(?:[.,:]\d+)?(?:\s?[+-]\d{2}:?\d{2}|Z)?\b/,
+ alias: 'number'
+ },
+
+ 'boolean': /\b(?:false|null|true)\b/i,
+ 'number': {
+ pattern: /(^|[^.\w])(?:0x[a-f0-9]+|0o[0-7]+|0b[01]+|v?\d[\da-f]*(?:\.\d+)*(?:e[+-]?\d+)?[a-z]{0,3}\b)\b(?!\.\w)/i,
+ lookbehind: true
+ },
+
+ 'operator': /[;:?<=>~/@!$%&+\-|^(){}*#]/,
+ 'punctuation': /[\[\].,]/
+};
diff --git a/mission-control/src/theme/prism-promql.js b/mission-control/src/theme/prism-promql.js
new file mode 100644
index 00000000..d12f7303
--- /dev/null
+++ b/mission-control/src/theme/prism-promql.js
@@ -0,0 +1,99 @@
+// Thanks to: https://github.com/prometheus-community/monaco-promql/blob/master/src/promql/promql.ts
+// As well as: https://kausal.co/blog/slate-prism-add-new-syntax-promql/
+
+(function (Prism) {
+ // PromQL Aggregation Operators
+ // (https://prometheus.io/docs/prometheus/latest/querying/operators/#aggregation-operators)
+ var aggregations = [
+ 'sum',
+ 'min',
+ 'max',
+ 'avg',
+ 'group',
+ 'stddev',
+ 'stdvar',
+ 'count',
+ 'count_values',
+ 'bottomk',
+ 'topk',
+ 'quantile'
+ ];
+
+ // PromQL vector matching + the by and without clauses
+ // (https://prometheus.io/docs/prometheus/latest/querying/operators/#vector-matching)
+ var vectorMatching = [
+ 'on',
+ 'ignoring',
+ 'group_right',
+ 'group_left',
+ 'by',
+ 'without',
+ ];
+
+ // PromQL offset modifier
+ // (https://prometheus.io/docs/prometheus/latest/querying/basics/#offset-modifier)
+ var offsetModifier = ['offset'];
+
+ var keywords = aggregations.concat(vectorMatching, offsetModifier);
+
+ Prism.languages.promql = {
+ 'comment': {
+ pattern: /(^[ \t]*)#.*/m,
+ lookbehind: true
+ },
+ 'vector-match': {
+ // Match the comma-separated label lists inside vector matching:
+ pattern: new RegExp('((?:' + vectorMatching.join('|') + ')\\s*)\\([^)]*\\)'),
+ lookbehind: true,
+ inside: {
+ 'label-key': {
+ pattern: /\b[^,]+\b/,
+ alias: 'attr-name',
+ },
+ 'punctuation': /[(),]/
+ },
+ },
+ 'context-labels': {
+ pattern: /\{[^{}]*\}/,
+ inside: {
+ 'label-key': {
+ pattern: /\b[a-z_]\w*(?=\s*(?:=|![=~]))/,
+ alias: 'attr-name',
+ },
+ 'label-value': {
+ pattern: /(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,
+ greedy: true,
+ alias: 'attr-value',
+ },
+ 'punctuation': /\{|\}|=~?|![=~]|,/,
+ },
+ },
+ 'context-range': [
+ {
+ pattern: /\[[\w\s:]+\]/, // [1m]
+ inside: {
+ 'punctuation': /\[|\]|:/,
+ 'range-duration': {
+ pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
+ alias: 'number',
+ },
+ },
+ },
+ {
+ pattern: /(\boffset\s+)\w+/, // offset 1m
+ lookbehind: true,
+ inside: {
+ 'range-duration': {
+ pattern: /\b(?:\d+(?:[smhdwy]|ms))+\b/i,
+ alias: 'number',
+ },
+ },
+ },
+ ],
+ 'keyword': new RegExp('\\b(?:' + keywords.join('|') + ')\\b', 'i'),
+ 'function': /\b[a-z_]\w*(?=\s*\()/i,
+ 'number': /[-+]?(?:(?:\b\d+(?:\.\d+)?|\B\.\d+)(?:e[-+]?\d+)?\b|\b(?:0x[0-9a-f]+|nan|inf)\b)/i,
+ 'operator': /[\^*/%+-]|==|!=|<=|<|>=|>|\b(?:and|or|unless)\b/i,
+ 'punctuation': /[{};()`,.[\]]/,
+ };
+}(Prism));
diff --git a/mission-control/src/theme/prism-regex.js b/mission-control/src/theme/prism-regex.js
new file mode 100644
index 00000000..a565e234
--- /dev/null
+++ b/mission-control/src/theme/prism-regex.js
@@ -0,0 +1,104 @@
+(function (Prism) {
+
+ var specialEscape = {
+ pattern: /\\[\\(){}[\]^$+*?|.]/,
+ alias: 'escape'
+ };
+ var escape = /\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/;
+ var charSet = {
+ pattern: /\.|\\[wsd]|\\p\{[^{}]+\}/i,
+ alias: 'class-name'
+ };
+ var charSetWithoutDot = {
+ pattern: /\\[wsd]|\\p\{[^{}]+\}/i,
+ alias: 'class-name'
+ };
+
+ var rangeChar = '(?:[^\\\\-]|' + escape.source + ')';
+ var range = RegExp(rangeChar + '-' + rangeChar);
+
+ // the name of a capturing group
+ var groupName = {
+ pattern: /(<|')[^<>']+(?=[>']$)/,
+ lookbehind: true,
+ alias: 'variable'
+ };
+
+ Prism.languages.regex = {
+ 'char-class': {
+ pattern: /((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,
+ lookbehind: true,
+ inside: {
+ 'char-class-negation': {
+ pattern: /(^\[)\^/,
+ lookbehind: true,
+ alias: 'operator'
+ },
+ 'char-class-punctuation': {
+ pattern: /^\[|\]$/,
+ alias: 'punctuation'
+ },
+ 'range': {
+ pattern: range,
+ inside: {
+ 'escape': escape,
+ 'range-punctuation': {
+ pattern: /-/,
+ alias: 'operator'
+ }
+ }
+ },
+ 'special-escape': specialEscape,
+ 'char-set': charSetWithoutDot,
+ 'escape': escape
+ }
+ },
+ 'special-escape': specialEscape,
+ 'char-set': charSet,
+ 'backreference': [
+ {
+ // a backreference which is not an octal escape
+ pattern: /\\(?![123][0-7]{2})[1-9]/,
+ alias: 'keyword'
+ },
+ {
+ pattern: /\\k<[^<>']+>/,
+ alias: 'keyword',
+ inside: {
+ 'group-name': groupName
+ }
+ }
+ ],
+ 'anchor': {
+ pattern: /[$^]|\\[ABbGZz]/,
+ alias: 'function'
+ },
+ 'escape': escape,
+ 'group': [
+ {
+ // https://docs.oracle.com/javase/10/docs/api/java/util/regex/Pattern.html
+ // https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference?view=netframework-4.7.2#grouping-constructs
+
+ // (), (?), (?'name'), (?>), (?:), (?=), (?!), (?<=), (?']+>|'[^<>']+'|[>:]|[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,
+ alias: 'punctuation',
+ inside: {
+ 'group-name': groupName
+ }
+ },
+ {
+ pattern: /\)/,
+ alias: 'punctuation'
+ }
+ ],
+ 'quantifier': {
+ pattern: /(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,
+ alias: 'number'
+ },
+ 'alternation': {
+ pattern: /\|/,
+ alias: 'keyword'
+ }
+ };
+
+}(Prism));
diff --git a/mission-control/src/theme/prism-shell-session.js b/mission-control/src/theme/prism-shell-session.js
new file mode 100644
index 00000000..1b67ed76
--- /dev/null
+++ b/mission-control/src/theme/prism-shell-session.js
@@ -0,0 +1,70 @@
+(function (Prism) {
+
+ // CAREFUL!
+ // The following patterns are concatenated, so the group referenced by a back reference is non-obvious!
+
+ var strings = [
+ // normal string
+ /"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/.source,
+ /'[^']*'/.source,
+ /\$'(?:[^'\\]|\\[\s\S])*'/.source,
+
+ // here doc
+ // 2 capturing groups
+ /<<-?\s*(["']?)(\w+)\1\s[\s\S]*?[\r\n]\2/.source
+ ].join('|');
+
+ Prism.languages['shell-session'] = {
+ 'command': {
+ pattern: RegExp(
+ // user info
+ /^/.source +
+ '(?:' +
+ (
+ // ":" ( )?
+ /[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+(?::[^\0-\x1F$#%*?"<>:;|]+)?/.source +
+ '|' +
+ //
+ // Since the path pattern is quite general, we will require it to start with a special character to
+ // prevent false positives.
+ /[/~.][^\0-\x1F$#%*?"<>@:;|]*/.source
+ ) +
+ ')?' +
+ // shell symbol
+ /[$#%](?=\s)/.source +
+ // bash command
+ /(?:[^\\\r\n \t'"<$]|[ \t](?:(?!#)|#.*$)|\\(?:[^\r]|\r\n?)|\$(?!')|<(?!<)|<>)+/.source.replace(/<>/g, function () { return strings; }),
+ 'm'
+ ),
+ greedy: true,
+ inside: {
+ 'info': {
+ // foo@bar:~/files$ exit
+ // foo@bar$ exit
+ // ~/files$ exit
+ pattern: /^[^#$%]+/,
+ alias: 'punctuation',
+ inside: {
+ 'user': /^[^\s@:$#%*!/\\]+@[^\r\n@:$#%*!/\\]+/,
+ 'punctuation': /:/,
+ 'path': /[\s\S]+/
+ }
+ },
+ 'bash': {
+ pattern: /(^[$#%]\s*)\S[\s\S]*/,
+ lookbehind: true,
+ alias: 'language-bash',
+ inside: Prism.languages.bash
+ },
+ 'shell-symbol': {
+ pattern: /^[$#%]/,
+ alias: 'important'
+ }
+ }
+ },
+ 'output': /.(?:.*(?:[\r\n]|.$))*/
+ };
+
+ Prism.languages['sh-session'] = Prism.languages['shellsession'] = Prism.languages['shell-session'];
+
+}(Prism));
diff --git a/mission-control/src/theme/prism-yaml.js b/mission-control/src/theme/prism-yaml.js
new file mode 100644
index 00000000..a16390bf
--- /dev/null
+++ b/mission-control/src/theme/prism-yaml.js
@@ -0,0 +1,83 @@
+(function (Prism) {
+
+ // https://yaml.org/spec/1.2/spec.html#c-ns-anchor-property
+ // https://yaml.org/spec/1.2/spec.html#c-ns-alias-node
+ var anchorOrAlias = /[*&][^\s[\]{},]+/;
+ // https://yaml.org/spec/1.2/spec.html#c-ns-tag-property
+ var tag = /!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/;
+ // https://yaml.org/spec/1.2/spec.html#c-ns-properties(n,c)
+ var properties = '(?:' + tag.source + '(?:[ \t]+' + anchorOrAlias.source + ')?|'
+ + anchorOrAlias.source + '(?:[ \t]+' + tag.source + ')?)';
+ // https://yaml.org/spec/1.2/spec.html#ns-plain(n,c)
+ // This is a simplified version that doesn't support "#" and multiline keys
+ // All these long scarry character classes are simplified versions of YAML's characters
+ var plainKey = /(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source
+ .replace(//g, function () { return /[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source; });
+ var string = /"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;
+
+ /**
+ *
+ * @param {string} value
+ * @param {string} [flags]
+ * @returns {RegExp}
+ */
+ function createValuePattern(value, flags) {
+ flags = (flags || '').replace(/m/g, '') + 'm'; // add m flag
+ var pattern = /([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source
+ .replace(/<>/g, function () { return properties; }).replace(/<>/g, function () { return value; });
+ return RegExp(pattern, flags);
+ }
+
+ Prism.languages.yaml = {
+ 'scalar': {
+ pattern: RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source
+ .replace(/<>/g, function () { return properties; })),
+ lookbehind: true,
+ alias: 'string'
+ },
+ 'comment': /#.*/,
+ 'key': {
+ pattern: RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source
+ .replace(/<>/g, function () { return properties; })
+ .replace(/<>/g, function () { return '(?:' + plainKey + '|' + string + ')'; })),
+ lookbehind: true,
+ greedy: true,
+ alias: 'atrule'
+ },
+ 'directive': {
+ pattern: /(^[ \t]*)%.+/m,
+ lookbehind: true,
+ alias: 'important'
+ },
+ 'datetime': {
+ pattern: createValuePattern(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),
+ lookbehind: true,
+ alias: 'number'
+ },
+ 'boolean': {
+ pattern: createValuePattern(/false|true/.source, 'i'),
+ lookbehind: true,
+ alias: 'important'
+ },
+ 'null': {
+ pattern: createValuePattern(/null|~/.source, 'i'),
+ lookbehind: true,
+ alias: 'important'
+ },
+ 'string': {
+ pattern: createValuePattern(string),
+ lookbehind: true,
+ greedy: true
+ },
+ 'number': {
+ pattern: createValuePattern(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source, 'i'),
+ lookbehind: true
+ },
+ 'tag': tag,
+ 'important': anchorOrAlias,
+ 'punctuation': /---|[:[\]{}\-,|>?]|\.\.\./
+ };
+
+ Prism.languages.yml = Prism.languages.yaml;
+
+}(Prism));
diff --git a/docs/topology/examples/aws.md b/mission-control/static/.nojekyll
similarity index 100%
rename from docs/topology/examples/aws.md
rename to mission-control/static/.nojekyll
diff --git a/mission-control/static/img/auth-check.png b/mission-control/static/img/auth-check.png
new file mode 100644
index 00000000..9c1c1dfa
Binary files /dev/null and b/mission-control/static/img/auth-check.png differ
diff --git a/mission-control/static/img/canary-checker-icon-white.svg b/mission-control/static/img/canary-checker-icon-white.svg
new file mode 100644
index 00000000..975e41cb
--- /dev/null
+++ b/mission-control/static/img/canary-checker-icon-white.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/mission-control/static/img/canary-checker-icon.svg b/mission-control/static/img/canary-checker-icon.svg
new file mode 100644
index 00000000..ccb4a0da
--- /dev/null
+++ b/mission-control/static/img/canary-checker-icon.svg
@@ -0,0 +1,64 @@
+
+
+
diff --git a/mission-control/static/img/canary-checker-white.svg b/mission-control/static/img/canary-checker-white.svg
new file mode 100644
index 00000000..ae1397a1
--- /dev/null
+++ b/mission-control/static/img/canary-checker-white.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/mission-control/static/img/canary-checker.png b/mission-control/static/img/canary-checker.png
new file mode 100644
index 00000000..85cae7f3
Binary files /dev/null and b/mission-control/static/img/canary-checker.png differ
diff --git a/mission-control/static/img/canary-checker.svg b/mission-control/static/img/canary-checker.svg
new file mode 100644
index 00000000..c0ebccfe
--- /dev/null
+++ b/mission-control/static/img/canary-checker.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/mission-control/static/img/canary-ui.png b/mission-control/static/img/canary-ui.png
new file mode 100644
index 00000000..fd3a33d0
Binary files /dev/null and b/mission-control/static/img/canary-ui.png differ
diff --git a/mission-control/static/img/canary.png b/mission-control/static/img/canary.png
new file mode 100644
index 00000000..a0bd03fb
Binary files /dev/null and b/mission-control/static/img/canary.png differ
diff --git a/mission-control/static/img/debug-screenshot.png b/mission-control/static/img/debug-screenshot.png
new file mode 100644
index 00000000..f2af9d4f
Binary files /dev/null and b/mission-control/static/img/debug-screenshot.png differ
diff --git a/mission-control/static/img/display-format.png b/mission-control/static/img/display-format.png
new file mode 100644
index 00000000..13730b63
Binary files /dev/null and b/mission-control/static/img/display-format.png differ
diff --git a/mission-control/static/img/docusaurus-social-card.jpg b/mission-control/static/img/docusaurus-social-card.jpg
new file mode 100644
index 00000000..ffcb4482
Binary files /dev/null and b/mission-control/static/img/docusaurus-social-card.jpg differ
diff --git a/mission-control/static/img/docusaurus.png b/mission-control/static/img/docusaurus.png
new file mode 100644
index 00000000..f458149e
Binary files /dev/null and b/mission-control/static/img/docusaurus.png differ
diff --git a/mission-control/static/img/exec-check.png b/mission-control/static/img/exec-check.png
new file mode 100644
index 00000000..e9e276df
Binary files /dev/null and b/mission-control/static/img/exec-check.png differ
diff --git a/mission-control/static/img/favicon.ico b/mission-control/static/img/favicon.ico
new file mode 100644
index 00000000..c01d54bc
Binary files /dev/null and b/mission-control/static/img/favicon.ico differ
diff --git a/mission-control/static/img/flanksource-icon.png b/mission-control/static/img/flanksource-icon.png
new file mode 100644
index 00000000..1996dbe8
Binary files /dev/null and b/mission-control/static/img/flanksource-icon.png differ
diff --git a/docs/canary-checker/static/img/grafana-dashboard.png b/mission-control/static/img/grafana-dashboard copy.png
similarity index 100%
rename from docs/canary-checker/static/img/grafana-dashboard.png
rename to mission-control/static/img/grafana-dashboard copy.png
diff --git a/mission-control/static/img/grafana-dashboard.png b/mission-control/static/img/grafana-dashboard.png
new file mode 100644
index 00000000..5c1d0415
Binary files /dev/null and b/mission-control/static/img/grafana-dashboard.png differ
diff --git a/mission-control/static/img/graph-blue-line.svg b/mission-control/static/img/graph-blue-line.svg
new file mode 100644
index 00000000..5698d0fa
--- /dev/null
+++ b/mission-control/static/img/graph-blue-line.svg
@@ -0,0 +1 @@
+
diff --git a/mission-control/static/img/infrastructure-check.png b/mission-control/static/img/infrastructure-check.png
new file mode 100644
index 00000000..e5da20e6
Binary files /dev/null and b/mission-control/static/img/infrastructure-check.png differ
diff --git a/mission-control/static/img/logo.svg b/mission-control/static/img/logo.svg
new file mode 100644
index 00000000..9db6d0d0
--- /dev/null
+++ b/mission-control/static/img/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/mission-control/static/img/metrics-exporter.png b/mission-control/static/img/metrics-exporter.png
new file mode 100644
index 00000000..bcf66d43
Binary files /dev/null and b/mission-control/static/img/metrics-exporter.png differ
diff --git a/mission-control/static/img/metrics-exporter2.png b/mission-control/static/img/metrics-exporter2.png
new file mode 100644
index 00000000..d0ef5d3f
Binary files /dev/null and b/mission-control/static/img/metrics-exporter2.png differ
diff --git a/mission-control/static/img/mission-control-logo-350.svg b/mission-control/static/img/mission-control-logo-350.svg
new file mode 100644
index 00000000..85e48dac
--- /dev/null
+++ b/mission-control/static/img/mission-control-logo-350.svg
@@ -0,0 +1,68 @@
+
+
\ No newline at end of file
diff --git a/mission-control/static/img/mission-control-logo.svg b/mission-control/static/img/mission-control-logo.svg
new file mode 100644
index 00000000..85eb88fb
--- /dev/null
+++ b/mission-control/static/img/mission-control-logo.svg
@@ -0,0 +1,66 @@
+
+
\ No newline at end of file
diff --git a/mission-control/static/img/postgres-check.png b/mission-control/static/img/postgres-check.png
new file mode 100644
index 00000000..58a2a67b
Binary files /dev/null and b/mission-control/static/img/postgres-check.png differ
diff --git a/mission-control/static/img/trace-screenshot.png b/mission-control/static/img/trace-screenshot.png
new file mode 100644
index 00000000..2c9ceca3
Binary files /dev/null and b/mission-control/static/img/trace-screenshot.png differ
diff --git a/mission-control/static/img/undraw_docusaurus_mountain.svg b/mission-control/static/img/undraw_docusaurus_mountain.svg
new file mode 100644
index 00000000..af961c49
--- /dev/null
+++ b/mission-control/static/img/undraw_docusaurus_mountain.svg
@@ -0,0 +1,171 @@
+
diff --git a/mission-control/static/img/undraw_docusaurus_react.svg b/mission-control/static/img/undraw_docusaurus_react.svg
new file mode 100644
index 00000000..94b5cf08
--- /dev/null
+++ b/mission-control/static/img/undraw_docusaurus_react.svg
@@ -0,0 +1,170 @@
+
diff --git a/mission-control/static/img/undraw_docusaurus_tree.svg b/mission-control/static/img/undraw_docusaurus_tree.svg
new file mode 100644
index 00000000..d9161d33
--- /dev/null
+++ b/mission-control/static/img/undraw_docusaurus_tree.svg
@@ -0,0 +1,40 @@
+
diff --git a/mkdocs.yml b/mkdocs.yml
deleted file mode 100644
index c82df6c0..00000000
--- a/mkdocs.yml
+++ /dev/null
@@ -1,250 +0,0 @@
-repo_url: https://github.com/flanksource/docs/
-repo_name: Flanksource Mission Control
-site_name: Flanksource Mission Control
-extra:
- generator: false
-extra_css:
- - style.css
-theme:
- logo: ./images/flanksource-icon-white.svg
- favicon: ./images/flanksource-icon.png
- name: material
- palette:
- - media: "(prefers-color-scheme: light)"
- scheme: default
- primary: indigo
- accent: light-blue
- toggle:
- icon: material/lightbulb
- name: Switch to light mode
- - media: "(prefers-color-scheme: dark)"
- scheme: slate
- primary: indigo
- accent: light-blue
- toggle:
- icon: material/lightbulb-outline
- name: Switch to dark mode
- features:
- - content.tabs.link
- - search.suggest
- - search.highlight
- - header.autohide
- # - navigation.indexes
- - navigation.instant
- - navigation.sections
- - navigation.tabs
- # - toc.integrate
- # - navigation.tracking
- # - navigation.expand
- # - navigation.top
-markdown_extensions:
- - admonition
- - fenced_code
- - def_list
- - pymdownx.smartsymbols
- - toc:
- permalink: False
- anchorlink: True
- - pymdownx.superfences
- - pymdownx.snippets
- - pymdownx.details
- - pymdownx.tabbed:
- alternate_style: true
- - pymdownx.highlight:
- use_pygments: true
- - pymdownx.emoji:
- emoji_index: !!python/name:materialx.emoji.twemoji
- emoji_generator: !!python/name:materialx.emoji.to_svg
- # - codehilite:
- # linenums: true
-
-
-nav:
- - Home:
- - Overview: ./index.md
- - Installation: ./install.md
- - Config DB: ./config-db/overview.md
- - Canary Checker: ./canary-checker/overview.md
- - Logging: ./apm-hub/overview.md
- - Topology: ./topology/overview.md
- - Incidents: ./incidents/overview.md
- - Playbooks: ./playbooks/overview.md
- - Installation:
- - Installation: ./install.md
- - Architecture: ./architecture.md
- - Security: ./security.md
- - Config DB:
- - Installation: ./config-db/tutorials/install-helm.md
- - Getting Started:
- - Overview: ./config-db/overview.md
- - Quick Start: ./config-db/tutorials/example-git-file.md
- - Concepts:
- - Configuration: ./config-db/tutorials/configuration.md
- - Secret Management: ./config-db/concepts/secret-management.md
- - Extraction: ./config-db/concepts/extraction.md
- - Templating: ./config-db/concepts/templating.md
- - Maping custom creation/deletion time: ./config-db/concepts/custom-creation-deletion-time.md
- - Transform: ./config-db/concepts/transform.md
- - Mask: ./config-db/concepts/mask.md
- - Exclude: ./config-db/concepts/exclude.md
- - Scrapers:
- - AWS: ./config-db/scrapers/aws.md
- - Azure DevOps: ./config-db/scrapers/azure-devops.md
- - Files (Local/HTTP/Git): ./config-db/scrapers/file.md
- - Files (Kubernetes): ./config-db/scrapers/kubernetes-file.md
- - Kubernetes: ./config-db/scrapers/kubernetes.md
- - SQL: ./config-db/scrapers/sql.md
- - Trivy: ./config-db/scrapers/trivy.md
- - Custom: ./config-db/scrapers/custom.md
- - Local Development:
- - Installation: ./config-db/tutorials/install-standalone.md
- - CLI: ./config-db/tutorials/cli.md
-
- - Canary Checker:
- - Overview: ./canary-checker/overview.md
- - Getting Started: ./canary-checker/tutorials/getting-started.md
- - Concepts:
- - Gitops: ./canary-checker/concepts/gitops.md
- - Authentication: ./canary-checker/concepts/authentication.md
- - Templating: ./canary-checker/concepts/templating.md
- - Transforms: ./canary-checker/concepts/transforms.md
-
- - Check Types:
- - Common: ./canary-checker/reference/common.md
- - Alerts:
- - Alert Manager (Prometheus): ./canary-checker/reference/alert-manager.md
- - AWS Cloud Watch: ./canary-checker/reference/cloudwatch.md
- - AWS Config Rule: ./canary-checker/reference/aws-config-rule.md
- - Dynatrace: ./canary-checker/reference/dynatrace.md
-
- - Backup Checks:
- - GCS Database Backup: ./canary-checker/reference/gcs-database-backup.md
- - Restic: ./canary-checker/reference/restic.md
-
- - Configuration:
- - AWS Config: ./canary-checker/reference/aws-config.md
- - Config DB: ./canary-checker/reference/configdb.md
- - Kubernetes Resources: ./canary-checker/reference/kubernetes.md
- - Data Sources:
- - Elasticsearch: ./canary-checker/reference/elasticsearch.md
- - LDAP: ./canary-checker/reference/ldap.md
- - Mongo: ./canary-checker/reference/mongo.md
- - MS SQL Server: ./canary-checker/reference/mssql.md
- - MySQL: ./canary-checker/reference/mysql.md
- - Postgres: ./canary-checker/reference/postgres.md
- - Redis: ./canary-checker/reference/redis.md
-
- - DevOps:
- - Azure Devops: ./canary-checker/reference/azure-devops.md
- - GitHub: ./canary-checker/reference/github.md
-
- - Folders:
- - Folder: ./canary-checker/reference/folder.md
- - GCS Bucket: ./canary-checker/reference/gcs-bucket.md
- - S3: ./canary-checker/reference/s3-bucket.md
- - SFTP: ./canary-checker/reference/sftp.md
- - SMB / CIFS: ./canary-checker/reference/smb.md
-
- - Integration Testing:
- - JMeter: ./canary-checker/reference/jmeter.md
- - JUnit: ./canary-checker/reference/junit.md
-
- - Metrics:
- - Prometheus: ./canary-checker/reference/prometheus.md
-
- - Network:
- - TCP: ./canary-checker/reference/tcp.md
- - DNS: ./canary-checker/reference/dns.md
- - HTTP: ./canary-checker/reference/http.md
- - ICMP: ./canary-checker/reference/icmp.md
-
- - Infrastructure:
- - Containerd / Docker: ./canary-checker/reference/containerd.md
- - Helm: ./canary-checker/reference/helm.md
- - EC2: ./canary-checker/reference/ec2.md
- - Kubernetes Ingress: ./canary-checker/reference/pod.md
- - S3 Protocol: ./canary-checker/reference/s3.md
- - Local Development:
- - CLI: ./canary-checker/tutorials/run.md
- - Helm: ./canary-checker/tutorials/helm.md
- - Logging:
- - Overview: ./apm-hub/overview.md
- - Quick Start: ./apm-hub/quick-start.md
- - Concepts:
- - Configuration: ./apm-hub/concepts/configuration.md
- - Authentication: ./apm-hub/concepts/authentication.md
- - API: ./apm-hub/concepts/api.md
- - Routing: ./apm-hub/concepts/routing.md
- - Templating: ./apm-hub/concepts/templating.md
- - Backends:
- - File: ./apm-hub/backends/file.md
- - Kubernetes: ./apm-hub/backends/kubernetes.md
- - Elasticsearch: ./apm-hub/backends/elasticsearch.md
- - OpenSearch: ./apm-hub/backends/opensearch.md
- - Local Development:
- - Installation: ./apm-hub/tutorials/install.md
- - CLI: ./apm-hub/tutorials/cli.md
-
- - Topology:
- - Overview: ./topology/overview.md
- - Concepts:
- - Topology: ./topology/concepts/topology.md
- - Components: ./topology/concepts/components.md
- - Properties: ./topology/concepts/properties.md
- - Lookup: ./topology/concepts/lookup.md
- - For Each: ./topology/concepts/for-each.md
- - Relationships:
- - Components: ./topology/concepts/linking-components.md
- - Configuration Items: ./topology/concepts/config.md
- - Health Checks: ./topology/concepts/health-checks.md
- - Examples:
- - Kubernetes: ./topology/examples/kubernetes.md
- - Kubernetes (Workload): ./topology/examples/kubernetes-workload.md
- - Reference:
- - Components: ./topology/references/components.md
- - Properties: ./topology/references/properties.md
- - Component Lookups:
- - Config DB: ./topology/references/configdb.md
- - Exec: ./topology/references/exec.md
- - HTTP: ./topology/references/http.md
- - Kubernetes: ./topology/references/kubernetes.md
- - Mongo: ./topology/references/mongo.md
- - MS SQL Server: ./topology/references/mssql.md
- - MySQL: ./topology/references/mysql.md
- - Postgres: ./topology/references/postgres.md
- - Prometheus: ./topology/references/prometheus.md
- - Redis: ./topology/references/redis.md
- - Incidents:
- - Overview: ./incidents/overview.md
- - Concepts:
- - Evidence: ./incidents/concepts/evidence.md
- - Hypothesis: ./incidents/concepts/hypothesis.md
- - Rules: ./incidents/concepts/rules.md
- - Responders: ./incidents/concepts/responders.md
- - Definition of Done: ./incidents/concepts/done-definition.md
- - Notifications:
- - Overview: ./notifications/index.md
- - Concepts:
- - Notification: ./notifications/concepts/notification.md
- - Templating: ./notifications/concepts/templating.md
- - Filtering: ./notifications/concepts/filtering.md
- - Events: ./notifications/concepts/events.md
- - Recipients: ./notifications/concepts/recipients.md
- - Events:
- - Health Checks: ./notifications/events/health-checks.md
- - Component: ./notifications/events/components.md
- - Incidents: ./notifications/events/incidents.md
- - Playbooks:
- - Overview: ./playbooks/overview.md
- - Quick Start: ./playbooks/quick-start.md
- - API: ./playbooks/api.md
- - Concepts:
- - Playbook: ./playbooks/concepts/playbook.md
- - Runs: ./playbooks/concepts/run.md
- - Actions: ./playbooks/concepts/action.md
- - Approvals: ./playbooks/concepts/approval.md
- - Events: ./playbooks/concepts/events.md
- - Templating: ./playbooks/concepts/templating.md
- - Expression: ./playbooks/concepts/expression.md
- - Actions:
- - Exec: ./playbooks/actions/exec.md
\ No newline at end of file
diff --git a/netlify.toml b/netlify.toml
index c2e55a29..9bda44ee 100644
--- a/netlify.toml
+++ b/netlify.toml
@@ -1,4 +1,5 @@
[build]
- command = " mkdocs build -d build"
+ base = "mission-control"
+ command = "make sync && npm run build"
publish = "build"
- environment = { PYTHON_VERSION = "3.8" }
+ environment = { NODE_VERSION = "v18.18.2" }