-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgoldfish
executable file
·119 lines (103 loc) · 2.09 KB
/
goldfish
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
#!/bin/bash
set -e
SELF="$0"
LOSETUP=/sbin/losetup
MKFS=/sbin/mkfs
create_filesystem(){
MOUNT="${1:-}"
SIZE="${2:-50}"
FILE="${3:-}"
FILESYSTEM="${4:-ext2}"
if [ "x$MOUNT" = "x" ]; then
MOUNT="/tmp/$( uuidgen )"
fi
if [ ! -d "$MOUNT" ]; then
mkdir -p "$MOUNT"
fi
if [ "x$FILE" = "x" ]; then
FILE="$( tempfile )"
fi
LOOP="$( sudo $LOSETUP -f )"
dd if=/dev/urandom of="$FILE" bs=1M count="$SIZE" >/dev/null 2>&1
dd if=/dev/urandom bs=1 count=1024 2>/dev/null | sudo $LOSETUP -e blowfish -p 0 "$LOOP" "$FILE"
sudo $MKFS -t "$FILESYSTEM" "$LOOP" >/dev/null 2>&1
sudo mount "$LOOP" "$MOUNT"
echo "Filesystem mounted at $MOUNT using $FILE"
}
destroy_filesystem(){
TARGET="$1"
if [ ! -e "$TARGET" ]; then
echo "Unknown target: $TARGET" >&2
exit 2
elif [ -d "$TARGET" ]; then
MOUNT="$( realpath "$TARGET" )"
LOOP="$( grep "$MOUNT" /proc/mounts | awk '{ print $1 }' )"
FILE="$( sudo $LOSETUP "$LOOP" | sed 's/[^(]*(\([^)]*\).*/\1/' )"
else
FILE="$( realpath "$TARGET" )"
LOOP="$( sudo $LOSETUP -a | grep "$FILE" | sed 's/\([^:]*\).*/\1/' )"
MOUNT="$( grep "^$LOOP" /proc/mounts | awk '{ print $2 }' )"
fi
sudo umount "$MOUNT"
sudo $LOSETUP -d "$LOOP"
rm -rf "$FILE"
echo "Filesystem destroyed."
}
display_help(){
echo "Usage: ${SELF} [-f|--file pathname] [-s|--size size-in-megabytes] [-m|--mount mountpoint]"
echo " ${SELF} [-d|--destroy path]"
}
TEMP=$( getopt -n "$( basename $0 )" -o hf:s:m:t:d: --long help,file:,size:,mount:,type:,destroy: -- "$@" )
eval set -- "$TEMP"
MOUNT=
SIZE=
FILE=
FILESYSTEM=
TARGET=
MODE=create
while true; do
case "$1" in
-h|--help)
display_help
shift
;;
-f|--file)
FILE="$2"
shift 2
;;
-s|--size)
SIZE="$2"
shift 2
;;
-m|--mount)
MOUNT="$2"
shift 2
;;
-t|--type)
FILESYSTEM="$2"
shift 2
;;
-d|--destroy)
MODE=destroy
TARGET="$2"
shift 2
;;
--)
shift
break
;;
*)
echo "Unknown option" >&2
display_help >&2
exit 1
;;
esac
done
case "$MODE" in
destroy)
destroy_filesystem "$TARGET"
;;
create|*)
create_filesystem "$MOUNT" "$SIZE" "$FILE"
;;
esac