| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | #!/usr/bin/bash | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # config... | 
					
						
							|  |  |  | CT_DIR=/etc/pve/lxc/ | 
					
						
							|  |  |  | SHARE_ROOT=/media/shared/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-01 22:09:38 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | source ./.pct-helpers | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | case $1 in | 
					
						
							|  |  |  | 	-h|--help) | 
					
						
							|  |  |  | 		echo "Create a clone and optionally a replate from a CT with directory mounts" | 
					
						
							|  |  |  | 		echo | 
					
						
							|  |  |  | 		echo "Usage:" | 
					
						
							|  |  |  | 		echo "    `basename $0` SOURCE_ID CLONE_ID [TEMPLATE_ID]" | 
					
						
							|  |  |  | 		echo | 
					
						
							|  |  |  | 		exit | 
					
						
							|  |  |  | 		;; | 
					
						
							| 
									
										
										
										
											2023-07-01 22:19:31 +03:00
										 |  |  | 	-*) | 
					
						
							|  |  |  | 		echo "Unknown option: $1" | 
					
						
							|  |  |  | 		exit | 
					
						
							| 
									
										
										
										
											2023-07-01 22:09:38 +03:00
										 |  |  | 		;; | 
					
						
							|  |  |  | esac | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | # XXX better argument handling / help... | 
					
						
							|  |  |  | id=$1 | 
					
						
							|  |  |  | to=$2 | 
					
						
							|  |  |  | tpl=$3 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ct=${CT_DIR}/${id}.conf | 
					
						
							| 
									
										
										
										
											2023-06-30 16:26:13 +03:00
										 |  |  | host=$(ct2hostname $id) | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | running=$(pct list | grep "running\s*$host\s*$") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # checks... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # error checking... | 
					
						
							|  |  |  | if [ -z $id ] || [ -z $to ] ; then | 
					
						
							| 
									
										
										
										
											2023-12-30 17:52:29 +03:00
										 |  |  | 	echo ERR need both id and target id 1>&2 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | if [ $id = $to ] ; then | 
					
						
							| 
									
										
										
										
											2023-12-30 17:52:29 +03:00
										 |  |  | 	echo ERR need id and target id must be different 1>&2 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ! [ -e $ct ] ; then | 
					
						
							| 
									
										
										
										
											2023-12-30 17:52:29 +03:00
										 |  |  | 	echo ERR $ct does not exist.  1>&2 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | if [ -e ${CT_DIR}/${to}.conf ] ; then | 
					
						
							| 
									
										
										
										
											2023-12-30 17:52:29 +03:00
										 |  |  | 	echo ERR $to already exists. 1>&2 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | if ! [ -z $tpl ] && [ -e ${CT_DIR}/${tpl}.conf ] ; then | 
					
						
							| 
									
										
										
										
											2023-12-30 17:52:29 +03:00
										 |  |  | 	echo ERR $to already exists. 1>&2 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 	exit 1 | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # check mount points... | 
					
						
							|  |  |  | IFS=$'\n' mounts=($(cat $ct | grep 'mp[0-9]*:')) | 
					
						
							|  |  |  | # check... | 
					
						
							|  |  |  | for mp in ${mounts[@]} ; do | 
					
						
							|  |  |  | 	if ! [ $(grep ": $SHARE_ROOT" <<< $mp) ] ; then | 
					
						
							| 
									
										
										
										
											2023-12-30 17:52:29 +03:00
										 |  |  | 		echo "ERR mountpoint: \"$mp\" heeds to handled manually." 1>&2 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | 		exit 1 | 
					
						
							|  |  |  | 	fi | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # after this point we are making changes... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # need to shutdown to clone... | 
					
						
							|  |  |  | # XXX might be a good idea to also do this with a snapshot... | 
					
						
							|  |  |  | if ! [ -z $running ] ; then  | 
					
						
							|  |  |  | 	@ pct shutdown $id | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # delete mount points... | 
					
						
							|  |  |  | for mp in ${mounts[@]} ; do | 
					
						
							|  |  |  | 	@ pct set ${id} -delete ${mp/: */} | 
					
						
							|  |  |  | done | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # clone... | 
					
						
							|  |  |  | @ pct clone ${id} ${to} --hostname ${host}  | 
					
						
							|  |  |  | @ pct set ${to} -onboot 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # startup if we stopped... | 
					
						
							|  |  |  | if ! [ -z $running ] ; then  | 
					
						
							|  |  |  | 	@ pct start $id | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # after this point are are not affecting uptime... | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # make template... | 
					
						
							|  |  |  | if ! [ -z $tpl ] ; then | 
					
						
							|  |  |  | 	@ pct clone ${to} ${tpl} --hostname ${host}  | 
					
						
							|  |  |  | 	@ pct template ${tpl} | 
					
						
							|  |  |  | fi | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-29 13:54:21 +03:00
										 |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-28 14:22:55 +03:00
										 |  |  | @ ./make-shares | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #---------------------------------------------------------------------- | 
					
						
							|  |  |  | # vim:set ts=4 sw=4 nowrap : |