@@ -54,13 +54,20 @@ RESTORE_DIRECTORY=$PGMONETA_OPERATION_DIR/restore
5454BACKUP_DIRECTORY=$PGMONETA_OPERATION_DIR /backup
5555CONFIGURATION_DIRECTORY=$PGMONETA_OPERATION_DIR /conf
5656
57+ PSQL_USER=$USER
58+ if [ " $OS " = " FreeBSD" ]; then
59+ PSQL_USER=postgres
60+ fi
61+
5762# ########################## UTILS ############################
5863is_port_in_use () {
5964 local port=$1
6065 if [[ " $OS " == " Linux" ]]; then
6166 ss -tuln | grep $port > /dev/null 2>&1
6267 elif [[ " $OS " == " Darwin" ]]; then
6368 lsof -i:$port > /dev/null 2>&1
69+ elif [[ " $OS " == " FreeBSD" ]]; then
70+ sockstat -4 -l | grep $port > /dev/null 2>&1
6471 fi
6572 return $?
6673}
@@ -97,10 +104,10 @@ wait_for_server_ready() {
97104}
98105
99106function sed_i() {
100- if [[ " $OS " == " Darwin" ]]; then
101- sed -i ' ' " $@ "
107+ if [[ " $OS " == " Darwin" || " $OS " == " FreeBSD " ]]; then
108+ sed -i ' ' -E " $@ "
102109 else
103- sed -i " $@ "
110+ sed -i -E " $@ "
104111 fi
105112}
106113
@@ -127,6 +134,22 @@ check_pg_ctl() {
127134 fi
128135}
129136
137+ stop_pgctl (){
138+ if [[ " $OS " == " FreeBSD" ]]; then
139+ su - postgres -c " $PGCTL_PATH -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop"
140+ else
141+ pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
142+ fi
143+ }
144+
145+ run_as_postgres () {
146+ if [[ " $OS " == " FreeBSD" ]]; then
147+ su - postgres -c " $* "
148+ else
149+ eval " $@ "
150+ fi
151+ }
152+
130153check_psql () {
131154 if which psql > /dev/null 2>&1 ; then
132155 echo " check psql in path ... ok"
@@ -188,9 +211,39 @@ initialize_log_files() {
188211create_cluster () {
189212 local port=$1
190213 echo -e " \e[34mInitializing Cluster \e[0m"
191- initdb -k -D $DATA_DIRECTORY 2> /dev/null
214+
215+ if [ " $OS " = " FreeBSD" ]; then
216+ mkdir -p " $POSTGRES_OPERATION_DIR "
217+ mkdir -p " $DATA_DIRECTORY "
218+ mkdir -p $BACKUP_DIRECTORY
219+ if ! pw user show postgres > /dev/null 2>&1 ; then
220+ pw groupadd -n postgres -g 770
221+ pw useradd -n postgres -u 770 -g postgres -d /var/db/postgres -s /bin/sh
222+ fi
223+ chown postgres:postgres $PGCTL_LOG_FILE
224+ chown -R postgres:postgres " $DATA_DIRECTORY "
225+ chown -R postgres:postgres $CONFIGURATION_DIRECTORY
226+ chown -R postgres:postgres $PGMONETA_LOG_FILE
227+ chown -R postgres:postgres $BACKUP_DIRECTORY
228+
229+ fi
230+
231+ echo $DATA_DIRECTORY
232+
233+ INITDB_PATH=$( command -v initdb)
234+
235+ if [ -z " $INITDB_PATH " ]; then
236+ echo " Error: initdb not found!" >&2
237+ exit 1
238+ fi
239+ run_as_postgres " $INITDB_PATH -k -D $DATA_DIRECTORY "
240+ echo " initdb exit code: $? "
241+ echo " initialize database ... ok"
192242 set +e
193- error_out=$( sed_i " s/^#\s*password_encryption\s*=\s*\(md5\|scram-sha-256\)/password_encryption = scram-sha-256/" $DATA_DIRECTORY /postgresql.conf 2>&1 )
243+ echo " setting postgresql.conf"
244+
245+ error_out=$( sed_i " s/^#[[:space:]]*password_encryption[[:space:]]*=[[:space:]]*(md5|scram-sha-256)/password_encryption = scram-sha-256/" " $DATA_DIRECTORY /postgresql.conf" 2>&1 )
246+
194247 if [ $? -ne 0 ]; then
195248 echo " setting password_encryption ... $error_out "
196249 clean
@@ -310,7 +363,12 @@ initialize_hba_configuration() {
310363initialize_cluster () {
311364 echo -e " \e[34mInitializing Cluster \e[0m"
312365 set +e
313- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start
366+ PGCTL_PATH=$( command -v pg_ctl)
367+ if [ -z " $PGCTL_PATH " ]; then
368+ echo " Error: pg_ctl not found!" >&2
369+ exit 1
370+ fi
371+ run_as_postgres " $PGCTL_PATH -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start"
314372 if [ $? -ne 0 ]; then
315373 clean
316374 exit 1
@@ -323,44 +381,44 @@ initialize_cluster() {
323381 clean
324382 exit 1
325383 fi
326- err_out=$( psql -h /tmp -p $PORT -U $USER -d postgres -c " CREATE ROLE repl WITH LOGIN REPLICATION PASSWORD '$PGPASSWORD ';" 2>&1 )
384+ err_out=$( psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c " CREATE ROLE repl WITH LOGIN REPLICATION PASSWORD '$PGPASSWORD ';" 2>&1 )
327385 if [ $? -ne 0 ]; then
328386 echo " create role repl ... $err_out "
329- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
387+ stop_pgctl
330388 clean
331389 exit 1
332390 else
333391 echo " create role repl ... ok"
334392 fi
335- err_out=$( psql -h /tmp -p $PORT -U $USER -d postgres -c " SELECT pg_create_physical_replication_slot('repl', true, false);" 2>&1 )
393+ err_out=$( psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c " SELECT pg_create_physical_replication_slot('repl', true, false);" 2>&1 )
336394 if [ $? -ne 0 ]; then
337395 echo " create replication slot for repl ... $err_out "
338- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
396+ stop_pgctl
339397 clean
340398 exit 1
341399 else
342400 echo " create replication slot for repl ... ok"
343401 fi
344- err_out=$( psql -h /tmp -p $PORT -U $USER -d postgres -c " CREATE USER myuser WITH PASSWORD '$PGPASSWORD ';" 2>&1 )
402+ err_out=$( psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c " CREATE USER myuser WITH PASSWORD '$PGPASSWORD ';" 2>&1 )
345403 if [ $? -ne 0 ]; then
346404 echo " create user myuser ... $err_out "
347- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
405+ stop_pgctl
348406 clean
349407 exit 1
350408 else
351409 echo " create user myuser ... ok"
352410 fi
353- err_out=$( psql -h /tmp -p $PORT -U $USER -d postgres -c " CREATE DATABASE mydb WITH OWNER myuser ENCODING 'UTF8';" 2>&1 )
411+ err_out=$( psql -h /tmp -p $PORT -U $PSQL_USER -d postgres -c " CREATE DATABASE mydb WITH OWNER myuser ENCODING 'UTF8';" 2>&1 )
354412 if [ $? -ne 0 ]; then
355413 echo " create database mydb with owner myuser ... $err_out "
356- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
414+ stop_pgctl
357415 clean
358416 exit 1
359417 else
360418 echo " create database mydb with owner myuser ... ok"
361419 fi
362420 set -e
363- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
421+ stop_pgctl
364422 echo " "
365423}
366424
@@ -425,54 +483,54 @@ user = repl
425483wal_slot = repl
426484EOF
427485 echo " add test configuration to pgmoneta.conf ... ok"
428- $EXECUTABLE_DIRECTORY /pgmoneta-admin master-key -P $PGPASSWORD || true
429- $EXECUTABLE_DIRECTORY /pgmoneta-admin -f $CONFIGURATION_DIRECTORY /pgmoneta_users.conf -U repl -P $PGPASSWORD user add
486+ run_as_postgres " $EXECUTABLE_DIRECTORY /pgmoneta-admin -f $CONFIGURATION_DIRECTORY /pgmoneta_users.conf -U repl -P $PGPASSWORD user add"
430487 echo " add user repl to pgmoneta_users.conf file ... ok"
431488 echo " "
432489}
433490
434491execute_testcases () {
435492 echo -e " \e[34mExecute Testcases \e[0m"
436493 set +e
437- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start
494+ run_as_postgres " pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE start"
438495 pg_isready -h localhost -p $PORT
439496 if [ $? -eq 0 ]; then
440497 echo " postgres server accepting requests ... ok"
441498 else
442499 echo " postgres server is not accepting response ... not ok"
443- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
500+ stop_pgctl
444501 clean
445502 exit 1
446503 fi
447504 echo " starting pgmoneta server in daemon mode"
448- $EXECUTABLE_DIRECTORY /pgmoneta -c $CONFIGURATION_DIRECTORY /pgmoneta.conf -u $CONFIGURATION_DIRECTORY /pgmoneta_users.conf -d
505+ run_as_postgres " $EXECUTABLE_DIRECTORY /pgmoneta -c $CONFIGURATION_DIRECTORY /pgmoneta.conf -u $CONFIGURATION_DIRECTORY /pgmoneta_users.conf -d"
449506 wait_for_server_ready
450507 if [ $? -ne 0 ]; then
451- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
508+ echo " pgmoneta server not ready ... not ok"
509+ stop_pgctl
452510 clean
453511 exit 1
454512 fi
455- $EXECUTABLE_DIRECTORY /pgmoneta-cli -c $CONFIGURATION_DIRECTORY /pgmoneta.conf ping
513+ run_as_postgres " $EXECUTABLE_DIRECTORY /pgmoneta-cli -c $CONFIGURATION_DIRECTORY /pgmoneta.conf ping"
456514 if [ $? -eq 0 ]; then
457515 echo " pgmoneta server started ... ok"
458516 else
459517 echo " pgmoneta server not started ... not ok"
460- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
518+ stop_pgctl
461519 clean
462520 exit 1
463521 fi
464522 # ## RUN TESTCASES ###
465523 $TEST_DIRECTORY /pgmoneta_test $PROJECT_DIRECTORY
466524 if [ $? -ne 0 ]; then
467- $EXECUTABLE_DIRECTORY /pgmoneta-cli -c $CONFIGURATION_DIRECTORY /pgmoneta.conf shutdown
468- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
525+ run_as_postgres " $EXECUTABLE_DIRECTORY /pgmoneta-cli -c $CONFIGURATION_DIRECTORY /pgmoneta.conf shutdown"
526+ stop_pgctl
469527 clean
470528 exit 1
471529 fi
472530 echo " running shutdown cli command"
473- $EXECUTABLE_DIRECTORY /pgmoneta-cli -c $CONFIGURATION_DIRECTORY /pgmoneta.conf shutdown
531+ run_as_postgres " $EXECUTABLE_DIRECTORY /pgmoneta-cli -c $CONFIGURATION_DIRECTORY /pgmoneta.conf shutdown"
474532 echo " shutdown pgmoneta server ... ok"
475- pg_ctl -D $DATA_DIRECTORY -l $PGCTL_LOG_FILE stop
533+ stop_pgctl
476534 set -e
477535 echo " "
478536}
0 commit comments