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