|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +# *** shell script for Solution Foundry to add an app *** |
| 4 | +# Step 1: install app's logo |
| 5 | +# Step 2: install template files (~.html files) |
| 6 | +# Step 3: install js files if there are js files in package folder |
| 7 | +# Step 4: install css files if there are css files in package folder |
| 8 | +# Step 5: install app's files (~.py files) |
| 9 | +# Step 6: add app to INSTALLED_APPS in settings.py |
| 10 | +# Step 7: include app's urls.py to project's urls.py |
| 11 | +# Step 8: sync GOC Portal Solution list to Service Portal |
| 12 | +# Step 9: database migrate |
| 13 | +# Step 10: chown to www-data for Service Portal Django project folder |
| 14 | +# (if exception happens in Step x, Step 1 ~ Step x-1 oprations will rollback) |
| 15 | +# *** end *** |
| 16 | + |
| 17 | +function error_exit |
| 18 | +{ |
| 19 | + echo "$1" 1>&2 |
| 20 | + exit 1 |
| 21 | +} |
| 22 | + |
| 23 | +# < get service name from argument and convert it to lowercase > |
| 24 | +# if [ -z "$1" ]; then |
| 25 | +# error_exit "Please input Service Name" |
| 26 | +# fi |
| 27 | +# SERVICE_NAME=$1 |
| 28 | +# LOWER_NAME=`echo $SERVICE_NAME | tr '[:upper:]' '[:lower:]'` |
| 29 | +SERVICE_NAME="IaaS" |
| 30 | +LOWER_NAME="iaas" |
| 31 | + |
| 32 | +# < get package root path from argument > |
| 33 | +# if [ -z "$2" ]; then |
| 34 | +# error_exit "Please input package's root path" |
| 35 | +# fi |
| 36 | +# PACKAGE_ROOT=$2 |
| 37 | +PACKAGE_ROOT=$1 |
| 38 | +if [ "${PACKAGE_ROOT: -1}" = "/" ]; then |
| 39 | + PACKAGE_ROOT="${PACKAGE_ROOT::-1}" |
| 40 | +fi |
| 41 | + |
| 42 | +# Service Portal folder path vars |
| 43 | +PROJECT_ROOT="/usr/share/sportal" |
| 44 | +STATIC_ROOT="${PROJECT_ROOT}/static" |
| 45 | +TEMPLATES_ROOT="${PROJECT_ROOT}/templates" |
| 46 | +APP_ROOT="${PROJECT_ROOT}/sportal" |
| 47 | +JS_ROOT="${STATIC_ROOT}/js" |
| 48 | +CSS_ROOT="${STATIC_ROOT}/css" |
| 49 | +IMG_ROOT="${STATIC_ROOT}/img" |
| 50 | + |
| 51 | +# < Step 1: service logo > |
| 52 | +IMG_PATH="${IMG_ROOT}/service_logo/${LOWER_NAME}" |
| 53 | +if [ -d "${IMG_PATH}" ]; then |
| 54 | + error_exit "${IMG_PATH} exists. Aborting..." |
| 55 | +else |
| 56 | + if [ "$(ls -A ${PACKAGE_ROOT}/img)" ]; then |
| 57 | + mkdir ${IMG_PATH} |
| 58 | + if cp -r ${PACKAGE_ROOT}/img/* ${IMG_PATH}; then |
| 59 | + echo "Service logo files have been installed" |
| 60 | + else |
| 61 | + # rollback |
| 62 | + rm -r ${IMG_PATH} |
| 63 | + error_exit "Install service logo files unsuccessfully. Aborting..." |
| 64 | + fi |
| 65 | + else |
| 66 | + error_exit "Cannot find service logo files. Aborting..." |
| 67 | + fi |
| 68 | +fi |
| 69 | + |
| 70 | +# < Step 2: template files (~.html) > |
| 71 | +TEMPLATES_PATH="${TEMPLATES_ROOT}/service/${LOWER_NAME}" |
| 72 | +if [ -d "${TEMPLATES_PATH}" ]; then |
| 73 | + # rollback |
| 74 | + rm -r ${IMG_PATH} |
| 75 | + error_exit "${TEMPLATES_PATH} exists. Aborting..." |
| 76 | +else |
| 77 | + if [ "$(ls -A ${PACKAGE_ROOT}/templates)" ]; then |
| 78 | + mkdir ${TEMPLATES_PATH} |
| 79 | + if cp -r ${PACKAGE_ROOT}/templates/* ${TEMPLATES_PATH}; then |
| 80 | + echo "Template files have been installed" |
| 81 | + else |
| 82 | + # rollback |
| 83 | + rm -r ${IMG_PATH} |
| 84 | + rm -r ${TEMPLATES_PATH} |
| 85 | + error_exit "Install template files unsuccessfully. Aborting..." |
| 86 | + fi |
| 87 | + else |
| 88 | + error_exit "Cannot find template files. Aborting..." |
| 89 | + fi |
| 90 | +fi |
| 91 | + |
| 92 | +# < Step 3: js files > |
| 93 | +JS_PATH="${JS_ROOT}/service/${LOWER_NAME}" |
| 94 | +if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 95 | + if [ -d "${JS_PATH}" ]; then |
| 96 | + # rollback |
| 97 | + rm -r ${IMG_PATH} |
| 98 | + rm -r ${TEMPLATES_PATH} |
| 99 | + error_exit "${JS_PATH} exists. Aborting..." |
| 100 | + else |
| 101 | + mkdir ${JS_PATH} |
| 102 | + if cp -r ${PACKAGE_ROOT}/js/* ${JS_PATH}; then |
| 103 | + echo "js files have been installed" |
| 104 | + else |
| 105 | + # rollback |
| 106 | + rm -r ${IMG_PATH} |
| 107 | + rm -r ${TEMPLATES_PATH} |
| 108 | + rm -r ${JS_PATH} |
| 109 | + error_exit "Install js files unsuccessfully. Aborting..." |
| 110 | + fi |
| 111 | + fi |
| 112 | +else |
| 113 | + echo "No need to install js files" |
| 114 | +fi |
| 115 | + |
| 116 | +# < Step 4: css files > |
| 117 | +CSS_PATH="${CSS_ROOT}/service/${LOWER_NAME}" |
| 118 | +if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 119 | + if [ -d "${CSS_PATH}" ]; then |
| 120 | + # rollback |
| 121 | + rm -r ${IMG_PATH} |
| 122 | + rm -r ${TEMPLATES_PATH} |
| 123 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 124 | + rm -r ${JS_PATH} |
| 125 | + fi |
| 126 | + error_exit "${CSS_PATH} exists. Aborting..." |
| 127 | + else |
| 128 | + mkdir ${CSS_PATH} |
| 129 | + if cp -r ${PACKAGE_ROOT}/css/* ${CSS_PATH}; then |
| 130 | + echo "css files have been installed" |
| 131 | + else |
| 132 | + # rollback |
| 133 | + rm -r ${IMG_PATH} |
| 134 | + rm -r ${TEMPLATES_PATH} |
| 135 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 136 | + rm -r ${JS_PATH} |
| 137 | + fi |
| 138 | + rm -r ${CSS_PATH} |
| 139 | + error_exit "Install css files unsuccessfully. Aborting..." |
| 140 | + fi |
| 141 | + fi |
| 142 | +else |
| 143 | + echo "No need to install css files" |
| 144 | +fi |
| 145 | + |
| 146 | +# < Step 5: app files (~.py) > |
| 147 | +APP_PATH="${APP_ROOT}/service/${LOWER_NAME}" |
| 148 | +if [ -d "${APP_PATH}" ]; then |
| 149 | + # rollback |
| 150 | + rm -r ${IMG_PATH} |
| 151 | + rm -r ${TEMPLATES_PATH} |
| 152 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 153 | + rm -r ${JS_PATH} |
| 154 | + fi |
| 155 | + if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 156 | + rm -r ${CSS_PATH} |
| 157 | + fi |
| 158 | + error_exit "${APP_PATH} exists. Aborting..." |
| 159 | +else |
| 160 | + if [ "$(ls -A ${PACKAGE_ROOT}/app)" ]; then |
| 161 | + mkdir ${APP_PATH} |
| 162 | + if cp -r ${PACKAGE_ROOT}/app/* ${APP_PATH}; then |
| 163 | + echo "app files have been installed" |
| 164 | + else |
| 165 | + # rollback |
| 166 | + rm -r ${IMG_PATH} |
| 167 | + rm -r ${TEMPLATES_PATH} |
| 168 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 169 | + rm -r ${JS_PATH} |
| 170 | + fi |
| 171 | + if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 172 | + rm -r ${CSS_PATH} |
| 173 | + fi |
| 174 | + rm -r ${APP_PATH} |
| 175 | + error_exit "Install app files unsuccessfully. Aborting..." |
| 176 | + fi |
| 177 | + else |
| 178 | + error_exit "Cannot find app files. Aborting..." |
| 179 | + fi |
| 180 | +fi |
| 181 | + |
| 182 | +# < Step 6: add app to settings.py > |
| 183 | +SETTINGS_PATH="${APP_ROOT}/settings.py" |
| 184 | +NEW_INSTALLED_APPS_TEXT="'sportal.service.$LOWER_NAME'" |
| 185 | +if sed -i "/INSTALLED_APPS/a \ \ \ \ ${NEW_INSTALLED_APPS_TEXT}," ${SETTINGS_PATH}; then |
| 186 | + echo "add app to INSTALLED_APPS successfully" |
| 187 | +else |
| 188 | + # rollback |
| 189 | + rm -r ${IMG_PATH} |
| 190 | + rm -r ${TEMPLATES_PATH} |
| 191 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 192 | + rm -r ${JS_PATH} |
| 193 | + fi |
| 194 | + if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 195 | + rm -r ${CSS_PATH} |
| 196 | + fi |
| 197 | + rm -r ${APP_PATH} |
| 198 | + error_exit "Add app to INSTALLED_APPS unsuccessfully. Aborting..." |
| 199 | +fi |
| 200 | + |
| 201 | +# < Step 7: include app's urlpatterns to urls.py > |
| 202 | +URLS_PATH="${APP_ROOT}/urls.py" |
| 203 | +IMPORT_URLS_FILE_TEXT="from service.${LOWER_NAME} import urls as ${LOWER_NAME}_urls" |
| 204 | +INCLUDE_URLPATTERNS_TEXT="url(r'^${LOWER_NAME}/', include(${LOWER_NAME}_urls.urlpatterns), kwargs={'service_name': '${SERVICE_NAME}'})" |
| 205 | +if sed -i "/from sportal.service import views as service_views/a ${IMPORT_URLS_FILE_TEXT}" ${URLS_PATH}; then |
| 206 | + echo "Import urls file successfully" |
| 207 | + if sed -i "/# services/a \ \ \ \ ${INCLUDE_URLPATTERNS_TEXT}," ${URLS_PATH}; then |
| 208 | + echo "Include url patterns successfully" |
| 209 | + else |
| 210 | + # rollback |
| 211 | + rm -r ${IMG_PATH} |
| 212 | + rm -r ${TEMPLATES_PATH} |
| 213 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 214 | + rm -r ${JS_PATH} |
| 215 | + fi |
| 216 | + if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 217 | + rm -r ${CSS_PATH} |
| 218 | + fi |
| 219 | + rm -r ${APP_PATH} |
| 220 | + sed -i "/${NEW_INSTALLED_APPS_TEXT}/d" ${SETTINGS_PATH} |
| 221 | + sed -i "/${IMPORT_URLS_FILE_TEXT}/d" ${URLS_PATH} |
| 222 | + error_exit "Include url patterns unsuccessfully. Aborting..." |
| 223 | + fi |
| 224 | +else |
| 225 | + # rollback |
| 226 | + rm -r ${IMG_PATH} |
| 227 | + rm -r ${TEMPLATES_PATH} |
| 228 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 229 | + rm -r ${JS_PATH} |
| 230 | + fi |
| 231 | + if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 232 | + rm -r ${CSS_PATH} |
| 233 | + fi |
| 234 | + rm -r ${APP_PATH} |
| 235 | + sed -i "/${NEW_INSTALLED_APPS_TEXT}/d" ${SETTINGS_PATH} |
| 236 | + error_exit "Import service urls unsuccessfully. Aborting..." |
| 237 | +fi |
| 238 | + |
| 239 | +# < Step 8: sync GOC Portal Solutions to Service Portal > |
| 240 | +cd ${PROJECT_ROOT} |
| 241 | +if python -c 'import init_util; init_util.sync_admin_role_user_service()'; then |
| 242 | + echo "Sync GOC Portal Solution list successfully" |
| 243 | +else |
| 244 | + # rollback |
| 245 | + rm -r ${IMG_PATH} |
| 246 | + rm -r ${TEMPLATES_PATH} |
| 247 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 248 | + rm -r ${JS_PATH} |
| 249 | + fi |
| 250 | + if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 251 | + rm -r ${CSS_PATH} |
| 252 | + fi |
| 253 | + rm -r ${APP_PATH} |
| 254 | + sed -i "/${NEW_INSTALLED_APPS_TEXT}/d" ${SETTINGS_PATH} |
| 255 | + sed -i "/${IMPORT_URLS_FILE_TEXT}/d" ${URLS_PATH} |
| 256 | + sed -i "/${INCLUDE_URLPATTERNS_TEXT}/d" ${URLS_PATH} |
| 257 | + error_exit "Sync GOC Portal Solution list unsuccessfully" |
| 258 | +fi |
| 259 | + |
| 260 | +# < Step 9: database migration > |
| 261 | +if python ${PROJECT_ROOT}/manage.py migrate; then |
| 262 | + echo "Database migrate successfully" |
| 263 | +else |
| 264 | + # rollback |
| 265 | + rm -r ${IMG_PATH} |
| 266 | + rm -r ${TEMPLATES_PATH} |
| 267 | + if [ "$(ls -A ${PACKAGE_ROOT}/js)" ]; then |
| 268 | + rm -r ${JS_PATH} |
| 269 | + fi |
| 270 | + if [ "$(ls -A ${PACKAGE_ROOT}/css)" ]; then |
| 271 | + rm -r ${CSS_PATH} |
| 272 | + fi |
| 273 | + rm -r ${APP_PATH} |
| 274 | + sed -i "/${NEW_INSTALLED_APPS_TEXT}/d" ${SETTINGS_PATH} |
| 275 | + sed -i "/${IMPORT_URLS_FILE_TEXT}/d" ${URLS_PATH} |
| 276 | + sed -i "/${INCLUDE_URLPATTERNS_TEXT}/d" ${URLS_PATH} |
| 277 | + error_exit "Database migrate unsuccessfully. Aborting..." |
| 278 | +fi |
| 279 | + |
| 280 | +# < Step 10: chown to www-data for Service Portal Django project folder > |
| 281 | +chown -R www-data:www-data ${PROJECT_ROOT} |
| 282 | + |
| 283 | +echo "Done" |
0 commit comments