Repository navigation
Expand file tree
/
Copy pathcsn
More file actions
182 lines (160 loc) · 5.38 KB
/
Copy pathcsn
File metadata and controls
182 lines (160 loc) · 5.38 KB
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
#!/bin/bash
set -e
getParams(){
if [ -z "$*" ];then echo "${OUT[help]}";exit;fi
until [ "$1" = "" ];do
local a=$1
shift
if [[ "${a,,}" =~ ^-[a-z]{2,}$ ]];then
set -- $(fold -w1 <<< ${a:2}|sed -e 's/^/-/') $*
a=${a:0:2}
elif [[ "$a" =~ ^/ ]];then
if [[ ! -z "$device" ]];then
echo "${OUT[multiDev]}"
return 11
fi
device=$a
continue
fi
case "$a" in
-h|--help) echo "${OUT[help]}"; exit;;
-r|--random) random=true;;
-s|--serial) sn=${1^^};shift;;
*) printf "${OUT[wrongParam]}\n" "'$a'";err+=;;
esac
done
}
checkValues(){
if [ -z "$(which xxd)" ];then
echo "${OUT[noXxd]}"
return 13
fi
if [ "$EUID" != 0 ];then
echo "${OUT[noSudo]}"
return 7
fi
if [ -z "$device" ];then
printf "${OUT[noDev]}\n"
return 2
elif [ ! -b "$device" ];then
printf "${OUT[noBlockDev]}\n" "'$device'"
return 10
else
fs=$(lsblk -lno fstype $device)
if [[ ! "$fs" =~ ^(ntfs|vfat)$ ]];then
echo "${OUT[noFS]}"
return 4
elif [ "$fs" = "ntfs" ];then
seek=72;length=8
if [[ ! "${sn^^}" =~ ^(|[A-F0-9]{16})$ ]];then
printf "${OUT[wrongSN]}.\n" "'$sn'" "NTFS" 16
return 6
fi
else
seek=67;length=4
if [[ ! "$sn" =~ ^(|[A-F0-9]{4}-?[A-F0-9]{4})$ ]];then
printf "${OUT[wrongSN]}.\n" "'$sn'" "FAT" 8
return 6
elif [ ${#sn} = 8 ];then
sn=$(sed -E 's/^(....)/\1-/'<<<$sn)
fi
fi
if [ ! -z "$(lsblk -lno mountpoints $device)" ]; then
printf "${OUT[mounted]}\n" $device
return 8
fi
prevSN=$(lsblk -lno uuid $device)
if [ "$sn" = "$prevSN" ];then
printf "${OUT[equalSN]}\n" $sn
return 11
fi
fi
if [[ -z "$random" && -z "$sn" ]];then
echo "${OUT[noSN]}"
return 5
elif [[ ! -z "$random" && ! -z "$sn" ]];then
echo "${OUT[multiSN]}"
return 3
elif [ "$random" = "true" ];then
sn=$(xxd -l$length -u -p /dev/urandom)
if [ "$fs" == "vfat" ];then sn=$(sed -E 's/^(....)/\1-/'<<<$sn);fi
fi
if [ "$err" != 0 ];then return $err;fi
}
getTranslation(){
if [ ! -z "$LANGUAGE" ];then local lang=${LANGUAGE:0:3};else local lang=${LANG:0:2};fi
case "$lang" in
# GERMAN
de)
OUT[help]='Ändern von NTFS-/FAT Seriennummern.
Nutzung:
csn [optionen] <gerät>
Optionen:
--help -h Diese Hilfe anzeigen
--random -r Zufällige Seriennummer zuweisen
--serial -s <Seriennummer> Seriennummer zuweisen'
OUT[wrongParam]='Der Parameter %s existiert nicht.'
OUT[noDev]='Es wurde kein Gerät angegeben.'
OUT[noBlockDev]='%s ist kein Blockgerät.'
OUT[noSN]="Sie müssen entweder eine Seriennummer über den Parameter '--serial' definieren, oder den Parameter '--random' angeben."
OUT[multiSN]="'--random' kann nicht mit '-serial' kombiniert werden."
OUT[noFS]="Das Gerät enthält kein gültiges Dateisystem. Nur NTFS und FAT werden unterstützt."
OUT[wrongSN]='Die angegebene Seriennummer %s hat nicht das richtige Format. Für das %s-Dateisystem muss die Seriennummer aus %d Hexadezimalzeichen bestehen'
OUT[noSudo]='Dieses Skript muss mit Root-Rechten gestartet werden.'
OUT[mounted]='%s ist noch eingehangen.'
OUT[changed]='Die Seriennummer wurde von %s auf %s geändert.'
OUT[undev]='Ein undefinierter Fehler ist aufgetreten.'
OUT[equalSN]='Das Gerät hat bereits die Seriennummer %s. Nichts zu tun.'
OUT[multiDev]='Es wurden mehrere Geräte angegeben.'
OUT[noXxd]='xxd ist nicht installiert.'
;;
# ENGLISH
*)
"Changes NTFS/FAT serial numbers.
Usage:
csn [options] <device>
Options:
--help -h Print this help
--random -r Set random serial
--serial -s <Seriennummer> Set serial number"
OUT[wrongParam]='The parameter %s does not exist.'
OUT[noDev]='No device specified.'
OUT[noBlockDev]='%s is not a block device.'
OUT[noSN]="You must either define a serial number with the parameter '--serial' or specify the parameter '--random'."
OUT[multiSN]="'--random' can't be combined with '--serial'."
OUT[noFS]='The device does not conatain a valid filesystem. Just NTFS and FAT are supported.'
OUT[wrongSN]='The specified serial number %s is not valid. For the %s file system, the serial number must consist of %d hexadecimal numbers.'
OUT[noSudo]='This script must be run as root.'
OUT[mounted]='%s is still mounted.'
OUT[changed]='Serial number changed from %s to %s.'
OUT[undev]='An undefined error has occurred.'
OUT[equalSN]='The device already has the serial number %s. Nothing to do.'
OUT[multiDev]='Multiple devices specified.'
OUT[noXxd]='xxd is not installed.'
;;
esac
}
declare -A OUT
getTranslation
getParams $*
checkValues
tr -d - <<<$sn|rev|fold -w2|rev|xxd -r -p|2>/dev/null dd of=$device bs=1 seek=$seek count=$length
if [ "$?" = 0 ];then
printf "${OUT[changed]}\n" $prevSN $sn
else
echo "${OUT[undefined]}"
fi
# ERRORCODES
# 1: undefined error
# 2: No Device specified
# 3: Multiple Serials specified
# 4: Wrong Filesystem
# 5: No Serialnumber specifies
# 6: Wrong serial number format
# 7: No sudo privilegs
# 8: Device is mounted
# 9: Unknown Parameter
# 10: Not a Blockdevice
# 11: Serial numbers are equal
# 12: Mutiple Devices specified
# 13: xxd not installed