-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy patheval_machine.sh
More file actions
executable file
·141 lines (121 loc) · 5.08 KB
/
Copy patheval_machine.sh
File metadata and controls
executable file
·141 lines (121 loc) · 5.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#!/usr/bin/env bash
mongo_container() {
docker ps --format '{{.Names}} {{.Image}}' 2>/dev/null \
| grep -i 'mongo' | head -1 | awk '{print $1}'
}
app_container() {
docker ps --format '{{.Names}} {{.Ports}}' 2>/dev/null \
| grep '0\.0\.0\.0:80->' | head -1 | awk '{print $1}'
}
result() {
echo "$1:$2"
}
# 01
if command -v docker &>/dev/null; then result CHECK_01 PASS; else result CHECK_01 FAIL; fi
# 02
if systemctl is-active --quiet docker 2>/dev/null || docker info &>/dev/null; then
result CHECK_02 PASS
else
result CHECK_02 FAIL
fi
# 03
apt-get update -qq 2>/dev/null
UPGRADABLE=$(apt-get -s upgrade 2>/dev/null | grep -c '^Inst' || true)
if [ "$UPGRADABLE" -eq 0 ]; then result CHECK_03 PASS; else result CHECK_03 FAIL; fi
# 04
CONTAINER_COUNT=$(docker ps -q 2>/dev/null | wc -l | tr -d ' ')
if [ "$CONTAINER_COUNT" -eq 2 ]; then result CHECK_04 PASS; else result CHECK_04 FAIL; fi
# 05
MONGO_CTR=$(mongo_container)
if [ -n "$MONGO_CTR" ]; then result CHECK_05 PASS; else result CHECK_05 FAIL; fi
# 06
APP_CTR=$(app_container)
if [ -n "$APP_CTR" ]; then result CHECK_06 PASS; else result CHECK_06 FAIL; fi
# 07
HTTP_LOCAL=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 http://localhost 2>/dev/null || echo '000')
PUBLIC_IP=$(curl -s --connect-timeout 3 http://169.254.169.254/latest/meta-data/public-ipv4 2>/dev/null || echo '')
if [ -n "$PUBLIC_IP" ]; then
HTTP_PUBLIC=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 "http://${PUBLIC_IP}" 2>/dev/null || echo '000')
else
HTTP_PUBLIC="$HTTP_LOCAL"
fi
if [ "$HTTP_LOCAL" = "200" ] && [ "$HTTP_PUBLIC" = "200" ]; then result CHECK_07 PASS; else result CHECK_07 FAIL; fi
# 08
HTML_BODY=$(curl -s --connect-timeout 5 http://localhost 2>/dev/null || echo '')
if echo "$HTML_BODY" | grep -qi '/assets/index-'; then result CHECK_08 PASS; else result CHECK_08 FAIL; fi
# 09
API_STATUS=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 http://localhost/api/users 2>/dev/null || echo '000')
API_CT=$(curl -s -o /dev/null -w '%{content_type}' --connect-timeout 5 http://localhost/api/users 2>/dev/null || echo '')
if [ "$API_STATUS" = "200" ] && echo "$API_CT" | grep -qi 'application/json'; then result CHECK_09 PASS; else result CHECK_09 FAIL; fi
# 10
MONGO_CTR=$(mongo_container)
if [ -n "$MONGO_CTR" ]; then
MOUNT_TYPE=$(docker inspect "$MONGO_CTR" \
--format '{{range .Mounts}}{{if eq .Destination "/data/db"}}{{.Type}}{{end}}{{end}}' 2>/dev/null || echo '')
if [[ "$MOUNT_TYPE" == "volume" || "$MOUNT_TYPE" == "bind" ]]; then result CHECK_10 PASS; else result CHECK_10 FAIL; fi
else
result CHECK_10 FAIL
fi
# 11
UNIQUE_TAG="grader_$(date +%s)"
POST_STATUS=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 \
-X POST http://localhost/api/users \
-H 'Content-Type: application/json' \
-d "{\"name\":\"${UNIQUE_TAG}\",\"email\":\"${UNIQUE_TAG}@grader.test\"}" 2>/dev/null || echo '000')
if [[ "$POST_STATUS" =~ ^(200|201)$ ]]; then result CHECK_11 PASS; else result CHECK_11 FAIL; fi
# 12
sleep 1
GET_BODY=$(curl -s --connect-timeout 5 http://localhost/api/users 2>/dev/null || echo '')
if echo "$GET_BODY" | grep -q "$UNIQUE_TAG"; then result CHECK_12 PASS; else result CHECK_12 FAIL; fi
# 13
MONGO_CTR=$(mongo_container)
if [ -z "$MONGO_CTR" ]; then
result CHECK_13 FAIL
else
MONGO_EXPOSED=$(docker ps --format '{{.Ports}}' 2>/dev/null | grep -c '0\.0\.0\.0:27017' || true)
if [ "$MONGO_EXPOSED" -eq 0 ]; then result CHECK_13 PASS; else result CHECK_13 FAIL; fi
fi
# 14
SPA_STATUS=$(curl -s -o /dev/null -w '%{http_code}' --connect-timeout 5 http://localhost 2>/dev/null || echo '000')
SPA_BODY=$(curl -s --connect-timeout 5 http://localhost 2>/dev/null || echo '')
if [ "$SPA_STATUS" = "200" ] && echo "$SPA_BODY" | grep -qi 'id="root"'; then result CHECK_14 PASS; else result CHECK_14 FAIL; fi
# 15
APP_CTR=$(app_container)
MONGO_CTR=$(mongo_container)
if [ -n "$APP_CTR" ] && [ -n "$MONGO_CTR" ]; then
APP_NETS=$(docker inspect "$APP_CTR" \
--format '{{range $k, $v := .NetworkSettings.Networks}}{{$k}} {{end}}' 2>/dev/null \
| tr ' ' '\n' | grep -v '^$' | sort)
MONGO_NETS=$(docker inspect "$MONGO_CTR" \
--format '{{range $k, $v := .NetworkSettings.Networks}}{{$k}} {{end}}' 2>/dev/null \
| tr ' ' '\n' | grep -v '^$' | sort)
SHARED=$(comm -12 <(echo "$APP_NETS") <(echo "$MONGO_NETS") | grep -v '^bridge$' | head -1)
if [ -n "$SHARED" ]; then result CHECK_15 PASS; else result CHECK_15 FAIL; fi
else
result CHECK_15 FAIL
fi
# integrity
BASE_COMMIT="771940b4d15ae04a9999f0c4c01ca752df89e506"
LAB_START_UTC="2026-04-26 03:30:00"
REPO_PATH=""
for dir in /home/ubuntu/*/; do
if git -C "$dir" rev-parse HEAD &>/dev/null 2>&1; then
if git -C "$dir" cat-file -e "${BASE_COMMIT}^{commit}" 2>/dev/null; then
REPO_PATH="$dir"
break
fi
fi
done
if [ -z "$REPO_PATH" ]; then
result INTEGRITY NOT_FOUND
else
EARLY_COMMITS=$(git -C "$REPO_PATH" log \
${BASE_COMMIT}..HEAD \
--before="$LAB_START_UTC" \
--oneline 2>/dev/null | wc -l | tr -d ' ')
if [ "$EARLY_COMMITS" -gt 0 ]; then
result INTEGRITY "WARNING-${EARLY_COMMITS}-early-commits"
else
result INTEGRITY PASS
fi
fi