| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | #!/usr/bin/bash | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2024-01-31 03:10:40 +03:00
										 |  |  | # | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | CT_DIR=${CT_DIR:=/etc/pve/lxc/} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-03 10:55:10 +03:00
										 |  |  | # XXX setup path... | 
					
						
							|  |  |  | # XXX | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-05 22:40:29 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-19 20:05:30 +03:00
										 |  |  | EDITOR=${EDITOR:-nano} | 
					
						
							| 
									
										
										
										
											2024-10-17 12:06:41 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-24 22:32:27 +03:00
										 |  |  | LAST_RUN_CONFIG=config.last-run | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-17 12:06:41 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-07-04 23:15:23 +03:00
										 |  |  | # XXX this is quite generic, might be a good idea to move this to a  | 
					
						
							|  |  |  | # 		seporate lib/file... | 
					
						
							| 
									
										
										
										
											2023-07-02 23:31:03 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-11 02:22:08 +03:00
										 |  |  | # Execute (optionally) and print a command. | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-02-04 03:34:49 +03:00
										 |  |  | #	@ COMMAND ARGS | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | #QUIET= | 
					
						
							|  |  |  | #DRY_RUN= | 
					
						
							| 
									
										
										
										
											2023-12-28 14:23:09 +03:00
										 |  |  | ECHO_PREFIX="### " | 
					
						
							| 
									
										
										
										
											2024-08-06 02:33:37 +03:00
										 |  |  | function @ (){ | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	if [ -z $DRY_RUN ] ; then | 
					
						
							|  |  |  | 		! [ $QUIET ] \ | 
					
						
							| 
									
										
										
										
											2024-01-18 13:58:43 +03:00
										 |  |  | 			&& echo -e "${ECHO_PREFIX}$@" | 
					
						
							| 
									
										
										
										
											2024-01-08 04:30:34 +03:00
										 |  |  | 		"$@" | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	else | 
					
						
							| 
									
										
										
										
											2024-01-18 13:58:43 +03:00
										 |  |  | 		echo -e $@ | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2023-12-28 14:23:09 +03:00
										 |  |  | 	return $? | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 16:23:24 +03:00
										 |  |  | # XXX should @@ and @ be the same -- use eval??? | 
					
						
							| 
									
										
										
										
											2024-12-14 16:03:29 +03:00
										 |  |  | function @@ (){ | 
					
						
							|  |  |  | 	if [ -z $DRY_RUN ] ; then | 
					
						
							|  |  |  | 		! [ $QUIET ] \ | 
					
						
							|  |  |  | 			&& echo -e "${ECHO_PREFIX}$@" | 
					
						
							|  |  |  | 		eval "$@" | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		echo -e $@ | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	return $? | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #	check MSG COMMAND .. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | check(){ | 
					
						
							|  |  |  | 	local MSG=$1 | 
					
						
							|  |  |  | 	shift | 
					
						
							|  |  |  | 	for cmd in "$@" ; do | 
					
						
							|  |  |  | 		which $cmd > /dev/null 2>&1 \ | 
					
						
							|  |  |  | 			|| eval "echo \"$MSG\"" >&2 | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | need(){ | 
					
						
							|  |  |  | 	check 'ERROR: "$cmd": needed by this script but not in path.' "$@" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | would-like(){ | 
					
						
							|  |  |  | 	check 'WARNING: "$cmd": is not in path.' "$@" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2023-07-05 22:40:29 +03:00
										 |  |  | # Fill section... | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2023-07-07 23:07:07 +03:00
										 |  |  | # XXX this is quite generic -- move to a more logical place... | 
					
						
							| 
									
										
										
										
											2023-07-05 22:40:29 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | fillsection(){ ( | 
					
						
							|  |  |  | 	usage(){ | 
					
						
							|  |  |  | 		echo "Usage:" | 
					
						
							|  |  |  | 		echo "    ${FUNCNAME[0]} [-h]" | 
					
						
							|  |  |  | 		echo "    ${FUNCNAME[0]} [-r] NAME FILE [CONTENT]" | 
					
						
							|  |  |  | 		echo | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	while true ; do | 
					
						
							|  |  |  | 		case $1 in | 
					
						
							|  |  |  | 			-h|--help) | 
					
						
							|  |  |  | 				usage | 
					
						
							|  |  |  | 				echo "Options:" | 
					
						
							|  |  |  | 				#	  .	  .					. | 
					
						
							|  |  |  | 				echo "    -h | --help       print this help message and exit." | 
					
						
							|  |  |  | 				echo "    -r | --return     replace section markers with CONTENT." | 
					
						
							|  |  |  | 				echo | 
					
						
							|  |  |  | 				return 0 | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 			-r|--replace) | 
					
						
							|  |  |  | 				local replace=1 | 
					
						
							|  |  |  | 				shift | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			*) | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 		esac | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 	if [[ $# < 2 ]] ; then | 
					
						
							|  |  |  | 		usage | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	name=$1 | 
					
						
							|  |  |  | 	file=$2 | 
					
						
							|  |  |  | 	content=$3 | 
					
						
							|  |  |  | 	content=${content:=/dev/stdin} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# print file upto section marker... | 
					
						
							|  |  |  | 	if [ $replace ] ; then | 
					
						
							|  |  |  | 		sed "/${name^^} BEGIN/q" "$file" | sed '$d' | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		sed "/${name^^} BEGIN/q" "$file" | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	# print content... | 
					
						
							|  |  |  | 	cat $content | 
					
						
							|  |  |  | 	# print file from section end marker... | 
					
						
							|  |  |  | 	if [ $replace ] ; then | 
					
						
							|  |  |  | 		sed -ne "/${name^^} END/,$ p" "$file" | sed '1d'  | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		sed -ne "/${name^^} END/,$ p" "$file" | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | ) } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-05 22:40:29 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # CT hostname <-> CT id... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ct2hostname(){ | 
					
						
							|  |  |  | 	local ct=${CT_DIR}/${1}.conf | 
					
						
							| 
									
										
										
										
											2024-02-02 00:50:51 +03:00
										 |  |  | 	local host=$(cat $ct \ | 
					
						
							|  |  |  | 		| grep -e '^\s*hostname:' \ | 
					
						
							|  |  |  | 		| head -1) | 
					
						
							| 
									
										
										
										
											2023-07-05 22:40:29 +03:00
										 |  |  | 	echo ${host/hostname: /} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | hostname2ct(){ | 
					
						
							|  |  |  | 	if [ -e "${CT_DIR}/${1}.conf" ] ; then | 
					
						
							|  |  |  | 		echo $1 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	local running=$2 | 
					
						
							|  |  |  | 	running=${running:=any} | 
					
						
							|  |  |  | 	local ct | 
					
						
							|  |  |  | 	local host | 
					
						
							|  |  |  | 	for ct in "${CT_DIR}"/*.conf ; do | 
					
						
							|  |  |  | 		host=$(cat $ct | grep hostname | head -1) | 
					
						
							|  |  |  | 		host=${host/hostname: /} | 
					
						
							|  |  |  | 		if [ "$host" = $1 ] ; then | 
					
						
							|  |  |  | 			ct=${ct#${CT_DIR}} | 
					
						
							|  |  |  | 			ct=${ct%.conf} | 
					
						
							|  |  |  | 			ct=${ct#\/} | 
					
						
							|  |  |  | 			# filter results if needed... | 
					
						
							|  |  |  | 			if [ $running = "any" ] ; then | 
					
						
							|  |  |  | 				echo $ct | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				local status=`pct status $ct` | 
					
						
							|  |  |  | 				if [ "$running" = "${status/status: /}" ] ; then | 
					
						
							|  |  |  | 					echo $ct | 
					
						
							|  |  |  | 				fi | 
					
						
							|  |  |  | 			fi | 
					
						
							|  |  |  | 		fi | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-30 18:37:35 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | normpath(){ | 
					
						
							|  |  |  | 	echo $1 \ | 
					
						
							|  |  |  | 		| sed \ | 
					
						
							|  |  |  | 			-e 's/\/\+/\//g' \ | 
					
						
							|  |  |  | 			-e 's/\/.\//\//g' \ | 
					
						
							|  |  |  | 			-e 's/[^\/]\+\/\.\.//g' \ | 
					
						
							|  |  |  | 			-e 's/\/\+/\//g' \ | 
					
						
							|  |  |  | 			-e 's/\/\.$/\//g' | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-12-28 14:23:09 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-05 02:26:45 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2024-01-04 16:15:12 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-03 19:27:52 +03:00
										 |  |  | #	xread [-n] MSG VAR | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | # This saves all user input variables to the $XREAD_VARS array. | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | xread(){ | 
					
						
							|  |  |  | 	local non_empty= | 
					
						
							|  |  |  | 	if [[ $1 == '-n' ]] ; then | 
					
						
							|  |  |  | 		shift | 
					
						
							|  |  |  | 		local non_empty=1 | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 	local prefix= | 
					
						
							|  |  |  | 	if [ $SCRIPTING ] ; then | 
					
						
							|  |  |  | 		prefix='# ' | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-20 21:07:44 +03:00
										 |  |  | 	# skip... | 
					
						
							|  |  |  | 	if [[ "${!2}" == "SKIP" ]] \ | 
					
						
							|  |  |  | 			|| [[ "$(eval "echo \$DFL_$2")" == "SKIP" ]] ; then | 
					
						
							| 
									
										
										
										
											2024-01-13 09:55:32 +03:00
										 |  |  | 		eval "$2=" | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | 	if [ -z ${!2} ] ; then | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 		eval 'read -ep "'$prefix''$1'" -i "$DFL_'$2'" '${2}'' | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | 		XREAD_VARS+=(${2}) | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	if [ -z $non_empty ] ; then | 
					
						
							|  |  |  | 		eval ''$2'=${'$2':=$DFL_'$2'}' | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-03 19:27:52 +03:00
										 |  |  | 	[ $SCRIPTING ] \ | 
					
						
							|  |  |  | 		&& echo "$2=${!2}" | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | #	xreadYes MSG [VAR] | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | # | 
					
						
							|  |  |  | xreadYes(){ | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 	if [ -z ${2} ] ; then | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 		local var=__LOCAL | 
					
						
							|  |  |  | 		local __LOCAL | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		local var=${2} | 
					
						
							|  |  |  | 		local mode= | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 	local prefix= | 
					
						
							|  |  |  | 	if [ $SCRIPTING ] ; then | 
					
						
							|  |  |  | 		prefix='# ' | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-13 09:55:32 +03:00
										 |  |  | 	# XXX check DFL_..??? | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 	if [[ "${!var}" == "SKIP" ]] ; then | 
					
						
							|  |  |  | 		eval "$var=" | 
					
						
							| 
									
										
										
										
											2024-10-19 22:01:03 +03:00
										 |  |  | 		return 1 | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 	if [ -z ${!var} ] ; then | 
					
						
							| 
									
										
										
										
											2024-10-19 21:52:42 +03:00
										 |  |  | 		if [[ "$(eval "echo \$DFL_${var}")" == "SKIP" ]] ; then | 
					
						
							|  |  |  | 			eval "$var=" | 
					
						
							| 
									
										
										
										
											2024-10-19 22:01:03 +03:00
										 |  |  | 			return 1 | 
					
						
							| 
									
										
										
										
											2024-10-19 21:52:42 +03:00
										 |  |  | 		elif [ -z $(eval "echo \$DFL_${var}") ] ; then | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | 			local yes=y | 
					
						
							|  |  |  | 			local no=N | 
					
						
							|  |  |  | 			local dfl= | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			local yes=Y | 
					
						
							|  |  |  | 			local no=n | 
					
						
							|  |  |  | 			local dfl=1 | 
					
						
							|  |  |  | 		fi | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 		eval 'read -ep "'$prefix''$1' ('$yes'/'$no') " '${var}'' | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 		XREAD_VARS+=(${var}) | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | 		# normalize... | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 		eval "${var}=${!var,,}" | 
					
						
							|  |  |  | 		if [[ "${!var}" == 'y' ]] ; then | 
					
						
							|  |  |  | 			eval "${var}=1" | 
					
						
							|  |  |  | 		elif [[ ${!var} == 'n' ]] ; then | 
					
						
							|  |  |  | 			eval "${var}=" | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | 		# set default if empty... | 
					
						
							|  |  |  | 		else | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 			eval "${var}=\${${var}:-$dfl}" | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | 		fi | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	[ $SCRIPTING ] \ | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 		&& [[ "$var" != '__LOCAL' ]] \ | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 		&& echo "$var=${!var}" | 
					
						
							| 
									
										
										
										
											2024-01-15 16:47:30 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-21 02:20:10 +03:00
										 |  |  | 	if [ -z ${!var} ] ; then | 
					
						
							| 
									
										
										
										
											2024-01-15 16:47:30 +03:00
										 |  |  | 		return 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-10 23:35:52 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-10-18 17:32:19 +03:00
										 |  |  | #	xreadpass [msg] VAR | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | # | 
					
						
							|  |  |  | xreadpass(){ | 
					
						
							| 
									
										
										
										
											2024-10-18 17:32:19 +03:00
										 |  |  | 	local msg | 
					
						
							|  |  |  | 	if [[ $# == 2 ]] ; then | 
					
						
							| 
									
										
										
										
											2024-10-18 17:33:29 +03:00
										 |  |  | 		msg="$1 " | 
					
						
							| 
									
										
										
										
											2024-10-18 17:32:19 +03:00
										 |  |  | 		shift | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-11 14:01:00 +03:00
										 |  |  | 	if [[ ${!1} == 'SKIP' ]] ; then | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 	local prefix= | 
					
						
							|  |  |  | 	if [ $SCRIPTING ] ; then | 
					
						
							|  |  |  | 		prefix='# ' | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | 	local PASS1 | 
					
						
							|  |  |  | 	local PASS2 | 
					
						
							| 
									
										
										
										
											2024-01-08 01:53:34 +03:00
										 |  |  | 	for attempt in 1 2 3 ; do | 
					
						
							| 
									
										
										
										
											2024-10-18 17:32:19 +03:00
										 |  |  | 		read -sep "${prefix}${msg}password (Enter to skip): " PASS1 | 
					
						
							| 
									
										
										
										
											2024-01-08 01:53:34 +03:00
										 |  |  | 		if [ -z $PASS1 ] ; then | 
					
						
							|  |  |  | 			return | 
					
						
							|  |  |  | 		fi | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 		read -sep "${prefix}retype password: " PASS2 | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | 		if [[ $PASS1 != $PASS2 ]] ; then | 
					
						
							| 
									
										
										
										
											2024-01-30 22:40:37 +03:00
										 |  |  | 			echo "ERROR: passwords do not match." >&2 | 
					
						
							| 
									
										
										
										
											2024-01-08 01:53:34 +03:00
										 |  |  | 			continue | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | 		fi | 
					
						
							|  |  |  | 		eval ''$1'='${PASS1}'' | 
					
						
							| 
									
										
										
										
											2024-01-08 01:53:34 +03:00
										 |  |  | 		return | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 	return 1 | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-08 01:56:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | # Like cat but a prettier... | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #	listFile PATH | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | listFile(){ | 
					
						
							|  |  |  | 	if [ -e "$1" ] ; then | 
					
						
							|  |  |  | 		echo "--- $1 ---" | 
					
						
							|  |  |  | 		cat "$1" | 
					
						
							|  |  |  | 		echo '---' | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		echo "$FUNCNAME: $1: No such file or directory." | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | # Review changes in PATH.new, then edit/apply changes to PATH | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | #	reviewApplyChanges PATH [apply|edit|skip] | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | # | 
					
						
							|  |  |  | # NOTE: if changes are not applied this will return non-zero making this  | 
					
						
							|  |  |  | #		usable in conditionals... | 
					
						
							|  |  |  | reviewApplyChanges(){ | 
					
						
							|  |  |  | 	local file=$1 | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | 	if ! [ -e "$file".new ] ; then | 
					
						
							|  |  |  | 		echo "$FUNCNAME: $1: No such file or directory." | 
					
						
							|  |  |  | 		return 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# default option... | 
					
						
							|  |  |  | 	local dfl= | 
					
						
							|  |  |  | 	local a=a | 
					
						
							|  |  |  | 	local e=e | 
					
						
							|  |  |  | 	local s=s | 
					
						
							|  |  |  | 	case "${2,,}" in | 
					
						
							|  |  |  | 		a|apply) | 
					
						
							|  |  |  | 			a=A | 
					
						
							|  |  |  | 			dfl=a | 
					
						
							|  |  |  | 			;; | 
					
						
							|  |  |  | 		e|edit) | 
					
						
							|  |  |  | 			e=E | 
					
						
							|  |  |  | 			dfl=e | 
					
						
							|  |  |  | 			;; | 
					
						
							|  |  |  | 		s|skip) | 
					
						
							|  |  |  | 			s=S | 
					
						
							|  |  |  | 			dfl=s | 
					
						
							|  |  |  | 			;; | 
					
						
							|  |  |  | 	esac | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | 	echo "# Review updated: ${file}.new:" | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | 	listFile ${file}.new | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | 	local res | 
					
						
							|  |  |  | 	while true ; do | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | 		read -ep "# [$a]pply, [$e]dit, [$s]kip? " res | 
					
						
							|  |  |  | 		if [ -z $res ] ; then | 
					
						
							|  |  |  | 			if [ -z $dfl ] ; then | 
					
						
							|  |  |  | 				continue | 
					
						
							|  |  |  | 			fi | 
					
						
							|  |  |  | 			res=$dfl | 
					
						
							|  |  |  | 		fi | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | 		case "${res,,}" in | 
					
						
							|  |  |  | 			a|apply) | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 			e|edit) | 
					
						
							| 
									
										
										
										
											2024-10-17 13:02:06 +03:00
										 |  |  | 				${EDITOR} "${file}.new" | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | 				listFile ${file}.new | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | 				;; | 
					
						
							|  |  |  | 			s|skip) | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | 				echo "# Changes kept as: ${file}.new" | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | 				return 1 | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 			*) | 
					
						
							| 
									
										
										
										
											2024-10-21 21:52:00 +03:00
										 |  |  | 				echo "ERROR: Unknown command: \"$res\"" >&2 | 
					
						
							| 
									
										
										
										
											2024-01-31 17:26:58 +03:00
										 |  |  | 				continue | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 		esac | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 	@ mv -b "${file}"{.new,} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-08 01:56:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-04 03:34:49 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							| 
									
										
										
										
											2024-01-08 01:56:44 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-27 15:21:56 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	readCTConfig | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # XXX list or load a specific CT config... | 
					
						
							|  |  |  | readCTConfig(){ | 
					
						
							|  |  |  | 	if [ -z $ID ] && ! [ -z $CTHOSTNAME ] ; then | 
					
						
							|  |  |  | 		# XXX select by id... | 
					
						
							|  |  |  | 		true | 
					
						
							|  |  |  | 	elif ! [ -z $ID ] && [ -z $CTHOSTNAME ] ; then | 
					
						
							|  |  |  | 		# XXX select by hostname... | 
					
						
							|  |  |  | 		true | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		# XXX list all... | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	local ct_cfg=$ID-$CTHOSTNAME.cfg | 
					
						
							|  |  |  | 	if [ -e $ct_cfg ] ; then | 
					
						
							|  |  |  | 		source "$ct_cfg" | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-07 16:18:27 +03:00
										 |  |  | #  | 
					
						
							|  |  |  | # 	readConfig | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | # | 
					
						
							|  |  |  | # Envioronment variables: | 
					
						
							|  |  |  | #	CLEAN_RUN	- if set ignore ./config.last-run | 
					
						
							|  |  |  | #	CONFIG		- config file to load last | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-13 09:55:32 +03:00
										 |  |  | # XXX need this not to make this behave with explicitly set vars... | 
					
						
							| 
									
										
										
										
											2024-01-07 16:18:27 +03:00
										 |  |  | readConfig(){ | 
					
						
							|  |  |  | 	if [ -z $NO_DEFAULTS ] ; then | 
					
						
							| 
									
										
										
										
											2024-01-13 09:55:32 +03:00
										 |  |  | 		local IFS=$'\n' | 
					
						
							|  |  |  | 		#__ENV=($( (set -o posix ; set | grep -v 'BASHOPTS=') )) | 
					
						
							|  |  |  | 		#__ENV=($( (declare -xp) )) | 
					
						
							| 
									
										
										
										
											2024-01-07 16:18:27 +03:00
										 |  |  | 		[ -e ../config.global ] \ | 
					
						
							|  |  |  | 			&& source ../config.global | 
					
						
							|  |  |  | 		[ -e ./config ] \ | 
					
						
							|  |  |  | 			&& source ./config | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | 		# XXX is this the right priority for this??? | 
					
						
							| 
									
										
										
										
											2024-10-24 22:32:27 +03:00
										 |  |  | 		[ -e ./$LAST_RUN_CONFIG ] \ | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | 			&& [ -z $CLEAN_RUN ] \ | 
					
						
							| 
									
										
										
										
											2024-10-24 22:32:27 +03:00
										 |  |  | 			&& source ./$LAST_RUN_CONFIG | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | 		[ -e "$CONFIG" ] \ | 
					
						
							|  |  |  | 			&& source $CONFIG | 
					
						
							| 
									
										
										
										
											2024-01-13 09:55:32 +03:00
										 |  |  | 		#eval "${__ENV[@]}" | 
					
						
							|  |  |  | 		#__ENV= | 
					
						
							| 
									
										
										
										
											2024-01-07 16:18:27 +03:00
										 |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-11 00:24:51 +03:00
										 |  |  | #	saveConfig [-d|-a] CONFIG VAR .. | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | # | 
					
						
							|  |  |  | saveConfig(){ | 
					
						
							|  |  |  | 	local prefix= | 
					
						
							| 
									
										
										
										
											2024-01-11 00:24:51 +03:00
										 |  |  | 	local append= | 
					
						
							|  |  |  | 	while true ; do | 
					
						
							|  |  |  | 		case $1 in | 
					
						
							|  |  |  | 			-d|--default) | 
					
						
							|  |  |  | 				prefix=DFL_ | 
					
						
							|  |  |  | 				shift | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 			-a|--append) | 
					
						
							|  |  |  | 				append=1 | 
					
						
							|  |  |  | 				shift | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 			*) | 
					
						
							|  |  |  | 				break | 
					
						
							|  |  |  | 				;; | 
					
						
							|  |  |  | 		esac | 
					
						
							|  |  |  | 	done | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | 	local cfg=$1 | 
					
						
							|  |  |  | 	shift | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-11 00:24:51 +03:00
										 |  |  | 	if [ -z $append ] ; then | 
					
						
							|  |  |  | 		printf '' > "$cfg" | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		for var in $@ ; do | 
					
						
							|  |  |  | 			echo "${prefix}${var}=${!var}" | 
					
						
							|  |  |  | 		done | 
					
						
							| 
									
										
										
										
											2024-01-11 00:24:51 +03:00
										 |  |  | 		echo | 
					
						
							|  |  |  | 	} >> "$cfg" | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | saveLastRunConfig(){ | 
					
						
							| 
									
										
										
										
											2024-10-24 22:32:27 +03:00
										 |  |  | 	local cfg=$LAST_RUN_CONFIG | 
					
						
							| 
									
										
										
										
											2024-10-25 13:19:26 +03:00
										 |  |  | 	local ct_cfg | 
					
						
							|  |  |  | 	if ! [ -z $ID ] && ! [ -z $CTHOSTNAME ] ; then | 
					
						
							|  |  |  | 		local ct_cfg=$ID-$CTHOSTNAME.cfg | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	echo "# Saving config to: $cfg ${ct_cfg:+and $ct_cfg}" | 
					
						
							| 
									
										
										
										
											2024-01-11 00:24:51 +03:00
										 |  |  | 	{ | 
					
						
							|  |  |  | 		echo "#" | 
					
						
							|  |  |  | 		echo "# This file is auto-generated, any changes here will be overwritten."  | 
					
						
							|  |  |  | 		echo "#" | 
					
						
							|  |  |  | 	} > "$cfg" | 
					
						
							|  |  |  | 	saveConfig -d -a "$cfg" ${XREAD_VARS[@]} | 
					
						
							| 
									
										
										
										
											2024-10-25 13:19:26 +03:00
										 |  |  | 	if ! [ -z ${ct_cfg} ] ; then | 
					
						
							|  |  |  | 		cp "$cfg" "$ct_cfg" | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-10 17:56:40 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-14 02:17:07 +03:00
										 |  |  | # Set app variables... | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-13 09:55:32 +03:00
										 |  |  | #	webAppConfig NAME | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-12-14 02:17:07 +03:00
										 |  |  | # | 
					
						
							|  |  |  | # This will generate: | 
					
						
							|  |  |  | # 	<app>_DOMAIN | 
					
						
							|  |  |  | # 	<app>_SUBDOMAIN | 
					
						
							|  |  |  | # 	DFL_DOMAIN | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # This also will unset (to explicitly ask user): | 
					
						
							|  |  |  | # 	DOMAIN | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-13 09:55:32 +03:00
										 |  |  | webAppConfig(){ | 
					
						
							|  |  |  | 	local name=${1^^} | 
					
						
							|  |  |  | 	eval "${name}_SUBDOMAIN=\${${name}_SUBDOMAIN:=\${DFL_SUB${name}_DOMAIN}} | 
					
						
							|  |  |  | 		${name}_SUBDOMAIN=\${${name}_SUBDOMAIN:+\${${name}_SUBDOMAIN%.}.} | 
					
						
							|  |  |  | 		${name}_DOMAIN=\${${name}_DOMAIN:=\${DFL_${name}_DOMAIN}} | 
					
						
							|  |  |  | 		# prioretize \${name}_* | 
					
						
							|  |  |  | 		DFL_DOMAIN=\${DFL_DOMAIN:+\${${name}_SUBDOMAIN}\${DFL_DOMAIN}} | 
					
						
							|  |  |  | 		DFL_DOMAIN=\${DOMAIN:+\${${name}_SUBDOMAIN}\${DOMAIN}} | 
					
						
							|  |  |  | 		if [ \$${name}_DOMAIN ] ; then | 
					
						
							|  |  |  | 			DFL_DOMAIN=\${${name}_SUBDOMAIN}\${${name}_DOMAIN} | 
					
						
							|  |  |  | 		fi" | 
					
						
							|  |  |  | 	# force check of domain... | 
					
						
							|  |  |  | 	DOMAIN= | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	readVars | 
					
						
							| 
									
										
										
										
											2024-01-27 16:49:44 +03:00
										 |  |  | #	readCTHardwareVars | 
					
						
							|  |  |  | #	readBridgeVars | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | # | 
					
						
							|  |  |  | # Variables this handles: | 
					
						
							|  |  |  | #	EMAIL | 
					
						
							|  |  |  | #	DOMAIN | 
					
						
							|  |  |  | #	ID | 
					
						
							|  |  |  | #	CTHOSTNAME | 
					
						
							|  |  |  | #	WAN_BRIDGE | 
					
						
							|  |  |  | #	LAN_BRIDGE | 
					
						
							|  |  |  | #	ADMIN_BRIDGE | 
					
						
							|  |  |  | #	WAN_IP | 
					
						
							|  |  |  | #	WAN_GATE | 
					
						
							|  |  |  | #	LAN_IP | 
					
						
							|  |  |  | #	LAN_GATE | 
					
						
							|  |  |  | #	ADMIN_IP | 
					
						
							|  |  |  | #	ADMIN_GATE | 
					
						
							|  |  |  | #	ROOTPASS | 
					
						
							|  |  |  | #	PCT_EXTRA | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Variables this sets: | 
					
						
							|  |  |  | #	PASS | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # Variables used: | 
					
						
							|  |  |  | # 	TMP_PASS_LEN | 
					
						
							|  |  |  | # 	ROOTPASS | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-28 15:10:12 +03:00
										 |  |  | readCTVars(){ | 
					
						
							|  |  |  | 	xread "ID: " ID | 
					
						
							|  |  |  | 	xread "Hostname: " CTHOSTNAME | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-05 22:59:42 +03:00
										 |  |  | 	# hardware... | 
					
						
							| 
									
										
										
										
											2024-01-07 16:34:47 +03:00
										 |  |  | 	xread "CPU cores: " CORES | 
					
						
							| 
									
										
										
										
											2024-01-05 22:59:42 +03:00
										 |  |  | 	xread "RAM (MB): " RAM | 
					
						
							|  |  |  | 	xread "SWAP (MB): " SWAP | 
					
						
							|  |  |  | 	xread "DRIVE (GB): " DRIVE | 
					
						
							| 
									
										
										
										
											2024-01-27 16:49:44 +03:00
										 |  |  | } | 
					
						
							|  |  |  | readBridgeVars(){ | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	# bridge config... | 
					
						
							| 
									
										
										
										
											2024-10-17 12:38:40 +03:00
										 |  |  | 	xread "ADMIN bridge: vmbr" ADMIN_BRIDGE | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	xread "WAN bridge: vmbr" WAN_BRIDGE | 
					
						
							|  |  |  | 	xread "LAN bridge: vmbr" LAN_BRIDGE | 
					
						
							| 
									
										
										
										
											2024-01-27 16:49:44 +03:00
										 |  |  | } | 
					
						
							|  |  |  | readVars(){ | 
					
						
							|  |  |  | 	xread -n "Email: " EMAIL | 
					
						
							|  |  |  | 	xread -n "Domain: " DOMAIN | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | 	xread -n "Gate ID: " GATE_ID | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-28 15:10:12 +03:00
										 |  |  | 	readCTVars | 
					
						
							| 
									
										
										
										
											2024-01-27 16:49:44 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	readBridgeVars | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# gateway... | 
					
						
							| 
									
										
										
										
											2024-01-03 19:27:52 +03:00
										 |  |  | 	# IPs can be: | 
					
						
							|  |  |  | 	#	<empty> | 
					
						
							|  |  |  | 	#	<IP>/<mask> | 
					
						
							|  |  |  | 	#	dhcp | 
					
						
							|  |  |  | 	# Gateways can be: | 
					
						
							|  |  |  | 	#	<empty> | 
					
						
							|  |  |  | 	#	<IP> | 
					
						
							| 
									
										
										
										
											2024-01-13 16:35:15 +03:00
										 |  |  | 	# XXX these are the same... | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	xread "WAN ip: " WAN_IP | 
					
						
							| 
									
										
										
										
											2024-01-13 16:35:15 +03:00
										 |  |  | 	if [[ $WAN_IP != "dhcp" ]] ; then | 
					
						
							|  |  |  | 		xread "WAN gateway: " WAN_GATE | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		WAN_GATE= | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	xread "LAN ip: " LAN_IP | 
					
						
							| 
									
										
										
										
											2024-01-13 16:35:15 +03:00
										 |  |  | 	if [[ $LAN_IP != "dhcp" ]] ; then | 
					
						
							|  |  |  | 		xread "LAN gateway: " LAN_GATE | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		LAN_GATE= | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	xread "ADMIN ip: " ADMIN_IP | 
					
						
							| 
									
										
										
										
											2024-01-13 16:35:15 +03:00
										 |  |  | 	if [[ $ADMIN_IP != "dhcp" ]] ; then | 
					
						
							|  |  |  | 		xread "ADMIN gateway: " ADMIN_GATE | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		ADMIN_GATE= | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	# root password... | 
					
						
							|  |  |  | 	if [ -z $ROOTPASS ] ; then | 
					
						
							| 
									
										
										
										
											2024-10-18 17:33:29 +03:00
										 |  |  | 		xreadpass root PASS \ | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | 			|| exit 1 | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	else | 
					
						
							|  |  |  | 		PASS=$ROOTPASS | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# extra stuff... | 
					
						
							|  |  |  | 	xread "pct extra options: " PCT_EXTRA | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	makeTemplateSEDPatterns VAR ... | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | makeTemplateSEDPatterns(){ | 
					
						
							|  |  |  | 	local var | 
					
						
							|  |  |  | 	for var in "$@" ; do | 
					
						
							|  |  |  | 		local val=${!var} | 
					
						
							|  |  |  | 		if [[ $val == SKIP ]] ; then | 
					
						
							|  |  |  | 			val= | 
					
						
							|  |  |  | 		fi | 
					
						
							|  |  |  | 		echo "-e 's/\\\${${var}}/${val//\//\\/}/g'" | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # same as makeTemplateSEDPatterns but adds default vars + generates *_IPn vars... | 
					
						
							|  |  |  | PCT_TEMPLATE_VARS=( | 
					
						
							|  |  |  | 	EMAIL | 
					
						
							|  |  |  | 	DOMAIN | 
					
						
							|  |  |  | 	CTHOSTNAME | 
					
						
							| 
									
										
										
										
											2024-01-27 16:13:38 +03:00
										 |  |  | 	HOST_ADMIN_IP | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	GATE_HOSTNAME | 
					
						
							|  |  |  | 	GATE_LAN_IP | 
					
						
							|  |  |  | 	GATE_ADMIN_IP | 
					
						
							| 
									
										
										
										
											2024-01-27 16:13:38 +03:00
										 |  |  | 	NS_HOSTNAME | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	NS_LAN_IP | 
					
						
							|  |  |  | 	NS_ADMIN_IP | 
					
						
							|  |  |  | 	WAN_IP | 
					
						
							|  |  |  | 	WAN_GATE | 
					
						
							|  |  |  | 	LAN_IP | 
					
						
							|  |  |  | 	LAN_GATE | 
					
						
							|  |  |  | 	ADMIN_IP | 
					
						
							|  |  |  | 	ADMIN_GATE | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | makePCTTemplateSEDPatterns(){ | 
					
						
							| 
									
										
										
										
											2024-01-21 02:41:42 +03:00
										 |  |  | 	local vars=("${PCT_TEMPLATE_VARS[@]}" "$@") | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	# strip ips and save to *_IPn var... | 
					
						
							|  |  |  | 	local ip_vars=() | 
					
						
							|  |  |  | 	local var | 
					
						
							|  |  |  | 	local val | 
					
						
							| 
									
										
										
										
											2024-01-21 02:38:59 +03:00
										 |  |  | 	for var in ${vars[@]} ; do | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 		if [[ $var =~ .*_IP ]] ; then | 
					
						
							|  |  |  | 			local val=${!var} | 
					
						
							|  |  |  | 			if [[ $val == SKIP ]] ; then | 
					
						
							|  |  |  | 				val= | 
					
						
							|  |  |  | 			fi | 
					
						
							|  |  |  | 			ip_vars+=("${var}n") | 
					
						
							|  |  |  | 			eval "local ${var}n=\"${val/\/*}\"" | 
					
						
							|  |  |  | 		fi | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-21 02:38:59 +03:00
										 |  |  | 	makeTemplateSEDPatterns "${vars[@]}" "${ip_vars[@]}" | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #	expandTemplate PATH VAR ... | 
					
						
							|  |  |  | #	.. | expandTemplate VAR ... | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | PCT_TEMPLATE_PATTERNS= | 
					
						
							|  |  |  | expandTemplate(){ | 
					
						
							|  |  |  | 	if [ -t 0 ] ; then | 
					
						
							|  |  |  | 		local input=$1 | 
					
						
							|  |  |  | 		shift | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		local input=/dev/stdin | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if [ -z "$PCT_TEMPLATE_PATTERNS" ] ; then | 
					
						
							|  |  |  | 		local patterns=($(makeTemplateSEDPatterns "$@")) | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		local patterns=("${PCT_TEMPLATE_PATTERNS[@]}") | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	cat "${input}" \ | 
					
						
							|  |  |  | 		| eval "sed ${patterns[@]}"  | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-27 16:13:38 +03:00
										 |  |  | #	expandPCTTemplate PATH [VAR ...] | 
					
						
							|  |  |  | #	.. | expandPCTTemplate [VAR ...] | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | # | 
					
						
							|  |  |  | expandPCTTemplate(){ | 
					
						
							|  |  |  | 	local input= | 
					
						
							|  |  |  | 	if [ -t 0 ] ; then | 
					
						
							|  |  |  | 		input=$1 | 
					
						
							|  |  |  | 		shift | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	local PCT_TEMPLATE_PATTERNS=($(makePCTTemplateSEDPatterns "$@")) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	expandTemplate "${input}" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-10 03:57:49 +03:00
										 |  |  | #	buildAssets [VAR ..] | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-21 13:16:39 +03:00
										 |  |  | # XXX add vars in filenames (???) | 
					
						
							| 
									
										
										
										
											2024-01-18 03:33:00 +03:00
										 |  |  | NOTES=NOTES.md | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | buildAssets(){ | 
					
						
							| 
									
										
										
										
											2024-01-10 03:57:49 +03:00
										 |  |  | 	local template_dir=${TEMPLATE_DIR:-templates} | 
					
						
							|  |  |  | 	local assets_dir=${ASSETS_DIR:-assets} | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	local staging_dir=${STAGING_DIR:-staging} | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	local PCT_TEMPLATE_PATTERNS=($(makePCTTemplateSEDPatterns "$@")) | 
					
						
							| 
									
										
										
										
											2024-01-10 03:09:10 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	# assets... | 
					
						
							| 
									
										
										
										
											2024-01-20 21:01:35 +03:00
										 |  |  | 	if [ -e "${assets_dir}" ] ; then | 
					
						
							|  |  |  | 		mkdir -p "${staging_dir}" | 
					
						
							|  |  |  | 		cp -R "${assets_dir}"/* "${staging_dir}"/ | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	# template dir... | 
					
						
							| 
									
										
										
										
											2024-01-20 21:46:21 +03:00
										 |  |  | 	if [ -e $template_dir ] ; then | 
					
						
							|  |  |  | 		local TEMPLATES=($(find "$template_dir" -type f)) | 
					
						
							|  |  |  | 		for file in "${TEMPLATES[@]}" ; do | 
					
						
							|  |  |  | 			file=${file#${template_dir}} | 
					
						
							|  |  |  | 			echo Generating: ${file}... | 
					
						
							|  |  |  | 			[ $DRY_RUN ] \ | 
					
						
							|  |  |  | 				&& continue | 
					
						
							|  |  |  | 			# ensure the directory exists... | 
					
						
							|  |  |  | 			mkdir -p "$(dirname "${staging_dir}/${file}")" | 
					
						
							|  |  |  | 			cat "${template_dir}/${file}" \ | 
					
						
							|  |  |  | 				| expandTemplate \ | 
					
						
							|  |  |  | 				> "${staging_dir}/${file}" | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-20 21:01:35 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-18 03:33:00 +03:00
										 |  |  | 	# special case: NOTES.md... | 
					
						
							|  |  |  | 	if [ -z "$DESCRIPTION" ] && [ -e "$NOTES" ] ; then | 
					
						
							| 
									
										
										
										
											2024-01-18 03:29:51 +03:00
										 |  |  | 		DESCRIPTION="$(\ | 
					
						
							| 
									
										
										
										
											2024-01-18 03:33:00 +03:00
										 |  |  | 			cat ${NOTES} \ | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 				| expandTemplate)" | 
					
						
							| 
									
										
										
										
											2024-01-18 03:29:51 +03:00
										 |  |  | 	fi | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	pctPushAssets ID | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | pctPushAssets(){ | 
					
						
							|  |  |  | 	@ pct-push-r $1 "${STAGING_DIR:-./staging}" / | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-29 23:42:05 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	traefikPushConfig | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | # XXX generate config in a staging location... | 
					
						
							|  |  |  | TRAEFIK_CONFIG=traefik.yml | 
					
						
							| 
									
										
										
										
											2024-01-29 23:42:05 +03:00
										 |  |  | TRAEFIK_PATH=/etc/traefik.d/ | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | TRAEFIK_STAGING=traefik/ | 
					
						
							| 
									
										
										
										
											2024-01-29 23:42:05 +03:00
										 |  |  | traefikPushConfig(){ | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | 	local filename="${CTHOSTNAME}.yml" | 
					
						
							|  |  |  | 	local source="${TRAEFIK_STAGING}/${filename}" | 
					
						
							|  |  |  | 	local target="${TRAEFIK_PATH}"/"${filename}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# source file not found... | 
					
						
							|  |  |  | 	if ! [ -e "${TRAEFIK_CONFIG}" ] ; then | 
					
						
							|  |  |  | 		echo "${TRAEFIK_CONFIG}: not found." >&2 | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# generat config... | 
					
						
							|  |  |  | 	mkdir -p "${TRAEFIK_STAGING}" | 
					
						
							|  |  |  | 	cat ${TRAEFIK_CONFIG} \ | 
					
						
							|  |  |  | 		| expandPCTTemplate \ | 
					
						
							|  |  |  | 		> "${source}" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# get things we need if they are not set... | 
					
						
							|  |  |  | 	xread "Gate CT id: " GATE_ID | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# check if $filename exists... | 
					
						
							|  |  |  | 	if @ lxc-attach $GATE_ID -- test -e ${target} \ | 
					
						
							|  |  |  | 			&& ! xreadYes "Overwrite existing \"${target}\"?" ; then | 
					
						
							|  |  |  | 		@ lxc-attach $GATE_ID -- mv "${target}" "${target}.bak" | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	@ pct push $GATE_ID "${source}" "${target}" | 
					
						
							| 
									
										
										
										
											2024-01-29 23:42:05 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	pveGetLatestTemplate PATTERN [VAR] | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # see: | 
					
						
							|  |  |  | #	https://pve.proxmox.com/wiki/Linux_Container | 
					
						
							|  |  |  | pveGetLatestTemplate(){ | 
					
						
							|  |  |  | 	if [ $DRY_RUN ] ; then | 
					
						
							|  |  |  | 		[ -z $2 ] \ | 
					
						
							|  |  |  | 			|| eval "$2=${CT_TEMPLATE:-\\\$CT_TEMPLATE}" | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	#@ pveam update  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	local templates=($(pveam available | grep -o ''${1}'.*$')) | 
					
						
							|  |  |  | 	local latest=${templates[-1]} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	@ pveam download local ${latest} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	latest=$(pveam list local | grep -o "^.*$latest") | 
					
						
							|  |  |  | 	#latest=($(ls /var/lib/vz/template/cache/${1}*)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	[ -z $2 ] \ | 
					
						
							|  |  |  | 		|| eval "$2=${latest}" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | #	pctBaseCreate ID TEMPLATE ARGS [PASS] | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | pctBaseCreate(){ | 
					
						
							|  |  |  | 	local ID=$1 | 
					
						
							|  |  |  | 	local TEMPLATE=$2 | 
					
						
							|  |  |  | 	local ARGS=$3 | 
					
						
							|  |  |  | 	local PASS=$4 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	local TMP_PASS=$(cat /dev/urandom | base64 | head -c ${TMP_PASS_LEN:=32}) | 
					
						
							|  |  |  | 	# NOTE: we are not setting the password here to avoid printing it to the terminal... | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 	@ pct create $ID \ | 
					
						
							|  |  |  | 		"${TEMPLATE}" \ | 
					
						
							|  |  |  | 		${ARGS} \ | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 		--password="$TMP_PASS" \ | 
					
						
							|  |  |  | 		--start 1 \ | 
					
						
							|  |  |  | 	|| exit 1 | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	# set actual root password... | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 	if [ "$PASS" ] ; then | 
					
						
							|  |  |  | 		echo "root:$PASS" \ | 
					
						
							|  |  |  | 			| @ lxc-attach $ID chpasswd | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	fi | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | #	pctCreate ID TEMPLATE [PASS] | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #OPTS_STAGE_1= | 
					
						
							|  |  |  | #INTERFACES= | 
					
						
							|  |  |  | #CTHOSTNAME= | 
					
						
							|  |  |  | #CORES= | 
					
						
							|  |  |  | #RAM= | 
					
						
							|  |  |  | #SWAP= | 
					
						
							|  |  |  | #DRIVE= | 
					
						
							|  |  |  | #PCT_EXTRA= | 
					
						
							|  |  |  | pctCreate(){ | 
					
						
							|  |  |  | 	# build network args... | 
					
						
							|  |  |  | 	local interfaces_args=() | 
					
						
							|  |  |  | 	local i=0 | 
					
						
							|  |  |  | 	local interface | 
					
						
							|  |  |  | 	for interface in "${INTERFACES[@]}" ; do | 
					
						
							|  |  |  | 		interfaces_args+=("--net${i} "${interface}"") | 
					
						
							|  |  |  | 		i=$(( i + 1 )) | 
					
						
							|  |  |  | 	done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	# NOTE: TKL gui will not function correctly without nesting enabled... | 
					
						
							|  |  |  | 	local args="\ | 
					
						
							|  |  |  | 		--hostname $CTHOSTNAME \ | 
					
						
							|  |  |  | 		--cores $CORES \ | 
					
						
							|  |  |  | 		--memory $RAM \ | 
					
						
							|  |  |  | 		--swap $SWAP \ | 
					
						
							|  |  |  | 		"${interfaces_args[@]}" \ | 
					
						
							|  |  |  | 		--storage local-lvm \ | 
					
						
							|  |  |  | 		--rootfs local-lvm:$DRIVE \ | 
					
						
							|  |  |  | 		--unprivileged 1 \ | 
					
						
							|  |  |  | 		--features nesting=1 \ | 
					
						
							|  |  |  | 		${PCT_EXTRA} \ | 
					
						
							|  |  |  | 	" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	pctBaseCreate "$1" "$2" "${OPTS_STAGE_1:-"${args}"}" "$3" | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #	pctCreate<distro> ID [PASS] | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | pctCreateAlpine(){ | 
					
						
							| 
									
										
										
										
											2024-01-05 02:26:45 +03:00
										 |  |  | 	local TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	pveGetLatestTemplate alpine TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 	pctCreate $1 "$TEMPLATE" "$2" | 
					
						
							| 
									
										
										
										
											2024-01-03 19:27:52 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | 	sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 19:30:09 +03:00
										 |  |  | 	@ lxc-attach $1 apk update | 
					
						
							|  |  |  | 	@ lxc-attach $1 apk upgrade | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | pctCreateDebian(){ | 
					
						
							|  |  |  | 	local TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	pveGetLatestTemplate 'debian-12-standard' TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 	pctCreate $1 "$TEMPLATE" "$2" | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	@ lxc-attach $1 apt update | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | 	@ lxc-attach $1 -- apt upgrade -y | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | } | 
					
						
							|  |  |  | pctCreateUbuntu(){ | 
					
						
							|  |  |  | 	local TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	pveGetLatestTemplate ubuntu TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 	pctCreate $1 "$TEMPLATE" "$2" | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	@ lxc-attach $1 apt update | 
					
						
							| 
									
										
										
										
											2024-01-06 01:49:27 +03:00
										 |  |  | 	@ lxc-attach $1 -- apt upgrade -y | 
					
						
							| 
									
										
										
										
											2024-01-05 22:52:36 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 18:12:24 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | #	pctCreateTurnkey APP ID [PASS] | 
					
						
							| 
									
										
										
										
											2024-01-10 18:12:24 +03:00
										 |  |  | # | 
					
						
							|  |  |  | pctCreateTurnkey(){ | 
					
						
							|  |  |  | 	local app=$1 | 
					
						
							|  |  |  | 	shift | 
					
						
							|  |  |  | 	local TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-20 17:58:46 +03:00
										 |  |  | 	pveGetLatestTemplate '.*-turnkey-'$app TEMPLATE | 
					
						
							| 
									
										
										
										
											2024-01-10 18:12:24 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 	pctCreate $1 "$TEMPLATE" "$2" | 
					
						
							| 
									
										
										
										
											2024-01-10 18:12:24 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	tklWaitForSetup $1 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | # Wait for /etc/inithooks.conf to be generated then cleared | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # 	tklWaitForSetup ID | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # for tkl inithooks doc see: | 
					
						
							|  |  |  | # 	https://www.turnkeylinux.org/docs/inithooks | 
					
						
							|  |  |  | tklWaitForSetup(){ | 
					
						
							|  |  |  | 	printf "# TKL setup, this may take a while" | 
					
						
							|  |  |  | 	if [ -z $DRY_RUN ] ; then | 
					
						
							|  |  |  | 		while ! $(lxc-attach $1 -- test -e /etc/inithooks.conf) ; do | 
					
						
							|  |  |  | 			printf '.' | 
					
						
							|  |  |  | 			sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 		printf '+' | 
					
						
							|  |  |  | 		sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | 		while ! [[ $(lxc-attach $1 -- cat /etc/inithooks.conf | wc -c) < 2 ]] ; do | 
					
						
							|  |  |  | 			printf '.' | 
					
						
							|  |  |  | 			sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | 		done | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		printf '.+..' | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 	printf 'ready.\n' | 
					
						
							|  |  |  | 	sleep ${TIMEOUT:=5} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-20 22:22:32 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 18:12:24 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	pctUpdateTurnkey ID | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | pctUpdateTurnkey(){ | 
					
						
							|  |  |  | 	@ lxc-attach $1 apt update | 
					
						
							|  |  |  | 	@ lxc-attach $1 -- apt upgrade -y | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-03 20:13:51 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	pctSet ID [ARGS [REBOOT]] | 
					
						
							|  |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | pctSet(){ | 
					
						
							|  |  |  | 	[ "$2" ] \ | 
					
						
							|  |  |  | 		&& @ pct set $1 \ | 
					
						
							| 
									
										
										
										
											2024-01-18 16:34:32 +03:00
										 |  |  | 			${2} | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 	[ "$3" ] \ | 
					
						
							|  |  |  | 		&& @ pct reboot $1 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-18 03:44:49 +03:00
										 |  |  | # | 
					
						
							| 
									
										
										
										
											2024-01-18 14:10:41 +03:00
										 |  |  | #	pctSetNotes ID [DESCRIPTION] | 
					
						
							| 
									
										
										
										
											2024-01-18 03:44:49 +03:00
										 |  |  | # | 
					
						
							|  |  |  | pctSetNotes(){ | 
					
						
							| 
									
										
										
										
											2024-01-18 14:10:41 +03:00
										 |  |  | 	# XXX for some reason this complains quote alot... | 
					
						
							| 
									
										
										
										
											2024-01-18 13:44:42 +03:00
										 |  |  | 	#[ "$DESCRIPTION" ] \ | 
					
						
							|  |  |  | 	#	&& @ pct set $1 \ | 
					
						
							|  |  |  | 	#		"${DESCRIPTION:+--description \""${DESCRIPTION}"\"}" | 
					
						
							|  |  |  | 	local ID=$1 | 
					
						
							| 
									
										
										
										
											2024-01-18 13:58:43 +03:00
										 |  |  | 	local NOTES="$(\ | 
					
						
							|  |  |  | 		echo -e "${2:-${DESCRIPTION}}" \ | 
					
						
							|  |  |  | 			| sed -e 's/^/#/')" | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if [ "$DRY_RUN" ] ; then | 
					
						
							|  |  |  | 		return | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-18 13:44:42 +03:00
										 |  |  | 	local CONF="$(cat "${CT_DIR}/${ID}.conf")" | 
					
						
							|  |  |  | 	local TEXT="\ | 
					
						
							|  |  |  | "${NOTES}" | 
					
						
							|  |  |  | "${CONF}" | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | 	echo -e "${TEXT}" > "${CT_DIR}/${ID}.conf" | 
					
						
							| 
									
										
										
										
											2024-01-18 03:44:49 +03:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2024-01-03 18:51:22 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-26 03:06:55 +03:00
										 |  |  | # | 
					
						
							|  |  |  | #	showNotes [VAR ...] | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | BUILD_NOTES=BUILD_NOTES | 
					
						
							|  |  |  | showNotes(){ | 
					
						
							|  |  |  | 	[ -e "${BUILD_NOTES}" ] \ | 
					
						
							|  |  |  | 		&& mv "${BUILD_NOTES}"{,.bak} | 
					
						
							|  |  |  | 	[ -e "${BUILD_NOTES}".tpl ] \ | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | 		&& ( cat "${BUILD_NOTES}".tpl \ | 
					
						
							| 
									
										
										
										
											2024-01-26 03:06:55 +03:00
										 |  |  | 			| expandPCTTemplate $@ \ | 
					
						
							| 
									
										
										
										
											2024-01-30 03:49:06 +03:00
										 |  |  | 			| tee "${BUILD_NOTES}" ) | 
					
						
							| 
									
										
										
										
											2024-12-13 16:21:04 +03:00
										 |  |  | 	[ -e ./POST_INSTALL.md ] \ | 
					
						
							| 
									
										
										
										
											2024-12-13 16:31:17 +03:00
										 |  |  | 		&& echo "####" \ | 
					
						
							| 
									
										
										
										
											2024-12-13 17:20:12 +03:00
										 |  |  | 		&& cat ./POST_INSTALL.md \ | 
					
						
							| 
									
										
										
										
											2024-12-13 16:21:04 +03:00
										 |  |  | 			| sed 's/^/## /' | 
					
						
							| 
									
										
										
										
											2024-01-26 03:06:55 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #	pushNotes ID | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | pushNotes(){ | 
					
						
							|  |  |  | 	[ -e "${BUILD_NOTES}" ] \ | 
					
						
							| 
									
										
										
										
											2024-01-26 14:57:31 +03:00
										 |  |  | 		&& @ pct-push-r $1 "${BUILD_NOTES}" /root/ | 
					
						
							| 
									
										
										
										
											2024-01-26 03:06:55 +03:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-20 18:08:55 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # vim:set ts=4 sw=4 nowrap : |