From 0799e8130f64afd2b4234a936d798af4365abe43 Mon Sep 17 00:00:00 2001 From: dojosout Date: Wed, 31 Jul 2024 09:48:02 -0500 Subject: [PATCH] Deploy website - based on f69794d2ed9e72f49294818fb5be802bb297eb3c --- 404.html | 14 ++--- assets/js/00cb704f.d8fb9eb4.js | 1 - ...f72bc.fac18353.js => 012f72bc.36b7fe96.js} | 2 +- ...4960a.e4e7cd3e.js => 0214960a.7e6a0dc4.js} | 2 +- ...41ef2.5a4f1f57.js => 02341ef2.76f0a379.js} | 2 +- ...1802f.b404da72.js => 0271802f.e2ca0056.js} | 2 +- ...7c8bf.c122f958.js => 0327c8bf.4ed718d8.js} | 2 +- ...1afdd.426b41ab.js => 0381afdd.de4385a8.js} | 2 +- assets/js/05c6fd0e.27777f60.js | 1 + assets/js/05c6fd0e.586b8e3b.js | 1 - ...f8364.0e023e16.js => 066f8364.bfb615a4.js} | 2 +- ...addd5.24f5303f.js => 07faddd5.b2854b31.js} | 2 +- ...a21b4.34495c8a.js => 080a21b4.616746c2.js} | 2 +- assets/js/092c2d1d.97793caf.js | 1 + ...e461a.4f5dc652.js => 0b8e461a.4a1a6155.js} | 2 +- assets/js/0d6d53ac.2ae3b199.js | 1 - assets/js/0dd3dba6.3dbbc1f3.js | 1 + assets/js/{1.bb3bc4d5.js => 1.03db48d6.js} | 2 +- ...618b7.efff362b.js => 12ba72b5.4b8388c3.js} | 2 +- assets/js/12ecfc4a.a1b9aa60.js | 1 + .../js/{161.d19b2b8e.js => 157.1f338186.js} | 2 +- .../js/{162.71673972.js => 158.319f81c0.js} | 2 +- ...cefd4.2fe48b23.js => 16fcefd4.9eb05a6f.js} | 2 +- ...96441.1b171940.js => 17896441.104e0abb.js} | 2 +- assets/js/1bbe794e.484f5992.js | 1 - ...43674.8da06d41.js => 1cc43674.f9080c78.js} | 2 +- ...38b8a.35918ded.js => 1d038b8a.936f367a.js} | 2 +- assets/js/1f3a3353.117952bc.js | 1 + assets/js/1f3a3353.c8d7370b.js | 1 - assets/js/{2.89c52fba.js => 2.f7e8da3d.js} | 4 +- ....LICENSE.txt => 2.f7e8da3d.js.LICENSE.txt} | 0 ...e0bc4.17500718.js => 21ee0bc4.03721b9e.js} | 2 +- ...7278f.fe1cf5a5.js => 22b7278f.58242775.js} | 2 +- ...86c11.0650c59f.js => 22d86c11.2a981864.js} | 2 +- ...9f6dc.91efb769.js => 3179f6dc.bedc2974.js} | 2 +- ...9db24.62c09093.js => 3309db24.f6153687.js} | 2 +- ...6b1c9.bd4095bc.js => 33f6b1c9.798766ac.js} | 2 +- ...e6759.d9fbc6e9.js => 358e6759.19972cb0.js} | 2 +- assets/js/38962575.8edb151f.js | 1 + assets/js/38962575.cec7a9ef.js | 1 - ...1fe39.6ca6725c.js => 38d1fe39.e28e353a.js} | 2 +- ...4abfa.09b700f7.js => 3914abfa.df468ae2.js} | 2 +- ...960a4.2c1c192b.js => 40b960a4.422649da.js} | 2 +- ...80e0e.34ea6f7b.js => 41980e0e.d717c996.js} | 2 +- ...094bc.2568d8ec.js => 42e094bc.04cc4a66.js} | 2 +- ...0e773.55a7a6c7.js => 42f0e773.73889b7e.js} | 2 +- ...7ba93.8e66f0a3.js => 42f7ba93.e851b609.js} | 2 +- ...62f47.792b1adb.js => 43862f47.7a6ac57b.js} | 2 +- ...600e4.c1d369e6.js => 46a600e4.790fa3f6.js} | 2 +- ...c5911.4a2f1d5a.js => 480c5911.48d5baca.js} | 2 +- ...03371.0ed6dd81.js => 49703371.0286d91d.js} | 2 +- ...74cdd.e8f8d5a1.js => 49e74cdd.00e19770.js} | 2 +- ...4d8e8.964ee9cc.js => 4a74d8e8.d930cabd.js} | 2 +- ...24bf8.5f1f44d6.js => 4ff24bf8.c0099967.js} | 2 +- ...df56a.031ac316.js => 4ffdf56a.f556f662.js} | 2 +- ...32990.0ea61ccd.js => 50032990.47d0b7f0.js} | 2 +- ...d766a.b0ec51ab.js => 514d766a.ca35f79e.js} | 2 +- assets/js/53b0b5d8.144adf6f.js | 1 - ...76a50.28321f6f.js => 56776a50.009ef339.js} | 2 +- ...29d1a.92eaa661.js => 56a29d1a.de0b8997.js} | 2 +- ...958f4.6a5669a4.js => 58d958f4.572280db.js} | 2 +- assets/js/59305d05.7e6bc501.js | 1 - ...0f281.847d72f0.js => 5a20f281.84ff2815.js} | 2 +- ...c4cb7.5d8d3771.js => 5b6c4cb7.1e5700c2.js} | 2 +- ...beb71.a62d61d9.js => 5c4beb71.b666c6b3.js} | 2 +- ...17acf.eeb64f93.js => 5ee17acf.4e665490.js} | 2 +- assets/js/5ef24f1d.6c97f268.js | 1 + ...5e2e5.da94766a.js => 6125e2e5.372c6163.js} | 2 +- assets/js/63503174.24f9a6f6.js | 1 + ...5fe43.bed1e40c.js => 63f5fe43.faa7d00d.js} | 2 +- ...69ed8.20920114.js => 64269ed8.18f9818d.js} | 2 +- ...602f1.c1abe2fd.js => 653602f1.d686a47d.js} | 2 +- ...6ef57.e13c6102.js => 6546ef57.b480f0cc.js} | 2 +- assets/js/66e31e6e.ce62be57.js | 1 - ...1008e.e9443d0d.js => 69c1008e.6660742f.js} | 2 +- ...59f5b.6c7d9748.js => 6a059f5b.57b36ba4.js} | 2 +- ...79c12.cc8d8222.js => 6c279c12.225c0b15.js} | 2 +- ...13b5d.84d394c4.js => 6d913b5d.bb807553.js} | 2 +- ...5514b.c223f8ef.js => 6e2a1c72.7c78a48b.js} | 2 +- assets/js/6e3166bc.fa40017d.js | 1 + assets/js/71e5fd50.9e08f691.js | 1 + assets/js/734dc415.80010e23.js | 1 - assets/js/734dc415.9fadde42.js | 1 + ...b1578.a774f21c.js => 799b1578.ad714f78.js} | 2 +- ...5b03c.95489b8b.js => 7b85b03c.6e3a64bd.js} | 2 +- ...8db09.bc8a300d.js => 7c78db09.5ea6e962.js} | 2 +- assets/js/7d0b7755.4b75443f.js | 1 - assets/js/7d0b7755.c19774b1.js | 1 + ...80c4c.ad3c0101.js => 7d380c4c.b92baa88.js} | 2 +- assets/js/8084fbd4.5592d29d.js | 1 - ...ca04e.54bca9dc.js => 832ca04e.24044575.js} | 2 +- ...bc9a5.e629373c.js => 83dbc9a5.4a4e5652.js} | 2 +- assets/js/86d09e6e.43e743b3.js | 1 + ...923b2.2bf3c135.js => 879923b2.90f3d9b4.js} | 2 +- ...7819f.64d4557b.js => 8997819f.aa7254b4.js} | 2 +- ...d3056.ff7822d9.js => 8b301107.d02fcb00.js} | 2 +- ...fcfa9.f0501de3.js => 8bbfcfa9.dc015f8e.js} | 2 +- assets/js/9001d127.1e177d17.js | 1 - ...738b8.33482c0f.js => 906738b8.3a283baa.js} | 2 +- assets/js/9191c864.9b61c372.js | 1 + assets/js/935f2afb.5c9a98e4.js | 1 - assets/js/935f2afb.9f248d32.js | 1 + ...52331.87e388ce.js => 96852331.822f904f.js} | 2 +- ...0d299.d4ac0286.js => 9720d299.9abe8149.js} | 2 +- ...dd56e.3b71c751.js => 97edd56e.d5ab66b5.js} | 2 +- ...819d4.508016b4.js => 992819d4.2993e926.js} | 2 +- ...6017e.6764251a.js => 99d6017e.cb54715a.js} | 2 +- ...c9747.5a3e990f.js => 9a5c9747.85ad9bca.js} | 2 +- assets/js/9aa54785.d3836c06.js | 1 - ...05a1f.0d4ca405.js => 9b505a1f.f4b85bdc.js} | 2 +- ...dba8c.baa4761b.js => 9bfdba8c.b2391bbd.js} | 2 +- ...eac8e.4b2aa660.js => 9d5eac8e.6a3edbf9.js} | 2 +- assets/js/9e1ec80c.ab114838.js | 1 - assets/js/9f628d52.08c37d03.js | 1 + ...55709.25f4e00b.js => 9fe55709.e9c7bfda.js} | 2 +- ...af8ab.31cb6a73.js => 9feaf8ab.8c912915.js} | 2 +- ...bc459.cf90e3e8.js => a04bc459.dcff4f83.js} | 2 +- ...215ea.35e2776f.js => a12215ea.1ea3e4ef.js} | 2 +- assets/js/a3c17fac.4f9a964b.js | 1 - assets/js/a55d7fc8.3675ba14.js | 1 - assets/js/a55d7fc8.d2b40c2a.js | 1 + ...59da2.03c88ff1.js => a7459da2.2d033572.js} | 2 +- ...8ec4a.ffbdd576.js => aa98ec4a.39b5137c.js} | 2 +- ...d28b2.21d293f7.js => aafd28b2.fb1f547f.js} | 2 +- ...f3a21.97ae394b.js => abbf3a21.2995f8fb.js} | 2 +- ...b7d69.fd3bbc4c.js => ac3b7d69.6126d7a7.js} | 2 +- ...08aff.9d4faea0.js => ad308aff.8a927dcc.js} | 2 +- ...a1364.d1aa581b.js => ae8a1364.4da8b56a.js} | 2 +- ...fe9f5.13251023.js => b1bfe9f5.592f8cc1.js} | 2 +- ...114f4.e41fb427.js => b3c114f4.28ba7bd1.js} | 2 +- assets/js/b56f03c6.3836580d.js | 1 - ...a1049.1cf10416.js => b83a1049.f6464bc0.js} | 2 +- ...5e963.5bed7840.js => ba55e963.db919392.js} | 2 +- ...37b1e.9e57bcc8.js => bb237b1e.ea30ebd1.js} | 2 +- ...c6f88.e87a9bd6.js => bd6c6f88.8d988769.js} | 2 +- ...7ab4e.6b5e2485.js => bed7ab4e.fea77ca6.js} | 2 +- ...d86e8.4043049b.js => c0bd86e8.06ac168e.js} | 2 +- ...49368.7fcf56c0.js => c3f49368.e29a1244.js} | 2 +- ...5d8e4.76411a79.js => c4f5d8e4.4e0e3f0d.js} | 2 +- ...f4c72.0e8bec24.js => c51f4c72.69c062f8.js} | 2 +- assets/js/cbd1c0d0.5208c323.js | 1 - assets/js/cbd1c0d0.6ea2feaf.js | 1 + ...02920.a8ebc09f.js => cd902920.0ae4e688.js} | 2 +- assets/js/ceb45c47.a3330b5f.js | 1 - assets/js/ceb45c47.e6acb003.js | 1 + ...97237.705b0ef9.js => d1597237.07f1898e.js} | 2 +- assets/js/d1b2eded.fdea14ce.js | 1 - assets/js/d2c255b4.51d1c434.js | 1 - ...4f39e.b83f8cc2.js => d2c4f39e.d6c2c200.js} | 2 +- ...56f45.a168af5e.js => d3556f45.2aeec99a.js} | 2 +- ...b255e.d6a84f1e.js => d48b255e.1c5329df.js} | 2 +- ...87a67.4b6f0656.js => d5087a67.cb6a7230.js} | 2 +- ...40579.770e5402.js => d5140579.0f850372.js} | 2 +- ...79f42.d126a913.js => d5479f42.b8876961.js} | 2 +- ...ff009.7f914194.js => d71ff009.037347f4.js} | 2 +- assets/js/d74c151a.f23bb09f.js | 1 + ...898ab.84f0767e.js => d75898ab.8089cc99.js} | 2 +- ...f9def.b4c78c77.js => d91f9def.f3256090.js} | 2 +- ...ed613.02dc005f.js => db0ed613.c9712562.js} | 2 +- ...a9f26.51ca4c1a.js => dd1a9f26.a545ed72.js} | 2 +- assets/js/ded423ee.df3ed6d9.js | 1 - ...e17a0.481c92d6.js => e00e17a0.8c02aab3.js} | 2 +- ...970d8.6486e99c.js => e10970d8.cde1bc28.js} | 2 +- ...6625e.3f1e3436.js => e186625e.6c1b54b7.js} | 2 +- ...e698d.6ab0c41b.js => e2be698d.dd0e2d10.js} | 2 +- ...161d9.57d50314.js => e2c161d9.00dc4bde.js} | 2 +- ...bbbcf.e88d084c.js => e30bbbcf.b4e3431e.js} | 2 +- assets/js/e3649aa7.41406e34.js | 1 - ...6ce66.ffd97d6e.js => e436ce66.54f16243.js} | 2 +- assets/js/e4c61278.03e947b6.js | 1 - assets/js/e5ce8f83.b18dcb47.js | 1 - ...6408e.8663b558.js => e746408e.d8730765.js} | 2 +- ...70743.b2234f2e.js => e7670743.fb9bbf42.js} | 2 +- ...7ec87.a4179a0d.js => e987ec87.f66b2f78.js} | 2 +- ...aece6.fbef59fb.js => ebfaece6.d97235a2.js} | 2 +- assets/js/f0b0282f.243b745a.js | 1 + ...db0ed.0d7a9793.js => f1ddb0ed.4cbf6601.js} | 2 +- ...cfdf8.a481c25f.js => f2cce206.f146a973.js} | 2 +- ...5eca7.f3f2ea52.js => f485eca7.3a61264f.js} | 2 +- ...ba0ac.ba4c9a10.js => f52ba0ac.c7675cca.js} | 2 +- ...b3473.09cab9db.js => f64b3473.b96c3fd3.js} | 2 +- ...c0717.28c2f6ec.js => f8bc0717.e9c8f77e.js} | 2 +- assets/js/f9995f72.b29de3ff.js | 1 + ...6f0fc.a192e853.js => fa16f0fc.8db267a7.js} | 2 +- assets/js/ff1d9e71.c2bc6db2.js | 1 + assets/js/main.16ba1fad.js | 2 + ...CENSE.txt => main.16ba1fad.js.LICENSE.txt} | 0 assets/js/main.e20b6a1c.js | 2 - assets/js/runtime~main.09475183.js | 1 + assets/js/runtime~main.6b5de359.js | 1 - ...{styles.19dac7a3.js => styles.ed63c98d.js} | 2 +- docs/1.2.10/components/docker_env/index.html | 44 +++++++-------- .../components/docker_first_steps/index.html | 44 +++++++-------- .../components/docker_pipeline/index.html | 42 +++++++------- .../deploy/bare_metal_install/index.html | 44 +++++++-------- docs/1.2.10/deploy/choose_install/index.html | 42 +++++++------- .../deploy/docker_install_advanced/index.html | 44 +++++++-------- .../deploy/docker_install_simple/index.html | 44 +++++++-------- .../deploy/docker_troubleshoot/index.html | 44 +++++++-------- docs/1.2.10/deploy/docker_upgrade/index.html | 44 +++++++-------- docs/1.2.10/devel/dev_dataset/index.html | 44 +++++++-------- docs/1.2.10/devel/docker_dev_guide/index.html | 44 +++++++-------- docs/1.2.10/devel/docker_dev_tag/index.html | 44 +++++++-------- docs/1.2.10/devel/docusaurus/index.html | 44 +++++++-------- docs/1.2.10/pipeline/elastic/index.html | 42 +++++++------- docs/1.2.10/pipeline/importer/index.html | 44 +++++++-------- docs/1.2.10/pipeline/intro/index.html | 44 +++++++-------- docs/1.2.10/pipeline/logstash/index.html | 44 +++++++-------- docs/1.2.10/pipeline/nfdump/index.html | 42 +++++++------- docs/1.2.10/pipeline/tstat/index.html | 42 +++++++------- docs/1.2.11/components/docker_env/index.html | 44 +++++++-------- .../components/docker_first_steps/index.html | 44 +++++++-------- .../components/docker_pipeline/index.html | 42 +++++++------- .../deploy/bare_metal_install/index.html | 44 +++++++-------- docs/1.2.11/deploy/choose_install/index.html | 42 +++++++------- .../deploy/docker_install_advanced/index.html | 44 +++++++-------- .../deploy/docker_install_simple/index.html | 44 +++++++-------- .../deploy/docker_troubleshoot/index.html | 44 +++++++-------- docs/1.2.11/deploy/docker_upgrade/index.html | 42 +++++++------- docs/1.2.11/devel/dev_dataset/index.html | 44 +++++++-------- docs/1.2.11/devel/docker_dev_guide/index.html | 44 +++++++-------- docs/1.2.11/devel/docker_dev_tag/index.html | 44 +++++++-------- docs/1.2.11/devel/docusaurus/index.html | 44 +++++++-------- docs/1.2.11/pipeline/elastic/index.html | 42 +++++++------- docs/1.2.11/pipeline/importer/index.html | 44 +++++++-------- docs/1.2.11/pipeline/intro/index.html | 44 +++++++-------- docs/1.2.11/pipeline/logstash/index.html | 44 +++++++-------- docs/1.2.11/pipeline/nfdump/index.html | 42 +++++++------- docs/1.2.11/pipeline/tstat/index.html | 42 +++++++------- docs/1.2.5/deploy/choose_install/index.html | 42 +++++++------- docs/1.2.5/deploy/docker_install/index.html | 44 +++++++-------- docs/1.2.5/deploy/install/index.html | 44 +++++++-------- docs/1.2.5/devel/docker/index.html | 44 +++++++-------- docs/1.2.5/docusaurus/index.html | 44 +++++++-------- docs/1.2.5/pipeline/index.html | 42 +++++++------- docs/1.2.5/pipeline_importer/index.html | 44 +++++++-------- docs/1.2.5/pipeline_logstash/index.html | 44 +++++++-------- docs/1.2.6/deploy/choose_install/index.html | 42 +++++++------- docs/1.2.6/deploy/docker_install/index.html | 44 +++++++-------- docs/1.2.6/deploy/install/index.html | 44 +++++++-------- docs/1.2.6/devel/docker/index.html | 44 +++++++-------- docs/1.2.6/docusaurus/index.html | 44 +++++++-------- docs/1.2.6/pipeline/index.html | 42 +++++++------- docs/1.2.6/pipeline_importer/index.html | 44 +++++++-------- docs/1.2.6/pipeline_logstash/index.html | 44 +++++++-------- docs/1.2.7/components/docker_env/index.html | 44 +++++++-------- .../components/docker_pipeline/index.html | 42 +++++++------- .../components/docker_upgrade/index.html | 42 +++++++------- .../deploy/bare_metal_install/index.html | 44 +++++++-------- docs/1.2.7/deploy/choose_install/index.html | 42 +++++++------- .../deploy/docker_install_advanced/index.html | 44 +++++++-------- .../deploy/docker_install_simple/index.html | 44 +++++++-------- .../deploy/docker_troubleshoot/index.html | 44 +++++++-------- docs/1.2.7/devel/dev_dataset/index.html | 44 +++++++-------- docs/1.2.7/devel/docker_dev_guide/index.html | 44 +++++++-------- docs/1.2.7/docusaurus/index.html | 44 +++++++-------- docs/1.2.7/pipeline/elastic/index.html | 42 +++++++------- docs/1.2.7/pipeline/importer/index.html | 44 +++++++-------- docs/1.2.7/pipeline/intro/index.html | 44 +++++++-------- docs/1.2.7/pipeline/logstash/index.html | 44 +++++++-------- docs/1.2.7/pipeline/nfdump/index.html | 42 +++++++------- docs/1.2.7/pipeline/tstat/index.html | 42 +++++++------- docs/1.2.8/components/docker_env/index.html | 44 +++++++-------- .../components/docker_first_steps/index.html | 44 +++++++-------- .../components/docker_pipeline/index.html | 42 +++++++------- .../components/docker_upgrade/index.html | 44 +++++++-------- .../deploy/bare_metal_install/index.html | 44 +++++++-------- docs/1.2.8/deploy/choose_install/index.html | 42 +++++++------- .../deploy/docker_install_advanced/index.html | 44 +++++++-------- .../deploy/docker_install_simple/index.html | 44 +++++++-------- .../deploy/docker_troubleshoot/index.html | 44 +++++++-------- docs/1.2.8/devel/dev_dataset/index.html | 44 +++++++-------- docs/1.2.8/devel/docker_dev_guide/index.html | 44 +++++++-------- docs/1.2.8/docusaurus/index.html | 44 +++++++-------- docs/1.2.8/pipeline/elastic/index.html | 42 +++++++------- docs/1.2.8/pipeline/importer/index.html | 44 +++++++-------- docs/1.2.8/pipeline/intro/index.html | 44 +++++++-------- docs/1.2.8/pipeline/logstash/index.html | 44 +++++++-------- docs/1.2.8/pipeline/nfdump/index.html | 42 +++++++------- docs/1.2.8/pipeline/tstat/index.html | 42 +++++++------- docs/1.2.9/components/docker_env/index.html | 44 +++++++-------- .../components/docker_first_steps/index.html | 44 +++++++-------- .../components/docker_pipeline/index.html | 42 +++++++------- .../components/docker_upgrade/index.html | 44 +++++++-------- .../deploy/bare_metal_install/index.html | 44 +++++++-------- docs/1.2.9/deploy/choose_install/index.html | 42 +++++++------- .../deploy/docker_install_advanced/index.html | 44 +++++++-------- .../deploy/docker_install_simple/index.html | 44 +++++++-------- .../deploy/docker_troubleshoot/index.html | 44 +++++++-------- docs/1.2.9/devel/dev_dataset/index.html | 44 +++++++-------- docs/1.2.9/devel/docker_dev_guide/index.html | 44 +++++++-------- docs/1.2.9/docusaurus/index.html | 44 +++++++-------- docs/1.2.9/pipeline/elastic/index.html | 42 +++++++------- docs/1.2.9/pipeline/importer/index.html | 44 +++++++-------- docs/1.2.9/pipeline/intro/index.html | 44 +++++++-------- docs/1.2.9/pipeline/logstash/index.html | 44 +++++++-------- docs/1.2.9/pipeline/nfdump/index.html | 42 +++++++------- docs/1.2.9/pipeline/tstat/index.html | 42 +++++++------- docs/components/docker_env/index.html | 46 +++++++-------- docs/components/docker_first_steps/index.html | 46 +++++++-------- docs/components/docker_pipeline/index.html | 44 +++++++-------- docs/deploy/bare_metal_install/index.html | 56 ------------------- docs/deploy/choose_install/index.html | 34 ----------- .../deploy/docker_install_advanced/index.html | 49 ++++++++-------- docs/deploy/docker_install_simple/index.html | 46 +++++++-------- docs/deploy/docker_troubleshoot/index.html | 46 +++++++-------- docs/deploy/docker_upgrade/index.html | 44 +++++++-------- docs/devel/dev_dataset/index.html | 46 +++++++-------- docs/devel/docker_dev_guide/index.html | 47 ++++++++-------- docs/devel/docker_dev_tag/index.html | 46 +++++++-------- docs/devel/docusaurus/index.html | 46 +++++++-------- docs/next/components/docker_env/index.html | 44 +++++++-------- .../components/docker_first_steps/index.html | 44 +++++++-------- .../components/docker_pipeline/index.html | 42 +++++++------- .../next/deploy/bare_metal_install/index.html | 56 ------------------- docs/next/deploy/choose_install/index.html | 34 ----------- .../deploy/docker_install_advanced/index.html | 47 ++++++++-------- .../deploy/docker_install_simple/index.html | 44 +++++++-------- .../deploy/docker_troubleshoot/index.html | 44 +++++++-------- docs/next/deploy/docker_upgrade/index.html | 42 +++++++------- docs/next/devel/dev_dataset/index.html | 44 +++++++-------- docs/next/devel/docker_dev_guide/index.html | 45 ++++++++------- docs/next/devel/docker_dev_tag/index.html | 44 +++++++-------- docs/next/devel/docusaurus/index.html | 44 +++++++-------- docs/next/pipeline/elastic/index.html | 42 +++++++------- docs/next/pipeline/importer/index.html | 44 +++++++-------- docs/next/pipeline/intro/index.html | 44 +++++++-------- docs/next/pipeline/logstash/index.html | 44 +++++++-------- docs/next/pipeline/nfdump/index.html | 42 +++++++------- docs/next/pipeline/tstat/index.html | 42 +++++++------- docs/pipeline/elastic/index.html | 44 +++++++-------- docs/pipeline/importer/index.html | 46 +++++++-------- docs/pipeline/intro/index.html | 46 +++++++-------- docs/pipeline/logstash/index.html | 46 +++++++-------- docs/pipeline/nfdump/index.html | 44 +++++++-------- docs/pipeline/tstat/index.html | 44 +++++++-------- img/favicon.ico:Zone.Identifier | 3 - img/logo.png:Zone.Identifier | 3 - img/logo.svg:Zone.Identifier | 3 - img/netsage.webp:Zone.Identifier | 3 - img/netsage_bg.webp:Zone.Identifier | 3 - ...aw_docusaurus_mountain.svg:Zone.Identifier | 3 - ...ndraw_docusaurus_react.svg:Zone.Identifier | 3 - ...undraw_docusaurus_tree.svg:Zone.Identifier | 3 - index.html | 26 ++++----- sitemap.xml | 2 +- 346 files changed, 3262 insertions(+), 3474 deletions(-) delete mode 100644 assets/js/00cb704f.d8fb9eb4.js rename assets/js/{012f72bc.fac18353.js => 012f72bc.36b7fe96.js} (98%) rename assets/js/{0214960a.e4e7cd3e.js => 0214960a.7e6a0dc4.js} (98%) rename assets/js/{02341ef2.5a4f1f57.js => 02341ef2.76f0a379.js} (98%) rename assets/js/{0271802f.b404da72.js => 0271802f.e2ca0056.js} (98%) rename assets/js/{0327c8bf.c122f958.js => 0327c8bf.4ed718d8.js} (99%) rename assets/js/{0381afdd.426b41ab.js => 0381afdd.de4385a8.js} (97%) create mode 100644 assets/js/05c6fd0e.27777f60.js delete mode 100644 assets/js/05c6fd0e.586b8e3b.js rename assets/js/{066f8364.0e023e16.js => 066f8364.bfb615a4.js} (96%) rename assets/js/{07faddd5.24f5303f.js => 07faddd5.b2854b31.js} (97%) rename assets/js/{080a21b4.34495c8a.js => 080a21b4.616746c2.js} (96%) create mode 100644 assets/js/092c2d1d.97793caf.js rename assets/js/{0b8e461a.4f5dc652.js => 0b8e461a.4a1a6155.js} (97%) delete mode 100644 assets/js/0d6d53ac.2ae3b199.js create mode 100644 assets/js/0dd3dba6.3dbbc1f3.js rename assets/js/{1.bb3bc4d5.js => 1.03db48d6.js} (84%) rename assets/js/{418618b7.efff362b.js => 12ba72b5.4b8388c3.js} (84%) create mode 100644 assets/js/12ecfc4a.a1b9aa60.js rename assets/js/{161.d19b2b8e.js => 157.1f338186.js} (95%) rename assets/js/{162.71673972.js => 158.319f81c0.js} (80%) rename assets/js/{16fcefd4.2fe48b23.js => 16fcefd4.9eb05a6f.js} (98%) rename assets/js/{17896441.1b171940.js => 17896441.104e0abb.js} (92%) delete mode 100644 assets/js/1bbe794e.484f5992.js rename assets/js/{1cc43674.8da06d41.js => 1cc43674.f9080c78.js} (96%) rename assets/js/{1d038b8a.35918ded.js => 1d038b8a.936f367a.js} (97%) create mode 100644 assets/js/1f3a3353.117952bc.js delete mode 100644 assets/js/1f3a3353.c8d7370b.js rename assets/js/{2.89c52fba.js => 2.f7e8da3d.js} (90%) rename assets/js/{2.89c52fba.js.LICENSE.txt => 2.f7e8da3d.js.LICENSE.txt} (100%) rename assets/js/{21ee0bc4.17500718.js => 21ee0bc4.03721b9e.js} (96%) rename assets/js/{22b7278f.fe1cf5a5.js => 22b7278f.58242775.js} (97%) rename assets/js/{22d86c11.0650c59f.js => 22d86c11.2a981864.js} (99%) rename assets/js/{3179f6dc.91efb769.js => 3179f6dc.bedc2974.js} (96%) rename assets/js/{3309db24.62c09093.js => 3309db24.f6153687.js} (99%) rename assets/js/{33f6b1c9.bd4095bc.js => 33f6b1c9.798766ac.js} (97%) rename assets/js/{358e6759.d9fbc6e9.js => 358e6759.19972cb0.js} (97%) create mode 100644 assets/js/38962575.8edb151f.js delete mode 100644 assets/js/38962575.cec7a9ef.js rename assets/js/{38d1fe39.6ca6725c.js => 38d1fe39.e28e353a.js} (99%) rename assets/js/{3914abfa.09b700f7.js => 3914abfa.df468ae2.js} (96%) rename assets/js/{40b960a4.2c1c192b.js => 40b960a4.422649da.js} (96%) rename assets/js/{41980e0e.34ea6f7b.js => 41980e0e.d717c996.js} (98%) rename assets/js/{42e094bc.2568d8ec.js => 42e094bc.04cc4a66.js} (99%) rename assets/js/{42f0e773.55a7a6c7.js => 42f0e773.73889b7e.js} (97%) rename assets/js/{42f7ba93.8e66f0a3.js => 42f7ba93.e851b609.js} (97%) rename assets/js/{43862f47.792b1adb.js => 43862f47.7a6ac57b.js} (97%) rename assets/js/{46a600e4.c1d369e6.js => 46a600e4.790fa3f6.js} (97%) rename assets/js/{480c5911.4a2f1d5a.js => 480c5911.48d5baca.js} (97%) rename assets/js/{49703371.0ed6dd81.js => 49703371.0286d91d.js} (99%) rename assets/js/{49e74cdd.e8f8d5a1.js => 49e74cdd.00e19770.js} (98%) rename assets/js/{4a74d8e8.964ee9cc.js => 4a74d8e8.d930cabd.js} (99%) rename assets/js/{4ff24bf8.5f1f44d6.js => 4ff24bf8.c0099967.js} (97%) rename assets/js/{4ffdf56a.031ac316.js => 4ffdf56a.f556f662.js} (98%) rename assets/js/{50032990.0ea61ccd.js => 50032990.47d0b7f0.js} (97%) rename assets/js/{514d766a.b0ec51ab.js => 514d766a.ca35f79e.js} (98%) delete mode 100644 assets/js/53b0b5d8.144adf6f.js rename assets/js/{56776a50.28321f6f.js => 56776a50.009ef339.js} (98%) rename assets/js/{56a29d1a.92eaa661.js => 56a29d1a.de0b8997.js} (99%) rename assets/js/{58d958f4.6a5669a4.js => 58d958f4.572280db.js} (97%) delete mode 100644 assets/js/59305d05.7e6bc501.js rename assets/js/{5a20f281.847d72f0.js => 5a20f281.84ff2815.js} (99%) rename assets/js/{5b6c4cb7.5d8d3771.js => 5b6c4cb7.1e5700c2.js} (99%) rename assets/js/{5c4beb71.a62d61d9.js => 5c4beb71.b666c6b3.js} (96%) rename assets/js/{5ee17acf.eeb64f93.js => 5ee17acf.4e665490.js} (99%) create mode 100644 assets/js/5ef24f1d.6c97f268.js rename assets/js/{6125e2e5.da94766a.js => 6125e2e5.372c6163.js} (97%) create mode 100644 assets/js/63503174.24f9a6f6.js rename assets/js/{63f5fe43.bed1e40c.js => 63f5fe43.faa7d00d.js} (98%) rename assets/js/{64269ed8.20920114.js => 64269ed8.18f9818d.js} (98%) rename assets/js/{653602f1.c1abe2fd.js => 653602f1.d686a47d.js} (98%) rename assets/js/{6546ef57.e13c6102.js => 6546ef57.b480f0cc.js} (98%) delete mode 100644 assets/js/66e31e6e.ce62be57.js rename assets/js/{69c1008e.e9443d0d.js => 69c1008e.6660742f.js} (95%) rename assets/js/{6a059f5b.6c7d9748.js => 6a059f5b.57b36ba4.js} (98%) rename assets/js/{6c279c12.cc8d8222.js => 6c279c12.225c0b15.js} (96%) rename assets/js/{6d913b5d.84d394c4.js => 6d913b5d.bb807553.js} (98%) rename assets/js/{89d5514b.c223f8ef.js => 6e2a1c72.7c78a48b.js} (91%) create mode 100644 assets/js/6e3166bc.fa40017d.js create mode 100644 assets/js/71e5fd50.9e08f691.js delete mode 100644 assets/js/734dc415.80010e23.js create mode 100644 assets/js/734dc415.9fadde42.js rename assets/js/{799b1578.a774f21c.js => 799b1578.ad714f78.js} (96%) rename assets/js/{7b85b03c.95489b8b.js => 7b85b03c.6e3a64bd.js} (96%) rename assets/js/{7c78db09.bc8a300d.js => 7c78db09.5ea6e962.js} (97%) delete mode 100644 assets/js/7d0b7755.4b75443f.js create mode 100644 assets/js/7d0b7755.c19774b1.js rename assets/js/{7d380c4c.ad3c0101.js => 7d380c4c.b92baa88.js} (96%) delete mode 100644 assets/js/8084fbd4.5592d29d.js rename assets/js/{832ca04e.54bca9dc.js => 832ca04e.24044575.js} (95%) rename assets/js/{83dbc9a5.e629373c.js => 83dbc9a5.4a4e5652.js} (98%) create mode 100644 assets/js/86d09e6e.43e743b3.js rename assets/js/{879923b2.2bf3c135.js => 879923b2.90f3d9b4.js} (99%) rename assets/js/{8997819f.64d4557b.js => 8997819f.aa7254b4.js} (97%) rename assets/js/{9b6d3056.ff7822d9.js => 8b301107.d02fcb00.js} (95%) rename assets/js/{8bbfcfa9.f0501de3.js => 8bbfcfa9.dc015f8e.js} (96%) delete mode 100644 assets/js/9001d127.1e177d17.js rename assets/js/{906738b8.33482c0f.js => 906738b8.3a283baa.js} (97%) create mode 100644 assets/js/9191c864.9b61c372.js delete mode 100644 assets/js/935f2afb.5c9a98e4.js create mode 100644 assets/js/935f2afb.9f248d32.js rename assets/js/{96852331.87e388ce.js => 96852331.822f904f.js} (96%) rename assets/js/{9720d299.d4ac0286.js => 9720d299.9abe8149.js} (98%) rename assets/js/{97edd56e.3b71c751.js => 97edd56e.d5ab66b5.js} (98%) rename assets/js/{992819d4.508016b4.js => 992819d4.2993e926.js} (97%) rename assets/js/{99d6017e.6764251a.js => 99d6017e.cb54715a.js} (96%) rename assets/js/{9a5c9747.5a3e990f.js => 9a5c9747.85ad9bca.js} (96%) delete mode 100644 assets/js/9aa54785.d3836c06.js rename assets/js/{9b505a1f.0d4ca405.js => 9b505a1f.f4b85bdc.js} (98%) rename assets/js/{9bfdba8c.baa4761b.js => 9bfdba8c.b2391bbd.js} (97%) rename assets/js/{9d5eac8e.4b2aa660.js => 9d5eac8e.6a3edbf9.js} (98%) delete mode 100644 assets/js/9e1ec80c.ab114838.js create mode 100644 assets/js/9f628d52.08c37d03.js rename assets/js/{9fe55709.25f4e00b.js => 9fe55709.e9c7bfda.js} (99%) rename assets/js/{9feaf8ab.31cb6a73.js => 9feaf8ab.8c912915.js} (99%) rename assets/js/{a04bc459.cf90e3e8.js => a04bc459.dcff4f83.js} (98%) rename assets/js/{a12215ea.35e2776f.js => a12215ea.1ea3e4ef.js} (98%) delete mode 100644 assets/js/a3c17fac.4f9a964b.js delete mode 100644 assets/js/a55d7fc8.3675ba14.js create mode 100644 assets/js/a55d7fc8.d2b40c2a.js rename assets/js/{a7459da2.03c88ff1.js => a7459da2.2d033572.js} (99%) rename assets/js/{aa98ec4a.ffbdd576.js => aa98ec4a.39b5137c.js} (98%) rename assets/js/{aafd28b2.21d293f7.js => aafd28b2.fb1f547f.js} (99%) rename assets/js/{abbf3a21.97ae394b.js => abbf3a21.2995f8fb.js} (97%) rename assets/js/{ac3b7d69.fd3bbc4c.js => ac3b7d69.6126d7a7.js} (98%) rename assets/js/{ad308aff.9d4faea0.js => ad308aff.8a927dcc.js} (96%) rename assets/js/{ae8a1364.d1aa581b.js => ae8a1364.4da8b56a.js} (96%) rename assets/js/{b1bfe9f5.13251023.js => b1bfe9f5.592f8cc1.js} (96%) rename assets/js/{b3c114f4.e41fb427.js => b3c114f4.28ba7bd1.js} (96%) delete mode 100644 assets/js/b56f03c6.3836580d.js rename assets/js/{b83a1049.1cf10416.js => b83a1049.f6464bc0.js} (96%) rename assets/js/{ba55e963.5bed7840.js => ba55e963.db919392.js} (95%) rename assets/js/{bb237b1e.9e57bcc8.js => bb237b1e.ea30ebd1.js} (98%) rename assets/js/{bd6c6f88.e87a9bd6.js => bd6c6f88.8d988769.js} (98%) rename assets/js/{bed7ab4e.6b5e2485.js => bed7ab4e.fea77ca6.js} (99%) rename assets/js/{c0bd86e8.4043049b.js => c0bd86e8.06ac168e.js} (96%) rename assets/js/{c3f49368.7fcf56c0.js => c3f49368.e29a1244.js} (97%) rename assets/js/{c4f5d8e4.76411a79.js => c4f5d8e4.4e0e3f0d.js} (78%) rename assets/js/{c51f4c72.0e8bec24.js => c51f4c72.69c062f8.js} (99%) delete mode 100644 assets/js/cbd1c0d0.5208c323.js create mode 100644 assets/js/cbd1c0d0.6ea2feaf.js rename assets/js/{cd902920.a8ebc09f.js => cd902920.0ae4e688.js} (97%) delete mode 100644 assets/js/ceb45c47.a3330b5f.js create mode 100644 assets/js/ceb45c47.e6acb003.js rename assets/js/{d1597237.705b0ef9.js => d1597237.07f1898e.js} (95%) delete mode 100644 assets/js/d1b2eded.fdea14ce.js delete mode 100644 assets/js/d2c255b4.51d1c434.js rename assets/js/{d2c4f39e.b83f8cc2.js => d2c4f39e.d6c2c200.js} (96%) rename assets/js/{d3556f45.a168af5e.js => d3556f45.2aeec99a.js} (95%) rename assets/js/{d48b255e.d6a84f1e.js => d48b255e.1c5329df.js} (98%) rename assets/js/{d5087a67.4b6f0656.js => d5087a67.cb6a7230.js} (98%) rename assets/js/{d5140579.770e5402.js => d5140579.0f850372.js} (97%) rename assets/js/{d5479f42.d126a913.js => d5479f42.b8876961.js} (96%) rename assets/js/{d71ff009.7f914194.js => d71ff009.037347f4.js} (96%) create mode 100644 assets/js/d74c151a.f23bb09f.js rename assets/js/{d75898ab.84f0767e.js => d75898ab.8089cc99.js} (97%) rename assets/js/{d91f9def.b4c78c77.js => d91f9def.f3256090.js} (95%) rename assets/js/{db0ed613.02dc005f.js => db0ed613.c9712562.js} (97%) rename assets/js/{dd1a9f26.51ca4c1a.js => dd1a9f26.a545ed72.js} (99%) delete mode 100644 assets/js/ded423ee.df3ed6d9.js rename assets/js/{e00e17a0.481c92d6.js => e00e17a0.8c02aab3.js} (96%) rename assets/js/{e10970d8.6486e99c.js => e10970d8.cde1bc28.js} (97%) rename assets/js/{e186625e.3f1e3436.js => e186625e.6c1b54b7.js} (95%) rename assets/js/{e2be698d.6ab0c41b.js => e2be698d.dd0e2d10.js} (99%) rename assets/js/{e2c161d9.57d50314.js => e2c161d9.00dc4bde.js} (95%) rename assets/js/{e30bbbcf.e88d084c.js => e30bbbcf.b4e3431e.js} (96%) delete mode 100644 assets/js/e3649aa7.41406e34.js rename assets/js/{e436ce66.ffd97d6e.js => e436ce66.54f16243.js} (94%) delete mode 100644 assets/js/e4c61278.03e947b6.js delete mode 100644 assets/js/e5ce8f83.b18dcb47.js rename assets/js/{e746408e.8663b558.js => e746408e.d8730765.js} (99%) rename assets/js/{e7670743.b2234f2e.js => e7670743.fb9bbf42.js} (99%) rename assets/js/{e987ec87.a4179a0d.js => e987ec87.f66b2f78.js} (96%) rename assets/js/{ebfaece6.fbef59fb.js => ebfaece6.d97235a2.js} (96%) create mode 100644 assets/js/f0b0282f.243b745a.js rename assets/js/{f1ddb0ed.0d7a9793.js => f1ddb0ed.4cbf6601.js} (99%) rename assets/js/{af9cfdf8.a481c25f.js => f2cce206.f146a973.js} (94%) rename assets/js/{f485eca7.f3f2ea52.js => f485eca7.3a61264f.js} (96%) rename assets/js/{f52ba0ac.ba4c9a10.js => f52ba0ac.c7675cca.js} (95%) rename assets/js/{f64b3473.09cab9db.js => f64b3473.b96c3fd3.js} (96%) rename assets/js/{f8bc0717.28c2f6ec.js => f8bc0717.e9c8f77e.js} (96%) create mode 100644 assets/js/f9995f72.b29de3ff.js rename assets/js/{fa16f0fc.a192e853.js => fa16f0fc.8db267a7.js} (96%) create mode 100644 assets/js/ff1d9e71.c2bc6db2.js create mode 100644 assets/js/main.16ba1fad.js rename assets/js/{main.e20b6a1c.js.LICENSE.txt => main.16ba1fad.js.LICENSE.txt} (100%) delete mode 100644 assets/js/main.e20b6a1c.js create mode 100644 assets/js/runtime~main.09475183.js delete mode 100644 assets/js/runtime~main.6b5de359.js rename assets/js/{styles.19dac7a3.js => styles.ed63c98d.js} (77%) delete mode 100644 docs/deploy/bare_metal_install/index.html delete mode 100644 docs/deploy/choose_install/index.html delete mode 100644 docs/next/deploy/bare_metal_install/index.html delete mode 100644 docs/next/deploy/choose_install/index.html delete mode 100644 img/favicon.ico:Zone.Identifier delete mode 100644 img/logo.png:Zone.Identifier delete mode 100644 img/logo.svg:Zone.Identifier delete mode 100644 img/netsage.webp:Zone.Identifier delete mode 100644 img/netsage_bg.webp:Zone.Identifier delete mode 100644 img/undraw_docusaurus_mountain.svg:Zone.Identifier delete mode 100644 img/undraw_docusaurus_react.svg:Zone.Identifier delete mode 100644 img/undraw_docusaurus_tree.svg:Zone.Identifier diff --git a/404.html b/404.html index 884da7bf..f8915627 100644 --- a/404.html +++ b/404.html @@ -6,15 +6,15 @@ Page Not Found | Netsage Pipeline Documentation - - - + + +
-
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - - +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + + \ No newline at end of file diff --git a/assets/js/00cb704f.d8fb9eb4.js b/assets/js/00cb704f.d8fb9eb4.js deleted file mode 100644 index 67ac71dc..00000000 --- a/assets/js/00cb704f.d8fb9eb4.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,h=p["".concat(i,".").concat(u)]||p[u]||m[u]||r;return n?a.a.createElement(h,l(l({ref:t},c),{},{components:n})):a.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h4",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique. E.g.,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=MyNet Los Angeles sFlow\n")),Object(r.b)("h4",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but only those using a particular interface are relevant, use this option in the .env file. The collectors and importer will save/read all incoming flows, but the logstash pipeline will drop those that do not have src_ifindex OR dst_inindex equal to one of those listed. "),Object(r.b)("p",null,"In the .env file, uncomment lines in the appropriate section and enter the information required. Be sure ",Object(r.b)("inlineCode",{parentName:"p"},"ifindex_filter_flag=True"),' with "True" capitalized as shown, any sensor names are spelled exactly right, and list all the ifindex values of flows that should be kept and processed. Some examples (use just one!):'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_keep=123\nifindex_filter_keep=123,456\nifindex_filter_keep=Sensor 1: 789\nifindex_filter_keep=123; Sensor 1: 789; Sensor 2: 800, 900\n")),Object(r.b)("p",null,"In the first case, all flows that have src_ifindex = 123 or dst_ifindex = 123 will be kept, regardless of sensor name. (Note that this may be a problem if you have more than 1 sensor with the same ifindex values!)\nIn the 2nd case, if src or dst ifindex is 123 or 456, the flow will be processed.\nIn the 3rd case, only flows from Sensor 1 will be filtered, with flows using ifindex 789 kept.\nIn the last example, any flow with ifindex 123 will be kept. Sensor 1 flows with ifindex 789 (or 123) will be kept, and those from Sensor 2 having ifindex 800 or 900 (or 123) will be kept. "),Object(r.b)("p",null,"Spaces don't matter except within the sensor names. Punctuation is required as shown."),Object(r.b)("h2",{id:"to-filter-flows-by-subnet"},"To Filter Flows by Subnet"),Object(r.b)("p",null,'With this option, flows from specified sensors will be dropped unless src or dst is in the list of subnets to keep. It works similarly to the option to filter by interface. "ALL" can refer to all sensors.\nIf a sensor is not referenced at all, all of its flows will be kept. '),Object(r.b)("p",null,"For example,"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"subnet_filter_flag=True\nsubnet_filter_keep=Sensor A Name: 123.45.6.0/16; Sensor B Name: 123.33.33.0/24, 456.66.66.0/24\n")),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to keep all flows from a certain sensor but differentiate between those that enter or exit through specific sensor interfaces. This can be done by using this option in the .env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that use interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker and only 1 ifindex is allowed.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, corrections have to be applied. For example, if you are sampling 1 out of 100 flows, for each flow measured, it is assumed that in reality there would be 100 flows of that size with that src and dst, so the number of bits (and the number of packets, bits/s and packets/s) is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config, if nfsen is being used, or the nfcapd command, but this is not convenient when using Docker. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. The same correction applies to all listed sensors. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk doesn't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 1 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 1\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-save-flow-data-to-a-different-location"},"To Save Flow Data to a Different Location"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data/ directory (ie, the data/ directory in the git checkout). If you would like to use a different location, there are two options."),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"The best solution is to create a symlink between ./data/ and the preferred location, or, for an NFS volume, export it as ${PROJECT_DIR}/data.")),Object(r.b)("p",null,"During installation, delete the data/ directory (it should only contain .placeholder), then create your symlink. Eg, to use /var/netsage/ instead of data/, "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cd {netsage-pipeline dir}\nmkdir /var/netsage\nrm data/.placeholder\nrmdir data\nln -s /var/netsage {netsage-pipeline dir}/data\n")),Object(r.b)("p",null,"(Check the permissions of the directory.)"),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},"Alternatively, update volumes in docker-compose.yml and docker-compose.override.yml Eg, to save nfcapd files to subdirs in /mydir, set the collector volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir/input_data/netflow:/data")," (similarly for sflow) and set the importer and logstash volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir:/data"),". ")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict or be wiped out on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If cpu or memory seems to be a problem, try increasing the JVM heap size for logstash from 2GB to 3 or 4, no more than 8."),Object(r.b)("p",null,"To do this, edit LS_JAVA_OPTS in the .env file. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"LS_JAVA_OPTS=-Xmx4g -Xms4g\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use.")),Object(r.b)("p",null,"To modify other logstash settings, rename the provided example file for JVM Options and tweak the settings as desired:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/012f72bc.fac18353.js b/assets/js/012f72bc.36b7fe96.js similarity index 98% rename from assets/js/012f72bc.fac18353.js rename to assets/js/012f72bc.36b7fe96.js index 225d8cda..704c4a00 100644 --- a/assets/js/012f72bc.fac18353.js +++ b/assets/js/012f72bc.36b7fe96.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{232:function(e,t,n){"use strict";n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return h}));var i=n(0),a=n.n(i);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),d=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},l),{},{components:n})):a.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),d=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},l),{},{components:n})):a.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),b=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=b(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=b(n),d=o,h=u["".concat(i,".").concat(d)]||u[d]||p[d]||a;return n?r.a.createElement(h,l(l({ref:t},s),{},{components:n})):r.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Comment out the ",Object(a.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(a.b)("inlineCode",{parentName:"p"}," ")," ",Object(a.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(a.b)("inlineCode",{parentName:"p"}," ")))),Object(a.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(a.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(a.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(a.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(a.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[4],{228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),b=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=b(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=b(n),d=o,h=u["".concat(i,".").concat(d)]||u[d]||p[d]||a;return n?r.a.createElement(h,l(l({ref:t},s),{},{components:n})):r.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Comment out the ",Object(a.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(a.b)("inlineCode",{parentName:"p"}," ")," ",Object(a.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(a.b)("inlineCode",{parentName:"p"}," ")))),Object(a.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(a.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(a.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(a.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(a.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/02341ef2.5a4f1f57.js b/assets/js/02341ef2.76f0a379.js similarity index 98% rename from assets/js/02341ef2.5a4f1f57.js rename to assets/js/02341ef2.76f0a379.js index 52b52d9c..e6ceed95 100644 --- a/assets/js/02341ef2.5a4f1f57.js +++ b/assets/js/02341ef2.76f0a379.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{68:function(e){e.exports=JSON.parse('{"pluginId":"default","version":"1.2.11","label":"1.2.11","isLast":false,"docsSidebars":{"version-1.2.11/Pipeline":[{"collapsed":true,"type":"category","label":"Pipeline","items":[{"type":"link","label":"Intro","href":"/netsage-pipeline/docs/1.2.11/pipeline/intro"},{"type":"link","label":"Tstat Data","href":"/netsage-pipeline/docs/1.2.11/pipeline/tstat"},{"type":"link","label":"Sflow/Netflow Data","href":"/netsage-pipeline/docs/1.2.11/pipeline/nfdump"},{"type":"link","label":"Importer","href":"/netsage-pipeline/docs/1.2.11/pipeline/importer"},{"type":"link","label":"Logstash","href":"/netsage-pipeline/docs/1.2.11/pipeline/logstash"},{"type":"link","label":"Elasticsearch","href":"/netsage-pipeline/docs/1.2.11/pipeline/elastic"}]},{"collapsed":true,"type":"category","label":"Deployment","items":[{"type":"link","label":"Choose Install","href":"/netsage-pipeline/docs/1.2.11/deploy/choose_install"},{"type":"link","label":"Manual Installation","href":"/netsage-pipeline/docs/1.2.11/deploy/bare_metal_install"},{"type":"link","label":"Docker Installation","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_install_simple"},{"type":"link","label":"Docker Advanced Options","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_install_advanced"},{"type":"link","label":"Docker - Upgrading","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_upgrade"},{"type":"link","label":"Troubleshooting","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_troubleshoot"}]},{"collapsed":true,"type":"category","label":"Development","items":[{"type":"link","label":"Replay Dataset","href":"/netsage-pipeline/docs/1.2.11/devel/dev_dataset"},{"type":"link","label":"Docker Dev Guide","href":"/netsage-pipeline/docs/1.2.11/devel/docker_dev_guide"},{"type":"link","label":"Docusaurus","href":"/netsage-pipeline/docs/1.2.11/devel/docusaurus"},{"type":"link","label":"Making Releases","href":"/netsage-pipeline/docs/1.2.11/devel/docker_dev_tag"}]}]},"permalinkToSidebar":{"/netsage-pipeline/docs/1.2.11/deploy/bare_metal_install":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/choose_install":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_install_advanced":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_install_simple":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_troubleshoot":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_upgrade":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/dev_dataset":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/docker_dev_guide":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/docker_dev_tag":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/docusaurus":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/elastic":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/importer":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/intro":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/logstash":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/nfdump":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/tstat":"version-1.2.11/Pipeline"}}')}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{67:function(e){e.exports=JSON.parse('{"pluginId":"default","version":"1.2.11","label":"1.2.11","isLast":false,"docsSidebars":{"version-1.2.11/Pipeline":[{"collapsed":true,"type":"category","label":"Pipeline","items":[{"type":"link","label":"Intro","href":"/netsage-pipeline/docs/1.2.11/pipeline/intro"},{"type":"link","label":"Tstat Data","href":"/netsage-pipeline/docs/1.2.11/pipeline/tstat"},{"type":"link","label":"Sflow/Netflow Data","href":"/netsage-pipeline/docs/1.2.11/pipeline/nfdump"},{"type":"link","label":"Importer","href":"/netsage-pipeline/docs/1.2.11/pipeline/importer"},{"type":"link","label":"Logstash","href":"/netsage-pipeline/docs/1.2.11/pipeline/logstash"},{"type":"link","label":"Elasticsearch","href":"/netsage-pipeline/docs/1.2.11/pipeline/elastic"}]},{"collapsed":true,"type":"category","label":"Deployment","items":[{"type":"link","label":"Choose Install","href":"/netsage-pipeline/docs/1.2.11/deploy/choose_install"},{"type":"link","label":"Manual Installation","href":"/netsage-pipeline/docs/1.2.11/deploy/bare_metal_install"},{"type":"link","label":"Docker Installation","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_install_simple"},{"type":"link","label":"Docker Advanced Options","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_install_advanced"},{"type":"link","label":"Docker - Upgrading","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_upgrade"},{"type":"link","label":"Troubleshooting","href":"/netsage-pipeline/docs/1.2.11/deploy/docker_troubleshoot"}]},{"collapsed":true,"type":"category","label":"Development","items":[{"type":"link","label":"Replay Dataset","href":"/netsage-pipeline/docs/1.2.11/devel/dev_dataset"},{"type":"link","label":"Docker Dev Guide","href":"/netsage-pipeline/docs/1.2.11/devel/docker_dev_guide"},{"type":"link","label":"Docusaurus","href":"/netsage-pipeline/docs/1.2.11/devel/docusaurus"},{"type":"link","label":"Making Releases","href":"/netsage-pipeline/docs/1.2.11/devel/docker_dev_tag"}]}]},"permalinkToSidebar":{"/netsage-pipeline/docs/1.2.11/deploy/bare_metal_install":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/choose_install":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_install_advanced":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_install_simple":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_troubleshoot":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/deploy/docker_upgrade":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/dev_dataset":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/docker_dev_guide":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/docker_dev_tag":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/devel/docusaurus":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/elastic":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/importer":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/intro":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/logstash":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/nfdump":"version-1.2.11/Pipeline","/netsage-pipeline/docs/1.2.11/pipeline/tstat":"version-1.2.11/Pipeline"}}')}}]); \ No newline at end of file diff --git a/assets/js/0271802f.b404da72.js b/assets/js/0271802f.e2ca0056.js similarity index 98% rename from assets/js/0271802f.b404da72.js rename to assets/js/0271802f.e2ca0056.js index 5728dd37..035a5c7a 100644 --- a/assets/js/0271802f.b404da72.js +++ b/assets/js/0271802f.e2ca0056.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{232:function(e,t,n){"use strict";n.d(t,"a",(function(){return f})),n.d(t,"b",(function(){return h}));var i=n(0),a=n.n(i);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},c),{},{components:n})):a.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},c),{},{components:n})):a.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?o.a.createElement(b,r(r({ref:t},c),{},{components:n})):o.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:a,l[1]=r;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var a=n(0),o=n.n(a);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?o.a.createElement(b,r(r({ref:t},c),{},{components:n})):o.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:a,l[1]=r;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0381afdd.426b41ab.js b/assets/js/0381afdd.de4385a8.js similarity index 97% rename from assets/js/0381afdd.426b41ab.js rename to assets/js/0381afdd.de4385a8.js index fc4575d6..3af9c852 100644 --- a/assets/js/0381afdd.426b41ab.js +++ b/assets/js/0381afdd.de4385a8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return m}));var r=n(0),o=n.n(r);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function c(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=d(n),p=r,m=u["".concat(i,".").concat(p)]||u[p]||b[p]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=d(n),p=r,m=u["".concat(i,".").concat(p)]||u[p]||b[p]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=i.a.createContext({}),s=function(e){var t=i.a.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(r),f=n,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return r?i.a.createElement(m,l(l({ref:t},c),{},{components:r})):i.a.createElement(m,l({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,a=new Array(o);a[0]=f;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=i.a.createContext({}),s=function(e){var t=i.a.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(r),f=n,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return r?i.a.createElement(m,l(l({ref:t},c),{},{components:r})):i.a.createElement(m,l({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,a=new Array(o);a[0]=f;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(o,".").concat(u)]||d[u]||b[u]||r;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(o,".").concat(u)]||d[u]||b[u]||r;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),l=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},u=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=l(n),u=r,m=d["".concat(i,".").concat(u)]||d[u]||f[u]||a;return n?o.a.createElement(m,p(p({ref:t},s),{},{components:n})):o.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=u;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,s(s({ref:t},p),{},{components:n})):a.a.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,s(s({ref:t},p),{},{components:n})):a.a.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},l),{},{components:n})):a.a.createElement(h,s({ref:t},l))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),d=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(a,".").concat(b)]||p[b]||u[b]||i;return n?o.a.createElement(m,c(c({ref:t},l),{},{components:n})):o.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,a[1]=c;for(var l=2;l0)&&(f.unobserve(t),f.disconnect(),n())}))}))).observe(t))},to:j||""},d&&{isActive:p,activeClassName:m}))}},238:function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return i}));var r=n(16),o=n(242);function u(){var e=Object(r.default)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=void 0===t?"/":t,u=e.url;return{withBaseUrl:function(e,t){return function(e,t,n,r){var u=void 0===r?{}:r,i=u.forcePrependBaseUrl,a=void 0!==i&&i,s=u.absolute,c=void 0!==s&&s;if(!n)return n;if(n.startsWith("#"))return n;if(Object(o.b)(n))return n;if(a)return t+n;var l=n.startsWith(t)?n:t+n.replace(/^\//,"");return c?e+l:l}(u,n,e,t)}}}function i(e,t){return void 0===t&&(t={}),(0,u().withBaseUrl)(e,t)}},242:function(e,t,n){"use strict";function r(e){return!0===/^(\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o}))},244:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useThemeConfig=void 0;var o=r(n(16));t.useThemeConfig=function(){return o.default().siteConfig.themeConfig}},245:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isDocsPluginEnabled=void 0;var r=n(236);t.isDocsPluginEnabled=!!r.useAllDocsData},246:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),u=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useDocsPreferredVersionContext=t.DocsPreferredVersionContextProvider=void 0;var a=u(n(0)),s=n(244),c=n(245),l=n(236),f=i(n(267));function d(e){var t=e.pluginIds,n=e.versionPersistence,r=e.allDocsData;var o={};return t.forEach((function(e){o[e]=function(e){var t=f.default.read(e,n);return r[e].versions.some((function(e){return e.name===t}))?{preferredVersionName:t}:(f.default.clear(e,n),{preferredVersionName:null})}(e)})),o}function v(){var e=l.useAllDocsData(),t=s.useThemeConfig().docs.versionPersistence,n=a.useMemo((function(){return Object.keys(e)}),[e]),r=a.useState((function(){return function(e){var t={};return e.forEach((function(e){t[e]={preferredVersionName:null}})),t}(n)})),o=r[0],u=r[1];return a.useEffect((function(){u(d({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]),[o,a.useMemo((function(){return{savePreferredVersion:function(e,n){f.default.save(e,t,n),u((function(t){var r;return Object.assign(Object.assign({},t),((r={})[e]={preferredVersionName:n},r))}))}}}),[u])]}var g=a.createContext(null);function m(e){var t=e.children,n=v();return a.default.createElement(g.Provider,{value:n},t)}t.DocsPreferredVersionContextProvider=function(e){var t=e.children;return c.isDocsPluginEnabled?a.default.createElement(m,null,t):a.default.createElement(a.default.Fragment,null,t)},t.useDocsPreferredVersionContext=function(){var e=a.useContext(g);if(!e)throw new Error("Can't find docs preferred context, maybe you forgot to use the DocsPreferredVersionContextProvider ?");return e}},257:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(0),o=n.n(r),u=n(25),i=n(238),a=n(233);function s(e){var t=e.title,n=e.description,r=e.keywords,s=e.image,c=Object(a.useTitleFormatter)(t),l=Object(i.a)(s,{absolute:!0});return o.a.createElement(u.a,null,t&&o.a.createElement("title",null,c),t&&o.a.createElement("meta",{property:"og:title",content:c}),n&&o.a.createElement("meta",{name:"description",content:n}),n&&o.a.createElement("meta",{property:"og:description",content:n}),r&&o.a.createElement("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),s&&o.a.createElement("meta",{property:"og:image",content:l}),s&&o.a.createElement("meta",{name:"twitter:image",content:l}),s&&o.a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}))}},258:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useAlternatePageUtils=void 0;var o=r(n(16)),u=n(23);t.useAlternatePageUtils=function(){var e=o.default(),t=e.siteConfig,n=t.baseUrl,r=t.url,i=e.i18n,a=i.defaultLocale,s=i.currentLocale,c=u.useLocation().pathname,l=s===a?n:n.replace("/"+s+"/","/"),f=c.replace(n,"");return{createUrl:function(e){var t=e.locale;return""+(e.fullyQualified?r:"")+function(e){return e===a?""+l:""+l+e+"/"}(t)+f}}}},259:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.docVersionSearchTag=t.DEFAULT_SEARCH_TAG=void 0,t.DEFAULT_SEARCH_TAG="default",t.docVersionSearchTag=function(e,t){return"docs-"+e+"-"+t}},260:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDocVersionSuggestions=t.useActiveDocContext=t.useActiveVersion=t.useLatestVersion=t.useVersions=t.useActivePluginAndVersion=t.useActivePlugin=t.useDocsData=t.useAllDocsData=void 0;var r=n(23),o=n(261),u=n(262);t.useAllDocsData=function(){return o.useAllPluginInstancesData("docusaurus-plugin-content-docs")},t.useDocsData=function(e){return o.usePluginData("docusaurus-plugin-content-docs",e)},t.useActivePlugin=function(e){void 0===e&&(e={});var n=t.useAllDocsData(),o=r.useLocation().pathname;return u.getActivePlugin(n,o,e)},t.useActivePluginAndVersion=function(e){void 0===e&&(e={});var n=t.useActivePlugin(e),o=r.useLocation().pathname;if(n)return{activePlugin:n,activeVersion:u.getActiveVersion(n.pluginData,o)}},t.useVersions=function(e){return t.useDocsData(e).versions},t.useLatestVersion=function(e){var n=t.useDocsData(e);return u.getLatestVersion(n)},t.useActiveVersion=function(e){var n=t.useDocsData(e),o=r.useLocation().pathname;return u.getActiveVersion(n,o)},t.useActiveDocContext=function(e){var n=t.useDocsData(e),o=r.useLocation().pathname;return u.getActiveDocContext(n,o)},t.useDocVersionSuggestions=function(e){var n=t.useDocsData(e),o=r.useLocation().pathname;return u.getDocVersionSuggestions(n,o)}},261:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return o})),n.d(t,"useAllPluginInstancesData",(function(){return u})),n.d(t,"usePluginData",(function(){return i}));var r=n(16);function o(){var e=Object(r.default)().globalData;if(!e)throw new Error("Docusaurus global data not found");return e}function u(e){var t=o()[e];if(!t)throw new Error("Docusaurus plugin global data not found for pluginName="+e);return t}function i(e,t){void 0===t&&(t="default");var n=u(e)[t];if(!n)throw new Error("Docusaurus plugin global data not found for pluginName="+e+" and pluginId="+t);return n}},262:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getDocVersionSuggestions=t.getActiveDocContext=t.getActiveVersion=t.getLatestVersion=t.getActivePlugin=void 0;var r=n(23);t.getActivePlugin=function(e,t,n){void 0===n&&(n={});var o=Object.entries(e).find((function(e){e[0];var n=e[1];return!!r.matchPath(t,{path:n.path,exact:!1,strict:!1})})),u=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!u&&n.failfast)throw new Error("Can't find active docs plugin for pathname="+t+", while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: "+Object.values(e).map((function(e){return e.path})).join(", "));return u},t.getLatestVersion=function(e){return e.versions.find((function(e){return e.isLast}))},t.getActiveVersion=function(e,n){var o=t.getLatestVersion(e);return[].concat(e.versions.filter((function(e){return e!==o})),[o]).find((function(e){return!!r.matchPath(n,{path:e.path,exact:!1,strict:!1})}))},t.getActiveDocContext=function(e,n){var o,u,i=t.getActiveVersion(e,n),a=null==i?void 0:i.docs.find((function(e){return!!r.matchPath(n,{path:e.path,exact:!0,strict:!1})}));return{activeVersion:i,activeDoc:a,alternateDocVersions:a?(o=a.id,u={},e.versions.forEach((function(e){e.docs.forEach((function(t){t.id===o&&(u[e.name]=t)}))})),u):{}}},t.getDocVersionSuggestions=function(e,n){var r=t.getLatestVersion(e),o=t.getActiveDocContext(e,n),u=o.activeVersion!==r;return{latestDocSuggestion:u?null==o?void 0:o.alternateDocVersions[r.name]:void 0,latestVersionSuggestion:u?r:void 0}}},263:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isSamePath=void 0,t.isSamePath=function(e,t){var n=function(e){return!e||(null==e?void 0:e.endsWith("/"))?e:e+"/"};return n(e)===n(t)}},264:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useTitleFormatter=void 0;var o=r(n(16));t.useTitleFormatter=function(e){var t=o.default().siteConfig,n=void 0===t?{}:t,r=n.title,u=n.titleDelimiter,i=void 0===u?"|":u;return e&&e.trim().length?e.trim()+" "+i+" "+r:r}},265:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.usePluralForm=void 0;var o=n(0),u=r(n(16)),i=["zero","one","two","few","many","other"];function a(e){return i.filter((function(t){return e.includes(t)}))}var s={locale:"en",pluralForms:a(["one","other"]),select:function(e){return 1===e?"one":"other"}};function c(){var e=u.default().i18n.currentLocale;return o.useMemo((function(){if(!Intl.PluralRules)return console.error("Intl.PluralRules not available!\nDocusaurus will fallback to a default/fallback (English) Intl.PluralRules implementation.\n "),s;try{return t=e,n=new Intl.PluralRules(t),{locale:t,pluralForms:a(n.resolvedOptions().pluralCategories),select:function(e){return n.select(e)}}}catch(r){return console.error("Failed to use Intl.PluralRules for locale="+e+".\nDocusaurus will fallback to a default/fallback (English) Intl.PluralRules implementation.\n"),s}var t,n}),[e])}t.usePluralForm=function(){var e=c();return{selectMessage:function(t,n){return function(e,t,n){var r=e.split("|");if(1===r.length)return r[0];r.length>n.pluralForms.length&&console.error("For locale="+n.locale+", a maximum of "+n.pluralForms.length+" plural forms are expected ("+n.pluralForms+"), but the message contains "+r.length+" plural forms: "+e+" ");var o=n.select(t),u=n.pluralForms.indexOf(o);return r[Math.min(u,r.length-1)]}(n,t,e)}}}},266:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDocsPreferredVersionByPluginId=t.useDocsPreferredVersion=void 0;var r=n(0),o=n(246),u=n(236),i=n(268);t.useDocsPreferredVersion=function(e){void 0===e&&(e=i.DEFAULT_PLUGIN_ID);var t=u.useDocsData(e),n=o.useDocsPreferredVersionContext(),a=n[0],s=n[1],c=a[e].preferredVersionName;return{preferredVersion:c?t.versions.find((function(e){return e.name===c})):null,savePreferredVersionName:r.useCallback((function(t){s.savePreferredVersion(e,t)}),[s])}},t.useDocsPreferredVersionByPluginId=function(){var e=u.useAllDocsData(),t=o.useDocsPreferredVersionContext()[0],n=Object.keys(e),r={};return n.forEach((function(n){r[n]=function(n){var r=e[n],o=t[n].preferredVersionName;return o?r.versions.find((function(e){return e.name===o})):null}(n)})),r}},267:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return"docs-preferred-version-"+e},o={save:function(e,t,n){"none"===t||window.localStorage.setItem(r(e),n)},read:function(e,t){return"none"===t?null:window.localStorage.getItem(r(e))},clear:function(e,t){"none"===t||window.localStorage.removeItem(r(e))}};t.default=o},268:function(e,t,n){"use strict";n.r(t),n.d(t,"DEFAULT_PLUGIN_ID",(function(){return r}));var r="default"}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[1],{229:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(240);Object.defineProperty(t,"useThemeConfig",{enumerable:!0,get:function(){return r.useThemeConfig}});var o=n(254);Object.defineProperty(t,"useAlternatePageUtils",{enumerable:!0,get:function(){return o.useAlternatePageUtils}});var u=n(255);Object.defineProperty(t,"docVersionSearchTag",{enumerable:!0,get:function(){return u.docVersionSearchTag}}),Object.defineProperty(t,"DEFAULT_SEARCH_TAG",{enumerable:!0,get:function(){return u.DEFAULT_SEARCH_TAG}});var i=n(241);Object.defineProperty(t,"isDocsPluginEnabled",{enumerable:!0,get:function(){return i.isDocsPluginEnabled}});var a=n(259);Object.defineProperty(t,"isSamePath",{enumerable:!0,get:function(){return a.isSamePath}});var s=n(260);Object.defineProperty(t,"useTitleFormatter",{enumerable:!0,get:function(){return s.useTitleFormatter}});var c=n(261);Object.defineProperty(t,"usePluralForm",{enumerable:!0,get:function(){return c.usePluralForm}});var l=n(262);Object.defineProperty(t,"useDocsPreferredVersion",{enumerable:!0,get:function(){return l.useDocsPreferredVersion}}),Object.defineProperty(t,"useDocsPreferredVersionByPluginId",{enumerable:!0,get:function(){return l.useDocsPreferredVersionByPluginId}});var f=n(242);Object.defineProperty(t,"DocsPreferredVersionContextProvider",{enumerable:!0,get:function(){return f.DocsPreferredVersionContextProvider}})},230:function(e,t,n){"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;t0)&&(f.unobserve(t),f.disconnect(),n())}))}))).observe(t))},to:j||""},d&&{isActive:p,activeClassName:m}))}},234:function(e,t,n){"use strict";n.d(t,"b",(function(){return u})),n.d(t,"a",(function(){return i}));var r=n(16),o=n(238);function u(){var e=Object(r.default)().siteConfig,t=(e=void 0===e?{}:e).baseUrl,n=void 0===t?"/":t,u=e.url;return{withBaseUrl:function(e,t){return function(e,t,n,r){var u=void 0===r?{}:r,i=u.forcePrependBaseUrl,a=void 0!==i&&i,s=u.absolute,c=void 0!==s&&s;if(!n)return n;if(n.startsWith("#"))return n;if(Object(o.b)(n))return n;if(a)return t+n;var l=n.startsWith(t)?n:t+n.replace(/^\//,"");return c?e+l:l}(u,n,e,t)}}}function i(e,t){return void 0===t&&(t={}),(0,u().withBaseUrl)(e,t)}},238:function(e,t,n){"use strict";function r(e){return!0===/^(\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,"b",(function(){return r})),n.d(t,"a",(function(){return o}))},240:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useThemeConfig=void 0;var o=r(n(16));t.useThemeConfig=function(){return o.default().siteConfig.themeConfig}},241:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isDocsPluginEnabled=void 0;var r=n(232);t.isDocsPluginEnabled=!!r.useAllDocsData},242:function(e,t,n){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,t,n,r){void 0===r&&(r=n),Object.defineProperty(e,r,{enumerable:!0,get:function(){return t[n]}})}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),u=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)"default"!==n&&Object.hasOwnProperty.call(e,n)&&r(t,e,n);return o(t,e),t},i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useDocsPreferredVersionContext=t.DocsPreferredVersionContextProvider=void 0;var a=u(n(0)),s=n(240),c=n(241),l=n(232),f=i(n(263));function d(e){var t=e.pluginIds,n=e.versionPersistence,r=e.allDocsData;var o={};return t.forEach((function(e){o[e]=function(e){var t=f.default.read(e,n);return r[e].versions.some((function(e){return e.name===t}))?{preferredVersionName:t}:(f.default.clear(e,n),{preferredVersionName:null})}(e)})),o}function v(){var e=l.useAllDocsData(),t=s.useThemeConfig().docs.versionPersistence,n=a.useMemo((function(){return Object.keys(e)}),[e]),r=a.useState((function(){return function(e){var t={};return e.forEach((function(e){t[e]={preferredVersionName:null}})),t}(n)})),o=r[0],u=r[1];return a.useEffect((function(){u(d({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]),[o,a.useMemo((function(){return{savePreferredVersion:function(e,n){f.default.save(e,t,n),u((function(t){var r;return Object.assign(Object.assign({},t),((r={})[e]={preferredVersionName:n},r))}))}}}),[u])]}var g=a.createContext(null);function m(e){var t=e.children,n=v();return a.default.createElement(g.Provider,{value:n},t)}t.DocsPreferredVersionContextProvider=function(e){var t=e.children;return c.isDocsPluginEnabled?a.default.createElement(m,null,t):a.default.createElement(a.default.Fragment,null,t)},t.useDocsPreferredVersionContext=function(){var e=a.useContext(g);if(!e)throw new Error("Can't find docs preferred context, maybe you forgot to use the DocsPreferredVersionContextProvider ?");return e}},253:function(e,t,n){"use strict";n.d(t,"a",(function(){return s}));var r=n(0),o=n.n(r),u=n(25),i=n(234),a=n(229);function s(e){var t=e.title,n=e.description,r=e.keywords,s=e.image,c=Object(a.useTitleFormatter)(t),l=Object(i.a)(s,{absolute:!0});return o.a.createElement(u.a,null,t&&o.a.createElement("title",null,c),t&&o.a.createElement("meta",{property:"og:title",content:c}),n&&o.a.createElement("meta",{name:"description",content:n}),n&&o.a.createElement("meta",{property:"og:description",content:n}),r&&o.a.createElement("meta",{name:"keywords",content:Array.isArray(r)?r.join(","):r}),s&&o.a.createElement("meta",{property:"og:image",content:l}),s&&o.a.createElement("meta",{name:"twitter:image",content:l}),s&&o.a.createElement("meta",{name:"twitter:card",content:"summary_large_image"}))}},254:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useAlternatePageUtils=void 0;var o=r(n(16)),u=n(23);t.useAlternatePageUtils=function(){var e=o.default(),t=e.siteConfig,n=t.baseUrl,r=t.url,i=e.i18n,a=i.defaultLocale,s=i.currentLocale,c=u.useLocation().pathname,l=s===a?n:n.replace("/"+s+"/","/"),f=c.replace(n,"");return{createUrl:function(e){var t=e.locale;return""+(e.fullyQualified?r:"")+function(e){return e===a?""+l:""+l+e+"/"}(t)+f}}}},255:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.docVersionSearchTag=t.DEFAULT_SEARCH_TAG=void 0,t.DEFAULT_SEARCH_TAG="default",t.docVersionSearchTag=function(e,t){return"docs-"+e+"-"+t}},256:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDocVersionSuggestions=t.useActiveDocContext=t.useActiveVersion=t.useLatestVersion=t.useVersions=t.useActivePluginAndVersion=t.useActivePlugin=t.useDocsData=t.useAllDocsData=void 0;var r=n(23),o=n(257),u=n(258);t.useAllDocsData=function(){return o.useAllPluginInstancesData("docusaurus-plugin-content-docs")},t.useDocsData=function(e){return o.usePluginData("docusaurus-plugin-content-docs",e)},t.useActivePlugin=function(e){void 0===e&&(e={});var n=t.useAllDocsData(),o=r.useLocation().pathname;return u.getActivePlugin(n,o,e)},t.useActivePluginAndVersion=function(e){void 0===e&&(e={});var n=t.useActivePlugin(e),o=r.useLocation().pathname;if(n)return{activePlugin:n,activeVersion:u.getActiveVersion(n.pluginData,o)}},t.useVersions=function(e){return t.useDocsData(e).versions},t.useLatestVersion=function(e){var n=t.useDocsData(e);return u.getLatestVersion(n)},t.useActiveVersion=function(e){var n=t.useDocsData(e),o=r.useLocation().pathname;return u.getActiveVersion(n,o)},t.useActiveDocContext=function(e){var n=t.useDocsData(e),o=r.useLocation().pathname;return u.getActiveDocContext(n,o)},t.useDocVersionSuggestions=function(e){var n=t.useDocsData(e),o=r.useLocation().pathname;return u.getDocVersionSuggestions(n,o)}},257:function(e,t,n){"use strict";n.r(t),n.d(t,"default",(function(){return o})),n.d(t,"useAllPluginInstancesData",(function(){return u})),n.d(t,"usePluginData",(function(){return i}));var r=n(16);function o(){var e=Object(r.default)().globalData;if(!e)throw new Error("Docusaurus global data not found");return e}function u(e){var t=o()[e];if(!t)throw new Error("Docusaurus plugin global data not found for pluginName="+e);return t}function i(e,t){void 0===t&&(t="default");var n=u(e)[t];if(!n)throw new Error("Docusaurus plugin global data not found for pluginName="+e+" and pluginId="+t);return n}},258:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getDocVersionSuggestions=t.getActiveDocContext=t.getActiveVersion=t.getLatestVersion=t.getActivePlugin=void 0;var r=n(23);t.getActivePlugin=function(e,t,n){void 0===n&&(n={});var o=Object.entries(e).find((function(e){e[0];var n=e[1];return!!r.matchPath(t,{path:n.path,exact:!1,strict:!1})})),u=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!u&&n.failfast)throw new Error("Can't find active docs plugin for pathname="+t+", while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: "+Object.values(e).map((function(e){return e.path})).join(", "));return u},t.getLatestVersion=function(e){return e.versions.find((function(e){return e.isLast}))},t.getActiveVersion=function(e,n){var o=t.getLatestVersion(e);return[].concat(e.versions.filter((function(e){return e!==o})),[o]).find((function(e){return!!r.matchPath(n,{path:e.path,exact:!1,strict:!1})}))},t.getActiveDocContext=function(e,n){var o,u,i=t.getActiveVersion(e,n),a=null==i?void 0:i.docs.find((function(e){return!!r.matchPath(n,{path:e.path,exact:!0,strict:!1})}));return{activeVersion:i,activeDoc:a,alternateDocVersions:a?(o=a.id,u={},e.versions.forEach((function(e){e.docs.forEach((function(t){t.id===o&&(u[e.name]=t)}))})),u):{}}},t.getDocVersionSuggestions=function(e,n){var r=t.getLatestVersion(e),o=t.getActiveDocContext(e,n),u=o.activeVersion!==r;return{latestDocSuggestion:u?null==o?void 0:o.alternateDocVersions[r.name]:void 0,latestVersionSuggestion:u?r:void 0}}},259:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isSamePath=void 0,t.isSamePath=function(e,t){var n=function(e){return!e||(null==e?void 0:e.endsWith("/"))?e:e+"/"};return n(e)===n(t)}},260:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.useTitleFormatter=void 0;var o=r(n(16));t.useTitleFormatter=function(e){var t=o.default().siteConfig,n=void 0===t?{}:t,r=n.title,u=n.titleDelimiter,i=void 0===u?"|":u;return e&&e.trim().length?e.trim()+" "+i+" "+r:r}},261:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.usePluralForm=void 0;var o=n(0),u=r(n(16)),i=["zero","one","two","few","many","other"];function a(e){return i.filter((function(t){return e.includes(t)}))}var s={locale:"en",pluralForms:a(["one","other"]),select:function(e){return 1===e?"one":"other"}};function c(){var e=u.default().i18n.currentLocale;return o.useMemo((function(){if(!Intl.PluralRules)return console.error("Intl.PluralRules not available!\nDocusaurus will fallback to a default/fallback (English) Intl.PluralRules implementation.\n "),s;try{return t=e,n=new Intl.PluralRules(t),{locale:t,pluralForms:a(n.resolvedOptions().pluralCategories),select:function(e){return n.select(e)}}}catch(r){return console.error("Failed to use Intl.PluralRules for locale="+e+".\nDocusaurus will fallback to a default/fallback (English) Intl.PluralRules implementation.\n"),s}var t,n}),[e])}t.usePluralForm=function(){var e=c();return{selectMessage:function(t,n){return function(e,t,n){var r=e.split("|");if(1===r.length)return r[0];r.length>n.pluralForms.length&&console.error("For locale="+n.locale+", a maximum of "+n.pluralForms.length+" plural forms are expected ("+n.pluralForms+"), but the message contains "+r.length+" plural forms: "+e+" ");var o=n.select(t),u=n.pluralForms.indexOf(o);return r[Math.min(u,r.length-1)]}(n,t,e)}}}},262:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.useDocsPreferredVersionByPluginId=t.useDocsPreferredVersion=void 0;var r=n(0),o=n(242),u=n(232),i=n(264);t.useDocsPreferredVersion=function(e){void 0===e&&(e=i.DEFAULT_PLUGIN_ID);var t=u.useDocsData(e),n=o.useDocsPreferredVersionContext(),a=n[0],s=n[1],c=a[e].preferredVersionName;return{preferredVersion:c?t.versions.find((function(e){return e.name===c})):null,savePreferredVersionName:r.useCallback((function(t){s.savePreferredVersion(e,t)}),[s])}},t.useDocsPreferredVersionByPluginId=function(){var e=u.useAllDocsData(),t=o.useDocsPreferredVersionContext()[0],n=Object.keys(e),r={};return n.forEach((function(n){r[n]=function(n){var r=e[n],o=t[n].preferredVersionName;return o?r.versions.find((function(e){return e.name===o})):null}(n)})),r}},263:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){return"docs-preferred-version-"+e},o={save:function(e,t,n){"none"===t||window.localStorage.setItem(r(e),n)},read:function(e,t){return"none"===t?null:window.localStorage.getItem(r(e))},clear:function(e,t){"none"===t||window.localStorage.removeItem(r(e))}};t.default=o},264:function(e,t,n){"use strict";n.r(t),n.d(t,"DEFAULT_PLUGIN_ID",(function(){return r}));var r="default"}}]); \ No newline at end of file diff --git a/assets/js/418618b7.efff362b.js b/assets/js/12ba72b5.4b8388c3.js similarity index 84% rename from assets/js/418618b7.efff362b.js rename to assets/js/12ba72b5.4b8388c3.js index 577f16a6..b00d5097 100644 --- a/assets/js/418618b7.efff362b.js +++ b/assets/js/12ba72b5.4b8388c3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[33],{103:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return i})),n.d(t,"metadata",(function(){return l})),n.d(t,"toc",(function(){return s})),n.d(t,"default",(function(){return p}));var o=n(3),a=n(7),r=(n(0),n(232)),i={id:"docker_install_simple",title:"Docker Installation Guide",sidebar_label:"Docker Installation"},l={unversionedId:"deploy/docker_install_simple",id:"version-2.0.0/deploy/docker_install_simple",isDocsHomePage:!1,title:"Docker Installation Guide",description:"In this deployment guide, you will learn how to deploy a basic Netsage setup that includes one sflow and/or one netflow collector. If you have more than one collector of either type, or other special situations, see the Docker Advanced guide.",source:"@site/versioned_docs/version-2.0.0/deploy/docker_install_simple.md",slug:"/deploy/docker_install_simple",permalink:"/netsage-pipeline/docs/deploy/docker_install_simple",editUrl:"https://github.com/netsage-project/netsage-pipeline/edit/master/website/versioned_docs/version-2.0.0/deploy/docker_install_simple.md",version:"2.0.0",sidebar_label:"Docker Installation",sidebar:"version-2.0.0/Pipeline",previous:{title:"Manual Installation Guide",permalink:"/netsage-pipeline/docs/deploy/bare_metal_install"},next:{title:"Docker Advanced Options Guide",permalink:"/netsage-pipeline/docs/deploy/docker_install_advanced"}},s=[{value:"1. Set up Data Sources",id:"1-set-up-data-sources",children:[]},{value:"2. Set up a Pipeline Host",id:"2-set-up-a-pipeline-host",children:[]},{value:"3. Clone the Netsage Pipeline Project",id:"3-clone-the-netsage-pipeline-project",children:[]},{value:"4. Create Docker-compose.override.yml",id:"4-create-docker-composeoverrideyml",children:[]},{value:"5. Choose Pipeline Version",id:"5-choose-pipeline-version",children:[]},{value:"6. Create Environment File",id:"6-create-environment-file",children:[]},{value:"Testing the Collectors",id:"testing-the-collectors",children:[]},{value:"Running the Collectors and Pipeline",id:"running-the-collectors-and-pipeline",children:[]}],c={toc:s};function p(e){var t=e.components,n=Object(a.a)(e,["components"]);return Object(r.b)("wrapper",Object(o.a)({},c,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"In this deployment guide, you will learn how to deploy a basic Netsage setup that includes one sflow and/or one netflow collector. If you have more than one collector of either type, or other special situations, see the Docker Advanced guide."),Object(r.b)("p",null,"The Docker containers included in the installation are"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"rabbit (the local RabbitMQ server)"),Object(r.b)("li",{parentName:"ul"},"sflow-collector (receives sflow data and writes nfcapd files)"),Object(r.b)("li",{parentName:"ul"},"netflow-collector (receives netflow data and writes nfcapd files)"),Object(r.b)("li",{parentName:"ul"},"importer (reads nfcapd files and puts flows into a local rabbit queue)"),Object(r.b)("li",{parentName:"ul"},"logstash (logstash pipeline that processes flows and sends them to their final destination, by default a local rabbit queue)"),Object(r.b)("li",{parentName:"ul"},"ofelia (cron-like downloading of files used by the logstash pipeline)")),Object(r.b)("p",null,"The code and configs for the importer and logstash pipeline can be viewed in the netsage-project/netsage-pipeline github repo. See netsage-project/docker-nfdump-collector for code related to the collectors."),Object(r.b)("h3",{id:"1-set-up-data-sources"},"1. Set up Data Sources"),Object(r.b)("p",null,"The data processing pipeline needs data to ingest in order to do anything, of course. There are three types of data that can be consumed."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"sflow "),Object(r.b)("li",{parentName:"ul"},"netflow"),Object(r.b)("li",{parentName:"ul"},"tstat")),Object(r.b)("p",null,"At least one of these must be set up on a ",Object(r.b)("em",{parentName:"p"},"sensor")," (i.e., flow ",Object(r.b)("em",{parentName:"p"},"exporter")," / router), to provide the incoming flow data.\nYou can do this step later, but it will helpful to have it working first. "),Object(r.b)("p",null,"Sflow and netflow data should be exported to the pipeline host where there will be ",Object(r.b)("em",{parentName:"p"},"collectors")," (nfcapd and/or sfcapd processes) ready to receive it (see below). To use the default settings, send sflow to port 9998 and netflow/IPFIX to port 9999. On the pipeline host, allow incoming traffic from the flow exporters, of course."),Object(r.b)("p",null,'Tstat data should be sent directly to the logstash input rabbit queue "netsage_deidentifier_raw" on the pipeline host. No collector is needed for tstat data. See the netsage-project/tstat-transport repo. (From there, logstash will grab the data and process it the same way as it processes sflow/netflow data. (See the Docker Advanced guide.)'),Object(r.b)("h3",{id:"2-set-up-a-pipeline-host"},"2. Set up a Pipeline Host"),Object(r.b)("p",null,"Decide where to run the Docker Pipeline and get it set up. Adjust iptables to allow the flow exporters (routers) to send flow data to the host. "),Object(r.b)("p",null,"Install Docker Engine (docker-ce, docker-ce-cli, containerd.io) - see instructions at ",Object(r.b)("a",{parentName:"p",href:"https://docs.docker.com/engine/install/"},"https://docs.docker.com/engine/install/"),"."),Object(r.b)("p",null,"Install Docker Compose from Docker's GitHub repository - see ",Object(r.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/install/"},"https://docs.docker.com/compose/install/"),". You need to ",Object(r.b)("strong",{parentName:"p"},"specify version 1.29.2")," (or newer) in the curl command. "),Object(r.b)("p",null,"Check default file permissions. If the ",Object(r.b)("em",{parentName:"p"},"logstash")," user is not able to access the logstash config files in the git checkout, you'll get an error from logstash saying there are no .conf files found even though they are there. Various components also need to be able to read and write to the data/ directory in the checkout. Defaults of 775 (u=rwx, g=rwx, o=rx) should work."),Object(r.b)("h3",{id:"3-clone-the-netsage-pipeline-project"},"3. Clone the Netsage Pipeline Project"),Object(r.b)("p",null,"Clone the netsage-pipeline project from github."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"git clone https://github.com/netsage-project/netsage-pipeline.git\n")),Object(r.b)("p",null,"When the pipeline runs, it uses the logstash conf files that are in the git checkout (in conf-logstash/), as well as a couple other files like docker-compose.yml, so it is important to checkout the correct version."),Object(r.b)("p",null,"Move into the netsage-pipeline/ directory (",Object(r.b)("strong",{parentName:"p"},"all git and docker commands must be run from inside this directory!"),"), then checkout the most recent version of the code. It will say you are in 'detached HEAD' state if you don't include -b."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"git checkout {tag}\n")),Object(r.b)("p",null,'Replace "{tag}" with the release version you intend to use, e.g., "v1.2.11". ("Master" is the development version and is not intended for general use!)\n',Object(r.b)("inlineCode",{parentName:"p"},"git status")," will confirm which branch you are on, e.g., master or v1.2.11."),Object(r.b)("h3",{id:"4-create-docker-composeoverrideyml"},"4. Create Docker-compose.override.yml"),Object(r.b)("p",null,"Information in the ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose.yml")," file tells docker which containers (processes) to run and sets various parameters for them.\nSettings in the ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose.override.yml")," file will overrule and add to those. Note that docker-compose.yml should not be edited since upgrades will replace it. Put all customizations in the override file, since override files will not be overwritten."),Object(r.b)("p",null,"Collector settings may need to be edited by the user, so the information that docker uses to run the collectors is specified (only) in the override file. Therefore, docker-compose_override.example.yml must always be copied to docker-compose_override.yml. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp docker-compose.override_example.yml docker-compose.override.yml\n")),Object(r.b)("p",null,"By default docker will bring up a single sflow collector and a single netflow collector that listen to udp traffic on ports localhost:9998 and 9999. If this matches your case, you don't need to make any changes to the docker-compose.override_example.yml. "),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"If you have only one collector, remove or comment out the section for the one not needed so the collector doesn't run and simply create empty nfcapd files."),Object(r.b)("li",{parentName:"ul"},'If the collectors need to listen to different ports, make the appropriate changes here in both the "command:" and "ports:" lines. '),Object(r.b)("li",{parentName:"ul"},"By default, the collectors will save flows to nfcapd files in sflow/ and netflow/ subdirectories in ",Object(r.b)("inlineCode",{parentName:"li"},"./data/input_data/")," (i.e., the data/ directory in the git checkout). If you need to save the data files to a different location, see the Docker Advanced section.")),Object(r.b)("p",null,"Other lines in this file you can ignore for now. "),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you run into issues, try removing all the comments in the override file as they may conflict with the parsing done by docker-compose, though we have not found this to be a problem."))),Object(r.b)("h3",{id:"5-choose-pipeline-version"},"5. Choose Pipeline Version"),Object(r.b)("p",null,"Once you've created the docker-compose.override.xml file and finished adjusting it for any customizations, you're ready to select which image versions Docker should run."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"./scripts/docker_select_version.sh\n")),Object(r.b)("p",null,"When prompted, select the ",Object(r.b)("strong",{parentName:"p"},"same version")," you checked out earlier. "),Object(r.b)("p",null,"This script will replace the version numbers of docker images in docker-compose.override.yml and docker-compose.yml with the correct values."),Object(r.b)("h3",{id:"6-create-environment-file"},"6. Create Environment File"),Object(r.b)("p",null,Object(r.b)("p",{parentName:"p"},"Next, copy ",Object(r.b)("inlineCode",{parentName:"p"},"env.example")," to ",Object(r.b)("inlineCode",{parentName:"p"},".env")," "),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp env.example .env \n")),Object(r.b)("p",{parentName:"p"},"then edit the .env file to set the sensor names to unique identifiers (with spaces or not, no quotes)"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"# Importer settings\nsflowSensorName=My sflow sensor name\nnetflowSensorName=My netflow sensor name\n")),Object(r.b)("ul",{parentName:"p"},Object(r.b)("li",{parentName:"ul"},"If you have only one collector, remove or comment out the line for the one you are not using."),Object(r.b)("li",{parentName:"ul"},'If you have more than one of the same type of collector, see the "Docker Advanced" documentation.')),Object(r.b)("div",{parentName:"p",className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"These names uniquely identify the source of the data and will be shown in the Grafana dashboards. In elasticsearch, they are saved in the ",Object(r.b)("inlineCode",{parentName:"p"},"meta.sensor_id"),' field. Choose names that are meaningful and unique.\nFor example, your sensor names might be "MyNet New York Sflow" and "MyNet Boston Netflow" or "MyNet New York - London" and "MyNet New York - Paris". Whatever makes sense in your situation.'))),Object(r.b)("p",{parentName:"p"},"You will also want to edit the ",Object(r.b)("strong",{parentName:"p"},"Logstash output rabbit queue")," section. This section defines where the final data will land after going through the pipeline. By default, it will be written to a rabbitmq queue on ",Object(r.b)("inlineCode",{parentName:"p"},"rabbit"),", ie, the local rabbitMQ server running in the docker container. Enter a hostname to send to a remote rabbitMQ server (also the correct username, password, and queue key/name). "),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"rabbitmq_output_host=rabbit@mynet.edu\nrabbitmq_output_username=guest\nrabbitmq_output_pw=guest\nrabbitmq_output_key=netsage_archive_input\n")),Object(r.b)("div",{parentName:"p",className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"To send processed flow data to GlobalNOC at Indiana University, you will need to obtain settings for this section from your contact. A new queue may need to be set up at IU, as well as allowing traffic from your pipeline host. (At IU, data from the this final rabbit queue will be moved into an Elasticsearch instance for storage and viewing.)"))),Object(r.b)("p",{parentName:"p"},"The following options are described in the Docker Advanced section:"),Object(r.b)("p",{parentName:"p"},Object(r.b)("strong",{parentName:"p"},"To drop all flows except those using the specfied interfaces"),": Use if only some flows from a router are of interest and those can be identified by interface."),Object(r.b)("p",{parentName:"p"},Object(r.b)("strong",{parentName:"p"},"To change the sensor name for flows using a certain interface"),": Use if you want to break out some flows coming into a port and give them a different sensor name."),Object(r.b)("p",{parentName:"p"},Object(r.b)("strong",{parentName:"p"},'To "manually" correct flow sizes and rates for sampling for specified sensors'),": Use if sampling corrections are not being done automatically. Normally you do not need to use this, but check flows to be sure results are reasonable.")),Object(r.b)("h2",{id:"testing-the-collectors"},"Testing the Collectors"),Object(r.b)("p",null,"At this point, you can start the two flow collectors by themselves by running the following line. If you only need one of the collectors, remove the other from this command. "),Object(r.b)("p",null,"(See the next section for how to start all the containers, including the collectors.)"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d sflow-collector netflow-collector\n")),Object(r.b)("p",null,"Subdirectories for sflow/netflow, year, month, and day are created automatically under ",Object(r.b)("inlineCode",{parentName:"p"},"data/input_data/"),". File names contain dates and times.\nThese are not text files; to view the contents, use an ",Object(r.b)("a",{parentName:"p",href:"http://www.linuxcertif.com/man/1/nfdump/"},"nfdump command")," (you will need to install nfdump).\nFiles will be deleted automatically by the importer as they age out (the default is to keep 3 days). "),Object(r.b)("p",null,"If the collector(s) are running properly, you should see nfcapd files being written every 5 minutes and they should have sizes of more than a few hundred bytes. (Empty files still have header and footer lines.)",Object(r.b)("br",{parentName:"p"}),"\n","See Troubleshooting if you have problems."),Object(r.b)("p",null,"To stop the collectors"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose down \n")),Object(r.b)("h2",{id:"running-the-collectors-and-pipeline"},"Running the Collectors and Pipeline"),Object(r.b)("p",null,Object(r.b)("p",{parentName:"p"},"Start up the pipeline (all containers) using:"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"# docker-compose up -d\n")),Object(r.b)("p",{parentName:"p"},'This will also restart any containers/processes that have died. "-d" runs containers in the background.'),Object(r.b)("p",{parentName:"p"},"You can see the status of the containers and whether any have died (exited) using"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"# docker-compose ps\n")),Object(r.b)("p",{parentName:"p"},"To check the logs for each of the containers, run"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"# docker-compose logs\n# docker-compose logs logstash\n# docker-compose logs importer\netc.\n")),Object(r.b)("p",{parentName:"p"},"Add ",Object(r.b)("inlineCode",{parentName:"p"},"-f")," or, e.g., ",Object(r.b)("inlineCode",{parentName:"p"},"-f logstash")," to see new log messages as they arrive. ",Object(r.b)("inlineCode",{parentName:"p"},"--timestamps"),", ",Object(r.b)("inlineCode",{parentName:"p"},"--tail"),", and ",Object(r.b)("inlineCode",{parentName:"p"},"--since")," are also useful -- look up details in Docker documentation."),Object(r.b)("p",{parentName:"p"},"To shut down the pipeline (all containers) use"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"# docker-compose down\n")),Object(r.b)("p",{parentName:"p"},"Run all commands from the netsage-pipeline/ directory.")))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return m}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),u=o,m=d["".concat(i,".").concat(u)]||d[u]||b[u]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),u=o,m=d["".concat(i,".").concat(u)]||d[u]||b[u]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p0&&e[a-1]===t?e:e.concat(t)},R=function(e,t){var a=e.plain,n=Object.create(null),r=e.styles.reduce((function(e,a){var n=a.languages,r=a.style;return n&&!n.includes(t)||a.types.forEach((function(t){var a=B({},e[t],r);e[t]=a})),e}),n);return r.root=a,r.plain=B({},a,{backgroundColor:null}),r};function M(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&-1===t.indexOf(n)&&(a[n]=e[n]);return a}var F=function(e){function t(){for(var t=this,a=[],n=arguments.length;n--;)a[n]=arguments[n];e.apply(this,a),_(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var a=e.theme?R(e.theme,e.language):void 0;return t.themeDict=a})),_(this,"getLineProps",(function(e){var a=e.key,n=e.className,r=e.style,o=B({},M(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(o.style=c.plain),void 0!==r&&(o.style=void 0!==o.style?B({},o.style,r):r),void 0!==a&&(o.key=a),n&&(o.className+=" "+n),o})),_(this,"getStyleForToken",(function(e){var a=e.types,n=e.empty,r=a.length,o=t.getThemeDict(t.props);if(void 0!==o){if(1===r&&"plain"===a[0])return n?{display:"inline-block"}:void 0;if(1===r&&!n)return o[a[0]];var c=n?{display:"inline-block"}:{},l=a.map((function(e){return o[e]}));return Object.assign.apply(Object,[c].concat(l))}})),_(this,"getTokenProps",(function(e){var a=e.key,n=e.className,r=e.style,o=e.token,c=B({},M(e,["key","className","style","token"]),{className:"token "+o.types.join(" "),children:o.content,style:t.getStyleForToken(o),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?B({},c.style,r):r),void 0!==a&&(c.key=a),n&&(c.className+=" "+n),c})),_(this,"tokenize",(function(e,t,a,n){var r={code:t,grammar:a,language:n,tokens:[]};e.hooks.run("before-tokenize",r);var o=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),o}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,a=e.language,n=e.code,r=e.children,o=this.getThemeDict(this.props),c=t.languages[a];return r({tokens:function(e){for(var t=[[]],a=[e],n=[0],r=[e.length],o=0,c=0,l=[],i=[l];c>-1;){for(;(o=n[c]++)0?u:["plain"],s=d):(u=D(u,d.type),d.alias&&(u=D(u,d.alias)),s=d.content),"string"==typeof s){var p=s.split(L),m=p.length;l.push({types:u,content:p[0]});for(var b=1;b0}))}o&&Y.test(o)&&(g=o.match(Y)[1]);var E=a&&a.replace(/language-/,"");!E&&c.defaultLanguage&&(E=c.defaultLanguage);var C=j.replace(/\n$/,"");if(0===y.length&&void 0!==E){for(var N,T="",x=function(e){switch(e){case"js":case"javascript":case"ts":case"typescript":return X(["js","jsBlock"]);case"jsx":case"tsx":return X(["js","jsBlock","jsx"]);case"html":return X(["js","jsBlock","html"]);case"python":case"py":return X(["python"]);default:return X()}}(E),w=j.replace(/\n$/,"").split("\n"),P=0;P0&&(o=r.getRangeAt(0)),t.append(a),a.select(),a.selectionStart=0,a.selectionEnd=e.length;let c=!1;try{c=document.execCommand("copy")}catch{}a.remove(),o&&(r.removeAllRanges(),r.addRange(o)),n&&n.focus()}(C),u(!0),setTimeout((function(){return u(!1)}),2e3)};return r.a.createElement(F,Object(s.a)({},I,{key:String(b),theme:v,code:C,language:E}),(function(e){var t,a=e.className,n=e.style,o=e.tokens,c=e.getLineProps,l=e.getTokenProps;return r.a.createElement("div",{className:K.a.codeBlockContainer},g&&r.a.createElement("div",{style:n,className:K.a.codeBlockTitle},g),r.a.createElement("div",{className:Object(d.a)(K.a.codeBlockContent,E)},r.a.createElement("div",{tabIndex:0,className:Object(d.a)(a,K.a.codeBlock,"thin-scrollbar",(t={},t[K.a.codeBlockWithTitle]=g,t))},r.a.createElement("div",{className:K.a.codeBlockLines,style:n},o.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var a=c({line:e,key:t});return y.includes(t+1)&&(a.className=a.className+" docusaurus-highlight-code-line"),r.a.createElement("div",Object(s.a)({key:t},a),e.map((function(e,t){return r.a.createElement("span",Object(s.a)({key:t},l({token:e,key:t})))})))})))),r.a.createElement("button",{ref:f,type:"button","aria-label":Object(O.b)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),className:Object(d.a)(K.a.copyButton),onClick:B},i?r.a.createElement(O.a,{id:"theme.CodeBlock.copied",description:"The copied button label on code blocks"},"Copied"):r.a.createElement(O.a,{id:"theme.CodeBlock.copy",description:"The copy button label on code blocks"},"Copy"))))}))}a(86);var G=a(87),Q=a.n(G),Z=function(e){return function(t){var a,n=t.id,o=Object(u.a)(t,["id"]),c=Object(p.useThemeConfig)().navbar.hideOnScroll;return n?r.a.createElement(e,o,r.a.createElement("a",{"aria-hidden":"true",tabIndex:-1,className:Object(d.a)("anchor",(a={},a[Q.a.enhancedAnchor]=!c,a)),id:n}),o.children,r.a.createElement("a",{className:"hash-link",href:"#"+n,title:Object(O.b)({id:"theme.common.headingLinkTitle",message:"Direct link to heading",description:"Title for link to heading"})},"#")):r.a.createElement(e,o)}},ee={code:function(e){var t=e.children;return"string"==typeof t?t.includes("\n")?r.a.createElement(q,e):r.a.createElement("code",e):t},a:function(e){return r.a.createElement(y.a,e)},pre:function(e){var t=e.children;return r.a.createElement(q,Object(n.isValidElement)(t)?null==t?void 0:t.props:{children:t})},h1:Z("h1"),h2:Z("h2"),h3:Z("h3"),h4:Z("h4"),h5:Z("h5"),h6:Z("h6")},te=a(243),ae=a(23),ne=a(88),re=a.n(ne);function oe(e){var t,a,l,s,u,m=e.currentDocRoute,b=e.versionMetadata,h=e.children,f=Object(c.default)(),y=f.siteConfig,g=f.isClient,v=b.pluginId,k=b.permalinkToSidebar,E=b.docsSidebars,C=b.version,N=k[m.path],T=E[N],x=Object(n.useState)(!1),w=x[0],S=x[1],I=Object(n.useState)(!1),_=I[0],B=I[1],L=Object(n.useCallback)((function(){_&&B(!1),S(!w)}),[_]);return r.a.createElement(i.a,{key:g,wrapperClassName:"main-docs-wrapper",searchMetadatas:{version:C,tag:Object(p.docVersionSearchTag)(v,C)}},r.a.createElement("div",{className:re.a.docPage},T&&r.a.createElement("div",{className:Object(d.a)(re.a.docSidebarContainer,(t={},t[re.a.docSidebarContainerHidden]=w,t)),onTransitionEnd:function(e){e.currentTarget.classList.contains(re.a.docSidebarContainer)&&w&&B(!0)},role:"complementary"},r.a.createElement(P,{key:N,sidebar:T,path:m.path,sidebarCollapsible:null===(a=null===(l=y.themeConfig)||void 0===l?void 0:l.sidebarCollapsible)||void 0===a||a,onCollapse:L,isHidden:_}),_&&r.a.createElement("div",{className:re.a.collapsedDocSidebar,title:Object(O.b)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":Object(O.b)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:L,onClick:L},r.a.createElement(j,{className:re.a.expandSidebarButtonIcon}))),r.a.createElement("main",{className:Object(d.a)(re.a.docMainContainer,(s={},s[re.a.docMainContainerEnhanced]=w,s))},r.a.createElement("div",{className:Object(d.a)("container padding-vert--lg",re.a.docItemWrapper,(u={},u[re.a.docItemWrapperEnhanced]=w,u))},r.a.createElement(o.a,{components:ee},h)))))}t.default=function(e){var t=e.route.routes,a=e.versionMetadata,n=e.location,o=t.find((function(e){return Object(ae.matchPath)(n.pathname,e)}));return o?r.a.createElement(oe,{currentDocRoute:o,versionMetadata:a},Object(l.a)(t)):r.a.createElement(te.default,e)}},232:function(e,t,a){"use strict";a.d(t,"a",(function(){return d})),a.d(t,"b",(function(){return b}));var n=a(0),r=a.n(n);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function c(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=r.a.createContext({}),u=function(e){var t=r.a.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=u(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,b=d["".concat(c,".").concat(m)]||d[m]||p[m]||o;return a?r.a.createElement(b,l(l({ref:t},s),{},{components:a})):r.a.createElement(b,l({ref:t},s))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,c=new Array(o);c[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:n,c[1]=l;for(var s=2;se.trim())))if(/^-?\d+$/.test(n))a.push(parseInt(n,10));else if(t=n.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,n,r,o]=t;if(n&&o){n=parseInt(n),o=parseInt(o);const e=n0&&e[a-1]===t?e:e.concat(t)},R=function(e,t){var a=e.plain,n=Object.create(null),r=e.styles.reduce((function(e,a){var n=a.languages,r=a.style;return n&&!n.includes(t)||a.types.forEach((function(t){var a=B({},e[t],r);e[t]=a})),e}),n);return r.root=a,r.plain=B({},a,{backgroundColor:null}),r};function M(e,t){var a={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&-1===t.indexOf(n)&&(a[n]=e[n]);return a}var F=function(e){function t(){for(var t=this,a=[],n=arguments.length;n--;)a[n]=arguments[n];e.apply(this,a),_(this,"getThemeDict",(function(e){if(void 0!==t.themeDict&&e.theme===t.prevTheme&&e.language===t.prevLanguage)return t.themeDict;t.prevTheme=e.theme,t.prevLanguage=e.language;var a=e.theme?R(e.theme,e.language):void 0;return t.themeDict=a})),_(this,"getLineProps",(function(e){var a=e.key,n=e.className,r=e.style,o=B({},M(e,["key","className","style","line"]),{className:"token-line",style:void 0,key:void 0}),c=t.getThemeDict(t.props);return void 0!==c&&(o.style=c.plain),void 0!==r&&(o.style=void 0!==o.style?B({},o.style,r):r),void 0!==a&&(o.key=a),n&&(o.className+=" "+n),o})),_(this,"getStyleForToken",(function(e){var a=e.types,n=e.empty,r=a.length,o=t.getThemeDict(t.props);if(void 0!==o){if(1===r&&"plain"===a[0])return n?{display:"inline-block"}:void 0;if(1===r&&!n)return o[a[0]];var c=n?{display:"inline-block"}:{},l=a.map((function(e){return o[e]}));return Object.assign.apply(Object,[c].concat(l))}})),_(this,"getTokenProps",(function(e){var a=e.key,n=e.className,r=e.style,o=e.token,c=B({},M(e,["key","className","style","token"]),{className:"token "+o.types.join(" "),children:o.content,style:t.getStyleForToken(o),key:void 0});return void 0!==r&&(c.style=void 0!==c.style?B({},c.style,r):r),void 0!==a&&(c.key=a),n&&(c.className+=" "+n),c})),_(this,"tokenize",(function(e,t,a,n){var r={code:t,grammar:a,language:n,tokens:[]};e.hooks.run("before-tokenize",r);var o=r.tokens=e.tokenize(r.code,r.grammar,r.language);return e.hooks.run("after-tokenize",r),o}))}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.render=function(){var e=this.props,t=e.Prism,a=e.language,n=e.code,r=e.children,o=this.getThemeDict(this.props),c=t.languages[a];return r({tokens:function(e){for(var t=[[]],a=[e],n=[0],r=[e.length],o=0,c=0,l=[],i=[l];c>-1;){for(;(o=n[c]++)0?u:["plain"],s=d):(u=D(u,d.type),d.alias&&(u=D(u,d.alias)),s=d.content),"string"==typeof s){var p=s.split(L),m=p.length;l.push({types:u,content:p[0]});for(var b=1;b0}))}o&&Y.test(o)&&(g=o.match(Y)[1]);var E=a&&a.replace(/language-/,"");!E&&c.defaultLanguage&&(E=c.defaultLanguage);var C=j.replace(/\n$/,"");if(0===y.length&&void 0!==E){for(var N,T="",x=function(e){switch(e){case"js":case"javascript":case"ts":case"typescript":return X(["js","jsBlock"]);case"jsx":case"tsx":return X(["js","jsBlock","jsx"]);case"html":return X(["js","jsBlock","html"]);case"python":case"py":return X(["python"]);default:return X()}}(E),w=j.replace(/\n$/,"").split("\n"),P=0;P0&&(o=r.getRangeAt(0)),t.append(a),a.select(),a.selectionStart=0,a.selectionEnd=e.length;let c=!1;try{c=document.execCommand("copy")}catch{}a.remove(),o&&(r.removeAllRanges(),r.addRange(o)),n&&n.focus()}(C),u(!0),setTimeout((function(){return u(!1)}),2e3)};return r.a.createElement(F,Object(s.a)({},I,{key:String(b),theme:v,code:C,language:E}),(function(e){var t,a=e.className,n=e.style,o=e.tokens,c=e.getLineProps,l=e.getTokenProps;return r.a.createElement("div",{className:K.a.codeBlockContainer},g&&r.a.createElement("div",{style:n,className:K.a.codeBlockTitle},g),r.a.createElement("div",{className:Object(d.a)(K.a.codeBlockContent,E)},r.a.createElement("div",{tabIndex:0,className:Object(d.a)(a,K.a.codeBlock,"thin-scrollbar",(t={},t[K.a.codeBlockWithTitle]=g,t))},r.a.createElement("div",{className:K.a.codeBlockLines,style:n},o.map((function(e,t){1===e.length&&""===e[0].content&&(e[0].content="\n");var a=c({line:e,key:t});return y.includes(t+1)&&(a.className=a.className+" docusaurus-highlight-code-line"),r.a.createElement("div",Object(s.a)({key:t},a),e.map((function(e,t){return r.a.createElement("span",Object(s.a)({key:t},l({token:e,key:t})))})))})))),r.a.createElement("button",{ref:f,type:"button","aria-label":Object(O.b)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),className:Object(d.a)(K.a.copyButton),onClick:B},i?r.a.createElement(O.a,{id:"theme.CodeBlock.copied",description:"The copied button label on code blocks"},"Copied"):r.a.createElement(O.a,{id:"theme.CodeBlock.copy",description:"The copy button label on code blocks"},"Copy"))))}))}a(87);var G=a(88),Q=a.n(G),Z=function(e){return function(t){var a,n=t.id,o=Object(u.a)(t,["id"]),c=Object(p.useThemeConfig)().navbar.hideOnScroll;return n?r.a.createElement(e,o,r.a.createElement("a",{"aria-hidden":"true",tabIndex:-1,className:Object(d.a)("anchor",(a={},a[Q.a.enhancedAnchor]=!c,a)),id:n}),o.children,r.a.createElement("a",{className:"hash-link",href:"#"+n,title:Object(O.b)({id:"theme.common.headingLinkTitle",message:"Direct link to heading",description:"Title for link to heading"})},"#")):r.a.createElement(e,o)}},ee={code:function(e){var t=e.children;return"string"==typeof t?t.includes("\n")?r.a.createElement(q,e):r.a.createElement("code",e):t},a:function(e){return r.a.createElement(y.a,e)},pre:function(e){var t=e.children;return r.a.createElement(q,Object(n.isValidElement)(t)?null==t?void 0:t.props:{children:t})},h1:Z("h1"),h2:Z("h2"),h3:Z("h3"),h4:Z("h4"),h5:Z("h5"),h6:Z("h6")},te=a(239),ae=a(23),ne=a(89),re=a.n(ne);function oe(e){var t,a,l,s,u,m=e.currentDocRoute,b=e.versionMetadata,h=e.children,f=Object(c.default)(),y=f.siteConfig,g=f.isClient,v=b.pluginId,k=b.permalinkToSidebar,E=b.docsSidebars,C=b.version,N=k[m.path],T=E[N],x=Object(n.useState)(!1),w=x[0],S=x[1],I=Object(n.useState)(!1),_=I[0],B=I[1],L=Object(n.useCallback)((function(){_&&B(!1),S(!w)}),[_]);return r.a.createElement(i.a,{key:g,wrapperClassName:"main-docs-wrapper",searchMetadatas:{version:C,tag:Object(p.docVersionSearchTag)(v,C)}},r.a.createElement("div",{className:re.a.docPage},T&&r.a.createElement("div",{className:Object(d.a)(re.a.docSidebarContainer,(t={},t[re.a.docSidebarContainerHidden]=w,t)),onTransitionEnd:function(e){e.currentTarget.classList.contains(re.a.docSidebarContainer)&&w&&B(!0)},role:"complementary"},r.a.createElement(P,{key:N,sidebar:T,path:m.path,sidebarCollapsible:null===(a=null===(l=y.themeConfig)||void 0===l?void 0:l.sidebarCollapsible)||void 0===a||a,onCollapse:L,isHidden:_}),_&&r.a.createElement("div",{className:re.a.collapsedDocSidebar,title:Object(O.b)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":Object(O.b)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:L,onClick:L},r.a.createElement(j,{className:re.a.expandSidebarButtonIcon}))),r.a.createElement("main",{className:Object(d.a)(re.a.docMainContainer,(s={},s[re.a.docMainContainerEnhanced]=w,s))},r.a.createElement("div",{className:Object(d.a)("container padding-vert--lg",re.a.docItemWrapper,(u={},u[re.a.docItemWrapperEnhanced]=w,u))},r.a.createElement(o.a,{components:ee},h)))))}t.default=function(e){var t=e.route.routes,a=e.versionMetadata,n=e.location,o=t.find((function(e){return Object(ae.matchPath)(n.pathname,e)}));return o?r.a.createElement(oe,{currentDocRoute:o,versionMetadata:a},Object(l.a)(t)):r.a.createElement(te.default,e)}},228:function(e,t,a){"use strict";a.d(t,"a",(function(){return d})),a.d(t,"b",(function(){return b}));var n=a(0),r=a.n(n);function o(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function c(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function l(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=r.a.createContext({}),u=function(e){var t=r.a.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},d=function(e){var t=u(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,o=e.originalType,c=e.parentName,s=i(e,["components","mdxType","originalType","parentName"]),d=u(a),m=n,b=d["".concat(c,".").concat(m)]||d[m]||p[m]||o;return a?r.a.createElement(b,l(l({ref:t},s),{},{components:a})):r.a.createElement(b,l({ref:t},s))}));function b(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=a.length,c=new Array(o);c[0]=m;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:n,c[1]=l;for(var s=2;se.trim())))if(/^-?\d+$/.test(n))a.push(parseInt(n,10));else if(t=n.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,n,r,o]=t;if(n&&o){n=parseInt(n),o=parseInt(o);const e=n=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),d=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=d(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),b=o,m=u["".concat(i,".").concat(b)]||u[b]||p[b]||a;return n?r.a.createElement(m,l(l({ref:t},c),{},{components:n})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),d=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=d(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),b=o,m=u["".concat(i,".").concat(b)]||u[b]||p[b]||a;return n?r.a.createElement(m,l(l({ref:t},c),{},{components:n})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=a}));if(t){if(t.getBoundingClientRect().top>=a){var n=e[e.indexOf(t)-1];return null!=n?n:t}return t}return e[e.length-1]}();if(n)for(var l=0,s=!1,o=document.getElementsByClassName(e);l1;return l.a.createElement(l.a.Fragment,null,l.a.createElement(b.a,{title:v,description:u,keywords:o,image:i}),l.a.createElement("div",{className:"row"},l.a.createElement("div",{className:Object(L.a)("col",(t={},t[D.a.docItemCol]=!m,t))},l.a.createElement(p,null),l.a.createElement("div",{className:D.a.docItemContainer},l.a.createElement("article",null,T&&l.a.createElement("div",null,l.a.createElement("span",{className:"badge badge--secondary"},"Version: ",w.label)),!d&&l.a.createElement("header",null,l.a.createElement("h1",{className:D.a.docTitle},v)),l.a.createElement("div",{className:"markdown"},l.a.createElement(a,null))),(g||E||f)&&l.a.createElement("div",{className:"margin-vert--xl"},l.a.createElement("div",{className:"row"},l.a.createElement("div",{className:"col"},g&&l.a.createElement(x,{editUrl:g})),(E||f)&&l.a.createElement(N,{lastUpdatedAt:E,formattedLastUpdatedAt:h,lastUpdatedBy:f}))),l.a.createElement("div",{className:"margin-vert--lg"},l.a.createElement(s,{metadata:n})))),!m&&a.toc&&l.a.createElement("div",{className:"col col--3"},l.a.createElement(k,{toc:a.toc}))))}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{227:function(e,t,a){"use strict";a.r(t);var n=a(0),l=a.n(n),r=a(233),i=a(231);var s=function(e){var t=e.metadata;return l.a.createElement("nav",{className:"pagination-nav","aria-label":Object(i.b)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages navigation",description:"The ARIA label for the docs pagination"})},l.a.createElement("div",{className:"pagination-nav__item"},t.previous&&l.a.createElement(r.a,{className:"pagination-nav__link",to:t.previous.permalink},l.a.createElement("div",{className:"pagination-nav__sublabel"},l.a.createElement(i.a,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc"},"Previous")),l.a.createElement("div",{className:"pagination-nav__label"},"\xab ",t.previous.title))),l.a.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},t.next&&l.a.createElement(r.a,{className:"pagination-nav__link",to:t.next.permalink},l.a.createElement("div",{className:"pagination-nav__sublabel"},l.a.createElement(i.a,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc"},"Next")),l.a.createElement("div",{className:"pagination-nav__label"},t.next.title," \xbb"))))},o=a(16),c=a(232),d=a(229);function m(e){var t=e.siteTitle,a=e.versionLabel;return l.a.createElement(i.a,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:l.a.createElement("strong",null,a)}},"This is unreleased documentation for {siteTitle} {versionLabel} version.")}function u(e){var t=e.siteTitle,a=e.versionLabel;return l.a.createElement(i.a,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:l.a.createElement("strong",null,a)}},"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained.")}function v(e){var t=e.versionLabel,a=e.to,n=e.onClick;return l.a.createElement(i.a,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label userd to tell the user that he's browsing an unmaintained doc version",values:{versionLabel:t,latestVersionLink:l.a.createElement("strong",null,l.a.createElement(r.a,{to:a,onClick:n},l.a.createElement(i.a,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label"},"latest version")))}},"For up-to-date documentation, see the {latestVersionLink} ({versionLabel}).")}var p=function(){var e=Object(o.default)().siteConfig.title,t=Object(c.useActivePlugin)({failfast:!0}).pluginId,a=Object(d.useDocsPreferredVersion)(t).savePreferredVersionName,n=Object(c.useActiveVersion)(t),r=Object(c.useDocVersionSuggestions)(t),i=r.latestDocSuggestion,s=r.latestVersionSuggestion;if(!s)return l.a.createElement(l.a.Fragment,null);var p,b=null!=i?i:(p=s).docs.find((function(e){return e.id===p.mainDocId}));return l.a.createElement("div",{className:"alert alert--warning margin-bottom--md",role:"alert"},l.a.createElement("div",null,"current"===n.name?l.a.createElement(m,{siteTitle:e,versionLabel:n.label}):l.a.createElement(u,{siteTitle:e,versionLabel:n.label})),l.a.createElement("div",{className:"margin-top--md"},l.a.createElement(v,{versionLabel:s.label,to:b.path,onClick:function(){return a(s.name)}})))},b=a(253),g=a(81),E=a.n(g);function h(e){var t=e.lastUpdatedAt,a=e.formattedLastUpdatedAt;return l.a.createElement(i.a,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:l.a.createElement("time",{dateTime:new Date(1e3*t).toISOString(),className:E.a.lastUpdatedDate},a)}}," on {date}")}function f(e){var t=e.lastUpdatedBy;return l.a.createElement(i.a,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:l.a.createElement("strong",null,t)}}," by {user}")}function N(e){var t=e.lastUpdatedAt,a=e.formattedLastUpdatedAt,n=e.lastUpdatedBy;return l.a.createElement("div",{className:"col text--right"},l.a.createElement("em",null,l.a.createElement("small",null,l.a.createElement(i.a,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&a?l.a.createElement(h,{lastUpdatedAt:t,formattedLastUpdatedAt:a}):"",byUser:n?l.a.createElement(f,{lastUpdatedBy:n}):""}},"Last updated{atDate}{byUser}"),!1)))}var L=a(230);var _=function(e,t,a){var l=Object(n.useState)(void 0),r=l[0],i=l[1];Object(n.useEffect)((function(){function n(){var n=function(){var e=Array.from(document.getElementsByClassName("anchor")),t=e.find((function(e){return e.getBoundingClientRect().top>=a}));if(t){if(t.getBoundingClientRect().top>=a){var n=e[e.indexOf(t)-1];return null!=n?n:t}return t}return e[e.length-1]}();if(n)for(var l=0,s=!1,o=document.getElementsByClassName(e);l1;return l.a.createElement(l.a.Fragment,null,l.a.createElement(b.a,{title:v,description:u,keywords:o,image:i}),l.a.createElement("div",{className:"row"},l.a.createElement("div",{className:Object(L.a)("col",(t={},t[D.a.docItemCol]=!m,t))},l.a.createElement(p,null),l.a.createElement("div",{className:D.a.docItemContainer},l.a.createElement("article",null,T&&l.a.createElement("div",null,l.a.createElement("span",{className:"badge badge--secondary"},"Version: ",w.label)),!d&&l.a.createElement("header",null,l.a.createElement("h1",{className:D.a.docTitle},v)),l.a.createElement("div",{className:"markdown"},l.a.createElement(a,null))),(g||E||f)&&l.a.createElement("div",{className:"margin-vert--xl"},l.a.createElement("div",{className:"row"},l.a.createElement("div",{className:"col"},g&&l.a.createElement(x,{editUrl:g})),(E||f)&&l.a.createElement(N,{lastUpdatedAt:E,formattedLastUpdatedAt:h,lastUpdatedBy:f}))),l.a.createElement("div",{className:"margin-vert--lg"},l.a.createElement(s,{metadata:n})))),!m&&a.toc&&l.a.createElement("div",{className:"col col--3"},l.a.createElement(k,{toc:a.toc}))))}}}]); \ No newline at end of file diff --git a/assets/js/1bbe794e.484f5992.js b/assets/js/1bbe794e.484f5992.js deleted file mode 100644 index 2b3ce6a0..00000000 --- a/assets/js/1bbe794e.484f5992.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{232:function(e,t,o){"use strict";o.d(t,"a",(function(){return d})),o.d(t,"b",(function(){return f}));var n=o(0),r=o.n(n);function i(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function a(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function l(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(o),b=n,f=d["".concat(a,".").concat(b)]||d[b]||p[b]||i;return o?r.a.createElement(f,l(l({ref:t},c),{},{components:o})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),s=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},d=function(e){var t=s(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},f=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,l=p(e,["components","mdxType","originalType","parentName"]),d=s(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||o;return n?a.a.createElement(m,c(c({ref:t},l),{},{components:n})):a.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=f;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),s=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},d=function(e){var t=s(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},f=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,i=e.parentName,l=p(e,["components","mdxType","originalType","parentName"]),d=s(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||o;return n?a.a.createElement(m,c(c({ref:t},l),{},{components:n})):a.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=f;var c={};for(var p in t)hasOwnProperty.call(t,p)&&(c[p]=t[p]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(o),d=n,f=p["".concat(l,".").concat(d)]||p[d]||b[d]||a;return o?r.a.createElement(f,i(i({ref:t},c),{},{components:o})):r.a.createElement(f,i({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,l=new Array(a);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:n,l[1]=i;for(var c=2;c=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(o),d=n,f=p["".concat(l,".").concat(d)]||p[d]||b[d]||a;return o?r.a.createElement(f,i(i({ref:t},c),{},{components:o})):r.a.createElement(f,i({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,l=new Array(a);l[0]=d;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:n,l[1]=i;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),d=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,c(c({ref:t},l),{},{components:n})):o.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),d=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},u=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,m=p["".concat(i,".").concat(u)]||p[u]||b[u]||a;return n?r.a.createElement(m,c(c({ref:t},s),{},{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,i[1]=c;for(var s=2;s ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Comment out the ",Object(a.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(a.b)("inlineCode",{parentName:"p"}," ")," ",Object(a.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(a.b)("inlineCode",{parentName:"p"}," ")))),Object(a.b)("h2",{id:"handy-docker-commands"},"Handy Docker Commands"),Object(a.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(a.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(a.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(a.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2.89c52fba.js b/assets/js/2.f7e8da3d.js similarity index 90% rename from assets/js/2.89c52fba.js rename to assets/js/2.f7e8da3d.js index d9912028..c3ec9197 100644 --- a/assets/js/2.89c52fba.js +++ b/assets/js/2.f7e8da3d.js @@ -1,2 +1,2 @@ -/*! For license information please see 2.89c52fba.js.LICENSE.txt */ -(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{239:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(234),i=a(237),s=a(238),u=a(23),d=a(233);function m(e){var t=e.activeBasePath,a=e.activeBaseRegex,c=e.to,l=e.href,u=e.label,d=e.activeClassName,m=void 0===d?"navbar__link--active":d,f=e.prependBaseUrlToHref,h=Object(r.a)(e,["activeBasePath","activeBaseRegex","to","href","label","activeClassName","prependBaseUrlToHref"]),v=Object(s.a)(c),b=Object(s.a)(t),p=Object(s.a)(l,{forcePrependBaseUrl:!0});return o.a.createElement(i.a,Object(n.a)({},l?{href:f?p:l}:Object.assign({isNavLink:!0,activeClassName:m,to:v},t||a?{isActive:function(e,t){return a?new RegExp(a).test(t.pathname):t.pathname.startsWith(b)}}:null),h),u)}function f(e){var t,a=e.items,i=e.position,s=e.className,u=Object(r.a)(e,["items","position","className"]),d=Object(c.useRef)(null),f=Object(c.useRef)(null),h=Object(c.useState)(!1),v=h[0],b=h[1];Object(c.useEffect)((function(){var e=function(e){d.current&&!d.current.contains(e.target)&&b(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),function(){document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[d]);var p=function(e,t){return void 0===t&&(t=!1),Object(l.a)({"navbar__item navbar__link":!t,dropdown__link:t},e)};return a?o.a.createElement("div",{ref:d,className:Object(l.a)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--left":"left"===i,"dropdown--right":"right"===i,"dropdown--show":v})},o.a.createElement(m,Object(n.a)({className:p(s)},u,{onClick:u.to?void 0:function(e){return e.preventDefault()},onKeyDown:function(e){"Enter"===e.key&&(e.preventDefault(),b(!v))}}),null!==(t=u.children)&&void 0!==t?t:u.label),o.a.createElement("ul",{ref:f,className:"dropdown__menu"},a.map((function(e,t){var c=e.className,l=Object(r.a)(e,["className"]);return o.a.createElement("li",{key:t},o.a.createElement(m,Object(n.a)({onKeyDown:function(e){if(t===a.length-1&&"Tab"===e.key){e.preventDefault(),b(!1);var n=d.current.nextElementSibling;n&&n.focus()}},activeClassName:"dropdown__link--active",className:p(c,!0)},l)))})))):o.a.createElement(m,Object(n.a)({className:p(s)},u))}function h(e){var t,a,i,s=e.items,f=e.className,h=(e.position,Object(r.a)(e,["items","className","position"])),v=Object(c.useRef)(null),b=Object(u.useLocation)().pathname,p=Object(c.useState)((function(){var e;return null===(e=!(null!=s&&s.some((function(e){return Object(d.isSamePath)(e.to,b)}))))||void 0===e||e})),g=p[0],k=p[1],E=function(e,t){return void 0===t&&(t=!1),Object(l.a)("menu__link",{"menu__link--sublist":t},e)};if(!s)return o.a.createElement("li",{className:"menu__list-item"},o.a.createElement(m,Object(n.a)({className:E(f)},h)));var O=null!==(t=v.current)&&void 0!==t&&t.scrollHeight?(null===(a=v.current)||void 0===a?void 0:a.scrollHeight)+"px":void 0;return o.a.createElement("li",{className:Object(l.a)("menu__list-item",{"menu__list-item--collapsed":g})},o.a.createElement(m,Object(n.a)({role:"button",className:E(f,!0)},h,{onClick:function(e){e.preventDefault(),k((function(e){return!e}))}}),null!==(i=h.children)&&void 0!==i?i:h.label),o.a.createElement("ul",{className:"menu__list",ref:v,style:{height:g?void 0:O}},s.map((function(e,t){var a=e.className,c=Object(r.a)(e,["className"]);return o.a.createElement("li",{className:"menu__list-item",key:t},o.a.createElement(m,Object(n.a)({activeClassName:"menu__link--active",className:E(a)},c,{onClick:h.onClick})))}))))}t.a=function(e){var t=e.mobile,a=void 0!==t&&t,n=Object(r.a)(e,["mobile"]),c=a?h:f;return o.a.createElement(c,n)}},240:function(e,t,a){"use strict";var n=a(0),r=a.n(n),c=a(234),o=a(235),l=a(23),i=a(56),s=a.n(i);function u(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}var d=function(){var e=Object(n.useRef)(null),t=Object(l.useLocation)();return Object(n.useEffect)((function(){t.hash||u(e.current)}),[t.pathname]),r.a.createElement("div",{ref:e},r.a.createElement("a",{href:"#main",className:s.a.skipToContent,onClick:function(e){e.preventDefault();var t=document.querySelector("main:first-of-type")||document.querySelector(".main-wrapper");t&&u(t)}},r.a.createElement(o.a,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))},m=a(233),f=a(247),h=a(57),v=a.n(h);var b=function(){var e,t=Object(f.a)(),a=t.isAnnouncementBarClosed,n=t.closeAnnouncementBar,l=Object(m.useThemeConfig)().announcementBar;if(!l)return null;var i=l.content,s=l.backgroundColor,u=l.textColor,d=l.isCloseable;return!i||d&&a?null:r.a.createElement("div",{className:v.a.announcementBar,style:{backgroundColor:s,color:u},role:"banner"},r.a.createElement("div",{className:Object(c.a)(v.a.announcementBarContent,(e={},e[v.a.announcementBarCloseable]=d,e)),dangerouslySetInnerHTML:{__html:i}}),d?r.a.createElement("button",{type:"button",className:v.a.announcementBarClose,onClick:n,"aria-label":Object(o.b)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.a.createElement("span",{"aria-hidden":"true"},"\xd7")):null)},p=a(3),g=function(){return null},k=a(269),E=a.n(k),O=a(16),j=a(58),y=a.n(j),_=function(e){var t=e.icon,a=e.style;return r.a.createElement("span",{className:Object(c.a)(y.a.toggle,y.a.dark),style:a},t)},C=function(e){var t=e.icon,a=e.style;return r.a.createElement("span",{className:Object(c.a)(y.a.toggle,y.a.light),style:a},t)},w=function(e){var t=Object(m.useThemeConfig)().colorMode.switchConfig,a=t.darkIcon,n=t.darkIconStyle,c=t.lightIcon,o=t.lightIconStyle,l=Object(O.default)().isClient;return r.a.createElement(E.a,Object(p.a)({disabled:!l,icons:{checked:r.a.createElement(_,{icon:a,style:n}),unchecked:r.a.createElement(C,{icon:c,style:o})}},e))},N=a(241),T=a(251),S=function(e){var t=Object(l.useLocation)(),a=Object(n.useState)(e),r=a[0],c=a[1],o=Object(n.useRef)(!1),i=Object(n.useState)(0),s=i[0],u=i[1],d=Object(n.useState)(0),m=d[0],f=d[1],h=Object(n.useCallback)((function(e){null!==e&&f(e.getBoundingClientRect().height)}),[]);return Object(T.a)((function(t){var a=t.scrollY;if(e)if(a=s?c(!1):a+r0&&r.a.createElement("div",{className:"row footer__links"},o.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(Z,e))}))):null)}))),(i||a)&&r.a.createElement("div",{className:"footer__bottom text--center"},i&&(i.src||i.srcDark)&&r.a.createElement("div",{className:"margin-bottom--sm"},i.href?r.a.createElement(Y.a,{href:i.href,className:q.a.footerLogoLink},r.a.createElement($,{alt:i.alt,sources:s})):r.a.createElement($,{alt:i.alt,sources:s})),a?r.a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:a}}):null))):null},te=a(8),ae="light",ne="dark",re=function(e){return e===ne?ne:ae},ce=function(e){try{localStorage.setItem("theme",re(e))}catch(t){console.error(t)}},oe=function(){var e=Object(m.useThemeConfig)().colorMode,t=e.defaultMode,a=e.disableSwitch,r=e.respectPrefersColorScheme,c=Object(n.useState)(function(e){return te.a.canUseDOM?re(document.documentElement.getAttribute("data-theme")):re(e)}(t)),o=c[0],l=c[1],i=Object(n.useCallback)((function(){l(ae),ce(ae)}),[]),s=Object(n.useCallback)((function(){l(ne),ce(ne)}),[]);return Object(n.useEffect)((function(){document.documentElement.setAttribute("data-theme",re(o))}),[o]),Object(n.useEffect)((function(){if(!a)try{var e=localStorage.getItem("theme");null!==e&&l(re(e))}catch(t){console.error(t)}}),[l]),Object(n.useEffect)((function(){a&&!r||window.matchMedia("(prefers-color-scheme: dark)").addListener((function(e){var t=e.matches;l(t?ne:ae)}))}),[]),{isDarkTheme:o===ne,setLightTheme:i,setDarkTheme:s}},le=a(250);var ie=function(e){var t=oe(),a=t.isDarkTheme,n=t.setLightTheme,c=t.setDarkTheme;return r.a.createElement(le.a.Provider,{value:{isDarkTheme:a,setLightTheme:n,setDarkTheme:c}},e.children)},se="docusaurus.tab.",ue=function(){var e=Object(n.useState)({}),t=e[0],a=e[1],r=Object(n.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(a){console.error(a)}}),[]);return Object(n.useEffect)((function(){try{for(var e={},t=0;t996?c.desktop:c.mobile}var a=Object(n.useState)(t),o=a[0],l=a[1];return Object(n.useEffect)((function(){if(e)return window.addEventListener("resize",a),function(){return window.removeEventListener("resize",a)};function a(){l(t())}}),[]),o}},254:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(237),i=a(255),s=a(238),u=a(16),d=a(233);t.a=function(e){var t=Object(u.default)().isClient,a=Object(d.useThemeConfig)().navbar,c=a.title,m=a.logo,f=void 0===m?{src:""}:m,h=e.imageClassName,v=e.titleClassName,b=Object(r.a)(e,["imageClassName","titleClassName"]),p=Object(s.a)(f.href||"/"),g={light:Object(s.a)(f.src),dark:Object(s.a)(f.srcDark||f.src)};return o.a.createElement(l.a,Object(n.a)({to:p},b,f.target&&{target:f.target}),f.src&&o.a.createElement(i.a,{key:t,className:h,sources:g,alt:f.alt||c||"Logo"}),null!=c&&o.a.createElement("strong",{className:v},c))}},255:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(234),i=a(16),s=a(241),u=a(60),d=a.n(u);t.a=function(e){var t=Object(i.default)().isClient,a=Object(s.a)().isDarkTheme,c=e.sources,u=e.className,m=e.alt,f=void 0===m?"":m,h=Object(r.a)(e,["sources","className","alt"]),v=t?a?["dark"]:["light"]:["light","dark"];return o.a.createElement(o.a.Fragment,null,v.map((function(e){return o.a.createElement("img",Object(n.a)({key:e,src:c[e],alt:f,className:Object(l.a)(d.a.themedImage,d.a["themedImage--"+e],u)},h))})))}},256:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c);t.a=function(e){var t=e.width,a=void 0===t?30:t,c=e.height,l=void 0===c?30:c,i=e.className,s=Object(r.a)(e,["width","height","className"]);return o.a.createElement("svg",Object(n.a)({"aria-label":"Menu",className:i,width:a,height:l,viewBox:"0 0 30 30",role:"img",focusable:"false"},s),o.a.createElement("title",null,"Menu"),o.a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}},269:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=ta?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,n)&&(a[n]=e[n]);return a}(t,["className","icons"])),c=(0,l.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},a);return o.default.createElement("div",{className:c,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},o.default.createElement("div",{className:"react-toggle-track"},o.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),o.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),o.default.createElement("div",{className:"react-toggle-thumb"}),o.default.createElement("input",n({},r,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(c.PureComponent);t.default=f,f.displayName="Toggle",f.defaultProps={icons:{checked:o.default.createElement(s.default,null),unchecked:o.default.createElement(u.default,null)}},f.propTypes={checked:i.default.bool,disabled:i.default.bool,defaultChecked:i.default.bool,onChange:i.default.func,onFocus:i.default.func,onBlur:i.default.func,className:i.default.string,name:i.default.string,value:i.default.string,id:i.default.string,"aria-labelledby":i.default.string,"aria-label":i.default.string,icons:i.default.oneOfType([i.default.bool,i.default.shape({checked:i.default.node,unchecked:i.default.node})])}},270:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,r=a(0),c=(n=r)&&n.__esModule?n:{default:n};t.default=function(){return c.default.createElement("svg",{width:"14",height:"11",viewBox:"0 0 14 11"},c.default.createElement("path",{d:"M11.264 0L5.26 6.004 2.103 2.847 0 4.95l5.26 5.26 8.108-8.107L11.264 0",fill:"#fff",fillRule:"evenodd"}))}},271:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,r=a(0),c=(n=r)&&n.__esModule?n:{default:n};t.default=function(){return c.default.createElement("svg",{width:"10",height:"10",viewBox:"0 0 10 10"},c.default.createElement("path",{d:"M9.9 2.12L7.78 0 4.95 2.828 2.12 0 0 2.12l2.83 2.83L0 7.776 2.123 9.9 4.95 7.07 7.78 9.9 9.9 7.776 7.072 4.95 9.9 2.12",fill:"#fff",fillRule:"evenodd"}))}},272:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.pointerCoord=function(e){if(e){var t=e.changedTouches;if(t&&t.length>0){var a=t[0];return{x:a.clientX,y:a.clientY}}var n=e.pageX;if(void 0!==n)return{x:n,y:e.pageY}}return{x:0,y:0}}},273:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return u}));var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(239),i=a(236),s=a(233);function u(e){var t,a=e.label,c=e.to,u=e.docsPluginId,d=Object(r.a)(e,["label","to","docsPluginId"]),m=Object(i.useActiveVersion)(u),f=Object(s.useDocsPreferredVersion)(u).preferredVersion,h=Object(i.useLatestVersion)(u),v=null!==(t=null!=m?m:f)&&void 0!==t?t:h,b=null!=a?a:v.label,p=null!=c?c:function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))}(v).path;return o.a.createElement(l.a,Object(n.a)({},d,{label:b,to:p}))}},274:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return d}));var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(239),i=a(236),s=a(233),u=function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))};function d(e){var t,a,c=e.mobile,d=e.docsPluginId,m=e.dropdownActiveClassDisabled,f=e.dropdownItemsBefore,h=e.dropdownItemsAfter,v=Object(r.a)(e,["mobile","docsPluginId","dropdownActiveClassDisabled","dropdownItemsBefore","dropdownItemsAfter"]),b=Object(i.useActiveDocContext)(d),p=Object(i.useVersions)(d),g=Object(i.useLatestVersion)(d),k=Object(s.useDocsPreferredVersion)(d),E=k.preferredVersion,O=k.savePreferredVersionName;var j=null!==(t=null!==(a=b.activeVersion)&&void 0!==a?a:E)&&void 0!==t?t:g,y=c?"Versions":j.label,_=c?void 0:u(j).path;return o.a.createElement(l.a,Object(n.a)({},v,{mobile:c,label:y,to:_,items:function(){var e=p.map((function(e){var t=(null==b?void 0:b.alternateDocVersions[e.name])||u(e);return{isNavLink:!0,label:e.label,to:t.path,isActive:function(){return e===(null==b?void 0:b.activeVersion)},onClick:function(){O(e.name)}}})),t=[].concat(f,e,h);if(!(t.length<=1))return t}(),isActive:m?function(){return!1}:void 0}))}},275:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return d}));var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(239),i=a(236),s=a(234),u=a(233);function d(e){var t,a,c=e.docId,d=e.activeSidebarClassName,m=e.label,f=e.docsPluginId,h=Object(r.a)(e,["docId","activeSidebarClassName","label","docsPluginId"]),v=Object(i.useActiveDocContext)(f),b=v.activeVersion,p=v.activeDoc,g=Object(u.useDocsPreferredVersion)(f).preferredVersion,k=Object(i.useLatestVersion)(f),E=null!==(t=null!=b?b:g)&&void 0!==t?t:k,O=E.docs.find((function(e){return e.id===c}));if(!O)throw new Error("DocNavbarItem: couldn't find any doc with id="+c+" in version "+E.name+".\nAvailable docIds=\n- "+E.docs.join("\n- "));return o.a.createElement(l.a,Object(n.a)({exact:!0},h,{className:Object(s.a)(h.className,(a={},a[d]=p&&p.sidebar===O.sidebar,a)),label:null!=m?m:O.id,to:O.path}))}}}]); \ No newline at end of file +/*! For license information please see 2.f7e8da3d.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{235:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(230),i=a(233),s=a(234),u=a(23),d=a(229);function m(e){var t=e.activeBasePath,a=e.activeBaseRegex,c=e.to,l=e.href,u=e.label,d=e.activeClassName,m=void 0===d?"navbar__link--active":d,f=e.prependBaseUrlToHref,h=Object(r.a)(e,["activeBasePath","activeBaseRegex","to","href","label","activeClassName","prependBaseUrlToHref"]),v=Object(s.a)(c),b=Object(s.a)(t),p=Object(s.a)(l,{forcePrependBaseUrl:!0});return o.a.createElement(i.a,Object(n.a)({},l?{href:f?p:l}:Object.assign({isNavLink:!0,activeClassName:m,to:v},t||a?{isActive:function(e,t){return a?new RegExp(a).test(t.pathname):t.pathname.startsWith(b)}}:null),h),u)}function f(e){var t,a=e.items,i=e.position,s=e.className,u=Object(r.a)(e,["items","position","className"]),d=Object(c.useRef)(null),f=Object(c.useRef)(null),h=Object(c.useState)(!1),v=h[0],b=h[1];Object(c.useEffect)((function(){var e=function(e){d.current&&!d.current.contains(e.target)&&b(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),function(){document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[d]);var p=function(e,t){return void 0===t&&(t=!1),Object(l.a)({"navbar__item navbar__link":!t,dropdown__link:t},e)};return a?o.a.createElement("div",{ref:d,className:Object(l.a)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--left":"left"===i,"dropdown--right":"right"===i,"dropdown--show":v})},o.a.createElement(m,Object(n.a)({className:p(s)},u,{onClick:u.to?void 0:function(e){return e.preventDefault()},onKeyDown:function(e){"Enter"===e.key&&(e.preventDefault(),b(!v))}}),null!==(t=u.children)&&void 0!==t?t:u.label),o.a.createElement("ul",{ref:f,className:"dropdown__menu"},a.map((function(e,t){var c=e.className,l=Object(r.a)(e,["className"]);return o.a.createElement("li",{key:t},o.a.createElement(m,Object(n.a)({onKeyDown:function(e){if(t===a.length-1&&"Tab"===e.key){e.preventDefault(),b(!1);var n=d.current.nextElementSibling;n&&n.focus()}},activeClassName:"dropdown__link--active",className:p(c,!0)},l)))})))):o.a.createElement(m,Object(n.a)({className:p(s)},u))}function h(e){var t,a,i,s=e.items,f=e.className,h=(e.position,Object(r.a)(e,["items","className","position"])),v=Object(c.useRef)(null),b=Object(u.useLocation)().pathname,p=Object(c.useState)((function(){var e;return null===(e=!(null!=s&&s.some((function(e){return Object(d.isSamePath)(e.to,b)}))))||void 0===e||e})),g=p[0],k=p[1],E=function(e,t){return void 0===t&&(t=!1),Object(l.a)("menu__link",{"menu__link--sublist":t},e)};if(!s)return o.a.createElement("li",{className:"menu__list-item"},o.a.createElement(m,Object(n.a)({className:E(f)},h)));var O=null!==(t=v.current)&&void 0!==t&&t.scrollHeight?(null===(a=v.current)||void 0===a?void 0:a.scrollHeight)+"px":void 0;return o.a.createElement("li",{className:Object(l.a)("menu__list-item",{"menu__list-item--collapsed":g})},o.a.createElement(m,Object(n.a)({role:"button",className:E(f,!0)},h,{onClick:function(e){e.preventDefault(),k((function(e){return!e}))}}),null!==(i=h.children)&&void 0!==i?i:h.label),o.a.createElement("ul",{className:"menu__list",ref:v,style:{height:g?void 0:O}},s.map((function(e,t){var a=e.className,c=Object(r.a)(e,["className"]);return o.a.createElement("li",{className:"menu__list-item",key:t},o.a.createElement(m,Object(n.a)({activeClassName:"menu__link--active",className:E(a)},c,{onClick:h.onClick})))}))))}t.a=function(e){var t=e.mobile,a=void 0!==t&&t,n=Object(r.a)(e,["mobile"]),c=a?h:f;return o.a.createElement(c,n)}},236:function(e,t,a){"use strict";var n=a(0),r=a.n(n),c=a(230),o=a(231),l=a(23),i=a(56),s=a.n(i);function u(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}var d=function(){var e=Object(n.useRef)(null),t=Object(l.useLocation)();return Object(n.useEffect)((function(){t.hash||u(e.current)}),[t.pathname]),r.a.createElement("div",{ref:e},r.a.createElement("a",{href:"#main",className:s.a.skipToContent,onClick:function(e){e.preventDefault();var t=document.querySelector("main:first-of-type")||document.querySelector(".main-wrapper");t&&u(t)}},r.a.createElement(o.a,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))},m=a(229),f=a(243),h=a(57),v=a.n(h);var b=function(){var e,t=Object(f.a)(),a=t.isAnnouncementBarClosed,n=t.closeAnnouncementBar,l=Object(m.useThemeConfig)().announcementBar;if(!l)return null;var i=l.content,s=l.backgroundColor,u=l.textColor,d=l.isCloseable;return!i||d&&a?null:r.a.createElement("div",{className:v.a.announcementBar,style:{backgroundColor:s,color:u},role:"banner"},r.a.createElement("div",{className:Object(c.a)(v.a.announcementBarContent,(e={},e[v.a.announcementBarCloseable]=d,e)),dangerouslySetInnerHTML:{__html:i}}),d?r.a.createElement("button",{type:"button",className:v.a.announcementBarClose,onClick:n,"aria-label":Object(o.b)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.a.createElement("span",{"aria-hidden":"true"},"\xd7")):null)},p=a(3),g=function(){return null},k=a(265),E=a.n(k),O=a(16),j=a(58),y=a.n(j),_=function(e){var t=e.icon,a=e.style;return r.a.createElement("span",{className:Object(c.a)(y.a.toggle,y.a.dark),style:a},t)},C=function(e){var t=e.icon,a=e.style;return r.a.createElement("span",{className:Object(c.a)(y.a.toggle,y.a.light),style:a},t)},w=function(e){var t=Object(m.useThemeConfig)().colorMode.switchConfig,a=t.darkIcon,n=t.darkIconStyle,c=t.lightIcon,o=t.lightIconStyle,l=Object(O.default)().isClient;return r.a.createElement(E.a,Object(p.a)({disabled:!l,icons:{checked:r.a.createElement(_,{icon:a,style:n}),unchecked:r.a.createElement(C,{icon:c,style:o})}},e))},N=a(237),T=a(247),S=function(e){var t=Object(l.useLocation)(),a=Object(n.useState)(e),r=a[0],c=a[1],o=Object(n.useRef)(!1),i=Object(n.useState)(0),s=i[0],u=i[1],d=Object(n.useState)(0),m=d[0],f=d[1],h=Object(n.useCallback)((function(e){null!==e&&f(e.getBoundingClientRect().height)}),[]);return Object(T.a)((function(t){var a=t.scrollY;if(e)if(a=s?c(!1):a+r0&&r.a.createElement("div",{className:"row footer__links"},o.map((function(e,t){return r.a.createElement("div",{key:t,className:"col footer__col"},null!=e.title?r.a.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?r.a.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?r.a.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):r.a.createElement("li",{key:e.href||e.to,className:"footer__item"},r.a.createElement(Z,e))}))):null)}))),(i||a)&&r.a.createElement("div",{className:"footer__bottom text--center"},i&&(i.src||i.srcDark)&&r.a.createElement("div",{className:"margin-bottom--sm"},i.href?r.a.createElement(Y.a,{href:i.href,className:q.a.footerLogoLink},r.a.createElement($,{alt:i.alt,sources:s})):r.a.createElement($,{alt:i.alt,sources:s})),a?r.a.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:a}}):null))):null},te=a(8),ae="light",ne="dark",re=function(e){return e===ne?ne:ae},ce=function(e){try{localStorage.setItem("theme",re(e))}catch(t){console.error(t)}},oe=function(){var e=Object(m.useThemeConfig)().colorMode,t=e.defaultMode,a=e.disableSwitch,r=e.respectPrefersColorScheme,c=Object(n.useState)(function(e){return te.a.canUseDOM?re(document.documentElement.getAttribute("data-theme")):re(e)}(t)),o=c[0],l=c[1],i=Object(n.useCallback)((function(){l(ae),ce(ae)}),[]),s=Object(n.useCallback)((function(){l(ne),ce(ne)}),[]);return Object(n.useEffect)((function(){document.documentElement.setAttribute("data-theme",re(o))}),[o]),Object(n.useEffect)((function(){if(!a)try{var e=localStorage.getItem("theme");null!==e&&l(re(e))}catch(t){console.error(t)}}),[l]),Object(n.useEffect)((function(){a&&!r||window.matchMedia("(prefers-color-scheme: dark)").addListener((function(e){var t=e.matches;l(t?ne:ae)}))}),[]),{isDarkTheme:o===ne,setLightTheme:i,setDarkTheme:s}},le=a(246);var ie=function(e){var t=oe(),a=t.isDarkTheme,n=t.setLightTheme,c=t.setDarkTheme;return r.a.createElement(le.a.Provider,{value:{isDarkTheme:a,setLightTheme:n,setDarkTheme:c}},e.children)},se="docusaurus.tab.",ue=function(){var e=Object(n.useState)({}),t=e[0],a=e[1],r=Object(n.useCallback)((function(e,t){try{localStorage.setItem("docusaurus.tab."+e,t)}catch(a){console.error(a)}}),[]);return Object(n.useEffect)((function(){try{for(var e={},t=0;t996?c.desktop:c.mobile}var a=Object(n.useState)(t),o=a[0],l=a[1];return Object(n.useEffect)((function(){if(e)return window.addEventListener("resize",a),function(){return window.removeEventListener("resize",a)};function a(){l(t())}}),[]),o}},250:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(233),i=a(251),s=a(234),u=a(16),d=a(229);t.a=function(e){var t=Object(u.default)().isClient,a=Object(d.useThemeConfig)().navbar,c=a.title,m=a.logo,f=void 0===m?{src:""}:m,h=e.imageClassName,v=e.titleClassName,b=Object(r.a)(e,["imageClassName","titleClassName"]),p=Object(s.a)(f.href||"/"),g={light:Object(s.a)(f.src),dark:Object(s.a)(f.srcDark||f.src)};return o.a.createElement(l.a,Object(n.a)({to:p},b,f.target&&{target:f.target}),f.src&&o.a.createElement(i.a,{key:t,className:h,sources:g,alt:f.alt||c||"Logo"}),null!=c&&o.a.createElement("strong",{className:v},c))}},251:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(230),i=a(16),s=a(237),u=a(60),d=a.n(u);t.a=function(e){var t=Object(i.default)().isClient,a=Object(s.a)().isDarkTheme,c=e.sources,u=e.className,m=e.alt,f=void 0===m?"":m,h=Object(r.a)(e,["sources","className","alt"]),v=t?a?["dark"]:["light"]:["light","dark"];return o.a.createElement(o.a.Fragment,null,v.map((function(e){return o.a.createElement("img",Object(n.a)({key:e,src:c[e],alt:f,className:Object(l.a)(d.a.themedImage,d.a["themedImage--"+e],u)},h))})))}},252:function(e,t,a){"use strict";var n=a(3),r=a(7),c=a(0),o=a.n(c);t.a=function(e){var t=e.width,a=void 0===t?30:t,c=e.height,l=void 0===c?30:c,i=e.className,s=Object(r.a)(e,["width","height","className"]);return o.a.createElement("svg",Object(n.a)({"aria-label":"Menu",className:i,width:a,height:l,viewBox:"0 0 30 30",role:"img",focusable:"false"},s),o.a.createElement("title",null,"Menu"),o.a.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}},265:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;tthis.startX&&(this.setState({checked:!0}),this.startX=t,this.activated=ta?this.previouslyChecked!==this.state.checked&&(this.setState({checked:!1}),this.previouslyChecked=this.state.checked,t.click()):this.startX-4=0||Object.prototype.hasOwnProperty.call(e,n)&&(a[n]=e[n]);return a}(t,["className","icons"])),c=(0,l.default)("react-toggle",{"react-toggle--checked":this.state.checked,"react-toggle--focus":this.state.hasFocus,"react-toggle--disabled":this.props.disabled},a);return o.default.createElement("div",{className:c,onClick:this.handleClick,onTouchStart:this.handleTouchStart,onTouchMove:this.handleTouchMove,onTouchEnd:this.handleTouchEnd},o.default.createElement("div",{className:"react-toggle-track"},o.default.createElement("div",{className:"react-toggle-track-check"},this.getIcon("checked")),o.default.createElement("div",{className:"react-toggle-track-x"},this.getIcon("unchecked"))),o.default.createElement("div",{className:"react-toggle-thumb"}),o.default.createElement("input",n({},r,{ref:function(t){e.input=t},onFocus:this.handleFocus,onBlur:this.handleBlur,className:"react-toggle-screenreader-only",type:"checkbox"})))}}]),t}(c.PureComponent);t.default=f,f.displayName="Toggle",f.defaultProps={icons:{checked:o.default.createElement(s.default,null),unchecked:o.default.createElement(u.default,null)}},f.propTypes={checked:i.default.bool,disabled:i.default.bool,defaultChecked:i.default.bool,onChange:i.default.func,onFocus:i.default.func,onBlur:i.default.func,className:i.default.string,name:i.default.string,value:i.default.string,id:i.default.string,"aria-labelledby":i.default.string,"aria-label":i.default.string,icons:i.default.oneOfType([i.default.bool,i.default.shape({checked:i.default.node,unchecked:i.default.node})])}},266:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,r=a(0),c=(n=r)&&n.__esModule?n:{default:n};t.default=function(){return c.default.createElement("svg",{width:"14",height:"11",viewBox:"0 0 14 11"},c.default.createElement("path",{d:"M11.264 0L5.26 6.004 2.103 2.847 0 4.95l5.26 5.26 8.108-8.107L11.264 0",fill:"#fff",fillRule:"evenodd"}))}},267:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n,r=a(0),c=(n=r)&&n.__esModule?n:{default:n};t.default=function(){return c.default.createElement("svg",{width:"10",height:"10",viewBox:"0 0 10 10"},c.default.createElement("path",{d:"M9.9 2.12L7.78 0 4.95 2.828 2.12 0 0 2.12l2.83 2.83L0 7.776 2.123 9.9 4.95 7.07 7.78 9.9 9.9 7.776 7.072 4.95 9.9 2.12",fill:"#fff",fillRule:"evenodd"}))}},268:function(e,t,a){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.pointerCoord=function(e){if(e){var t=e.changedTouches;if(t&&t.length>0){var a=t[0];return{x:a.clientX,y:a.clientY}}var n=e.pageX;if(void 0!==n)return{x:n,y:e.pageY}}return{x:0,y:0}}},269:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return u}));var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(235),i=a(232),s=a(229);function u(e){var t,a=e.label,c=e.to,u=e.docsPluginId,d=Object(r.a)(e,["label","to","docsPluginId"]),m=Object(i.useActiveVersion)(u),f=Object(s.useDocsPreferredVersion)(u).preferredVersion,h=Object(i.useLatestVersion)(u),v=null!==(t=null!=m?m:f)&&void 0!==t?t:h,b=null!=a?a:v.label,p=null!=c?c:function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))}(v).path;return o.a.createElement(l.a,Object(n.a)({},d,{label:b,to:p}))}},270:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return d}));var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(235),i=a(232),s=a(229),u=function(e){return e.docs.find((function(t){return t.id===e.mainDocId}))};function d(e){var t,a,c=e.mobile,d=e.docsPluginId,m=e.dropdownActiveClassDisabled,f=e.dropdownItemsBefore,h=e.dropdownItemsAfter,v=Object(r.a)(e,["mobile","docsPluginId","dropdownActiveClassDisabled","dropdownItemsBefore","dropdownItemsAfter"]),b=Object(i.useActiveDocContext)(d),p=Object(i.useVersions)(d),g=Object(i.useLatestVersion)(d),k=Object(s.useDocsPreferredVersion)(d),E=k.preferredVersion,O=k.savePreferredVersionName;var j=null!==(t=null!==(a=b.activeVersion)&&void 0!==a?a:E)&&void 0!==t?t:g,y=c?"Versions":j.label,_=c?void 0:u(j).path;return o.a.createElement(l.a,Object(n.a)({},v,{mobile:c,label:y,to:_,items:function(){var e=p.map((function(e){var t=(null==b?void 0:b.alternateDocVersions[e.name])||u(e);return{isNavLink:!0,label:e.label,to:t.path,isActive:function(){return e===(null==b?void 0:b.activeVersion)},onClick:function(){O(e.name)}}})),t=[].concat(f,e,h);if(!(t.length<=1))return t}(),isActive:m?function(){return!1}:void 0}))}},271:function(e,t,a){"use strict";a.r(t),a.d(t,"default",(function(){return d}));var n=a(3),r=a(7),c=a(0),o=a.n(c),l=a(235),i=a(232),s=a(230),u=a(229);function d(e){var t,a,c=e.docId,d=e.activeSidebarClassName,m=e.label,f=e.docsPluginId,h=Object(r.a)(e,["docId","activeSidebarClassName","label","docsPluginId"]),v=Object(i.useActiveDocContext)(f),b=v.activeVersion,p=v.activeDoc,g=Object(u.useDocsPreferredVersion)(f).preferredVersion,k=Object(i.useLatestVersion)(f),E=null!==(t=null!=b?b:g)&&void 0!==t?t:k,O=E.docs.find((function(e){return e.id===c}));if(!O)throw new Error("DocNavbarItem: couldn't find any doc with id="+c+" in version "+E.name+".\nAvailable docIds=\n- "+E.docs.join("\n- "));return o.a.createElement(l.a,Object(n.a)({exact:!0},h,{className:Object(s.a)(h.className,(a={},a[d]=p&&p.sidebar===O.sidebar,a)),label:null!=m?m:O.id,to:O.path}))}}}]); \ No newline at end of file diff --git a/assets/js/2.89c52fba.js.LICENSE.txt b/assets/js/2.f7e8da3d.js.LICENSE.txt similarity index 100% rename from assets/js/2.89c52fba.js.LICENSE.txt rename to assets/js/2.f7e8da3d.js.LICENSE.txt diff --git a/assets/js/21ee0bc4.17500718.js b/assets/js/21ee0bc4.03721b9e.js similarity index 96% rename from assets/js/21ee0bc4.17500718.js rename to assets/js/21ee0bc4.03721b9e.js index d2f45f11..7cc1ea50 100644 --- a/assets/js/21ee0bc4.17500718.js +++ b/assets/js/21ee0bc4.03721b9e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{232:function(e,t,r){"use strict";r.d(t,"a",(function(){return u})),r.d(t,"b",(function(){return m}));var n=r(0),i=r.n(n);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function l(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=i.a.createContext({}),s=function(e){var t=i.a.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(r),f=n,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return r?i.a.createElement(m,l(l({ref:t},c),{},{components:r})):i.a.createElement(m,l({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,a=new Array(o);a[0]=f;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var c=i.a.createContext({}),s=function(e){var t=i.a.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):l(l({},t),e)),r},u=function(e){var t=s(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,o=e.originalType,a=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=s(r),f=n,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return r?i.a.createElement(m,l(l({ref:t},c),{},{components:r})):i.a.createElement(m,l({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var o=r.length,a=new Array(o);a[0]=f;var l={};for(var p in t)hasOwnProperty.call(t,p)&&(l[p]=t[p]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,h=p["".concat(i,".").concat(u)]||p[u]||m[u]||r;return n?a.a.createElement(h,l(l({ref:t},c),{},{components:n})):a.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h4",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique. E.g.,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=MyNet Los Angeles sFlow\n")),Object(r.b)("h4",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but only those using a particular interface are relevant, use this option in the .env file. The collectors and importer will save/read all incoming flows, but the logstash pipeline will drop those that do not have src_ifindex OR dst_inindex equal to one of those listed. "),Object(r.b)("p",null,"In the .env file, uncomment lines in the appropriate section and enter the information required. Be sure ",Object(r.b)("inlineCode",{parentName:"p"},"ifindex_filter_flag=True"),' with "True" capitalized as shown, any sensor names are spelled exactly right, and list all the ifindex values of flows that should be kept and processed. Some examples (use just one!):'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_keep=123\nifindex_filter_keep=123,456\nifindex_filter_keep=Sensor 1: 789\nifindex_filter_keep=123; Sensor 1: 789; Sensor 2: 800, 900\n")),Object(r.b)("p",null,"In the first case, all flows that have src_ifindex = 123 or dst_ifindex = 123 will be kept, regardless of sensor name. (Note that this may be a problem if you have more than 1 sensor with the same ifindex values!)\nIn the 2nd case, if src or dst ifindex is 123 or 456, the flow will be processed.\nIn the 3rd case, only flows from Sensor 1 will be filtered, with flows using ifindex 789 kept.\nIn the last example, any flow with ifindex 123 will be kept. Sensor 1 flows with ifindex 789 (or 123) will be kept, and those from Sensor 2 having ifindex 800 or 900 (or 123) will be kept. "),Object(r.b)("p",null,"Spaces don't matter except within the sensor names. Punctuation is required as shown."),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to keep all flows from a certain sensor but differentiate between those that enter or exit through specific sensor interfaces. This can be done by using this option in the .env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that use interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker and only 1 ifindex is allowed.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, corrections have to be applied. For example, if you are sampling 1 out of 100 flows, for each flow measured, it is assumed that in reality there would be 100 flows of that size with that src and dst, so the number of bits (and the number of packets, bits/s and packets/s) is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config, if nfsen is being used, or the nfcapd command, but this is not convenient when using Docker. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. The same correction applies to all listed sensors. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk doesn't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 1 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 1\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-save-flow-data-to-a-different-location"},"To Save Flow Data to a Different Location"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data/ directory (ie, the data/ directory in the git checkout). If you would like to use a different location, there are two options."),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"The best solution is to create a symlink between ./data/ and the preferred location, or, for an NFS volume, export it as ${PROJECT_DIR}/data.")),Object(r.b)("p",null,"During installation, delete the data/ directory (it should only contain .placeholder), then create your symlink. Eg, to use /var/netsage/ instead of data/, "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cd {netsage-pipeline dir}\nmkdir /var/netsage\nrm data/.placeholder\nrmdir data\nln -s /var/netsage {netsage-pipeline dir}/data\n")),Object(r.b)("p",null,"(Check the permissions of the directory.)"),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},"Alternatively, update volumes in docker-compose.yml and docker-compose.override.yml Eg, to save nfcapd files to subdirs in /mydir, set the collector volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir/input_data/netflow:/data")," (similarly for sflow) and set the importer and logstash volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir:/data"),". ")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict or be wiped out on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If cpu or memory seems to be a problem, try increasing the JVM heap size for logstash from 2GB to 3 or 4, no more than 8."),Object(r.b)("p",null,"To do this, edit LS_JAVA_OPTS in the .env file. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"LS_JAVA_OPTS=-Xmx4g -Xms4g\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use.")),Object(r.b)("p",null,"To modify other logstash settings, rename the provided example file for JVM Options and tweak the settings as desired:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")))}d.isMDXComponent=!0}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,h=p["".concat(i,".").concat(u)]||p[u]||m[u]||r;return n?a.a.createElement(h,l(l({ref:t},c),{},{components:n})):a.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h4",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique. E.g.,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=MyNet Los Angeles sFlow\n")),Object(r.b)("h4",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but only those using a particular interface are relevant, use this option in the .env file. The collectors and importer will save/read all incoming flows, but the logstash pipeline will drop those that do not have src_ifindex OR dst_inindex equal to one of those listed. "),Object(r.b)("p",null,"In the .env file, uncomment lines in the appropriate section and enter the information required. Be sure ",Object(r.b)("inlineCode",{parentName:"p"},"ifindex_filter_flag=True"),' with "True" capitalized as shown, any sensor names are spelled exactly right, and list all the ifindex values of flows that should be kept and processed. Some examples (use just one!):'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_keep=123\nifindex_filter_keep=123,456\nifindex_filter_keep=Sensor 1: 789\nifindex_filter_keep=123; Sensor 1: 789; Sensor 2: 800, 900\n")),Object(r.b)("p",null,"In the first case, all flows that have src_ifindex = 123 or dst_ifindex = 123 will be kept, regardless of sensor name. (Note that this may be a problem if you have more than 1 sensor with the same ifindex values!)\nIn the 2nd case, if src or dst ifindex is 123 or 456, the flow will be processed.\nIn the 3rd case, only flows from Sensor 1 will be filtered, with flows using ifindex 789 kept.\nIn the last example, any flow with ifindex 123 will be kept. Sensor 1 flows with ifindex 789 (or 123) will be kept, and those from Sensor 2 having ifindex 800 or 900 (or 123) will be kept. "),Object(r.b)("p",null,"Spaces don't matter except within the sensor names. Punctuation is required as shown."),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to keep all flows from a certain sensor but differentiate between those that enter or exit through specific sensor interfaces. This can be done by using this option in the .env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that use interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker and only 1 ifindex is allowed.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, corrections have to be applied. For example, if you are sampling 1 out of 100 flows, for each flow measured, it is assumed that in reality there would be 100 flows of that size with that src and dst, so the number of bits (and the number of packets, bits/s and packets/s) is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config, if nfsen is being used, or the nfcapd command, but this is not convenient when using Docker. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. The same correction applies to all listed sensors. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk doesn't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 1 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 1\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-save-flow-data-to-a-different-location"},"To Save Flow Data to a Different Location"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data/ directory (ie, the data/ directory in the git checkout). If you would like to use a different location, there are two options."),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"The best solution is to create a symlink between ./data/ and the preferred location, or, for an NFS volume, export it as ${PROJECT_DIR}/data.")),Object(r.b)("p",null,"During installation, delete the data/ directory (it should only contain .placeholder), then create your symlink. Eg, to use /var/netsage/ instead of data/, "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cd {netsage-pipeline dir}\nmkdir /var/netsage\nrm data/.placeholder\nrmdir data\nln -s /var/netsage {netsage-pipeline dir}/data\n")),Object(r.b)("p",null,"(Check the permissions of the directory.)"),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},"Alternatively, update volumes in docker-compose.yml and docker-compose.override.yml Eg, to save nfcapd files to subdirs in /mydir, set the collector volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir/input_data/netflow:/data")," (similarly for sflow) and set the importer and logstash volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir:/data"),". ")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict or be wiped out on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If cpu or memory seems to be a problem, try increasing the JVM heap size for logstash from 2GB to 3 or 4, no more than 8."),Object(r.b)("p",null,"To do this, edit LS_JAVA_OPTS in the .env file. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"LS_JAVA_OPTS=-Xmx4g -Xms4g\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use.")),Object(r.b)("p",null,"To modify other logstash settings, rename the provided example file for JVM Options and tweak the settings as desired:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3179f6dc.91efb769.js b/assets/js/3179f6dc.bedc2974.js similarity index 96% rename from assets/js/3179f6dc.91efb769.js rename to assets/js/3179f6dc.bedc2974.js index e1dcd005..012580b6 100644 --- a/assets/js/3179f6dc.91efb769.js +++ b/assets/js/3179f6dc.bedc2974.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[25],{232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return f}));var r=n(0),o=n.n(r);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,f=p["".concat(a,".").concat(b)]||p[b]||d[b]||i;return n?o.a.createElement(f,l(l({ref:t},c),{},{components:n})):o.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,f=p["".concat(a,".").concat(b)]||p[b]||d[b]||i;return n?o.a.createElement(f,l(l({ref:t},c),{},{components:n})):o.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(o,".").concat(u)]||d[u]||b[u]||r;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(o,".").concat(u)]||d[u]||b[u]||r;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s \'localhost\'\n user => \'guest\'\n password => "${rabbitmq_pass}"\n exchange => \'netsage.direct\'\n key => XXXXXXX\'\n queue => \'netsage\'\n durable => true\n subscription_retry_interval_seconds => 5\n connection_timeout => 10000\n }\n}\nfilter {\n if [@metadata][rabbitmq_properties][timestamp] {\n date {\n match => ["[@metadata][rabbitmq_properties][timestamp]", "UNIX"]\n }\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\n "https://CHANGEME1",\n "https://CHANGEME2"\n ]\n user => "logstash"\n password => "${logstash_elasticsearch_password}"\n cacert => "/etc/logstash/ca.crt"\n index => "om-ns-netsage"\n template_overwrite => true\n failure_type_logging_whitelist => []\n action => index\n #ssl_certificate_verification => false\n }\n}\n')),Object(l.b)("p",null,"Once the data is published in elastic, you can use the ",Object(l.b)("a",{parentName:"p",href:"https://github.com/netsage-project/netsage-grafana-configs"},"grafana dashboard")," to visualize the data."),Object(l.b)("h2",{id:"elasticsearch-fields"},"Elasticsearch Fields"),Object(l.b)("h3",{id:"es-fields"},"ES fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_index"),Object(l.b)("td",{parentName:"tr",align:null},"om-ns-netsage-2020.06."),Object(l.b)("td",{parentName:"tr",align:null},"equivalent to an sql table")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_type"),Object(l.b)("td",{parentName:"tr",align:null},"_doc"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_id"),Object(l.b)("td",{parentName:"tr",align:null},"HRkcm3IByJ9fEnbnCpaY"),Object(l.b)("td",{parentName:"tr",align:null},"document id, set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_score"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES query")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@version"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")))),Object(l.b)("h3",{id:"developer-fields"},"Developer fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"type"),Object(l.b)("td",{parentName:"tr",align:null},"flow"),Object(l.b)("td",{parentName:"tr",align:null},'Always "flow" for us. Other types may be "macy", etc.')),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@injest_time"),Object(l.b)("td",{parentName:"tr",align:null},"2020-06-09T21:51:57.059Z"),Object(l.b)("td",{parentName:"tr",align:null},"Essentially time the flow went into the logstash pipeline (10-preliminaries.conf for tstat flows) or the time stitching of the flow commenced (40-aggregation.conf for others)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@timestamp"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:21.703"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow went into the logstash pipeline for tstat flows, or the time stitching finished and the event was pushed for other flows.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@exit_time"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:25.369"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow exited the pipeline (99-outputs.conf)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@processing_time"),Object(l.b)("td",{parentName:"tr",align:null},"688.31"),Object(l.b)("td",{parentName:"tr",align:null},"@exit_time minus @injest_time. Useful for seeing how long stitching took.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"stitched_flows"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"Number of flows stitched together to make this final one. 0 for tstat flows, which are always complete. 1 if no flows were stitched together.")))),Object(l.b)("h3",{id:"flow-fields"},"Flow fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"start"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:53.808"),Object(l.b)("td",{parentName:"tr",align:null},"Start time of the flow (first packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"end"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:57.699"),Object(l.b)("td",{parentName:"tr",align:null},"End time of the flow (last packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.protocol"),Object(l.b)("td",{parentName:"tr",align:null},"tcp"),Object(l.b)("td",{parentName:"tr",align:null},"Protocol used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.id"),Object(l.b)("td",{parentName:"tr",align:null},"a17c4f05420d7ded9eb151ccd293a633 ff226d1752b24e0f4139a87a8b26d779"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned flow id")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.flow_type"),Object(l.b)("td",{parentName:"tr",align:null},"sflow"),Object(l.b)("td",{parentName:"tr",align:null},"Sflow, Netflow, or Tstat")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_id"),Object(l.b)("td",{parentName:"tr",align:null},"snvl2-pw-sw-1-mgmt-2.cenic.net"),Object(l.b)("td",{parentName:"tr",align:null},"Sensor name (set in importer config, may not always be a hostname)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_group"),Object(l.b)("td",{parentName:"tr",align:null},"CENIC"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor group")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_type"),Object(l.b)("td",{parentName:"tr",align:null},"Regional Network"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor type")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.country_scope"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic, International, or Mixed, depending on countries of src and dst")))),Object(l.b)("h3",{id:"source-fields-destination-fields-similarly"},"Source Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_ip"),Object(l.b)("td",{parentName:"tr",align:null},"171.64.68.x"),Object(l.b)("td",{parentName:"tr",align:null},"deidentified IP address")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_port"),Object(l.b)("td",{parentName:"tr",align:null},"80"),Object(l.b)("td",{parentName:"tr",align:null},"port used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_asn"),Object(l.b)("td",{parentName:"tr",align:null},"32"),Object(l.b)("td",{parentName:"tr",align:null},"ASN of the IP from geoip ASN database or the ASN from the flow header")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.423"),Object(l.b)("td",{parentName:"tr",align:null},"latitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.164"),Object(l.b)("td",{parentName:"tr",align:null},"longitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_country_name"),Object(l.b)("td",{parentName:"tr",align:null},"United States"),Object(l.b)("td",{parentName:"tr",align:null},"country of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_continent"),Object(l.b)("td",{parentName:"tr",align:null},"North America"),Object(l.b)("td",{parentName:"tr",align:null},"continent of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_organization"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"organization that owns the AS of the IP from geoip ASN database")))),Object(l.b)("h3",{id:"source-science-registry-fields--destination-fields-similarly"},"Source Science Registry Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford - ImageNet"),Object(l.b)("td",{parentName:"tr",align:null},"Resource name from SciReg")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"-"),Object(l.b)("td",{parentName:"tr",align:null},"Resource abbreviation (if any)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.discipline"),Object(l.b)("td",{parentName:"tr",align:null},"CS. Intelligent Systems"),Object(l.b)("td",{parentName:"tr",align:null},"The science discipline that uses the resource (ie host). Note that not the src MAY not have the same discipline as the dst.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.role"),Object(l.b)("td",{parentName:"tr",align:null},"Storage"),Object(l.b)("td",{parentName:"tr",align:null},"Role that the host plays")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_name"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"The organization the manages and/or uses the resource, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford"),Object(l.b)("td",{parentName:"tr",align:null},"A shorter name for the organization. May not be the official abbreviation.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.projects"),Object(l.b)("td",{parentName:"tr",align:null},"."),Object(l.b)("td",{parentName:"tr",align:null},"Can be an array of projects ","[we may change this field name soon]")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.latitude"),Object(l.b)("td",{parentName:"tr",align:null},"37.4178"),Object(l.b)("td",{parentName:"tr",align:null},"Resource's location, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.longitude"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"preferred-fields"},'"Preferred" fields'),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_org"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"If the IP was found in the Science Registry, these are the SciReg values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.417800"),Object(l.b)("td",{parentName:"tr",align:null},"Otherwise, they are the geoip values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172000"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"values"},"Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_bits"),Object(l.b)("td",{parentName:"tr",align:null},"939, 458, 560"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of bits in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_packets"),Object(l.b)("td",{parentName:"tr",align:null},"77, 824"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of packets in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.duration"),Object(l.b)("td",{parentName:"tr",align:null},"3.891"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as end minus start")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.bits_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"241, 443, 988"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_bits divided by duration")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.packets_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"20, 001"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_packets divided by duration")))),Object(l.b)("h3",{id:"tstat-values"},"Tstat Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_initial_cwin"),Object(l.b)("td",{parentName:"tr",align:null},"313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_max_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"64313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_min_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_mss"),Object(l.b)("td",{parentName:"tr",align:null},"8960")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_out_seq_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_dup"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fc"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_reor"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_rto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unfs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unk"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unrto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_bytes"),Object(l.b)("td",{parentName:"tr",align:null},"1678")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_avg"),Object(l.b)("td",{parentName:"tr",align:null},"0.044")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_max"),Object(l.b)("td",{parentName:"tr",align:null},"39.527")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_min"),Object(l.b)("td",{parentName:"tr",align:null},"0.001")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_std"),Object(l.b)("td",{parentName:"tr",align:null},"0.276")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_sack_cnt"),Object(l.b)("td",{parentName:"tr",align:null},"1")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_window_scale"),Object(l.b)("td",{parentName:"tr",align:null},"13")))))}s.isMDXComponent=!0},232:function(e,t,a){"use strict";a.d(t,"a",(function(){return d})),a.d(t,"b",(function(){return u}));var n=a(0),r=a.n(n);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function b(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=r.a.createContext({}),s=function(e){var t=r.a.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):b(b({},t),e)),a},d=function(e){var t=s(e.components);return r.a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,o=c(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,u=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return a?r.a.createElement(u,b(b({ref:t},o),{},{components:a})):r.a.createElement(u,b({ref:t},o))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=m;var b={};for(var c in t)hasOwnProperty.call(t,c)&&(b[c]=t[c]);b.originalType=e,b.mdxType="string"==typeof e?e:n,i[1]=b;for(var o=2;o \'localhost\'\n user => \'guest\'\n password => "${rabbitmq_pass}"\n exchange => \'netsage.direct\'\n key => XXXXXXX\'\n queue => \'netsage\'\n durable => true\n subscription_retry_interval_seconds => 5\n connection_timeout => 10000\n }\n}\nfilter {\n if [@metadata][rabbitmq_properties][timestamp] {\n date {\n match => ["[@metadata][rabbitmq_properties][timestamp]", "UNIX"]\n }\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\n "https://CHANGEME1",\n "https://CHANGEME2"\n ]\n user => "logstash"\n password => "${logstash_elasticsearch_password}"\n cacert => "/etc/logstash/ca.crt"\n index => "om-ns-netsage"\n template_overwrite => true\n failure_type_logging_whitelist => []\n action => index\n #ssl_certificate_verification => false\n }\n}\n')),Object(l.b)("p",null,"Once the data is published in elastic, you can use the ",Object(l.b)("a",{parentName:"p",href:"https://github.com/netsage-project/netsage-grafana-configs"},"grafana dashboard")," to visualize the data."),Object(l.b)("h2",{id:"elasticsearch-fields"},"Elasticsearch Fields"),Object(l.b)("h3",{id:"es-fields"},"ES fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_index"),Object(l.b)("td",{parentName:"tr",align:null},"om-ns-netsage-2020.06."),Object(l.b)("td",{parentName:"tr",align:null},"equivalent to an sql table")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_type"),Object(l.b)("td",{parentName:"tr",align:null},"_doc"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_id"),Object(l.b)("td",{parentName:"tr",align:null},"HRkcm3IByJ9fEnbnCpaY"),Object(l.b)("td",{parentName:"tr",align:null},"document id, set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_score"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES query")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@version"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")))),Object(l.b)("h3",{id:"developer-fields"},"Developer fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"type"),Object(l.b)("td",{parentName:"tr",align:null},"flow"),Object(l.b)("td",{parentName:"tr",align:null},'Always "flow" for us. Other types may be "macy", etc.')),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@injest_time"),Object(l.b)("td",{parentName:"tr",align:null},"2020-06-09T21:51:57.059Z"),Object(l.b)("td",{parentName:"tr",align:null},"Essentially time the flow went into the logstash pipeline (10-preliminaries.conf for tstat flows) or the time stitching of the flow commenced (40-aggregation.conf for others)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@timestamp"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:21.703"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow went into the logstash pipeline for tstat flows, or the time stitching finished and the event was pushed for other flows.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@exit_time"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:25.369"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow exited the pipeline (99-outputs.conf)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@processing_time"),Object(l.b)("td",{parentName:"tr",align:null},"688.31"),Object(l.b)("td",{parentName:"tr",align:null},"@exit_time minus @injest_time. Useful for seeing how long stitching took.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"stitched_flows"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"Number of flows stitched together to make this final one. 0 for tstat flows, which are always complete. 1 if no flows were stitched together.")))),Object(l.b)("h3",{id:"flow-fields"},"Flow fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"start"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:53.808"),Object(l.b)("td",{parentName:"tr",align:null},"Start time of the flow (first packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"end"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:57.699"),Object(l.b)("td",{parentName:"tr",align:null},"End time of the flow (last packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.protocol"),Object(l.b)("td",{parentName:"tr",align:null},"tcp"),Object(l.b)("td",{parentName:"tr",align:null},"Protocol used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.id"),Object(l.b)("td",{parentName:"tr",align:null},"a17c4f05420d7ded9eb151ccd293a633 ff226d1752b24e0f4139a87a8b26d779"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned flow id")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.flow_type"),Object(l.b)("td",{parentName:"tr",align:null},"sflow"),Object(l.b)("td",{parentName:"tr",align:null},"Sflow, Netflow, or Tstat")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_id"),Object(l.b)("td",{parentName:"tr",align:null},"snvl2-pw-sw-1-mgmt-2.cenic.net"),Object(l.b)("td",{parentName:"tr",align:null},"Sensor name (set in importer config, may not always be a hostname)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_group"),Object(l.b)("td",{parentName:"tr",align:null},"CENIC"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor group")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_type"),Object(l.b)("td",{parentName:"tr",align:null},"Regional Network"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor type")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.country_scope"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic, International, or Mixed, depending on countries of src and dst")))),Object(l.b)("h3",{id:"source-fields-destination-fields-similarly"},"Source Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_ip"),Object(l.b)("td",{parentName:"tr",align:null},"171.64.68.x"),Object(l.b)("td",{parentName:"tr",align:null},"deidentified IP address")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_port"),Object(l.b)("td",{parentName:"tr",align:null},"80"),Object(l.b)("td",{parentName:"tr",align:null},"port used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_asn"),Object(l.b)("td",{parentName:"tr",align:null},"32"),Object(l.b)("td",{parentName:"tr",align:null},"ASN of the IP from geoip ASN database or the ASN from the flow header")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.423"),Object(l.b)("td",{parentName:"tr",align:null},"latitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.164"),Object(l.b)("td",{parentName:"tr",align:null},"longitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_country_name"),Object(l.b)("td",{parentName:"tr",align:null},"United States"),Object(l.b)("td",{parentName:"tr",align:null},"country of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_continent"),Object(l.b)("td",{parentName:"tr",align:null},"North America"),Object(l.b)("td",{parentName:"tr",align:null},"continent of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_organization"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"organization that owns the AS of the IP from geoip ASN database")))),Object(l.b)("h3",{id:"source-science-registry-fields--destination-fields-similarly"},"Source Science Registry Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford - ImageNet"),Object(l.b)("td",{parentName:"tr",align:null},"Resource name from SciReg")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"-"),Object(l.b)("td",{parentName:"tr",align:null},"Resource abbreviation (if any)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.discipline"),Object(l.b)("td",{parentName:"tr",align:null},"CS. Intelligent Systems"),Object(l.b)("td",{parentName:"tr",align:null},"The science discipline that uses the resource (ie host). Note that not the src MAY not have the same discipline as the dst.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.role"),Object(l.b)("td",{parentName:"tr",align:null},"Storage"),Object(l.b)("td",{parentName:"tr",align:null},"Role that the host plays")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_name"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"The organization the manages and/or uses the resource, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford"),Object(l.b)("td",{parentName:"tr",align:null},"A shorter name for the organization. May not be the official abbreviation.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.projects"),Object(l.b)("td",{parentName:"tr",align:null},"."),Object(l.b)("td",{parentName:"tr",align:null},"Can be an array of projects ","[we may change this field name soon]")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.latitude"),Object(l.b)("td",{parentName:"tr",align:null},"37.4178"),Object(l.b)("td",{parentName:"tr",align:null},"Resource's location, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.longitude"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"preferred-fields"},'"Preferred" fields'),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_org"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"If the IP was found in the Science Registry, these are the SciReg values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.417800"),Object(l.b)("td",{parentName:"tr",align:null},"Otherwise, they are the geoip values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172000"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"values"},"Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_bits"),Object(l.b)("td",{parentName:"tr",align:null},"939, 458, 560"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of bits in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_packets"),Object(l.b)("td",{parentName:"tr",align:null},"77, 824"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of packets in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.duration"),Object(l.b)("td",{parentName:"tr",align:null},"3.891"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as end minus start")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.bits_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"241, 443, 988"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_bits divided by duration")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.packets_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"20, 001"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_packets divided by duration")))),Object(l.b)("h3",{id:"tstat-values"},"Tstat Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_initial_cwin"),Object(l.b)("td",{parentName:"tr",align:null},"313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_max_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"64313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_min_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_mss"),Object(l.b)("td",{parentName:"tr",align:null},"8960")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_out_seq_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_dup"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fc"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_reor"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_rto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unfs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unk"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unrto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_bytes"),Object(l.b)("td",{parentName:"tr",align:null},"1678")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_avg"),Object(l.b)("td",{parentName:"tr",align:null},"0.044")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_max"),Object(l.b)("td",{parentName:"tr",align:null},"39.527")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_min"),Object(l.b)("td",{parentName:"tr",align:null},"0.001")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_std"),Object(l.b)("td",{parentName:"tr",align:null},"0.276")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_sack_cnt"),Object(l.b)("td",{parentName:"tr",align:null},"1")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_window_scale"),Object(l.b)("td",{parentName:"tr",align:null},"13")))))}s.isMDXComponent=!0},228:function(e,t,a){"use strict";a.d(t,"a",(function(){return d})),a.d(t,"b",(function(){return u}));var n=a(0),r=a.n(n);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function b(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=r.a.createContext({}),s=function(e){var t=r.a.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):b(b({},t),e)),a},d=function(e){var t=s(e.components);return r.a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,o=c(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,u=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return a?r.a.createElement(u,b(b({ref:t},o),{},{components:a})):r.a.createElement(u,b({ref:t},o))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=m;var b={};for(var c in t)hasOwnProperty.call(t,c)&&(b[c]=t[c]);b.originalType=e,b.mdxType="string"==typeof e?e:n,i[1]=b;for(var o=2;o=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"}," ")," ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(i.b)("inlineCode",{parentName:"p"}," ")))),Object(i.b)("h2",{id:"handy-docker-commands"},"Handy Docker Commands"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}d.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return m}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),d=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},u=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,m=p["".concat(a,".").concat(u)]||p[u]||b[u]||i;return n?r.a.createElement(m,c(c({ref:t},s),{},{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var s=2;s ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"}," ")," ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(i.b)("inlineCode",{parentName:"p"}," ")))),Object(i.b)("h2",{id:"handy-docker-commands"},"Handy Docker Commands"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}d.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return m}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),d=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},u=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,m=p["".concat(a,".").concat(u)]||p[u]||b[u]||i;return n?r.a.createElement(m,c(c({ref:t},s),{},{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,h=d["".concat(i,".").concat(m)]||d[m]||b[m]||r;return n?o.a.createElement(h,l(l({ref:t},c),{},{components:n})):o.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,h=d["".concat(i,".").concat(m)]||d[m]||b[m]||r;return n?o.a.createElement(h,l(l({ref:t},c),{},{components:n})):o.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var c=2;c=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),l=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=l(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||a;return n?o.a.createElement(m,s(s({ref:t},c),{},{components:n})):o.a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),l=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=l(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||a;return n?o.a.createElement(m,s(s({ref:t},c),{},{components:n})):o.a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=r,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=f;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=r,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=f;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),s=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},d=function(e){var t=s(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=u(e,["components","mdxType","originalType","parentName"]),d=s(n),b=r,m=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?o.a.createElement(m,c(c({ref:t},l),{},{components:n})):o.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),s=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},d=function(e){var t=s(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=u(e,["components","mdxType","originalType","parentName"]),d=s(n),b=r,m=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?o.a.createElement(m,c(c({ref:t},l),{},{components:n})):o.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=o,h=u["".concat(l,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(h,r(r({ref:t},c),{},{components:n})):a.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=b;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:o,l[1]=r;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=o,h=u["".concat(l,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(h,r(r({ref:t},c),{},{components:n})):a.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=b;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:o,l[1]=r;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),s=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},p=function(t){var e=s(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),p=s(a),o=n,u=p["".concat(b,".").concat(o)]||p[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),s=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},p=function(t){var e=s(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),p=s(a),o=n,u=p["".concat(b,".").concat(o)]||p[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=o.a.createContext({}),p=function(e){var t=o.a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=p(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,c=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=p(r),b=n,m=d["".concat(a,".").concat(b)]||d[b]||u[b]||c;return r?o.a.createElement(m,i(i({ref:t},s),{},{components:r})):o.a.createElement(m,i({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var c=r.length,a=new Array(c);a[0]=b;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,a[1]=i;for(var s=2;s=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=o.a.createContext({}),p=function(e){var t=o.a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},d=function(e){var t=p(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var r=e.components,n=e.mdxType,c=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),d=p(r),b=n,m=d["".concat(a,".").concat(b)]||d[b]||u[b]||c;return r?o.a.createElement(m,i(i({ref:t},s),{},{components:r})):o.a.createElement(m,i({ref:t},s))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var c=r.length,a=new Array(c);a[0]=b;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,a[1]=i;for(var s=2;s=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},l),{},{components:n})):a.a.createElement(h,s({ref:t},l))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},l),{},{components:n})):a.a.createElement(h,s({ref:t},l))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),l=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(n),b=r,f=u["".concat(o,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(f,s(s({ref:t},c),{},{components:n})):a.a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=b;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),l=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(n),b=r,f=u["".concat(o,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(f,s(s({ref:t},c),{},{components:n})):a.a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=b;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},l),{},{components:n})):a.a.createElement(h,s({ref:t},l))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},l),{},{components:n})):a.a.createElement(h,s({ref:t},l))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var l=2;l ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"}," ")," ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(i.b)("inlineCode",{parentName:"p"}," ")))),Object(i.b)("h2",{id:"handy-docker-commands"},"Handy Docker Commands"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}d.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return m}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),d=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},u=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,m=p["".concat(a,".").concat(u)]||p[u]||b[u]||i;return n?r.a.createElement(m,c(c({ref:t},s),{},{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var s=2;s\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"3-edit-environment-file"},"3. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=Example New York sFlow\n")),Object(r.b)("h3",{id:"running-the-new-collector"},"Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"to-change-the-culling-of-nfcapd-files"},"To Change the Culling of Nfcapd Files"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk don't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section. Set cull-enable to 0 for no culling. Eg, to save 7 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 7\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"for-tstat-data"},"For Tstat Data"),Object(r.b)("p",null,'Tstat data is not collected by nfdump/sfcapd/nfcapd or read by an Importer. Instead, the flow data is sent directly from the router or switch to the logstash pipeline\'s ingest rabbit queue (named "netsage_deidentifier_raw"). So, when following the Docker Simple guide, the sections related to configuring and starting up the collectors and Importer will not pertain to the tstat sensors. The .env file still needs to be set up though.'),Object(r.b)("p",null,"Setting up Tstat is outside the scope of this document, but see the Netsage project Tstat-Transport which contains client programs that can send tstat data to a rabbit queue. See ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/tstat-transport.git"},"https://github.com/netsage-project/tstat-transport.git"),"."),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"for-data-saved-to-an-nfs-volume"},"For Data Saved to an NFS Volume"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("p",null,"Note: modifying all the paths in the two files should work, but may not. In one case, it worked to modify only the paths for the collector volumes (eg, - /mnt/nfs/netsagedata/netflow:/data), leaving all others with their default values."),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))))}d.isMDXComponent=!0},232:function(e,t,o){"use strict";o.d(t,"a",(function(){return p})),o.d(t,"b",(function(){return h}));var a=o(0),n=o.n(a);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function i(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var c=n.a.createContext({}),d=function(e){var t=n.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},p=function(e){var t=d(e.components);return n.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(o),m=a,h=p["".concat(l,".").concat(m)]||p[m]||u[m]||r;return o?n.a.createElement(h,i(i({ref:t},c),{},{components:o})):n.a.createElement(h,i({ref:t},c))}));function h(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,l=new Array(r);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:a,l[1]=i;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"3-edit-environment-file"},"3. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=Example New York sFlow\n")),Object(r.b)("h3",{id:"running-the-new-collector"},"Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"to-change-the-culling-of-nfcapd-files"},"To Change the Culling of Nfcapd Files"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk don't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section. Set cull-enable to 0 for no culling. Eg, to save 7 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 7\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"for-tstat-data"},"For Tstat Data"),Object(r.b)("p",null,'Tstat data is not collected by nfdump/sfcapd/nfcapd or read by an Importer. Instead, the flow data is sent directly from the router or switch to the logstash pipeline\'s ingest rabbit queue (named "netsage_deidentifier_raw"). So, when following the Docker Simple guide, the sections related to configuring and starting up the collectors and Importer will not pertain to the tstat sensors. The .env file still needs to be set up though.'),Object(r.b)("p",null,"Setting up Tstat is outside the scope of this document, but see the Netsage project Tstat-Transport which contains client programs that can send tstat data to a rabbit queue. See ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/tstat-transport.git"},"https://github.com/netsage-project/tstat-transport.git"),"."),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"for-data-saved-to-an-nfs-volume"},"For Data Saved to an NFS Volume"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("p",null,"Note: modifying all the paths in the two files should work, but may not. In one case, it worked to modify only the paths for the collector volumes (eg, - /mnt/nfs/netsagedata/netflow:/data), leaving all others with their default values."),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))))}d.isMDXComponent=!0},228:function(e,t,o){"use strict";o.d(t,"a",(function(){return p})),o.d(t,"b",(function(){return h}));var a=o(0),n=o.n(a);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function l(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function i(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var c=n.a.createContext({}),d=function(e){var t=n.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):i(i({},t),e)),o},p=function(e){var t=d(e.components);return n.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(o),m=a,h=p["".concat(l,".").concat(m)]||p[m]||u[m]||r;return o?n.a.createElement(h,i(i({ref:t},c),{},{components:o})):n.a.createElement(h,i({ref:t},c))}));function h(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,l=new Array(r);l[0]=m;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:a,l[1]=i;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var o=n(0),a=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},h=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=o,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?a.a.createElement(b,r(r({ref:t},c),{},{components:n})):a.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:o,l[1]=r;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var o=n(0),a=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},h=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=o,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?a.a.createElement(b,r(r({ref:t},c),{},{components:n})):a.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:o,l[1]=r;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=d(n),p=r,m=u["".concat(i,".").concat(p)]||u[p]||b[p]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=d(n),p=r,m=u["".concat(i,".").concat(p)]||u[p]||b[p]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),l=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},u=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=l(n),u=r,m=d["".concat(i,".").concat(u)]||d[u]||f[u]||a;return n?o.a.createElement(m,p(p({ref:t},s),{},{components:n})):o.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=u;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),s=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},p=function(t){var e=s(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),p=s(a),o=n,u=p["".concat(b,".").concat(o)]||p[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),s=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},p=function(t){var e=s(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),p=s(a),o=n,u=p["".concat(b,".").concat(o)]||p[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=r,m=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=r,m=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"3-edit-environment-file"},"3. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=Example New York sFlow\n")),Object(r.b)("h3",{id:"running-the-new-collector"},"Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to differentiate between flows that enter or exit through specific sensor interfaces. This can be done by editing the env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows through interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name (sensor_id) changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."),Object(r.b)("h2",{parentName:"div",id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",{parentName:"div"},"When flow sampling is done, the number of bits needs to be corrected for the sampling rate. For example, if you are sampling 1 out of 100 flows and a sample has 55 MB, it is assumed that in reality there would be 100 flows of that size (with that src and dst), so the number of bits is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config or the nfcapd command. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",{parentName:"div"},'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. For example,'),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{parentName:"div",id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",{parentName:"div"},"The importer will automatically delete older nfcapd files for you, so that your disk don't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",{parentName:"div"},"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 7 days worth of data:"),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 7\n \n")),Object(r.b)("p",{parentName:"div"},"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{parentName:"div",id:"to-process-tstat-data"},"To Process Tstat Data"),Object(r.b)("p",{parentName:"div"},'Tstat data is not collected by nfdump/sfcapd/nfcapd or read by an Importer. Instead, the flow data is sent directly from the router or switch to the logstash pipeline\'s ingest rabbit queue (named "netsage_deidentifier_raw"). So, when following the Docker Simple guide, the sections related to configuring and starting up the collectors and Importer will not pertain to the tstat sensors. The .env file still needs to be set up though.'),Object(r.b)("p",{parentName:"div"},"Setting up Tstat is outside the scope of this document, but see the Netsage project Tstat-Transport which contains client programs that can send tstat data to a rabbit queue. See ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/tstat-transport.git"},"https://github.com/netsage-project/tstat-transport.git"),". Basically, you need to have Tstat send data directly to the same rabbit queue that the importers write sflow and netflow data to and that the logstash pipeline reads from."),Object(r.b)("h2",{parentName:"div",id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",{parentName:"div"},"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",{parentName:"div"},"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("p",{parentName:"div"},"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",{parentName:"div"},Object(r.b)("li",{parentName:"ul"},"The recommended heap size for typical ingestion scenarios should be no less than 4GB and no more than 8GB."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use."),Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process.")),Object(r.b)("h2",{parentName:"div",id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",{parentName:"div"},"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",{parentName:"div"},"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{parentName:"div",id:"for-data-saved-to-an-nfs-volume"},"For Data Saved to an NFS Volume"),Object(r.b)("p",{parentName:"div"},"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",{parentName:"div"},Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("p",{parentName:"div"},"Note: modifying all the paths in the two files should work, but may not. In one case, it worked to modify only the paths for the collector volumes (eg, - /mnt/nfs/netsagedata/netflow:/data), leaving all others with their default values."))),Object(r.b)("p",null,"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually.\n:::"))}d.isMDXComponent=!0},232:function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"b",(function(){return u}));var n=a(0),o=a.n(n);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var c=o.a.createContext({}),d=function(e){var t=o.a.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},p=function(e){var t=d(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,i=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=d(a),h=n,u=p["".concat(i,".").concat(h)]||p[h]||m[h]||r;return a?o.a.createElement(u,s(s({ref:t},c),{},{components:a})):o.a.createElement(u,s({ref:t},c))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,i=new Array(r);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"3-edit-environment-file"},"3. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=Example New York sFlow\n")),Object(r.b)("h3",{id:"running-the-new-collector"},"Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to differentiate between flows that enter or exit through specific sensor interfaces. This can be done by editing the env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows through interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name (sensor_id) changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."),Object(r.b)("h2",{parentName:"div",id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",{parentName:"div"},"When flow sampling is done, the number of bits needs to be corrected for the sampling rate. For example, if you are sampling 1 out of 100 flows and a sample has 55 MB, it is assumed that in reality there would be 100 flows of that size (with that src and dst), so the number of bits is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config or the nfcapd command. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",{parentName:"div"},'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. For example,'),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{parentName:"div",id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",{parentName:"div"},"The importer will automatically delete older nfcapd files for you, so that your disk don't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",{parentName:"div"},"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 7 days worth of data:"),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 7\n \n")),Object(r.b)("p",{parentName:"div"},"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{parentName:"div",id:"to-process-tstat-data"},"To Process Tstat Data"),Object(r.b)("p",{parentName:"div"},'Tstat data is not collected by nfdump/sfcapd/nfcapd or read by an Importer. Instead, the flow data is sent directly from the router or switch to the logstash pipeline\'s ingest rabbit queue (named "netsage_deidentifier_raw"). So, when following the Docker Simple guide, the sections related to configuring and starting up the collectors and Importer will not pertain to the tstat sensors. The .env file still needs to be set up though.'),Object(r.b)("p",{parentName:"div"},"Setting up Tstat is outside the scope of this document, but see the Netsage project Tstat-Transport which contains client programs that can send tstat data to a rabbit queue. See ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/tstat-transport.git"},"https://github.com/netsage-project/tstat-transport.git"),". Basically, you need to have Tstat send data directly to the same rabbit queue that the importers write sflow and netflow data to and that the logstash pipeline reads from."),Object(r.b)("h2",{parentName:"div",id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",{parentName:"div"},"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",{parentName:"div"},"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",{parentName:"div"},Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("p",{parentName:"div"},"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",{parentName:"div"},Object(r.b)("li",{parentName:"ul"},"The recommended heap size for typical ingestion scenarios should be no less than 4GB and no more than 8GB."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use."),Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process.")),Object(r.b)("h2",{parentName:"div",id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",{parentName:"div"},"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",{parentName:"div"},"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{parentName:"div",id:"for-data-saved-to-an-nfs-volume"},"For Data Saved to an NFS Volume"),Object(r.b)("p",{parentName:"div"},"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",{parentName:"div"},Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("p",{parentName:"div"},"Note: modifying all the paths in the two files should work, but may not. In one case, it worked to modify only the paths for the collector volumes (eg, - /mnt/nfs/netsagedata/netflow:/data), leaving all others with their default values."))),Object(r.b)("p",null,"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually.\n:::"))}d.isMDXComponent=!0},228:function(e,t,a){"use strict";a.d(t,"a",(function(){return p})),a.d(t,"b",(function(){return u}));var n=a(0),o=a.n(n);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function s(e){for(var t=1;t=0||(o[a]=e[a]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(o[a]=e[a])}return o}var c=o.a.createContext({}),d=function(e){var t=o.a.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):s(s({},t),e)),a},p=function(e){var t=d(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,r=e.originalType,i=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=d(a),h=n,u=p["".concat(i,".").concat(h)]||p[h]||m[h]||r;return a?o.a.createElement(u,s(s({ref:t},c),{},{components:a})):o.a.createElement(u,s({ref:t},c))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var r=a.length,i=new Array(r);i[0]=h;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"}," ")," ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(i.b)("inlineCode",{parentName:"p"}," ")))),Object(i.b)("h2",{id:"handy-docker-commands"},"Handy Docker Commands"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}d.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return m}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),d=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},u=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,m=p["".concat(a,".").concat(u)]||p[u]||b[u]||i;return n?r.a.createElement(m,c(c({ref:t},s),{},{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var s=2;s ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"}," ")," ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(i.b)("inlineCode",{parentName:"p"}," ")))),Object(i.b)("h2",{id:"handy-docker-commands"},"Handy Docker Commands"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}d.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return m}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function c(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),d=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},u=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,m=p["".concat(a,".").concat(u)]||p[u]||b[u]||i;return n?r.a.createElement(m,c(c({ref:t},s),{},{components:n})):r.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=u;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,a[1]=c;for(var s=2;s=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),p=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},b=function(e){var t=p(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),b=p(n),m=o,d=b["".concat(i,".").concat(m)]||b[m]||u[m]||r;return n?a.a.createElement(d,c(c({ref:t},l),{},{components:n})):a.a.createElement(d,c({ref:t},l))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:o,i[1]=c;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),p=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},b=function(e){var t=p(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),b=p(n),m=o,d=b["".concat(i,".").concat(m)]||b[m]||u[m]||r;return n?a.a.createElement(d,c(c({ref:t},l),{},{components:n})):a.a.createElement(d,c({ref:t},l))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:o,i[1]=c;for(var l=2;l=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),b=o,f=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?r.a.createElement(f,l(l({ref:t},c),{},{components:n})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),b=o,f=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?r.a.createElement(f,l(l({ref:t},c),{},{components:n})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),m=r,b=p["".concat(i,".").concat(m)]||p[m]||u[m]||a;return n?o.a.createElement(b,c(c({ref:t},s),{},{components:n})):o.a.createElement(b,c({ref:t},s))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),m=r,b=p["".concat(i,".").concat(m)]||p[m]||u[m]||a;return n?o.a.createElement(b,c(c({ref:t},s),{},{components:n})):o.a.createElement(b,c({ref:t},s))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),d=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=d(n),p=i,h=u["".concat(s,".").concat(p)]||u[p]||f[p]||a;return n?o.a.createElement(h,r(r({ref:t},l),{},{components:n})):o.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,s=new Array(a);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),d=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),u=d(n),p=i,h=u["".concat(s,".").concat(p)]||u[p]||f[p]||a;return n?o.a.createElement(h,r(r({ref:t},l),{},{components:n})):o.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,s=new Array(a);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),d=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=d(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),b=o,m=u["".concat(i,".").concat(b)]||u[b]||p[b]||a;return n?r.a.createElement(m,l(l({ref:t},c),{},{components:n})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),d=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=d(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),b=o,m=u["".concat(i,".").concat(b)]||u[b]||p[b]||a;return n?r.a.createElement(m,l(l({ref:t},c),{},{components:n})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),d=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=d(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),b=o,m=u["".concat(i,".").concat(b)]||u[b]||p[b]||a;return n?r.a.createElement(m,l(l({ref:t},c),{},{components:n})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),u=o,m=d["".concat(i,".").concat(u)]||d[u]||b[u]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),u=o,m=d["".concat(i,".").concat(u)]||d[u]||b[u]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),l=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=l(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||a;return n?o.a.createElement(m,s(s({ref:t},c),{},{components:n})):o.a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),l=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=l(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||a;return n?o.a.createElement(m,s(s({ref:t},c),{},{components:n})):o.a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(o),b=n,f=d["".concat(a,".").concat(b)]||d[b]||p[b]||i;return o?r.a.createElement(f,l(l({ref:t},c),{},{components:o})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(o),b=n,f=d["".concat(a,".").concat(b)]||d[b]||p[b]||i;return o?r.a.createElement(f,l(l({ref:t},c),{},{components:o})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,s(s({ref:t},p),{},{components:n})):a.a.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),l=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(n),b=r,f=u["".concat(o,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(f,s(s({ref:t},c),{},{components:n})):a.a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=b;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),l=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(n),b=r,f=u["".concat(o,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(f,s(s({ref:t},c),{},{components:n})):a.a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=b;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var c=2;c ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")))),Object(i.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),b=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=b(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=b(n),d=o,h=p["".concat(a,".").concat(d)]||p[d]||u[d]||i;return n?r.a.createElement(h,l(l({ref:t},c),{},{components:n})):r.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,a[1]=l;for(var c=2;c ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")))),Object(i.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),b=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=b(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=b(n),d=o,h=p["".concat(a,".").concat(d)]||p[d]||u[d]||i;return n?r.a.createElement(h,l(l({ref:t},c),{},{components:n})):r.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,a[1]=l;for(var c=2;c=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},d=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(o),b=n,f=d["".concat(a,".").concat(b)]||d[b]||p[b]||i;return o?r.a.createElement(f,l(l({ref:t},c),{},{components:o})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,a[1]=l;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=a.a.createContext({}),p=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=p(n),b=o,h=d["".concat(r,".").concat(b)]||d[b]||m[b]||i;return n?a.a.createElement(h,l(l({ref:t},s),{},{components:n})):a.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=b;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,r[1]=l;for(var s=2;s=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=a.a.createContext({}),p=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(s.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=p(n),b=o,h=d["".concat(r,".").concat(b)]||d[b]||m[b]||i;return n?a.a.createElement(h,l(l({ref:t},s),{},{components:n})):a.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=b;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,r[1]=l;for(var s=2;s=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),p=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},b=function(e){var t=p(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),b=p(n),m=o,d=b["".concat(i,".").concat(m)]||b[m]||u[m]||r;return n?a.a.createElement(d,s(s({ref:t},l),{},{components:n})):a.a.createElement(d,s({ref:t},l))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),p=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},b=function(e){var t=p(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),b=p(n),m=o,d=b["".concat(i,".").concat(m)]||b[m]||u[m]||r;return n?a.a.createElement(d,s(s({ref:t},l),{},{components:n})):a.a.createElement(d,s({ref:t},l))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),p=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},b=function(e){var t=p(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),b=p(n),m=o,d=b["".concat(i,".").concat(m)]||b[m]||u[m]||r;return n?a.a.createElement(d,s(s({ref:t},l),{},{components:n})):a.a.createElement(d,s({ref:t},l))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),p=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},b=function(e){var t=p(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},m=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),b=p(n),m=o,d=b["".concat(i,".").concat(m)]||b[m]||u[m]||r;return n?a.a.createElement(d,s(s({ref:t},l),{},{components:n})):a.a.createElement(d,s({ref:t},l))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=m;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),p=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},s=function(t){var e=p(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),s=p(a),o=n,u=s["".concat(b,".").concat(o)]||s[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,l(l({ref:t},s),{},{components:n})):o.a.createElement(m,l({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),d=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||a;return n?o.a.createElement(h,r(r({ref:t},c),{},{components:n})):o.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,s=new Array(a);s[0]=p;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),d=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||a;return n?o.a.createElement(h,r(r({ref:t},c),{},{components:n})):o.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,s=new Array(a);s[0]=p;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var c=2;c ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Comment out the ",Object(a.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(a.b)("inlineCode",{parentName:"p"}," ")," ",Object(a.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(a.b)("inlineCode",{parentName:"p"}," ")))),Object(a.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(a.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(a.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(a.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(a.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),b=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=b(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=b(n),d=o,h=u["".concat(i,".").concat(d)]||u[d]||p[d]||a;return n?r.a.createElement(h,l(l({ref:t},s),{},{components:n})):r.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Comment out the ",Object(a.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(a.b)("inlineCode",{parentName:"p"}," ")," ",Object(a.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(a.b)("inlineCode",{parentName:"p"}," ")))),Object(a.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(a.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(a.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(a.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(a.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),b=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=b(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=b(n),d=o,h=u["".concat(i,".").concat(d)]||u[d]||p[d]||a;return n?r.a.createElement(h,l(l({ref:t},s),{},{components:n})):r.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=r,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=f;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=r,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=f;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Comment out the ",Object(a.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(a.b)("inlineCode",{parentName:"p"}," ")," ",Object(a.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(a.b)("inlineCode",{parentName:"p"}," ")))),Object(a.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(a.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(a.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(a.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(a.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),b=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=b(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=b(n),d=o,h=u["".concat(i,".").concat(d)]||u[d]||p[d]||a;return n?r.a.createElement(h,l(l({ref:t},s),{},{components:n})):r.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(a.b)("ol",{start:2},Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Comment out the ",Object(a.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(a.b)("li",{parentName:"ol"},Object(a.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(a.b)("inlineCode",{parentName:"p"}," ")," ",Object(a.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")," ",Object(a.b)("inlineCode",{parentName:"p"}," ")))),Object(a.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(a.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(a.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(a.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(a.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var s=r.a.createContext({}),b=function(e){var t=r.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=b(e.components);return r.a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),u=b(n),d=o,h=u["".concat(i,".").concat(d)]||u[d]||p[d]||a;return n?r.a.createElement(h,l(l({ref:t},s),{},{components:n})):r.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),u=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},c),{},{components:n})):a.a.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),u=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},c),{},{components:n})):a.a.createElement(h,s({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),d=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},l),{},{components:n})):a.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h4",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique. E.g.,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=MyNet Los Angeles sFlow\n")),Object(r.b)("h4",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but only those using a particular interface are relevant, use this option in the .env file. The collectors and importer will save/read all incoming flows, but the logstash pipeline will drop those that do not have src_ifindex OR dst_inindex equal to one of those listed. "),Object(r.b)("p",null,"In the .env file, uncomment lines in the appropriate section and enter the information required. Be sure ",Object(r.b)("inlineCode",{parentName:"p"},"ifindex_filter_flag=True"),' with "True" capitalized as shown, any sensor names are spelled exactly right, and list all the ifindex values of flows that should be kept and processed. Some examples (use just one!):'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_keep=123\nifindex_filter_keep=123,456\nifindex_filter_keep=Sensor 1: 789\nifindex_filter_keep=123; Sensor 1: 789; Sensor 2: 800, 900\n")),Object(r.b)("p",null,"In the first case, all flows that have src_ifindex = 123 or dst_ifindex = 123 will be kept, regardless of sensor name. (Note that this may be a problem if you have more than 1 sensor with the same ifindex values!)\nIn the 2nd case, if src or dst ifindex is 123 or 456, the flow will be processed.\nIn the 3rd case, only flows from Sensor 1 will be filtered, with flows using ifindex 789 kept.\nIn the last example, any flow with ifindex 123 will be kept. Sensor 1 flows with ifindex 789 (or 123) will be kept, and those from Sensor 2 having ifindex 800 or 900 (or 123) will be kept. "),Object(r.b)("p",null,"Spaces don't matter except within the sensor names. Punctuation is required as shown."),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to keep all flows from a certain sensor but differentiate between those that enter or exit through specific sensor interfaces. This can be done by using this option in the .env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that use interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker and only 1 ifindex is allowed.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, corrections have to be applied. For example, if you are sampling 1 out of 100 flows, for each flow measured, it is assumed that in reality there would be 100 flows of that size with that src and dst, so the number of bits (and the number of packets, bits/s and packets/s) is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config, if nfsen is being used, or the nfcapd command, but this is not convenient when using Docker. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. The same correction applies to all listed sensors. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk doesn't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 1 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 1\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-save-flow-data-to-a-different-location"},"To Save Flow Data to a Different Location"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data/ directory (ie, the data/ directory in the git checkout). If you would like to use a different location, there are two options."),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"The best solution is to create a symlink between ./data/ and the preferred location, or, for an NFS volume, export it as ${PROJECT_DIR}/data.")),Object(r.b)("p",null,"During installation, delete the data/ directory (it should only contain .placeholder), then create your symlink. Eg, to use /var/netsage/ instead of data/, "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cd {netsage-pipeline dir}\nmkdir /var/netsage\nrm data/.placeholder\nrmdir data\nln -s /var/netsage {netsage-pipeline dir}/data\n")),Object(r.b)("p",null,"(Check the permissions of the directory.)"),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},"Alternatively, update volumes in docker-compose.yml and docker-compose.override.yml Eg, to save nfcapd files to subdirs in /mydir, set the collector volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir/input_data/netflow:/data")," (similarly for sflow) and set the importer and logstash volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir:/data"),". ")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict or be wiped out on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If cpu or memory seems to be a problem, try increasing the JVM heap size for logstash from 2GB to 3 or 4, no more than 8."),Object(r.b)("p",null,"To do this, edit LS_JAVA_OPTS in the .env file. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"LS_JAVA_OPTS=-Xmx4g -Xms4g\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use.")),Object(r.b)("p",null,"To modify other logstash settings, rename the provided example file for JVM Options and tweak the settings as desired:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")))}d.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,h=p["".concat(i,".").concat(u)]||p[u]||m[u]||r;return n?a.a.createElement(h,l(l({ref:t},c),{},{components:n})):a.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c\n /path/to/flow-files\n hostname.tld\n\x3c!-- "instance" goes along with sensor\n This is to identify various instances if a sensor has more than one "stream" / data collection\n Defaults to 0.\n 1\n--\x3e\n \x3c!--\n Defaults to sensor, but you can set it to something else here\n \n --\x3e\n \x3c!--\n Flow type: type of flow data (defaults to netflow)\n --\x3e\n \x3c!--\n sflow\n --\x3e\n\n')),Object(a.b)("p",null,"Notice that ",Object(a.b)("inlineCode",{parentName:"p"},"instance")," , ",Object(a.b)("inlineCode",{parentName:"p"},"router-address")," , and ",Object(a.b)("inlineCode",{parentName:"p"},"flow-type")," are commented out. You only need these if you need an something other than the default values, as described in the comments in the default shared config file."),Object(a.b)("p",null,"You can have multiple ",Object(a.b)("inlineCode",{parentName:"p"},"collection")," stanzas, to import multiple collections on one host."),Object(a.b)("p",null,"The shared config looks like this. Note that RabbitMQ connection information is listed, but not the queue or channel, as these will vary per daemon. If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here. Note that you will need to change the rabbit_output for the Finished Flow Mover Daemon regardless (see below)."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"\n \n /path/to/flow-files1\n hostname1.tld\n \n \n /path/to/flow-files2\n hostname2.tld\n \n\n \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n")),Object(a.b)("h3",{id:"configuring-the-pipeline-stages"},"Configuring the Pipeline Stages"),Object(a.b)("p",null,"Each stage must be configured with Rabbit input and output queue information. The intention here is that flows should be deidentified before they leave the original node the flow data is collected on. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(a.b)("p",null,'The username/password are both set to "guest" by default, as this is the default provided by RabbitMQ. This works fine if the localhost is processing all the data. The configs look something like this (some have additional sections).'),Object(a.b)("p",null,"Notice that the only Rabbit connection information that's provided here is that which is not specific in the shared config file. This way if we need to change the credentials throughout the entire pipeline, it's easy to do."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-xml"}," \n \x3c!-- rabbitmq connection info --\x3e\n \n netsage_deidentifier_raw\n 2\n \n \n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n netsage_deidentifier_cached\n 3\n \n \n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n \x3c!-- for stitching, we can only use 1 --\x3e\n 1\n \n \x3c!-- where should we write the cache worker pid file to --\x3e\n /var/run/netsage-cache-workers.pid\n \n \n \n")),Object(a.b)("p",null,"The defaults should work unless the pipeline stages need to be reordered for some reason, or if SSL or different hosts/credentials are needed. However, the very endpoints should be checked. At the moment that means the flow cache (which is the first stage in the pipeline) and the flow mover (the last stage)."),Object(a.b)("h3",{id:"shared-config-file-listing"},"Shared config file listing"),Object(a.b)("p",null,"The shared configuration files and logging configuration files are listed below (all of the pipeline components use these):"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"/etc/grnoc/netsage/deidentifier/netsage_shared.xml - Shared config file allowing configuration of collections, and Rabbit connection information\n/etc/grnoc/netsage/deidentifier/logging.conf - logging config\n/etc/grnoc/netsage/deidentifier/logging-debug.conf - logging config with debug enabled\n")),Object(a.b)("h2",{id:"running-the-daemons"},"Running the daemons"),Object(a.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(a.b)("p",null,"For more details on each individual daemon, use the ",Object(a.b)("inlineCode",{parentName:"p"},"--help")," flag."),Object(a.b)("h3",{id:"daemon-listing"},"Daemon Listing"),Object(a.b)("h4",{id:"netsage-netflow-importer-daemon"},"netsage-netflow-importer-daemon"),Object(a.b)("p",null,"This is a daemon that reads raw netflow data, reads it, and pushes it to a Rabbit queue for processing."),Object(a.b)("p",null,"Config file: ",Object(a.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")," "),Object(a.b)("h2",{id:"setup-notes"},"Setup Notes"),Object(a.b)("p",null,"INPUT AND OUTPUT LOGSTASH FILTERS\nStandard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs (01-inputs.conf and 99-outputs.conf) may be modified for your use.\nTo use the provided 01-inputs.conf and 99-outputs.conf versions, fill in the IP of the final rabbit host in 99-outputs.conf, and put the rabbitmq usernames and passwords into the logstash keystore.\nYour 01 and 99 conf files should not be overwritten by upgrades."),Object(a.b)("p",null,"To set up the keystore: (note that logstash-keystore takes a minute to come back with a prompt)\nBe sure /usr/share/logstash/config exists\n(the full path, in case you need it: /usr/share/logstash/bin/logstash-keystore)\nCreate logstash.keystore in /etc/logstash/: (use the same directory as logstash.yml)"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"}," $ sudo -E logstash-keystore --path.settings /etc/logstash/ create\n You can set a password for the keystore itself if you want to investigate that; otherwise skip it.\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_pw (enter password when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_pw (enter password when prompted)\n```sh\nTo list the keys:\n")),Object(a.b)("p",null," $ sudo -E logstash-keystore list"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"To remove a key-value pair:\n\n```sh\n $ sudo -E logstash-keystore remove \n")),Object(a.b)("p",null,'FLOW STITCHING - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml (default settingss) and/or /etc/logstash/pipelines.yml (settings take precedence). When running logstash on the command line, use "-w 1".'),Object(a.b)("p",null,"See the comments in 04-stitching.conf to learn more about how complete flows are defined."))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var o=n(0),i=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=i.a.createContext({}),p=function(e){var t=i.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},h=i.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),h=o,b=u["".concat(s,".").concat(h)]||u[h]||d[h]||a;return n?i.a.createElement(b,r(r({ref:t},c),{},{components:n})):i.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=h;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:o,s[1]=r;for(var c=2;c\n /path/to/flow-files\n hostname.tld\n\x3c!-- "instance" goes along with sensor\n This is to identify various instances if a sensor has more than one "stream" / data collection\n Defaults to 0.\n 1\n--\x3e\n \x3c!--\n Defaults to sensor, but you can set it to something else here\n \n --\x3e\n \x3c!--\n Flow type: type of flow data (defaults to netflow)\n --\x3e\n \x3c!--\n sflow\n --\x3e\n\n')),Object(a.b)("p",null,"Notice that ",Object(a.b)("inlineCode",{parentName:"p"},"instance")," , ",Object(a.b)("inlineCode",{parentName:"p"},"router-address")," , and ",Object(a.b)("inlineCode",{parentName:"p"},"flow-type")," are commented out. You only need these if you need an something other than the default values, as described in the comments in the default shared config file."),Object(a.b)("p",null,"You can have multiple ",Object(a.b)("inlineCode",{parentName:"p"},"collection")," stanzas, to import multiple collections on one host."),Object(a.b)("p",null,"The shared config looks like this. Note that RabbitMQ connection information is listed, but not the queue or channel, as these will vary per daemon. If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here. Note that you will need to change the rabbit_output for the Finished Flow Mover Daemon regardless (see below)."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"\n \n /path/to/flow-files1\n hostname1.tld\n \n \n /path/to/flow-files2\n hostname2.tld\n \n\n \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n")),Object(a.b)("h3",{id:"configuring-the-pipeline-stages"},"Configuring the Pipeline Stages"),Object(a.b)("p",null,"Each stage must be configured with Rabbit input and output queue information. The intention here is that flows should be deidentified before they leave the original node the flow data is collected on. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(a.b)("p",null,'The username/password are both set to "guest" by default, as this is the default provided by RabbitMQ. This works fine if the localhost is processing all the data. The configs look something like this (some have additional sections).'),Object(a.b)("p",null,"Notice that the only Rabbit connection information that's provided here is that which is not specific in the shared config file. This way if we need to change the credentials throughout the entire pipeline, it's easy to do."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-xml"}," \n \x3c!-- rabbitmq connection info --\x3e\n \n netsage_deidentifier_raw\n 2\n \n \n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n netsage_deidentifier_cached\n 3\n \n \n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n \x3c!-- for stitching, we can only use 1 --\x3e\n 1\n \n \x3c!-- where should we write the cache worker pid file to --\x3e\n /var/run/netsage-cache-workers.pid\n \n \n \n")),Object(a.b)("p",null,"The defaults should work unless the pipeline stages need to be reordered for some reason, or if SSL or different hosts/credentials are needed. However, the very endpoints should be checked. At the moment that means the flow cache (which is the first stage in the pipeline) and the flow mover (the last stage)."),Object(a.b)("h3",{id:"shared-config-file-listing"},"Shared config file listing"),Object(a.b)("p",null,"The shared configuration files and logging configuration files are listed below (all of the pipeline components use these):"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"/etc/grnoc/netsage/deidentifier/netsage_shared.xml - Shared config file allowing configuration of collections, and Rabbit connection information\n/etc/grnoc/netsage/deidentifier/logging.conf - logging config\n/etc/grnoc/netsage/deidentifier/logging-debug.conf - logging config with debug enabled\n")),Object(a.b)("h2",{id:"running-the-daemons"},"Running the daemons"),Object(a.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(a.b)("p",null,"For more details on each individual daemon, use the ",Object(a.b)("inlineCode",{parentName:"p"},"--help")," flag."),Object(a.b)("h3",{id:"daemon-listing"},"Daemon Listing"),Object(a.b)("h4",{id:"netsage-netflow-importer-daemon"},"netsage-netflow-importer-daemon"),Object(a.b)("p",null,"This is a daemon that reads raw netflow data, reads it, and pushes it to a Rabbit queue for processing."),Object(a.b)("p",null,"Config file: ",Object(a.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")," "),Object(a.b)("h2",{id:"setup-notes"},"Setup Notes"),Object(a.b)("p",null,"INPUT AND OUTPUT LOGSTASH FILTERS\nStandard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs (01-inputs.conf and 99-outputs.conf) may be modified for your use.\nTo use the provided 01-inputs.conf and 99-outputs.conf versions, fill in the IP of the final rabbit host in 99-outputs.conf, and put the rabbitmq usernames and passwords into the logstash keystore.\nYour 01 and 99 conf files should not be overwritten by upgrades."),Object(a.b)("p",null,"To set up the keystore: (note that logstash-keystore takes a minute to come back with a prompt)\nBe sure /usr/share/logstash/config exists\n(the full path, in case you need it: /usr/share/logstash/bin/logstash-keystore)\nCreate logstash.keystore in /etc/logstash/: (use the same directory as logstash.yml)"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"}," $ sudo -E logstash-keystore --path.settings /etc/logstash/ create\n You can set a password for the keystore itself if you want to investigate that; otherwise skip it.\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_pw (enter password when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_pw (enter password when prompted)\n```sh\nTo list the keys:\n")),Object(a.b)("p",null," $ sudo -E logstash-keystore list"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"To remove a key-value pair:\n\n```sh\n $ sudo -E logstash-keystore remove \n")),Object(a.b)("p",null,'FLOW STITCHING - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml (default settingss) and/or /etc/logstash/pipelines.yml (settings take precedence). When running logstash on the command line, use "-w 1".'),Object(a.b)("p",null,"See the comments in 04-stitching.conf to learn more about how complete flows are defined."))}p.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var o=n(0),i=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=i.a.createContext({}),p=function(e){var t=i.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},h=i.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),h=o,b=u["".concat(s,".").concat(h)]||u[h]||d[h]||a;return n?i.a.createElement(b,r(r({ref:t},c),{},{components:n})):i.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=h;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:o,s[1]=r;for(var c=2;c"),' replace "tag name" with v1.2.5 or the version you intend to use.'),Object(r.b)("li",{parentName:"ul"},"Please select the version you wish to use using ",Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh"),"\nit is HIGHLY recommended to not use the :latest as that is intended to be a developer release. You may still use it but be aware that you may have some instability each time you update.")))),Object(r.b)("h3",{id:"environment-file"},"Environment file"),Object(r.b)("p",null,"Please make a copy of the .env and refer back to the docker ",Object(r.b)("a",{parentName:"p",href:"../devel/docker"},"dev guide")," on details on configuring the env. Most of the default value should work just fine."),Object(r.b)("p",null,"The only major change you should be aware of are the following values. The output host defines where the final data will land. The sensorName defines what the data will be labeled as."),Object(r.b)("p",null,"If you don't send a sensor name it'll use the default docker hostname which changes each time you run the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"rabbitmq_output_host=rabbit\nrabbitmq_output_username=guest\nrabbitmq_output_pw=guest\nrabbitmq_output_key=netsage_archive_input\n\nsflowSensorName=sflowSensorName\nnetflowSensorName=netflowSensorName\n\n")),Object(r.b)("p",null,"Please note, the default is to have one netflow collector and one sflow collector. If you need more collectors or do no need netflow or sflow simply comment out the collector you wish to ignore."),Object(r.b)("h3",{id:"bringing-up-the-pipeline"},"Bringing up the Pipeline"),Object(r.b)("p",null,"Starting up the pipeline using:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d\n")),Object(r.b)("p",null,"You can check the logs for each of the container by running"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs\n")),Object(r.b)("h3",{id:"shutting-down-the-pipeline"},"Shutting Down the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose down\n")),Object(r.b)("h3",{id:"advanced-configuration"},"Advanced Configuration"),Object(r.b)("p",null,"The pipeline allows to have as many collectors as desired. You should have a unique sensorName ENV variable for each type and a unique path where data is being delivered."),Object(r.b)("p",null,"By convention everything is being written to ./data/input_data/sensorName You may change that behavior but just ensure the path between the colle"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Copy the compose/importer/netsage_shared.xml to userConfig/ and name it netsage_override.xml"),Object(r.b)("li",{parentName:"ol"},"In the docker-compose.yml uncomment the following line from the importer configuration.")),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n\n")),Object(r.b)("p",null,"This will use the ",Object(r.b)("inlineCode",{parentName:"p"},"netsage_override.xml")," in the userConfig instead of the container settings."),Object(r.b)("ol",{start:3},Object(r.b)("li",{parentName:"ol"},"Update collectors.")),Object(r.b)("p",null,"You may add as many new collectors as you like just ensure the following is unique:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yml"},' example-collector:\n image: netsage/nfdump-collector:1.6.18\n command: nfcapd -T all -l /data -S 1 -w -z -p 9999\n ports:\n\n - "9999:9999/udp"\n\n restart: always\n volumes:\n\n - ./data/input_data/example:/data\n\n')),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"The command call should be updated. nfcapd for netflow, sfcapd for sflow")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"The output under volumes needs to be unique. Replace /example with the appropriate value")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"Make sure to update the port. The UDP port has to be unique. Please update the command and port mapping. "),Object(r.b)("p",{parentName:"li"},"Technically you don't need to change to port of the command, but make sure you use the correct pattern when mapping the new settings."))),Object(r.b)("p",null,"Example: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yml"},'ports:\n\n - "9999:4321/udp"\n\n')),Object(r.b)("p",null,"The first port is the port on your host, the second port is the port on your local machine. "),Object(r.b)("ol",{start:4},Object(r.b)("li",{parentName:"ol"},"Update the netsage_override.xml and add a new entry for the collector you're adding under the config section.")),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n /data/input_data/example\n $exampleSensorName \n sflow\n \n\n")),Object(r.b)("ol",{start:5},Object(r.b)("li",{parentName:"ol"},"Update the environment file.")),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=example\n")),Object(r.b)("ol",{start:6},Object(r.b)("li",{parentName:"ol"},"At this point, please update the router configuration to send data to the new port you've defined. If the new collector is listening on 0.0.0.0:1234/udp then all traffic you wish grouped under ")),Object(r.b)("p",null,"the new sensor should be send to 1234/udp. "),Object(r.b)("p",null,"You will need to repeat steps 3-6 for each collector you're adding. For each new configuration the path, sensorName and exposed port have to be unique. Besides that, there is no limit\noutside of the bounds of the host's resources to how many collectors you may run."),Object(r.b)("h3",{id:"kibana-and-elastic-search"},"Kibana and Elastic Search"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be found in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"troubleshooting"},"Troubleshooting"),Object(r.b)("h3",{id:"data-flow-issues"},"Data Flow issues:"),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Troubleshooting checklist:")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Make sure you configured your routers to point to the correct address/port where the collector is running.\xa0 hostname:9999 is the default."),Object(r.b)("li",{parentName:"ul"},"Make sure you created a .env file and updated the settings accordingly."),Object(r.b)("li",{parentName:"ul"},"sensorName especially since that identifies the source of the data.\xa0"),Object(r.b)("li",{parentName:"ul"},"check the logs of the various components to see if anything jumps out as being invalid.\xa0 docker-compose logs -f ")),Object(r.b)("h3",{id:"resource-limitations"},"Resource Limitations"),Object(r.b)("p",null,"If you are running a lot of data sometimes docker may need to be allocated more memory."),Object(r.b)("p",null,"Applying this snippet to logstash may help. Naturally the values will have to change."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"environment:\n\n + LS_JAVA_OPTS=-Xmx3g\n\n")),Object(r.b)("p",null,"Alternatively you may also try doing this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},'deploy:\n resources:\n limits:\n cpus: "0.50"\n memory: 50M\n reservations:\n cpus: "0.25"\n memory: 20M\n')),Object(r.b)("p",null,"Reference: ",Object(r.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/compose-file/#resources"},"https://docs.docker.com/compose/compose-file/#resources")),Object(r.b)("h2",{id:"upgrading"},"Upgrading"),Object(r.b)("h3",{id:"update-source-code"},"Update Source Code"),Object(r.b)("p",null,"If your only changes are the version you selected simply reset and discard your changes."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git reset --hard\n")),Object(r.b)("h4",{id:"development"},"Development"),Object(r.b)("p",null,"Update the git repo. Likely this won't change anything but it's always a good practice to have the latest version. You will need to do at least a git fetch in order to see the latest tags."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git pull origin master\n")),Object(r.b)("h4",{id:"release"},"Release"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"git checkout (ie. v1.2.6, v1.2.7 etc)"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh")," select the same version as the tag you checked out.")),Object(r.b)("h3",{id:"update-docker-containers"},"Update docker containers"),Object(r.b)("p",null,"This applies for both development and release"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"docker-compose pull\n")))}u.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=a.a.createContext({}),u=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return a.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=u(n),b=o,h=p["".concat(l,".").concat(b)]||p[b]||d[b]||r;return n?a.a.createElement(h,i(i({ref:t},s),{},{components:n})):a.a.createElement(h,i({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=b;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:o,l[1]=i;for(var s=2;s"),' replace "tag name" with v1.2.5 or the version you intend to use.'),Object(r.b)("li",{parentName:"ul"},"Please select the version you wish to use using ",Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh"),"\nit is HIGHLY recommended to not use the :latest as that is intended to be a developer release. You may still use it but be aware that you may have some instability each time you update.")))),Object(r.b)("h3",{id:"environment-file"},"Environment file"),Object(r.b)("p",null,"Please make a copy of the .env and refer back to the docker ",Object(r.b)("a",{parentName:"p",href:"../devel/docker"},"dev guide")," on details on configuring the env. Most of the default value should work just fine."),Object(r.b)("p",null,"The only major change you should be aware of are the following values. The output host defines where the final data will land. The sensorName defines what the data will be labeled as."),Object(r.b)("p",null,"If you don't send a sensor name it'll use the default docker hostname which changes each time you run the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"rabbitmq_output_host=rabbit\nrabbitmq_output_username=guest\nrabbitmq_output_pw=guest\nrabbitmq_output_key=netsage_archive_input\n\nsflowSensorName=sflowSensorName\nnetflowSensorName=netflowSensorName\n\n")),Object(r.b)("p",null,"Please note, the default is to have one netflow collector and one sflow collector. If you need more collectors or do no need netflow or sflow simply comment out the collector you wish to ignore."),Object(r.b)("h3",{id:"bringing-up-the-pipeline"},"Bringing up the Pipeline"),Object(r.b)("p",null,"Starting up the pipeline using:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d\n")),Object(r.b)("p",null,"You can check the logs for each of the container by running"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs\n")),Object(r.b)("h3",{id:"shutting-down-the-pipeline"},"Shutting Down the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose down\n")),Object(r.b)("h3",{id:"advanced-configuration"},"Advanced Configuration"),Object(r.b)("p",null,"The pipeline allows to have as many collectors as desired. You should have a unique sensorName ENV variable for each type and a unique path where data is being delivered."),Object(r.b)("p",null,"By convention everything is being written to ./data/input_data/sensorName You may change that behavior but just ensure the path between the colle"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"Copy the compose/importer/netsage_shared.xml to userConfig/ and name it netsage_override.xml"),Object(r.b)("li",{parentName:"ol"},"In the docker-compose.yml uncomment the following line from the importer configuration.")),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n\n")),Object(r.b)("p",null,"This will use the ",Object(r.b)("inlineCode",{parentName:"p"},"netsage_override.xml")," in the userConfig instead of the container settings."),Object(r.b)("ol",{start:3},Object(r.b)("li",{parentName:"ol"},"Update collectors.")),Object(r.b)("p",null,"You may add as many new collectors as you like just ensure the following is unique:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yml"},' example-collector:\n image: netsage/nfdump-collector:1.6.18\n command: nfcapd -T all -l /data -S 1 -w -z -p 9999\n ports:\n\n - "9999:9999/udp"\n\n restart: always\n volumes:\n\n - ./data/input_data/example:/data\n\n')),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"The command call should be updated. nfcapd for netflow, sfcapd for sflow")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"The output under volumes needs to be unique. Replace /example with the appropriate value")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"Make sure to update the port. The UDP port has to be unique. Please update the command and port mapping. "),Object(r.b)("p",{parentName:"li"},"Technically you don't need to change to port of the command, but make sure you use the correct pattern when mapping the new settings."))),Object(r.b)("p",null,"Example: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yml"},'ports:\n\n - "9999:4321/udp"\n\n')),Object(r.b)("p",null,"The first port is the port on your host, the second port is the port on your local machine. "),Object(r.b)("ol",{start:4},Object(r.b)("li",{parentName:"ol"},"Update the netsage_override.xml and add a new entry for the collector you're adding under the config section.")),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n /data/input_data/example\n $exampleSensorName \n sflow\n \n\n")),Object(r.b)("ol",{start:5},Object(r.b)("li",{parentName:"ol"},"Update the environment file.")),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=example\n")),Object(r.b)("ol",{start:6},Object(r.b)("li",{parentName:"ol"},"At this point, please update the router configuration to send data to the new port you've defined. If the new collector is listening on 0.0.0.0:1234/udp then all traffic you wish grouped under ")),Object(r.b)("p",null,"the new sensor should be send to 1234/udp. "),Object(r.b)("p",null,"You will need to repeat steps 3-6 for each collector you're adding. For each new configuration the path, sensorName and exposed port have to be unique. Besides that, there is no limit\noutside of the bounds of the host's resources to how many collectors you may run."),Object(r.b)("h3",{id:"kibana-and-elastic-search"},"Kibana and Elastic Search"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be found in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"troubleshooting"},"Troubleshooting"),Object(r.b)("h3",{id:"data-flow-issues"},"Data Flow issues:"),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Troubleshooting checklist:")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Make sure you configured your routers to point to the correct address/port where the collector is running.\xa0 hostname:9999 is the default."),Object(r.b)("li",{parentName:"ul"},"Make sure you created a .env file and updated the settings accordingly."),Object(r.b)("li",{parentName:"ul"},"sensorName especially since that identifies the source of the data.\xa0"),Object(r.b)("li",{parentName:"ul"},"check the logs of the various components to see if anything jumps out as being invalid.\xa0 docker-compose logs -f ")),Object(r.b)("h3",{id:"resource-limitations"},"Resource Limitations"),Object(r.b)("p",null,"If you are running a lot of data sometimes docker may need to be allocated more memory."),Object(r.b)("p",null,"Applying this snippet to logstash may help. Naturally the values will have to change."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"environment:\n\n + LS_JAVA_OPTS=-Xmx3g\n\n")),Object(r.b)("p",null,"Alternatively you may also try doing this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},'deploy:\n resources:\n limits:\n cpus: "0.50"\n memory: 50M\n reservations:\n cpus: "0.25"\n memory: 20M\n')),Object(r.b)("p",null,"Reference: ",Object(r.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/compose-file/#resources"},"https://docs.docker.com/compose/compose-file/#resources")),Object(r.b)("h2",{id:"upgrading"},"Upgrading"),Object(r.b)("h3",{id:"update-source-code"},"Update Source Code"),Object(r.b)("p",null,"If your only changes are the version you selected simply reset and discard your changes."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git reset --hard\n")),Object(r.b)("h4",{id:"development"},"Development"),Object(r.b)("p",null,"Update the git repo. Likely this won't change anything but it's always a good practice to have the latest version. You will need to do at least a git fetch in order to see the latest tags."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git pull origin master\n")),Object(r.b)("h4",{id:"release"},"Release"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"git checkout (ie. v1.2.6, v1.2.7 etc)"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh")," select the same version as the tag you checked out.")),Object(r.b)("h3",{id:"update-docker-containers"},"Update docker containers"),Object(r.b)("p",null,"This applies for both development and release"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"docker-compose pull\n")))}u.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=a.a.createContext({}),u=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=u(e.components);return a.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=u(n),b=o,h=p["".concat(l,".").concat(b)]||p[b]||d[b]||r;return n?a.a.createElement(h,i(i({ref:t},s),{},{components:n})):a.a.createElement(h,i({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=b;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:o,l[1]=i;for(var s=2;s"),' replace "tag name" with v1.2.5 or the version you intend to use.'),Object(r.b)("li",{parentName:"ul"},"Please select the version you wish to use using ",Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh"),"\nit is HIGHLY recommended to not use the :latest as that is intended to be a developer release. You may still use it but be aware that you may have some instability each time you update.")))),Object(r.b)("h3",{id:"environment-file"},"Environment file"),Object(r.b)("p",null,"Please make a copy of the .env and refer back to the docker ",Object(r.b)("a",{parentName:"p",href:"../devel/docker"},"dev guide")," on details on configuring the env. Most of the default value should work just fine."),Object(r.b)("p",null,"The only major change you should be aware of are the following values. The output host defines where the final data will land. The sensorName defines what the data will be labeled as."),Object(r.b)("p",null,"If you don't send a sensor name it'll use the default docker hostname which changes each time you run the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"rabbitmq_output_host=rabbit\nrabbitmq_output_username=guest\nrabbitmq_output_pw=guest\nrabbitmq_output_key=netsage_archive_input\n\nsensorName=bestSensorEver\n\n")),Object(r.b)("h3",{id:"bringing-up-the-pipeline"},"Bringing up the Pipeline"),Object(r.b)("p",null,"Starting up the pipeline using:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d\n")),Object(r.b)("p",null,"You can check the logs for each of the container by running"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs\n")),Object(r.b)("h3",{id:"shutting-down-the-pipeline"},"Shutting Down the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose down\n")),Object(r.b)("h3",{id:"kibana-and-elastic-search"},"Kibana and Elastic Search"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be found in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"troubleshooting"},"Troubleshooting"),Object(r.b)("h3",{id:"data-flow-issues"},"Data Flow issues:"),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Troubleshooting checklist:")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Make sure you configured your routers to point to the correct address/port where the collector is running.\xa0 hostname:9999 is the default."),Object(r.b)("li",{parentName:"ul"},"Make sure you created a .env file and updated the settings accordingly."),Object(r.b)("li",{parentName:"ul"},"sensorName especially since that identifies the source of the data.\xa0"),Object(r.b)("li",{parentName:"ul"},"check the logs of the various components to see if anything jumps out as being invalid.\xa0 docker-compose logs -f ")),Object(r.b)("h3",{id:"resource-limitations"},"Resource Limitations"),Object(r.b)("p",null,"If you are running a lot of data sometimes docker may need to be allocated more memory."),Object(r.b)("p",null,"Applying this snippet to logstash may help. Naturally the values will have to change."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"environment:\n\n + LS_JAVA_OPTS=-Xmx3g\n\n")),Object(r.b)("p",null,"Alternatively you may also try doing this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},'deploy:\n resources:\n limits:\n cpus: "0.50"\n memory: 50M\n reservations:\n cpus: "0.25"\n memory: 20M\n')),Object(r.b)("p",null,"Reference: ",Object(r.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/compose-file/#resources"},"https://docs.docker.com/compose/compose-file/#resources")),Object(r.b)("h2",{id:"upgrading"},"Upgrading"),Object(r.b)("h3",{id:"update-source-code"},"Update Source Code"),Object(r.b)("p",null,"If your only changes are the version you selected simply reset and discard your changes."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git reset --hard\n")),Object(r.b)("h4",{id:"development"},"Development"),Object(r.b)("p",null,"Update the git repo. Likely this won't change anything but it's always a good practice to have the latest version. You will need to do at least a git fetch in order to see the latest tags."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git pull origin master\n")),Object(r.b)("h4",{id:"release"},"Release"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"git checkout (ie. v1.2.6, v1.2.7 etc)"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh")," select the same version as the tag you checked out.")),Object(r.b)("h3",{id:"update-docker-containers"},"Update docker containers"),Object(r.b)("p",null,"This applies for both development and release"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"docker-compose pull\n")))}u.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=a.a.createContext({}),u=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return a.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=u(n),b=o,h=p["".concat(i,".").concat(b)]||p[b]||d[b]||r;return n?a.a.createElement(h,l(l({ref:t},s),{},{components:n})):a.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=b;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s"),' replace "tag name" with v1.2.5 or the version you intend to use.'),Object(r.b)("li",{parentName:"ul"},"Please select the version you wish to use using ",Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh"),"\nit is HIGHLY recommended to not use the :latest as that is intended to be a developer release. You may still use it but be aware that you may have some instability each time you update.")))),Object(r.b)("h3",{id:"environment-file"},"Environment file"),Object(r.b)("p",null,"Please make a copy of the .env and refer back to the docker ",Object(r.b)("a",{parentName:"p",href:"../devel/docker"},"dev guide")," on details on configuring the env. Most of the default value should work just fine."),Object(r.b)("p",null,"The only major change you should be aware of are the following values. The output host defines where the final data will land. The sensorName defines what the data will be labeled as."),Object(r.b)("p",null,"If you don't send a sensor name it'll use the default docker hostname which changes each time you run the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"rabbitmq_output_host=rabbit\nrabbitmq_output_username=guest\nrabbitmq_output_pw=guest\nrabbitmq_output_key=netsage_archive_input\n\nsensorName=bestSensorEver\n\n")),Object(r.b)("h3",{id:"bringing-up-the-pipeline"},"Bringing up the Pipeline"),Object(r.b)("p",null,"Starting up the pipeline using:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d\n")),Object(r.b)("p",null,"You can check the logs for each of the container by running"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs\n")),Object(r.b)("h3",{id:"shutting-down-the-pipeline"},"Shutting Down the pipeline."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose down\n")),Object(r.b)("h3",{id:"kibana-and-elastic-search"},"Kibana and Elastic Search"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be found in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"troubleshooting"},"Troubleshooting"),Object(r.b)("h3",{id:"data-flow-issues"},"Data Flow issues:"),Object(r.b)("p",null,Object(r.b)("strong",{parentName:"p"},"Troubleshooting checklist:")),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Make sure you configured your routers to point to the correct address/port where the collector is running.\xa0 hostname:9999 is the default."),Object(r.b)("li",{parentName:"ul"},"Make sure you created a .env file and updated the settings accordingly."),Object(r.b)("li",{parentName:"ul"},"sensorName especially since that identifies the source of the data.\xa0"),Object(r.b)("li",{parentName:"ul"},"check the logs of the various components to see if anything jumps out as being invalid.\xa0 docker-compose logs -f ")),Object(r.b)("h3",{id:"resource-limitations"},"Resource Limitations"),Object(r.b)("p",null,"If you are running a lot of data sometimes docker may need to be allocated more memory."),Object(r.b)("p",null,"Applying this snippet to logstash may help. Naturally the values will have to change."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"environment:\n\n + LS_JAVA_OPTS=-Xmx3g\n\n")),Object(r.b)("p",null,"Alternatively you may also try doing this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},'deploy:\n resources:\n limits:\n cpus: "0.50"\n memory: 50M\n reservations:\n cpus: "0.25"\n memory: 20M\n')),Object(r.b)("p",null,"Reference: ",Object(r.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/compose-file/#resources"},"https://docs.docker.com/compose/compose-file/#resources")),Object(r.b)("h2",{id:"upgrading"},"Upgrading"),Object(r.b)("h3",{id:"update-source-code"},"Update Source Code"),Object(r.b)("p",null,"If your only changes are the version you selected simply reset and discard your changes."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git reset --hard\n")),Object(r.b)("h4",{id:"development"},"Development"),Object(r.b)("p",null,"Update the git repo. Likely this won't change anything but it's always a good practice to have the latest version. You will need to do at least a git fetch in order to see the latest tags."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"git pull origin master\n")),Object(r.b)("h4",{id:"release"},"Release"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"git checkout (ie. v1.2.6, v1.2.7 etc)"),Object(r.b)("li",{parentName:"ol"},Object(r.b)("inlineCode",{parentName:"li"},"./scripts/docker_select_version.sh")," select the same version as the tag you checked out.")),Object(r.b)("h3",{id:"update-docker-containers"},"Update docker containers"),Object(r.b)("p",null,"This applies for both development and release"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre"},"docker-compose pull\n")))}u.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=a.a.createContext({}),u=function(e){var t=a.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return a.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),p=u(n),b=o,h=p["".concat(i,".").concat(b)]||p[b]||d[b]||r;return n?a.a.createElement(h,l(l({ref:t},s),{},{components:n})):a.a.createElement(h,l({ref:t},s))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=b;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),d=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=d(n),m=r,b=p["".concat(i,".").concat(m)]||p[m]||u[m]||a;return n?o.a.createElement(b,c(c({ref:t},l),{},{components:n})):o.a.createElement(b,c({ref:t},l))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),d=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=s(e,["components","mdxType","originalType","parentName"]),p=d(n),m=r,b=p["".concat(i,".").concat(m)]||p[m]||u[m]||a;return n?o.a.createElement(b,c(c({ref:t},l),{},{components:n})):o.a.createElement(b,c({ref:t},l))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l \'localhost\'\n user => \'guest\'\n password => "${rabbitmq_pass}"\n exchange => \'netsage.direct\'\n key => XXXXXXX\'\n queue => \'netsage\'\n durable => true\n subscription_retry_interval_seconds => 5\n connection_timeout => 10000\n }\n}\nfilter {\n if [@metadata][rabbitmq_properties][timestamp] {\n date {\n match => ["[@metadata][rabbitmq_properties][timestamp]", "UNIX"]\n }\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\n "https://CHANGEME1",\n "https://CHANGEME2"\n ]\n user => "logstash"\n password => "${logstash_elasticsearch_password}"\n cacert => "/etc/logstash/ca.crt"\n index => "om-ns-netsage"\n template_overwrite => true\n failure_type_logging_whitelist => []\n action => index\n #ssl_certificate_verification => false\n }\n}\n')),Object(l.b)("p",null,"Once the data is published in elastic, you can use the ",Object(l.b)("a",{parentName:"p",href:"https://github.com/netsage-project/netsage-grafana-configs"},"grafana dashboard")," to visualize the data."),Object(l.b)("h2",{id:"elasticsearch-fields"},"Elasticsearch Fields"),Object(l.b)("h3",{id:"es-fields"},"ES fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_index"),Object(l.b)("td",{parentName:"tr",align:null},"om-ns-netsage-2020.06."),Object(l.b)("td",{parentName:"tr",align:null},"equivalent to an sql table")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_type"),Object(l.b)("td",{parentName:"tr",align:null},"_doc"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_id"),Object(l.b)("td",{parentName:"tr",align:null},"HRkcm3IByJ9fEnbnCpaY"),Object(l.b)("td",{parentName:"tr",align:null},"document id, set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_score"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES query")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@version"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")))),Object(l.b)("h3",{id:"developer-fields"},"Developer fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"type"),Object(l.b)("td",{parentName:"tr",align:null},"flow"),Object(l.b)("td",{parentName:"tr",align:null},'Always "flow" for us. Other types may be "macy", etc.')),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@injest_time"),Object(l.b)("td",{parentName:"tr",align:null},"2020-06-09T21:51:57.059Z"),Object(l.b)("td",{parentName:"tr",align:null},"Essentially time the flow went into the logstash pipeline (10-preliminaries.conf for tstat flows) or the time stitching of the flow commenced (40-aggregation.conf for others)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@timestamp"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:21.703"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow went into the logstash pipeline for tstat flows, or the time stitching finished and the event was pushed for other flows.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@exit_time"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:25.369"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow exited the pipeline (99-outputs.conf)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@processing_time"),Object(l.b)("td",{parentName:"tr",align:null},"688.31"),Object(l.b)("td",{parentName:"tr",align:null},"@exit_time minus @injest_time. Useful for seeing how long stitching took.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"stitched_flows"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"Number of flows stitched together to make this final one. 0 for tstat flows, which are always complete. 1 if no flows were stitched together.")))),Object(l.b)("h3",{id:"flow-fields"},"Flow fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"start"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:53.808"),Object(l.b)("td",{parentName:"tr",align:null},"Start time of the flow (first packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"end"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:57.699"),Object(l.b)("td",{parentName:"tr",align:null},"End time of the flow (last packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.protocol"),Object(l.b)("td",{parentName:"tr",align:null},"tcp"),Object(l.b)("td",{parentName:"tr",align:null},"Protocol used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.id"),Object(l.b)("td",{parentName:"tr",align:null},"a17c4f05420d7ded9eb151ccd293a633 ff226d1752b24e0f4139a87a8b26d779"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned flow id")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.flow_type"),Object(l.b)("td",{parentName:"tr",align:null},"sflow"),Object(l.b)("td",{parentName:"tr",align:null},"Sflow, Netflow, or Tstat")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_id"),Object(l.b)("td",{parentName:"tr",align:null},"snvl2-pw-sw-1-mgmt-2.cenic.net"),Object(l.b)("td",{parentName:"tr",align:null},"Sensor name (set in importer config, may not always be a hostname)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_group"),Object(l.b)("td",{parentName:"tr",align:null},"CENIC"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor group")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_type"),Object(l.b)("td",{parentName:"tr",align:null},"Regional Network"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor type")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.country_scope"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic, International, or Mixed, depending on countries of src and dst")))),Object(l.b)("h3",{id:"source-fields-destination-fields-similarly"},"Source Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_ip"),Object(l.b)("td",{parentName:"tr",align:null},"171.64.68.x"),Object(l.b)("td",{parentName:"tr",align:null},"deidentified IP address")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_port"),Object(l.b)("td",{parentName:"tr",align:null},"80"),Object(l.b)("td",{parentName:"tr",align:null},"port used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_asn"),Object(l.b)("td",{parentName:"tr",align:null},"32"),Object(l.b)("td",{parentName:"tr",align:null},"ASN of the IP from geoip ASN database or the ASN from the flow header")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.423"),Object(l.b)("td",{parentName:"tr",align:null},"latitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.164"),Object(l.b)("td",{parentName:"tr",align:null},"longitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_country_name"),Object(l.b)("td",{parentName:"tr",align:null},"United States"),Object(l.b)("td",{parentName:"tr",align:null},"country of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_continent"),Object(l.b)("td",{parentName:"tr",align:null},"North America"),Object(l.b)("td",{parentName:"tr",align:null},"continent of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_organization"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"organization that owns the AS of the IP from geoip ASN database")))),Object(l.b)("h3",{id:"source-science-registry-fields--destination-fields-similarly"},"Source Science Registry Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford - ImageNet"),Object(l.b)("td",{parentName:"tr",align:null},"Resource name from SciReg")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"-"),Object(l.b)("td",{parentName:"tr",align:null},"Resource abbreviation (if any)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.discipline"),Object(l.b)("td",{parentName:"tr",align:null},"CS. Intelligent Systems"),Object(l.b)("td",{parentName:"tr",align:null},"The science discipline that uses the resource (ie host). Note that not the src MAY not have the same discipline as the dst.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.role"),Object(l.b)("td",{parentName:"tr",align:null},"Storage"),Object(l.b)("td",{parentName:"tr",align:null},"Role that the host plays")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_name"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"The organization the manages and/or uses the resource, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford"),Object(l.b)("td",{parentName:"tr",align:null},"A shorter name for the organization. May not be the official abbreviation.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.projects"),Object(l.b)("td",{parentName:"tr",align:null},"."),Object(l.b)("td",{parentName:"tr",align:null},"Can be an array of projects ","[we may change this field name soon]")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.latitude"),Object(l.b)("td",{parentName:"tr",align:null},"37.4178"),Object(l.b)("td",{parentName:"tr",align:null},"Resource's location, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.longitude"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"preferred-fields"},'"Preferred" fields'),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_org"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"If the IP was found in the Science Registry, these are the SciReg values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.417800"),Object(l.b)("td",{parentName:"tr",align:null},"Otherwise, they are the geoip values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172000"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"values"},"Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_bits"),Object(l.b)("td",{parentName:"tr",align:null},"939, 458, 560"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of bits in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_packets"),Object(l.b)("td",{parentName:"tr",align:null},"77, 824"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of packets in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.duration"),Object(l.b)("td",{parentName:"tr",align:null},"3.891"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as end minus start")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.bits_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"241, 443, 988"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_bits divided by duration")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.packets_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"20, 001"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_packets divided by duration")))),Object(l.b)("h3",{id:"tstat-values"},"Tstat Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_initial_cwin"),Object(l.b)("td",{parentName:"tr",align:null},"313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_max_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"64313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_min_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_mss"),Object(l.b)("td",{parentName:"tr",align:null},"8960")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_out_seq_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_dup"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fc"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_reor"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_rto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unfs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unk"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unrto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_bytes"),Object(l.b)("td",{parentName:"tr",align:null},"1678")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_avg"),Object(l.b)("td",{parentName:"tr",align:null},"0.044")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_max"),Object(l.b)("td",{parentName:"tr",align:null},"39.527")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_min"),Object(l.b)("td",{parentName:"tr",align:null},"0.001")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_std"),Object(l.b)("td",{parentName:"tr",align:null},"0.276")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_sack_cnt"),Object(l.b)("td",{parentName:"tr",align:null},"1")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_window_scale"),Object(l.b)("td",{parentName:"tr",align:null},"13")))))}s.isMDXComponent=!0},232:function(e,t,a){"use strict";a.d(t,"a",(function(){return d})),a.d(t,"b",(function(){return u}));var n=a(0),r=a.n(n);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function b(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=r.a.createContext({}),s=function(e){var t=r.a.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):b(b({},t),e)),a},d=function(e){var t=s(e.components);return r.a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,o=c(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,u=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return a?r.a.createElement(u,b(b({ref:t},o),{},{components:a})):r.a.createElement(u,b({ref:t},o))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=m;var b={};for(var c in t)hasOwnProperty.call(t,c)&&(b[c]=t[c]);b.originalType=e,b.mdxType="string"==typeof e?e:n,i[1]=b;for(var o=2;o \'localhost\'\n user => \'guest\'\n password => "${rabbitmq_pass}"\n exchange => \'netsage.direct\'\n key => XXXXXXX\'\n queue => \'netsage\'\n durable => true\n subscription_retry_interval_seconds => 5\n connection_timeout => 10000\n }\n}\nfilter {\n if [@metadata][rabbitmq_properties][timestamp] {\n date {\n match => ["[@metadata][rabbitmq_properties][timestamp]", "UNIX"]\n }\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\n "https://CHANGEME1",\n "https://CHANGEME2"\n ]\n user => "logstash"\n password => "${logstash_elasticsearch_password}"\n cacert => "/etc/logstash/ca.crt"\n index => "om-ns-netsage"\n template_overwrite => true\n failure_type_logging_whitelist => []\n action => index\n #ssl_certificate_verification => false\n }\n}\n')),Object(l.b)("p",null,"Once the data is published in elastic, you can use the ",Object(l.b)("a",{parentName:"p",href:"https://github.com/netsage-project/netsage-grafana-configs"},"grafana dashboard")," to visualize the data."),Object(l.b)("h2",{id:"elasticsearch-fields"},"Elasticsearch Fields"),Object(l.b)("h3",{id:"es-fields"},"ES fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_index"),Object(l.b)("td",{parentName:"tr",align:null},"om-ns-netsage-2020.06."),Object(l.b)("td",{parentName:"tr",align:null},"equivalent to an sql table")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_type"),Object(l.b)("td",{parentName:"tr",align:null},"_doc"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_id"),Object(l.b)("td",{parentName:"tr",align:null},"HRkcm3IByJ9fEnbnCpaY"),Object(l.b)("td",{parentName:"tr",align:null},"document id, set by ES")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"_score"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES query")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@version"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"set by ES")))),Object(l.b)("h3",{id:"developer-fields"},"Developer fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"type"),Object(l.b)("td",{parentName:"tr",align:null},"flow"),Object(l.b)("td",{parentName:"tr",align:null},'Always "flow" for us. Other types may be "macy", etc.')),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@injest_time"),Object(l.b)("td",{parentName:"tr",align:null},"2020-06-09T21:51:57.059Z"),Object(l.b)("td",{parentName:"tr",align:null},"Essentially time the flow went into the logstash pipeline (10-preliminaries.conf for tstat flows) or the time stitching of the flow commenced (40-aggregation.conf for others)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@timestamp"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:21.703"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow went into the logstash pipeline for tstat flows, or the time stitching finished and the event was pushed for other flows.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@exit_time"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 18:03:25.369"),Object(l.b)("td",{parentName:"tr",align:null},"The time the flow exited the pipeline (99-outputs.conf)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"@processing_time"),Object(l.b)("td",{parentName:"tr",align:null},"688.31"),Object(l.b)("td",{parentName:"tr",align:null},"@exit_time minus @injest_time. Useful for seeing how long stitching took.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"stitched_flows"),Object(l.b)("td",{parentName:"tr",align:null},"1"),Object(l.b)("td",{parentName:"tr",align:null},"Number of flows stitched together to make this final one. 0 for tstat flows, which are always complete. 1 if no flows were stitched together.")))),Object(l.b)("h3",{id:"flow-fields"},"Flow fields"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"start"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:53.808"),Object(l.b)("td",{parentName:"tr",align:null},"Start time of the flow (first packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"end"),Object(l.b)("td",{parentName:"tr",align:null},"Jun 9, 2020 @ 17:39:57.699"),Object(l.b)("td",{parentName:"tr",align:null},"End time of the flow (last packet seen)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.protocol"),Object(l.b)("td",{parentName:"tr",align:null},"tcp"),Object(l.b)("td",{parentName:"tr",align:null},"Protocol used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.id"),Object(l.b)("td",{parentName:"tr",align:null},"a17c4f05420d7ded9eb151ccd293a633 ff226d1752b24e0f4139a87a8b26d779"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned flow id")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.flow_type"),Object(l.b)("td",{parentName:"tr",align:null},"sflow"),Object(l.b)("td",{parentName:"tr",align:null},"Sflow, Netflow, or Tstat")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_id"),Object(l.b)("td",{parentName:"tr",align:null},"snvl2-pw-sw-1-mgmt-2.cenic.net"),Object(l.b)("td",{parentName:"tr",align:null},"Sensor name (set in importer config, may not always be a hostname)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_group"),Object(l.b)("td",{parentName:"tr",align:null},"CENIC"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor group")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.sensor_type"),Object(l.b)("td",{parentName:"tr",align:null},"Regional Network"),Object(l.b)("td",{parentName:"tr",align:null},"Assigned sensor type")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.country_scope"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic"),Object(l.b)("td",{parentName:"tr",align:null},"Domestic, International, or Mixed, depending on countries of src and dst")))),Object(l.b)("h3",{id:"source-fields-destination-fields-similarly"},"Source Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_ip"),Object(l.b)("td",{parentName:"tr",align:null},"171.64.68.x"),Object(l.b)("td",{parentName:"tr",align:null},"deidentified IP address")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_port"),Object(l.b)("td",{parentName:"tr",align:null},"80"),Object(l.b)("td",{parentName:"tr",align:null},"port used")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_asn"),Object(l.b)("td",{parentName:"tr",align:null},"32"),Object(l.b)("td",{parentName:"tr",align:null},"ASN of the IP from geoip ASN database or the ASN from the flow header")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.423"),Object(l.b)("td",{parentName:"tr",align:null},"latitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.164"),Object(l.b)("td",{parentName:"tr",align:null},"longitude of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_country_name"),Object(l.b)("td",{parentName:"tr",align:null},"United States"),Object(l.b)("td",{parentName:"tr",align:null},"country of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_continent"),Object(l.b)("td",{parentName:"tr",align:null},"North America"),Object(l.b)("td",{parentName:"tr",align:null},"continent of IP from geoip database")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_organization"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"organization that owns the AS of the IP from geoip ASN database")))),Object(l.b)("h3",{id:"source-science-registry-fields--destination-fields-similarly"},"Source Science Registry Fields (Destination Fields similarly)"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford - ImageNet"),Object(l.b)("td",{parentName:"tr",align:null},"Resource name from SciReg")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.resource_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"-"),Object(l.b)("td",{parentName:"tr",align:null},"Resource abbreviation (if any)")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.discipline"),Object(l.b)("td",{parentName:"tr",align:null},"CS. Intelligent Systems"),Object(l.b)("td",{parentName:"tr",align:null},"The science discipline that uses the resource (ie host). Note that not the src MAY not have the same discipline as the dst.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.role"),Object(l.b)("td",{parentName:"tr",align:null},"Storage"),Object(l.b)("td",{parentName:"tr",align:null},"Role that the host plays")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_name"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"The organization the manages and/or uses the resource, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.org_abbr"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford"),Object(l.b)("td",{parentName:"tr",align:null},"A shorter name for the organization. May not be the official abbreviation.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.projects"),Object(l.b)("td",{parentName:"tr",align:null},"."),Object(l.b)("td",{parentName:"tr",align:null},"Can be an array of projects ","[we may change this field name soon]")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.latitude"),Object(l.b)("td",{parentName:"tr",align:null},"37.4178"),Object(l.b)("td",{parentName:"tr",align:null},"Resource's location, as listed in the Science Registry")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.scireg.src.longitude"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"preferred-fields"},'"Preferred" fields'),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_org"),Object(l.b)("td",{parentName:"tr",align:null},"Stanford University"),Object(l.b)("td",{parentName:"tr",align:null},"If the IP was found in the Science Registry, these are the SciReg values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lat"),Object(l.b)("td",{parentName:"tr",align:null},"37.417800"),Object(l.b)("td",{parentName:"tr",align:null},"Otherwise, they are the geoip values.")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"meta.src_preferred_location.lon"),Object(l.b)("td",{parentName:"tr",align:null},"-122.172000"),Object(l.b)("td",{parentName:"tr",align:null})))),Object(l.b)("h3",{id:"values"},"Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"),Object(l.b)("th",{parentName:"tr",align:null},"description"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_bits"),Object(l.b)("td",{parentName:"tr",align:null},"939, 458, 560"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of bits in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.num_packets"),Object(l.b)("td",{parentName:"tr",align:null},"77, 824"),Object(l.b)("td",{parentName:"tr",align:null},"Sum of the number of packets in all the stitched flows")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.duration"),Object(l.b)("td",{parentName:"tr",align:null},"3.891"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as end minus start")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.bits_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"241, 443, 988"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_bits divided by duration")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.packets_per_second"),Object(l.b)("td",{parentName:"tr",align:null},"20, 001"),Object(l.b)("td",{parentName:"tr",align:null},"Calculated as num_packets divided by duration")))),Object(l.b)("h3",{id:"tstat-values"},"Tstat Values"),Object(l.b)("table",null,Object(l.b)("thead",{parentName:"table"},Object(l.b)("tr",{parentName:"thead"},Object(l.b)("th",{parentName:"tr",align:null},"name"),Object(l.b)("th",{parentName:"tr",align:null},"example"))),Object(l.b)("tbody",{parentName:"table"},Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_cwin_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_initial_cwin"),Object(l.b)("td",{parentName:"tr",align:null},"313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_max_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"64313")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_min_seg_size"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_mss"),Object(l.b)("td",{parentName:"tr",align:null},"8960")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_out_seq_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_dup"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fc"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_fs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_reor"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_rto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unfs"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unk"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_pkts_unrto"),Object(l.b)("td",{parentName:"tr",align:null},"0")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_bytes"),Object(l.b)("td",{parentName:"tr",align:null},"1678")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rexmit_pkts"),Object(l.b)("td",{parentName:"tr",align:null},"2")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_avg"),Object(l.b)("td",{parentName:"tr",align:null},"0.044")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_max"),Object(l.b)("td",{parentName:"tr",align:null},"39.527")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_min"),Object(l.b)("td",{parentName:"tr",align:null},"0.001")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_rtt_std"),Object(l.b)("td",{parentName:"tr",align:null},"0.276")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_sack_cnt"),Object(l.b)("td",{parentName:"tr",align:null},"1")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_max"),Object(l.b)("td",{parentName:"tr",align:null},"1549681")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_win_min"),Object(l.b)("td",{parentName:"tr",align:null},"17")),Object(l.b)("tr",{parentName:"tbody"},Object(l.b)("td",{parentName:"tr",align:null},"values.tcp_window_scale"),Object(l.b)("td",{parentName:"tr",align:null},"13")))))}s.isMDXComponent=!0},228:function(e,t,a){"use strict";a.d(t,"a",(function(){return d})),a.d(t,"b",(function(){return u}));var n=a(0),r=a.n(n);function l(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function b(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var o=r.a.createContext({}),s=function(e){var t=r.a.useContext(o),a=t;return e&&(a="function"==typeof e?e(t):b(b({},t),e)),a},d=function(e){var t=s(e.components);return r.a.createElement(o.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},m=r.a.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,o=c(e,["components","mdxType","originalType","parentName"]),d=s(a),m=n,u=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return a?r.a.createElement(u,b(b({ref:t},o),{},{components:a})):r.a.createElement(u,b({ref:t},o))}));function u(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,i=new Array(l);i[0]=m;var b={};for(var c in t)hasOwnProperty.call(t,c)&&(b[c]=t[c]);b.originalType=e,b.mdxType="string"==typeof e?e:n,i[1]=b;for(var o=2;o ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")))),Object(i.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),b=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=b(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=b(n),d=o,h=p["".concat(a,".").concat(d)]||p[d]||u[d]||i;return n?r.a.createElement(h,l(l({ref:t},c),{},{components:n})):r.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,a[1]=l;for(var c=2;c ["elasticsearch"]\n index => "netsage_flow-%{+YYYY.MM.dd}"\n}\n')),Object(i.b)("ol",{start:2},Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Comment out the ",Object(i.b)("inlineCode",{parentName:"p"},"rabbitmq {...}")," block in conf-logstash/99-outputs.conf if you do not want to also send logstash output to RabbitMQ.")),Object(i.b)("li",{parentName:"ol"},Object(i.b)("p",{parentName:"li"},"Run the containers using the following line: ",Object(i.b)("inlineCode",{parentName:"p"},"docker-compose -f docker-compose.yml -f docker-compose.develop.yml up -d")))),Object(i.b)("h2",{id:"running-the-containers"},"Running the Containers"),Object(i.b)("h3",{id:"start-the-containers"},"Start the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d \n")),Object(i.b)("h3",{id:"stop-the-containers"},"Stop the Containers"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose stop && docker-compose rm \n")),Object(i.b)("h3",{id:"enter-a-container-shell"},"Enter a Container Shell"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose exec logstash bash #bash shell in logstash container\ndocker-compose exec importer bash #bash shell in importer container\ndocker-compose exec rabbit bash #bash shell in rabbit container\n")),Object(i.b)("h3",{id:"view-container-logs"},"View Container Logs"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs -f #view logs for all containers \ndocker-compose logs -f logstash #view logs for logstash container\ndocker-compose logs -f importer #view logs for importer container\ndocker-compose logs -f rabbit #view logs for rabbit container\n")))}b.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),r=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),b=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=b(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=b(n),d=o,h=p["".concat(a,".").concat(d)]||p[d]||u[d]||i;return n?r.a.createElement(h,l(l({ref:t},c),{},{components:n})):r.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,a=new Array(i);a[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,a[1]=l;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like --\x3e\n Netflow Sensor 1d\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n netflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash daily. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=o,h=u["".concat(l,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(h,r(r({ref:t},c),{},{components:n})):a.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=b;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:o,l[1]=r;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like --\x3e\n Netflow Sensor 1d\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n netflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash daily. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=o,h=u["".concat(l,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(h,r(r({ref:t},c),{},{components:n})):a.a.createElement(h,r({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,l=new Array(i);l[0]=b;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:o,l[1]=r;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"3-environment-file"},"3. Environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},'exampleSensorName="Example New York sFlow"\n')),Object(r.b)("h3",{id:"select-which-version-to-run"},"Select which version to run"),Object(r.b)("p",null,"Before continuing you need to choose if you are going to be use the 'Develop' version which has the latest changes but might be a bit less stable (or have code not ready for use) or a 'Released' version. If you're opting to use the Develop version, then simply skip the version selection step."),Object(r.b)("div",{className:"admonition admonition-caution alert alert--warning"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 16 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))),"caution")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Warning! it is HIGHLY recommended to not use the :latest as that is intended to be a developer release. You may still use it but be aware that you may have some instability each time you update."))),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},' git fetch \n git checkout "tag name"\n ./scripts/docker_select_version.sh\n')),Object(r.b)("p",null,'Replace "tag name" with the version you intend to use, eg, "v1.2.5". When prompted by the script, select the same version.'),Object(r.b)("h3",{id:"running-the-new-collector"},"Running the new collector"),Object(r.b)("p",null,"After selecting the docker version to run, you can start the new collector by running the following line, using the collector name:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"for-tstat-data"},"For Tstat Data"),Object(r.b)("p",null,'Tstat data is not collected by nfdump/sfcapd/nfcapd or read by an Importer. Instead, the flow data is sent directly from the router or switch to the logstash pipeline\'s ingest rabbit queue (named "netsage_deidentifier_raw"). So, when following the Docker Simple guide, the sections related to configuring and starting up the collectors and Importer will not pertain to the tstat sensors. The .env file still needs to be set up though.'),Object(r.b)("p",null,"Setting up Tstat is outside the scope of this document, but see the Netsage project Tstat-Transport which contains client programs that can send tstat data to a rabbit queue. See ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/tstat-transport.git"},"https://github.com/netsage-project/tstat-transport.git"),"."),Object(r.b)("h2",{id:"to-customize-logstash-java-settings"},"To Customize Logstash Java Settings"),Object(r.b)("p",null,"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"to-export-data-to-an-nfs-volume"},"To Export Data to an NFS Volume"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure to update all the paths correctly for the next release manually."))))}d.isMDXComponent=!0},232:function(e,t,o){"use strict";o.d(t,"a",(function(){return p})),o.d(t,"b",(function(){return h}));var a=o(0),n=o.n(a);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function l(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var c=n.a.createContext({}),d=function(e){var t=n.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=d(e.components);return n.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(o),m=a,h=p["".concat(i,".").concat(m)]||p[m]||u[m]||r;return o?n.a.createElement(h,l(l({ref:t},c),{},{components:o})):n.a.createElement(h,l({ref:t},c))}));function h(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"3-environment-file"},"3. Environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},'exampleSensorName="Example New York sFlow"\n')),Object(r.b)("h3",{id:"select-which-version-to-run"},"Select which version to run"),Object(r.b)("p",null,"Before continuing you need to choose if you are going to be use the 'Develop' version which has the latest changes but might be a bit less stable (or have code not ready for use) or a 'Released' version. If you're opting to use the Develop version, then simply skip the version selection step."),Object(r.b)("div",{className:"admonition admonition-caution alert alert--warning"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"16",height:"16",viewBox:"0 0 16 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"}))),"caution")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Warning! it is HIGHLY recommended to not use the :latest as that is intended to be a developer release. You may still use it but be aware that you may have some instability each time you update."))),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},' git fetch \n git checkout "tag name"\n ./scripts/docker_select_version.sh\n')),Object(r.b)("p",null,'Replace "tag name" with the version you intend to use, eg, "v1.2.5". When prompted by the script, select the same version.'),Object(r.b)("h3",{id:"running-the-new-collector"},"Running the new collector"),Object(r.b)("p",null,"After selecting the docker version to run, you can start the new collector by running the following line, using the collector name:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"for-tstat-data"},"For Tstat Data"),Object(r.b)("p",null,'Tstat data is not collected by nfdump/sfcapd/nfcapd or read by an Importer. Instead, the flow data is sent directly from the router or switch to the logstash pipeline\'s ingest rabbit queue (named "netsage_deidentifier_raw"). So, when following the Docker Simple guide, the sections related to configuring and starting up the collectors and Importer will not pertain to the tstat sensors. The .env file still needs to be set up though.'),Object(r.b)("p",null,"Setting up Tstat is outside the scope of this document, but see the Netsage project Tstat-Transport which contains client programs that can send tstat data to a rabbit queue. See ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/tstat-transport.git"},"https://github.com/netsage-project/tstat-transport.git"),"."),Object(r.b)("h2",{id:"to-customize-logstash-java-settings"},"To Customize Logstash Java Settings"),Object(r.b)("p",null,"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"to-export-data-to-an-nfs-volume"},"To Export Data to an NFS Volume"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure to update all the paths correctly for the next release manually."))))}d.isMDXComponent=!0},228:function(e,t,o){"use strict";o.d(t,"a",(function(){return p})),o.d(t,"b",(function(){return h}));var a=o(0),n=o.n(a);function r(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,a)}return o}function l(e){for(var t=1;t=0||(n[o]=e[o]);return n}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(n[o]=e[o])}return n}var c=n.a.createContext({}),d=function(e){var t=n.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=d(e.components);return n.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.a.createElement(n.a.Fragment,{},t)}},m=n.a.forwardRef((function(e,t){var o=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(o),m=a,h=p["".concat(i,".").concat(m)]||p[m]||u[m]||r;return o?n.a.createElement(h,l(l({ref:t},c),{},{components:o})):n.a.createElement(h,l({ref:t},c))}));function h(e,t){var o=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=o.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=r,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=f;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},f=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),f=r,m=u["".concat(a,".").concat(f)]||u[f]||d[f]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=f;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),l=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=l(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||a;return n?o.a.createElement(m,s(s({ref:t},c),{},{components:n})):o.a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),l=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},f=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=l(n),f=r,m=d["".concat(i,".").concat(f)]||d[f]||u[f]||a;return n?o.a.createElement(m,s(s({ref:t},c),{},{components:n})):o.a.createElement(m,s({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=f;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var a=n(0),o=n.n(a);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?o.a.createElement(b,r(r({ref:t},c),{},{components:n})):o.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:a,l[1]=r;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),b=r,f=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?o.a.createElement(f,l(l({ref:t},c),{},{components:n})):o.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(n),b=r,f=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?o.a.createElement(f,l(l({ref:t},c),{},{components:n})):o.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=o.a.createContext({}),s=function(e){var n=o.a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):p(p({},n),e)),t},u=function(e){var n=s(e.components);return o.a.createElement(l.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=s(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,p(p({ref:n},l),{},{components:t})):o.a.createElement(m,p({ref:n},l))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var p={};for(var i in n)hasOwnProperty.call(n,i)&&(p[i]=n[i]);p.originalType=e,p.mdxType="string"==typeof e?e:r,c[1]=p;for(var l=2;l=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=o.a.createContext({}),s=function(e){var n=o.a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):p(p({},n),e)),t},u=function(e){var n=s(e.components);return o.a.createElement(l.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=s(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,p(p({ref:n},l),{},{components:t})):o.a.createElement(m,p({ref:n},l))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var p={};for(var i in n)hasOwnProperty.call(n,i)&&(p[i]=n[i]);p.originalType=e,p.mdxType="string"==typeof e?e:r,c[1]=p;for(var l=2;l \'localhost\'\n user => \'guest\'\n password => "${rabbitmq_pass}"\n exchange => \'netsage.direct\'\n key => XXXXXXX\'\n queue => \'netsage\'\n durable => true\n subscription_retry_interval_seconds => 5\n connection_timeout => 10000\n }\n}\nfilter {\n if [@metadata][rabbitmq_properties][timestamp] {\n date {\n match => ["[@metadata][rabbitmq_properties][timestamp]", "UNIX"]\n }\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\n "https://CHANGEME1",\n "https://CHANGEME2"\n ]\n user => "logstash"\n password => "${logstash_elasticsearch_password}"\n cacert => "/etc/logstash/ca.crt"\n index => "om-ns-netsage"\n template_overwrite => true\n failure_type_logging_whitelist => []\n action => index\n #ssl_certificate_verification => false\n }\n}\n')),Object(o.b)("h2",{id:"field-names"},"Field names"),Object(o.b)("p",null,"The fields used/created in Logstash (and saved to Elasticsearch) are listed in the ",Object(o.b)("a",{parentName:"p",href:"elastic"},"Elasticsearch doc"),"."))}d.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return b}));var i=n(0),a=n.n(i);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},f=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=d(n),f=i,b=p["".concat(s,".").concat(f)]||p[f]||u[f]||o;return n?a.a.createElement(b,r(r({ref:t},c),{},{components:n})):a.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=f;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var c=2;c \'localhost\'\n user => \'guest\'\n password => "${rabbitmq_pass}"\n exchange => \'netsage.direct\'\n key => XXXXXXX\'\n queue => \'netsage\'\n durable => true\n subscription_retry_interval_seconds => 5\n connection_timeout => 10000\n }\n}\nfilter {\n if [@metadata][rabbitmq_properties][timestamp] {\n date {\n match => ["[@metadata][rabbitmq_properties][timestamp]", "UNIX"]\n }\n }\n}\n\noutput {\n elasticsearch {\n hosts => [\n "https://CHANGEME1",\n "https://CHANGEME2"\n ]\n user => "logstash"\n password => "${logstash_elasticsearch_password}"\n cacert => "/etc/logstash/ca.crt"\n index => "om-ns-netsage"\n template_overwrite => true\n failure_type_logging_whitelist => []\n action => index\n #ssl_certificate_verification => false\n }\n}\n')),Object(o.b)("h2",{id:"field-names"},"Field names"),Object(o.b)("p",null,"The fields used/created in Logstash (and saved to Elasticsearch) are listed in the ",Object(o.b)("a",{parentName:"p",href:"elastic"},"Elasticsearch doc"),"."))}d.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return b}));var i=n(0),a=n.n(i);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function r(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},f=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=d(n),f=i,b=p["".concat(s,".").concat(f)]||p[f]||u[f]||o;return n?a.a.createElement(b,r(r({ref:t},c),{},{components:n})):a.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=f;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),d=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},l),{},{components:n})):a.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),d=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},l),{},{components:n})):a.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),s=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},p=function(t){var e=s(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),p=s(a),o=n,u=p["".concat(b,".").concat(o)]||p[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(r[a]=t[a]);return r}(t,e);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,a)&&(r[a]=t[a])}return r}var d=r.a.createContext({}),s=function(t){var e=r.a.useContext(d),a=e;return t&&(a="function"==typeof t?t(e):i(i({},e),t)),a},p=function(t){var e=s(t.components);return r.a.createElement(d.Provider,{value:e},t.children)},m={inlineCode:"code",wrapper:function(t){var e=t.children;return r.a.createElement(r.a.Fragment,{},e)}},o=r.a.forwardRef((function(t,e){var a=t.components,n=t.mdxType,l=t.originalType,b=t.parentName,d=c(t,["components","mdxType","originalType","parentName"]),p=s(a),o=n,u=p["".concat(b,".").concat(o)]||p[o]||m[o]||l;return a?r.a.createElement(u,i(i({ref:e},d),{},{components:a})):r.a.createElement(u,i({ref:e},d))}));function u(t,e){var a=arguments,n=e&&e.mdxType;if("string"==typeof t||n){var l=a.length,b=new Array(l);b[0]=o;var i={};for(var c in e)hasOwnProperty.call(e,c)&&(i[c]=e[c]);i.originalType=t,i.mdxType="string"==typeof t?t:n,b[1]=i;for(var d=2;d=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),s=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},b=function(e){var t=s(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),b=s(n),d=r,f=b["".concat(a,".").concat(d)]||b[d]||u[d]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),s=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},b=function(e){var t=s(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),b=s(n),d=r,f=b["".concat(a,".").concat(d)]||b[d]||u[d]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(o,".").concat(u)]||d[u]||b[u]||r;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(o,".").concat(u)]||d[u]||b[u]||r;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,o=new Array(r);o[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var p=2;p"},i.a.createElement("header",{className:r()("hero hero--primary",d.a.heroBanner)},i.a.createElement("div",{className:"container"},i.a.createElement("h1",{className:"hero__title"},t.title),i.a.createElement("img",{src:"img/netsage.webp"}),i.a.createElement("p",{className:"hero__subtitle"},t.tagline),i.a.createElement("div",{className:d.a.buttons},i.a.createElement(l.a,{className:r()("button button--outline button--secondary button--lg",d.a.getStarted),to:Object(m.a)("docs/pipeline/intro")},"Pipeline Documentation")))))}}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[116],{186:function(e,t,a){"use strict";a.r(t);var n=a(0),i=a.n(n),o=a(245),r=a.n(o),c=a(236),l=a(233),s=a(16),m=a(234),u=a(187),d=a.n(u);t.default=function(){var e=Object(s.default)().siteConfig,t=void 0===e?{}:e;return i.a.createElement(c.a,{title:""+t.title,description:"Description will go into a meta tag in "},i.a.createElement("header",{className:r()("hero hero--primary",d.a.heroBanner)},i.a.createElement("div",{className:"container"},i.a.createElement("h1",{className:"hero__title"},t.title),i.a.createElement("img",{src:"img/netsage.webp"}),i.a.createElement("p",{className:"hero__subtitle"},t.tagline),i.a.createElement("div",{className:d.a.buttons},i.a.createElement(l.a,{className:r()("button button--outline button--secondary button--lg",d.a.getStarted),to:Object(m.a)("docs/pipeline/intro")},"Pipeline Documentation")))))}}}]); \ No newline at end of file diff --git a/assets/js/c51f4c72.0e8bec24.js b/assets/js/c51f4c72.69c062f8.js similarity index 99% rename from assets/js/c51f4c72.0e8bec24.js rename to assets/js/c51f4c72.69c062f8.js index 63796730..e2ad3c94 100644 --- a/assets/js/c51f4c72.0e8bec24.js +++ b/assets/js/c51f4c72.69c062f8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[120],{191:function(e,t,n){"use strict";n.r(t),n.d(t,"frontMatter",(function(){return i})),n.d(t,"metadata",(function(){return l})),n.d(t,"toc",(function(){return s})),n.d(t,"default",(function(){return p}));var a=n(3),o=n(7),r=(n(0),n(232)),i={id:"docker_install_simple",title:"Docker Default Installation Guide",sidebar_label:"Docker Simple"},l={unversionedId:"deploy/docker_install_simple",id:"version-1.2.9/deploy/docker_install_simple",isDocsHomePage:!1,title:"Docker Default Installation Guide",description:"In this deployment guide, you will learn how to deploy a basic Netsage setup that includes one sflow and/or one netflow collector. If you have more than one collector of either type, or other special situations, see the Docker Advanced guide.",source:"@site/versioned_docs/version-1.2.9/deploy/docker_install_simple.md",slug:"/deploy/docker_install_simple",permalink:"/netsage-pipeline/docs/1.2.9/deploy/docker_install_simple",editUrl:"https://github.com/netsage-project/netsage-pipeline/edit/master/website/versioned_docs/version-1.2.9/deploy/docker_install_simple.md",version:"1.2.9",sidebar_label:"Docker Simple",sidebar:"version-1.2.9/Pipeline",previous:{title:"NetSage Flow Processing Pipeline Installation Guide",permalink:"/netsage-pipeline/docs/1.2.9/deploy/bare_metal_install"},next:{title:"Docker Advanced Installation Guide",permalink:"/netsage-pipeline/docs/1.2.9/deploy/docker_install_advanced"}},s=[{value:"1. Set up Data Sources",id:"1-set-up-data-sources",children:[]},{value:"2. Clone the Netsage Pipeline Project",id:"2-clone-the-netsage-pipeline-project",children:[]},{value:"3. Create Docker-compose.override.yml",id:"3-create-docker-composeoverrideyml",children:[]},{value:"4. Create Environment File",id:"4-create-environment-file",children:[]},{value:"5. Choose Pipeline Version",id:"5-choose-pipeline-version",children:[]},{value:"Running the Collectors",id:"running-the-collectors",children:[{value:"Running the Collectors and Pipeline",id:"running-the-collectors-and-pipeline",children:[]}]},{value:"Upgrading",id:"upgrading",children:[]}],c={toc:s};function p(e){var t=e.components,n=Object(o.a)(e,["components"]);return Object(r.b)("wrapper",Object(a.a)({},c,n,{components:t,mdxType:"MDXLayout"}),Object(r.b)("p",null,"In this deployment guide, you will learn how to deploy a basic Netsage setup that includes one sflow and/or one netflow collector. If you have more than one collector of either type, or other special situations, see the Docker Advanced guide."),Object(r.b)("p",null,"The Docker containers included in the installation are"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"rabbit (the local RabbitMQ server)"),Object(r.b)("li",{parentName:"ul"},"sflow-collector (receives sflow data and writes nfcapd files)"),Object(r.b)("li",{parentName:"ul"},"netflow-collector (receives netflow data and writes nfcapd files)"),Object(r.b)("li",{parentName:"ul"},"importer (reads nfcapd files and puts flows into a local rabbit queue)"),Object(r.b)("li",{parentName:"ul"},"logstash (logstash pipeline that processes flows and sends them to, by default, netsage-elk1.grnoc.iu.edu)"),Object(r.b)("li",{parentName:"ul"},"ofelia (cron-like downloading of files used by the logstash pipeline)")),Object(r.b)("p",null,"The code and configs for the importer and logstash pipeline can be viewed in this github repo (netsage-project/netsage-pipeline). See netsage-project/docker-nfdump-collector for code related to the collectors."),Object(r.b)("h3",{id:"1-set-up-data-sources"},"1. Set up Data Sources"),Object(r.b)("p",null,"The data processing pipeline needs data to ingest in order to do anything, of course. There are three types of data that can be consumed."),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"sflow "),Object(r.b)("li",{parentName:"ul"},"netflow"),Object(r.b)("li",{parentName:"ul"},"tstat")),Object(r.b)("p",null,"At least one of these must be set up on a sensor to provide the incoming flow data.\nYou can do this step later, but it will helpful to have it working first. "),Object(r.b)("p",null,"Sflow and netflow data should be exported to the pipeline host where there are collectors (nfcapd and/or sfcapd processes) ready to receive it (see below). To use the default settings, send sflow to port 9998 and netflow to port 9999. On the pipeline host, allow incoming traffic from the flow exporters, of course."),Object(r.b)("p",null,"Tstat data should be sent directly to the logstash input RabbitMQ queue on the pipeline host. No collector is needed for tstat data. From there, logstash will grab the data and process it the same way as it processes sflow/netflow data. (See the Docker Advanced guide.)"),Object(r.b)("h3",{id:"2-clone-the-netsage-pipeline-project"},"2. Clone the Netsage Pipeline Project"),Object(r.b)("p",null,"If you haven't already, install ",Object(r.b)("a",{parentName:"p",href:"https://www.docker.com"},"Docker")," and ",Object(r.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/install/"},"Docker Compose")," and clone this project"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"git clone https://github.com/netsage-project/netsage-pipeline.git\n")),Object(r.b)("p",null,"(If you are upgrading to a new release, see the Upgrade section below!)"),Object(r.b)("p",null,"Then checkout the right version of the code."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"git checkout tag_name\n")),Object(r.b)("p",null,'Replace "tag_name" with the release version you intend to use, e.g., "v1.2.8". ("Master" is the development version and is not intended for general use!)\n',Object(r.b)("inlineCode",{parentName:"p"},"git status")," will confirm which branch you are on, e.g., master or v1.2.8."),Object(r.b)("h3",{id:"3-create-docker-composeoverrideyml"},"3. Create Docker-compose.override.yml"),Object(r.b)("p",null,"Information in the ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose.yml")," file tells docker which containers (processes) to run and sets various parameters for them.\nSettings in the ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose.override.yml")," file will overrule and add to those. Note that docker-compose.yml should not be edited since upgrades will replace it. Put all customizations in the override file, since override files will not be overwritten."),Object(r.b)("p",null,"Collector settings may need to be edited by the user, so the information that docker uses to run the collectors is specified (only) in the override file. Therefore, docker-compose_override.example.yml must always be copied to docker-compose_override.yml. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp docker-compose.override_example.yml docker-compose.override.yml\n")),Object(r.b)("p",null,"By default docker will bring up a single netflow collector and a single sflow collector. If this matches your case, you don't need to make any changes to the docker-compose.override_example.yml. If you have only one collector, remove or comment out the section for the one not needed so the collector doesn't run and simply create empty nfcapd files."),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you only have one collector, you should remove or comment out the section for the collector that is not used."))),Object(r.b)("p",null,"This file also specifies port numbers, and directories for nfcapd files. By default, the sflow collector will listen to udp traffic on localhost:9998, while the netflow collector will listen on port 9999, and data will be written to ",Object(r.b)("inlineCode",{parentName:"p"},"/data/input_data/"),". Each collector is namespaced by its type so the sflow collector will write data to ",Object(r.b)("inlineCode",{parentName:"p"},"/data/input_data/sflow/")," and the netflow collector will write data to ",Object(r.b)("inlineCode",{parentName:"p"},"/data/input_data/netflow/"),". "),Object(r.b)("p",null,"Other lines in this file you can ignore for now. "),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"You may need to remove all the comments in the override file as they may conflict with the parsing done by docker-compose"))),Object(r.b)("h3",{id:"4-create-environment-file"},"4. Create Environment File"),Object(r.b)("p",null,Object(r.b)("p",{parentName:"p"},"Please copy ",Object(r.b)("inlineCode",{parentName:"p"},"env.example")," to ",Object(r.b)("inlineCode",{parentName:"p"},".env")," "),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp env.example .env \n")),Object(r.b)("p",{parentName:"p"},"then edit the .env file to set the sensor names"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sflowSensorName=my sflow sensor name\nnetflowSensorName=my netflow sensor name\n")),Object(r.b)("p",{parentName:"p"},"Simply change the names to unique identifiers (with spaces or not, no quotes) and you're good to go. "),Object(r.b)("div",{parentName:"p",className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"These names uniquely identify the source of the data. In elasticsearch, they are saved in the ",Object(r.b)("inlineCode",{parentName:"p"},"meta.sensor_id"),' field and will be shown in Grafana dashboards. Choose names that are meaningful and unique.\nFor example, your sensor names might be "RNDNet New York Sflow" and "RNDNet Boston Netflow" or "rtr.one.rndnet.edu" and "rtr.two.nrdnet.edu". Whatever makes sense in your situation.'))),Object(r.b)("ul",{parentName:"p"},Object(r.b)("li",{parentName:"ul"},"If you don't set a sensor name, the default docker hostname, which changes each time you run the pipeline, will be used. "),Object(r.b)("li",{parentName:"ul"},"If you have only one collector, remove or comment out the line for the one you are not using."),Object(r.b)("li",{parentName:"ul"},'If you have more than one of the same type of collector, see the "Docker Advanced" documentation.')),Object(r.b)("p",{parentName:"p"},"Other settings of note in this file include the following. You will not necessarily need to change these, but be aware."),Object(r.b)("p",{parentName:"p"},Object(r.b)("strong",{parentName:"p"},"rabbit_output_host"),": this defines where the final data will land after going through the pipeline. By default, the last rabbit queue will be on ",Object(r.b)("inlineCode",{parentName:"p"},"rabbit"),", ie, the local rabbitMQ server running in its docker container. Enter a hostname to send to a remote rabbitMQ server (also the correct username, password, and queue key/name)."),Object(r.b)("p",{parentName:"p"},"The following Logstash Aggregation Filter settings are exposed in case you wish to use different values.\n(See comments in the ","*","-aggregation.conf file.) The aggregation filter stitches together long-lasting flows that are seen in multiple nfcapd files, matching by the 5-tuple (source and destination IPs, ports, and protocol) plus sensor name. "),Object(r.b)("p",{parentName:"p"},Object(r.b)("strong",{parentName:"p"},"Aggregation_maps_path"),": the name of the file to which logstash will write in-progress aggregation data when logstash shuts down. When logstash starts up again, it will read this file in and resume aggregating. The filename is configurable for complex situations, but /data/ is required. "),Object(r.b)("p",{parentName:"p"},Object(r.b)("strong",{parentName:"p"},"Inactivity_timeout"),": If more than inactivity_timeout seconds have passed between the 'start' of a flow and the 'start'\nof the LAST matching flow, OR if no matching flow has coming in for inactivity_timeout seconds\non the clock, assume the flow has ended."),Object(r.b)("div",{parentName:"p",className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Nfcapd files are typically written every 5 minutes. Netsage uses an inactivity_timeout = 630 sec = 10.5 min for 5-min files; 960 sec = 16 min for 15-min files. (For 5-min files, this allows one 5 min gap or period during which the no. of bits transferred don't meet the cutoff)"))),Object(r.b)("p",{parentName:"p"},Object(r.b)("strong",{parentName:"p"},"max_flow_timeout"),": If a long-lasting flow is still aggregating when this timeout is reached, arbitrarily cut it off and start a new flow. The default is 24 hours.")),Object(r.b)("h3",{id:"5-choose-pipeline-version"},"5. Choose Pipeline Version"),Object(r.b)("p",null,"Once you've created the docker-compose.override.xml file and finished adjusting it for any customizations, you're ready to select which version Docker should run."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"./scripts/docker_select_version.sh\n")),Object(r.b)("p",null,"When prompted, select the ",Object(r.b)("strong",{parentName:"p"},"same version")," you checked out earlier.\nThis script will replace the version numbers of docker images in the docker-compose files with the correct values."),Object(r.b)("h2",{id:"running-the-collectors"},"Running the Collectors"),Object(r.b)("p",null,"After selecting the version to run, you can start the two flow collectors by themselves by running the following line. If you only need one of the collectors, remove the other from this command. "),Object(r.b)("p",null,"(Or see the next section for how to start all the containers, including the collectors.)"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d sflow-collector netflow-collector\n")),Object(r.b)("p",null,"If the collector(s) are running properly, you should see nfcapd files in subdirectories of data/input_data/, and they should have sizes of more than a few hundred bytes. (See Troubleshooting if you have problems.)"),Object(r.b)("h3",{id:"running-the-collectors-and-pipeline"},"Running the Collectors and Pipeline"),Object(r.b)("p",null,Object(r.b)("p",{parentName:"p"},"Start up the pipeline (all containers) using:"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d\n")),Object(r.b)("p",{parentName:"p"},'This will also restart any containers/processes that have died. "-d" runs containers in the background.'),Object(r.b)("p",{parentName:"p"},"You can see the status of the containers and whether any have died (exited) using"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose ps\n")),Object(r.b)("p",{parentName:"p"},"To check the logs for each of the containers, run"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose logs\n")),Object(r.b)("p",{parentName:"p"},"Add ",Object(r.b)("inlineCode",{parentName:"p"},"-f")," or, e.g., ",Object(r.b)("inlineCode",{parentName:"p"},"-f logstash")," to see new log messages as they arrive. ",Object(r.b)("inlineCode",{parentName:"p"},"--timestamps"),", ",Object(r.b)("inlineCode",{parentName:"p"},"--tail"),", and ",Object(r.b)("inlineCode",{parentName:"p"},"--since")," are also useful -- look up details in Docker documentation."),Object(r.b)("p",{parentName:"p"},"To shut down the pipeline (all containers) use"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose down\n"))),Object(r.b)("h2",{id:"upgrading"},"Upgrading"),Object(r.b)("p",null,Object(r.b)("h3",{parentName:"p"},"Shut things down"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cd {netsage-pipeline directory}\ndocker-compose down\n")),Object(r.b)("p",{parentName:"p"},"This will stop all the docker containers, including the importer, logstash, and any collectors. Note that incoming flow data will not be saved during the time the collectors are down."),Object(r.b)("h3",{parentName:"p"},"Update Source Code"),Object(r.b)("p",{parentName:"p"},"To upgrade to a new release, just reset and pull changes including the new release from github. Your customized .env and override files will not be overwritten."),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"git reset --hard\ngit pull origin master\n")),Object(r.b)("div",{parentName:"p",className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"git reset --hard will obliterate any changes you have made to non-override files. If necessary, please make sure you commit and save to a feature branch before continuing."),Object(r.b)("p",{parentName:"div"},"Example:\n",Object(r.b)("inlineCode",{parentName:"p"},'git commit -a -m "Saving local state"; git checkout -b feature/backup; git checkout master')))),Object(r.b)("h3",{parentName:"p"},"Check/Update Files"),Object(r.b)("ul",{parentName:"p"},Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},'Compare the new docker-compose.override_example.yml file to your docker-compose.override.yml to see if a new version of Docker is required. Look for, eg, version: "3.7" at the top. If the version number is different, change it in your docker-compose.override.yml file and upgrade Docker manually.')),Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},'In the same files, see if the version of nfdump has changed. Look for lines like "image: netsage/nfdump-collector:1.6.18". If there has been a change, update the version in the override file. (You do not need to actually perform any update yourself.)\nNote that you do not need to update the versions of the importer or logstash images. That will be done for you in the "select release version" stop coming up.')),Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"Also compare your .env file with the new env.example file to see if any new lines or sections have been added. Copy new lines into your .env file, making any appropriate changes to example values.")),Object(r.b)("li",{parentName:"ul"},Object(r.b)("p",{parentName:"li"},"If you used the Docker Advanced guide to make a netsage_override.xml file, compare it to netsage_shared.xml to see if there are any changes. This is unlikely."))),Object(r.b)("h3",{parentName:"p"},"Select Release Version"),Object(r.b)("p",{parentName:"p"},'Run these two commands to select the new release you want to run. In the first, replace "tag_value" by the version to run (eg, v1.2.8). When asked by the second, select the same version as the tag you checked out.'),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre",className:"language-sh"},"git checkout -b tag_value \ngit pull\n./scripts/docker_select_version.sh\n")),Object(r.b)("p",{parentName:"p"},"Check to be sure docker-compose.yml and docker-compose.override.yml both now have the version number you selected. "),Object(r.b)("h3",{parentName:"p"},"Update Docker Containers"),Object(r.b)("p",{parentName:"p"},"Do not forget this step! This applies for both development and release versions."),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre"},"docker-compose pull\n")),Object(r.b)("h3",{parentName:"p"},"Restart Docker Containers"),Object(r.b)("pre",{parentName:"p"},Object(r.b)("code",{parentName:"pre"},"docker-compose up -d\n")),Object(r.b)("p",{parentName:"p"},"This will start all the services/containers listed in the docker-compose.yml and docker-compose.override.yml files, including the importer, logstash pipeline, and collectors."),Object(r.b)("h3",{parentName:"p"},"Delete old images"),Object(r.b)("p",{parentName:"p"},"To save space, delete any old images that are not needed. ")))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return d})),n.d(t,"b",(function(){return h}));var a=n(0),o=n.n(a);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function l(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,h=d["".concat(i,".").concat(m)]||d[m]||b[m]||r;return n?o.a.createElement(h,l(l({ref:t},c),{},{components:n})):o.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),m=a,h=d["".concat(i,".").concat(m)]||d[m]||b[m]||r;return n?o.a.createElement(h,l(l({ref:t},c),{},{components:n})):o.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h4",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique. E.g.,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=MyNet Los Angeles sFlow\n")),Object(r.b)("h4",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but only those using a particular interface are relevant, use this option in the .env file. The collectors and importer will save/read all incoming flows, but the logstash pipeline will drop those that do not have src_ifindex OR dst_inindex equal to one of those listed. "),Object(r.b)("p",null,"In the .env file, uncomment lines in the appropriate section and enter the information required. Be sure ",Object(r.b)("inlineCode",{parentName:"p"},"ifindex_filter_flag=True"),' with "True" capitalized as shown, any sensor names are spelled exactly right, and list all the ifindex values of flows that should be kept and processed. Some examples (use just one!):'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_keep=123\nifindex_filter_keep=123,456\nifindex_filter_keep=Sensor 1: 789\nifindex_filter_keep=123; Sensor 1: 789; Sensor 2: 800, 900\n")),Object(r.b)("p",null,"In the first case, all flows that have src_ifindex = 123 or dst_ifindex = 123 will be kept, regardless of sensor name. (Note that this may be a problem if you have more than 1 sensor with the same ifindex values!)\nIn the 2nd case, if src or dst ifindex is 123 or 456, the flow will be processed.\nIn the 3rd case, only flows from Sensor 1 will be filtered, with flows using ifindex 789 kept.\nIn the last example, any flow with ifindex 123 will be kept. Sensor 1 flows with ifindex 789 (or 123) will be kept, and those from Sensor 2 having ifindex 800 or 900 (or 123) will be kept. "),Object(r.b)("p",null,"Spaces don't matter except within the sensor names. Punctuation is required as shown."),Object(r.b)("h2",{id:"to-filter-flows-by-subnet"},"To Filter Flows by Subnet"),Object(r.b)("p",null,'With this option, flows from specified sensors will be dropped unless src or dst is in the list of subnets to keep. It works similarly to the option to filter by interface. "ALL" can refer to all sensors.\nIf a sensor is not referenced at all, all of its flows will be kept. '),Object(r.b)("p",null,"For example,"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"subnet_filter_flag=True\nsubnet_filter_keep=Sensor A Name: 123.45.6.0/16; Sensor B Name: 123.33.33.0/24, 456.66.66.0/24\n")),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to keep all flows from a certain sensor but differentiate between those that enter or exit through specific sensor interfaces. This can be done by using this option in the .env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that use interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker and only 1 ifindex is allowed.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, corrections have to be applied. For example, if you are sampling 1 out of 100 flows, for each flow measured, it is assumed that in reality there would be 100 flows of that size with that src and dst, so the number of bits (and the number of packets, bits/s and packets/s) is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config, if nfsen is being used, or the nfcapd command, but this is not convenient when using Docker. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. The same correction applies to all listed sensors. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk doesn't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 1 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 1\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-save-flow-data-to-a-different-location"},"To Save Flow Data to a Different Location"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data/ directory (ie, the data/ directory in the git checkout). If you would like to use a different location, there are two options."),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"The best solution is to create a symlink between ./data/ and the preferred location, or, for an NFS volume, export it as ${PROJECT_DIR}/data.")),Object(r.b)("p",null,"During installation, delete the data/ directory (it should only contain .placeholder), then create your symlink. Eg, to use /var/netsage/ instead of data/, "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cd {netsage-pipeline dir}\nmkdir /var/netsage\nrm data/.placeholder\nrmdir data\nln -s /var/netsage {netsage-pipeline dir}/data\n")),Object(r.b)("p",null,"(Check the permissions of the directory.)"),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},"Alternatively, update volumes in docker-compose.yml and docker-compose.override.yml Eg, to save nfcapd files to subdirs in /mydir, set the collector volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir/input_data/netflow:/data")," (similarly for sflow) and set the importer and logstash volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir:/data"),". ")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict or be wiped out on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If cpu or memory seems to be a problem, try increasing the JVM heap size for logstash from 2GB to 3 or 4, no more than 8."),Object(r.b)("p",null,"To do this, edit LS_JAVA_OPTS in the .env file. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"LS_JAVA_OPTS=-Xmx4g -Xms4g\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use.")),Object(r.b)("p",null,"To modify other logstash settings, rename the provided example file for JVM Options and tweak the settings as desired:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")))}d.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,h=p["".concat(l,".").concat(u)]||p[u]||m[u]||r;return n?a.a.createElement(h,i(i({ref:t},c),{},{components:n})):a.a.createElement(h,i({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,l=new Array(r);l[0]=u;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:o,l[1]=i;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h4",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique. E.g.,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=MyNet Los Angeles sFlow\n")),Object(r.b)("h4",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but only those using a particular interface are relevant, use this option in the .env file. The collectors and importer will save/read all incoming flows, but the logstash pipeline will drop those that do not have src_ifindex OR dst_inindex equal to one of those listed. "),Object(r.b)("p",null,"In the .env file, uncomment lines in the appropriate section and enter the information required. Be sure ",Object(r.b)("inlineCode",{parentName:"p"},"ifindex_filter_flag=True"),' with "True" capitalized as shown, any sensor names are spelled exactly right, and list all the ifindex values of flows that should be kept and processed. Some examples (use just one!):'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_keep=123\nifindex_filter_keep=123,456\nifindex_filter_keep=Sensor 1: 789\nifindex_filter_keep=123; Sensor 1: 789; Sensor 2: 800, 900\n")),Object(r.b)("p",null,"In the first case, all flows that have src_ifindex = 123 or dst_ifindex = 123 will be kept, regardless of sensor name. (Note that this may be a problem if you have more than 1 sensor with the same ifindex values!)\nIn the 2nd case, if src or dst ifindex is 123 or 456, the flow will be processed.\nIn the 3rd case, only flows from Sensor 1 will be filtered, with flows using ifindex 789 kept.\nIn the last example, any flow with ifindex 123 will be kept. Sensor 1 flows with ifindex 789 (or 123) will be kept, and those from Sensor 2 having ifindex 800 or 900 (or 123) will be kept. "),Object(r.b)("p",null,"Spaces don't matter except within the sensor names. Punctuation is required as shown."),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to keep all flows from a certain sensor but differentiate between those that enter or exit through specific sensor interfaces. This can be done by using this option in the .env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that use interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker and only 1 ifindex is allowed.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, corrections have to be applied. For example, if you are sampling 1 out of 100 flows, for each flow measured, it is assumed that in reality there would be 100 flows of that size with that src and dst, so the number of bits (and the number of packets, bits/s and packets/s) is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config, if nfsen is being used, or the nfcapd command, but this is not convenient when using Docker. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. The same correction applies to all listed sensors. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk doesn't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 1 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 1\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-save-flow-data-to-a-different-location"},"To Save Flow Data to a Different Location"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data/ directory (ie, the data/ directory in the git checkout). If you would like to use a different location, there are two options."),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"The best solution is to create a symlink between ./data/ and the preferred location, or, for an NFS volume, export it as ${PROJECT_DIR}/data.")),Object(r.b)("p",null,"During installation, delete the data/ directory (it should only contain .placeholder), then create your symlink. Eg, to use /var/netsage/ instead of data/, "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cd {netsage-pipeline dir}\nmkdir /var/netsage\nrm data/.placeholder\nrmdir data\nln -s /var/netsage {netsage-pipeline dir}/data\n")),Object(r.b)("p",null,"(Check the permissions of the directory.)"),Object(r.b)("ol",{start:2},Object(r.b)("li",{parentName:"ol"},"Alternatively, update volumes in docker-compose.yml and docker-compose.override.yml Eg, to save nfcapd files to subdirs in /mydir, set the collector volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir/input_data/netflow:/data")," (similarly for sflow) and set the importer and logstash volumes to ",Object(r.b)("inlineCode",{parentName:"li"},"- /mydir:/data"),". ")),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict or be wiped out on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If cpu or memory seems to be a problem, try increasing the JVM heap size for logstash from 2GB to 3 or 4, no more than 8."),Object(r.b)("p",null,"To do this, edit LS_JAVA_OPTS in the .env file. "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"LS_JAVA_OPTS=-Xmx4g -Xms4g\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use.")),Object(r.b)("p",null,"To modify other logstash settings, rename the provided example file for JVM Options and tweak the settings as desired:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")))}d.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return h}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),u=o,h=p["".concat(i,".").concat(u)]||p[u]||m[u]||r;return n?a.a.createElement(h,l(l({ref:t},c),{},{components:n})):a.a.createElement(h,l({ref:t},c))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(o),d=n,f=p["".concat(i,".").concat(d)]||p[d]||b[d]||a;return o?r.a.createElement(f,l(l({ref:t},c),{},{components:o})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,i[1]=l;for(var c=2;c=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},d=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(o),d=n,f=p["".concat(i,".").concat(d)]||p[d]||b[d]||a;return o?r.a.createElement(f,l(l({ref:t},c),{},{components:o})):r.a.createElement(f,l({ref:t},c))}));function f(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var d=o.a.createContext({}),s=function(e){var t=o.a.useContext(d),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=s(e.components);return o.a.createElement(d.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,d=c(e,["components","mdxType","originalType","parentName"]),p=s(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,l(l({ref:t},d),{},{components:n})):o.a.createElement(m,l({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var d=2;d=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var s=o.a.createContext({}),l=function(e){var n=o.a.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):i(i({},n),e)),t},u=function(e){var n=l(e.components);return o.a.createElement(s.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},b=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,a=e.originalType,c=e.parentName,s=p(e,["components","mdxType","originalType","parentName"]),u=l(t),b=r,m=u["".concat(c,".").concat(b)]||u[b]||d[b]||a;return t?o.a.createElement(m,i(i({ref:n},s),{},{components:t})):o.a.createElement(m,i({ref:n},s))}));function m(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var a=t.length,c=new Array(a);c[0]=b;var i={};for(var p in n)hasOwnProperty.call(n,p)&&(i[p]=n[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,c[1]=i;for(var s=2;s=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=i.a.createContext({}),c=function(e){var t=i.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=c(e.components);return i.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},s),{},{components:n})):i.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=r,m=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=r,m=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=i.a.createContext({}),s=function(e){var t=i.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=s(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},c),{},{components:n})):i.a.createElement(m,p({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=i.a.createContext({}),s=function(e){var t=i.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},u=function(e){var t=s(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=s(n),d=r,m=u["".concat(a,".").concat(d)]||u[d]||f[d]||o;return n?i.a.createElement(m,p(p({ref:t},c),{},{components:n})):i.a.createElement(m,p({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var p={};for(var l in t)hasOwnProperty.call(t,l)&&(p[l]=t[l]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):s(s({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(o),b=n,m=p["".concat(a,".").concat(b)]||p[b]||d[b]||i;return o?r.a.createElement(m,s(s({ref:t},c),{},{components:o})):r.a.createElement(m,s({ref:t},c))}));function m(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=b;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,a[1]=s;for(var c=2;c=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):s(s({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,i=e.originalType,a=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(o),b=n,m=p["".concat(a,".").concat(b)]||p[b]||d[b]||i;return o?r.a.createElement(m,s(s({ref:t},c),{},{components:o})):r.a.createElement(m,s({ref:t},c))}));function m(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=o.length,a=new Array(i);a[0]=b;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,a[1]=s;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,f=p["".concat(a,".").concat(b)]||p[b]||d[b]||i;return n?o.a.createElement(f,l(l({ref:t},c),{},{components:n})):o.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),u=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=u(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(n),b=r,f=p["".concat(a,".").concat(b)]||p[b]||d[b]||i;return n?o.a.createElement(f,l(l({ref:t},c),{},{components:n})):o.a.createElement(f,l({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c")),Object(a.b)("h3",{id:"resource-limitations"},"Resource Limitations"),Object(a.b)("p",null,"If you are running a lot of data sometimes docker may need to be allocated more memory. The most\nlikely culprit is logstash which is usually only allocated 1GB of RAM. You'll need to update the jvm.options file to grant it more memory."),Object(a.b)("p",null,"Please see the ",Object(a.b)("a",{parentName:"p",href:"/netsage-pipeline/docs/1.2.7/deploy/docker_install_advanced#customize-logstash-settings"},"advaned section")," for details on how to customize logstash"),Object(a.b)("p",null,"Applying this snippet to logstash may help. Naturally the values will have to change."),Object(a.b)("p",null,"You may also try the pattern below, if that still isn't enough."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-yaml"},"environment: + LS_JAVA_OPTS=-Xmx3g\n")),Object(a.b)("p",null,"Alternatively you may also try doing this:"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-yaml"},'deploy:\n resources:\n limits:\n cpus: "0.50"\n memory: 50M\n reservations:\n cpus: "0.25"\n memory: 20M\n')),Object(a.b)("p",null,"Reference: ",Object(a.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/compose-file/#resources"},"https://docs.docker.com/compose/compose-file/#resources")))}u.isMDXComponent=!0},232:function(e,t,o){"use strict";o.d(t,"a",(function(){return p})),o.d(t,"b",(function(){return m}));var n=o(0),r=o.n(n);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function l(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(o),b=n,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return o?r.a.createElement(m,l(l({ref:t},c),{},{components:o})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,i[1]=l;for(var c=2;c")),Object(a.b)("h3",{id:"resource-limitations"},"Resource Limitations"),Object(a.b)("p",null,"If you are running a lot of data sometimes docker may need to be allocated more memory. The most\nlikely culprit is logstash which is usually only allocated 1GB of RAM. You'll need to update the jvm.options file to grant it more memory."),Object(a.b)("p",null,"Please see the ",Object(a.b)("a",{parentName:"p",href:"/netsage-pipeline/docs/1.2.7/deploy/docker_install_advanced#customize-logstash-settings"},"advaned section")," for details on how to customize logstash"),Object(a.b)("p",null,"Applying this snippet to logstash may help. Naturally the values will have to change."),Object(a.b)("p",null,"You may also try the pattern below, if that still isn't enough."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-yaml"},"environment: + LS_JAVA_OPTS=-Xmx3g\n")),Object(a.b)("p",null,"Alternatively you may also try doing this:"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-yaml"},'deploy:\n resources:\n limits:\n cpus: "0.50"\n memory: 50M\n reservations:\n cpus: "0.25"\n memory: 20M\n')),Object(a.b)("p",null,"Reference: ",Object(a.b)("a",{parentName:"p",href:"https://docs.docker.com/compose/compose-file/#resources"},"https://docs.docker.com/compose/compose-file/#resources")))}u.isMDXComponent=!0},228:function(e,t,o){"use strict";o.d(t,"a",(function(){return p})),o.d(t,"b",(function(){return m}));var n=o(0),r=o.n(n);function a(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e}function i(e,t){var o=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),o.push.apply(o,n)}return o}function l(e){for(var t=1;t=0||(r[o]=e[o]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,o)&&(r[o]=e[o])}return r}var c=r.a.createContext({}),u=function(e){var t=r.a.useContext(c),o=t;return e&&(o="function"==typeof e?e(t):l(l({},t),e)),o},p=function(e){var t=u(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var o=e.components,n=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(o),b=n,m=p["".concat(i,".").concat(b)]||p[b]||d[b]||a;return o?r.a.createElement(m,l(l({ref:t},c),{},{components:o})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var o=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=o.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:n,i[1]=l;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),u=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=u(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,i=e.originalType,r=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),d=u(n),p=o,h=d["".concat(r,".").concat(p)]||d[p]||b[p]||i;return n?a.a.createElement(h,s(s({ref:t},l),{},{components:n})):a.a.createElement(h,s({ref:t},l))}));function h(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var i=n.length,r=new Array(i);r[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,r[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),s=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},d=function(e){var t=s(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=u(e,["components","mdxType","originalType","parentName"]),d=s(n),b=r,m=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?o.a.createElement(m,c(c({ref:t},l),{},{components:n})):o.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),s=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},d=function(e){var t=s(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,l=u(e,["components","mdxType","originalType","parentName"]),d=s(n),b=r,m=d["".concat(i,".").concat(b)]||d[b]||p[b]||a;return n?o.a.createElement(m,c(c({ref:t},l),{},{components:n})):o.a.createElement(m,c({ref:t},l))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var u in t)hasOwnProperty.call(t,u)&&(c[u]=t[u]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=d(n),p=r,m=u["".concat(i,".").concat(p)]||u[p]||b[p]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},p=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),u=d(n),p=r,m=u["".concat(i,".").concat(p)]||u[p]||b[p]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=p;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),u=o,m=d["".concat(i,".").concat(u)]||d[u]||b[u]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},u=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),u=o,m=d["".concat(i,".").concat(u)]||d[u]||b[u]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=o.a.createContext({}),p=function(e){var t=o.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},m=function(e){var t=p(e.components);return o.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},d=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,r=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),m=p(n),d=a,b=m["".concat(i,".").concat(d)]||m[d]||u[d]||r;return n?o.a.createElement(b,s(s({ref:t},l),{},{components:n})):o.a.createElement(b,s({ref:t},l))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var r=n.length,i=new Array(r);i[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:a,i[1]=s;for(var l=2;l=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),l=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(n),b=r,f=u["".concat(o,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(f,s(s({ref:t},c),{},{components:n})):a.a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=b;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),l=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},b=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),u=l(n),b=r,f=u["".concat(o,".").concat(b)]||u[b]||d[b]||i;return n?a.a.createElement(f,s(s({ref:t},c),{},{components:n})):a.a.createElement(f,s({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=b;var s={};for(var p in t)hasOwnProperty.call(t,p)&&(s[p]=t[p]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var c=2;c\n /path/to/flow-files\n hostname.tld\n\x3c!-- "instance" goes along with sensor\n This is to identify various instances if a sensor has more than one "stream" / data collection\n Defaults to 0.\n 1\n--\x3e\n \x3c!--\n Defaults to sensor, but you can set it to something else here\n \n --\x3e\n \x3c!--\n Flow type: type of flow data (defaults to netflow)\n --\x3e\n \x3c!--\n sflow\n --\x3e\n\n')),Object(a.b)("p",null,"Notice that ",Object(a.b)("inlineCode",{parentName:"p"},"instance")," , ",Object(a.b)("inlineCode",{parentName:"p"},"router-address")," , and ",Object(a.b)("inlineCode",{parentName:"p"},"flow-type")," are commented out. You only need these if you need an something other than the default values, as described in the comments in the default shared config file."),Object(a.b)("p",null,"You can have multiple ",Object(a.b)("inlineCode",{parentName:"p"},"collection")," stanzas, to import multiple collections on one host."),Object(a.b)("p",null,"The shared config looks like this. Note that RabbitMQ connection information is listed, but not the queue or channel, as these will vary per daemon. If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here. Note that you will need to change the rabbit_output for the Finished Flow Mover Daemon regardless (see below)."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"\n \n /path/to/flow-files1\n hostname1.tld\n \n \n /path/to/flow-files2\n hostname2.tld\n \n\n \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n")),Object(a.b)("h3",{id:"configuring-the-pipeline-stages"},"Configuring the Pipeline Stages"),Object(a.b)("p",null,"Each stage must be configured with Rabbit input and output queue information. The intention here is that flows should be deidentified before they leave the original node the flow data is collected on. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(a.b)("p",null,'The username/password are both set to "guest" by default, as this is the default provided by RabbitMQ. This works fine if the localhost is processing all the data. The configs look something like this (some have additional sections).'),Object(a.b)("p",null,"Notice that the only Rabbit connection information that's provided here is that which is not specific in the shared config file. This way if we need to change the credentials throughout the entire pipeline, it's easy to do."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-xml"}," \n \x3c!-- rabbitmq connection info --\x3e\n \n netsage_deidentifier_raw\n 2\n \n \n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n netsage_deidentifier_cached\n 3\n \n \n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n \x3c!-- for stitching, we can only use 1 --\x3e\n 1\n \n \x3c!-- where should we write the cache worker pid file to --\x3e\n /var/run/netsage-cache-workers.pid\n \n \n \n")),Object(a.b)("p",null,"The defaults should work unless the pipeline stages need to be reordered for some reason, or if SSL or different hosts/credentials are needed. However, the very endpoints should be checked. At the moment that means the flow cache (which is the first stage in the pipeline) and the flow mover (the last stage)."),Object(a.b)("h3",{id:"shared-config-file-listing"},"Shared config file listing"),Object(a.b)("p",null,"The shared configuration files and logging configuration files are listed below (all of the pipeline components use these):"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"/etc/grnoc/netsage/deidentifier/netsage_shared.xml - Shared config file allowing configuration of collections, and Rabbit connection information\n/etc/grnoc/netsage/deidentifier/logging.conf - logging config\n/etc/grnoc/netsage/deidentifier/logging-debug.conf - logging config with debug enabled\n")),Object(a.b)("h2",{id:"running-the-daemons"},"Running the daemons"),Object(a.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(a.b)("p",null,"For more details on each individual daemon, use the ",Object(a.b)("inlineCode",{parentName:"p"},"--help")," flag."),Object(a.b)("h3",{id:"daemon-listing"},"Daemon Listing"),Object(a.b)("h4",{id:"netsage-netflow-importer-daemon"},"netsage-netflow-importer-daemon"),Object(a.b)("p",null,"This is a daemon that reads raw netflow data, reads it, and pushes it to a Rabbit queue for processing."),Object(a.b)("p",null,"Config file: ",Object(a.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")," "),Object(a.b)("h2",{id:"setup-notes"},"Setup Notes"),Object(a.b)("p",null,"INPUT AND OUTPUT LOGSTASH FILTERS\nStandard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs (01-inputs.conf and 99-outputs.conf) may be modified for your use.\nTo use the provided 01-inputs.conf and 99-outputs.conf versions, fill in the IP of the final rabbit host in 99-outputs.conf, and put the rabbitmq usernames and passwords into the logstash keystore.\nYour 01 and 99 conf files should not be overwritten by upgrades."),Object(a.b)("p",null,"To set up the keystore: (note that logstash-keystore takes a minute to come back with a prompt)\nBe sure /usr/share/logstash/config exists\n(the full path, in case you need it: /usr/share/logstash/bin/logstash-keystore)\nCreate logstash.keystore in /etc/logstash/: (use the same directory as logstash.yml)"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"}," $ sudo -E logstash-keystore --path.settings /etc/logstash/ create\n You can set a password for the keystore itself if you want to investigate that; otherwise skip it.\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_pw (enter password when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_pw (enter password when prompted)\n```sh\nTo list the keys:\n")),Object(a.b)("p",null," $ sudo -E logstash-keystore list"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"To remove a key-value pair:\n\n```sh\n $ sudo -E logstash-keystore remove \n")),Object(a.b)("p",null,'FLOW STITCHING - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml (default settingss) and/or /etc/logstash/pipelines.yml (settings take precedence). When running logstash on the command line, use "-w 1".'),Object(a.b)("p",null,"See the comments in 04-stitching.conf to learn more about how complete flows are defined."))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var o=n(0),i=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=i.a.createContext({}),p=function(e){var t=i.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},h=i.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),h=o,b=u["".concat(s,".").concat(h)]||u[h]||d[h]||a;return n?i.a.createElement(b,r(r({ref:t},c),{},{components:n})):i.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=h;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:o,s[1]=r;for(var c=2;c\n /path/to/flow-files\n hostname.tld\n\x3c!-- "instance" goes along with sensor\n This is to identify various instances if a sensor has more than one "stream" / data collection\n Defaults to 0.\n 1\n--\x3e\n \x3c!--\n Defaults to sensor, but you can set it to something else here\n \n --\x3e\n \x3c!--\n Flow type: type of flow data (defaults to netflow)\n --\x3e\n \x3c!--\n sflow\n --\x3e\n\n')),Object(a.b)("p",null,"Notice that ",Object(a.b)("inlineCode",{parentName:"p"},"instance")," , ",Object(a.b)("inlineCode",{parentName:"p"},"router-address")," , and ",Object(a.b)("inlineCode",{parentName:"p"},"flow-type")," are commented out. You only need these if you need an something other than the default values, as described in the comments in the default shared config file."),Object(a.b)("p",null,"You can have multiple ",Object(a.b)("inlineCode",{parentName:"p"},"collection")," stanzas, to import multiple collections on one host."),Object(a.b)("p",null,"The shared config looks like this. Note that RabbitMQ connection information is listed, but not the queue or channel, as these will vary per daemon. If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here. Note that you will need to change the rabbit_output for the Finished Flow Mover Daemon regardless (see below)."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"\n \n /path/to/flow-files1\n hostname1.tld\n \n \n /path/to/flow-files2\n hostname2.tld\n \n\n \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n 127.0.0.1\n 5671\n guest\n guest\n 100\n netsage\n 0\n /path/to/cert.crt \x3c!-- required if ssl is 1 --\x3e\n \n\n")),Object(a.b)("h3",{id:"configuring-the-pipeline-stages"},"Configuring the Pipeline Stages"),Object(a.b)("p",null,"Each stage must be configured with Rabbit input and output queue information. The intention here is that flows should be deidentified before they leave the original node the flow data is collected on. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(a.b)("p",null,'The username/password are both set to "guest" by default, as this is the default provided by RabbitMQ. This works fine if the localhost is processing all the data. The configs look something like this (some have additional sections).'),Object(a.b)("p",null,"Notice that the only Rabbit connection information that's provided here is that which is not specific in the shared config file. This way if we need to change the credentials throughout the entire pipeline, it's easy to do."),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-xml"}," \n \x3c!-- rabbitmq connection info --\x3e\n \n netsage_deidentifier_raw\n 2\n \n \n \x3c!-- The cache does not output to a rabbit queue (shared memory instead) but we still need something here --\x3e\n \n netsage_deidentifier_cached\n 3\n \n \n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n \x3c!-- for stitching, we can only use 1 --\x3e\n 1\n \n \x3c!-- where should we write the cache worker pid file to --\x3e\n /var/run/netsage-cache-workers.pid\n \n \n \n")),Object(a.b)("p",null,"The defaults should work unless the pipeline stages need to be reordered for some reason, or if SSL or different hosts/credentials are needed. However, the very endpoints should be checked. At the moment that means the flow cache (which is the first stage in the pipeline) and the flow mover (the last stage)."),Object(a.b)("h3",{id:"shared-config-file-listing"},"Shared config file listing"),Object(a.b)("p",null,"The shared configuration files and logging configuration files are listed below (all of the pipeline components use these):"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre"},"/etc/grnoc/netsage/deidentifier/netsage_shared.xml - Shared config file allowing configuration of collections, and Rabbit connection information\n/etc/grnoc/netsage/deidentifier/logging.conf - logging config\n/etc/grnoc/netsage/deidentifier/logging-debug.conf - logging config with debug enabled\n")),Object(a.b)("h2",{id:"running-the-daemons"},"Running the daemons"),Object(a.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(a.b)("p",null,Object(a.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(a.b)("p",null,"For more details on each individual daemon, use the ",Object(a.b)("inlineCode",{parentName:"p"},"--help")," flag."),Object(a.b)("h3",{id:"daemon-listing"},"Daemon Listing"),Object(a.b)("h4",{id:"netsage-netflow-importer-daemon"},"netsage-netflow-importer-daemon"),Object(a.b)("p",null,"This is a daemon that reads raw netflow data, reads it, and pushes it to a Rabbit queue for processing."),Object(a.b)("p",null,"Config file: ",Object(a.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")," "),Object(a.b)("h2",{id:"setup-notes"},"Setup Notes"),Object(a.b)("p",null,"INPUT AND OUTPUT LOGSTASH FILTERS\nStandard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs (01-inputs.conf and 99-outputs.conf) may be modified for your use.\nTo use the provided 01-inputs.conf and 99-outputs.conf versions, fill in the IP of the final rabbit host in 99-outputs.conf, and put the rabbitmq usernames and passwords into the logstash keystore.\nYour 01 and 99 conf files should not be overwritten by upgrades."),Object(a.b)("p",null,"To set up the keystore: (note that logstash-keystore takes a minute to come back with a prompt)\nBe sure /usr/share/logstash/config exists\n(the full path, in case you need it: /usr/share/logstash/bin/logstash-keystore)\nCreate logstash.keystore in /etc/logstash/: (use the same directory as logstash.yml)"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"}," $ sudo -E logstash-keystore --path.settings /etc/logstash/ create\n You can set a password for the keystore itself if you want to investigate that; otherwise skip it.\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_input_pw (enter password when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_username (enter username when prompted)\n $ sudo -E logstash-keystore --path.settings /etc/logstash/ add rabbitmq_output_pw (enter password when prompted)\n```sh\nTo list the keys:\n")),Object(a.b)("p",null," $ sudo -E logstash-keystore list"),Object(a.b)("pre",null,Object(a.b)("code",{parentName:"pre",className:"language-sh"},"To remove a key-value pair:\n\n```sh\n $ sudo -E logstash-keystore remove \n")),Object(a.b)("p",null,'FLOW STITCHING - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml (default settingss) and/or /etc/logstash/pipelines.yml (settings take precedence). When running logstash on the command line, use "-w 1".'),Object(a.b)("p",null,"See the comments in 04-stitching.conf to learn more about how complete flows are defined."))}p.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var o=n(0),i=n.n(o);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=i.a.createContext({}),p=function(e){var t=i.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return i.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},h=i.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=p(n),h=o,b=u["".concat(s,".").concat(h)]||u[h]||d[h]||a;return n?i.a.createElement(b,r(r({ref:t},c),{},{components:n})):i.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=h;var r={};for(var l in t)hasOwnProperty.call(t,l)&&(r[l]=t[l]);r.originalType=e,r.mdxType="string"==typeof e?e:o,s[1]=r;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,c(c({ref:t},p),{},{components:n})):a.a.createElement(f,c({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,o[1]=c;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,c(c({ref:t},p),{},{components:n})):a.a.createElement(f,c({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,o[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),l=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},u=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=l(n),u=r,m=d["".concat(i,".").concat(u)]||d[u]||f[u]||a;return n?o.a.createElement(m,p(p({ref:t},s),{},{components:n})):o.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=u;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),l=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},u=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=l(n),u=r,m=d["".concat(i,".").concat(u)]||d[u]||f[u]||a;return n?o.a.createElement(m,p(p({ref:t},s),{},{components:n})):o.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=u;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),d=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},p=function(e){var t=d(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=l(e,["components","mdxType","originalType","parentName"]),p=d(n),b=r,m=p["".concat(i,".").concat(b)]||p[b]||u[b]||a;return n?o.a.createElement(m,c(c({ref:t},s),{},{components:n})):o.a.createElement(m,c({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=b;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var s=2;s=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=o.a.createContext({}),s=function(e){var n=o.a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):p(p({},n),e)),t},u=function(e){var n=s(e.components);return o.a.createElement(l.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},m=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,c=e.originalType,a=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=s(t),m=r,b=u["".concat(a,".").concat(m)]||u[m]||d[m]||c;return t?o.a.createElement(b,p(p({ref:n},l),{},{components:t})):o.a.createElement(b,p({ref:n},l))}));function b(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var c=t.length,a=new Array(c);a[0]=m;var p={};for(var i in n)hasOwnProperty.call(n,i)&&(p[i]=n[i]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var l=2;l=0||(o[t]=e[t]);return o}(e,n);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(o[t]=e[t])}return o}var l=o.a.createContext({}),s=function(e){var n=o.a.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):p(p({},n),e)),t},u=function(e){var n=s(e.components);return o.a.createElement(l.Provider,{value:n},e.children)},d={inlineCode:"code",wrapper:function(e){var n=e.children;return o.a.createElement(o.a.Fragment,{},n)}},m=o.a.forwardRef((function(e,n){var t=e.components,r=e.mdxType,c=e.originalType,a=e.parentName,l=i(e,["components","mdxType","originalType","parentName"]),u=s(t),m=r,b=u["".concat(a,".").concat(m)]||u[m]||d[m]||c;return t?o.a.createElement(b,p(p({ref:n},l),{},{components:t})):o.a.createElement(b,p({ref:n},l))}));function b(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var c=t.length,a=new Array(c);a[0]=m;var p={};for(var i in n)hasOwnProperty.call(n,i)&&(p[i]=n[i]);p.originalType=e,p.mdxType="string"==typeof e?e:r,a[1]=p;for(var l=2;l=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=r.a.createContext({}),d=function(e){var t=r.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=d(e.components);return r.a.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.a.createElement(r.a.Fragment,{},t)}},b=r.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=d(n),b=o,m=u["".concat(i,".").concat(b)]||u[b]||p[b]||a;return n?r.a.createElement(m,l(l({ref:t},c),{},{components:n})):r.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var a=n(0),o=n.n(a);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?o.a.createElement(b,r(r({ref:t},c),{},{components:n})):o.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:a,l[1]=r;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},h=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),h=o,m=d["".concat(i,".").concat(h)]||d[h]||b[h]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),p=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=p(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},h=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=p(n),h=o,m=d["".concat(i,".").concat(h)]||d[h]||b[h]||r;return n?a.a.createElement(m,l(l({ref:t},c),{},{components:n})):a.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var a=n(0),o=n.n(a);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?o.a.createElement(b,r(r({ref:t},c),{},{components:n})):o.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:a,l[1]=r;for(var c=2;c\n \x3c!-- Top level directory of the nfcapd files for this sensor (within this dir are normally year directories, etc.) --\x3e\n /path/to/netflow-files/\n\n \x3c!-- Sensor name - can be the hostname or any string you like. Shows up in grafana dashboards. --\x3e\n Netflow Sensor 1\n\n \x3c!-- Flow type - sflow or netflow (defaults to netflow) --\x3e\n sflow\n\n \x3c!-- "instance" goes along with sensor. This is to identify various instances if a sensor has --\x3e\n \x3c!-- more than one "stream" / data collection. Defaults to 0. --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- Used in Flow-Filter. Defaults to sensor, but you can set it to something else here --\x3e\n \x3c!-- --\x3e\n\n')),Object(i.b)("p",null,"Having multiple collections in one importer can sometimes cause issues for aggregation, as looping through the collections one at a time adds to the time between the flows, affecting timeouts. You can also set up multiple Importers with differently named shared and importer config files and separate init.d files. "),Object(i.b)("p",null,"There is also RabbitMQ connection information in the shared config, though queue names are set in the Importer config. (The Importer does not read from a rabbit queue, but other old components did, so both input and output are set.) "),Object(i.b)("p",null,"Ideally, flows should be deidentified before they leave the host on which the data is stored. If flows that have not be deidentified need to be pushed to another node for some reason, the Rabbit connection must be encrypted with SSL."),Object(i.b)("p",null,"If you're running a default RabbitMQ config, which is open only to 'localhost' as guest/guest, you won't need to change anything here."),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre"}," \x3c!-- rabbitmq connection info --\x3e\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n\n \n 127.0.0.1\n 5672\n guest\n guest\n 0\n 100\n /\n 1 \x3c!-- Whether the rabbit queue is 'durable' (don't change this unless you have a reason) --\x3e\n \n")),Object(i.b)("h3",{id:"setting-up-the-importer-config-file"},"Setting up the Importer config file"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"/etc/grnoc/netsage/deidentifier/netsage_netflow_importer.xml")),Object(i.b)("p",null,"This file has a few more setting specific to the Importer component which you may like to adjust. "),Object(i.b)("ul",null,Object(i.b)("li",{parentName:"ul"},"Rabbit_output has the name of the output queue. This should be the same as that of the logstash input queue. "),Object(i.b)("li",{parentName:"ul"},'(The Importer does not actually use an input rabbit queue, so we add a "fake" one here.)'),Object(i.b)("li",{parentName:"ul"},"Min-bytes is a threshold applied to flows aggregated within one nfcapd file. Flows smaller than this will be discarded."),Object(i.b)("li",{parentName:"ul"},"Min-file-age is used to be sure files are complete before being read. "),Object(i.b)("li",{parentName:"ul"},"Cull-enable and cull-ttl can be used to have nfcapd files older than some number of days automatically deleted. "),Object(i.b)("li",{parentName:"ul"},"Pid-file is where the pid file should be written. Be sure this matches what is used in the init.d file."),Object(i.b)("li",{parentName:"ul"},"Keep num-processes set to 1.")),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-xml"},'\n \x3c!-- NOTE: Values here override those in the shared config --\x3e\n\n \x3c!-- rabbitmq queues --\x3e\n \n netsage_deidentifier_netflow_fake\n 2\n \n\n \n 3\n netsage_deidentifier_raw\n \n\n \n \x3c!-- How many flows to process at once --\x3e\n 100\n\n \x3c!-- How many concurrent workers should perform the necessary operations --\x3e\n 1\n\n \x3c!-- path to nfdump executable (defaults to /usr/bin/nfdump) --\x3e\n \x3c!-- /path/to/nfdump --\x3e\n\n \x3c!-- Where to store the cache, where it tracks what files it has/hasn\'t read --\x3e\n /var/cache/netsage/netflow_importer.cache\n\n \x3c!-- The minium flow size threshold - will not import any flows smaller than this --\x3e\n \x3c!-- Defaults to 500M --\x3e\n 100000000 \n\n \x3c!-- Do not import nfcapd files younger than min-file-age\n The value must match /^(\\d+)([DWMYhms])$/ where D, W, M, Y, h, m and s are\n "day(s)", "week(s)", "month(s)", "year(s)", "hour(s)", "minute(s)" and "second(s)", respectively"\n See http://search.cpan.org/~pfig/File-Find-Rule-Age-0.2/lib/File/Find/Rule/Age.pm\n Default: 0 (no minimum age) \n --\x3e\n 10m \n\n \x3c!-- cull-enable: whether to cull processed flow data files --\x3e\n \x3c!-- default: no culling; set to 1 to turn culling on --\x3e\n \x3c!-- 1 --\x3e\n\n \x3c!-- cull-tty: cull time to live, in days --\x3e\n \x3c!-- number of days to retain imported data files before deleting them; default: 3 --\x3e\n \x3c!-- 5 --\x3e\n \n\n \n \x3c!-- where should we write the daemon pid file to --\x3e\n /var/run/netsage-netflow-importer-daemon.pid\n \n\n\n')),Object(i.b)("h2",{id:"logstash-setup-notes"},"Logstash Setup Notes"),Object(i.b)("p",null,"Standard logstash filter config files are provided with this package. Most should be used as-is, but the input and output configs may be modified for your use."),Object(i.b)("p",null,"The aggregation filter also has settings that may be changed as well - check the two timeouts and the aggregation maps path. "),Object(i.b)("p",null,"When upgrading, these logstash configs will not be overwritten. Be sure any changes get copied into the production configs."),Object(i.b)("p",null,'FOR FLOW STITCHING/AGGREGATION - IMPORTANT!\nFlow stitching (ie, aggregation) will NOT work properly with more than ONE logstash pipeline worker!\nBe sure to set "pipeline.workers: 1" in /etc/logstash/logstash.yml and/or /etc/logstash/pipelines.yml. When running logstash on the command line, use "-w 1".'),Object(i.b)("h2",{id:"start-logstash"},"Start Logstash"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service logstash start \n or # systemctl start logstash.service\n")),Object(i.b)("p",null,"It will take couple minutes to start. Log files are normally /var/log/messages and /var/log/logstash/logstash-plain.log."),Object(i.b)("p",null,'When logstash is stopped, any flows currently "in the aggregator" will be written out to /tmp/logstash-aggregation-maps (or the path/file set in 40-aggregation.conf). These will be read in and deleted when logstash is started again. '),Object(i.b)("h2",{id:"start-the-importer"},"Start the Importer"),Object(i.b)("p",null,"Typically, the daemons are started and stopped via init script (CentOS 6) or systemd (CentOS 7). They can also be run manually. The daemons all support these flags:"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--config [file]")," - specify which config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--sharedconfig [file]")," - specify which shared config file to read"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--logging [file]")," - the logging config"),Object(i.b)("p",null,Object(i.b)("inlineCode",{parentName:"p"},"--nofork")," - run in foreground (do not daemonize)"),Object(i.b)("pre",null,Object(i.b)("code",{parentName:"pre",className:"language-sh"},"[root@host ~]# /sbin/service netsage-netflow-importer start \n or # systemctl start netsage-netflow-importer.service\n")),Object(i.b)("p",null,"The Importer will create a deamon process and a worker process. When stopping the service, the worker process might take a few minutes to quit. If it does not quit, kill it by hand. "),Object(i.b)("h2",{id:"cron-jobs"},"Cron jobs"),Object(i.b)("p",null,"Sample cron files are provided. Please review and uncomment their contents. These periodically download MaxMind, CAIDA, and Science Registry files, and also restart logstash. Logstash needs to be restarted in order for any updated files to be read in. "))}p.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return u})),n.d(t,"b",(function(){return b}));var a=n(0),o=n.n(a);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function r(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},h=o.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),h=a,b=u["".concat(l,".").concat(h)]||u[h]||d[h]||i;return n?o.a.createElement(b,r(r({ref:t},c),{},{components:n})):o.a.createElement(b,r({ref:t},c))}));function b(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,l=new Array(i);l[0]=h;var r={};for(var s in t)hasOwnProperty.call(t,s)&&(r[s]=t[s]);r.originalType=e,r.mdxType="string"==typeof e?e:a,l[1]=r;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),s=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},b=function(e){var t=s(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),b=s(n),d=r,f=b["".concat(a,".").concat(d)]||b[d]||u[d]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),s=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},b=function(e){var t=s(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},d=i.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,a=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),b=s(n),d=r,f=b["".concat(a,".").concat(d)]||b[d]||u[d]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=a.a.createContext({}),d=function(e){var t=a.a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},f=function(e){var t=d(e.components);return a.a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},p=a.a.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),f=d(n),p=i,h=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?a.a.createElement(h,r(r({ref:t},l),{},{components:n})):a.a.createElement(h,r({ref:t},l))}));function h(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,s=new Array(o);s[0]=p;var r={};for(var c in t)hasOwnProperty.call(t,c)&&(r[c]=t[c]);r.originalType=e,r.mdxType="string"==typeof e?e:i,s[1]=r;for(var l=2;l\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=Example New York sFlow\n")),Object(r.b)("h3",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but you only want to keep some of them (eg, only send some of them to NetSage), use this option. The collectors and importer will process all flows, but in the logstash pipeline, those that do not have src_ifindex or dst_inindex equal to one of the listed interfaces will be dropped. "),Object(r.b)("p",null,'In the .env file, uncomment the apprpriate section and enter the information required. Be sure "True" is capitalized as shown and list all the ifindex values of flows that should be kept and passed on to NetSage. You may enter one or more ifindex values. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_flag=True\nifindex_filter_keep=123,456\n")),Object(r.b)("p",null,"In this case, only flows that have src_ifindex = 123 or src_ifindex = 456 or dst_ifindex = 123 or dst_ifindex = 456 will be kept. All others will be dropped."),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to differentiate between flows that enter or exit through specific sensor interfaces. This can be done by editing the env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that come through interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name (sensor_id in ElasticSearch) changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, the number of bits needs to be corrected for the sampling rate. For example, if you are sampling 1 out of 100 flows and a sample has 55 MB, it is assumed that in reality there would be 100 flows of that size (with that src and dst), so the number of bits is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config or the nfcapd command. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk don't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 7 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 7\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"The recommended heap size for typical ingestion scenarios should be no less than 4GB and no more than 8GB."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use."),Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process.")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"for-data-saved-to-an-nfs-volume"},"For Data Saved to an NFS Volume"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("p",null,"Note: modifying all the paths in the two files should work, but may not. In one case, it worked to modify only the paths for the collector volumes (eg, - /mnt/nfs/netsagedata/netflow:/data), leaving all others with their default values."),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))))}d.isMDXComponent=!0},232:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return u}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},h=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),h=o,u=p["".concat(i,".").concat(h)]||p[h]||m[h]||r;return n?a.a.createElement(u,l(l({ref:t},c),{},{components:n})):a.a.createElement(u,l({ref:t},c))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c\n /data/input_data/example/\n $exampleSensorName\n sflow\n \n")),Object(r.b)("h3",{id:"c-edit-environment-file"},"c. Edit environment file"),Object(r.b)("p",null,'Then, in the .env file, add a line that sets a value for the "variable" you referenced above, $exampleSensorName. The value is the name of the sensor which will be saved to elasticsearch and which appears in Netsage Dashboards. Set it to something meaningful and unique.'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-ini"},"exampleSensorName=Example New York sFlow\n")),Object(r.b)("h3",{id:"d-running-the-new-collector"},"d. Running the new collector"),Object(r.b)("p",null,"After doing the setup above and selecting the docker version to run, you can start the new collector by running the following line, using the collector name (or by running ",Object(r.b)("inlineCode",{parentName:"p"},"docker-compose up -d")," to start up all containers):"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"docker-compose up -d example-collector\n")),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"The default version of the collector is 1.6.18. There are other versions released and :latest should be point to the latest one, but there is no particular effort made to make sure we released the latest version. You can get a listing of all the current tags listed ",Object(r.b)("a",{parentName:"p",href:"https://hub.docker.com/r/netsage/nfdump-collector/tags"},"here")," and the source to generate the docker image can be found ",Object(r.b)("a",{parentName:"p",href:"https://github.com/netsage-project/docker-nfdump-collector"},"here")," the code for the You may use a different version though there is no particular effort to have an image for every nfdump release."))),Object(r.b)("h2",{id:"to-keep-only-flows-from-certain-interfaces"},"To Keep Only Flows From Certain Interfaces"),Object(r.b)("p",null,"If your sensors are exporting all flows, but you only want to keep some of them (eg, only send some of them to NetSage), use this option. The collectors and importer will process all flows, but in the logstash pipeline, those that do not have src_ifindex or dst_inindex equal to one of the listed interfaces will be dropped. "),Object(r.b)("p",null,'In the .env file, uncomment the apprpriate section and enter the information required. Be sure "True" is capitalized as shown and list all the ifindex values of flows that should be kept and passed on to NetSage. You may enter one or more ifindex values. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_filter_flag=True\nifindex_filter_keep=123,456\n")),Object(r.b)("p",null,"In this case, only flows that have src_ifindex = 123 or src_ifindex = 456 or dst_ifindex = 123 or dst_ifindex = 456 will be kept. All others will be dropped."),Object(r.b)("h2",{id:"to-change-a-sensor-name-depending-on-the-interface-used"},"To Change a Sensor Name Depending on the Interface Used"),Object(r.b)("p",null,"In some cases, users want to differentiate between flows that enter or exit through specific sensor interfaces. This can be done by editing the env file."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 4 fields are set properly! For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"ifindex_sensor_rename_flag=True\nifindex_sensor_rename_old_name=IU Sflow \nifindex_sensor_rename_new_name=IU Bloomington Sflow\nifindex_sensor_rename_ifindex=10032\n")),Object(r.b)("p",null,'In this case, any flows from the "IU Sflow" sensor that come through interface 10032 (src_ifindex = 10032 OR dst_ifindex = 10032) will have the sensor name (sensor_id in ElasticSearch) changed from "IU Sflow" to "IU Bloomington Sflow". Currently, only one such rename can be configured in Docker.'),Object(r.b)("div",{className:"admonition admonition-note alert alert--secondary"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"14",height:"16",viewBox:"0 0 14 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"}))),"note")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"Please notify the devs at IU in advance, if you need to modify a sensor name, because the regexes used for determining sensor_group and sensor_type may have to be updated."))),Object(r.b)("h2",{id:"to-do-sampling-rate-corrections-in-logstash"},"To Do Sampling Rate Corrections in Logstash"),Object(r.b)("p",null,"When flow sampling is done, the number of bits needs to be corrected for the sampling rate. For example, if you are sampling 1 out of 100 flows and a sample has 55 MB, it is assumed that in reality there would be 100 flows of that size (with that src and dst), so the number of bits is multiplied by 100. Usually the collector (nfcapd or sfcapd process) gets the sampling rate from the incoming data and applies the correction, but in some cases, the sensor may not send the sampling rate, or there may be a complex set-up that requires a manual correction. With netflow, a manual correction can be applied using the '-s' option in the nfsen config or the nfcapd command. For sflow, there is no such option. In either case, the correction can be made in logstash as follows."),Object(r.b)("p",null,'In the .env file, uncomment the appropriate section and enter the information required. Be sure "True" is capitalized as shown and all 3 fields are set properly! The same correction can be applied to multiple sensors by using a comma-separed list. For example,'),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"sampling_correction_flag=True\nsampling_correction_sensors=IU Bloomington Sflow, IU Sflow\nsampling_correction_factor=512\n")),Object(r.b)("h2",{id:"to-change-how-long-nfcapd-files-are-kept"},"To Change How Long Nfcapd Files Are Kept"),Object(r.b)("p",null,"The importer will automatically delete older nfcapd files for you, so that your disk don't fill up. By default, 3 days worth of files will be kept. This can be adjusted by making a netsage_override.xml file:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp compose/importer/netsage_shared.xml userConfig/netsage_override.xml\n")),Object(r.b)("p",null,"At the bottom of the file, edit this section to set the number of days worth of files to keep. Set cull-enable to 0 for no culling. Eg, to save 7 days worth of data:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-xml"}," \n 1\n 7\n \n")),Object(r.b)("p",null,"You will also need to uncomment these lines in docker-compose.override.yml: "),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"}," volumes:\n - ./userConfig/netsage_override.xml:/etc/grnoc/netsage/deidentifier/netsage_shared.xml\n")),Object(r.b)("h2",{id:"to-customize-java-settings--increase-memory-available-for-lostash"},"To Customize Java Settings / Increase Memory Available for Lostash"),Object(r.b)("p",null,"If you need to modify the amount of memory logstash can use or any other java settings,\nrename the provided example for JVM Options and tweak the settings as desired."),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-sh"},"cp userConfig/jvm.options_example userConfig/jvm.options\n")),Object(r.b)("p",null,"Also update the docker-compose.override.xml file to uncomment lines in the logstash section. It should look something like this:"),Object(r.b)("pre",null,Object(r.b)("code",{parentName:"pre",className:"language-yaml"},"logstash:\n image: netsage/pipeline_logstash:latest\n volumes:\n - ./userConfig/jvm.options:/usr/share/logstash/config/jvm.options\n")),Object(r.b)("p",null,"Here are some tips for adjusting the JVM heap size (",Object(r.b)("a",{parentName:"p",href:"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"},"https://www.elastic.co/guide/en/logstash/current/jvm-settings.html"),"):"),Object(r.b)("ul",null,Object(r.b)("li",{parentName:"ul"},"The recommended heap size for typical ingestion scenarios should be no less than 4GB and no more than 8GB."),Object(r.b)("li",{parentName:"ul"},"CPU utilization can increase unnecessarily if the heap size is too low, resulting in the JVM constantly garbage collecting. You can check for this issue by doubling the heap size to see if performance improves."),Object(r.b)("li",{parentName:"ul"},"Do not increase the heap size past the amount of physical memory. Some memory must be left to run the OS and other processes. As a general guideline for most installations, don\u2019t exceed 50-75% of physical memory. The more memory you have, the higher percentage you can use."),Object(r.b)("li",{parentName:"ul"},"Set the minimum (Xms) and maximum (Xmx) heap allocation size to the same value to prevent the heap from resizing at runtime, which is a very costly process.")),Object(r.b)("h2",{id:"to-bring-up-kibana-and-elasticsearch-containers"},"To Bring up Kibana and Elasticsearch Containers"),Object(r.b)("p",null,"The file docker-compose.develop.yaml can be used in conjunction with docker-compose.yaml to bring up the optional Kibana and Elastic Search components."),Object(r.b)("p",null,"This isn't a production pattern but the tools can be useful at times. Please refer to the ",Object(r.b)("a",{parentName:"p",href:"../devel/docker_dev_guide#optional-elasticsearch-and-kibana"},"Docker Dev Guide")),Object(r.b)("h2",{id:"for-data-saved-to-an-nfs-volume"},"For Data Saved to an NFS Volume"),Object(r.b)("p",null,"By default, data is saved to subdirectories in the ./data directory. If you would like to use an NFS mount instead you will need to either"),Object(r.b)("ol",null,Object(r.b)("li",{parentName:"ol"},"export the NFS volume as ${PROJECT_DIR}/data (which is the idea scenario and least intrusive)"),Object(r.b)("li",{parentName:"ol"},"update the path to the NFS export path in all locations in docker-compose.yml and docker-compose.override.yml")),Object(r.b)("p",null,"Note: modifying all the paths in the two files should work, but may not. In one case, it worked to modify only the paths for the collector volumes (eg, - /mnt/nfs/netsagedata/netflow:/data), leaving all others with their default values."),Object(r.b)("div",{className:"admonition admonition-warning alert alert--danger"},Object(r.b)("div",{parentName:"div",className:"admonition-heading"},Object(r.b)("h5",{parentName:"div"},Object(r.b)("span",{parentName:"h5",className:"admonition-icon"},Object(r.b)("svg",{parentName:"span",xmlns:"http://www.w3.org/2000/svg",width:"12",height:"16",viewBox:"0 0 12 16"},Object(r.b)("path",{parentName:"svg",fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"}))),"warning")),Object(r.b)("div",{parentName:"div",className:"admonition-content"},Object(r.b)("p",{parentName:"div"},"If you choose to update the docker-compose file, keep in mind that those changes will cause a merge conflict on upgrade.\nYou'll have to manage the volumes exported and ensure all the paths are updated correctly for the next release manually."))))}d.isMDXComponent=!0},228:function(e,t,n){"use strict";n.d(t,"a",(function(){return p})),n.d(t,"b",(function(){return u}));var o=n(0),a=n.n(o);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function l(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=a.a.createContext({}),d=function(e){var t=a.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},p=function(e){var t=d(e.components);return a.a.createElement(c.Provider,{value:t},e.children)},m={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},h=a.a.forwardRef((function(e,t){var n=e.components,o=e.mdxType,r=e.originalType,i=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=d(n),h=o,u=p["".concat(i,".").concat(h)]||p[h]||m[h]||r;return n?a.a.createElement(u,l(l({ref:t},c),{},{components:n})):a.a.createElement(u,l({ref:t},c))}));function u(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var r=n.length,i=new Array(r);i[0]=h;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var p=i.a.createContext({}),c=function(e){var t=i.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},d=function(e){var t=c(e.components);return i.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return i.a.createElement(i.a.Fragment,{},t)}},u=i.a.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,r=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),u=a,f=d["".concat(r,".").concat(u)]||d[u]||b[u]||o;return n?i.a.createElement(f,l(l({ref:t},p),{},{components:n})):i.a.createElement(f,l({ref:t},p))}));function f(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,r=new Array(o);r[0]=u;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,r[1]=l;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),c=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},p),{},{components:n})):o.a.createElement(f,i({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var s in t)hasOwnProperty.call(t,s)&&(i[s]=t[s]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,s(s({ref:t},p),{},{components:n})):a.a.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var p=2;p=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,s(s({ref:t},p),{},{components:n})):a.a.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=r,m=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),p=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):l(l({},t),e)),n},u=function(e){var t=p(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,a=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),u=p(n),b=r,m=u["".concat(a,".").concat(b)]||u[b]||d[b]||i;return n?o.a.createElement(m,l(l({ref:t},c),{},{components:n})):o.a.createElement(m,l({ref:t},c))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,a=new Array(i);a[0]=b;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),l=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},u=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=l(n),u=r,m=d["".concat(i,".").concat(u)]||d[u]||f[u]||a;return n?o.a.createElement(m,p(p({ref:t},s),{},{components:n})):o.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=u;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var s=o.a.createContext({}),l=function(e){var t=o.a.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):p(p({},t),e)),n},d=function(e){var t=l(e.components);return o.a.createElement(s.Provider,{value:t},e.children)},f={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},u=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,s=c(e,["components","mdxType","originalType","parentName"]),d=l(n),u=r,m=d["".concat(i,".").concat(u)]||d[u]||f[u]||a;return n?o.a.createElement(m,p(p({ref:t},s),{},{components:n})):o.a.createElement(m,p({ref:t},s))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=u;var p={};for(var c in t)hasOwnProperty.call(t,c)&&(p[c]=t[c]);p.originalType=e,p.mdxType="string"==typeof e?e:r,i[1]=p;for(var s=2;s=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var p=a.a.createContext({}),l=function(e){var t=a.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=l(e.components);return a.a.createElement(p.Provider,{value:t},e.children)},b={inlineCode:"code",wrapper:function(e){var t=e.children;return a.a.createElement(a.a.Fragment,{},t)}},d=a.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,i=e.originalType,o=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),u=l(n),d=r,f=u["".concat(o,".").concat(d)]||u[d]||b[d]||i;return n?a.a.createElement(f,s(s({ref:t},p),{},{components:n})):a.a.createElement(f,s({ref:t},p))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,o[1]=s;for(var p=2;p=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),s=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=s(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},c),{},{components:n})):o.a.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var c=o.a.createContext({}),s=function(e){var t=o.a.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return o.a.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},b=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,c=p(e,["components","mdxType","originalType","parentName"]),d=s(n),b=r,f=d["".concat(l,".").concat(b)]||d[b]||u[b]||a;return n?o.a.createElement(f,i(i({ref:t},c),{},{components:n})):o.a.createElement(f,i({ref:t},c))}));function f(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,l=new Array(a);l[0]=b;var i={};for(var p in t)hasOwnProperty.call(t,p)&&(i[p]=t[p]);i.originalType=e,i.mdxType="string"==typeof e?e:r,l[1]=i;for(var c=2;c=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var p=o.a.createContext({}),l=function(e){var t=o.a.useContext(p),n=t;return e&&(n="function"==typeof e?e(t):c(c({},t),e)),n},u=function(e){var t=l(e.components);return o.a.createElement(p.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.a.createElement(o.a.Fragment,{},t)}},m=o.a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,a=e.originalType,i=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=l(n),m=r,b=u["".concat(i,".").concat(m)]||u[m]||d[m]||a;return n?o.a.createElement(b,c(c({ref:t},p),{},{components:n})):o.a.createElement(b,c({ref:t},p))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=n.length,i=new Array(a);i[0]=m;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:r,i[1]=c;for(var p=2;p=0;d--){var f=a[d];"."===f?o(a,d):".."===f?(o(a,d),p++):p&&(o(a,d),p--)}if(!c)for(;p--;p)a.unshift("..");!c||""===a[0]||a[0]&&r(a[0])||a.unshift("");var m=a.join("/");return t&&"/"!==m.substr(-1)&&(m+="/"),m};function l(e){return e.valueOf?e.valueOf():Object.prototype.valueOf.call(e)}var s=function e(n,t){if(n===t)return!0;if(null==n||null==t)return!1;if(Array.isArray(n))return Array.isArray(t)&&n.length===t.length&&n.every((function(n,i){return e(n,t[i])}));if("object"==typeof n||"object"==typeof t){var i=l(n),r=l(t);return i!==n||r!==t?e(i,r):Object.keys(Object.assign({},n,t)).every((function(i){return e(n[i],t[i])}))}return!1},c=t(5);function u(e){return"/"===e.charAt(0)?e:"/"+e}function p(e){return"/"===e.charAt(0)?e.substr(1):e}function d(e,n){return function(e,n){return 0===e.toLowerCase().indexOf(n.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(n.length))}(e,n)?e.substr(n.length):e}function f(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function m(e){var n=e.pathname,t=e.search,i=e.hash,r=n||"/";return t&&"?"!==t&&(r+="?"===t.charAt(0)?t:"?"+t),i&&"#"!==i&&(r+="#"===i.charAt(0)?i:"#"+i),r}function g(e,n,t,r){var o;"string"==typeof e?(o=function(e){var n=e||"/",t="",i="",r=n.indexOf("#");-1!==r&&(i=n.substr(r),n=n.substr(0,r));var o=n.indexOf("?");return-1!==o&&(t=n.substr(o),n=n.substr(0,o)),{pathname:n,search:"?"===t?"":t,hash:"#"===i?"":i}}(e)).state=n:(void 0===(o=Object(i.a)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==n&&void 0===o.state&&(o.state=n));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return t&&(o.key=t),r?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=a(o.pathname,r.pathname)):o.pathname=r.pathname:o.pathname||(o.pathname="/"),o}function h(e,n){return e.pathname===n.pathname&&e.search===n.search&&e.hash===n.hash&&e.key===n.key&&s(e.state,n.state)}function v(){var e=null;var n=[];return{setPrompt:function(n){return e=n,function(){e===n&&(e=null)}},confirmTransitionTo:function(n,t,i,r){if(null!=e){var o="function"==typeof e?e(n,t):e;"string"==typeof o?"function"==typeof i?i(o,r):r(!0):r(!1!==o)}else r(!0)},appendListener:function(e){var t=!0;function i(){t&&e.apply(void 0,arguments)}return n.push(i),function(){t=!1,n=n.filter((function(e){return e!==i}))}},notifyListeners:function(){for(var e=arguments.length,t=new Array(e),i=0;in?t.splice(n,t.length-n,r):t.push(r),p({action:i,location:r,index:n,entries:t})}}))},replace:function(e,n){var i="REPLACE",r=g(e,n,d(),k.location);u.confirmTransitionTo(r,i,t,(function(e){e&&(k.entries[k.index]=r,p({action:i,location:r}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var n=k.index+e;return n>=0&&n=0||(r[t]=e[t]);return r}t.d(n,"a",(function(){return i}))},function(e,n,t){"use strict";var i=!("undefined"==typeof window||!window.document||!window.document.createElement),r={canUseDOM:i,canUseEventListeners:i&&!(!window.addEventListener&&!window.attachEvent),canUseIntersectionObserver:i&&"IntersectionObserver"in window,canUseViewport:i&&!!window.screen};n.a=r},function(e,n,t){"use strict";t.d(n,"a",(function(){return l})),t.d(n,"b",(function(){return s}));var i=t(2),r=t(3),o=t(0),a=t.n(o);function l(e,n,t){return void 0===t&&(t=[]),e.some((function(e){var r=e.path?Object(i.j)(n,e):t.length?t[t.length-1].match:i.e.computeRootMatch(n);return r&&(t.push({route:e,match:r}),e.routes&&l(e.routes,n,t)),r})),t}function s(e,n,t){return void 0===n&&(n={}),void 0===t&&(t={}),e?a.a.createElement(i.g,t,e.map((function(e,t){return a.a.createElement(i.d,{key:e.key||t,path:e.path,exact:e.exact,strict:e.strict,render:function(t){return e.render?e.render(Object(r.a)({},t,{},n,{route:e})):a.a.createElement(e.component,Object(r.a)({},t,n,{route:e}))}})}))):null}},function(e,n,t){"use strict";t.d(n,"a",(function(){return p})),t.d(n,"b",(function(){return d})),t.d(n,"c",(function(){return b})),t.d(n,"e",(function(){return w}));var i=t(2);t.d(n,"d",(function(){return i.a})),t.d(n,"f",(function(){return i.b})),t.d(n,"g",(function(){return i.c})),t.d(n,"h",(function(){return i.d})),t.d(n,"i",(function(){return i.e})),t.d(n,"j",(function(){return i.f})),t.d(n,"k",(function(){return i.g})),t.d(n,"l",(function(){return i.i})),t.d(n,"m",(function(){return i.j})),t.d(n,"n",(function(){return i.k})),t.d(n,"o",(function(){return i.l})),t.d(n,"p",(function(){return i.m})),t.d(n,"q",(function(){return i.n})),t.d(n,"r",(function(){return i.o}));var r=t(4),o=t(0),a=t.n(o),l=t(6),s=(t(1),t(3)),c=t(7),u=t(5),p=function(e){function n(){for(var n,t=arguments.length,i=new Array(t),r=0;r
'};function r(e,n,t){return et?t:e}function o(e){return 100*(-1+e)}function a(e,n,t){var r;return(r="translate3d"===i.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===i.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+n+"ms "+t,r}t.configure=function(e){var n,t;for(n in e)void 0!==(t=e[n])&&e.hasOwnProperty(n)&&(i[n]=t);return this},t.status=null,t.set=function(e){var n=t.isStarted();e=r(e,i.minimum,1),t.status=1===e?null:e;var o=t.render(!n),c=o.querySelector(i.barSelector),u=i.speed,p=i.easing;return o.offsetWidth,l((function(n){""===i.positionUsing&&(i.positionUsing=t.getPositioningCSS()),s(c,a(e,u,p)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){t.remove(),n()}),u)}),u)):setTimeout(n,u)})),this},t.isStarted=function(){return"number"==typeof t.status},t.start=function(){t.status||t.set(0);var e=function(){setTimeout((function(){t.status&&(t.trickle(),e())}),i.trickleSpeed)};return i.trickle&&e(),this},t.done=function(e){return e||t.status?t.inc(.3+.5*Math.random()).set(1):this},t.inc=function(e){var n=t.status;return n?("number"!=typeof e&&(e=(1-n)*r(Math.random()*n,.1,.95)),n=r(n+e,0,.994),t.set(n)):t.start()},t.trickle=function(){return t.inc(Math.random()*i.trickleRate)},e=0,n=0,t.promise=function(i){return i&&"resolved"!==i.state()?(0===n&&t.start(),e++,n++,i.always((function(){0==--n?(e=0,t.done()):t.set((e-n)/e)})),this):this},t.render=function(e){if(t.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var n=document.createElement("div");n.id="nprogress",n.innerHTML=i.template;var r,a=n.querySelector(i.barSelector),l=e?"-100":o(t.status||0),c=document.querySelector(i.parent);return s(a,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),i.showSpinner||(r=n.querySelector(i.spinnerSelector))&&f(r),c!=document.body&&u(c,"nprogress-custom-parent"),c.appendChild(n),n},t.remove=function(){p(document.documentElement,"nprogress-busy"),p(document.querySelector(i.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},t.isRendered=function(){return!!document.getElementById("nprogress")},t.getPositioningCSS=function(){var e=document.body.style,n="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return n+"Perspective"in e?"translate3d":n+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function n(){var t=e.shift();t&&t(n)}return function(t){e.push(t),1==e.length&&n()}}(),s=function(){var e=["Webkit","O","Moz","ms"],n={};function t(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,n){return n.toUpperCase()}))}function i(n){var t=document.body.style;if(n in t)return n;for(var i,r=e.length,o=n.charAt(0).toUpperCase()+n.slice(1);r--;)if((i=e[r]+o)in t)return i;return n}function r(e){return e=t(e),n[e]||(n[e]=i(e))}function o(e,n,t){n=r(n),e.style[n]=t}return function(e,n){var t,i,r=arguments;if(2==r.length)for(t in n)void 0!==(i=n[t])&&n.hasOwnProperty(t)&&o(e,t,i);else o(e,r[1],r[2])}}();function c(e,n){return("string"==typeof e?e:d(e)).indexOf(" "+n+" ")>=0}function u(e,n){var t=d(e),i=t+n;c(t,n)||(e.className=i.substring(1))}function p(e,n){var t,i=d(e);c(e,n)&&(t=i.replace(" "+n+" "," "),e.className=t.substring(1,t.length-1))}function d(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return t})?i.call(n,t,n,e):i)||(e.exports=r)},function(e,n,t){"use strict";t.r(n);var i=t(0),r=t(14);n.default=function(){var e=Object(i.useContext)(r.a);if(null===e)throw new Error("Docusaurus context not provided");return e}},,,function(e,n,t){var i={"./":48};function r(e){var n=o(e);return t(n)}function o(e){if(!t.o(i,e)){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}return i[e]}r.keys=function(){return Object.keys(i)},r.resolve=o,e.exports=r,r.id=19},function(e,n,t){"use strict";function i(e,n){e.prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n}function r(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function o(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function a(){return(a=Object.assign||function(e){for(var n=1;ne.length)return;if(!(w instanceof s)){if(g&&y!=n.length-1){if(d.lastIndex=k,!(P=d.exec(e)))break;for(var _=P.index+(m?P[1].length:0),x=P.index+P[0].length,E=y,S=k,T=n.length;E=(S+=n[E].length)&&(++y,k=S);if(n[y]instanceof s)continue;C=E-y,w=e.slice(k,S),P.index-=k}else{d.lastIndex=0;var P=d.exec(w),C=1}if(P){m&&(h=P[1]?P[1].length:0),x=(_=P.index+h)+(P=P[0].slice(h)).length;var O=w.slice(0,_),A=w.slice(x),R=[y,C];O&&(++y,k+=O.length,R.push(O));var N=new s(c,f?r.tokenize(P,f):P,v,P,g);if(R.push(N),A&&R.push(A),Array.prototype.splice.apply(n,R),1!=C&&r.matchGrammar(e,n,t,y,k,!0,c),a)break}else if(a)break}}}}},hooks:{add:function(){},run:function(e,n){}},tokenize:function(e,n,t){var i=[e],o=n.rest;if(o){for(var a in o)n[a]=o[a];delete n.rest}return r.matchGrammar(e,i,n,0,0,!1),i}},(o=r.Token=function(e,n,t,i,r){this.type=e,this.content=n,this.alias=t,this.length=0|(i||"").length,this.greedy=!!r}).stringify=function(e,n,t){if("string"==typeof e)return e;if("Array"===r.util.type(e))return e.map((function(t){return o.stringify(t,n,e)})).join("");var i={type:e.type,content:o.stringify(e.content,n,t),tag:"span",classes:["token",e.type],attributes:{},language:n,parent:t};if(e.alias){var a="Array"===r.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(i.classes,a)}var l=Object.keys(i.attributes).map((function(e){return e+'="'+(i.attributes[e]||"").replace(/"/g,""")+'"'})).join(" ");return"<"+i.tag+' class="'+i.classes.join(" ")+'"'+(l?" "+l:"")+">"+i.content+""},r);a.languages.markup={comment://,prolog:/<\?[\s\S]+?\?>/,doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/,name:/[^\s<>'"]+/}},cdata://i,tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,n){var t={};t["language-"+n]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[n]},t.cdata=/^$/i;var i={"included-cdata":{pattern://i,inside:t}};i["language-"+n]={pattern:/[\s\S]+/,inside:a.languages[n]};var r={};r[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:i},a.languages.insertBefore("markup","cdata",r)}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var n="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",t={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},i={bash:t,environment:{pattern:RegExp("\\$"+n),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--?|-=|\+\+?|\+=|!=?|~|\*\*?|\*=|\/=?|%=?|<<=?|>>=?|<=?|>=?|==?|&&?|&=|\^=?|\|\|?|\|=|\?|:/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+n),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|x[0-9a-fA-F]{1,2}|u[0-9a-fA-F]{4}|U[0-9a-fA-F]{8})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)\w+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b\w+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+n),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+?)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:i},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:t}},{pattern:/(^|[^\\](?:\\\\)*)(["'])(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|(?!\2)[^\\`$])*\2/,lookbehind:!0,greedy:!0,inside:i}],environment:{pattern:RegExp("\\$?"+n),alias:"constant"},variable:i.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|aptitude|apt-cache|apt-get|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:if|then|else|elif|fi|for|while|in|case|esac|function|select|do|done|until)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|break|cd|continue|eval|exec|exit|export|getopts|hash|pwd|readonly|return|shift|test|times|trap|umask|unset|alias|bind|builtin|caller|command|declare|echo|enable|help|let|local|logout|mapfile|printf|read|readarray|source|type|typeset|ulimit|unalias|set|shopt)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:true|false)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|==?|!=?|=~|<<[<-]?|[&\d]?>>|\d?[<>]&?|&[>&]?|\|[&|]?|<=?|>=?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},t.inside=e.languages.bash;for(var r=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=i.variable[1].inside,a=0;a]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:__attribute__|_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,function:/[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}},constant:/\b(?:__FILE__|__LINE__|__DATE__|__TIME__|__TIMESTAMP__|__func__|EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|stdin|stdout|stderr)\b/}),delete a.languages.c.boolean,function(e){var n=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char8_t|char16_t|char32_t|class|compl|concept|const|consteval|constexpr|constinit|const_cast|continue|co_await|co_return|co_yield|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|int8_t|int16_t|int32_t|int64_t|uint8_t|uint16_t|uint32_t|uint64_t|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/;e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return n.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:n,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:true|false)\b/}),e.languages.insertBefore("cpp","string",{"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","operator",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+n.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+n.source+"$"),alias:"url"}}},selector:RegExp("[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+n.source+")*(?=\\s*\\{)"),string:{pattern:n,greedy:!0},property:/(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,important:/!important\b/i,function:/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var t=e.languages.markup;t&&(t.tag.addInlined("style","css"),e.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/(^|["'\s])style\s*=\s*(?:"[^"]*"|'[^']*')/i,lookbehind:!0,inside:{"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{style:{pattern:/(["'])[\s\S]+(?=["']$)/,lookbehind:!0,alias:"language-css",inside:e.languages.css},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},"attr-name":/^style/i}}},t.tag))}(a),function(e){var n,t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector,inside:n={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=n,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var i={pattern:/(\b\d+)(?:%|[a-z]+\b)/,lookbehind:!0},r={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#(?:[\da-f]{1,2}){3,4}\b/i,alias:"color"},color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:i,number:r,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:i,number:r})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:prototype|constructor))/,lookbehind:!0}],keyword:[{pattern:/((?:^|})\s*)(?:catch|finally)\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|for|from|function|(?:get|set)(?=\s*[\[$\w\xA0-\uFFFF])|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:/\b(?:(?:0[xX](?:[\dA-Fa-f](?:_[\dA-Fa-f])?)+|0[bB](?:[01](?:_[01])?)+|0[oO](?:[0-7](?:_[0-7])?)+)n?|(?:\d(?:_\d)?)+n|NaN|Infinity)\b|(?:\b(?:\d(?:_\d)?)+\.?(?:\d(?:_\d)?)*|\B\.(?:\d(?:_\d)?)+)(?:[Ee][+-]?(?:\d(?:_\d)?)+)?/,operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|interface|extends|implements|instanceof|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*]|\\.|[^/\\\[\r\n])+\/[gimyus]{0,6}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-flags":/[a-z]+$/,"regex-delimiter":/^\/|\/$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{"template-string":{pattern:/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}|(?!\${)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})+}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\${|}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}}}),a.languages.markup&&a.languages.markup.tag.addInlined("script","javascript"),a.languages.js=a.languages.javascript,function(e){var n=e.util.clone(e.languages.javascript);e.languages.jsx=e.languages.extend("markup",n),e.languages.jsx.tag.pattern=/<\/?(?:[\w.:-]+(?:\s+(?:[\w.:$-]+(?:=(?:"(?:\\[^]|[^\\"])*"|'(?:\\[^]|[^\\'])*'|[^\s{'">=]+|\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\}))?|\{\s*\.{3}\s*[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\s*\}))*\s*\/?)?>/i,e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/i,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[^]|[^\\"])*"|'(?:\\[^]|[^\\'])*'|[^\s'">]+)/i,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.insertBefore("inside","attr-name",{spread:{pattern:/\{\s*\.{3}\s*[a-z_$][\w$]*(?:\.[a-z_$][\w$]*)*\s*\}/,inside:{punctuation:/\.{3}|[{}.]/,"attr-value":/\w+/}}},e.languages.jsx.tag),e.languages.insertBefore("inside","attr-value",{script:{pattern:/=(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])+\})/i,inside:{"script-punctuation":{pattern:/^=(?={)/,alias:"punctuation"},rest:e.languages.jsx},alias:"language-javascript"}},e.languages.jsx.tag);var t=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(t).join(""):""},i=function(n){for(var r=[],o=0;o0&&r[r.length-1].tagName===t(a.content[0].content[1])&&r.pop():"/>"===a.content[a.content.length-1].content||r.push({tagName:t(a.content[0].content[1]),openedBraces:0}):r.length>0&&"punctuation"===a.type&&"{"===a.content?r[r.length-1].openedBraces++:r.length>0&&r[r.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?r[r.length-1].openedBraces--:l=!0),(l||"string"==typeof a)&&r.length>0&&0===r[r.length-1].openedBraces){var s=t(a);o0&&("string"==typeof n[o-1]||"plain-text"===n[o-1].type)&&(s=t(n[o-1])+s,n.splice(o-1,1),o--),n[o]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&i(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||i(e.tokens)}))}(a),function(e){function n(e,n){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),n)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:(?:Uint|Int)(?:8|16|32)|Uint8Clamped|Float(?:32|64))?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|(?:Weak)?(?:Set|Map)|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:n(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:n(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|for|finally|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:n(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|location|navigator|performance|(?:local|session)Storage|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var t=["function","function-variable","method","method-variable","property-access"],i=0;i",unchanged:" ",diff:"!"};Object.keys(n).forEach((function(t){var i=n[t],r=[];/^\w+$/.test(t)||r.push(/\w+/.exec(t)[0]),"diff"===t&&r.push("bold"),e.languages.diff[t]={pattern:RegExp("^(?:["+i+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:r,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(t)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:n})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/m,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/m}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(["'`])(?:\\[\s\S]|(?!\1)[^\\])*\1/,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|iota|nil|true|false)\b/,number:/(?:\b0x[a-f\d]+|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[-+]?\d+)?)i?/i,operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:bool|byte|complex(?:64|128)|error|float(?:32|64)|rune|string|u?int(?:8|16|32|64)?|uintptr|append|cap|close|complex|copy|delete|imag|len|make|new|panic|print(?:ln)?|real|recover)\b/}),delete a.languages.go["class-name"],a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:true|false)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*)[a-zA-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,punctuation:/[!(){}\[\]:=,]/,constant:/\b(?!ID\b)[A-Z][A-Z_\d]*\b/},function(e){function n(e,n){return"___"+e.toUpperCase()+n+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(t,i,r,o){if(t.language===i){var a=t.tokenStack=[];t.code=t.code.replace(r,(function(e){if("function"==typeof o&&!o(e))return e;for(var r,l=a.length;-1!==t.code.indexOf(r=n(i,l));)++l;return a[l]=e,r})),t.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(t,i){if(t.language===i&&t.tokenStack){t.grammar=e.languages[i];var r=0,o=Object.keys(t.tokenStack);!function a(l){for(var s=0;s=o.length);s++){var c=l[s];if("string"==typeof c||c.content&&"string"==typeof c.content){var u=o[r],p=t.tokenStack[u],d="string"==typeof c?c:c.content,f=n(i,u),m=d.indexOf(f);if(m>-1){++r;var g=d.substring(0,m),h=new e.Token(i,e.tokenize(p,t.grammar),"language-"+i,p),v=d.substring(m+f.length),b=[];g&&b.push.apply(b,a([g])),b.push(h),v&&b.push.apply(b,a([v])),"string"==typeof c?l.splice.apply(l,[s,1].concat(b)):c.content=b}}else c.content&&a(c.content)}return l}(t.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/i,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:true|false)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/i,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(n){e.languages["markup-templating"].buildPlaceholders(n,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(n){e.languages["markup-templating"].tokenizePlaceholders(n,"handlebars")}))}(a),a.languages.json={property:{pattern:/"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,greedy:!0},string:{pattern:/"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/i,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},builtin:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,symbol:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:[/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,{pattern:/(\()(?:addsuffix|abspath|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:s|list)?)(?=[ \t])/,lookbehind:!0}],operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},function(e){var n=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?!\n|\r\n?))/.source;function t(e){return e=e.replace(//g,(function(){return n})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var i=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,r=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return i})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"font-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+r+o+"(?:"+r+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+r+o+")(?:"+r+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(i),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+r+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+r+"$"),inside:{"table-header":{pattern:RegExp(i),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/``.+?``|`[^`\r\n]+`/,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:t(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:t(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:t(/(~~?)(?:(?!~))+?\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},url:{pattern:t(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(n){["url","bold","italic","strike"].forEach((function(t){n!==t&&(e.languages.markdown[n].inside.content.inside[t]=e.languages.markdown[t])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(n){if(n&&"string"!=typeof n)for(var t=0,i=n.length;t]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:/\(\*[\s\S]*?\*\)/,string:[{pattern:/"(?:\\.|[^\\\r\n"])*"/,greedy:!0},{pattern:/(['`])(?:\\(?:\d+|x[\da-f]+|.)|(?!\1)[^\\\r\n])\1/i,greedy:!0}],number:/\b(?:0x[\da-f][\da-f_]+|(?:0[bo])?\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?[\d_]+)?)/i,directive:{pattern:/\B#\w+/,alias:"important"},label:{pattern:/\B~\w+/,alias:"function"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"variable"},module:{pattern:/\b[A-Z]\w+/,alias:"variable"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,operator:/:=|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/[(){}\[\]|.,:;]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},"string-interpolation":{pattern:/(?:f|rf|fr)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:{{)*){(?!{)(?:[^{}]|{(?!{)(?:[^{}]|{(?!{)(?:[^{}])+})+})+}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|rb|br)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|rb|br)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^\s*)@\w+(?:\.\w+)*/im,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:and|as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:True|False|None)\b/,number:/(?:\b(?=\d)|\B(?=\.))(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:mod|land|lor|lxor|lsl|lsr|asr)\b/}),a.languages.insertBefore("reason","class-name",{character:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,alias:"string"},constructor:{pattern:/\b[A-Z]\w*\b(?!\s*\.)/,alias:"variable"},label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,inside:{atrule:/(?:@[\w-]+|[+=])/m}}}),delete e.languages.sass.atrule;var n=/\$[-\w]+|#\{\$[-\w]+\}/,t=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|or|not)\b/,{pattern:/(\s+)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,inside:{punctuation:/:/,variable:n,operator:t}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:n,operator:t,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/,lookbehind:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]+))/m,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:if|else(?: if)?|forward|for|each|while|import|use|extend|debug|warn|mixin|include|function|return|content)\b/i,{pattern:/( +)(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|with|show|hide)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:true|false)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|or|not)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,a.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:_INSERT|COL)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:S|ING)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:TRUE|FALSE|NULL)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|IN|LIKE|NOT|OR|IS|DIV|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var n={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},t={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},i={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/url\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:if|else|for|return|unless)(?=\s+|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:rgb|hsl)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:rgb|hsl)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:n,number:t,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:n,boolean:/\b(?:true|false)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:t,punctuation:/[{}()\[\];:,]/};i.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^{|}$/,alias:"punctuation"},rest:i}},i.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:i}},e.languages.stylus={"atrule-declaration":{pattern:/(^\s*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:i}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:i}},statement:{pattern:/(^[ \t]*)(?:if|else|for|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:i}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,](?=$)(?!(?:\r?\n|\r)(?:\{|\2[ \t]+)))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:i.interpolation}},rest:i}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t]+)))/m,lookbehind:!0,inside:{interpolation:i.interpolation,comment:i.comment,punctuation:/[{},]/}},func:i.func,string:i.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:i.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},keyword:/\b(?:abstract|as|asserts|async|await|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|is|keyof|let|module|namespace|new|null|of|package|private|protected|public|readonly|return|require|set|static|super|switch|this|throw|try|type|typeof|undefined|var|void|while|with|yield)\b/,builtin:/\b(?:string|Function|any|number|boolean|Array|symbol|console|Promise|unknown|never)\b/}),delete e.languages.typescript.parameter;var n=e.languages.extend("typescript",{});delete n["class-name"],e.languages.typescript["class-name"].inside=n,e.languages.insertBefore("typescript","function",{"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:n}}}}),e.languages.ts=e.languages.typescript}(a),function(e){var n=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",n);var t=e.languages.tsx.tag;t.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^_`|~]+/i,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/},function(e){var n=/[*&][^\s[\]{},]+/,t=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,i="(?:"+t.source+"(?:[ \t]+"+n.source+")?|"+n.source+"(?:[ \t]+"+t.source+")?)",r=/(?:[^\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})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function a(e,n){n=(n||"").replace(/m/g,"")+"m";var t=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|]|}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return i})).replace(/<>/g,(function(){return e}));return RegExp(t,n)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return i}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return i})).replace(/<>/g,(function(){return"(?:"+r+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:a(/\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:!0,alias:"number"},boolean:{pattern:a(/true|false/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:a(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:a(o),lookbehind:!0,greedy:!0},number:{pattern:a(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.?\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:t,important:n,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),n.a=a},function(e,n,t){"use strict";var i=t(0),r=t.n(i),o=t(35);n.a=function(e){return r.a.createElement(o.a,Object.assign({},e))}},function(e){e.exports=JSON.parse("{}")},function(e,n,t){"use strict";var i=t(9);n.a=i.b},function(e,n){var t;t=function(){return this}();try{t=t||new Function("return this")()}catch(i){"object"==typeof window&&(t=window)}e.exports=t},function(e,n,t){"use strict";e.exports=t(46)},function(e,n,t){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(n){console.error(n)}}(),e.exports=t(40)},function(e){e.exports=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/netsage-pipeline/docs","versions":[{"name":"current","label":"master (unreleased)","isLast":false,"path":"/netsage-pipeline/docs/next","mainDocId":"pipeline/intro","docs":[{"id":"components/docker_env","path":"/netsage-pipeline/docs/next/components/docker_env"},{"id":"components/docker_first_steps","path":"/netsage-pipeline/docs/next/components/docker_first_steps"},{"id":"components/docker_pipeline","path":"/netsage-pipeline/docs/next/components/docker_pipeline"},{"id":"deploy/docker_install_advanced","path":"/netsage-pipeline/docs/next/deploy/docker_install_advanced","sidebar":"Pipeline"},{"id":"deploy/docker_install_simple","path":"/netsage-pipeline/docs/next/deploy/docker_install_simple","sidebar":"Pipeline"},{"id":"deploy/docker_troubleshoot","path":"/netsage-pipeline/docs/next/deploy/docker_troubleshoot","sidebar":"Pipeline"},{"id":"deploy/docker_upgrade","path":"/netsage-pipeline/docs/next/deploy/docker_upgrade","sidebar":"Pipeline"},{"id":"devel/dev_dataset","path":"/netsage-pipeline/docs/next/devel/dev_dataset","sidebar":"Pipeline"},{"id":"devel/docker_dev_guide","path":"/netsage-pipeline/docs/next/devel/docker_dev_guide","sidebar":"Pipeline"},{"id":"devel/docker_dev_tag","path":"/netsage-pipeline/docs/next/devel/docker_dev_tag","sidebar":"Pipeline"},{"id":"devel/docusaurus","path":"/netsage-pipeline/docs/next/devel/docusaurus","sidebar":"Pipeline"},{"id":"pipeline/elastic","path":"/netsage-pipeline/docs/next/pipeline/elastic","sidebar":"Pipeline"},{"id":"pipeline/importer","path":"/netsage-pipeline/docs/next/pipeline/importer","sidebar":"Pipeline"},{"id":"pipeline/intro","path":"/netsage-pipeline/docs/next/pipeline/intro","sidebar":"Pipeline"},{"id":"pipeline/logstash","path":"/netsage-pipeline/docs/next/pipeline/logstash","sidebar":"Pipeline"},{"id":"pipeline/nfdump","path":"/netsage-pipeline/docs/next/pipeline/nfdump","sidebar":"Pipeline"},{"id":"pipeline/tstat","path":"/netsage-pipeline/docs/next/pipeline/tstat","sidebar":"Pipeline"}]},{"name":"2.1.0","label":"2.1.0","isLast":true,"path":"/netsage-pipeline/docs","mainDocId":"pipeline/intro","docs":[{"id":"components/docker_env","path":"/netsage-pipeline/docs/components/docker_env"},{"id":"components/docker_first_steps","path":"/netsage-pipeline/docs/components/docker_first_steps"},{"id":"components/docker_pipeline","path":"/netsage-pipeline/docs/components/docker_pipeline"},{"id":"deploy/docker_install_advanced","path":"/netsage-pipeline/docs/deploy/docker_install_advanced","sidebar":"version-2.1.0/Pipeline"},{"id":"deploy/docker_install_simple","path":"/netsage-pipeline/docs/deploy/docker_install_simple","sidebar":"version-2.1.0/Pipeline"},{"id":"deploy/docker_troubleshoot","path":"/netsage-pipeline/docs/deploy/docker_troubleshoot","sidebar":"version-2.1.0/Pipeline"},{"id":"deploy/docker_upgrade","path":"/netsage-pipeline/docs/deploy/docker_upgrade","sidebar":"version-2.1.0/Pipeline"},{"id":"devel/dev_dataset","path":"/netsage-pipeline/docs/devel/dev_dataset","sidebar":"version-2.1.0/Pipeline"},{"id":"devel/docker_dev_guide","path":"/netsage-pipeline/docs/devel/docker_dev_guide","sidebar":"version-2.1.0/Pipeline"},{"id":"devel/docker_dev_tag","path":"/netsage-pipeline/docs/devel/docker_dev_tag","sidebar":"version-2.1.0/Pipeline"},{"id":"devel/docusaurus","path":"/netsage-pipeline/docs/devel/docusaurus","sidebar":"version-2.1.0/Pipeline"},{"id":"pipeline/elastic","path":"/netsage-pipeline/docs/pipeline/elastic","sidebar":"version-2.1.0/Pipeline"},{"id":"pipeline/importer","path":"/netsage-pipeline/docs/pipeline/importer","sidebar":"version-2.1.0/Pipeline"},{"id":"pipeline/intro","path":"/netsage-pipeline/docs/pipeline/intro","sidebar":"version-2.1.0/Pipeline"},{"id":"pipeline/logstash","path":"/netsage-pipeline/docs/pipeline/logstash","sidebar":"version-2.1.0/Pipeline"},{"id":"pipeline/nfdump","path":"/netsage-pipeline/docs/pipeline/nfdump","sidebar":"version-2.1.0/Pipeline"},{"id":"pipeline/tstat","path":"/netsage-pipeline/docs/pipeline/tstat","sidebar":"version-2.1.0/Pipeline"}]},{"name":"1.2.11","label":"1.2.11","isLast":false,"path":"/netsage-pipeline/docs/1.2.11","mainDocId":"pipeline/intro","docs":[{"id":"components/docker_env","path":"/netsage-pipeline/docs/1.2.11/components/docker_env"},{"id":"components/docker_first_steps","path":"/netsage-pipeline/docs/1.2.11/components/docker_first_steps"},{"id":"components/docker_pipeline","path":"/netsage-pipeline/docs/1.2.11/components/docker_pipeline"},{"id":"deploy/bare_metal_install","path":"/netsage-pipeline/docs/1.2.11/deploy/bare_metal_install","sidebar":"version-1.2.11/Pipeline"},{"id":"deploy/choose_install","path":"/netsage-pipeline/docs/1.2.11/deploy/choose_install","sidebar":"version-1.2.11/Pipeline"},{"id":"deploy/docker_install_advanced","path":"/netsage-pipeline/docs/1.2.11/deploy/docker_install_advanced","sidebar":"version-1.2.11/Pipeline"},{"id":"deploy/docker_install_simple","path":"/netsage-pipeline/docs/1.2.11/deploy/docker_install_simple","sidebar":"version-1.2.11/Pipeline"},{"id":"deploy/docker_troubleshoot","path":"/netsage-pipeline/docs/1.2.11/deploy/docker_troubleshoot","sidebar":"version-1.2.11/Pipeline"},{"id":"deploy/docker_upgrade","path":"/netsage-pipeline/docs/1.2.11/deploy/docker_upgrade","sidebar":"version-1.2.11/Pipeline"},{"id":"devel/dev_dataset","path":"/netsage-pipeline/docs/1.2.11/devel/dev_dataset","sidebar":"version-1.2.11/Pipeline"},{"id":"devel/docker_dev_guide","path":"/netsage-pipeline/docs/1.2.11/devel/docker_dev_guide","sidebar":"version-1.2.11/Pipeline"},{"id":"devel/docker_dev_tag","path":"/netsage-pipeline/docs/1.2.11/devel/docker_dev_tag","sidebar":"version-1.2.11/Pipeline"},{"id":"devel/docusaurus","path":"/netsage-pipeline/docs/1.2.11/devel/docusaurus","sidebar":"version-1.2.11/Pipeline"},{"id":"pipeline/elastic","path":"/netsage-pipeline/docs/1.2.11/pipeline/elastic","sidebar":"version-1.2.11/Pipeline"},{"id":"pipeline/importer","path":"/netsage-pipeline/docs/1.2.11/pipeline/importer","sidebar":"version-1.2.11/Pipeline"},{"id":"pipeline/intro","path":"/netsage-pipeline/docs/1.2.11/pipeline/intro","sidebar":"version-1.2.11/Pipeline"},{"id":"pipeline/logstash","path":"/netsage-pipeline/docs/1.2.11/pipeline/logstash","sidebar":"version-1.2.11/Pipeline"},{"id":"pipeline/nfdump","path":"/netsage-pipeline/docs/1.2.11/pipeline/nfdump","sidebar":"version-1.2.11/Pipeline"},{"id":"pipeline/tstat","path":"/netsage-pipeline/docs/1.2.11/pipeline/tstat","sidebar":"version-1.2.11/Pipeline"}]},{"name":"1.2.10","label":"1.2.10","isLast":false,"path":"/netsage-pipeline/docs/1.2.10","mainDocId":"pipeline/intro","docs":[{"id":"components/docker_env","path":"/netsage-pipeline/docs/1.2.10/components/docker_env"},{"id":"components/docker_first_steps","path":"/netsage-pipeline/docs/1.2.10/components/docker_first_steps"},{"id":"components/docker_pipeline","path":"/netsage-pipeline/docs/1.2.10/components/docker_pipeline"},{"id":"deploy/bare_metal_install","path":"/netsage-pipeline/docs/1.2.10/deploy/bare_metal_install","sidebar":"version-1.2.10/Pipeline"},{"id":"deploy/choose_install","path":"/netsage-pipeline/docs/1.2.10/deploy/choose_install","sidebar":"version-1.2.10/Pipeline"},{"id":"deploy/docker_install_advanced","path":"/netsage-pipeline/docs/1.2.10/deploy/docker_install_advanced","sidebar":"version-1.2.10/Pipeline"},{"id":"deploy/docker_install_simple","path":"/netsage-pipeline/docs/1.2.10/deploy/docker_install_simple","sidebar":"version-1.2.10/Pipeline"},{"id":"deploy/docker_troubleshoot","path":"/netsage-pipeline/docs/1.2.10/deploy/docker_troubleshoot","sidebar":"version-1.2.10/Pipeline"},{"id":"deploy/docker_upgrade","path":"/netsage-pipeline/docs/1.2.10/deploy/docker_upgrade","sidebar":"version-1.2.10/Pipeline"},{"id":"devel/dev_dataset","path":"/netsage-pipeline/docs/1.2.10/devel/dev_dataset","sidebar":"version-1.2.10/Pipeline"},{"id":"devel/docker_dev_guide","path":"/netsage-pipeline/docs/1.2.10/devel/docker_dev_guide","sidebar":"version-1.2.10/Pipeline"},{"id":"devel/docker_dev_tag","path":"/netsage-pipeline/docs/1.2.10/devel/docker_dev_tag","sidebar":"version-1.2.10/Pipeline"},{"id":"devel/docusaurus","path":"/netsage-pipeline/docs/1.2.10/devel/docusaurus","sidebar":"version-1.2.10/Pipeline"},{"id":"pipeline/elastic","path":"/netsage-pipeline/docs/1.2.10/pipeline/elastic","sidebar":"version-1.2.10/Pipeline"},{"id":"pipeline/importer","path":"/netsage-pipeline/docs/1.2.10/pipeline/importer","sidebar":"version-1.2.10/Pipeline"},{"id":"pipeline/intro","path":"/netsage-pipeline/docs/1.2.10/pipeline/intro","sidebar":"version-1.2.10/Pipeline"},{"id":"pipeline/logstash","path":"/netsage-pipeline/docs/1.2.10/pipeline/logstash","sidebar":"version-1.2.10/Pipeline"},{"id":"pipeline/nfdump","path":"/netsage-pipeline/docs/1.2.10/pipeline/nfdump","sidebar":"version-1.2.10/Pipeline"},{"id":"pipeline/tstat","path":"/netsage-pipeline/docs/1.2.10/pipeline/tstat","sidebar":"version-1.2.10/Pipeline"}]},{"name":"1.2.9","label":"1.2.9","isLast":false,"path":"/netsage-pipeline/docs/1.2.9","mainDocId":"pipeline/intro","docs":[{"id":"components/docker_env","path":"/netsage-pipeline/docs/1.2.9/components/docker_env"},{"id":"components/docker_first_steps","path":"/netsage-pipeline/docs/1.2.9/components/docker_first_steps"},{"id":"components/docker_pipeline","path":"/netsage-pipeline/docs/1.2.9/components/docker_pipeline"},{"id":"components/docker_upgrade","path":"/netsage-pipeline/docs/1.2.9/components/docker_upgrade"},{"id":"deploy/bare_metal_install","path":"/netsage-pipeline/docs/1.2.9/deploy/bare_metal_install","sidebar":"version-1.2.9/Pipeline"},{"id":"deploy/choose_install","path":"/netsage-pipeline/docs/1.2.9/deploy/choose_install","sidebar":"version-1.2.9/Pipeline"},{"id":"deploy/docker_install_advanced","path":"/netsage-pipeline/docs/1.2.9/deploy/docker_install_advanced","sidebar":"version-1.2.9/Pipeline"},{"id":"deploy/docker_install_simple","path":"/netsage-pipeline/docs/1.2.9/deploy/docker_install_simple","sidebar":"version-1.2.9/Pipeline"},{"id":"deploy/docker_troubleshoot","path":"/netsage-pipeline/docs/1.2.9/deploy/docker_troubleshoot","sidebar":"version-1.2.9/Pipeline"},{"id":"devel/dev_dataset","path":"/netsage-pipeline/docs/1.2.9/devel/dev_dataset","sidebar":"version-1.2.9/Pipeline"},{"id":"devel/docker_dev_guide","path":"/netsage-pipeline/docs/1.2.9/devel/docker_dev_guide","sidebar":"version-1.2.9/Pipeline"},{"id":"docusaurus","path":"/netsage-pipeline/docs/1.2.9/docusaurus","sidebar":"version-1.2.9/Pipeline"},{"id":"pipeline/elastic","path":"/netsage-pipeline/docs/1.2.9/pipeline/elastic","sidebar":"version-1.2.9/Pipeline"},{"id":"pipeline/importer","path":"/netsage-pipeline/docs/1.2.9/pipeline/importer","sidebar":"version-1.2.9/Pipeline"},{"id":"pipeline/intro","path":"/netsage-pipeline/docs/1.2.9/pipeline/intro","sidebar":"version-1.2.9/Pipeline"},{"id":"pipeline/logstash","path":"/netsage-pipeline/docs/1.2.9/pipeline/logstash","sidebar":"version-1.2.9/Pipeline"},{"id":"pipeline/nfdump","path":"/netsage-pipeline/docs/1.2.9/pipeline/nfdump","sidebar":"version-1.2.9/Pipeline"},{"id":"pipeline/tstat","path":"/netsage-pipeline/docs/1.2.9/pipeline/tstat","sidebar":"version-1.2.9/Pipeline"}]},{"name":"1.2.8","label":"1.2.8","isLast":false,"path":"/netsage-pipeline/docs/1.2.8","mainDocId":"pipeline/intro","docs":[{"id":"components/docker_env","path":"/netsage-pipeline/docs/1.2.8/components/docker_env"},{"id":"components/docker_first_steps","path":"/netsage-pipeline/docs/1.2.8/components/docker_first_steps"},{"id":"components/docker_pipeline","path":"/netsage-pipeline/docs/1.2.8/components/docker_pipeline"},{"id":"components/docker_upgrade","path":"/netsage-pipeline/docs/1.2.8/components/docker_upgrade"},{"id":"deploy/bare_metal_install","path":"/netsage-pipeline/docs/1.2.8/deploy/bare_metal_install","sidebar":"version-1.2.8/Pipeline"},{"id":"deploy/choose_install","path":"/netsage-pipeline/docs/1.2.8/deploy/choose_install","sidebar":"version-1.2.8/Pipeline"},{"id":"deploy/docker_install_advanced","path":"/netsage-pipeline/docs/1.2.8/deploy/docker_install_advanced","sidebar":"version-1.2.8/Pipeline"},{"id":"deploy/docker_install_simple","path":"/netsage-pipeline/docs/1.2.8/deploy/docker_install_simple","sidebar":"version-1.2.8/Pipeline"},{"id":"deploy/docker_troubleshoot","path":"/netsage-pipeline/docs/1.2.8/deploy/docker_troubleshoot","sidebar":"version-1.2.8/Pipeline"},{"id":"devel/dev_dataset","path":"/netsage-pipeline/docs/1.2.8/devel/dev_dataset","sidebar":"version-1.2.8/Pipeline"},{"id":"devel/docker_dev_guide","path":"/netsage-pipeline/docs/1.2.8/devel/docker_dev_guide","sidebar":"version-1.2.8/Pipeline"},{"id":"docusaurus","path":"/netsage-pipeline/docs/1.2.8/docusaurus","sidebar":"version-1.2.8/Pipeline"},{"id":"pipeline/elastic","path":"/netsage-pipeline/docs/1.2.8/pipeline/elastic","sidebar":"version-1.2.8/Pipeline"},{"id":"pipeline/importer","path":"/netsage-pipeline/docs/1.2.8/pipeline/importer","sidebar":"version-1.2.8/Pipeline"},{"id":"pipeline/intro","path":"/netsage-pipeline/docs/1.2.8/pipeline/intro","sidebar":"version-1.2.8/Pipeline"},{"id":"pipeline/logstash","path":"/netsage-pipeline/docs/1.2.8/pipeline/logstash","sidebar":"version-1.2.8/Pipeline"},{"id":"pipeline/nfdump","path":"/netsage-pipeline/docs/1.2.8/pipeline/nfdump","sidebar":"version-1.2.8/Pipeline"},{"id":"pipeline/tstat","path":"/netsage-pipeline/docs/1.2.8/pipeline/tstat","sidebar":"version-1.2.8/Pipeline"}]},{"name":"1.2.7","label":"1.2.7","isLast":false,"path":"/netsage-pipeline/docs/1.2.7","mainDocId":"pipeline/intro","docs":[{"id":"components/docker_env","path":"/netsage-pipeline/docs/1.2.7/components/docker_env"},{"id":"components/docker_pipeline","path":"/netsage-pipeline/docs/1.2.7/components/docker_pipeline"},{"id":"components/docker_upgrade","path":"/netsage-pipeline/docs/1.2.7/components/docker_upgrade"},{"id":"deploy/bare_metal_install","path":"/netsage-pipeline/docs/1.2.7/deploy/bare_metal_install","sidebar":"version-1.2.7/Pipeline"},{"id":"deploy/choose_install","path":"/netsage-pipeline/docs/1.2.7/deploy/choose_install","sidebar":"version-1.2.7/Pipeline"},{"id":"deploy/docker_install_advanced","path":"/netsage-pipeline/docs/1.2.7/deploy/docker_install_advanced","sidebar":"version-1.2.7/Pipeline"},{"id":"deploy/docker_install_simple","path":"/netsage-pipeline/docs/1.2.7/deploy/docker_install_simple","sidebar":"version-1.2.7/Pipeline"},{"id":"deploy/docker_troubleshoot","path":"/netsage-pipeline/docs/1.2.7/deploy/docker_troubleshoot","sidebar":"version-1.2.7/Pipeline"},{"id":"devel/dev_dataset","path":"/netsage-pipeline/docs/1.2.7/devel/dev_dataset","sidebar":"version-1.2.7/Pipeline"},{"id":"devel/docker_dev_guide","path":"/netsage-pipeline/docs/1.2.7/devel/docker_dev_guide","sidebar":"version-1.2.7/Pipeline"},{"id":"docusaurus","path":"/netsage-pipeline/docs/1.2.7/docusaurus","sidebar":"version-1.2.7/Pipeline"},{"id":"pipeline/elastic","path":"/netsage-pipeline/docs/1.2.7/pipeline/elastic","sidebar":"version-1.2.7/Pipeline"},{"id":"pipeline/importer","path":"/netsage-pipeline/docs/1.2.7/pipeline/importer","sidebar":"version-1.2.7/Pipeline"},{"id":"pipeline/intro","path":"/netsage-pipeline/docs/1.2.7/pipeline/intro","sidebar":"version-1.2.7/Pipeline"},{"id":"pipeline/logstash","path":"/netsage-pipeline/docs/1.2.7/pipeline/logstash","sidebar":"version-1.2.7/Pipeline"},{"id":"pipeline/nfdump","path":"/netsage-pipeline/docs/1.2.7/pipeline/nfdump","sidebar":"version-1.2.7/Pipeline"},{"id":"pipeline/tstat","path":"/netsage-pipeline/docs/1.2.7/pipeline/tstat","sidebar":"version-1.2.7/Pipeline"}]},{"name":"1.2.6","label":"1.2.6","isLast":false,"path":"/netsage-pipeline/docs/1.2.6","mainDocId":"pipeline","docs":[{"id":"deploy/choose_install","path":"/netsage-pipeline/docs/1.2.6/deploy/choose_install","sidebar":"version-1.2.6/Pipeline"},{"id":"deploy/docker_install","path":"/netsage-pipeline/docs/1.2.6/deploy/docker_install","sidebar":"version-1.2.6/Pipeline"},{"id":"deploy/install","path":"/netsage-pipeline/docs/1.2.6/deploy/install","sidebar":"version-1.2.6/Pipeline"},{"id":"devel/docker","path":"/netsage-pipeline/docs/1.2.6/devel/docker","sidebar":"version-1.2.6/Pipeline"},{"id":"docusaurus","path":"/netsage-pipeline/docs/1.2.6/docusaurus","sidebar":"version-1.2.6/Pipeline"},{"id":"pipeline","path":"/netsage-pipeline/docs/1.2.6/pipeline","sidebar":"version-1.2.6/Pipeline"},{"id":"pipeline_importer","path":"/netsage-pipeline/docs/1.2.6/pipeline_importer","sidebar":"version-1.2.6/Pipeline"},{"id":"pipeline_logstash","path":"/netsage-pipeline/docs/1.2.6/pipeline_logstash","sidebar":"version-1.2.6/Pipeline"}]},{"name":"1.2.5","label":"1.2.5","isLast":false,"path":"/netsage-pipeline/docs/1.2.5","mainDocId":"pipeline","docs":[{"id":"deploy/choose_install","path":"/netsage-pipeline/docs/1.2.5/deploy/choose_install","sidebar":"version-1.2.5/Pipeline"},{"id":"deploy/docker_install","path":"/netsage-pipeline/docs/1.2.5/deploy/docker_install","sidebar":"version-1.2.5/Pipeline"},{"id":"deploy/install","path":"/netsage-pipeline/docs/1.2.5/deploy/install","sidebar":"version-1.2.5/Pipeline"},{"id":"devel/docker","path":"/netsage-pipeline/docs/1.2.5/devel/docker","sidebar":"version-1.2.5/Pipeline"},{"id":"docusaurus","path":"/netsage-pipeline/docs/1.2.5/docusaurus","sidebar":"version-1.2.5/Pipeline"},{"id":"pipeline","path":"/netsage-pipeline/docs/1.2.5/pipeline","sidebar":"version-1.2.5/Pipeline"},{"id":"pipeline_importer","path":"/netsage-pipeline/docs/1.2.5/pipeline_importer","sidebar":"version-1.2.5/Pipeline"},{"id":"pipeline_logstash","path":"/netsage-pipeline/docs/1.2.5/pipeline_logstash","sidebar":"version-1.2.5/Pipeline"}]}]}}}')},function(e){e.exports=JSON.parse('{"defaultLocale":"en","locales":["en"],"localeConfigs":{"en":{"label":"en","direction":"ltr"}},"currentLocale":"en"}')},function(e){e.exports=JSON.parse('{"docusaurusVersion":"2.0.0-alpha.72","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.0-alpha.72"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"2.0.0-alpha.72"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.0-alpha.72"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.0-alpha.72"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.0-alpha.72"}}}')},function(e,n,t){"use strict";var i=t(29),r={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},a={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return i.isMemo(e)?a:l[e.$$typeof]||r}l[i.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[i.Memo]=a;var c=Object.defineProperty,u=Object.getOwnPropertyNames,p=Object.getOwnPropertySymbols,d=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(n,t,i){if("string"!=typeof t){if(m){var r=f(t);r&&r!==m&&e(n,r,i)}var a=u(t);p&&(a=a.concat(p(t)));for(var l=s(n),g=s(t),h=0;h=0||Object.prototype.hasOwnProperty.call(e,i)&&(t[i]=e[i]);return t},W=function(e,n){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!n||"object"!=typeof n&&"function"!=typeof n?e:n},V=function(e){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===n?String(e):String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")},K=function(e){var n=Z(e,k.TITLE),t=Z(e,M);if(t&&n)return t.replace(/%s/g,(function(){return Array.isArray(n)?n.join(""):n}));var i=Z(e,I);return n||i||void 0},Y=function(e){return Z(e,j)||function(){}},Q=function(e,n){return n.filter((function(n){return void 0!==n[e]})).map((function(n){return n[e]})).reduce((function(e,n){return q({},e,n)}),{})},X=function(e,n){return n.filter((function(e){return void 0!==e[k.BASE]})).map((function(e){return e[k.BASE]})).reverse().reduce((function(n,t){if(!n.length)for(var i=Object.keys(t),r=0;r=0;t--){var i=e[t];if(i.hasOwnProperty(n))return i[n]}return null},ee=(i=Date.now(),function(e){var n=Date.now();n-i>16?(i=n,e(n)):setTimeout((function(){ee(e)}),0)}),ne=function(e){return clearTimeout(e)},te="undefined"!=typeof window?window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||ee:e.requestAnimationFrame||ee,ie="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||ne:e.cancelAnimationFrame||ne,re=function(e){return console&&"function"==typeof console.warn&&console.warn(e)},oe=null,ae=function(e,n){var t=e.baseTag,i=e.bodyAttributes,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,l=e.noscriptTags,s=e.onChangeClientState,c=e.scriptTags,u=e.styleTags,p=e.title,d=e.titleAttributes;ce(k.BODY,i),ce(k.HTML,r),se(p,d);var f={baseTag:ue(k.BASE,t),linkTags:ue(k.LINK,o),metaTags:ue(k.META,a),noscriptTags:ue(k.NOSCRIPT,l),scriptTags:ue(k.SCRIPT,c),styleTags:ue(k.STYLE,u)},m={},g={};Object.keys(f).forEach((function(e){var n=f[e],t=n.newTags,i=n.oldTags;t.length&&(m[e]=t),i.length&&(g[e]=f[e].oldTags)})),n&&n(),s(e,m,g)},le=function(e){return Array.isArray(e)?e.join(""):e},se=function(e,n){void 0!==e&&document.title!==e&&(document.title=le(e)),ce(k.TITLE,n)},ce=function(e,n){var t=document.getElementsByTagName(e)[0];if(t){for(var i=t.getAttribute(z),r=i?i.split(","):[],o=[].concat(r),a=Object.keys(n),l=0;l=0;p--)t.removeAttribute(o[p]);r.length===o.length?t.removeAttribute(z):t.getAttribute(z)!==a.join(",")&&t.setAttribute(z,a.join(","))}},ue=function(e,n){var t=document.head||document.querySelector(k.HEAD),i=t.querySelectorAll(e+"["+"data-react-helmet]"),r=Array.prototype.slice.call(i),o=[],a=void 0;return n&&n.length&&n.forEach((function(n){var t=document.createElement(e);for(var i in n)if(n.hasOwnProperty(i))if(i===S)t.innerHTML=n.innerHTML;else if(i===_)t.styleSheet?t.styleSheet.cssText=n.cssText:t.appendChild(document.createTextNode(n.cssText));else{var l=void 0===n[i]?"":n[i];t.setAttribute(i,l)}t.setAttribute(z,"true"),r.some((function(e,n){return a=n,t.isEqualNode(e)}))?r.splice(a,1):o.push(t)})),r.forEach((function(e){return e.parentNode.removeChild(e)})),o.forEach((function(e){return t.appendChild(e)})),{oldTags:r,newTags:o}},pe=function(e){return Object.keys(e).reduce((function(n,t){var i=void 0!==e[t]?t+'="'+e[t]+'"':""+t;return n?n+" "+i:i}),"")},de=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(n,t){return n[N[t]||t]=e[t],n}),n)},fe=function(e,n,t){switch(e){case k.TITLE:return{toComponent:function(){return e=n.title,t=n.titleAttributes,(i={key:e})[z]=!0,r=de(t,i),[m.a.createElement(k.TITLE,r,e)];var e,t,i,r},toString:function(){return function(e,n,t,i){var r=pe(t),o=le(n);return r?"<"+e+' data-react-helmet="true" '+r+">"+V(o,i)+"":"<"+e+' data-react-helmet="true">'+V(o,i)+""}(e,n.title,n.titleAttributes,t)}};case v:case b:return{toComponent:function(){return de(n)},toString:function(){return pe(n)}};default:return{toComponent:function(){return function(e,n){return n.map((function(n,t){var i,r=((i={key:t})[z]=!0,i);return Object.keys(n).forEach((function(e){var t=N[e]||e;if(t===S||t===_){var i=n.innerHTML||n.cssText;r.dangerouslySetInnerHTML={__html:i}}else r[t]=n[e]})),m.a.createElement(e,r)}))}(e,n)},toString:function(){return function(e,n,t){return n.reduce((function(n,i){var r=Object.keys(i).filter((function(e){return!(e===S||e===_)})).reduce((function(e,n){var r=void 0===i[n]?n:n+'="'+V(i[n],t)+'"';return e?e+" "+r:r}),""),o=i.innerHTML||i.cssText||"",a=-1===B.indexOf(e);return n+"<"+e+' data-react-helmet="true" '+r+(a?"/>":">"+o+"")}),"")}(e,n,t)}}}},me=function(e){var n=e.baseTag,t=e.bodyAttributes,i=e.encode,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,l=e.noscriptTags,s=e.scriptTags,c=e.styleTags,u=e.title,p=void 0===u?"":u,d=e.titleAttributes;return{base:fe(k.BASE,n,i),bodyAttributes:fe(v,t,i),htmlAttributes:fe(b,r,i),link:fe(k.LINK,o,i),meta:fe(k.META,a,i),noscript:fe(k.NOSCRIPT,l,i),script:fe(k.SCRIPT,s,i),style:fe(k.STYLE,c,i),title:fe(k.TITLE,{title:p,titleAttributes:d},i)}},ge=u()((function(e){return{baseTag:X([x,R],e),bodyAttributes:Q(v,e),defer:Z(e,L),encode:Z(e,D),htmlAttributes:Q(b,e),linkTags:J(k.LINK,[O,x],e),metaTags:J(k.META,[P,w,E,C,T],e),noscriptTags:J(k.NOSCRIPT,[S],e),onChangeClientState:Y(e),scriptTags:J(k.SCRIPT,[A,S],e),styleTags:J(k.STYLE,[_],e),title:K(e),titleAttributes:Q(y,e)}}),(function(e){oe&&ie(oe),e.defer?oe=te((function(){ae(e,(function(){oe=null}))})):(ae(e),oe=null)}),me)((function(){return null})),he=(r=ge,a=o=function(e){function n(){return $(this,n),W(this,e.apply(this,arguments))}return function(e,n){if("function"!=typeof n&&null!==n)throw new TypeError("Super expression must either be null or a function, not "+typeof n);e.prototype=Object.create(n&&n.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),n&&(Object.setPrototypeOf?Object.setPrototypeOf(e,n):e.__proto__=n)}(n,e),n.prototype.shouldComponentUpdate=function(e){return!d()(this.props,e)},n.prototype.mapNestedChildrenToProps=function(e,n){if(!n)return null;switch(e.type){case k.SCRIPT:case k.NOSCRIPT:return{innerHTML:n};case k.STYLE:return{cssText:n}}throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},n.prototype.flattenArrayTypeChildren=function(e){var n,t=e.child,i=e.arrayTypeChildren,r=e.newChildProps,o=e.nestedChildren;return q({},i,((n={})[t.type]=[].concat(i[t.type]||[],[q({},r,this.mapNestedChildrenToProps(t,o))]),n))},n.prototype.mapObjectTypeChildren=function(e){var n,t,i=e.child,r=e.newProps,o=e.newChildProps,a=e.nestedChildren;switch(i.type){case k.TITLE:return q({},r,((n={})[i.type]=a,n.titleAttributes=q({},o),n));case k.BODY:return q({},r,{bodyAttributes:q({},o)});case k.HTML:return q({},r,{htmlAttributes:q({},o)})}return q({},r,((t={})[i.type]=q({},o),t))},n.prototype.mapArrayTypeChildrenToProps=function(e,n){var t=q({},n);return Object.keys(e).forEach((function(n){var i;t=q({},t,((i={})[n]=e[n],i))})),t},n.prototype.warnOnInvalidChildren=function(e,n){return!0},n.prototype.mapChildrenToProps=function(e,n){var t=this,i={};return m.a.Children.forEach(e,(function(e){if(e&&e.props){var r=e.props,o=r.children,a=function(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(e).reduce((function(n,t){return n[F[t]||t]=e[t],n}),n)}(H(r,["children"]));switch(t.warnOnInvalidChildren(e,o),e.type){case k.LINK:case k.META:case k.NOSCRIPT:case k.SCRIPT:case k.STYLE:i=t.flattenArrayTypeChildren({child:e,arrayTypeChildren:i,newChildProps:a,nestedChildren:o});break;default:n=t.mapObjectTypeChildren({child:e,newProps:n,newChildProps:a,nestedChildren:o})}}})),n=this.mapArrayTypeChildrenToProps(i,n)},n.prototype.render=function(){var e=this.props,n=e.children,t=H(e,["children"]),i=q({},t);return n&&(i=this.mapChildrenToProps(n,i)),m.a.createElement(r,i)},G(n,null,[{key:"canUseDOM",set:function(e){r.canUseDOM=e}}]),n}(m.a.Component),o.propTypes={base:s.a.object,bodyAttributes:s.a.object,children:s.a.oneOfType([s.a.arrayOf(s.a.node),s.a.node]),defaultTitle:s.a.string,defer:s.a.bool,encodeSpecialCharacters:s.a.bool,htmlAttributes:s.a.object,link:s.a.arrayOf(s.a.object),meta:s.a.arrayOf(s.a.object),noscript:s.a.arrayOf(s.a.object),onChangeClientState:s.a.func,script:s.a.arrayOf(s.a.object),style:s.a.arrayOf(s.a.object),title:s.a.string,titleAttributes:s.a.object,titleTemplate:s.a.string},o.defaultProps={defer:!0,encodeSpecialCharacters:!0},o.peek=r.peek,o.rewind=function(){var e=r.rewind();return e||(e=me({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),e},a);he.renderStatic=he.rewind}).call(this,t(28))},function(e,n,t){"use strict";var i,r=t(0),o=(i=r)&&"object"==typeof i&&"default"in i?i.default:i;function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}var l=!("undefined"==typeof window||!window.document||!window.document.createElement);e.exports=function(e,n,t){if("function"!=typeof e)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof n)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==t&&"function"!=typeof t)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(i){if("function"!=typeof i)throw new Error("Expected WrappedComponent to be a React component.");var s,c=[];function u(){s=e(c.map((function(e){return e.props}))),p.canUseDOM?n(s):t&&(s=t(s))}var p=function(e){var n,t;function r(){return e.apply(this,arguments)||this}t=e,(n=r).prototype=Object.create(t.prototype),n.prototype.constructor=n,n.__proto__=t,r.peek=function(){return s},r.rewind=function(){if(r.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var e=s;return s=void 0,c=[],e};var a=r.prototype;return a.UNSAFE_componentWillMount=function(){c.push(this),u()},a.componentDidUpdate=function(){u()},a.componentWillUnmount=function(){var e=c.indexOf(this);c.splice(e,1),u()},a.render=function(){return o.createElement(i,this.props)},r}(r.PureComponent);return a(p,"displayName","SideEffect("+function(e){return e.displayName||e.name||"Component"}(i)+")"),a(p,"canUseDOM",l),p}}},function(e,n){var t="undefined"!=typeof Element,i="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){if(e.constructor!==n.constructor)return!1;var l,s,c,u;if(Array.isArray(e)){if((l=e.length)!=n.length)return!1;for(s=l;0!=s--;)if(!a(e[s],n[s]))return!1;return!0}if(i&&e instanceof Map&&n instanceof Map){if(e.size!==n.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!n.has(s.value[0]))return!1;for(u=e.entries();!(s=u.next()).done;)if(!a(s.value[1],n.get(s.value[0])))return!1;return!0}if(r&&e instanceof Set&&n instanceof Set){if(e.size!==n.size)return!1;for(u=e.entries();!(s=u.next()).done;)if(!n.has(s.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(n)){if((l=e.length)!=n.length)return!1;for(s=l;0!=s--;)if(e[s]!==n[s])return!1;return!0}if(e.constructor===RegExp)return e.source===n.source&&e.flags===n.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===n.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===n.toString();if((l=(c=Object.keys(e)).length)!==Object.keys(n).length)return!1;for(s=l;0!=s--;)if(!Object.prototype.hasOwnProperty.call(n,c[s]))return!1;if(t&&e instanceof Element)return!1;for(s=l;0!=s--;)if(("_owner"!==c[s]&&"__v"!==c[s]&&"__o"!==c[s]||!e.$$typeof)&&!a(e[c[s]],n[c[s]]))return!1;return!0}return e!=e&&n!=n}e.exports=function(e,n){try{return a(e,n)}catch(t){if((t.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw t}}},function(e,n,t){e.exports=t(54)},function(e,n,t){"use strict";var i=t(12),r="function"==typeof Symbol&&Symbol.for,o=r?Symbol.for("react.element"):60103,a=r?Symbol.for("react.portal"):60106,l=r?Symbol.for("react.fragment"):60107,s=r?Symbol.for("react.strict_mode"):60108,c=r?Symbol.for("react.profiler"):60114,u=r?Symbol.for("react.provider"):60109,p=r?Symbol.for("react.context"):60110,d=r?Symbol.for("react.forward_ref"):60112,f=r?Symbol.for("react.suspense"):60113,m=r?Symbol.for("react.memo"):60115,g=r?Symbol.for("react.lazy"):60116,h="function"==typeof Symbol&&Symbol.iterator;function v(e){for(var n="https://reactjs.org/docs/error-decoder.html?invariant="+e,t=1;tA.length&&A.push(e)}function I(e,n,t,i){var r=typeof e;"undefined"!==r&&"boolean"!==r||(e=null);var l=!1;if(null===e)l=!0;else switch(r){case"string":case"number":l=!0;break;case"object":switch(e.$$typeof){case o:case a:l=!0}}if(l)return t(i,e,""===n?"."+D(e,0):n),1;if(l=0,n=""===n?".":n+":",Array.isArray(e))for(var s=0;s