メニューにダイアログを表示させる「dialog」の、インストールwhich dialog || sudo apt install dialog -y
menu ファイルの作成
nano ~/.config/mc/menu
c Chown to 1000:1000 (Recursive)
TARGET="%p"
dialog --yesno "以下を再帰的に 1000:1000 に変更しますか?\n\n${TARGET}" 9 60
if [ $? -eq 0 ]; then
RESULT=$(sudo chown -R 1000:1000 "${TARGET}" 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "変更しました:\n${TARGET}" 7 60
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
fi
fi
clear
x chmod +x (実行権限付与)
TARGET="%p"
dialog --yesno "以下に実行権限(+x)を付与しますか?\n\n${TARGET}" 9 60
if [ $? -eq 0 ]; then
RESULT=$(sudo chmod +x "${TARGET}" 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "実行権限を付与しました:\n${TARGET}" 7 60
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
fi
fi
clear
H HLS管理
CHOICE=$(dialog --menu "HLS管理" 14 50 4 \
h "BS-NHK 起動(約90秒後に視聴可能)" \
o "BS-NHK 停止" \
j "BS-NHK → サブチャンネル切替" \
k "キャッシュクリア(BS-NHK 再起動)" \
3>&1 1>&2 2>&3)
case $CHOICE in
h)
RESULT=$(sudo systemctl start hls-bs1 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "HLS BS-NHKを起動しました\n約90秒後に視聴可能です" 7 45
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
fi
;;
o)
RESULT=$(sudo systemctl stop hls-bs1 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "HLS BS-NHKを停止しました" 6 40
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
fi
;;
j)
RESULT=$(sudo systemctl stop hls-bs1 2>&1; sudo systemctl start hls-bs2 2>&1)
STATUS=$?
if [ $STATUS -eq 0 ]; then
dialog --msgbox "BS-NHK⇒サブ切替が完了しました" 6 45
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
fi
;;
k)
dialog --yesno "HLS BS-NHKを再起動してキャッシュをクリアします\n視聴中の場合は約90秒切断されます。続行しますか?" 8 55
if [ $? -eq 0 ]; then
RESULT=$(sudo systemctl stop hls-bs1 2>&1)
sleep 5
RESULT2=$(sudo systemctl start hls-bs1 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "キャッシュクリア完了\n約90秒後に視聴可能になります" 7 45
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT2}" 8 60
fi
fi
;;
esac
clear
v TV予約確認
RESULT=$(curl -s "http://localhost:8888/api/reserves?limit=5&isHalfWidth=true" | python3 /mnt/data/backup/scripts/tv_reserves.py)
echo "$RESULT" | dialog --programbox "TV予約確認" 15 60
clear
p コンテナ起動確認・自動復旧
RESULT=$(/mnt/data/backup/scripts/check_containers.sh 2>&1)
echo "$RESULT" | dialog --programbox "コンテナ起動確認・自動復旧" 20 60
clear
R コンテナ再起動
CHOICE=$(dialog --menu "コンテナ再起動" 17 55 6 \
A "AdGuard Home" \
e "EPGStation(録画中チェック付)" \
m "Mirakurun + EPGStation(録画中チェック付)" \
f "vafee2-lounge" \
i "Immich" \
u "Uptime Kuma" \
3>&1 1>&2 2>&3)
case $CHOICE in
A)
RESULT=$(docker restart adguardhome 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "AdGuard Home を再起動しました\n\n${RESULT}" 8 50
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
fi
;;
e)
RECORDING=$(curl -s "http://localhost:8888/api/recording?limit=1&isHalfWidth=true" | python3 -c "import sys,json; print(json.load(sys.stdin).get('total',0))")
if [ "$RECORDING" -gt 0 ]; then
dialog --msgbox "録画中のためスキップしました" 6 40
else
RESULT=$(docker restart epgstation 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "EPGStation を再起動しました\n\n${RESULT}" 8 50
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
fi
fi
;;
m)
RECORDING=$(curl -s "http://localhost:8888/api/recording?limit=1&isHalfWidth=true" | python3 -c "import sys,json; print(json.load(sys.stdin).get('total',0))")
if [ "$RECORDING" -gt 0 ]; then
dialog --msgbox "録画中のためスキップしました" 6 40
else
RESULT=$(docker restart mirakurun 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "Mirakurun を再起動しました\n\n${RESULT}\n\n1分後にEPGStationを再起動します\n(この画面は自動で閉じます)" 10 55
sleep 60
RESULT2=$(docker restart epgstation 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "EPGStation を再起動しました\n\n${RESULT2}\n\nEPG反映まで数分かかります" 9 55
else
dialog --msgbox "EPGStation 再起動でエラーが発生しました:\n\n${RESULT2}" 8 55
fi
else
dialog --msgbox "Mirakurun 再起動でエラーが発生しました:\n\n${RESULT}" 8 55
fi
fi
;;
f)
RESULT=$(cd /mnt/data/docker/Python/vafee2_project && docker compose restart 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "lounge を再起動しました\n\n${RESULT}" 8 50
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
fi
;;
i)
RESULT=$(docker restart immich_server immich_microservices 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "immich を再起動しました\n\n${RESULT}" 8 50
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
fi
;;
u)
RESULT=$(docker restart uptime-kuma 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "Uptime Kuma を再起動しました\n\n${RESULT}" 8 50
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 50
fi
;;
esac
clear
w スワップ使用量確認
RESULT=$(free -h && echo "---" && for i in /proc/*/status; do awk '/VmSwap|Name/{printf $2 " "}' $i; echo; done | sort -k2 -rn | head -10)
echo "$RESULT" | dialog --programbox "スワップ使用量" 20 60
clear
t タスクスケジューラ
sudo crontab -e
clear
d SSDの温度計測
sudo smartctl -a -d sat /dev/sdb | grep -i -E "temp|model|serial|health" | dialog --programbox "SSD 状態" 12 60
clear
b Vaultwarden・PassManager Backup and Restore
CHOICE=$(dialog --menu "バックアップメニュー" 15 50 4 \
1 "今すぐバックアップ実行" \
2 "バックアップ一覧確認" \
3 "データ復旧" \
4 "キャンセル" \
3>&1 1>&2 2>&3)
case $CHOICE in
1)
RESULT=$(/mnt/data/backup/scripts/daily_backup.sh 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "バックアップ完了しました" 6 40
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
fi
;;
2)
RESULT=$(ls -lh /mnt/data/backup/*_backup_*.tar.gz 2>/dev/null)
echo "$RESULT" | dialog --programbox "バックアップ一覧" 20 70
;;
3)
DATE=$(dialog --inputbox "復旧する日付を入力してください\n例:20260529" 8 50 3>&1 1>&2 2>&3)
if [ -n "$DATE" ]; then
RESULT=$(/mnt/data/backup/scripts/restore.sh $DATE 2>&1)
if [ $? -eq 0 ]; then
dialog --msgbox "復旧が完了しました" 6 40
else
dialog --msgbox "エラーが発生しました:\n\n${RESULT}" 8 60
fi
fi
;;
esac
clear
S シャットダウン・再起動
CHOICE=$(dialog --menu "シャットダウン・再起動" 11 55 2 \
s "シャットダウン" \
r "再起動" \
3>&1 1>&2 2>&3)
case $CHOICE in
s)
dialog --yesno "ubuntu-sv をシャットダウンします\n録画中・HLS配信中でないか確認してください\n本当に実行しますか?" 9 55
if [ $? -eq 0 ]; then
sudo shutdown -h now
fi
;;
r)
dialog --yesno "ubuntu-sv を再起動します\n本当に実行しますか?" 7 50
if [ $? -eq 0 ]; then
sudo reboot
fi
;;
esac
clear