#!/bin/bash # NFC 生產工具 - Linux 安裝腳本 # 適用於 Ubuntu/Debian/CentOS/RHEL set -e # 顏色定義 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 日誌函數 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" } # 檢測作業系統 detect_os() { if [[ -f /etc/os-release ]]; then . /etc/os-release OS=$NAME VER=$VERSION_ID else log_error "無法檢測作業系統" exit 1 fi log_info "檢測到作業系統: $OS $VER" } # 安裝系統依賴 install_system_deps() { log_info "安裝系統依賴套件..." case $OS in *"Ubuntu"*|*"Debian"*) sudo apt update sudo apt install -y python3 python3-pip python3-venv gcc make curl wget ;; *"CentOS"*|*"Red Hat"*|*"Rocky"*|*"AlmaLinux"*) sudo yum update -y sudo yum install -y python3 python3-pip gcc make curl wget ;; *) log_error "不支援的作業系統: $OS" exit 1 ;; esac log_success "系統依賴安裝完成" } # 設定 USB 權限 setup_usb_permissions() { log_info "設定 USB 裝置權限..." # 創建 udev 規則 sudo tee /etc/udev/rules.d/99-ufr.rules << EOF # uFR NFC 讀卡機權限規則 SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666" SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="0666" SUBSYSTEM=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", MODE="0666" EOF # 重新載入 udev 規則 sudo udevadm control --reload-rules sudo udevadm trigger # 將使用者加入 dialout 群組 if ! groups $USER | grep -q dialout; then sudo usermod -a -G dialout $USER log_info "已將使用者 $USER 加入 dialout 群組" log_warning "請重新登入以套用群組變更" fi log_success "USB 權限設定完成" } # 設定 Python 虛擬環境 setup_python_env() { log_info "設定 Python 虛擬環境..." # 檢查 Python 版本 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 # 如果虛擬環境已存在但損壞,先刪除 if [[ -d "myenv" ]]; then log_warning "發現現有虛擬環境,正在重新創建..." rm -rf myenv fi # 創建虛擬環境 python3 -m venv myenv log_success "Python 虛擬環境創建完成" # 啟動虛擬環境並安裝依賴 source myenv/bin/activate # 確保 pip 是最新版本 log_info "升級 pip..." python -m pip install --upgrade pip # 安裝依賴套件 log_info "安裝 Python 套件..." pip install -r requirements.txt log_success "Python 環境設定完成" } # 設定檔案權限 setup_file_permissions() { log_info "設定檔案權限..." # 設定執行權限 chmod +x start.sh chmod +x install.sh if [[ -f "linux64_release/nt4h_c_example" ]]; then chmod +x linux64_release/nt4h_c_example fi if [[ -f "linux64_release/libnt4h_c.so" ]]; then chmod +x linux64_release/libnt4h_c.so fi # 設定設定檔權限 if [[ -f "linux64_release/keys.txt" ]]; then chmod 666 linux64_release/keys.txt fi if [[ -f "linux64_release/urls.txt" ]]; then chmod 666 linux64_release/urls.txt fi log_success "檔案權限設定完成" } # 創建 systemd 服務(可選) create_systemd_service() { # 檢查並刪除現有的 NFCapp.service if [[ -f "/etc/systemd/system/NFCapp.service" ]]; then log_warning "發現現有的 NFCapp.service,正在刪除..." sudo systemctl stop NFCapp.service 2>/dev/null || true sudo systemctl disable NFCapp.service 2>/dev/null || true sudo rm -f /etc/systemd/system/NFCapp.service sudo systemctl daemon-reload log_success "現有的 NFCapp.service 已刪除" fi read -p "是否要創建 systemd 服務?(y/N): " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then log_info "創建 systemd 服務..." # 獲取當前目錄的絕對路徑 CURRENT_DIR=$(pwd) sudo tee /etc/systemd/system/NFCapp.service << EOF [Unit] Description=NFC App After=network.target [Service] Type=simple User=digitalent WorkingDirectory=/home/digitalent/ufr_zero ExecStart=/home/digitalent/ufr_zero/myenv/bin/python /home/digitalent/ufr_zero/app.py Restart=always [Install] WantedBy=multi-user.target EOF # 重新載入 systemd sudo systemctl daemon-reload log_success "systemd 服務創建完成" log_info "使用以下命令管理服務:" echo " 啟動服務: sudo systemctl start NFCapp.service" echo " 停止服務: sudo systemctl stop NFCapp.service" echo " 啟用開機自啟: sudo systemctl enable NFCapp.service" echo " 查看狀態: sudo systemctl status NFCapp.service" echo " 查看日誌: sudo journalctl -u NFCapp.service -f" fi } # 顯示安裝完成資訊 show_completion_info() { echo log_success "=== NFC 生產工具安裝完成 ===" echo log_info "安裝位置: $(pwd)" log_info "Python 虛擬環境: myenv/" echo log_info "啟動方式:" echo " 1. 直接啟動: ./start.sh" echo " 2. 背景執行: nohup ./start.sh > app.log 2>&1 &" echo " 3. systemd 服務: sudo systemctl start nfc-web.service" echo log_info "Web 介面: http://localhost:5000" echo log_info "重要提醒:" echo " - 請確保 uFR NFC 讀卡機已正確連接" echo " - 檢查 keys.txt 和 urls.txt 檔案內容" echo " - 設定 API URL 以啟用資料庫上傳功能" echo log_warning "如果重新登入後仍有 USB 權限問題,請執行:" echo " sudo udevadm control --reload-rules" echo " sudo udevadm trigger" echo } # 主安裝流程 main() { echo "==========================================" echo " NFC 生產工具 - Linux 安裝腳本" echo "==========================================" echo # 檢查是否為 root 使用者 if [[ $EUID -eq 0 ]]; then log_error "請勿使用 root 使用者執行此腳本" exit 1 fi # 檢查必要檔案 if [[ ! -f "app.py" ]] || [[ ! -f "requirements.txt" ]]; then log_error "請在專案根目錄執行此腳本" exit 1 fi # 執行安裝步驟 detect_os install_system_deps setup_usb_permissions setup_python_env setup_file_permissions create_systemd_service # 顯示完成資訊 show_completion_info } # 執行主函數 main "$@"