diff --git a/connect/middleware.go b/connect/middleware.go new file mode 100644 index 00000000..b017c4b9 --- /dev/null +++ b/connect/middleware.go @@ -0,0 +1,28 @@ +package connect + +import ( + "github.com/micromdm/micromdm/device" + "golang.org/x/net/context" +) + +type lastCheckinMiddleware struct { + devices device.Datastore + next Service +} + +func NewMiddleware(datastore device.Datastore, next Service) (*lastCheckinMiddleware) { + return &lastCheckinMiddleware{ + datastore, + next, + } +} + +func (mw lastCheckinMiddleware) Acknowledge(ctx context.Context, req mdmConnectRequest) (int, error) { + mw.devices.UpdateDeviceCheckinByUDID(req.UDID) + return mw.next.Acknowledge(ctx, req) +} + +func (mw lastCheckinMiddleware) NextCommand(ctx context.Context, req mdmConnectRequest) ([]byte, int, error) { + mw.devices.UpdateDeviceCheckinByUDID(req.UDID) + return mw.next.NextCommand(ctx, req) +} diff --git a/device/datastore.go b/device/datastore.go index 15f83a72..85ed55f6 100644 --- a/device/datastore.go +++ b/device/datastore.go @@ -81,6 +81,7 @@ type Datastore interface { GetDeviceByUDID(udid string, fields ...string) (*Device, error) GetDeviceByUUID(uuid string, fields ...string) (*Device, error) UpdateDeviceQueryResponseByUDID(udid string, responses mdm.QueryResponses) (error) + UpdateDeviceCheckinByUDID(udid string) (error) Devices(params ...interface{}) ([]Device, error) Save(msg string, dev *Device) error } @@ -160,6 +161,14 @@ func (store pgStore) UpdateDeviceQueryResponseByUDID(udid string, responses mdm. return err } +// Bump the last_checkin timestamp +func (store pgStore) UpdateDeviceCheckinByUDID(udid string) (error) { + stmt := `UPDATE devices SET last_checkin = NOW() WHERE udid = $1` + _, err := store.Exec(stmt, udid) + + return err +} + func (store pgStore) New(src string, d *Device) (string, error) { switch src { case "fetch": diff --git a/main.go b/main.go index 69a9eecb..989dbd45 100644 --- a/main.go +++ b/main.go @@ -187,6 +187,7 @@ func main() { commandSvc := command.NewService(commandDB) checkinSvc := checkin.NewService(deviceDB, mgmtSvc, commandSvc, enrollmentProfile) connectSvc := connect.NewService(deviceDB, commandSvc) + connectSvc = connect.NewMiddleware(deviceDB, connectSvc) httpLogger := log.NewContext(logger).With("component", "http") managementHandler := management.ServiceHandler(ctx, mgmtSvc, httpLogger)