1 #ifndef CFENGINE_DB_STRUCTS_H
2 #define CFENGINE_DB_STRUCTS_H
3 
4 // All structs needed for cf-check pretty printing
5 // Structs from libutils are included normally via headers
6 // Structs from libpromises are duplicated; cf-check doesn't use libpromises
7 
8 #include <statistics.h>
9 // typedef struct
10 // {
11 //     double q;
12 //     double expect;
13 //     double var;
14 //     double dq;
15 // } QPoint;
16 
17 // Struct used for quality entries in /var/cfengine/state/cf_lastseen.lmdb:
18 typedef struct
19 {
20     time_t lastseen;
21     QPoint Q;
22 } KeyHostSeen; // Keep in sync with lastseen.h
23 
24 // Struct used for lock entries in /var/cfengine/state/cf_lock.lmdb:
25 typedef struct
26 {
27     pid_t pid;
28     time_t time;
29     time_t process_start_time;
30 } LockData; // Keep in sync with cf3.defs.h
31 
32 #define OBSERVABLES_APPLY(apply_macro) \
33     apply_macro(users)                 \
34     apply_macro(rootprocs)             \
35     apply_macro(otherprocs)            \
36     apply_macro(diskfree)              \
37     apply_macro(loadavg)               \
38     apply_macro(netbiosns_in)          \
39     apply_macro(netbiosns_out)         \
40     apply_macro(netbiosdgm_in)         \
41     apply_macro(netbiosdgm_out)        \
42     apply_macro(netbiosssn_in)         \
43     apply_macro(netbiosssn_out)        \
44     apply_macro(imap_in)               \
45     apply_macro(imap_out)              \
46     apply_macro(cfengine_in)           \
47     apply_macro(cfengine_out)          \
48     apply_macro(nfsd_in)               \
49     apply_macro(nfsd_out)              \
50     apply_macro(smtp_in)               \
51     apply_macro(smtp_out)              \
52     apply_macro(www_in)                \
53     apply_macro(www_out)               \
54     apply_macro(ftp_in)                \
55     apply_macro(ftp_out)               \
56     apply_macro(ssh_in)                \
57     apply_macro(ssh_out)               \
58     apply_macro(wwws_in)               \
59     apply_macro(wwws_out)              \
60     apply_macro(icmp_in)               \
61     apply_macro(icmp_out)              \
62     apply_macro(udp_in)                \
63     apply_macro(udp_out)               \
64     apply_macro(dns_in)                \
65     apply_macro(dns_out)               \
66     apply_macro(tcpsyn_in)             \
67     apply_macro(tcpsyn_out)            \
68     apply_macro(tcpack_in)             \
69     apply_macro(tcpack_out)            \
70     apply_macro(tcpfin_in)             \
71     apply_macro(tcpfin_out)            \
72     apply_macro(tcpmisc_in)            \
73     apply_macro(tcpmisc_out)           \
74     apply_macro(webaccess)             \
75     apply_macro(weberrors)             \
76     apply_macro(syslog)                \
77     apply_macro(messages)              \
78     apply_macro(temp0)                 \
79     apply_macro(temp1)                 \
80     apply_macro(temp2)                 \
81     apply_macro(temp3)                 \
82     apply_macro(cpuall)                \
83     apply_macro(cpu0)                  \
84     apply_macro(cpu1)                  \
85     apply_macro(cpu2)                  \
86     apply_macro(cpu3)                  \
87     apply_macro(microsoft_ds_in)       \
88     apply_macro(microsoft_ds_out)      \
89     apply_macro(www_alt_in)            \
90     apply_macro(www_alt_out)           \
91     apply_macro(imaps_in)              \
92     apply_macro(imaps_out)             \
93     apply_macro(ldap_in)               \
94     apply_macro(ldap_out)              \
95     apply_macro(ldaps_in)              \
96     apply_macro(ldaps_out)             \
97     apply_macro(mongo_in)              \
98     apply_macro(mongo_out)             \
99     apply_macro(mysql_in)              \
100     apply_macro(mysql_out)             \
101     apply_macro(postgresql_in)         \
102     apply_macro(postgresql_out)        \
103     apply_macro(ipp_in)                \
104     apply_macro(ipp_out)               \
105     apply_macro(spare)
106 
107 // Macros to apply to each element:
108 
109 // Double # useful for creating an identifier, expands to ob_postgresql_in,
110 #define GENERATE_OB_ENUM(OB_NAME) ob_##OB_NAME,
111 // Single # useful for creating string literals, expands to: "postgresql_in",
112 #define GENERATE_OB_STRING(OB_NAME) #OB_NAME,
113 
114 // Use apply macro to generate enum and string array
115 
116 typedef enum Observable
117 {
118     OBSERVABLES_APPLY(GENERATE_OB_ENUM) observables_max
119 } Observable;
120 
121 static const char *const observable_strings[] =
122 {
123     OBSERVABLES_APPLY(GENERATE_OB_STRING) NULL
124 };
125 
126 // Not the actual count, just the room we set aside in struct (and LMDB):
127 #define CF_OBSERVABLES 100
128 
129 typedef struct Averages
130 {
131     time_t last_seen;
132     QPoint Q[CF_OBSERVABLES];
133 } Averages; // Keep in sync with cf3.defs.h
134 
135 typedef enum
136 {
137     CONTEXT_STATE_POLICY_RESET,                    /* Policy when trying to add already defined persistent states */
138     CONTEXT_STATE_POLICY_PRESERVE
139 } PersistentClassPolicy; // Keep in sync with cf3.defs.h
140 
141 typedef struct
142 {
143     unsigned int expires;
144     PersistentClassPolicy policy;
145     char tags[]; // variable length, must be zero terminated
146 } PersistentClassInfo; // Keep in sync with cf3.defs.h
147 // Note that tags array does not increase the sizeof() this struct
148 // It allows us to index bytes after the policy variable (plus padding)
149 // As far as C is concerned, tags can be zero length,
150 // we do however require that it is at least 1 (NUL) byte
151 
152 #endif
153