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
|
--
-- ~~~ fetch a pawsd service
--
-- require a name & service index to fetch
if not arg[1] or not arg[2] then
error("server name & index required")
end
-- imports
local PawSD = require("src/pawsd")
local Servers = require("src/servers")
require("src/utils")
local socket = require("socket")
local client = assert(socket.tcp())
-- get arguments & check validity
local server = Servers[arg[1]]
local index = arg[2]
if not server then
error("server not found")
end
-- connect to client
client:connect(server.host, server.port)
-- send request
local request = string.fromhex(PawSD.Magic.REQUEST .. PawSD.Version .. PawSD.Verbs.FETCH_SERVICE .. server.keyalg .. "0020" .. server.key .. index)
client:send(request)
-- print response
local response = {}
while true do
local packet, status = client:receive(1)
-- if packet then print(response) end
table.insert(response, packet)
if status == "closed" then break end
end
-- check that the response is correct
local responseMagic = extractfromresponse(response, 1, 8)
if not responseMagic == PawSD.Magic.RESPONSE then
error("invalid response")
end
-- check that the status is okay
local responseStatus = extractfromresponse(response, 11, 12)
if not responseStatus == PawSD.Responses.OK then
error("unsuccessful request")
end
-- get signature information
local responseSignatureLength = tonumber(extractfromresponse(response, 13, 14), 16)
local responseSignatureEnd = 14 + responseSignatureLength
local responseSignature = extractfromresponse(response, 15, responseSignatureEnd)
print("Signature: " .. responseSignature)
-- todo: check this?
-- get service index
local responseIndexStart = responseSignatureEnd + 1
local responseIndex = extractfromresponse(response, responseIndexStart, responseIndexStart + 1)
-- get service flags
local responseFlagsStart = responseIndexStart + 2
local responseFlags = extractfromresponse(response, responseFlagsStart, responseFlagsStart + 3)
-- get number of records
local responseRecordCountStart = responseFlagsStart + 4
local responseRecordCount = tonumber(extractfromresponse(response, responseRecordCountStart, responseRecordCountStart + 1), 16)
-- store offset
local recordOffset = responseRecordCountStart + 2
-- loop through each record
for recordNumber = 1, responseRecordCount, 1 do
print("\n--- Record Number " .. recordNumber .. " ---")
-- get number of tags
local responseTagCountStart = recordOffset
local responseTagCount = tonumber(extractfromresponse(response, responseTagCountStart, responseTagCountStart + 1), 16)
-- store offset
local tagOffset = recordOffset + 2
-- loop through each tag
for tagNumber = 1, responseTagCount, 1 do
print("\n - Tag Number " .. tagNumber .. " -\n")
-- high tag
local responseTagHighStart = tagOffset
local responseTagHigh = extractfromresponse(response, responseTagHighStart, responseTagHighStart + 7)
print(" High Tag: " .. responseTagHigh)
-- low tag
local responseTagLowStart = responseTagHighStart + 8
local responseTagLow = extractfromresponse(response, responseTagLowStart, responseTagLowStart + 7)
print(" Low Tag: " .. responseTagLow)
-- get value length
local responseTagValueLength = {}
local responseTagValueLengthStart = responseTagLowStart + 8
local responseTagValueLength = tonumber(extractfromresponse(response, responseTagValueLengthStart, responseTagValueLengthStart + 3), 16)
-- only check if value actually exists
if responseTagValueLength > 0 then
-- get value
local responseTagValueStart = responseTagValueLengthStart + 4
local responseTagValueEnd = responseTagValueStart + responseTagValueLength
local responseTagValue = string.fromhex(extractfromresponse(response, responseTagValueStart, responseTagValueEnd))
print(" Value: " .. responseTagValue)
-- adjust offset
tagOffset = responseTagValueEnd
else
-- adjust offset
tagOffset = responseTagValueLengthStart + 4
end
end
-- adjust offset
recordOffset = tagOffset
end
-- close connection
client:close()
|