#!/usr/bin/sh
set -eu

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

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

mkdir -p "$dir"

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
    }
}
' "$@" > "$out"

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

cat "$out"

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