#!/usr/bin/sh
set -eu

[ "$(id -u)" -eq 0 ] || { echo "must be run as root" >&2; exit 1; }

[ "$#" -ge 3 ] || { echo "usage: $0 NAME DEV1 DEV2..." >&2; exit 1; }

name="$1"; shift
chunk="${CHUNK_SECTORS:-256}"
dist="/etc/device-mapper/$name.table"

[ ! -e "$dist" ] || { echo "$name.table already exists" >&2; exit 1; }

awk -v chunk="$chunk" '
BEGIN {
    for (i = 1; i < ARGC; i++) {
        dev[i] = ARGV[i]
        cmd = "blockdev --getsz " dev[i]
        cmd | getline sz[i]
        close(cmd)
        sz[i] = int(sz[i] / chunk) * chunk
        used[i] = 0
    }

    ndev = ARGC - 1
    ARGC = 1
    pos = 0

    while (1) {
        n = 0
        min = 0

        for (i = 1; i <= ndev; i++) {
            if (sz[i] > used[i]) {
                r = sz[i] - used[i]
                n++
                if (min == 0 || r < min) min = r
            }
        }

        if (n == 0) break

        if (n == 1) {
            for (i = 1; i <= ndev; i++) {
                if (sz[i] > used[i]) {
                    r = int((sz[i] - used[i]) / chunk) * chunk
                    if (r > 0)
                        print pos, r, "linear", dev[i], used[i]
                    break
                }
            }
            break
        }

        per = int(min / chunk) * chunk
        if (per <= 0) break

        len = per * n
        line = pos " " len " striped " n " " chunk

        for (i = 1; i <= ndev; i++) {
            if (sz[i] > used[i]) {
                line = line " " dev[i] " " used[i]
                used[i] += per
            }
        }

        print line
        pos += len
    }
}
' "$@" > "$dist"

[ -s "$dist" ] || { echo "empty table" >&2; rm -f "$dist"; exit 1; }

cat "$dist"

/usr/bin/systemctl daemon-reload
/usr/bin/systemctl enable --now "device-mapper@$name.service"
