summaryrefslogtreecommitdiff
path: root/src/umbrella.h
blob: e44d6266a604a7038cf18038ab4db8cc38a2a0a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#ifndef UMBRELLA_H
#define UMBRELLA_H

#include <stdint.h>
#include <sys/types.h>

/* ── Version ─────────────────────────────────────────────────────────────── */
#define UMBRELLA_VERSION "0.1.0"

/* ── Paths ───────────────────────────────────────────────────────────────── */
#define UMBRELLA_CONF_DIR   "/etc/umbrella"
#define UMBRELLA_UNITS_DIR  "/etc/umbrella/units"
#define UMBRELLA_CONF_FILE  "/etc/umbrella/umbrella.conf"
#define UMBRELLA_SOCK_PATH  "/run/umbrella/umbrella.sock"
#define UMBRELLA_PID_FILE   "/run/umbrella/umbrella.pid"
#define UMBRELLA_LOG_FILE   "/var/log/umbrella/umbrella.log"

/* ── Limits ──────────────────────────────────────────────────────────────── */
#define MAX_UNITS           64
#define MAX_CLIENTS         32
#define MAX_NAME            64
#define MAX_PATH            256
#define MAX_DISPLAY         128
#define MAX_ACTIONS         16
#define RING_BUF_LINES      500     /* output lines buffered per unit */
#define RING_BUF_LINE_MAX   1024    /* max bytes per buffered line */
#define PROTO_MAX_MSG       65536   /* max wire message size */

/* ── Console types ───────────────────────────────────────────────────────── */
typedef enum {
    CONSOLE_RCON  = 0,
    CONSOLE_STDIN = 1,
} ConsoleType;

/* ── Health check types ──────────────────────────────────────────────────── */
typedef enum {
    HEALTH_A2S = 0,
    HEALTH_TCP = 1,
    HEALTH_NONE = 2,
} HealthType;

/* ── Process state ───────────────────────────────────────────────────────── */
typedef enum {
    STATE_STOPPED  = 0,
    STATE_STARTING = 1,
    STATE_RUNNING  = 2,
    STATE_CRASHED  = 3,
} ProcessState;

/* ── Action: a named script ──────────────────────────────────────────────── */
typedef struct {
    char name[MAX_NAME];
    char script[MAX_PATH];
} Action;

/* ── Console config ──────────────────────────────────────────────────────── */
typedef struct {
    ConsoleType type;
    char host[64];
    uint16_t port;
    char password[128];     /* RCON password; empty for stdin */
    char password_env[64];  /* env var name to read password from */
} ConsoleConfig;

/* ── Health config ───────────────────────────────────────────────────────── */
typedef struct {
    HealthType type;
    char host[64];
    uint16_t port;
    int timeout_ms;
} HealthConfig;

/* ── Ring buffer: circular store of recent output lines ──────────────────── */
typedef struct {
    char lines[RING_BUF_LINES][RING_BUF_LINE_MAX];
    int head;   /* next write position */
    int count;  /* how many lines are valid */
} RingBuffer;

/* ── Unit: a loaded descriptor ───────────────────────────────────────────── */
typedef struct {
    char name[MAX_NAME];
    char display[MAX_DISPLAY];
    char service[MAX_NAME];     /* systemd unit name, informational */
    ConsoleConfig console;
    HealthConfig health;
    char log_paths[4][MAX_PATH];
    int log_count;
    Action actions[MAX_ACTIONS];
    int action_count;

    /* Runtime state (populated by process/rcon layer, not yaml) */
    ProcessState state;
    pid_t pid;                  /* only for CONSOLE_STDIN */
    int stdin_fd;               /* only for CONSOLE_STDIN */
    int stdout_fd;              /* only for CONSOLE_STDIN */
    RingBuffer *output;
} Unit;

/* ── Client: a connected socket client ───────────────────────────────────── */
typedef struct {
    int fd;
    char attached[MAX_NAME];    /* unit name, or empty if not attached */
    int uid;                    /* peer uid from SO_PEERCRED */
} Client;

/* ── Global daemon state ─────────────────────────────────────────────────── */
typedef struct {
    Unit    units[MAX_UNITS];
    int     unit_count;
    Client  clients[MAX_CLIENTS];
    int     client_count;
    int     epoll_fd;
    int     listen_fd;
    int     signal_fd;
    int     running;
} Daemon;

extern Daemon g;

#endif /* UMBRELLA_H */