summaryrefslogtreecommitdiffstats
path: root/schema/pgsql.schema.sql
blob: 1d93ef3da4562c942c884faa67ec846cb502fba8 (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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
CREATE DOMAIN uint2 AS int4
    CHECK(VALUE >= 0 AND VALUE < 65536);
CREATE DOMAIN biguint AS bigint CONSTRAINT positive CHECK ( VALUE IS NULL OR 0 <= VALUE );
CREATE TYPE boolenum AS ENUM ('n', 'y');
CREATE TYPE certificate_version AS ENUM('1','2','3');
CREATE TYPE dn_type AS ENUM('issuer','subject');
CREATE TYPE pubkey_algo AS ENUM('unknown','RSA','DSA','DH','EC');

-- Used when sorting certificates by expiration date.
CREATE OR REPLACE FUNCTION UNIX_TIMESTAMP(datetime timestamptz DEFAULT NOW())
    RETURNS biguint
    LANGUAGE plpgsql
    PARALLEL SAFE
    AS $$
BEGIN
    RETURN EXTRACT(EPOCH FROM datetime);
END;
$$;

-- IPL ORM renders SQL queries with LIKE operators for all suggestions in the search bar,
-- which fails for numeric and enum types on PostgreSQL. Just like in Icinga DB Web.
CREATE OR REPLACE FUNCTION anynonarrayliketext(anynonarray, text)
  RETURNS bool
  LANGUAGE plpgsql
  IMMUTABLE
  PARALLEL SAFE
  AS $$
BEGIN
    RETURN $1::TEXT LIKE $2;
END;
$$;
CREATE OPERATOR ~~ (LEFTARG=anynonarray, RIGHTARG=text, PROCEDURE=anynonarrayliketext);

CREATE TABLE x509_certificate (
  id serial PRIMARY KEY,
  subject varchar(255) NOT NULL,
  subject_hash bytea NOT NULL,
  issuer varchar(255) NOT NULL,
  issuer_hash bytea NOT NULL,
  issuer_certificate_id int DEFAULT NULL,
  version certificate_version NOT NULL,
  self_signed boolenum NOT NULL DEFAULT 'n',
  ca boolenum NOT NULL,
  trusted boolenum NOT NULL DEFAULT 'n',
  pubkey_algo pubkey_algo NOT NULL,
  pubkey_bits uint2 NOT NULL,
  signature_algo varchar(255) NOT NULL,
  signature_hash_algo varchar(255) NOT NULL,
  valid_from biguint NOT NULL,
  valid_to biguint NOT NULL,
  fingerprint bytea NOT NULL,
  serial bytea NOT NULL,
  certificate bytea NOT NULL,
  ctime biguint NOT NULL,
  mtime biguint DEFAULT NULL,
  CONSTRAINT x509_idx_certificate_fingerprint UNIQUE(fingerprint),
  CONSTRAINT x509_fk_certificate_issuer_certificate_id FOREIGN KEY (issuer_certificate_id) REFERENCES x509_certificate (id) ON DELETE SET NULL ON UPDATE CASCADE
);

CREATE TABLE x509_certificate_chain (
  id serial PRIMARY KEY,
  target_id int NOT NULL,
  length uint2 NOT NULL,
  valid boolenum NOT NULL DEFAULT 'n',
  invalid_reason varchar(255) NULL DEFAULT NULL,
  ctime biguint NOT NULL
);

CREATE TABLE x509_certificate_chain_link (
  certificate_chain_id int NOT NULL,
  certificate_id int NOT NULL,
  "order" uint2 NOT NULL,
  ctime biguint NOT NULL,
  PRIMARY KEY(certificate_chain_id,certificate_id,"order"),
  CONSTRAINT x509_fk_certificate_chain_link_certificate_chain_id FOREIGN KEY (certificate_chain_id) REFERENCES x509_certificate_chain (id) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT x509_fk_certificate_chain_link_certificate_id FOREIGN KEY (certificate_id) REFERENCES x509_certificate (id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE x509_certificate_subject_alt_name (
  certificate_id int NOT NULL,
  hash bytea NOT NULL,
  type varchar(255) NOT NULL,
  value varchar(255) NOT NULL,
  ctime biguint NOT NULL,
  PRIMARY KEY (certificate_id,hash),
  CONSTRAINT x509_fk_certificate_subject_alt_name_certificate_id FOREIGN KEY (certificate_id) REFERENCES x509_certificate (id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE TABLE x509_dn (
  hash bytea NOT NULL,
  type dn_type NOT NULL,
  "order" uint2 NOT NULL,
  key varchar(255) NOT NULL,
  value varchar(255) NOT NULL,
  ctime biguint NOT NULL,
  PRIMARY KEY (hash,type,"order")
);

CREATE TABLE x509_target (
  id serial PRIMARY KEY,
  ip bytea NOT NULL,
  port uint2 NOT NULL,
  hostname varchar(255) NULL DEFAULT NULL,
  latest_certificate_chain_id int NULL DEFAULT NULL,
  last_scan biguint NOT NULL,
  ctime biguint NOT NULL,
  mtime biguint DEFAULT NULL
);

CREATE INDEX x509_idx_target ON x509_target (ip,port,hostname);

CREATE TABLE x509_job (
  id serial PRIMARY KEY,
  name varchar(255) NOT NULL,
  author varchar(255) NOT NULL,
  cidrs text NOT NULL,
  ports text NOT NULL,
  exclude_targets text DEFAULT NULL,
  ctime bigint NOT NULL,
  mtime bigint NOT NULL,

  UNIQUE (name)
);

CREATE TABLE x509_schedule (
  id serial PRIMARY KEY,
  job_id int NOT NULL,
  name varchar(255) NOT NULL,
  author varchar(255) NOT NULL,
  config text NOT NULL, -- json
  ctime bigint NOT NULL,
  mtime bigint NOT NULL,

  CONSTRAINT fk_x509_schedule_job FOREIGN KEY (job_id) REFERENCES x509_job (id) ON DELETE CASCADE
);

CREATE TABLE x509_job_run (
  id serial PRIMARY KEY,
  job_id int NOT NULL,
  schedule_id int DEFAULT NULL,
  total_targets int NOT NULL,
  finished_targets int NOT NULL,
  start_time biguint NULL DEFAULT NULL,
  end_time biguint NULL DEFAULT NULL,

  CONSTRAINT fk_x509_job_run_job FOREIGN KEY (job_id) REFERENCES x509_job (id) ON DELETE CASCADE,
  CONSTRAINT fk_x509_job_run_schedule FOREIGN KEY (schedule_id) REFERENCES x509_schedule (id) ON DELETE CASCADE
);

CREATE TABLE x509_schema (
  id serial,
  version varchar(64) NOT NULL,
  timestamp bigint NOT NULL,
  success boolenum DEFAULT NULL,
  reason text DEFAULT NULL,

  CONSTRAINT pk_x509_schema PRIMARY KEY (id),
  CONSTRAINT idx_x509_schema_version UNIQUE (version)
);

INSERT INTO x509_schema (version, timestamp, success)
  VALUES ('1.3.0', UNIX_TIMESTAMP() * 1000, 'y');