aboutsummaryrefslogtreecommitdiffstats
path: root/imagetool.sh
blob: fafbade0cbea67337e88fb49726f0843cf64f915 (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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/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
     -C, --force-cleanup  forcefully cleanup orphaned or still connected 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
}

force_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"
                else
					kpartx -d /dev/$d && echo "Connected device map removed (force): /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
		;;
		-C|--force-cleanup)
			force_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_image "${MOUNTPOINT}"
fi