Newer
Older
m5scp2_exp / __admin / linux_install_esptool.sh
@motoki miura motoki miura 1 day ago 3 KB d
#!/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