From 621f5faf02835f3d2f424005fb6bc3c3fded88b8 Mon Sep 17 00:00:00 2001 From: Mosen Date: Wed, 22 Jun 2016 18:46:16 +1000 Subject: [PATCH] connect service Acknowledge updates information in devices table for QueryResponses devices datastore updates QueryResponses into json column `last_query_response`, and some other main attributes into the devices table. add migration to support column `last_query_response`. --- connect/service.go | 22 +++++++++- device/datastore.go | 42 +++++++++++++++++++ ...220001_devices_last_queryresponse_down.sql | 2 + ...06220001_devices_last_queryresponse_up.sql | 1 + 4 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 migrations/201606220001_devices_last_queryresponse_down.sql create mode 100644 migrations/201606220001_devices_last_queryresponse_up.sql diff --git a/connect/service.go b/connect/service.go index 52c287e2..82cc8412 100644 --- a/connect/service.go +++ b/connect/service.go @@ -28,6 +28,24 @@ type service struct { } func (svc service) Acknowledge(ctx context.Context, req mdmConnectRequest) (int, error) { + var err error + + switch req.RequestType { + case "DeviceInformation": + err = svc.ackQueryResponses(req) + if err != nil { + return 0, err + } + default: + // Need to handle the absence of RequestType in IOS8 devices + if req.QueryResponses.UDID != "" { + err = svc.ackQueryResponses(req) + if err != nil { + return 0, err + } + } + } + total, err := svc.commands.DeleteCommand(req.UDID, req.CommandUUID) if err != nil { return total, err @@ -66,6 +84,6 @@ func (svc service) checkRequeue(deviceUDID string) (int, error) { } // Acknowledge Queries sent with DeviceInformation command -func (svc service) ackQueryResponses() (error) { - return nil +func (svc service) ackQueryResponses(req mdmConnectRequest) error { + return svc.devices.UpdateDeviceQueryResponseByUDID(req.UDID, req.QueryResponses) } diff --git a/device/datastore.go b/device/datastore.go index e5855ecc..15f83a72 100644 --- a/device/datastore.go +++ b/device/datastore.go @@ -9,6 +9,8 @@ import ( "github.com/jmoiron/sqlx" _ "github.com/lib/pq" // postgres driver "github.com/pkg/errors" + "github.com/micromdm/mdm" + "encoding/json" ) var ( @@ -78,6 +80,7 @@ type Datastore interface { New(src string, d *Device) (string, error) GetDeviceByUDID(udid string, fields ...string) (*Device, error) GetDeviceByUUID(uuid string, fields ...string) (*Device, error) + UpdateDeviceQueryResponseByUDID(udid string, responses mdm.QueryResponses) (error) Devices(params ...interface{}) ([]Device, error) Save(msg string, dev *Device) error } @@ -118,6 +121,45 @@ func (store pgStore) GetDeviceByUUID(uuid string, fields ...string) (*Device, er return &device, sqlx.Get(store, &device, query, uuid) } +func (store pgStore) UpdateDeviceQueryResponseByUDID(udid string, responses mdm.QueryResponses) (error) { + jsonValue, err := json.Marshal(responses) + + if (err != nil) { + return err + } + + query := `UPDATE devices SET last_query_response = $2 WHERE udid = $1` + _, err = store.Exec(query, udid, jsonValue) + + if (err != nil) { + return err + } + + devicesStmt := `UPDATE devices SET + os_version = $2, + model = $3, + build_version = $4, + product_name = $5, + imei = $6, + meid = $7, + serial_number = $8 + WHERE udid=$1` + + _, err = store.Exec( + devicesStmt, + udid, + responses.OSVersion, + responses.Model, + responses.BuildVersion, + responses.ProductName, + responses.IMEI, + responses.MEID, + responses.SerialNumber, + ) + + return err +} + func (store pgStore) New(src string, d *Device) (string, error) { switch src { case "fetch": diff --git a/migrations/201606220001_devices_last_queryresponse_down.sql b/migrations/201606220001_devices_last_queryresponse_down.sql new file mode 100644 index 00000000..9b2e3927 --- /dev/null +++ b/migrations/201606220001_devices_last_queryresponse_down.sql @@ -0,0 +1,2 @@ +ALTER TABLE devices DROP COLUMN last_query_response; + diff --git a/migrations/201606220001_devices_last_queryresponse_up.sql b/migrations/201606220001_devices_last_queryresponse_up.sql new file mode 100644 index 00000000..7ab1408c --- /dev/null +++ b/migrations/201606220001_devices_last_queryresponse_up.sql @@ -0,0 +1 @@ +ALTER TABLE devices ADD COLUMN last_query_response JSONB;