265 lines
6.9 KiB
Bash
265 lines
6.9 KiB
Bash
#!/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 "$@"
|