Network Topology (Net3D) Full Example Scripts by Language
Full example scripts for collecting and submitting GIIP Network Topology (Net3D) data in PowerShell, Bash, and Python. For the API request specification (endpoints and field descriptions), see the main guide first.
1. PowerShell (Windows)
# Configuration
$AT = "YOUR_SECRET_KEY"
$API_URL = "https://your-api.azurewebsites.net/api/giipApi"
# Step 1: Server Registration (AgentAutoRegister) — Obtain LSSN
$discoveryData = @{
hostname = $env:COMPUTERNAME
os = (Get-CimInstance Win32_OperatingSystem).Caption
cpu_cores = (Get-CimInstance Win32_Processor).NumberOfLogicalProcessors
ipv4_local = (Get-NetIPAddress -AddressFamily IPv4 |
Where-Object { $_.IPAddress -ne '127.0.0.1' } |
Select-Object -First 1).IPAddress
} | ConvertTo-Json -Compress
$regBody = @{
token = $AT
text = "AgentAutoRegister"
jsondata = $discoveryData
}
$resp = Invoke-RestMethod -Uri "$API_URL`?cmd=AgentAutoRegister" `
-Method Post -ContentType "application/x-www-form-urlencoded" -Body $regBody
$lssn = $resp.lssn
Write-Host "Registered. LSSN: $lssn"
# Step 2: netstat KVSPut
$connections = Get-NetTCPConnection -State Established | Select-Object -First 100 | ForEach-Object {
@{
remote_ip = $_.RemoteAddress
remote_port = $_.RemotePort
state = "ESTABLISHED"
process_name = (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName
}
}
$netstatPayload = @{
kType = "lssn"
kKey = "$lssn"
kFactor = "netstat"
kValue = $connections
} | ConvertTo-Json -Compress -Depth 10
$putBody = @{
token = $AT
text = "KVSPut kType kKey kFactor"
jsondata = $netstatPayload
}
$r2 = Invoke-RestMethod -Uri $API_URL -Method Post `
-ContentType "application/x-www-form-urlencoded" -Body $putBody
Write-Host "netstat result: $($r2.RstMsg)"
# Step 3: db_connections KVSPut
$dbPayload = @{
kType = "lssn"
kKey = "$lssn"
kFactor = "db_connections"
kValue = @(
@{
client_net_address = "10.0.0.5"
program_name = "MyApp.exe"
cpu_load = 15
last_sql = "SELECT * FROM users WHERE id = 1"
query_hash = "0xAB12CD34"
}
)
} | ConvertTo-Json -Compress -Depth 10
$putBody2 = @{
token = $AT
text = "KVSPut kType kKey kFactor"
jsondata = $dbPayload
}
$r3 = Invoke-RestMethod -Uri $API_URL -Method Post `
-ContentType "application/x-www-form-urlencoded" -Body $putBody2
Write-Host "db_connections result: $($r3.RstMsg)"
2. Bash Shell (Linux)
#!/bin/bash
AT="YOUR_SECRET_KEY"
API_URL="https://your-api.azurewebsites.net/api/giipApi"
# Step 1: Server Registration (AgentAutoRegister) — Obtain LSSN
JSON_DATA=$(cat <<EOF
{
"hostname": "$(hostname)",
"os": "$(grep PRETTY_NAME /etc/os-release | cut -d'"' -f2)",
"cpu_cores": $(nproc),
"ipv4_local": "$(hostname -I | awk '{print $1}')"
}
EOF
)
RESP=$(curl -s -X POST "$API_URL?cmd=AgentAutoRegister" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "token=$AT" \
--data-urlencode "text=AgentAutoRegister" \
--data-urlencode "jsondata=$JSON_DATA")
LSSN=$(echo "$RESP" | jq -r '.lssn')
echo "Registered. LSSN: $LSSN"
# Step 2: netstat KVSPut
CONNS=$(ss -tunp | awk '/ESTAB/{
split($5,a,":");
split($6,b,":");
printf "{\"remote_ip\":\"%s\",\"remote_port\":%s,\"process_name\":\"unknown\",\"state\":\"ESTABLISHED\"}",a[1],a[2]
}' | paste -sd,)
NETSTAT_PAYLOAD=$(cat <<EOF
{
"kType": "lssn",
"kKey": "$LSSN",
"kFactor": "netstat",
"kValue": [$CONNS]
}
EOF
)
RESP2=$(curl -s -X POST "$API_URL" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "token=$AT" \
--data-urlencode "text=KVSPut kType kKey kFactor" \
--data-urlencode "jsondata=$NETSTAT_PAYLOAD")
echo "netstat result: $(echo "$RESP2" | jq -r '.RstMsg')"
# Step 3: db_connections KVSPut
DB_PAYLOAD=$(cat <<EOF
{
"kType": "lssn",
"kKey": "$LSSN",
"kFactor": "db_connections",
"kValue": [
{
"client_net_address": "10.0.0.5",
"program_name": "MyApp",
"cpu_load": 15,
"last_sql": "SELECT * FROM users WHERE id = 1",
"query_hash": "0xAB12CD34"
}
]
}
EOF
)
RESP3=$(curl -s -X POST "$API_URL" \
-H "Content-Type: application/x-www-form-urlencoded" \
--data-urlencode "token=$AT" \
--data-urlencode "text=KVSPut kType kKey kFactor" \
--data-urlencode "jsondata=$DB_PAYLOAD")
echo "db_connections result: $(echo "$RESP3" | jq -r '.RstMsg')"
3. Python (Cross-platform)
import json
import platform
import socket
import urllib.parse
import urllib.request
AT = "YOUR_SECRET_KEY"
BASE_URL = "https://your-api.azurewebsites.net/api/giipApi"
def api_post(url, fields):
payload = urllib.parse.urlencode(fields).encode("utf-8")
req = urllib.request.Request(
url,
data=payload,
headers={"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"},
)
with urllib.request.urlopen(req) as f:
return json.loads(f.read().decode("utf-8"))
# Step 1: Server Registration (AgentAutoRegister) — Obtain LSSN
registration_data = {
"hostname": socket.gethostname(),
"os": platform.platform(),
"cpu_cores": 8,
"ipv4_local": socket.gethostbyname(socket.gethostname()),
}
resp = api_post(
f"{BASE_URL}?cmd=AgentAutoRegister",
{
"token": AT,
"text": "AgentAutoRegister",
"jsondata": json.dumps(registration_data),
},
)
lssn = resp.get("lssn")
print(f"Registered. LSSN: {lssn}")
# Step 2: netstat KVSPut
netstat_payload = {
"kType": "lssn",
"kKey": str(lssn),
"kFactor": "netstat",
"kValue": [
{
"remote_ip": "10.0.0.10",
"remote_port": 8080,
"state": "ESTABLISHED",
"process_name": "myapp",
}
],
}
resp2 = api_post(
BASE_URL,
{
"token": AT,
"text": "KVSPut kType kKey kFactor",
"jsondata": json.dumps(netstat_payload),
},
)
print(f"netstat result: {resp2.get('RstMsg')}")
# Step 3: db_connections KVSPut
db_payload = {
"kType": "lssn",
"kKey": str(lssn),
"kFactor": "db_connections",
"kValue": [
{
"client_net_address": "10.0.0.5",
"program_name": "MyApp.exe",
"cpu_load": 15,
"last_sql": "SELECT * FROM users WHERE id = 1",
"query_hash": "0xAB12CD34",
}
],
}
resp3 = api_post(
BASE_URL,
{
"token": AT,
"text": "KVSPut kType kKey kFactor",
"jsondata": json.dumps(db_payload),
},
)
print(f"db_connections result: {resp3.get('RstMsg')}")