From d01446fef2ad9de93b218772d696138c8549e0e6 Mon Sep 17 00:00:00 2001 From: John Floren Date: Tue, 6 Aug 2024 10:32:40 -0700 Subject: [PATCH 1/7] Start reworking training docker builds to be less wonky We were doing wacky stuff like downloading all the installers and installing them. This is silly, we already have pre-built images for almost everything. With the removal of replace directives from the monorepo, we can also use `go install` to properly build other little bits like gravwellGenerator and reimport. Now that changes have been made, it's important to go through and test/update *every single lab* --- Ingesters/ingesters.tex | 55 ---- dockerfiles/base/Dockerfile | 1 - dockerfiles/base/run.sh | 3 - dockerfiles/brokenperms/.gitignore | 1 - dockerfiles/brokenperms/Dockerfile | 13 - dockerfiles/brokenperms/run.sh | 19 -- dockerfiles/build_all.sh | 25 +- dockerfiles/createslim.sh | 2 +- dockerfiles/datastore/Dockerfile | 12 +- dockerfiles/datastore/README | 5 - dockerfiles/datastore/run.sh | 15 +- dockerfiles/generators/manager.cfg | 4 +- dockerfiles/generators/run.sh | 8 +- dockerfiles/go.mod | 13 - dockerfiles/go.sum | 431 -------------------------- dockerfiles/ingesters/Dockerfile | 18 +- dockerfiles/ingesters/run.sh | 77 +---- dockerfiles/nflowgen/run.sh | 14 +- dockerfiles/offlinereplication/run.sh | 2 +- dockerfiles/pcap/run.sh | 11 - dockerfiles/permissions/.gitignore | 3 - dockerfiles/permissions/Dockerfile | 35 --- dockerfiles/permissions/README | 8 - dockerfiles/permissions/gravwell.conf | 31 -- dockerfiles/permissions/manager.cfg | 24 -- dockerfiles/permissions/run.sh | 43 --- 26 files changed, 18 insertions(+), 855 deletions(-) delete mode 100644 dockerfiles/brokenperms/.gitignore delete mode 100644 dockerfiles/brokenperms/Dockerfile delete mode 100644 dockerfiles/brokenperms/run.sh delete mode 100644 dockerfiles/datastore/README delete mode 100644 dockerfiles/go.mod delete mode 100644 dockerfiles/go.sum delete mode 100644 dockerfiles/permissions/.gitignore delete mode 100644 dockerfiles/permissions/Dockerfile delete mode 100644 dockerfiles/permissions/README delete mode 100644 dockerfiles/permissions/gravwell.conf delete mode 100644 dockerfiles/permissions/manager.cfg delete mode 100644 dockerfiles/permissions/run.sh diff --git a/Ingesters/ingesters.tex b/Ingesters/ingesters.tex index 489591f..bd89a5f 100644 --- a/Ingesters/ingesters.tex +++ b/Ingesters/ingesters.tex @@ -2037,61 +2037,6 @@ \section{Permissions and Port Binding} processes (running as the \code{gravwell} user) won't have access to the files and folders they need. -\subsection{Hands-on Lab: Permissions and Port Binding} - -Docker typically just executes everything as root, so we will be using -a new container that actually uses a proper user and group to execute -Gravwell components. Start by cleaning up the environment: - -\code{docker kill \$(docker ps -q)} - -Ensure the \code{gravwell:brokenperms} container is loaded (if you don't have the \code{gravwell:brokenperms} image, see Section \ref{sec:load-lab-images} for instructions on how to load it), then start it: - -\begin{Verbatim}[breaklines=true] -docker run -d --net gravnet -p 8080:80 --rm \ ---name test gravwell:brokenperms -\end{Verbatim} - -Check the GUI (\href{http://localhost:8080}{http://localhost:8080}), are we able to access Gravwell? Is the container up? - -Let's grab a shell within the container as the root user and start -poking around: - -\begin{Verbatim}[breaklines=true] -docker exec -it --user root test /bin/bash -\end{Verbatim} - -The goal is to fix the installation and get the Gravwell components to -start correctly. Start by answering a few questions: - -\begin{enumerate} -\item - Which services are not starting? -\item - Where are the pertinent log files? -\item - What other locations contain Gravwell logs? -\item - What are the permissions inside \code{/opt/gravwell/}? - \begin{enumerate} - \item - What should they be? - \end{enumerate} -\item - What are the capabilities assigned to each Gravwell service binary? - \begin{enumerate} - \item - What should they be? - \end{enumerate} -\end{enumerate} - -To clean up after the experiment, simply run: - -\begin{Verbatim}[breaklines=true] -docker kill $(docker ps -a -q) -\end{Verbatim} - - \section{Gravwell and Systemd} \index{SystemD} diff --git a/dockerfiles/base/Dockerfile b/dockerfiles/base/Dockerfile index 3a2c82d..c53f7a7 100644 --- a/dockerfiles/base/Dockerfile +++ b/dockerfiles/base/Dockerfile @@ -7,7 +7,6 @@ RUN /bin/rm -f /opt/gravwell/bin/gravwell_simple_relay RUN /bin/rm -f /opt/gravwell/bin/gencert RUN /bin/rm -f /opt/gravwell/bin/gravwell_crash_report -COPY reimport /opt/gravwell/bin/ COPY $MANAGE_CONF /opt/gravwell/etc/ COPY $CONF /opt/gravwell/etc/ ENV GRAVWELL_INGEST_AUTH=IngestSecrets diff --git a/dockerfiles/base/run.sh b/dockerfiles/base/run.sh index 41fec25..883e371 100644 --- a/dockerfiles/base/run.sh +++ b/dockerfiles/base/run.sh @@ -6,9 +6,6 @@ if [[ "$(docker images -q gravwell:slim 2> /dev/null)" == "" ]]; then exit -1 fi TGT="/tmp/base.tar.gz" -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/ingesters/reimport -cp $GOPATH/bin/reimport . docker build -t gravwell:base . docker save gravwell:base | gzip > $TGT echo "Base image is at $TGT" -rm reimport diff --git a/dockerfiles/brokenperms/.gitignore b/dockerfiles/brokenperms/.gitignore deleted file mode 100644 index 1377554..0000000 --- a/dockerfiles/brokenperms/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.swp diff --git a/dockerfiles/brokenperms/Dockerfile b/dockerfiles/brokenperms/Dockerfile deleted file mode 100644 index e3c95e0..0000000 --- a/dockerfiles/brokenperms/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM gravwell:perms -MAINTAINER training@gravwell.io -USER root -RUN chown root:root /opt/gravwell/storage -RUN chown gravwell:gravwell -R /opt/gravwell/bin -USER 1000:1000 - -ENV GRAVWELL_INGEST_AUTH=IngestSecrets -ENV GRAVWELL_INGEST_SECRET=IngestSecrets -ENV GRAVWELL_CONTROL_AUTH=ControlSecrets -ENV GRAVWELL_SEARCHAGENT_AUTH=SearchAgentSecrets -ENV GRAVWELL_PIPE_TARGETS="/opt/gravwell/comms/pipe" -CMD ["/opt/gravwell/bin/manager"] diff --git a/dockerfiles/brokenperms/run.sh b/dockerfiles/brokenperms/run.sh deleted file mode 100644 index e6be9a4..0000000 --- a/dockerfiles/brokenperms/run.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -TGT="/tmp/brokenperms.tar.gz" -base=`docker images -q gravwell:perms` -if [ "$base" == "" ]; then - echo "we need the gravwell:perms image as a base" - exit -1 -fi - -SQUASH="--squash" -exp=`docker version -f '{{.Server.Experimental}}'` -if [ "$exp" == "false" ]; then - echo "your docker instance isn't running with experimental features" - echo "We need this in order to squash the image during build" - SQUASH="" -fi - -docker build --compress $SQUASH -t gravwell:brokenperms . -docker save gravwell:brokenperms | gzip > $TGT -echo "Base image is at $TGT" diff --git a/dockerfiles/build_all.sh b/dockerfiles/build_all.sh index 5dec630..92440cb 100644 --- a/dockerfiles/build_all.sh +++ b/dockerfiles/build_all.sh @@ -1,7 +1,8 @@ #!/bin/bash +set -e LOGFILE=/tmp/build.log OUTDIR=../dockerimages/ -VER=${VERSION:-5.3.0} +VER=${VERSION:-5.4.10} if [ ! -d "$GOPATH" ]; then echo "Must set GOPATH" @@ -27,24 +28,6 @@ if [ ! -d "$OUTDIR" ]; then mkdir -p $OUTDIR fi -#check that our installers exist -installers=("/tmp/gravwell_simple_relay_installer_$VER.sh" "/tmp/gravwell_file_follow_installer_$VER.sh" "/tmp/gravwell_netflow_capture_installer_$VER.sh" "/tmp/gravwell_network_capture_installer_$VER.sh" "/tmp/gravwell_federator_installer_$VER.sh" "/tmp/gravwell_datastore_installer_$VER.sh" "/tmp/gravwell_$VER.sh") - -for inst in "${installers[@]}" -do - if [ ! -f "$inst" ]; then - #attempt to download it - fname=$(basename $inst) - echo curl --output "$inst" "https://update.gravwell.io/archive/$VER/installers/$fname" - curl --output "$inst" "https://update.gravwell.io/archive/$VER/installers/$fname" - if [ "$?" != "0" ]; then - echo "Failed to download $fname" - exit -1 - fi - fi -done - - echo >> $LOGFILE echo "Creating slim container" echo "Creating slim container as our base" >> $LOGFILE @@ -108,10 +91,6 @@ build "offlinereplication" moveTarget "/tmp/offlinereplication.tar.gz" build "datastore" moveTarget "/tmp/datastore.tar.gz" -build "permissions" -moveTarget "/tmp/perms.tar.gz" -build "brokenperms" -moveTarget "/tmp/brokenperms.tar.gz" build "pcap" moveTarget "/tmp/pcap.tar.gz" build "generators" diff --git a/dockerfiles/createslim.sh b/dockerfiles/createslim.sh index 8a2c3b7..139419c 100644 --- a/dockerfiles/createslim.sh +++ b/dockerfiles/createslim.sh @@ -5,7 +5,7 @@ if [ ! -f "$LICENSE" ]; then fi docker rmi gravwell:slim #remove existing slim image -docker pull gravwell/gravwell:latest # grabs latest gw image from dockerhub +docker pull gravwell/gravwell:${VER} # grabs latest gw image from dockerhub docker create --name slim gravwell/gravwell:latest #create temp container from latest image docker cp $LICENSE slim:/opt/gravwell/etc/license docker export slim | docker import - gravwell:slim #trick to squash. export to stdio then re-import under new tag to create "final" slim container diff --git a/dockerfiles/datastore/Dockerfile b/dockerfiles/datastore/Dockerfile index 5e2951f..ef61644 100644 --- a/dockerfiles/datastore/Dockerfile +++ b/dockerfiles/datastore/Dockerfile @@ -1,17 +1,9 @@ -FROM gravwell:base +ARG version +FROM gravwell/datastore:${version} MAINTAINER training@gravwell.io ARG MANAGE_CONF=manager.cfg -RUN /bin/rm -rf /opt/gravwell/storage/* -RUN /bin/rm -f /opt/gravwell/bin/gravwell_simple_relay -RUN /bin/rm -f /opt/gravwell/bin/gencert -RUN /bin/rm -f /opt/gravwell/bin/gravwell_crash_report -RUN /bin/rm -f /opt/gravwell/bin/gravwell_indexer -RUN /bin/rm -f /opt/gravwell/bin/gravwell_webserver -RUN /bin/rm -f /opt/gravwell/bin/gravwell_searchagent COPY $MANAGE_CONF /opt/gravwell/etc/ -COPY datastore.sh /tmp -RUN /bin/sh /tmp/datastore.sh --no-questions --no-crash-report --no-start ENV GRAVWELL_INGEST_AUTH=IngestSecrets ENV GRAVWELL_INGEST_SECRET=IngestSecrets ENV GRAVWELL_CONTROL_AUTH=ControlSecrets diff --git a/dockerfiles/datastore/README b/dockerfiles/datastore/README deleted file mode 100644 index 34a9836..0000000 --- a/dockerfiles/datastore/README +++ /dev/null @@ -1,5 +0,0 @@ -Expects gravwell_datastore_installer_3.0.3.sh in /tmp, or you can provide a path as an argument to run.sh: - -bash run.sh - -bash run.sh /path/to/datastore_installer.sh diff --git a/dockerfiles/datastore/run.sh b/dockerfiles/datastore/run.sh index bb6f532..5d87323 100644 --- a/dockerfiles/datastore/run.sh +++ b/dockerfiles/datastore/run.sh @@ -1,20 +1,7 @@ #!/bin/bash set -e -INSTALLER=`ls /tmp/gravwell_datastore_installer_*.sh | head -n 1` -if [ "$1" != "" ]; then - INSTALLER=$1 -fi - -if [ ! -f "$INSTALLER" ]; then - echo "I need an installer" - exit -1 -fi - -cp $INSTALLER datastore.sh TGT="/tmp/datastore.tar.gz" -docker build -t gravwell:datastore . +docker build --build-arg version=$VER -t gravwell:datastore . docker save gravwell:datastore | gzip > $TGT echo "Base image is at $TGT" - -rm datastore.sh diff --git a/dockerfiles/generators/manager.cfg b/dockerfiles/generators/manager.cfg index f896939..c5b02f3 100644 --- a/dockerfiles/generators/manager.cfg +++ b/dockerfiles/generators/manager.cfg @@ -3,14 +3,14 @@ Log-Level=INFO [Process "barfields"] - Exec='/fieldsGenerator -stream -clear-conns=$TARGET -tag-name=barfields -delim-override="|"' + Exec='/gravwellGenerator -type fields -stream -clear-conns=$TARGET -tag-name=barfields -delim-override="|"' Working-Dir=/ Max-Restarts=100 #three attempts before cooling down CoolDown-Period=1 #10 minutes Restart-Period=1 #10 minutes [Process "tabfields"] - Exec='/fieldsGenerator -stream -clear-conns=$TARGET -tag-name=tabfields -delim-override=" "' + Exec='/gravwellGenerator -type fields -stream -clear-conns=$TARGET -tag-name=tabfields -delim-override=" "' Working-Dir=/ Max-Restarts=100 #three attempts before cooling down CoolDown-Period=1 #10 minutes diff --git a/dockerfiles/generators/run.sh b/dockerfiles/generators/run.sh index b1259c0..23eb655 100644 --- a/dockerfiles/generators/run.sh +++ b/dockerfiles/generators/run.sh @@ -1,12 +1,8 @@ #!/bin/bash set -e -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/manager -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/fieldsGenerator -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/csvGenerator -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/binaryGenerator -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/regexGenerator -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/jsonGenerator +CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/manager@dev +CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/gravwellGenerator@dev cp $GOPATH/bin/manager . cp $GOPATH/bin/fieldsGenerator . diff --git a/dockerfiles/go.mod b/dockerfiles/go.mod deleted file mode 100644 index e675f4d..0000000 --- a/dockerfiles/go.mod +++ /dev/null @@ -1,13 +0,0 @@ -module main - -go 1.15 - -require ( - github.com/gravwell/gencert v3.2.3+incompatible // indirect - github.com/gravwell/gravwell/v3 v3.5.0 // indirect - github.com/gravwell/ingest v3.2.2+incompatible // indirect - github.com/gravwell/manager/v3 v3.3.12 // indirect - github.com/nerdalert/nflow-generator v0.0.0-20230222172017-b7cd1199871c // indirect - github.com/sirupsen/logrus v1.9.0 // indirect - golang.org/x/sys v0.7.0 // indirect -) diff --git a/dockerfiles/go.sum b/dockerfiles/go.sum deleted file mode 100644 index b61d90a..0000000 --- a/dockerfiles/go.sum +++ /dev/null @@ -1,431 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.49.0/go.mod h1:hGvAdzcWNbyuxS3nWhD7H2cIJxjRRTRLQVB0bdputVY= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.1.0/go.mod h1:a81gKs1KmeOyF/qrbeu4APVXICPLcsl0Ilx2XvD7ZYU= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -collectd.org v0.3.1-0.20181025072142-f80706d1e115/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/Pallinder/go-randomdata v1.2.0 h1:DZ41wBchNRb/0GfsePLiSwb0PHZmT67XY00lCDlaYPg= -github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= -github.com/Shopify/sarama v1.24.1/go.mod h1:fGP8eQ6PugKEI0iUETYYtnP6d1pH/bdDMTel1X5ajsU= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/aws/aws-sdk-go v1.25.46/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/bet365/jingo v0.10.0 h1:hQvAlz8wWI24Jc21LCa6njP495eu1uMocac6+fUps+c= -github.com/bet365/jingo v0.10.0/go.mod h1:YVo0ML7j7ob+mvgmOXoZHcGu99n2HJQXw2VqkTteF3I= -github.com/buger/jsonparser v0.0.0-20191004114745-ee4c978eae7e/go.mod h1:errmMKH8tTB49UR2A8C8DPYkyudelsYJwJFaZHQ6ik8= -github.com/bxcodec/faker/v3 v3.3.1/go.mod h1:gF31YgnMSMKgkvl+fyEo1xuSMbEuieyqfeslGYFjneM= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185 h1:3T8ZyTDp5QxTx3NU48JVb2u+75xc040fofcBaN+6jPA= -github.com/dchest/safefile v0.0.0-20151022103144-855e8d98f185/go.mod h1:cFRxtTwTOJkz2x3rQUNCYKWC93yP1VKjR8NUhqFxZNU= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elastic/beats v7.5.0+incompatible/go.mod h1:7cX7zGsOwJ01FLkZs9Tg5nBdnQi6XB3hYAyWekpKgeY= -github.com/elastic/beats v7.6.2+incompatible/go.mod h1:7cX7zGsOwJ01FLkZs9Tg5nBdnQi6XB3hYAyWekpKgeY= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/floren/ipfix v1.4.1/go.mod h1:UtmrqQWM7kiZDMPrrkUR1W08v/WNl8Pc111KSxUgguA= -github.com/floren/o365 v0.0.1/go.mod h1:+1TeJc/IBX0gGAfBf1ZHNJboVRZDNKor7sizUwEoEuM= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.4.1/go.mod h1:36zfPVQyHxymz4cH7wlDmVwDrJuljRB60qkgn7rorfQ= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gofrs/flock v0.8.0 h1:MSdYClljsF3PbENUUEx85nkWfJSGfzYI9yEBZOJz6CY= -github.com/gofrs/flock v0.8.0/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191027212112-611e8accdfc9/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-write v0.0.0-20181107114627-56629a6b2542 h1:jCpVy/nfZ7ayHSZe3xdDhYy6TftqehkNU6hh8Kq+iW8= -github.com/google/go-write v0.0.0-20181107114627-56629a6b2542/go.mod h1:NOSj1rhiMiScdUd1ere2UGAG2ZrYdyblYixNPWPlP5w= -github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gravwell/filewatch/v3 v3.3.10/go.mod h1:bYKlX6Pxr5n+DX+TLrujXwRT+9mvZgLoTPx9aubRQ5E= -github.com/gravwell/gcfg v1.2.5/go.mod h1:lWsvu9YGmTXgqdrR4W926Ok7Vh8jvrwIhFMkn91PgU4= -github.com/gravwell/gcfg v1.2.8 h1:aS+W5u5xBpjjZ4QuSiI1Hy6Qb3+ygn9cQRXFf5XLmA8= -github.com/gravwell/gcfg v1.2.8/go.mod h1:N+S2rmWz+IHo5zTQaDshQr+qEVGldBRzAnlRkf1yO8c= -github.com/gravwell/gencert v3.2.3+incompatible h1:L7htwkYVwA6xe2Ai+Lqbv8rI1n1dvP9lOxSdnon50AE= -github.com/gravwell/gencert v3.2.3+incompatible/go.mod h1:1YfQx+DqTKbCu8gG6osoRw1EozZSLrZPWuRObaDQyLc= -github.com/gravwell/gravwell/v3 v3.5.0 h1:ajoEQm0wWvb7L264EzMZErVPD9O/uGPlSaqqFnvb51g= -github.com/gravwell/gravwell/v3 v3.5.0/go.mod h1:qNig7ryaE+vx36Z+plRm2nwcDV/mQJcOzqfY3BOOtXY= -github.com/gravwell/ingest v3.2.2+incompatible h1:ZppzqTOgMi/YHIbvIhb3/mirrTYj/76n/7WdR3KMWdk= -github.com/gravwell/ingest v3.2.2+incompatible/go.mod h1:wBD3s7hEoM5y/sYrSsO/SOyAv5SvHUkLTorwsBKTRac= -github.com/gravwell/ingest/v3 v3.3.10 h1:W4dsyOuzPXtmGPnxbHywLtKvN1z0nPK71Hh4Thsc8b0= -github.com/gravwell/ingest/v3 v3.3.10/go.mod h1:re6Y8ITpcEJsmYiTyiFJlj/Eudpv17zs+ba94XtdwUs= -github.com/gravwell/ingesters/v3 v3.3.10 h1:xhAP47XaeDzjvliZ0UMmsD4GQreyym3AcshwzYqxDR0= -github.com/gravwell/ingesters/v3 v3.3.10/go.mod h1:6AdOX0CgpOjrDz27XJUUlo9VxwNCABN+rj1I2sU9PcI= -github.com/gravwell/ipfix v1.4.3/go.mod h1:/Ogrd3FQi+GGD+BXzX8/kBQKdOrgrf6c8u8LSEA3WI8= -github.com/gravwell/manager v3.2.2+incompatible h1:JyMO5rvImC2tTpNoVDwwGYwl+oZR/vPTCE36dFxBoiM= -github.com/gravwell/manager v3.2.2+incompatible/go.mod h1:N4aYHWtcFJq2mlTF36NeSUogjuvdInV0SyZPf/MPzOM= -github.com/gravwell/manager/v3 v3.3.12 h1:aawmkZNAOulO+96uZu+gyhboKSGcIzrvyoCotBr66iA= -github.com/gravwell/manager/v3 v3.3.12/go.mod h1:BXUn7PhHURhh6UIZxQc9XzkyXKkF1QFtZRYizXqgoZA= -github.com/gravwell/netflow/v3 v3.2.3/go.mod h1:mOvZuUk8VYa6yQagfJwGNBd08EmJYbKjmK1EJ7jTTjk= -github.com/gravwell/timegrinder/v3 v3.2.5/go.mod h1:5N5jpqRDBJaEw1GotCXb8hmGoNeOPDSBjin1Mz/6g1Q= -github.com/gravwell/winevent/v3 v3.3.11/go.mod h1:0wP6zzhS5Ii+Uclgcm9h9ohRyNYU6CQnMEGiN2MNFOo= -github.com/h2non/filetype v1.0.10 h1:z+SJfnL6thYJ9kAST+6nPRXp1lMxnOVbMZHNYHMar0s= -github.com/h2non/filetype v1.0.10/go.mod h1:isekKqOuhMj+s/7r3rIeTErIRy4Rub5uBWHfvMusLMU= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.8.6/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.3/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/minio/highwayhash v1.0.0/go.mod h1:xQboMTeM9nY9v/LlAOxFctujiv5+Aq2hR5dxBpaMbdc= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/nerdalert/nflow-generator v0.0.0-20220316032942-a4a241113494 h1:1JeqAy9jop5FEiYHV9hupB6pv0RCCFntdm/N8xon3/E= -github.com/nerdalert/nflow-generator v0.0.0-20220316032942-a4a241113494/go.mod h1:tM1+RLMmXuQr2iKkymdjVQob/N9ZdkudXQB8Iqp+HUc= -github.com/nerdalert/nflow-generator v0.0.0-20220501044009-5cc1c43806c2 h1:uK4NvRV/WmXyh4rfutvtq/+FibFAJfeDz8QY4eAfdL8= -github.com/nerdalert/nflow-generator v0.0.0-20220501044009-5cc1c43806c2/go.mod h1:tM1+RLMmXuQr2iKkymdjVQob/N9ZdkudXQB8Iqp+HUc= -github.com/nerdalert/nflow-generator v0.0.0-20230222172017-b7cd1199871c h1:NyF9Sw88JHyCK+THgVuEpUk/YjktgArmc0ajQDjXVQk= -github.com/nerdalert/nflow-generator v0.0.0-20230222172017-b7cd1199871c/go.mod h1:tM1+RLMmXuQr2iKkymdjVQob/N9ZdkudXQB8Iqp+HUc= -github.com/open-networks/go-msgraph v0.0.0-20200217121338-a7bf31e9c1f2/go.mod h1:qrAWeYL/1D4WyM9vJnTmgKMtspVODwsvgBDXgVs64Gg= -github.com/pierrec/lz4 v2.2.6+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4 v2.3.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rcrowley/go-metrics v0.0.0-20190826022208-cac0b30c2563/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/shirou/gopsutil v2.19.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/tealeg/xlsx v1.0.5/go.mod h1:btRS8dz54TDnvKNosuAqxrM1QgN1udgk9O34bDCnORM= -github.com/traetox/gcfg v1.2.4-0.20191023234045-a093ce14b31d/go.mod h1:+j91MgNXTQW48n4alxy5ylS12NkJqqMmtZ8El8sfwek= -github.com/turnage/graw v0.0.0-20191104042329-405cc3092119/go.mod h1:mCzFVBigviR4gb9WRHCFEZ4Z8eWB1dGz+fzLOHpkG8I= -github.com/turnage/redditproto v0.0.0-20151223012412-afedf1b6eddb/go.mod h1:GyqJdEoZSNoxKDb7Z2Lu/bX63jtFukwpaTP9ZIS5Ei0= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190404164418-38d8ce5564a5/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191202143827-86a70503ff7e/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20190912063710-ac5d2bfcbfe0/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191126235420-ef20fe5d7933/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190405154228-4b34438f7a67/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190919044723-0c1ff786ef13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200219091948-cb0a6d8edb6c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12 h1:QyVthZKMsyaQwBTJE04jdNN0Pp5Fn9Qga0mrgxyERQM= -golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80= -golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704 h1:Y7NOhdqIOU8kYI7BxsgL38d0ot0raxvcW+EMQU2QrT4= -golang.org/x/sys v0.0.0-20220803195053-6e608f9ce704/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220804182731-e052cef7d300 h1:ymzm2lKPkdNE1FM0FAss9EdyGB+YzDN2P3jMJODYr2M= -golang.org/x/sys v0.0.0-20220804182731-e052cef7d300/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 h1:9vYwv7OjYaky/tlAeD7C4oC9EsPTlaFl1H2jS++V+ME= -golang.org/x/sys v0.0.0-20220804214406-8e32c043e418/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664 h1:v1W7bwXHsnLLloWYTVEdvGvA7BHMeBYsPcF0GLDxIRs= -golang.org/x/sys v0.0.0-20220808155132-1c4a2a72c664/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220818161305-2296e01440c6 h1:Sx/u41w+OwrInGdEckYmEuU5gHoGSL4QbDz3S9s6j4U= -golang.org/x/sys v0.0.0-20220818161305-2296e01440c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec h1:BkDtF2Ih9xZ7le9ndzTA7KJow28VbQW3odyk/8drmuI= -golang.org/x/sys v0.0.0-20220928140112-f11e5e49a4ec/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190917162342-3b4f30a44f3b/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191203233240-b1451cf3445b/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191203220235-3fa9dbf08042/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo= -gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q= -gopkg.in/jcmturner/goidentity.v3 v3.0.0/go.mod h1:oG2kH0IvSYNIu80dVAyu/yoefjq1mNfM5bm88whjWx4= -gopkg.in/jcmturner/gokrb5.v7 v7.2.3/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/gokrb5.v7 v7.3.0/go.mod h1:l8VISx+WGYp+Fp7KRbsiUuXTTOnxIc3Tuvyavf11/WM= -gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLvuNnlv8= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/dockerfiles/ingesters/Dockerfile b/dockerfiles/ingesters/Dockerfile index 518e239..1fbc575 100644 --- a/dockerfiles/ingesters/Dockerfile +++ b/dockerfiles/ingesters/Dockerfile @@ -1,27 +1,11 @@ FROM busybox:latest MAINTAINER training@gravwell.io -COPY simple_relay.sh /tmp/simple_relay.sh -COPY file_follow.sh /tmp/file_follow.sh -COPY netflow.sh /tmp/netflow.sh -COPY network_capture.sh /tmp/network_capture.sh -COPY federator.sh /tmp/federator.sh -COPY jsonGenerator /opt/gravwell/bin/ -COPY csvGenerator /opt/gravwell/bin +COPY gravwellGenerator /opt/gravwell/bin/ COPY reimport /opt/gravwell/bin -COPY simple_relay.conf /tmp/simple_relay.conf -COPY file_follow.conf /tmp/file_follow.conf -COPY federator.conf /tmp/federator.conf -COPY network_capture.conf /tmp/network_capture.conf - COPY zoneinfo /usr/share/zoneinfo -RUN /bin/sh /tmp/simple_relay.sh --no-questions --no-start --no-crash-report --use-config /tmp/simple_relay.conf -RUN /bin/sh /tmp/file_follow.sh --no-questions --no-start --no-crash-report --use-config /tmp/file_follow.conf -RUN /bin/sh /tmp/netflow.sh --no-questions --no-start --no-crash-report -RUN /bin/sh /tmp/network_capture.sh --no-questions --no-start --no-crash-report --use-config /tmp/network_capture.conf -RUN /bin/sh /tmp/federator.sh --no-questions --no-start --no-crash-report --use-config /tmp/federator.conf ENV GRAVWELL_INGEST_AUTH=IngestSecrets ENV GRAVWELL_INGEST_SECRET=IngestSecrets ENV GRAVWELL_CONTROL_AUTH=ControlSecrets diff --git a/dockerfiles/ingesters/run.sh b/dockerfiles/ingesters/run.sh index 968a422..3827b88 100644 --- a/dockerfiles/ingesters/run.sh +++ b/dockerfiles/ingesters/run.sh @@ -1,73 +1,12 @@ #!/bin/bash -if [ "$VER" == "" ]; then - echo "Missing version" - exit -1 -fi - -SIMPLE_RELAY=/tmp/gravwell_simple_relay_installer_$VER.sh -FILE_FOLLOW=/tmp/gravwell_file_follow_installer_$VER.sh -NETFLOW=/tmp/gravwell_netflow_capture_installer_$VER.sh -PCAP=/tmp/gravwell_network_capture_installer_$VER.sh -FEDERATOR=/tmp/gravwell_federator_installer_$VER.sh -if [ "$FILE_FOLLOW" == "" ]; then - echo "File follower missing" - exit -1 -fi -if [ "$SIMPLE_RELAY" == "" ]; then - echo "simple relay missing" - exit -1 -fi -if [ "$NETFLOW" == "" ]; then - echo "netflow missing" - exit -1 -fi -if [ "$PCAP" == "" ]; then - echo "network_capture missing" - exit -1 -fi -if [ "$FEDERATOR" == "" ]; then - echo "federator missing" - exit -1 -fi - -if [ ! -f "$FILE_FOLLOW" ]; then - echo "$FILE_FOLLOW is not a file" - exit -1 -fi - -if [ ! -f "$SIMPLE_RELAY" ]; then - echo "$SIMPLE_RELAY is not a file" - exit -1 -fi -if [ ! -f "$NETFLOW" ]; then - echo "$NETFLOW is not a file" - exit -1 -fi -if [ ! -f "$PCAP" ]; then - echo "$PCAP is not a file" - exit -1 -fi -if [ ! -f "$FEDERATOR" ]; then - echo "$FEDERATOR is not a file" - exit -1 -fi -cp $SIMPLE_RELAY simple_relay.sh -cp $FILE_FOLLOW file_follow.sh -cp $NETFLOW netflow.sh -cp $PCAP network_capture.sh -cp $FEDERATOR federator.sh cp -r /usr/share/zoneinfo . -# Install the JSON generator -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/jsonGenerator -cp $GOPATH/bin/jsonGenerator . - -# Install the CSV generator -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/csvGenerator -cp $GOPATH/bin/csvGenerator . +# Install the generator +CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/gravwellGenerator@dev +cp $GOPATH/bin/gravwellGenerator . # Build the reimport ingester -GO111MODULE=on CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/ingesters/reimport +CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/ingesters/reimport@dev cp $GOPATH/bin/reimport . @@ -76,12 +15,6 @@ docker build -t gravwell:ingesters --no-cache . docker save gravwell:ingesters | gzip > $TGT echo "Ingesters image is at $TGT" -rm simple_relay.sh -rm file_follow.sh -rm netflow.sh -rm network_capture.sh -rm federator.sh -rm jsonGenerator -rm csvGenerator +rm gravwellGenerator rm reimport rm -r zoneinfo diff --git a/dockerfiles/nflowgen/run.sh b/dockerfiles/nflowgen/run.sh index 4547fc9..07a149d 100644 --- a/dockerfiles/nflowgen/run.sh +++ b/dockerfiles/nflowgen/run.sh @@ -1,19 +1,7 @@ #!/bin/bash set -e TGT="/tmp/nflow.tar.gz" -go get -u github.com/nerdalert/nflow-generator -CGO_ENABLED=0 go install --ldflags "-w -s" github.com/nerdalert/nflow-generator -NFGEN=$(readlink -f $GOPATH/bin/nflow-generator) - -if [ ! -f "$NFGEN" ]; then - echo "couldn't get/build the nflow-generator $NFGEN" - exit -1 -fi - -cp $NFGEN . - -docker build -t networkstatic/nflow-generator:latest . -echo "done building" +docker pull networkstatic/nflow-generator:latest docker save networkstatic/nflow-generator:latest | gzip > $TGT echo "Done saving" docker rmi networkstatic/nflow-generator:latest diff --git a/dockerfiles/offlinereplication/run.sh b/dockerfiles/offlinereplication/run.sh index cdac13e..04628d6 100644 --- a/dockerfiles/offlinereplication/run.sh +++ b/dockerfiles/offlinereplication/run.sh @@ -1,6 +1,6 @@ #!/bin/bash set -e -go install github.com/gravwell/gencert +CGO_ENABLED=0 go install github.com/gravwell/gencert@latest TGT="/tmp/offlinereplication.tar.gz" $GOPATH/bin/gencert -host offlinereplicator docker build -t gravwell:offlinereplication --build-arg VER=$VER . diff --git a/dockerfiles/pcap/run.sh b/dockerfiles/pcap/run.sh index 24a94fc..061dc51 100644 --- a/dockerfiles/pcap/run.sh +++ b/dockerfiles/pcap/run.sh @@ -4,16 +4,6 @@ if [ "$VER" == "" ]; then echo "Missing version" exit -1 fi -PCAP=/tmp/gravwell_network_capture_installer_$VER.sh -if [ "$PCAP" == "" ]; then - echo "network_capture missing" - exit -1 -fi -if [ ! -f "$PCAP" ]; then - echo "$PCAP is not a file" - exit -1 -fi -cp $PCAP network_capture.sh cp -r /usr/share/zoneinfo . TGT="/tmp/pcap.tar.gz" @@ -21,5 +11,4 @@ docker build -t gravwell:pcap --no-cache . docker save gravwell:pcap | gzip > $TGT echo "PCAP image is at $TGT" -rm network_capture.sh rm -rf zoneinfo diff --git a/dockerfiles/permissions/.gitignore b/dockerfiles/permissions/.gitignore deleted file mode 100644 index d4004a7..0000000 --- a/dockerfiles/permissions/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.swp -gravwell_*.sh -manager diff --git a/dockerfiles/permissions/Dockerfile b/dockerfiles/permissions/Dockerfile deleted file mode 100644 index c13d571..0000000 --- a/dockerfiles/permissions/Dockerfile +++ /dev/null @@ -1,35 +0,0 @@ -FROM ubuntu:latest -MAINTAINER training@gravwell.io -ARG MANAGE_CONF=manager.cfg -ARG CONF=gravwell.conf -ARG INSTALLER=gravwell_installer.sh -ARG MANAGE=/tmp/manager -ARG LICENSE=license - -RUN apt update -RUN apt install -y libcap2 libcap2-bin -RUN apt clean -RUN apt autoclean -RUN rm -rf /var/lib/apt/lists/* - -COPY $INSTALLER /tmp/installer.sh -RUN /bin/bash /tmp/installer.sh --no-questions -RUN rm -f /tmp/installer.sh -RUN usermod -u 1000 gravwell -RUN groupmod -g 1000 gravwell - -COPY $MANAGE_CONF /opt/gravwell/etc/ -COPY $MANAGE /opt/gravwell/bin/ -COPY $CONF /opt/gravwell/etc/ -COPY $LICENSE /opt/gravwell/etc/license - -RUN chown gravwell:gravwell -R /opt/gravwell -RUN /sbin/setcap cap_net_bind_service=+ep /opt/gravwell/bin/gravwell_webserver -USER 1000:1000 - -ENV GRAVWELL_INGEST_AUTH=IngestSecrets -ENV GRAVWELL_INGEST_SECRET=IngestSecrets -ENV GRAVWELL_CONTROL_AUTH=ControlSecrets -ENV GRAVWELL_SEARCHAGENT_AUTH=SearchAgentSecrets -ENV GRAVWELL_PIPE_TARGETS="/opt/gravwell/comms/pipe" -CMD ["/opt/gravwell/bin/manager"] diff --git a/dockerfiles/permissions/README b/dockerfiles/permissions/README deleted file mode 100644 index bd359de..0000000 --- a/dockerfiles/permissions/README +++ /dev/null @@ -1,8 +0,0 @@ -This creates the base gravwell image that has ONLY the indexer, webserver, and search agent. - -We also create a user and group with UID/GID 1000/1000 named gravwell/gravwell. -Each component should have the appropriate user and group permissions - -We dont' have a crash reporter or ingester, or gencert. Its designed to be extremely small - -The gravwell.conf file only has a default well diff --git a/dockerfiles/permissions/gravwell.conf b/dockerfiles/permissions/gravwell.conf deleted file mode 100644 index 77440ff..0000000 --- a/dockerfiles/permissions/gravwell.conf +++ /dev/null @@ -1,31 +0,0 @@ -[global] -### Authentication tokens - -### Web server HTTP/HTTPS settings -Web-Port=80 -Insecure-Disable-HTTPS=true -#Web-Port=443 -#Certificate-File=/opt/gravwell/etc/cert.pem -#Key-File=/opt/gravwell/etc/key.pem - -### Other web server settings -Remote-Indexers=net:127.0.0.1:9404 -Persist-Web-Logins=True -Session-Timeout-Minutes=1440 -Login-Fail-Lock-Count=4 -Login-Fail-Lock-Duration=5 - -### Ingester settings -Ingest-Port=4023 -#TLS-Ingest-Port=4024 # This requires TLS certs be installed! -Control-Port=9404 -Search-Pipeline-Buffer-Size=4 - -### Other settings -Log-Level=INFO - -### Paths -License-Location=/opt/gravwell/etc/license - -[Default-Well] - Location=/opt/gravwell/storage/default/ diff --git a/dockerfiles/permissions/manager.cfg b/dockerfiles/permissions/manager.cfg deleted file mode 100644 index 8a163bb..0000000 --- a/dockerfiles/permissions/manager.cfg +++ /dev/null @@ -1,24 +0,0 @@ -[Global] - Log-File=/opt/gravwell/log/manager.log - Log-Level=INFO - -[Process "indexer"] - Exec="/opt/gravwell/bin/gravwell_indexer -stderr indexer" - Working-Dir=/opt/gravwell - Max-Restarts=100 - CoolDown-Period=1 - Restart-Period=1 - -[Process "webserver"] - Exec="/opt/gravwell/bin/gravwell_webserver -stderr webserver" - Working-Dir=/opt/gravwell - Max-Restarts=100 - CoolDown-Period=1 - Restart-Period=1 - -[Process "searchagent"] - Exec="/opt/gravwell/bin/gravwell_searchagent -stderr searchagent" - Working-Dir=/opt/gravwell - Max-Restarts=100 - CoolDown-Period=1 - Restart-Period=1 diff --git a/dockerfiles/permissions/run.sh b/dockerfiles/permissions/run.sh deleted file mode 100644 index 518b3ac..0000000 --- a/dockerfiles/permissions/run.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -if [ "$VER" == "" ]; then - echo "Missing version" - exit -1 -fi -rm -f license - -TGT="/tmp/perms.tar.gz" -INSTALLER="/tmp/gravwell_$VER.sh" -if [ ! -f "$LICENSE" ]; then - echo "I need the training license, set LICENSE variable" - exit -1 -fi -if [ ! -f "$INSTALLER" ]; then - echo "$INSTALLER is not a valid file" - echo "EXAMPLE: bash build.sh /tmp/gravwell_2.2.8.sh" - exit -1 -fi -SQUASH="--squash" -exp=`docker version -f '{{.Server.Experimental}}'` -if [ "$exp" == "false" ]; then - echo "your docker instance isn't running with experimental features" - echo "We need this in order to squash the image during build" - SQUASH="" -fi -GO111MODULE=on CGO_ENABLED=0 go install -ldflags="-s -w" github.com/gravwell/gravwell/v3/manager -cp $GOPATH/bin/manager . -installer=$(basename $INSTALLER) -cp $INSTALLER $installer - -cp $LICENSE license - -docker build --no-cache --shm-size=256m $SQUASH --ulimit nofile=32000:32000 \ - --compress --build-arg INSTALLER=$installer \ - --build-arg MANAGE=manager \ - --build-arg MANAGE_CONF=manager.cfg \ - --build-arg LICENSE=license \ - -t gravwell:perms . - -docker save gravwell:perms | gzip > $TGT -rm manager -rm -f license -echo "Base image is at $TGT" From da3a5a7a43c70f80cb8ab04394655f541382ddaa Mon Sep 17 00:00:00 2001 From: John Floren Date: Wed, 7 Aug 2024 11:54:33 -0700 Subject: [PATCH 2/7] Finish cleaning up & checking new docker images --- Automation/automation.tex | 2 +- Indexers/indexers.tex | 14 +++--- Ingesters/ingesters.tex | 51 ++++++++++------------ Kits/kits.tex | 2 +- LabSetup/labsetup.tex | 25 ++++++++--- Search/search.tex | 27 ++++++------ Webserver/images/twoindexers.png | Bin 35946 -> 39834 bytes Webserver/webserver.tex | 8 ++-- dockerfiles/base/manager.cfg | 6 +-- dockerfiles/build_all.sh | 10 ++++- dockerfiles/createslim.sh | 2 +- dockerfiles/federator/Dockerfile | 10 +++++ dockerfiles/federator/federator.conf | 15 +++++++ dockerfiles/federator/run.sh | 14 ++++++ dockerfiles/filefollow/Dockerfile | 10 +++++ dockerfiles/filefollow/file_follow.conf | 24 ++++++++++ dockerfiles/filefollow/run.sh | 14 ++++++ dockerfiles/generators/.gitignore | 6 --- dockerfiles/generators/Dockerfile | 15 ------- dockerfiles/generators/README | 3 -- dockerfiles/generators/manager.cfg | 17 -------- dockerfiles/generators/run.sh | 21 --------- dockerfiles/netflow/Dockerfile | 9 ++++ dockerfiles/netflow/run.sh | 14 ++++++ dockerfiles/nflowgen/run.sh | 3 -- dockerfiles/simplerelay/Dockerfile | 10 +++++ dockerfiles/simplerelay/run.sh | 14 ++++++ dockerfiles/simplerelay/simple_relay.conf | 7 +++ 28 files changed, 222 insertions(+), 131 deletions(-) create mode 100644 dockerfiles/federator/Dockerfile create mode 100644 dockerfiles/federator/federator.conf create mode 100644 dockerfiles/federator/run.sh create mode 100644 dockerfiles/filefollow/Dockerfile create mode 100644 dockerfiles/filefollow/file_follow.conf create mode 100644 dockerfiles/filefollow/run.sh delete mode 100644 dockerfiles/generators/.gitignore delete mode 100644 dockerfiles/generators/Dockerfile delete mode 100644 dockerfiles/generators/README delete mode 100644 dockerfiles/generators/manager.cfg delete mode 100644 dockerfiles/generators/run.sh create mode 100644 dockerfiles/netflow/Dockerfile create mode 100644 dockerfiles/netflow/run.sh create mode 100644 dockerfiles/simplerelay/Dockerfile create mode 100644 dockerfiles/simplerelay/run.sh create mode 100644 dockerfiles/simplerelay/simple_relay.conf diff --git a/Automation/automation.tex b/Automation/automation.tex index 082ff50..264bd20 100644 --- a/Automation/automation.tex +++ b/Automation/automation.tex @@ -957,7 +957,7 @@ \subsection{Hands-on Lab: Scripting} \begin{Verbatim}[breaklines=true] docker run --rm -d --net gravnet --name ingesters \ --e GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 gravwell:ingesters \ +-e GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 gravwell:netflow \ /opt/gravwell/bin/gravwell_netflow_capture \end{Verbatim} diff --git a/Indexers/indexers.tex b/Indexers/indexers.tex index e0a7790..2db7d0d 100644 --- a/Indexers/indexers.tex +++ b/Indexers/indexers.tex @@ -1236,11 +1236,11 @@ \subsection{Hands-on Lab: Acceleration} docker start test \end{Verbatim} -Now we'll use the generators image to generate some JSON data; if you don't have the \code{gravwell:generators} image, see Section \ref{sec:load-lab-images} for instructions on how to load it. +Now we'll use the ingesters image to generate some JSON data; if you don't have the \code{gravwell:ingesters} image, see Section \ref{sec:load-lab-images} for instructions on how to load it. \begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns test:4023 -entry-count 500000 +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -type json -clear-conns test:4023 -entry-count 500000 \end{Verbatim} Open your Gravwell GUI and check that there is a new well named @@ -1314,13 +1314,13 @@ \subsubsection{\texorpdfstring{{}}{}}\label{h.cpnsaxr7kale}} ``json3'':} \begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns test -entry-count 500000 -tag-name json2 +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -type json -clear-conns test -entry-count 500000 -tag-name json2 \end{Verbatim} \begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns test -entry-count 500000 -tag-name json3 +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -type json -clear-conns test -entry-count 500000 -tag-name json3 \end{Verbatim} Go re-run the same query as before over a week, first using the tag diff --git a/Ingesters/ingesters.tex b/Ingesters/ingesters.tex index bd89a5f..da250cd 100644 --- a/Ingesters/ingesters.tex +++ b/Ingesters/ingesters.tex @@ -609,12 +609,12 @@ \subsection{Hands-On Lab: Simple Relay} docker run --rm --net gravnet -p 8080:80 -d --name gravwell gravwell:base \end{Verbatim} -Open the web interface by pointing your browser at \href{http://localhost:8080/}{http://localhost:8080} and log in (``admin''/``changeme''). Then start the ingester container running the Simple Relay ingester: +Open the web interface by pointing your browser at \href{http://localhost:8080/}{http://localhost:8080} and log in (``admin''/``changeme''). Then start the container running the Simple Relay ingester: \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet --name ingesters -it \ -e GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 \ -gravwell:ingesters /opt/gravwell/bin/gravwell_simple_relay +gravwell:simplerelay /opt/gravwell/bin/gravwell_simple_relay \end{Verbatim} Note the use of the option \code{-e GRAVWELL\_CLEARTEXT\_TARGETS=gravwell:4023}. @@ -939,7 +939,7 @@ \subsection{Hands-On Lab: File Follower} \begin{Verbatim}[breaklines=true] docker create --rm --net gravnet --name ingesters -it -e \ GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 -v /var/log:/var/log \ -gravwell:ingesters /opt/gravwell/bin/gravwell_file_follow -v +gravwell:filefollow /opt/gravwell/bin/gravwell_file_follow -v \end{Verbatim} Note the option \code{-v /var/log:/var/log}. This mounts the host's @@ -1313,12 +1313,12 @@ \subsection{Hands-on Lab: Netflow Ingester} docker run --rm --net gravnet -p 8080:80 -d --name gravwell gravwell:base \end{Verbatim} -Next, start the ingester container running the netflow ingester: +Next, start the container running the netflow ingester: \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet --name ingesters -it \ -e GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 \ -gravwell:ingesters /opt/gravwell/bin/gravwell_netflow_capture +gravwell:netflow /opt/gravwell/bin/gravwell_netflow_capture \end{Verbatim} The netflow ingester is pre-configured to listen on port 2055 for @@ -1581,7 +1581,7 @@ \subsection{Hands-on Lab: Federation} \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet --name federator -it \ -e GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 \ -gravwell:ingesters /opt/gravwell/bin/gravwell_federator +gravwell:federator /opt/gravwell/bin/gravwell_federator \end{Verbatim} The container we are using has two pre-configured listeners for the @@ -1596,31 +1596,24 @@ \subsection{Hands-on Lab: Federation} ``testB'', and uses the Ingest Secret ``enclaveBSecrets'' \end{itemize} -With the Federator up and running, we use the generators container to attempt to send some JSON-formatted +With the Federator up and running, we use the ingesters container to attempt to send some JSON-formatted entries to the Federator. We direct it to connect to the ``federator'' container on port 4001 and use the secret ``enclaveASecrets'', which is the correct configuration for the first IngestListener defined in the Federator config. However, note that we add the option \code{-tag-name json}. This is not one of the allowed tags! \begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns federator:4001 \ --ingest-secret enclaveASecrets -tag-name json +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -clear-conns federator:4001 \ +-ingest-secret enclaveASecrets -type json -tag-name json \end{Verbatim} -The command should fail, with an error message saying it -failed to negotiate tags: +The command should fail; this is expected, because we attempted to send entries tagged ``json'', which is not allowed! Let's run the generator again, this time specifying the allowed ``testA'' tag: \begin{Verbatim}[breaklines=true] -2020/02/05 18:44:25 ERROR: Timed out waiting for active connection due to All connections failed Failed to negotiate tags -\end{Verbatim} - -This is expected, because we attempted to send entries tagged ``json'', which is not allowed! Let's run the generator again, this time specifying the allowed ``testA'' tag: - -\begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns federator:4001 \ --ingest-secret enclaveASecrets -tag-name testA +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -clear-conns federator:4001 \ +-ingest-secret enclaveASecrets -type json -tag-name testA \end{Verbatim} We can verify that the entries made it in by running the query \code{tag=testA} in the Gravwell interface, as shown in Figure \ref{fig:federator-lab-1}. @@ -1634,9 +1627,9 @@ \subsection{Hands-on Lab: Federation} We can send entries to the other Federator listener by tweaking the generator command line, specifying port 4002, the secret ``enclaveBSecrets'', and tag ``testB'': \begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns federator:4002 \ --ingest-secret enclaveBSecrets -tag-name testB +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -clear-conns federator:4002 \ +-ingest-secret enclaveBSecrets -type json -tag-name testB \end{Verbatim} To clean up after the experiment, simply run: @@ -1712,7 +1705,7 @@ \subsection{Hands-on Lab: Ingester Cache} \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet --name ingesters -d \ -e GRAVWELL_CLEARTEXT_TARGETS=gravwell \ -gravwell:ingesters /opt/gravwell/bin/gravwell_simple_relay +gravwell:simplerelay /opt/gravwell/bin/gravwell_simple_relay \end{Verbatim} The ingesters container ships with a default Simple Relay configuration @@ -2161,13 +2154,13 @@ \subsection{Hands-on Lab: Gravwell and Docker} \code{Control-Auth}, and \code{Search-Agent-Auth} auth tokens with something unique. Once the container has been created using \code{docker create}, log into the GUI and check that -everything came up, then try ingesting some data using JSON generator; be sure to +everything came up, then try ingesting some data using the generator; be sure to set the appropriate authentication secrets! \begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns test \ --ingest-secret MY_SECRET +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -clear-conns test \ +-type json -ingest-secret MY_SECRET \end{Verbatim} \subsubsection{Lab Questions} diff --git a/Kits/kits.tex b/Kits/kits.tex index bb683a4..d3c7048 100644 --- a/Kits/kits.tex +++ b/Kits/kits.tex @@ -209,7 +209,7 @@ \section{Hands-on Lab: Installing Kits} \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet --name ingesters -it \ -e GRAVWELL_CLEARTEXT_TARGETS=kits:4023 \ -gravwell:ingesters /opt/gravwell/bin/gravwell_netflow_capture +gravwell:netflow /opt/gravwell/bin/gravwell_netflow_capture \end{Verbatim} The netflow ingester is pre-configured to listen on port 2055 for diff --git a/LabSetup/labsetup.tex b/LabSetup/labsetup.tex index 4ba8451..8b72a9c 100644 --- a/LabSetup/labsetup.tex +++ b/LabSetup/labsetup.tex @@ -173,10 +173,12 @@ \section{Testing Gravwell in a Container} \section{Loading the Lab Images} \label{sec:load-lab-images} -Several different Docker container images are used for the lab sections -of this training. They are available in the \code{dockerimages/} subdirectory on -the course materials bundle and can be installed with the following -command: +Several different Docker container images are used for the lab +sections of this training. They are all built from publicly-available +Docker images, but have been slightly customized and packaged here to +speed up the training exercises. They are available in the +\code{dockerimages/} subdirectory on the course materials bundle and +can be installed with the following command: \code{docker load -i imagename.tar.gz} @@ -184,15 +186,28 @@ \section{Loading the Lab Images} \begin{itemize} \item base.tar.gz - \item brokenperms.tar.gz \item datastore.tar.gz + \item federator.tar.gz + \item filefollow.tar.gz \item indexer.tar.gz \item ingesters.tar.gz + \item netflow.tar.gz + \item nflow.tar.gz \item offlinereplication.tar.gz \item pcap.tar.gz + \item simplerelay.tar.gz \item webserver.tar.gz \end{itemize} +You can do the entire batch at once like this: + +\begin{Verbatim} +for i in *.tar.gz +do + docker load -i $i +done +\end{Verbatim} + Once loaded, they should all be in the listing when you run \code{docker image ls}. diff --git a/Search/search.tex b/Search/search.tex index 5708e66..cb660d5 100644 --- a/Search/search.tex +++ b/Search/search.tex @@ -616,11 +616,11 @@ \subsection{Hands-on Lab: Inline Filtering} docker restart test \end{Verbatim} -Now we'll use the generators image to generate some JSON data; if you don't have the \code{gravwell:generators} image, see Section \ref{sec:load-lab-images} for instructions on how to load it. +Now we'll use the ingesters image to generate some JSON data; if you don't have the \code{gravwell:ingesters} image, see Section \ref{sec:load-lab-images} for instructions on how to load it. \begin{Verbatim}[breaklines=true] -docker run --net gravnet --rm -it gravwell:generators \ -/jsonGenerator -clear-conns test:4023 -entry-count 500000 +docker run --net gravnet --rm -it gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -clear-conns test:4023 -entry-count 500000 -type json \end{Verbatim} Open your Gravwell GUI (\href{http://localhost:8080}{http://localhost:8080}) and check @@ -1178,12 +1178,12 @@ \subsection{Hands-on Lab: Temporal vs. Non-Temporal Rendering} docker run --rm --net gravnet -p 8080:80 -d --name gravwell gravwell:base \end{Verbatim} -Next, start the ingester container running the netflow ingester: +Next, start the \code{gravwell:netflow} container running the netflow ingester: \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet --name ingesters -it \ -e GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 \ -gravwell:ingesters /opt/gravwell/bin/gravwell_netflow_capture +gravwell:netflow /opt/gravwell/bin/gravwell_netflow_capture \end{Verbatim} The netflow ingester is pre-configured to listen on port 2055 for @@ -1871,12 +1871,12 @@ \subsection{Hands-on Lab: Enriching Netflow with GeoIP} docker run --rm --net gravnet -p 8080:80 -d --name gravwell gravwell:base \end{Verbatim} -Next, start the ingester container running the netflow ingester: +Next, start the \code{gravwell:netflow} container running the netflow ingester: \begin{Verbatim}[breaklines=true] docker run --rm -d --net gravnet --name ingesters \ -e GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 \ -gravwell:ingesters /opt/gravwell/bin/gravwell_netflow_capture +gravwell:netflow /opt/gravwell/bin/gravwell_netflow_capture \end{Verbatim} The netflow ingester is pre-configured to listen on port 2055 for @@ -2279,14 +2279,15 @@ \subsection{Hands-on Lab: Optimizing Queries} significant data or node count, however, the knowledge in this section is invaluable. -We need to fire up the base Gravwell container and then the ingesters +We need to fire up the base Gravwell container and then use the ingesters container to generate some sample JSON entries: \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet -p 8080:80 -d --name gravwell gravwell:base -docker run --net gravnet --rm -it --name jsoningesters gravwell:ingesters\ - /opt/gravwell/bin/jsonGenerator -clear-conns gravwell:4023 -entry-count 100000 +docker run --net gravnet --rm -it --name jsoningesters gravwell:ingesters \ +/opt/gravwell/bin/gravwellGenerator -clear-conns gravwell:4023 \ +-entry-count 100000 -type json \end{Verbatim} Let's begin by examining the data: @@ -2913,7 +2914,7 @@ \subsection{Hands-On Lab: Extractors} \begin{Verbatim}[breaklines=true] docker run --rm --net gravnet --name ingesters -it -e \ GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 gravwell:ingesters \ -/opt/gravwell/bin/csvGenerator -clear-conns gravwell:4023 -tag-name csv +/opt/gravwell/bin/gravwellGenerator -clear-conns gravwell:4023 -type csv \end{Verbatim} A quick search on the csv tag should show the raw entries, as in Figure \ref{fig:lab-csv-raw}. @@ -3094,7 +3095,7 @@ \subsection{Hands-On Lab: Groups and Sharing} \begin{Verbatim}[breaklines=true] docker run --net gravnet --rm -i --name ingesters gravwell:ingesters \ -/opt/gravwell/bin/jsonGenerator -clear-conns gravwell:4023 +/opt/gravwell/bin/gravwellGenerator -clear-conns gravwell:4023 -type json \end{Verbatim} Now, log in as the administrator (\href{http://localhost:8080}{http://localhost:8080}), open the Users page, and add two new @@ -3223,7 +3224,7 @@ \subsection{Hands-on Lab: Network Activity Dashboard} docker run --rm --net gravnet -p 8080:80 -d --name gravwell gravwell:base docker run --rm --net gravnet --name ingesters -it -e \ -GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 gravwell:ingesters \ +GRAVWELL_CLEARTEXT_TARGETS=gravwell:4023 gravwell:netflow \ /opt/gravwell/bin/gravwell_netflow_capture docker run -it --net gravnet --rm \ diff --git a/Webserver/images/twoindexers.png b/Webserver/images/twoindexers.png index bfa3443c3bc4170813a4e38cc38267a9f0ef5207..4c55bb4e9c2b50a1db9a61bbb7f744a43a2b5236 100644 GIT binary patch literal 39834 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�LOsv@XnEuk)0$_w?pPo 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 $TGT +echo "federator image is at $TGT" + +rm -rf zoneinfo diff --git a/dockerfiles/filefollow/Dockerfile b/dockerfiles/filefollow/Dockerfile new file mode 100644 index 0000000..eb1b4da --- /dev/null +++ b/dockerfiles/filefollow/Dockerfile @@ -0,0 +1,10 @@ +ARG VER=latest +FROM gravwell/file_follow:${VER} +MAINTAINER training@gravwell.io +COPY file_follow.conf /opt/gravwell/etc/ + +ENV GRAVWELL_INGEST_AUTH=IngestSecrets +ENV GRAVWELL_INGEST_SECRET=IngestSecrets +ENV GRAVWELL_CONTROL_AUTH=ControlSecrets +ENV GRAVWELL_SEARCHAGENT_AUTH=SearchAgentSecrets +CMD ["/opt/gravwell/bin/gravwell_file_follow"] diff --git a/dockerfiles/filefollow/file_follow.conf b/dockerfiles/filefollow/file_follow.conf new file mode 100644 index 0000000..149bf1b --- /dev/null +++ b/dockerfiles/filefollow/file_follow.conf @@ -0,0 +1,24 @@ +[Global] +Ingest-Secret = IngestSecrets +Connection-Timeout = 0 +State-Store-Location=/opt/gravwell/etc/file_follow.state +Log-Level=INFO #options are OFF INFO WARN ERROR +Log-File=/opt/gravwell/log/file_follow.log +Max-Files-Watched=64 # Maximum number of files to watch before rotating out old ones, this can be bumped but will need sysctl flags adjusted + +#basic default logger, all entries will go to the default tag +#no Tag-Name means use the default tag +[Follower "auth"] + Base-Directory="/var/log/" + File-Filter="auth.log,auth.log.[0-9]" #we are looking for all authorization log files + Tag-Name=auth + +[Follower "kernel"] + Base-Directory="/var/log" + File-Filter="dmesg,dmesg.[0-9]" #we are looking for all dpkg files + Tag-Name=kernel + +[Follower "kernel2"] + Base-Directory="/var/log" + File-Filter="kern.log,kern.log.[0-9]" #we are looking for all dpkg files + Tag-Name=kernel diff --git a/dockerfiles/filefollow/run.sh b/dockerfiles/filefollow/run.sh new file mode 100644 index 0000000..0216c45 --- /dev/null +++ b/dockerfiles/filefollow/run.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e +if [ "$VER" == "" ]; then + echo "Missing version" + exit -1 +fi +cp -r /usr/share/zoneinfo . + +TGT="/tmp/filefollow.tar.gz" +docker build -t gravwell:filefollow --no-cache --build-arg VER=$VER . +docker save gravwell:filefollow | gzip > $TGT +echo "filefollow image is at $TGT" + +rm -rf zoneinfo diff --git a/dockerfiles/generators/.gitignore b/dockerfiles/generators/.gitignore deleted file mode 100644 index 3d186b1..0000000 --- a/dockerfiles/generators/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -binaryGenerator -csvGenerator -fieldsGenerator -managerGenerator -regexGenerator -manager diff --git a/dockerfiles/generators/Dockerfile b/dockerfiles/generators/Dockerfile deleted file mode 100644 index 69f82e4..0000000 --- a/dockerfiles/generators/Dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM busybox:latest -MAINTAINER training@gravwell.io -ARG MANAGE_CONF=manager.cfg - -RUN /bin/mkdir -p /opt/gravwell/etc -RUN /bin/mkdir -p /opt/gravwell/log -COPY $MANAGE_CONF /opt/gravwell/etc/ -COPY manager / -COPY fieldsGenerator / -COPY csvGenerator / -COPY binaryGenerator / -COPY regexGenerator / -COPY jsonGenerator / - -CMD ["/manager"] diff --git a/dockerfiles/generators/README b/dockerfiles/generators/README deleted file mode 100644 index 23a534e..0000000 --- a/dockerfiles/generators/README +++ /dev/null @@ -1,3 +0,0 @@ -this container will just stream all sorts of data into gravwell - -It isn't finished yet, e.g. broken. Fix it diff --git a/dockerfiles/generators/manager.cfg b/dockerfiles/generators/manager.cfg deleted file mode 100644 index c5b02f3..0000000 --- a/dockerfiles/generators/manager.cfg +++ /dev/null @@ -1,17 +0,0 @@ -[Global] - Log-File=/opt/gravwell/log/manager.log - Log-Level=INFO - -[Process "barfields"] - Exec='/gravwellGenerator -type fields -stream -clear-conns=$TARGET -tag-name=barfields -delim-override="|"' - Working-Dir=/ - Max-Restarts=100 #three attempts before cooling down - CoolDown-Period=1 #10 minutes - Restart-Period=1 #10 minutes - -[Process "tabfields"] - Exec='/gravwellGenerator -type fields -stream -clear-conns=$TARGET -tag-name=tabfields -delim-override=" "' - Working-Dir=/ - Max-Restarts=100 #three attempts before cooling down - CoolDown-Period=1 #10 minutes - Restart-Period=1 #10 minutes diff --git a/dockerfiles/generators/run.sh b/dockerfiles/generators/run.sh deleted file mode 100644 index 23eb655..0000000 --- a/dockerfiles/generators/run.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -set -e - -CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/manager@dev -CGO_ENABLED=0 go install --ldflags "-w -s" github.com/gravwell/gravwell/v3/generators/gravwellGenerator@dev - -cp $GOPATH/bin/manager . -cp $GOPATH/bin/fieldsGenerator . -cp $GOPATH/bin/csvGenerator . -cp $GOPATH/bin/binaryGenerator . -cp $GOPATH/bin/regexGenerator . -cp $GOPATH/bin/jsonGenerator . - - -TGT="/tmp/generators.tar.gz" -docker build --compress -t gravwell:generators . -docker save gravwell:generators | gzip > $TGT -echo "Base image is at $TGT" - -rm *Generator -rm manager diff --git a/dockerfiles/netflow/Dockerfile b/dockerfiles/netflow/Dockerfile new file mode 100644 index 0000000..4b8a719 --- /dev/null +++ b/dockerfiles/netflow/Dockerfile @@ -0,0 +1,9 @@ +ARG VER=latest +FROM gravwell/netflow_capture:${VER} +MAINTAINER training@gravwell.io + +ENV GRAVWELL_INGEST_AUTH=IngestSecrets +ENV GRAVWELL_INGEST_SECRET=IngestSecrets +ENV GRAVWELL_CONTROL_AUTH=ControlSecrets +ENV GRAVWELL_SEARCHAGENT_AUTH=SearchAgentSecrets +CMD ["/opt/gravwell/bin/gravwell_netflow_capture"] diff --git a/dockerfiles/netflow/run.sh b/dockerfiles/netflow/run.sh new file mode 100644 index 0000000..87a8f44 --- /dev/null +++ b/dockerfiles/netflow/run.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e +if [ "$VER" == "" ]; then + echo "Missing version" + exit -1 +fi +cp -r /usr/share/zoneinfo . + +TGT="/tmp/netflow.tar.gz" +docker build -t gravwell:netflow --no-cache --build-arg VER=$VER . +docker save gravwell:netflow | gzip > $TGT +echo "netflow image is at $TGT" + +rm -rf zoneinfo diff --git a/dockerfiles/nflowgen/run.sh b/dockerfiles/nflowgen/run.sh index 07a149d..035ee60 100644 --- a/dockerfiles/nflowgen/run.sh +++ b/dockerfiles/nflowgen/run.sh @@ -4,8 +4,5 @@ TGT="/tmp/nflow.tar.gz" docker pull networkstatic/nflow-generator:latest docker save networkstatic/nflow-generator:latest | gzip > $TGT echo "Done saving" -docker rmi networkstatic/nflow-generator:latest -rm -f nflow-generator -echo "done cleaning" echo "your image is at $TGT" diff --git a/dockerfiles/simplerelay/Dockerfile b/dockerfiles/simplerelay/Dockerfile new file mode 100644 index 0000000..1a8fdfb --- /dev/null +++ b/dockerfiles/simplerelay/Dockerfile @@ -0,0 +1,10 @@ +ARG VER=latest +FROM gravwell/simple_relay:${VER} +MAINTAINER training@gravwell.io +COPY simple_relay.conf /opt/gravwell/etc/ + +ENV GRAVWELL_INGEST_AUTH=IngestSecrets +ENV GRAVWELL_INGEST_SECRET=IngestSecrets +ENV GRAVWELL_CONTROL_AUTH=ControlSecrets +ENV GRAVWELL_SEARCHAGENT_AUTH=SearchAgentSecrets +CMD ["/opt/gravwell/bin/gravwell_simple_relay"] diff --git a/dockerfiles/simplerelay/run.sh b/dockerfiles/simplerelay/run.sh new file mode 100644 index 0000000..67f6c94 --- /dev/null +++ b/dockerfiles/simplerelay/run.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e +if [ "$VER" == "" ]; then + echo "Missing version" + exit -1 +fi +cp -r /usr/share/zoneinfo . + +TGT="/tmp/simplerelay.tar.gz" +docker build -t gravwell:simplerelay --no-cache --build-arg VER=$VER . +docker save gravwell:simplerelay | gzip > $TGT +echo "simplerelay image is at $TGT" + +rm -rf zoneinfo diff --git a/dockerfiles/simplerelay/simple_relay.conf b/dockerfiles/simplerelay/simple_relay.conf new file mode 100644 index 0000000..8feab4c --- /dev/null +++ b/dockerfiles/simplerelay/simple_relay.conf @@ -0,0 +1,7 @@ +[Global] +Log-Level=INFO + +[Listener "default"] + Bind-String="0.0.0.0:7777" #we are binding to all interfaces, with TCP implied + Ignore-Timestamps=true + Tag-Name=default From 2d33fc210ac69b7f3cfe5992c27256cf08ec6012 Mon Sep 17 00:00:00 2001 From: John Floren Date: Wed, 7 Aug 2024 13:12:30 -0700 Subject: [PATCH 3/7] address comments --- dockerfiles/build_all.sh | 2 +- dockerfiles/createslim.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerfiles/build_all.sh b/dockerfiles/build_all.sh index d34c73e..c3e4529 100644 --- a/dockerfiles/build_all.sh +++ b/dockerfiles/build_all.sh @@ -2,7 +2,7 @@ set -e LOGFILE=/tmp/build.log OUTDIR=../dockerimages/ -VER=${VERSION:-5.4.10} +VER=${VERSION:-latest} if [ ! -d "$GOPATH" ]; then echo "Must set GOPATH" diff --git a/dockerfiles/createslim.sh b/dockerfiles/createslim.sh index 6dce67a..1356708 100644 --- a/dockerfiles/createslim.sh +++ b/dockerfiles/createslim.sh @@ -5,7 +5,7 @@ if [ ! -f "$LICENSE" ]; then fi docker rmi gravwell:slim #remove existing slim image -docker pull gravwell/gravwell:${VER} # grabs latest gw image from dockerhub +docker pull gravwell/gravwell:${VER} # grabs desired gw image from dockerhub docker create --name slim gravwell/gravwell:${VER} #create temp container from latest image docker cp $LICENSE slim:/opt/gravwell/etc/license docker export slim | docker import - gravwell:slim #trick to squash. export to stdio then re-import under new tag to create "final" slim container From aed9eb7a0a4e46192fc28dc9e62d1054ab6e47cd Mon Sep 17 00:00:00 2001 From: John Floren Date: Thu, 8 Aug 2024 10:53:28 -0700 Subject: [PATCH 4/7] Update readme --- README | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/README b/README index b5b8ee0..da1d15e 100644 --- a/README +++ b/README @@ -1,10 +1,14 @@ -# Pre-reqs: +# Gravwell Training Repository + +This repository contains the LaTeX source for the Gravwell training book, as well as Dockerfiles to build the container images used in the lab sections. Please refer to the [releases page](https://github.com/gravwell/training/releases) for pre-built PDFs of the training book. + +## Pre-reqs: apt-get install texlive-* latexmk You'll want the shell installers for simple relay, file follow, netflow capture, and federator in /tmp before building the containers. -# Building +## Building To build just the PDF: @@ -12,7 +16,9 @@ To build just the PDF: To build the whole tarball with docker images and all: - VERSION=5.3.0 LICENSE=/path/to/gravwell-license make dist - + LICENSE=/path/to/gravwell-license make dist NOTE: You will need a training license in order to build the complete set of containers. + +If you need to build for a specific older version of Gravwell, set the VERSION variable when running `make dist`. + From 61aa8ba4f7a8df6e494e2e67da5f895b83bcb904 Mon Sep 17 00:00:00 2001 From: John Floren Date: Thu, 8 Aug 2024 10:54:08 -0700 Subject: [PATCH 5/7] Move README to README.md --- README => README.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename README => README.md (100%) diff --git a/README b/README.md similarity index 100% rename from README rename to README.md From ae0bc062421c5e6cc0c0fcc6577475633cf9f847 Mon Sep 17 00:00:00 2001 From: John Floren Date: Thu, 8 Aug 2024 11:00:26 -0700 Subject: [PATCH 6/7] Update readme some more --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index da1d15e..57ff6de 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,11 @@ This repository contains the LaTeX source for the Gravwell training book, as wel ## Pre-reqs: +You'll need a basic LaTeX setup: + apt-get install texlive-* latexmk -You'll want the shell installers for simple relay, file follow, netflow capture, and federator in /tmp before building the containers. +If you intend to build the Docker images too, you'll also need to have [Go](https://go.dev) installed, as we compile some utilities in the process. ## Building @@ -14,11 +16,11 @@ To build just the PDF: make master.pdf -To build the whole tarball with docker images and all: +To build the whole tarball with Docker images and all: - LICENSE=/path/to/gravwell-license make dist + GOPATH=~/go LICENSE=/path/to/gravwell-license make dist NOTE: You will need a training license in order to build the complete set of containers. -If you need to build for a specific older version of Gravwell, set the VERSION variable when running `make dist`. +(If you need to build for a specific older version of Gravwell, set the VERSION variable when running `make dist`.) From 99bcb61cd5dbd411de43f7b39c4757046c24efdf Mon Sep 17 00:00:00 2001 From: John Floren Date: Thu, 8 Aug 2024 14:23:18 -0700 Subject: [PATCH 7/7] Fix the version nonsense --- dockerfiles/build_all.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dockerfiles/build_all.sh b/dockerfiles/build_all.sh index c3e4529..1350f58 100644 --- a/dockerfiles/build_all.sh +++ b/dockerfiles/build_all.sh @@ -31,7 +31,7 @@ fi echo >> $LOGFILE echo "Creating slim container" echo "Creating slim container as our base" >> $LOGFILE -/bin/bash createslim.sh >> $LOGFILE +. createslim.sh >> $LOGFILE if [ "$?" != "0" ]; then echo "Failed to create slim container" @@ -54,7 +54,7 @@ function build() { echo "building $d" echo >> $LOGFILE echo "building $d" >> $LOGFILE - VER=$VER bash run.sh >> $LOGFILE + . run.sh >> $LOGFILE if [ "$?" != "0" ]; then echo "Failed to build $d" exit -1