20 Commits

Author SHA1 Message Date
e5f9d3e3c8 docker hub, fix 2023-09-27 15:32:26 +02:00
6f2966800b docker hub 2023-09-27 15:28:18 +02:00
c0f1bddf29 more constants 2023-09-27 12:45:07 +02:00
f96aa7c798 more constants 2023-09-27 12:43:42 +02:00
314b9a421d use user nobody already in dockerfile 2023-09-27 12:41:44 +02:00
6cf3b46f76 use user nobody already in dockerfile 2023-09-27 12:39:18 +02:00
7cf68d5d55 use user nobody already in dockerfile 2023-09-27 12:38:54 +02:00
8817c3fa12 configuration only by env vars, fix 2023-09-27 12:35:18 +02:00
f90c1c2dbb configuration only by env vars, fix 2023-09-27 12:33:37 +02:00
c6fcce2d41 configuration only by env vars 2023-09-27 12:30:55 +02:00
828dffd523 change database configuration to env vars, fix 2023-09-27 12:02:37 +02:00
053927e329 change database configuration to env vars, fix 2023-09-27 12:01:15 +02:00
b555c9a37f change database configuration to env vars, fix 2023-09-27 11:56:46 +02:00
1adf5fa9d0 change database configuration to env vars, fix 2023-09-27 11:39:53 +02:00
73567d3230 change database configuration to env vars 2023-09-27 11:36:54 +02:00
f24cdbac1c new apline base image 2023-09-13 12:50:11 +02:00
535af64d1a refactor ci script 2022-01-11 11:03:59 +01:00
29fd3a5234 move schema to separate project 2022-01-11 10:47:03 +01:00
8637dc0f57 document alarm and mainscnt 2022-01-11 10:30:09 +01:00
708822c661 fix 2021-09-21 22:05:23 +02:00
8 changed files with 113 additions and 93 deletions

3
.gitignore vendored
View File

@ -6,5 +6,6 @@ cube/pubsubc.a
test test
.bash_history .bash_history
.vscode .vscode
.dccache
sink/.dccache

View File

@ -1,12 +1,30 @@
stages: stages:
- check
- build - build
- deploy - deploy
include: variables:
- project: dockerized/commons IMAGE_NAME: $CI_REGISTRY/$CI_PROJECT_PATH
ref: master HUB_IMAGE_NAME: wollud1969/sinkserver
file: gitlab-ci-template.yml
build:
image: registry.hottis.de/dockerized/docker-bash:latest
stage: build
tags:
- hottis
- linux
- docker
script:
- 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 push $IMAGE_NAME:${CI_COMMIT_SHORT_SHA}
- if [ "$CI_COMMIT_TAG" != "" ]; then
docker tag $IMAGE_NAME:${CI_COMMIT_SHORT_SHA} $IMAGE_NAME:${CI_COMMIT_TAG};
docker push $IMAGE_NAME:${CI_COMMIT_TAG};
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
@ -23,5 +41,14 @@ deploy:
script: script:
- docker stop $CONTAINER_NAME || echo "container not running, never mind" - docker stop $CONTAINER_NAME || echo "container not running, never mind"
- docker rm $CONTAINER_NAME || echo "container not existing, never mind" - docker rm $CONTAINER_NAME || echo "container not existing, never mind"
- docker run -d --network docker-server --ip 172.16.10.42 -v sink_config:/etc/sink --name $CONTAINER_NAME --restart always $IMAGE_NAME:$CI_COMMIT_TAG - docker run
-d
--network docker-server
--ip 172.16.10.42
-v sink_config:/etc/sink
--name $CONTAINER_NAME
--restart always
$IMAGE_NAME:$CI_COMMIT_TAG
environment:
name: production

View File

@ -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
View 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

View File

@ -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).

View File

@ -1,9 +0,0 @@
CREATE SEQUENCE device_s START WITH 1 INCREMENT BY 1;
CREATE TABLE device_t (
id integer PRIMARY KEY DEFAULT NEXTVAL('device_s'),
deviceid varchar(16) UNIQUE NOT NULL,
sharedsecret varchar(31) NOT NULL CHECK(char_length(sharedSecret) = 31),
location varchar(128) NOT NULL,
active boolean NOT NULL DEFAULT false
);

View File

@ -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:vs: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);
} }

View File

@ -1,7 +0,0 @@
postgresqlConnInfo = "host=172.16.3.32 dbname=mainscnt user=sink password=test123";
lowerBound = 45000;
upperBound = 55000;
receivePort = 20169;