Compare commits
16 Commits
0.0.4
...
e5f9d3e3c8
Author | SHA1 | Date | |
---|---|---|---|
e5f9d3e3c8
|
|||
6f2966800b
|
|||
c0f1bddf29
|
|||
f96aa7c798
|
|||
314b9a421d
|
|||
6cf3b46f76
|
|||
7cf68d5d55
|
|||
8817c3fa12
|
|||
f90c1c2dbb
|
|||
c6fcce2d41
|
|||
828dffd523
|
|||
053927e329
|
|||
b555c9a37f
|
|||
1adf5fa9d0
|
|||
73567d3230
|
|||
f24cdbac1c
|
3
.gitignore
vendored
3
.gitignore
vendored
@ -6,5 +6,6 @@ cube/pubsubc.a
|
|||||||
test
|
test
|
||||||
.bash_history
|
.bash_history
|
||||||
.vscode
|
.vscode
|
||||||
|
.dccache
|
||||||
|
sink/.dccache
|
||||||
|
|
||||||
|
@ -4,6 +4,7 @@ stages:
|
|||||||
|
|
||||||
variables:
|
variables:
|
||||||
IMAGE_NAME: $CI_REGISTRY/$CI_PROJECT_PATH
|
IMAGE_NAME: $CI_REGISTRY/$CI_PROJECT_PATH
|
||||||
|
HUB_IMAGE_NAME: wollud1969/sinkserver
|
||||||
|
|
||||||
build:
|
build:
|
||||||
image: registry.hottis.de/dockerized/docker-bash:latest
|
image: registry.hottis.de/dockerized/docker-bash:latest
|
||||||
@ -13,13 +14,18 @@ build:
|
|||||||
- linux
|
- linux
|
||||||
- docker
|
- docker
|
||||||
script:
|
script:
|
||||||
- docker build --tag $IMAGE_NAME:${CI_COMMIT_SHORT_SHA} .
|
- docker build --build-arg="VERSION=${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TAG}" --tag $IMAGE_NAME:${CI_COMMIT_SHORT_SHA} .
|
||||||
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY;
|
- docker login -u gitlab-ci-token -p $CI_JOB_TOKEN $CI_REGISTRY;
|
||||||
- docker push $IMAGE_NAME:${CI_COMMIT_SHORT_SHA}
|
- docker push $IMAGE_NAME:${CI_COMMIT_SHORT_SHA}
|
||||||
- if [ "$CI_COMMIT_TAG" != "" ]; then
|
- if [ "$CI_COMMIT_TAG" != "" ]; then
|
||||||
docker tag $IMAGE_NAME:${CI_COMMIT_SHORT_SHA} $IMAGE_NAME:${CI_COMMIT_TAG};
|
docker tag $IMAGE_NAME:${CI_COMMIT_SHORT_SHA} $IMAGE_NAME:${CI_COMMIT_TAG};
|
||||||
docker push $IMAGE_NAME:${CI_COMMIT_TAG};
|
docker push $IMAGE_NAME:${CI_COMMIT_TAG};
|
||||||
fi
|
fi
|
||||||
|
- docker login -u $DOCKER_HUB_LOGIN -p $DOCKER_HUB_PASSWORD
|
||||||
|
- docker tag $IMAGE_NAME:${CI_COMMIT_SHORT_SHA} ${HUB_IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}
|
||||||
|
- docker push ${HUB_IMAGE_NAME}:${CI_COMMIT_SHORT_SHA}
|
||||||
|
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
image: registry.hottis.de/dockerized/docker-bash:latest
|
image: registry.hottis.de/dockerized/docker-bash:latest
|
||||||
stage: deploy
|
stage: deploy
|
||||||
|
20
Dockerfile
20
Dockerfile
@ -1,4 +1,4 @@
|
|||||||
FROM alpine:3.13 AS builder
|
FROM alpine:3.18.3 AS builder
|
||||||
|
|
||||||
ARG VERSION="dockerized"
|
ARG VERSION="dockerized"
|
||||||
|
|
||||||
@ -13,20 +13,26 @@ RUN \
|
|||||||
make VERSION=${VERSION}
|
make VERSION=${VERSION}
|
||||||
|
|
||||||
|
|
||||||
FROM alpine:3.13
|
FROM alpine:3.18.3
|
||||||
|
|
||||||
|
ENV PGHOST=""
|
||||||
|
ENV PGDATABASE="mainscnt"
|
||||||
|
ENV PGUSER="sink"
|
||||||
|
ENV PGPASSWORD=""
|
||||||
|
ENV PGSSLMODE="require"
|
||||||
|
ENV LOWER_BOUND="44000"
|
||||||
|
ENV UPPER_BOUND="56000"
|
||||||
|
|
||||||
COPY --from=builder /tmp/sink/build/sink20169 /usr/local/bin/
|
COPY --from=builder /tmp/sink/build/sink20169 /usr/local/bin/
|
||||||
|
|
||||||
RUN \
|
RUN \
|
||||||
apk add --no-cache libpq && \
|
apk add --no-cache libpq && \
|
||||||
apk add --no-cache libconfig && \
|
apk add --no-cache libconfig
|
||||||
mkdir /etc/sink
|
|
||||||
|
|
||||||
EXPOSE 20169/udp
|
EXPOSE 20169/udp
|
||||||
|
USER nobody
|
||||||
|
|
||||||
VOLUME /etc/sink
|
CMD [ "/usr/local/bin/sink20169", "-v" ]
|
||||||
|
|
||||||
CMD [ "/usr/local/bin/sink20169", "-f", "/etc/sink/sink20169.cfg", "-n", "nobody", "-v" ]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
54
deployment/deploy.yml
Normal file
54
deployment/deploy.yml
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: sinkserver
|
||||||
|
labels:
|
||||||
|
app: sinkserver
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: sinkserver
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: sinkserver
|
||||||
|
spec:
|
||||||
|
imagePullSecrets:
|
||||||
|
- name: hottis-registry-creds
|
||||||
|
containers:
|
||||||
|
- name: sinkserver
|
||||||
|
image: registry.hottis.de/mainscnt/sinkserver:314b9a42
|
||||||
|
ports:
|
||||||
|
- containerPort: 20169
|
||||||
|
protocol: UDP
|
||||||
|
env:
|
||||||
|
- name: PGHOST
|
||||||
|
valueFrom:
|
||||||
|
configMapKeyRef:
|
||||||
|
name: sinkserver-config
|
||||||
|
key: dbhost
|
||||||
|
- name: PGPASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: sinkserver-secret
|
||||||
|
key: dbpass
|
||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: sinkserver
|
||||||
|
labels:
|
||||||
|
app: sinkserver
|
||||||
|
spec:
|
||||||
|
type: LoadBalancer
|
||||||
|
selector:
|
||||||
|
app: sinkserver
|
||||||
|
ports:
|
||||||
|
- protocol: UDP
|
||||||
|
port: 20169
|
||||||
|
targetPort: 20169
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -32,3 +32,4 @@ Measurement is visualized at https://grafana.mainscnt.eu.
|
|||||||
The projects of the three current variants are at [RPi](https://home.hottis.de/gitlab/wolutator/mains-frequency-counter-rpi), [STM32](https://home.hottis.de/gitlab/wolutator/mains-frequency-counter-stm32) and [ESP32](https://home.hottis.de/gitlab/wolutator/mains-frequency-counter-esp32).
|
The projects of the three current variants are at [RPi](https://home.hottis.de/gitlab/wolutator/mains-frequency-counter-rpi), [STM32](https://home.hottis.de/gitlab/wolutator/mains-frequency-counter-stm32) and [ESP32](https://home.hottis.de/gitlab/wolutator/mains-frequency-counter-esp32).
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,14 +17,12 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
#include <pwd.h>
|
#include <pwd.h>
|
||||||
#include <libconfig.h>
|
|
||||||
#include <libpq-fe.h>
|
#include <libpq-fe.h>
|
||||||
#include <sinkStruct.h>
|
#include <sinkStruct.h>
|
||||||
#include <logging.h>
|
#include <logging.h>
|
||||||
#include <sha256.h>
|
#include <sha256.h>
|
||||||
|
|
||||||
|
|
||||||
const char DEFAULT_CONFIG_FILENAME[] = "./sink20169.cfg";
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const char *deviceId;
|
const char *deviceId;
|
||||||
@ -34,20 +32,12 @@ typedef struct {
|
|||||||
PGresult *deviceResult;
|
PGresult *deviceResult;
|
||||||
} t_device;
|
} t_device;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
config_t cfg;
|
|
||||||
uint16_t numOfDevices;
|
|
||||||
t_device *devices;
|
|
||||||
} t_configHandle;
|
|
||||||
|
|
||||||
#define NUM_OF_STMT_PARAMS 4
|
#define NUM_OF_STMT_PARAMS 4
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
t_configHandle *configHandle;
|
|
||||||
int receiveSockFd;
|
int receiveSockFd;
|
||||||
int32_t lowerBound;
|
int32_t lowerBound;
|
||||||
int32_t upperBound;
|
int32_t upperBound;
|
||||||
const char *postgresqlConnInfo;
|
|
||||||
PGconn *conn;
|
PGconn *conn;
|
||||||
t_device foundDevice;
|
t_device foundDevice;
|
||||||
} t_commonHandle;
|
} t_commonHandle;
|
||||||
@ -61,7 +51,7 @@ int openDatabaseConnection(t_commonHandle *handle) {
|
|||||||
|
|
||||||
if (! handle->conn) {
|
if (! handle->conn) {
|
||||||
logmsg(LOG_DEBUG, "Opening connection to database");
|
logmsg(LOG_DEBUG, "Opening connection to database");
|
||||||
handle->conn = PQconnectdb(handle->postgresqlConnInfo);
|
handle->conn = PQconnectdb("");
|
||||||
} else if (PQstatus(handle->conn) != CONNECTION_OK) {
|
} else if (PQstatus(handle->conn) != CONNECTION_OK) {
|
||||||
logmsg(LOG_DEBUG, "Resetting connection to database");
|
logmsg(LOG_DEBUG, "Resetting connection to database");
|
||||||
PQreset(handle->conn);
|
PQreset(handle->conn);
|
||||||
@ -75,22 +65,6 @@ int openDatabaseConnection(t_commonHandle *handle) {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
int initConfig(const char *configFilename, t_configHandle *configHandle) {
|
|
||||||
config_init(&(configHandle->cfg));
|
|
||||||
if (! config_read_file(&(configHandle->cfg), configFilename)) {
|
|
||||||
logmsg(LOG_ERR, "failed to read config file: %s:%d - %s\n",
|
|
||||||
config_error_file(&(configHandle->cfg)), config_error_line(&(configHandle->cfg)),
|
|
||||||
config_error_text(&(configHandle->cfg)));
|
|
||||||
config_destroy(&(configHandle->cfg));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void deinitConfig(t_configHandle *configHandle) {
|
|
||||||
config_destroy(&(configHandle->cfg));
|
|
||||||
}
|
|
||||||
|
|
||||||
// When you got a result here, remember to free it using freeDevice
|
// When you got a result here, remember to free it using freeDevice
|
||||||
int findDevice(t_commonHandle *handle, char *deviceId) {
|
int findDevice(t_commonHandle *handle, char *deviceId) {
|
||||||
@ -154,9 +128,7 @@ void freeDevice(t_commonHandle *handle) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int initReceiver(t_configHandle *configHandle, t_commonHandle *handle) {
|
int initReceiver(t_commonHandle *handle) {
|
||||||
handle->configHandle = configHandle;
|
|
||||||
|
|
||||||
struct sockaddr_in servaddr;
|
struct sockaddr_in servaddr;
|
||||||
|
|
||||||
handle->receiveSockFd = socket(AF_INET, SOCK_DGRAM, 0);
|
handle->receiveSockFd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
@ -166,11 +138,6 @@ int initReceiver(t_configHandle *configHandle, t_commonHandle *handle) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int receivePort = 20169;
|
int receivePort = 20169;
|
||||||
config_lookup_int(&(configHandle->cfg), "receivePort", &receivePort);
|
|
||||||
if (receivePort < 1 || receivePort > 65535) {
|
|
||||||
logmsg(LOG_ERR, "illegal receive port configured");
|
|
||||||
return -2;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(&servaddr, 0, sizeof(servaddr));
|
memset(&servaddr, 0, sizeof(servaddr));
|
||||||
servaddr.sin_family = AF_INET;
|
servaddr.sin_family = AF_INET;
|
||||||
@ -231,22 +198,13 @@ int receiveAndVerifyMinuteBuffer(t_commonHandle *handle, t_minuteBuffer *buf) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int initForwarder(t_configHandle *configHandle, t_commonHandle *handle) {
|
int initForwarder(t_commonHandle *handle) {
|
||||||
handle->configHandle = configHandle;
|
|
||||||
|
|
||||||
handle->postgresqlConnInfo = NULL;
|
|
||||||
config_lookup_string(&(configHandle->cfg), "postgresqlConnInfo", &(handle->postgresqlConnInfo));
|
|
||||||
if (! handle->postgresqlConnInfo) {
|
|
||||||
logmsg(LOG_ERR, "no postgresql connInfo configured");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
handle->conn = NULL;
|
handle->conn = NULL;
|
||||||
|
|
||||||
handle->lowerBound = 45000;
|
char *lowerBoundStr = getenv("LOWER_BOUND");
|
||||||
config_lookup_int(&(configHandle->cfg), "lowerBound", &(handle->lowerBound));
|
handle->lowerBound = lowerBoundStr ? strtol(lowerBoundStr, NULL, 10) : 45000;
|
||||||
handle->upperBound = 55000;
|
char *upperBoundStr = getenv("UPPER_BOUND");
|
||||||
config_lookup_int(&(configHandle->cfg), "upperBound", &(handle->upperBound));
|
handle->upperBound = upperBoundStr ? strtol(upperBoundStr, NULL, 10) : 55000;
|
||||||
logmsg(LOG_INFO, "lowerBound: %u, upperBound: %u", handle->lowerBound, handle->upperBound);
|
logmsg(LOG_INFO, "lowerBound: %u, upperBound: %u", handle->lowerBound, handle->upperBound);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -357,21 +315,16 @@ void usage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
t_configHandle configHandle;
|
|
||||||
t_commonHandle commonHandle;
|
t_commonHandle commonHandle;
|
||||||
commonHandle.foundDevice.deviceResult = NULL;
|
commonHandle.foundDevice.deviceResult = NULL;
|
||||||
|
|
||||||
|
|
||||||
const char *configFilename = DEFAULT_CONFIG_FILENAME;
|
|
||||||
const char *dropPrivilegesToUser = NULL;
|
const char *dropPrivilegesToUser = NULL;
|
||||||
bool doFork = false;
|
bool doFork = false;
|
||||||
|
|
||||||
int c;
|
int c;
|
||||||
while ((c = getopt(argc, argv, "f:vds:hn:b")) != -1) {
|
while ((c = getopt(argc, argv, "vds:hn:b")) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'f':
|
|
||||||
configFilename = strdup(optarg);
|
|
||||||
break;
|
|
||||||
case 'v':
|
case 'v':
|
||||||
verbose = true;
|
verbose = true;
|
||||||
break;
|
break;
|
||||||
@ -410,11 +363,6 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
logmsg(LOG_INFO, "Version: " VERSION);
|
logmsg(LOG_INFO, "Version: " VERSION);
|
||||||
|
|
||||||
if (0 != initConfig(configFilename, &configHandle)) {
|
|
||||||
logmsg(LOG_ERR, "error when reading configuration");
|
|
||||||
exit(3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (doFork) {
|
if (doFork) {
|
||||||
int pid = fork();
|
int pid = fork();
|
||||||
if (pid == -1) {
|
if (pid == -1) {
|
||||||
@ -427,12 +375,12 @@ int main(int argc, char **argv) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != initReceiver(&configHandle, &commonHandle)) {
|
if (0 != initReceiver(&commonHandle)) {
|
||||||
logmsg(LOG_ERR, "error when initializing receiver");
|
logmsg(LOG_ERR, "error when initializing receiver");
|
||||||
exit(5);
|
exit(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (0 != initForwarder(&configHandle, &commonHandle)) {
|
if (0 != initForwarder(&commonHandle)) {
|
||||||
logmsg(LOG_ERR, "error when initializing forwarder");
|
logmsg(LOG_ERR, "error when initializing forwarder");
|
||||||
exit(6);
|
exit(6);
|
||||||
}
|
}
|
||||||
@ -458,5 +406,4 @@ int main(int argc, char **argv) {
|
|||||||
|
|
||||||
deinitForwarder(&commonHandle);
|
deinitForwarder(&commonHandle);
|
||||||
deinitReceiver(&commonHandle);
|
deinitReceiver(&commonHandle);
|
||||||
deinitConfig(&configHandle);
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
postgresqlConnInfo = "host=172.16.3.32 dbname=mainscnt user=sink password=test123";
|
|
||||||
|
|
||||||
lowerBound = 45000;
|
|
||||||
upperBound = 55000;
|
|
||||||
|
|
||||||
receivePort = 20169;
|
|
||||||
|
|
Reference in New Issue
Block a user