44from itertools import chain , islice
55import json
66import logging
7+ import pytz
78from django .core .exceptions import SuspiciousOperation , PermissionDenied
89from django .core .files .uploadedfile import SimpleUploadedFile
910from django .db import transaction
1011from django .http import Http404 , JsonResponse
1112from django .utils .crypto import get_random_string
13+ from django .utils .timezone import make_naive
1214from django .views .generic import View
1315from zentral .contrib .inventory .events import post_machine_snapshot_raw_event
1416from zentral .contrib .inventory .exceptions import EnrollmentSecretVerificationFailed
@@ -446,10 +448,10 @@ def do_node_post(self):
446448 log_type = self .data .get ("log_type" )
447449 if log_type == "result" :
448450 results = []
449- last_inventory_snapshot = None
451+ last_inventory_snapshot_record = None
450452 for record in records :
451453 if record .get ("name" ) == INVENTORY_QUERY_NAME :
452- last_inventory_snapshot = record . get ( "snapshot" )
454+ last_inventory_snapshot_record = record
453455 else :
454456 results .append (record )
455457 # file carving ?
@@ -476,16 +478,22 @@ def do_node_post(self):
476478 post_file_carve_events (self .machine .serial_number , self .user_agent , self .ip ,
477479 [{"action" : "schedule" ,
478480 "session_id" : str (file_carving_session .pk )}])
479- if last_inventory_snapshot :
480- tree = {"source" : {"module" : "zentral.contrib.osquery" ,
481- "name" : "osquery" },
482- "serial_number" : self .machine .serial_number ,
483- "reference" : self .enrolled_machine .node_key ,
484- "public_ip_address" : self .ip }
481+ if last_inventory_snapshot_record :
482+ tree = {
483+ "source" : {"module" : "zentral.contrib.osquery" ,
484+ "name" : "osquery" },
485+ "serial_number" : self .machine .serial_number ,
486+ "reference" : self .enrolled_machine .node_key ,
487+ "public_ip_address" : self .ip ,
488+ "last_seen" : make_naive (
489+ datetime .fromtimestamp (int (last_inventory_snapshot_record ["unixTime" ]), pytz .UTC ),
490+ timezone = pytz .UTC ,
491+ )
492+ }
485493 business_unit = self .enrollment .secret .get_api_enrollment_business_unit ()
486494 if business_unit :
487495 tree ["business_unit" ] = business_unit .serialize ()
488- update_tree_with_inventory_query_snapshot (tree , last_inventory_snapshot )
496+ update_tree_with_inventory_query_snapshot (tree , last_inventory_snapshot_record [ "snapshot" ] )
489497 # use the raw events queue to process this in the background
490498 post_machine_snapshot_raw_event (tree )
491499 post_results (self .machine .serial_number , results , self .request )
0 commit comments