1
1
#! /bin/bash
2
2
3
+ set -x # Print commands
4
+
5
+ log () {
6
+ echo " [$( date ' +%Y-%m-%d %H:%M:%S' ) ] $1 "
7
+ }
8
+
3
9
check_orioledb_enabled () {
4
10
local pg_conf=" /etc/postgresql/postgresql.conf"
5
11
if [ ! -f " $pg_conf " ]; then
@@ -26,7 +32,93 @@ update_orioledb_buffers() {
26
32
fi
27
33
}
28
34
35
+ check_extensions_file () {
36
+ local extensions_file=" /etc/adminapi/pg-extensions.json"
37
+ if [ ! -f " $extensions_file " ]; then
38
+ log " extensions: No extensions file found, skipping extensions versions check"
39
+ return 1
40
+ fi
41
+ if [ ! -r " $extensions_file " ]; then
42
+ log " extensions: Cannot read extensions file"
43
+ return 1
44
+ fi
45
+ return 0
46
+ }
47
+
48
+ switch_extension_version () {
49
+ local extension_name=" $1 "
50
+ local version=" $2 "
51
+
52
+ # Use BIN_PATH environment variable or default to /var/lib/postgresql/.nix-profile
53
+ : ${BIN_PATH:= " /var/lib/postgresql/.nix-profile" }
54
+
55
+ local switch_script=" $BIN_PATH /bin/switch_${extension_name} _version"
56
+
57
+ if [ ! -x " $switch_script " ]; then
58
+ log " $extension_name : No version switch script available at $switch_script , skipping"
59
+ return 0
60
+ fi
61
+
62
+ log " $extension_name : Switching to version $version "
63
+ # Run directly as root since we're already running as root
64
+ " $switch_script " " $version "
65
+ local exit_code=$?
66
+ if [ $exit_code -eq 0 ]; then
67
+ log " $extension_name : Version switch completed successfully"
68
+ else
69
+ log " $extension_name : Version switch failed with exit code $exit_code "
70
+ fi
71
+ return $exit_code
72
+ }
73
+
74
+ handle_extension_versions () {
75
+ if ! check_extensions_file; then
76
+ return
77
+ fi
78
+
79
+ local extensions_file=" /etc/adminapi/pg-extensions.json"
80
+
81
+ # Get all extension names from the JSON file
82
+ local extensions
83
+ extensions=$( jq -r ' keys[]' " $extensions_file " 2> /dev/null)
84
+
85
+ if [ -z " $extensions " ]; then
86
+ log " extensions: No extensions found in configuration"
87
+ return
88
+ fi
89
+
90
+ # Iterate through each extension
91
+ while IFS= read -r extension_name; do
92
+ # Get the version for this extension
93
+ local version
94
+ version=$( jq -r --arg ext " $extension_name " ' .[$ext] // empty' " $extensions_file " )
95
+
96
+ if [ -z " $version " ]; then
97
+ log " $extension_name : No version specified, skipping"
98
+ continue
99
+ fi
100
+
101
+ # Basic version format validation (semantic versioning)
102
+ if ! [[ " $version " =~ ^[0-9]+\. [0-9]+ (\. [0-9]+)? $ ]]; then
103
+ log " $extension_name : Invalid version format: $version , skipping"
104
+ continue
105
+ fi
106
+
107
+ log " $extension_name : Found version $version in extensions file"
108
+
109
+ # Don't fail if version switch fails - just log and continue
110
+ switch_extension_version " $extension_name " " $version " || log " $extension_name : Version switch failed but continuing"
111
+
112
+ done <<< " $extensions"
113
+ }
114
+
29
115
main () {
116
+ log " Starting prestart script"
117
+
118
+ # 1. Handle all extension versions from config file
119
+ handle_extension_versions
120
+
121
+ # 2. orioledb handling
30
122
local has_orioledb=$( check_orioledb_enabled)
31
123
if [ " $has_orioledb " -lt 1 ]; then
32
124
return 0
@@ -35,6 +127,8 @@ main() {
35
127
if [ ! -z " $shared_buffers_value " ]; then
36
128
update_orioledb_buffers " $shared_buffers_value "
37
129
fi
130
+
131
+ log " Prestart script completed"
38
132
}
39
133
40
134
# Initial locale setup
@@ -46,4 +140,4 @@ if [ $(locale -a | grep -c en_US.utf8) -eq 0 ]; then
46
140
locale-gen
47
141
fi
48
142
49
- main
143
+ main
0 commit comments