#!/usr/bin/env bash
# system/swap -- resize the swap file
set -o pipefail
SELF=$(readlink -f "${BASH_SOURCE[0]}")
NV_BASE=$(cd "$(dirname "$SELF")/../../.." && pwd)
export NV_BASE
# shellcheck source=/dev/null
. "$NV_BASE/lib/core/bootstrap.sh"

nv_require_root || exit 1

ui_header "$(t mod_sys_swap)"
ui_kv "$(t pf_hw_swap)" "$(nv_human_mb "$(nv_swap_mb)")"
ui_kv "$(t pf_hw_ram)"  "$(nv_human_mb "$(nv_mem_mb)")"
ui_blank

printf '  %s (MB, 0 = %s): ' "$(t swap_new_size)" "$(t swap_off)"
read -r size || exit 130
case $size in ''|*[!0-9]*) ui_err "$(t ui_invalid_number)"; exit 2 ;; esac

if [ "$size" -eq 0 ]; then
    swapoff /swapfile 2>/dev/null || true
    sed -i '\#^/swapfile #d' /etc/fstab
    rm -f /swapfile
    ui_ok "$(t swap_off_done)"
    exit 0
fi

cur=$(nv_swap_mb)
[ "$size" -eq "$cur" ] && { ui_info "$(t swap_unchanged)"; exit 0; }

ui_step "$(t swap_applying "$size")"
swapoff /swapfile 2>/dev/null || true
rm -f /swapfile
fallocate -l "${size}M" /swapfile 2>/dev/null || \
    dd if=/dev/zero of=/swapfile bs=1M count="$size" status=none || {
        nv_fail 6101 "cannot create /swapfile"; exit 1; }
chmod 600 /swapfile
mkswap /swapfile >/dev/null 2>&1 || { nv_fail 6102 "mkswap failed"; exit 1; }
swapon /swapfile || { nv_fail 6103 "swapon failed"; exit 1; }
grep -q '^/swapfile ' /etc/fstab || printf '/swapfile none swap sw 0 0\n' >>/etc/fstab
nv_trace swap "resized to ${size}MB"

ui_ok "$(t swap_done "$(nv_human_mb "$(nv_swap_mb)")")"
exit 0
