| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | #!/usr/bin/env bash
 | 
					
						
							| 
									
										
										
										
											2024-09-07 00:35:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-06 08:55:31 +00:00
										 |  |  | # Got root? | 
					
						
							|  |  |  | myWHOAMI=$(whoami) | 
					
						
							|  |  |  | if [ "$myWHOAMI" != "root" ] | 
					
						
							|  |  |  |   then | 
					
						
							|  |  |  |     echo "Need to run as root ..." | 
					
						
							|  |  |  |     exit | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-07 00:35:04 +00:00
										 |  |  | # ANSI color codes for green (OK) and red (FAIL) | 
					
						
							|  |  |  | GREEN='\033[0;32m' | 
					
						
							|  |  |  | RED='\033[0;31m' | 
					
						
							|  |  |  | NC='\033[0m' # No Color | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | # Default settings | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  | PUSH_IMAGES=false | 
					
						
							|  |  |  | NO_CACHE=false | 
					
						
							| 
									
										
										
										
											2024-12-06 08:55:31 +00:00
										 |  |  | PARALLELBUILDS=2 | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | UPLOAD_BANDWIDTH=40mbit # Set this to max 90% of available upload bandwidth | 
					
						
							| 
									
										
										
										
											2025-03-13 23:31:32 +00:00
										 |  |  | INTERFACE=$(ip route | grep "^default" | awk '{ print $5 }') | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | # Help message | 
					
						
							|  |  |  | usage() { | 
					
						
							|  |  |  |     echo "Usage: $0 [-p] [-n] [-h]" | 
					
						
							|  |  |  |     echo "  -p  Push images after building" | 
					
						
							|  |  |  |     echo "  -n  Build images with --no-cache" | 
					
						
							|  |  |  |     echo "  -h  Show help message" | 
					
						
							|  |  |  |     exit 1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Parse command-line options | 
					
						
							|  |  |  | while getopts ":pnh" opt; do | 
					
						
							|  |  |  |     case ${opt} in | 
					
						
							|  |  |  |         p ) | 
					
						
							|  |  |  |             PUSH_IMAGES=true | 
					
						
							| 
									
										
										
										
											2024-12-06 08:55:31 +00:00
										 |  |  |             docker login | 
					
						
							|  |  |  |             docker login ghcr.io | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  |             ;; | 
					
						
							|  |  |  |         n ) | 
					
						
							|  |  |  |             NO_CACHE=true | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         h ) | 
					
						
							|  |  |  |             usage | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |         \? ) | 
					
						
							|  |  |  |             echo "Invalid option: $OPTARG" 1>&2 | 
					
						
							|  |  |  |             usage | 
					
						
							|  |  |  |             ;; | 
					
						
							|  |  |  |     esac | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | # Function to apply upload bandwidth limit using tc | 
					
						
							|  |  |  | apply_bandwidth_limit() { | 
					
						
							|  |  |  |     echo -n "Applying upload bandwidth limit of $UPLOAD_BANDWIDTH on interface $INTERFACE..." | 
					
						
							| 
									
										
										
										
											2024-12-06 08:55:31 +00:00
										 |  |  |     if tc qdisc add dev $INTERFACE root tbf rate $UPLOAD_BANDWIDTH burst 32kbit latency 400ms >/dev/null 2>&1; then | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  |         echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         echo -e " [${RED}FAIL${NC}]" | 
					
						
							|  |  |  |         remove_bandwidth_limit | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Try to reapply the limit | 
					
						
							|  |  |  |         echo -n "Reapplying upload bandwidth limit of $UPLOAD_BANDWIDTH on interface $INTERFACE..." | 
					
						
							| 
									
										
										
										
											2024-12-06 08:55:31 +00:00
										 |  |  |         if tc qdisc add dev $INTERFACE root tbf rate $UPLOAD_BANDWIDTH burst 32kbit latency 400ms >/dev/null 2>&1; then | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  |             echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             echo -e " [${RED}FAIL${NC}]" | 
					
						
							|  |  |  |             echo "Failed to apply bandwidth limit on $INTERFACE. Exiting." | 
					
						
							|  |  |  |             echo | 
					
						
							|  |  |  |             exit 1 | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Function to check if the bandwidth limit is set | 
					
						
							|  |  |  | is_bandwidth_limit_set() { | 
					
						
							| 
									
										
										
										
											2024-12-06 08:55:31 +00:00
										 |  |  |     tc qdisc show dev $INTERFACE | grep -q 'tbf' | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Function to remove the bandwidth limit using tc if it is set | 
					
						
							|  |  |  | remove_bandwidth_limit() { | 
					
						
							|  |  |  |     if is_bandwidth_limit_set; then | 
					
						
							|  |  |  |         echo -n "Removing upload bandwidth limit on interface $INTERFACE..." | 
					
						
							| 
									
										
										
										
											2024-12-06 08:55:31 +00:00
										 |  |  |         if tc qdisc del dev $INTERFACE root; then | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  |             echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             echo -e " [${RED}FAIL${NC}]" | 
					
						
							|  |  |  |         fi | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  | echo "###########################" | 
					
						
							|  |  |  | echo "# T-Pot Image Builder" | 
					
						
							|  |  |  | echo "###########################" | 
					
						
							|  |  |  | echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Check if 'mybuilder' exists, and ensure it's running with bootstrap | 
					
						
							|  |  |  | echo -n "Checking if buildx builder 'mybuilder' exists and is running..." | 
					
						
							|  |  |  | if ! docker buildx inspect mybuilder --bootstrap >/dev/null 2>&1; then | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  |     echo -n "  Creating and starting buildx builder 'mybuilder'..." | 
					
						
							|  |  |  |     if docker buildx create --name mybuilder --driver docker-container --use >/dev/null 2>&1 && \
 | 
					
						
							|  |  |  |        docker buildx inspect mybuilder --bootstrap >/dev/null 2>&1; then | 
					
						
							|  |  |  |         echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         echo -e " [${RED}FAIL${NC}]" | 
					
						
							|  |  |  |         exit 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |     echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Ensure arm64 and amd64 platforms are active | 
					
						
							|  |  |  | echo -n "Ensuring 'mybuilder' supports linux/arm64 and linux/amd64..." | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Get active platforms from buildx | 
					
						
							|  |  |  | active_platforms=$(docker buildx inspect mybuilder --bootstrap | grep -oP '(?<=Platforms: ).*') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if [[ "$active_platforms" == *"linux/arm64"* && "$active_platforms" == *"linux/amd64"* ]]; then | 
					
						
							|  |  |  |     echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  |     echo -n "  Enabling platforms linux/arm64 and linux/amd64..." | 
					
						
							|  |  |  |     if docker buildx create --name mybuilder --driver docker-container --use --platform linux/amd64,linux/arm64 >/dev/null 2>&1 && \
 | 
					
						
							|  |  |  |        docker buildx inspect mybuilder --bootstrap >/dev/null 2>&1; then | 
					
						
							|  |  |  |         echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         echo -e " [${RED}FAIL${NC}]" | 
					
						
							|  |  |  |         exit 1 | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Ensure QEMU is set up for cross-platform builds | 
					
						
							|  |  |  | echo -n "Ensuring QEMU is configured for cross-platform builds..." | 
					
						
							| 
									
										
										
										
											2025-06-14 10:22:04 +00:00
										 |  |  | if docker run --rm --privileged tonistiigi/binfmt --install all > /dev/null 2>&1; then | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  |     echo -e " [${GREEN}OK${NC}]" | 
					
						
							|  |  |  | else | 
					
						
							|  |  |  |     echo -e " [${RED}FAIL${NC}]" | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | # Apply bandwidth limit only if pushing images | 
					
						
							|  |  |  | if $PUSH_IMAGES; then | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  |     echo "########################################" | 
					
						
							|  |  |  |     echo "# Setting Upload Bandwidth limit ..." | 
					
						
							|  |  |  |     echo "########################################" | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  |     apply_bandwidth_limit | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # Trap to ensure bandwidth limit is removed on script error, exit | 
					
						
							|  |  |  | trap_cleanup() { | 
					
						
							|  |  |  |     if is_bandwidth_limit_set; then | 
					
						
							|  |  |  |         remove_bandwidth_limit | 
					
						
							|  |  |  |     fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | trap trap_cleanup INT ERR EXIT | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  | echo | 
					
						
							|  |  |  | echo "################################" | 
					
						
							|  |  |  | echo "# Now building images ..." | 
					
						
							|  |  |  | echo "################################" | 
					
						
							|  |  |  | echo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | mkdir -p log | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-07 00:35:04 +00:00
										 |  |  | # List of services to build | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | services=$(docker compose config --services | sort) | 
					
						
							| 
									
										
										
										
											2024-09-07 00:35:04 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | # Loop through each service to build | 
					
						
							|  |  |  | echo $services | tr ' ' '\n' | xargs -I {} -P $PARALLELBUILDS bash -c ' | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  |     echo "Building image: {}" && \
 | 
					
						
							|  |  |  |     build_cmd="docker compose build {}" && \
 | 
					
						
							|  |  |  |     if '$PUSH_IMAGES'; then \
 | 
					
						
							|  |  |  |         build_cmd="$build_cmd --push"; \
 | 
					
						
							|  |  |  |     fi && \
 | 
					
						
							|  |  |  |     if '$NO_CACHE'; then \
 | 
					
						
							|  |  |  |         build_cmd="$build_cmd --no-cache"; \
 | 
					
						
							|  |  |  |     fi && \
 | 
					
						
							|  |  |  |     eval "$build_cmd 2>&1 > log/{}.log" && \
 | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  |     echo -e "Image {}: ['$GREEN'OK'$NC']" || \
 | 
					
						
							|  |  |  |     echo -e "Image {}: ['$RED'FAIL'$NC']" | 
					
						
							| 
									
										
										
										
											2024-09-07 00:35:04 +00:00
										 |  |  | ' | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-11 10:42:17 +00:00
										 |  |  | # Remove bandwidth limit if it was applied | 
					
						
							|  |  |  | if is_bandwidth_limit_set; then | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  |     echo "########################################" | 
					
						
							|  |  |  |     echo "# Removiong Upload Bandwidth limit ..." | 
					
						
							|  |  |  |     echo "########################################" | 
					
						
							|  |  |  |     echo | 
					
						
							|  |  |  |     remove_bandwidth_limit | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-09 16:44:47 +00:00
										 |  |  | echo | 
					
						
							|  |  |  | echo "#######################################################" | 
					
						
							|  |  |  | echo "# Done." | 
					
						
							|  |  |  | if ! "$PUSH_IMAGES"; then | 
					
						
							|  |  |  |   echo "# Remeber to push the images using push option." | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | echo "#######################################################" | 
					
						
							|  |  |  | echo |