#!/bin/bash
echo "start"
USERNAME="11111111"
PASSWORD="mypassword2"
token=$(echo -n "11111111:mypassword2" | base64)
JSON=$(curl -X POST -H "Authorization: Basic ${token}" -H "Content-Type: application/json" --insecure "${JSS_URL}/uapi/auth/tokens")
TOKEN=$(echo "${JSON}" | jq -r '.token')
echo $TOKEN
echo "step 1:."
# 获取所有电脑的 JSON数据,并提取出我们关心的字段:id, name, serialNumber
ALL_COMPUTERS_JSON=$(curl -X GET -H "Authorization: Bearer ${TOKEN}" -H "Accept: application/json" "${JSS_URL}/JSSResource/computers/subset/basic")
echo "ALL"
echo "${ALL_COMPUTERS_JSON}"
# 使用 jq 创建一个简单的 ID-名称 映射表,方便后续查找
echo $ALL_COMPUTERS_JSON | jq -r '.computers[] | [.id, .name, .serialNumber] | @csv' > /tmp/all_computers.csv
echo "获取成功!所有电脑列表已保存到 /tmp/all_computers.csv"
echo "step 2 :获取已分组电脑列表..."
# 获取所有电脑群的ID和名称
#ALL_GROUPS_JSON=$(curl -s -u "$USERNAME:$PASSWORD" -H "Accept: application/json" "${JSS_URL}/JSSResource/computergroups")
ALL_GROUPS_JSON=$(curl -X GET -H "Authorization: Bearer ${TOKEN}" -H "Accept: application/json" "${JSS_URL}/JSSResource/computergroups")
# 提取出所有静态组的ID (注意:智能组 type: "smart", 静态组 type: "static")
STATIC_GROUP_IDS=$(echo $ALL_GROUPS_JSON | jq -r '.computer_groups[] | select(.is_smart == false) | .id')
echo "开始遍历所有静态组,收集已分配的电脑ID..."
# 创建一个空文件来存储所有已分组电脑的ID
GROUPED_IDS_FILE="/tmp/grouped_computer_ids.txt"
> $GROUPED_IDS_FILE # 清空文件
for GROUP_ID in $STATIC_GROUP_IDS; do
echo "正在处理组ID: $GROUP_ID"
# 获取特定组的详细信息
#GROUP_JSON=$(curl -s -u "$USERNAME:$PASSWORD" -H "Accept: application/json" "${JSS_URL}/JSSResource/computergroups/id/${GROUP_ID}")
GROUP_JSON=$(curl -X GET -H "Authorization: Bearer ${TOKEN}" -H "Accept: application/json" "${JSS_URL}/JSSResource/computergroups/id/${GROUP_ID}")
# 提取这个组里所有电脑的ID,并追加到文件中
echo $GROUP_JSON | jq -r '.computer_group.computers[]?.id' >> $GROUPED_IDS_FILE
done
# 对收集到的所有ID进行排序和去重(因为一台电脑可以在多个组里)
sort -u $GROUPED_IDS_FILE -o $GROUPED_IDS_FILE
echo "已收集所有已分组电脑ID(已去重),保存到 $GROUPED_IDS_FILE"
echo "step 3 :对比找出未分组的电脑..."
# 从所有电脑列表中提取出ID
ALL_IDS_FILE="/tmp/all_computer_ids.txt"
echo $ALL_COMPUTERS_JSON | jq -r '.computers[].id' | sort > $ALL_IDS_FILE
# 使用 grep 找出在 ALL_IDS_FILE 中但不在 GROUPED_IDS_FILE 中的行
# 即:未分组的电脑ID
UNGROUPED_IDS_FILE="/tmp/ungrouped_computer_ids.txt"
grep -v -F -f $GROUPED_IDS_FILE $ALL_IDS_FILE > $UNGROUPED_IDS_FILE
echo "对比完成!"
echo "step 4 :生成最终报告..."
FINAL_REPORT="/tmp/ungrouped_computers_report.csv"
echo "电脑ID,电脑名称,序列号" > $FINAL_REPORT # CSV 表头
# 读取未分组电脑ID文件,逐行处理
while read -r COMPUTER_ID; do
# 从第一步生成的详细列表中查找这个ID对应的信息
grep "^$COMPUTER_ID," /tmp/all_computers.csv >> $FINAL_REPORT
done < "$UNGROUPED_IDS_FILE"
echo "================================"
echo "报告生成完毕!!"
echo "未分组的电脑总数为: $(wc -l < $UNGROUPED_IDS_FILE)"
echo "详细报告请见: $FINAL_REPORT"
echo "================================"