﻿#!/usr/bin/env bash
set -euo pipefail

# 1. カレントディレクトリを /root に設定
cd /root

# 2. root権限チェック
if [ "$(id -u)" -ne 0 ]; then
    echo "[ERROR] このスクリプトは root 権限で実行する必要があります。(sudo -i で実行してください)" >&2
    exit 1
fi

echo "=== パーティションマージ処理を開始します (p68 + p69) ==="

# 3. 必要なツールの確認・インストール
if ! command -v growpart &> /dev/null; then
    echo "[INFO] cloud-guest-utils (growpart) をインストールしています..."
    apt-get update -y && apt-get install -y cloud-guest-utils
fi

for cmd in rsync parted resize2fs findmnt fuser; do
    if ! command -v "$cmd" &> /dev/null; then
        echo "[ERROR] 必要なコマンド '$cmd' が見つかりません。" >&2
        exit 1
    fi
done

BACKUP_DIR="/root/home_arduino_backup"

# 4. /home/arduino データの退避
if findmnt -M "/home/arduino" > /dev/null 2>&1; then
    echo "[INFO] データを $BACKUP_DIR にバックアップ中..."
    mkdir -p "$BACKUP_DIR"
    rsync -aHAX --info=progress2 /home/arduino/ "$BACKUP_DIR/"

    # 5. /etc/fstab のバックアップと自動マウント無効化
    echo "[INFO] /etc/fstab を更新中..."
    cp /etc/fstab "/etc/fstab.bak.$(date +%Y%m%d%H%M%S)"
    sed -i '\|/home/arduino|s/^/# /' /etc/fstab
    sed -i '\|mmcblk0p69|s/^/# /' /etc/fstab

    # 6. プロセス停止とアンマウント
    echo "[INFO] /home/arduino をアンマウント中..."
    if id "arduino" &>/dev/null; then
        loginctl terminate-user arduino 2>/dev/null || true
    fi
    fuser -km /home/arduino 2>/dev/null || true
    sleep 1
    umount -l /home/arduino || true
fi

# 7. パーティション 69 (p69) の削除
echo "[INFO] パーティション 69 を削除中..."
parted -s /dev/mmcblk0 rm 69

# 8. パーティション 68 (p68) のオンライン拡張 (growpartで警告プロンプトを回避)
echo "[INFO] パーティション 68 を空き領域の末尾まで拡張中..."
growpart /dev/mmcblk0 68

# 9. ルートファイルシステム (ext4) の拡張
echo "[INFO] ルートファイルシステムを拡張中 (resize2fs)..."
resize2fs /dev/mmcblk0p68

# 10. データの書き戻しと権限復元
echo "[INFO] データを新しいルートディレクトリ (/home/arduino) へ書き戻し中..."
mkdir -p /home/arduino
rsync -aHAX "$BACKUP_DIR/" /home/arduino/
rm -rf "$BACKUP_DIR"

if id "arduino" &>/dev/null; then
    chown -R arduino:arduino /home/arduino
fi

echo "=== すべての処理が完了しました ==="
echo "拡張後のディスク容量:"
df -h /
