summaryrefslogtreecommitdiff
path: root/hdd-tree
blob: 78dda0a73449206b590abaddd11c739e680aaafc (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
#!/bin/bash

drives=$(
  find /dev -maxdepth 1 -regex '.*/sd[a-z]+'
)

raids=$(
  sed '
    1d
    s/^\(\S\+\) \+: \+\S\+ \+\(\S\+\) \+/\1 \2 /
    t
    d
  ' /proc/mdstat \
    | sed '
      s/\[\S\+]//g
      s/^\(\S\+\) \+\(\S\+\) \+\(\S\+\) \+/\1 \2 \3\n\1 \2 /
      P
      D
    ' \
    | sed '
      s,^\(\S\+ \S\+ \)\(\S\+\)$,/dev/\1/dev/\2,
    '
)

crypt_devices=$(
  find /dev -maxdepth 1 -name 'dm-*' -exec cryptsetup status {} \; \
    | grep '^\S\|^\s*device:' \
    | sed '
      /^\S\+ / {
        N
        s,^\(\S\+\) .*\n\s*device:\s*\(\S\+\)$,\1 \2,
        t
      }
      d
    '
)

drives=$(
  printf '%s\n' "${drives}"
  printf '%s\n' "${raids}" \
    | cut -d' ' -f1 \
    | sort -u
)

partitions=$(
  find /dev -maxdepth 1 \
    | grep -F "${drives}" \
    | grep -vxF "${drives}"
)

mounts=$(
  mount \
    | grep -wF "$(printf '%s\n' "${partitions}" "${drives}")" \
    | awk '{print $3 " " $1}'
)

printf 'digraph {\n'
printf 'rankdir=LR;\n'
printf '%s\n' "${drives}" \
  | sed '
    s/^.*$/"\0" [shape="trapezium"];/
  '
printf '%s\n' "${raids}" \
  | cut -d' ' -f1,2 \
  | sort -u \
  | sed '
    s/^\(\S\+\) \(\S\+\)$/"\1" [label="\1\\n(\2)", shape="box"];/
  '
printf '%s\n' "${raids}" \
  | cut -d' ' -f1,3 \
  | sed '
    s/^\(\S\+\) \(\S\+\)$/"\1" -> "\2";/
  '
printf '%s\n' "${crypt_devices}" \
  | sed '
    s/^\(\S\+\) \(\S\+\)$/"\1" -> "\2";/
  '
printf '%s\n' "${crypt_devices}" \
  | sed '
    s/^\(\S\+\) \S\+$/"\1" [shape="hexagon"];/
  '
printf '%s\n' "${partitions}" \
  | sed '
    s/^\(.*[^0-9]\)[0-9]\+$/"\0" -> "\1";/
  '
printf '%s\n' "${mounts}" \
  | sed '
    s/^\(\S\+\) \(\S\+\)$/"\1" -> "\2";/
  '
printf '}\n'