Index

joshstock.in / 71dd216

Source for serving and static templating/compiling of https://joshstock.in.

Latest Commit

{#}TimeHashSubjectAuthor#(+)(-)GPG?
14814 Jul 2022 13:586642f3bChange root from /var/www/html to /var/www/joshJosh Stockin110G

Blob @ joshstock.in / deploy

text/x-shellscript5228 bytesdownload raw
1#!/usr/bin/env bash
2
3# Script variables
4PYTHON_MAJOR=3
5PYTHON_MINOR=7
6ACCEPTABLE_PYTHON_COMMANDS="python3 python3.10 python3.9 python3.8 python3.7 python"
7
8SCRIPT_SOURCE_DIR=$(dirname -- "${BASH_SOURCE[0]}")
9
10while read -r requirement
11do
12 REQUIRED_PIP_MODULES="$REQUIRED_PIP_MODULES $(sed -r "s/:.*//g" <<< $requirement)"
13 REQUIRED_PYTHON_MODULES="$REQUIRED_PYTHON_MODULES $(sed -r "s/.*://g" <<< $requirement)"
14done < $SCRIPT_SOURCE_DIR/requirements.txt
15
16# Plumbing
17set -o pipefail
18
19RESTORE=$(echo -en '\033[0m')
20STANDOUT=$(echo -en '\033[7m')
21RED=$(echo -en '\033[00;31m')
22GREEN=$(echo -en '\033[00;32m')
23YELLOW=$(echo -en '\033[00;33m')
24PURPLE=$(echo -en '\033[00;35m')
25LIGHTGRAY=$(echo -en '\033[00;37m')
26LRED=$(echo -en '\033[01;31m')
27LGREEN=$(echo -en '\033[01;32m')
28LYELLOW=$(echo -en '\033[01;33m')
29LBLUE=$(echo -en '\033[01;34m')
30LCYAN=$(echo -en '\033[01;36m')
31
32
33
34function usage {
35 echo "Usage: $0 <prod|test>"
36 exit 0
37}
38
39if [ "$EUID" -ne 0 ]; then
40 echo "error: must run as root"
41 usage
42fi
43
44# Handle argument input
45case $1 in
46 h|help|?|-h|-help|-?|--h|--help|--?)
47 usage
48 ;;
49 prod)
50 ;;
51 test)
52 ;;
53 *)
54 usage
55 ;;
56esac
57
58MODE=$1
59
60# Determine Python interpreter to use
61echo "${LIGHTGRAY}Determining Python interpreter${RESTORE}"
62if [ -z $PYTHON_COMMAND ]; then
63 for COMMAND in $ACCEPTABLE_PYTHON_COMMANDS
64 do
65 if command -v $COMMAND &> /dev/null; then
66 PYTHON_COMMAND=$COMMAND
67 break
68 fi
69 done
70fi
71
72# Expand interpreter command, verify with `import sys` test instruction
73PYTHON_COMMAND=$(command -v $PYTHON_COMMAND)
74if [ -z $PYTHON_COMMAND ]; then
75 echo " ${RED}Python interpreter not found${RESTORE}"
76 exit 1
77fi
78if [ -h "$PYTHON_COMMAND" ]; then
79 PYTHON_COMMAND=$(readlink -f $PYTHON_COMMAND)
80fi
81echo " Trying interpreter [ ${LYELLOW}$PYTHON_COMMAND${RESTORE} ]"
82if ! $PYTHON_COMMAND -c "import sys"; then
83 echo " ${RED}Executable is not Python${RESTORE}"
84 exit 1
85fi
86
87# Verifying Python version
88echo "${LIGHTGRAY}Checking Python version${RESTORE} [ needs ${LIGHTGRAY}>=$PYTHON_MAJOR.$PYTHON_MINOR${RESTORE} ]"
89PYTHON_VERSION_STRING=$($PYTHON_COMMAND -c "print('.'.join([str(a) for a in __import__('sys').version_info[:3]]))")
90if ! $PYTHON_COMMAND -c "import sys;exit(not(sys.version_info.major==$PYTHON_MAJOR and sys.version_info.minor>=$PYTHON_MINOR))"; then
91 echo " ${RED}Python version must be ${RESTORE}[ ${LCYAN}>=$PYTHON_MAJOR.$PYTHON_MINOR${RESTORE} ]${RED}."\
92 "Installed is ${RESTORE}[ ${LCYAN}$PYTHON_VERSION_STRING${RESTORE} ]"
93 exit 1
94fi
95echo " Version [ ${LCYAN}$PYTHON_VERSION_STRING${RESTORE} ] acceptable"
96
97# Verifying required modules are installed
98echo "${LIGHTGRAY}Checking Python modules installed${RESTORE}"
99for MODULE in $(seq 1 $(wc -w <<< $REQUIRED_PIP_MODULES))
100do
101 PIP_MODULE=$(awk -v N=$MODULE '{print $N}' <<< "$REQUIRED_PIP_MODULES")
102 PYTHON_MODULE=$(awk -v N=$MODULE '{print $N}' <<< "$REQUIRED_PYTHON_MODULES")
103 if ! $PYTHON_COMMAND -c "import $PYTHON_MODULE" &> /dev/null; then
104 echo " ${RED}Required Python module ${RESTORE}[ ${LBLUE}$PYTHON_MODULE${RESTORE} ] ${RED}not found${RESTORE}"
105 echo " Install with ${PURPLE}$PYTHON_COMMAND -m pip install $PIP_MODULE${RESTORE}"
106 exit 1
107 fi
108 echo " Module [ ${LBLUE}$PYTHON_MODULE${RESTORE} ] found"
109done
110echo " ${GREEN}All required modules found${RESTORE}"
111
112function runcmd {
113 "$@" 2>&1 | sed 's/^/ /';
114}
115
116
117echo "${LIGHTGRAY}Running HTML templating script${RESTORE}"
118runcmd $SCRIPT_SOURCE_DIR/root/compile.py $HTML_OUT
119if [ $? != 0 ]; then
120 echo " ${RED}Error running templating script${RESTORE}"
121 exit 1
122else
123 echo " ${GREEN}Templating successful${RESTORE}"
124fi
125
126echo "${LIGHTGRAY}Installing nginx configuration${RESTORE}"
127
128if [ ! -f $SCRIPT_SOURCE_DIR/nginx/nginx.conf ]; then
129 echo " ${RED}Core configuration file ${RESTORE}[ ${LBLUE}$SCRIPT_SOURCE_DIR/nginx/nginx.conf${RESTORE} ] ${RED}not found${RESTORE}"
130 exit 1
131fi
132runcmd cp -v $SCRIPT_SOURCE_DIR/nginx/nginx.conf /etc/nginx/nginx.conf
133
134runcmd rm -rv /etc/nginx/sites/joshstock.in
135runcmd mkdir -p /etc/nginx/sites/joshstock.in
136if [ ! -d $SCRIPT_SOURCE_DIR/nginx/$MODE ]; then
137 echo " ${RED}Directory ${RESTORE}[ ${LBLUE}$SCRIPT_SOURCE_DIR/nginx/$MODE${RESTORE} ] ${RED}not found${RESTORE}"
138 exit 1
139fi
140runcmd cp -rv $SCRIPT_SOURCE_DIR/nginx/$MODE/* /etc/nginx/sites/joshstock.in
141echo " ${GREEN}nginx configuration successfully installed${RESTORE}"
142
143echo "${LIGHTGRAY}Installing resty-gitweb configuration${RESTORE}"
144runcmd cp -v $SCRIPT_SOURCE_DIR/resty-gitweb.yaml /etc/resty-gitweb.yaml
145echo " ${GREEN}resty-gitweb configuration successfully installed${RESTORE}"
146
147if [[ ! $(lsof -i TCP:80) =~ "nginx" ]]; then
148 echo "${LIGHTGRAY}(Re)starting nginx${RESTORE}"
149 systemctl restart nginx
150else
151 echo "${LIGHTGRAY}Reloading nginx${RESTORE}"
152 systemctl reload nginx
153fi
154if [ $? != 0 ]; then
155 echo " ${RED}nginx configuration not accepted${RESTORE}"
156 runcmd systemctl status nginx
157 exit 1
158else
159 echo " ${GREEN}nginx loaded new configuration successfully${RESTORE}"
160 echo "${BOLD}${LGREEN}Successful deployment!${RESTORE}"
161 exit 0
162fi
163