diff --git a/Dockerfile b/Dockerfile index ed25727..7446cf5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,25 +1,35 @@ # build stage -FROM golang:alpine AS build-env +FROM golang:1.17.0-alpine AS build-env RUN apk --no-cache add build-base git gcc -RUN git clone https://github.com/RaaLabs/steward.git -WORKDIR /go/steward/cmd + +RUN mkdir -p /build +COPY ./steward /build/ + +WORKDIR /build/cmd/steward/ +RUN go version RUN go build -o steward # final stage FROM alpine + +RUN apk update && apk add curl && apk add nmap + WORKDIR /app -COPY --from=build-env /go/steward/cmd/steward /app/ +COPY --from=build-env /build/cmd/steward/steward /app/ ENV CONFIG_FOLDER "./etc" ENV SOCKET_FOLDER "./tmp" +ENV TCP_LISTENER "" ENV DATABASE_FOLDER "./var/lib" ENV NODE_NAME "" ENV BROKER_ADDRESS "127.0.0.1:4222" +ENV NATS_CONNECT_RETRY_INTERVAL "10" ENV PROFILING_PORT "" -ENV PROM_HOST_AND_PORT "" +ENV PROM_HOST_AND_PORT "127.0.0.1:2111" ENV DEFAULT_MESSAGE_TIMEOUT 10 ENV DEFAULT_MESSAGE_RETRIES 3 ENV SUBSCRIBERS_DATA_FOLDER "./var" +ENV EXPOSE_DATA_FOLDER "127.0.0.1:8090" ENV CENTRAL_NODE_NAME "" ENV ROOT_CA_PATH "" ENV NKEY_SEED_FILE "" @@ -37,24 +47,25 @@ ENV START_SUB_REQN_CLI_COMMAND "" ENV START_SUB_REQ_TO_CONSOLE "" ENV START_SUB_REQ_HTTP_GET "" ENV START_SUB_REQ_TAIL_FILE "" +ENV START_SUB_REQ_N_CLI_COMMAND_CONT "" -CMD ["ash","-c","/app/steward\ - -configFolder=$CONFIG_FOLDER\ +CMD ["ash","-c","env CONFIGFOLDER=./etc/ /app/steward\ -socketFolder=$SOCKET_FOLDER\ + -tcpListener=$TCP_LISTENER\ -databaseFolder=$DATABASE_FOLDER\ -nodeName=$NODE_NAME\ -brokerAddress=$BROKER_ADDRESS\ + -natsConnectRetryInterval=$NATS_CONNECT_RETRY_INTERVAL\ -profilingPort=$PROFILING_PORT\ -promHostAndPort=$PROM_HOST_AND_PORT\ -defaultMessageTimeout=$DEFAULT_MESSAGE_TIMEOUT\ -defaultMessageRetries=$DEFAULT_MESSAGE_RETRIES\ - -subscribersDataFolder=SUBSCRIBERS_DATA_FOLDER\ + -subscribersDataFolder=$SUBSCRIBERS_DATA_FOLDER\ + -exposeDataFolder=$EXPOSE_DATA_FOLDER\ -centralNodeName=$CENTRAL_NODE_NAME\ -rootCAPath=$ROOT_CA_PATH\ -nkeySeedFile=$NKEY_SEED_FILE\ - -startPubREQHello=$START_PUB_REQ_HELLO\ - -startSubREQErrorLog=$START_SUB_REQ_ERROR_LOG\ -startSubREQHello=$START_SUB_REQ_HELLO\ -startSubREQToFileAppend=$START_SUB_REQ_TO_FILE_APPEND\ @@ -66,4 +77,5 @@ CMD ["ash","-c","/app/steward\ -startSubREQToConsole=$START_SUB_REQ_TO_CONSOLE\ -startSubREQHttpGet=$START_SUB_REQ_HTTP_GET\ -startSubREQTailFile=$START_SUB_REQ_TAIL_FILE\ - "] \ No newline at end of file + -startSubREQnCliCommandCont=$START_SUB_REQ_N_CLI_COMMAND_CONT\ + "] diff --git a/README.md b/README.md index 914e6b1..27c5cfa 100644 --- a/README.md +++ b/README.md @@ -650,6 +650,12 @@ For CliCommand message to a node named "ship1" of type Command and it wants an A ## TODO +Put in a limit on error messages if the central for some reason have not started errorLog, since you will be spammed with this.. + +2021/09/04 05:56:00 <--- publisher: received ACK from:errorCentral, for: REQErrorLog, data: not allowed from central + +--- + Services at startup of Steward. Could be implemented by having a local folder of messages to go through at startup. What is needed: - A Handler that writes to this folder. diff --git a/subscriber_method_types.go b/subscriber_method_types.go index f0787ed..37f2c67 100644 --- a/subscriber_method_types.go +++ b/subscriber_method_types.go @@ -291,6 +291,31 @@ func newReplyMessage(proc process, message Message, outData []byte) { proc.toRingbufferCh <- []subjectAndMessage{sam} } +// selectFileNaming will figure out the correct naming of the file +// structure to use for the reply data. +// It will return the filename, and the tree structure for the folders +// to create. +func selectFileNaming(message Message, proc process) (string, string) { + var fileName string + var folderTree string + + switch { + case message.PreviousMessage == nil: + // If this was a direct request there are no previous message to take + // information from, so we use the one that are in the current mesage. + fileName = message.FileName + folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.Directory, string(message.ToNode)) + case message.PreviousMessage.ToNode != "": + fileName = message.PreviousMessage.FileName + folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.PreviousMessage.ToNode)) + case message.PreviousMessage.ToNode == "": + fileName = message.PreviousMessage.FileName + folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.FromNode)) + } + + return fileName, folderTree +} + // ------------------------------------------------------------ // Subscriber method handlers // ------------------------------------------------------------ @@ -490,21 +515,7 @@ func (m methodREQToFileAppend) handler(proc process, message Message, node strin // If it was a request type message we want to check what the initial messages // method, so we can use that in creating the file name to store the data. - var fileName string - var folderTree string - switch { - case message.PreviousMessage == nil: - // If this was a direct request there are no previous message to take - // information from, so we use the one that are in the current mesage. - fileName = message.FileName - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.Directory, string(message.ToNode), string(message.Method)) - case message.PreviousMessage.ToNode != "": - fileName = message.PreviousMessage.FileName - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.PreviousMessage.ToNode), string(message.PreviousMessage.Method)) - case message.PreviousMessage.ToNode == "": - fileName = message.PreviousMessage.FileName - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.FromNode), string(message.Method)) - } + fileName, folderTree := selectFileNaming(message, proc) // Check if folder structure exist, if not create it. if _, err := os.Stat(folderTree); os.IsNotExist(err) { @@ -559,21 +570,7 @@ func (m methodREQToFile) handler(proc process, message Message, node string) ([] // If it was a request type message we want to check what the initial messages // method, so we can use that in creating the file name to store the data. - var fileName string - var folderTree string - switch { - case message.PreviousMessage == nil: - // If this was a direct request there are no previous message to take - // information from, so we use the one that are in the current mesage. - fileName = message.FileName - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.Directory, string(message.ToNode), string(message.Method)) - case message.PreviousMessage.ToNode != "": - fileName = message.PreviousMessage.FileName - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.PreviousMessage.ToNode), string(message.PreviousMessage.Method)) - case message.PreviousMessage.ToNode == "": - fileName = message.PreviousMessage.FileName - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.FromNode), string(message.Method)) - } + fileName, folderTree := selectFileNaming(message, proc) // Check if folder structure exist, if not create it. if _, err := os.Stat(folderTree); os.IsNotExist(err) { @@ -682,21 +679,7 @@ func (m methodREQErrorLog) handler(proc process, message Message, node string) ( // If it was a request type message we want to check what the initial messages // method, so we can use that in creating the file name to store the data. - var fileName string - var folderTree string - switch { - case message.PreviousMessage == nil: - // If this was a direct request there are no previous message to take - // information from, so we use the one that are in the current mesage. - fileName = fmt.Sprintf("%v-%v", string(message.FromNode), message.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.Directory, string(message.ToNode), string(message.Method)) - case message.PreviousMessage.ToNode != "": - fileName = fmt.Sprintf("%v-%v", string(message.FromNode), message.PreviousMessage.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.PreviousMessage.ToNode), string(message.PreviousMessage.Method)) - case message.PreviousMessage.ToNode == "": - fileName = fmt.Sprintf("%v-%v", string(message.FromNode), message.PreviousMessage.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.FromNode), string(message.Method)) - } + fileName, folderTree := selectFileNaming(message, proc) // Check if folder structure exist, if not create it. if _, err := os.Stat(folderTree); os.IsNotExist(err) { @@ -745,21 +728,7 @@ func (m methodREQPing) handler(proc process, message Message, node string) ([]by // If it was a request type message we want to check what the initial messages // method, so we can use that in creating the file name to store the data. - var fileName string - var folderTree string - switch { - case message.PreviousMessage == nil: - // If this was a direct request there are no previous message to take - // information from, so we use the one that are in the current mesage. - fileName = fmt.Sprintf("%v-%v", string(message.FromNode), message.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.Directory, string(message.ToNode), string(message.Method)) - case message.PreviousMessage.ToNode != "": - fileName = fmt.Sprintf("%v-%v", string(message.FromNode), message.PreviousMessage.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.PreviousMessage.ToNode), string(message.PreviousMessage.Method)) - case message.PreviousMessage.ToNode == "": - fileName = fmt.Sprintf("%v-%v", string(message.FromNode), message.PreviousMessage.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.FromNode), string(message.Method)) - } + fileName, folderTree := selectFileNaming(message, proc) // Check if folder structure exist, if not create it. if _, err := os.Stat(folderTree); os.IsNotExist(err) { @@ -823,21 +792,7 @@ func (m methodREQPong) handler(proc process, message Message, node string) ([]by // If it was a request type message we want to check what the initial messages // method, so we can use that in creating the file name to store the data. - var fileName string - var folderTree string - switch { - case message.PreviousMessage == nil: - // If this was a direct request there are no previous message to take - // information from, so we use the one that are in the current mesage. - fileName = fmt.Sprintf("%v", message.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.Directory, string(message.ToNode), string(message.Method)) - case message.PreviousMessage.ToNode != "": - fileName = fmt.Sprintf("%v", message.PreviousMessage.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.PreviousMessage.ToNode), string(message.PreviousMessage.Method)) - case message.PreviousMessage.ToNode == "": - fileName = fmt.Sprintf("%v", message.PreviousMessage.FileName) - folderTree = filepath.Join(proc.configuration.SubscribersDataFolder, message.PreviousMessage.Directory, string(message.FromNode), string(message.Method)) - } + fileName, folderTree := selectFileNaming(message, proc) // Check if folder structure exist, if not create it. if _, err := os.Stat(folderTree); os.IsNotExist(err) {