11#! /bin/bash
22
3+ set -x # Print commands
4+
5+ log () {
6+ echo " [$( date ' +%Y-%m-%d %H:%M:%S' ) ] $1 "
7+ }
8+
39check_orioledb_enabled () {
410 local pg_conf=" /etc/postgresql/postgresql.conf"
511 if [ ! -f " $pg_conf " ]; then
@@ -26,7 +32,93 @@ update_orioledb_buffers() {
2632 fi
2733}
2834
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+
29115main () {
116+ log " Starting prestart script"
117+
118+ # 1. Handle all extension versions from config file
119+ handle_extension_versions
120+
121+ # 2. orioledb handling
30122 local has_orioledb=$( check_orioledb_enabled)
31123 if [ " $has_orioledb " -lt 1 ]; then
32124 return 0
@@ -35,6 +127,8 @@ main() {
35127 if [ ! -z " $shared_buffers_value " ]; then
36128 update_orioledb_buffers " $shared_buffers_value "
37129 fi
130+
131+ log " Prestart script completed"
38132}
39133
40134# Initial locale setup
@@ -46,4 +140,4 @@ if [ $(locale -a | grep -c en_US.utf8) -eq 0 ]; then
46140 locale-gen
47141fi
48142
49- main
143+ main
0 commit comments