#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# Debian 用インストールスクリプト
# - python3 / pip3 が無ければ apt でインストール
# - esptool が無ければ pip3 でインストール(rootならシステム、そうでなければ sudo 又は --user)
# - 非対話的、冪等(既にインストールされていれば何もしない)
SUDO=""
if [ "$(id -u)" -ne 0 ]; then
if command -v sudo >/dev/null 2>&1; then
SUDO="sudo"
else
SUDO=""
fi
fi
need_apt_update=0
apt_update_if_needed() {
if [ $need_apt_update -eq 0 ]; then
echo "apt-get update を実行します..."
$SUDO apt-get update -y
need_apt_update=1
fi
}
install_apt_pkgs() {
apt_update_if_needed
echo "apt-get install: $*"
$SUDO DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends "$@"
}
# チェック関数
has_cmd() { command -v "$1" >/dev/null 2>&1; }
echo "チェック: python3..."
if has_cmd python3; then
echo "python3 は既にインストールされています: $(python3 --version)"
else
echo "python3 が見つかりません。インストールします。"
install_apt_pkgs python3
fi
echo "チェック: pip3..."
if has_cmd pip3; then
echo "pip3 は既にある: $(pip3 --version)"
else
echo "pip3 が見つかりません。まず python3 の distutils/ensurepip を試します..."
# ensurepip が使えるか試す
if python3 -m ensurepip --help >/dev/null 2>&1; then
echo "python3 -m ensurepip を実行します..."
$SUDO python3 -m ensurepip --upgrade || true
# ensurepip だけだと pip コマンドへの PATH が通らない場合があるので python -m pip を使って確認
fi
if has_cmd pip3; then
echo "ensurepip により pip3 が利用可能になりました: $(pip3 --version)"
else
echo "apt から python3-pip をインストールします (Debian の推奨方法)..."
install_apt_pkgs python3-pip python3-venv python3-distutils || install_apt_pkgs python3-pip
fi
fi
# 既に esptool があるか(esptool または esptool.py)
echo "チェック: esptool..."
if has_cmd esptool || has_cmd esptool.py; then
echo "esptool は既にインストールされています:"
if has_cmd esptool; then esptool version || true; fi
if has_cmd esptool.py; then esptool.py version || true; fi
echo "終了します。"
exit 0
fi
# esptool を pip3 でインストールする
echo "esptool が見つかりません。pip3 でインストールします..."
# pip3 がシステムにあることを前提にする(上で確保済み)
# root ならシステムインストール、root でなく sudo ありなら sudo pip3、どちらもなければ --user
if [ "$(id -u)" -eq 0 ]; then
PIP_CMD="pip3 install --upgrade"
elif [ -n "$SUDO" ]; then
PIP_CMD="$SUDO pip3 install --upgrade"
else
PIP_CMD="pip3 install --user --upgrade"
fi
echo "実行: $PIP_CMD esptool"
# pip のアップグレード(安全のため)
# ただし --user と sudo の併用は避ける
if [ "$(id -u)" -eq 0 ] || [ -n "$SUDO" ]; then
$PIP_CMD pip setuptools wheel >/dev/null || true
fi
$PIP_CMD esptool
# インストール後の検証
if has_cmd esptool || has_cmd esptool.py; then
echo "esptool のインストールに成功しました:"
if has_cmd esptool; then esptool version || true; fi
if has_cmd esptool.py; then esptool.py version || true; fi
# 非 root で --user インストールした場合、~/.local/bin を PATH に含める必要がある
if ! has_cmd esptool && ! has_cmd esptool.py && [ -d "${HOME}/.local/bin" ]; then
echo ""
echo "注意: esptool は ${HOME}/.local/bin にインストールされました。"
echo "PATH に追加するには次を実行してください(bash/zsh の場合):"
echo ' export PATH="$HOME/.local/bin:$PATH"'
fi
exit 0
else
echo "エラー: esptool のインストールに失敗しました。" >&2
exit 2
fi