#!/bin/bash # NFC 生產工具啟動腳本 # 適用於 Linux 環境 set -e # 遇到錯誤立即退出 # 顏色定義 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 日誌函數 log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 檢查是否在正確的目錄 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" log_info "NFC 生產工具啟動中..." log_info "工作目錄: $(pwd)" # 檢查必要檔案 check_files() { local missing_files=() if [[ ! -f "app.py" ]]; then missing_files+=("app.py") fi if [[ ! -f "requirements.txt" ]]; then missing_files+=("requirements.txt") fi if [[ ! -d "linux64_release" ]]; then missing_files+=("linux64_release/") fi if [[ ! -f "linux64_release/nt4h_c_example" ]]; then missing_files+=("linux64_release/nt4h_c_example") fi if [[ ${#missing_files[@]} -gt 0 ]]; then log_error "缺少必要檔案:" for file in "${missing_files[@]}"; do echo " - $file" done exit 1 fi } # 檢查 Python 環境 check_python() { if ! command -v python3 &> /dev/null; then log_error "Python3 未安裝,請先安裝 Python3" exit 1 fi local python_version=$(python3 --version | cut -d' ' -f2) log_info "Python 版本: $python_version" # 檢查版本是否 >= 3.7 if ! python3 -c "import sys; exit(0 if sys.version_info >= (3, 7) else 1)" 2>/dev/null; then log_error "需要 Python 3.7 或以上版本" exit 1 fi } # 設定虛擬環境 setup_venv() { if [[ ! -d "myenv" ]]; then log_info "創建 Python 虛擬環境..." python3 -m venv myenv log_success "虛擬環境創建完成" fi log_info "啟動虛擬環境..." source myenv/bin/activate # 檢查是否需要安裝依賴 if [[ ! -f "myenv/pyvenv.cfg" ]] || [[ ! -d "myenv/lib" ]]; then log_error "虛擬環境損壞,請刪除 myenv 目錄後重新執行" exit 1 fi # 安裝或更新依賴 log_info "檢查 Python 依賴套件..." pip install --upgrade pip pip install -r requirements.txt log_success "依賴套件安裝完成" } # 檢查 USB 權限 check_usb_permissions() { log_info "檢查 USB 裝置權限..." # 檢查 udev 規則是否存在 if [[ ! -f "/etc/udev/rules.d/99-ufr.rules" ]]; then log_warning "未找到 uFR udev 規則,可能無法存取 USB 裝置" log_info "建議執行以下命令設定 USB 權限:" echo "sudo tee /etc/udev/rules.d/99-ufr.rules << EOF" echo "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6001\", MODE=\"0666\"" echo "SUBSYSTEM==\"usb\", ATTRS{idVendor}==\"0403\", ATTRS{idProduct}==\"6014\", MODE=\"0666\"" echo "EOF" echo "sudo udevadm control --reload-rules" echo "sudo udevadm trigger" fi # 檢查當前使用者是否在 dialout 群組 if ! groups | grep -q dialout; then log_warning "當前使用者不在 dialout 群組中" log_info "建議執行:sudo usermod -a -G dialout \$USER" fi } # 設定檔案權限 set_permissions() { log_info "設定檔案權限..." chmod +x linux64_release/nt4h_c_example 2>/dev/null || true chmod +x linux64_release/libnt4h_c.so 2>/dev/null || true # 設定設定檔權限 if [[ -f "linux64_release/keys.txt" ]]; then chmod 666 linux64_release/keys.txt 2>/dev/null || true fi if [[ -f "linux64_release/urls.txt" ]]; then chmod 666 linux64_release/urls.txt 2>/dev/null || true fi log_success "權限設定完成" } # 檢查網路端口 check_port() { local port=5000 if netstat -tuln 2>/dev/null | grep -q ":$port "; then log_warning "端口 $port 已被佔用" log_info "請檢查是否有其他實例正在執行" return 1 fi log_success "端口 $port 可用" return 0 } # 顯示啟動資訊 show_startup_info() { echo log_success "=== NFC 生產工具啟動成功 ===" echo log_info "Web 介面: http://localhost:5000" log_info "按 Ctrl+C 停止服務" echo log_info "系統資訊:" echo " - 作業系統: $(uname -s) $(uname -r)" echo " - 架構: $(uname -m)" echo " - Python: $(python3 --version)" echo " - 工作目錄: $(pwd)" echo } # 主執行流程 main() { echo "==========================================" echo " NFC 生產工具 - Linux 啟動腳本" echo "==========================================" echo # 執行檢查 check_files check_python setup_venv check_usb_permissions set_permissions # 檢查端口 if ! check_port; then log_error "無法啟動服務,端口被佔用" exit 1 fi # 顯示啟動資訊 show_startup_info # 啟動 Flask 應用程式 log_info "啟動 Flask 應用程式..." python app.py } # 執行主函數 main "$@"