-- -- ~~~ 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()