clean_database.sh 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #!/bin/bash
  2. # Call this script to create a fresh database, ready for development
  3. # (also creates structure).
  4. # It can also delete any existing one (will ask before).
  5. #
  6. # $ data/scripts/clean_database.sh <db-name> [<db-user>]
  7. #
  8. # The database user is optional. If you want to use an existing one,
  9. # be aware that they might require privileges to access your new db.
  10. # save the current directory
  11. MAIN_DIR=$(pwd)
  12. # function for checking database existence
  13. function is_database() {
  14. sudo -i -u postgres psql -lqt | cut -d \| -f 1 | grep -wq $1
  15. }
  16. # check if the user exists
  17. function is_user() {
  18. if sudo -i -u postgres psql -tAc "SELECT 1 FROM pg_roles WHERE rolname='$1'" | grep -q 1; then
  19. echo "User $1 is already available."
  20. return 0 # success (user exists)
  21. else
  22. echo "User $1 is not created before."
  23. return 1 # failure (user does not exist)
  24. fi
  25. }
  26. # create a new user
  27. function create_user() {
  28. echo "Creating database user ..."
  29. read -s -p "Enter password for new user: " password
  30. echo ""
  31. read -s -p "Confirm password for new user: " password_confirm
  32. echo ""
  33. if [ "$password" != "$password_confirm" ]; then
  34. echo "Error: Passwords do not match. Exiting..."
  35. return 1
  36. fi
  37. sudo -i -u postgres psql -c "CREATE USER $1 WITH PASSWORD '$password'"
  38. }
  39. # function to give the required privileges to the newly created user
  40. function grant_privileges(){
  41. echo "Connect $2 to $1 "
  42. sudo -i -u postgres psql -c "GRANT CONNECT ON DATABASE $1 TO $2"
  43. echo "Grant required privileges"
  44. sudo -i -u postgres psql -c "GRANT USAGE, SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO $2"
  45. }
  46. # function for creating a new database
  47. function create_database() {
  48. echo "Creating a new database ..."
  49. if sudo -i -u postgres createdb -U postgres $1; then
  50. echo "$1 database is created"
  51. else
  52. echo "$1 database cannot be created"
  53. return 1
  54. fi
  55. if [[ -n "$2" ]];
  56. then
  57. # check if the user already exists
  58. if is_user $2
  59. then
  60. # give the required permissions to the user
  61. grant_privileges $1 $2
  62. else
  63. # if a user is created, then grant the required privileges
  64. if ! create_user $2
  65. then
  66. return 1
  67. else
  68. grant_privileges $1 $2
  69. fi
  70. fi
  71. fi
  72. echo "Creating cube extension in $1 ..."
  73. sudo -i -u postgres psql -c "\c $1" -c "CREATE EXTENSION cube;"
  74. echo "Creating earthdistance extension in $1 ..."
  75. sudo -i -u postgres psql -c "\c $1" -c "CREATE EXTENSION earthdistance;"
  76. echo "Updating database structure ..."
  77. flexmeasures db upgrade
  78. }
  79. # function for deleting the old database
  80. function delete_database() {
  81. echo "Dropping database ..."
  82. if sudo -i -u postgres dropdb -U postgres $1; then
  83. echo "$1 database is dropped"
  84. return 0
  85. else
  86. echo "$1 database cannot be dropped"
  87. return 1
  88. fi
  89. }
  90. # Check if the database name is provided
  91. if [ -z "$1" ]; then
  92. echo "Error: db_name is required. Please provide a value for db_name, e.g., make clean-db db_name=flexmeasures-db [db_user=flexmeasures]"
  93. exit 1
  94. fi
  95. # Check if the database exists
  96. if is_database $1
  97. then
  98. echo "$1 database exists"
  99. read -r -p "Make a backup first? [y/N] " response
  100. response=$(tr '[:upper:]' '[:lower:]' <<< $response) # make lowercase
  101. if [[ "$response" =~ ^(yes|y)$ ]]; then
  102. echo "Making db dump ..."
  103. flexmeasures db-ops dump
  104. fi
  105. read -r -p "This will drop your database and re-create a clean one. Continue?[y/N] " response
  106. response=$(tr '[:upper:]' '[:lower:]' <<< $response) # make lowercase
  107. if [[ "$response" =~ ^(yes|y)$ ]]; then
  108. if ! delete_database $1; then
  109. exit 1
  110. fi
  111. if ! create_database $1 $2; then
  112. exit 1
  113. fi
  114. fi
  115. # otherwise, create a fresh database
  116. else
  117. echo "$1 database does not exist"
  118. if ! create_database $1 $2; then
  119. exit 1
  120. fi
  121. fi