aboutsummaryrefslogtreecommitdiffstats
path: root/imagetool.sh
blob: adc1ab74d574332bc271b74feacd3e244b3f2412 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/bin/bash

if [ "$(id -u)" != "0" ]; then
		echo "Please run as root" 1>&2
		exit 1
fi

progname=$(basename $0)

function usage()
{
	cat << HEREDOC

Usage:
    Mount Image : $progname [--mount] [--image-name <path to qcow2 image>] [--mount-point <mount point>]
    Umount Image: $progname [--umount] [--mount-point <mount point>]
    Cleanup NBD : $progname [--cleanup]

   arguments:
     -h, --help           show this help message and exit
     -c, --cleanup        cleanup orphaned device mappings
     -m, --mount          mount image
     -u, --umount         umount image
     -i, --image-name     path to qcow2 image
     -p, --mount-point    mount point for image

   This tool will use /dev/nbd1 as default for mounting an image. If you want to use another device, execute like this:
   NBD_DEV=/dev/nbd2 ./$progname --mount --image <your image> --mount-point <your path>

HEREDOC
}

MOUNT=0
UMOUNT=0
IMAGE=""
MOUNTPOINT=""

nbd_cleanup() {
	DEVS="$(lsblk | grep nbd | grep disk | cut -d" " -f1)"
	if [ ! -z "${DEVS}" ]; then
		for d in $DEVS; do
			if [ ! -z "${d}" ]; then
				QDEV="$(ps xa | grep $d | grep -v grep)"
				if [ -z "${QDEV}" ]; then
					kpartx -d /dev/$d && echo "Unconnected device map removed: /dev/$d"
				fi
			fi
		done
	fi
}

# As long as there is at least one more argument, keep looping
while [[ $# -gt 0 ]]; do
	key="$1"
	case "$key" in
		-h|--help)
			usage
		exit
		;;
		-c|--cleanup)
			nbd_cleanup
		;;
		-m|--mount)
			MOUNT=1
		;;
		-u|--umount)
			UMOUNT=1
		;;
		-i|--image-name)
			shift
			IMAGE="$1"
		;;
		-p|--mount-point)
			shift
			MOUNTPOINT="$1"
		;;
		*)
			echo "Unknown option '$key'"
			usage
			exit
		;;
	esac
	# Shift after checking all the cases to get the next option
	shift
done

if [ "${MOUNT}" = "1" ] && [ "${UMOUNT}" = "1" ]; then
	usage
	echo "Concurrent mount options not possible."
	exit
fi

if [ "${MOUNT}" = "1" ] && ([ -z "${IMAGE}"  ] || [ -z "${MOUNTPOINT}"  ]); then
	usage
	echo "Can not mount image. Image path and/or mount point missing."
	exit
fi

if [ "${UMOUNT}" = "1" ] && [ -z "${MOUNTPOINT}" ]; then
	usage
	echo "Can not umount. Mount point parameter missing."
	exit
fi

export NBD_DEV="${NBD_DEV:-/dev/nbd1}"
source scripts/qcow2_handling

if [ "${MOUNT}" = "1" ]; then
	mount_qimage "${MOUNTPOINT}" "${IMAGE}"
elif [ "${UMOUNT}" = "1" ]; then
	umount_qimage "${MOUNTPOINT}"
fi