BrianChuan commited on
Commit
51f323f
·
1 Parent(s): 3640a66

logger dataset setup

Browse files
Files changed (2) hide show
  1. app.py +19 -1
  2. logger_service.py +59 -0
app.py CHANGED
@@ -4,6 +4,7 @@ import pandas as pd
4
  import joblib
5
  from sklearn.cluster import HDBSCAN
6
  import numpy as np
 
7
 
8
  # --- 1. 載入模型與歷史資料 (實現動態 Rule 的關鍵) ---
9
  try:
@@ -35,7 +36,7 @@ USER_DB = {
35
  "sysadmin": ["1234", "系統管理員", "管理員"]
36
  }
37
 
38
- log_history = []
39
 
40
  # --- 3. 核心邏輯與真實 HDBSCAN 異常偵測 ---
41
  def check_anomaly(ip, action, log_time):
@@ -74,6 +75,7 @@ def check_anomaly(ip, action, log_time):
74
  return "⚠️異常_未知特徵"
75
 
76
  def record_log(ip, cookie, account, role, action, status, time_mode, custom_time):
 
77
  # 決定紀錄的時間
78
  if time_mode == "自訂時間 (模擬過去/未來)" and custom_time.strip() != "":
79
  log_time = custom_time
@@ -96,6 +98,22 @@ def record_log(ip, cookie, account, role, action, status, time_mode, custom_time
96
  "action": action,
97
  "status": status
98
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  log_history.insert(0, new_log)
100
  return pd.DataFrame(log_history)
101
 
 
4
  import joblib
5
  from sklearn.cluster import HDBSCAN
6
  import numpy as np
7
+ import logger_service
8
 
9
  # --- 1. 載入模型與歷史資料 (實現動態 Rule 的關鍵) ---
10
  try:
 
36
  "sysadmin": ["1234", "系統管理員", "管理員"]
37
  }
38
 
39
+ log_history = baseline_df.sort_values(by='timestamp', ascending=False).head(20).to_dict('records')
40
 
41
  # --- 3. 核心邏輯與真實 HDBSCAN 異常偵測 ---
42
  def check_anomaly(ip, action, log_time):
 
75
  return "⚠️異常_未知特徵"
76
 
77
  def record_log(ip, cookie, account, role, action, status, time_mode, custom_time):
78
+ global baseline_X, log_history
79
  # 決定紀錄的時間
80
  if time_mode == "自訂時間 (模擬過去/未來)" and custom_time.strip() != "":
81
  log_time = custom_time
 
98
  "action": action,
99
  "status": status
100
  }
101
+
102
+ try:
103
+ # 將新行為轉為特徵數值
104
+ new_hour = pd.to_datetime(log_time).hour
105
+ new_ip_code = le_ip.transform([ip])[0]
106
+ new_action_code = le_action.transform([action])[0]
107
+ new_feature = np.array([[new_hour, new_ip_code, new_action_code]])
108
+
109
+ # 🌟 把新特徵壓入全域矩陣中
110
+ baseline_X = np.vstack((baseline_X, new_feature))
111
+ except Exception as e:
112
+ print(f"⚠️ AI 矩陣更新跳過 (可能是未知特徵): {e}")
113
+
114
+ # 呼叫外部 Service 進行存檔與上傳
115
+ logger_service.push_new_log(new_log)
116
+
117
  log_history.insert(0, new_log)
118
  return pd.DataFrame(log_history)
119
 
logger_service.py ADDED
@@ -0,0 +1,59 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pandas as pd
3
+ from huggingface_hub import hf_hub_download, upload_file, login
4
+
5
+ # --- 配置區 ---
6
+ DATASET_REPO_ID = "My-Project-Team/Digital-Bodyguard-Dataset"
7
+ CSV_FILENAME = "baseline_logs.csv"
8
+ HF_TOKEN = os.getenv("HF_TOKEN")
9
+
10
+ if HF_TOKEN:
11
+ login(token=HF_TOKEN)
12
+
13
+ def sync_from_hf():
14
+ """從雲端下載最新的 CSV 並回傳 DataFrame"""
15
+ try:
16
+ path = hf_hub_download(
17
+ repo_id=DATASET_REPO_ID,
18
+ filename=CSV_FILENAME,
19
+ repo_type="dataset",
20
+ token=HF_TOKEN
21
+ )
22
+ return pd.read_csv(path)
23
+ except Exception as e:
24
+ print(f"⚠️ 無法下載資料,建立新表: {e}")
25
+ return pd.DataFrame(columns=["timestamp", "ip_address", "cookie_id", "account", "role", "action", "status"])
26
+
27
+ def upload_to_hf():
28
+ """將本地的 CSV 檔案同步回雲端"""
29
+ try:
30
+ upload_file(
31
+ path_or_fileobj=CSV_FILENAME,
32
+ path_in_repo=CSV_FILENAME,
33
+ repo_id=DATASET_REPO_ID,
34
+ repo_type="dataset",
35
+ token=HF_TOKEN,
36
+ commit_message="System auto-log update"
37
+ )
38
+ return True
39
+ except Exception as e:
40
+ print(f"❌ 雲端同步失敗: {e}")
41
+ return False
42
+
43
+ def push_new_log(new_log_dict):
44
+ """
45
+ 接收一個字典格式的紀錄,執行:
46
+ 1. 抓取最新雲端資料 2. 合併新紀錄 3. 儲存本地 4. 上傳雲端
47
+ """
48
+ # 1. 取得最新資料
49
+ current_df = sync_from_hf()
50
+
51
+ # 2. 加入新紀錄
52
+ new_entry = pd.DataFrame([new_log_dict])
53
+ updated_df = pd.concat([current_df, new_entry], ignore_index=True)
54
+
55
+ # 3. 儲存至本地 (暫存)
56
+ updated_df.to_csv(CSV_FILENAME, index=False)
57
+
58
+ # 4. 同步回 Dataset
59
+ return upload_to_hf()