@@ -102,36 +102,47 @@ async function saveMonitorInfo(ctx: Context, monitor: any, config) {
102102 const {
103103 mac, version, uptime, seats, ip,
104104 os, kernel, cpu, cpuused, mem, memused, load,
105+ wifi_signal, wifi_bssid,
105106 window_cmdline, window_exe, window_name,
106107 } = monitor ;
107108 logger . debug ( 'save monitor info %o' , monitor ) ;
108109 actions . write ( `${ Date . now ( ) } ,${ seats } ,"${ escape ( window_cmdline ) } ","${ escape ( window_exe ) } ","${ escape ( window_name ) } "\n` ) ;
109110 const monitors = await ctx . db . monitor . find ( { mac } ) ;
110111 const warn = monitors . length > 1 || ( monitors . length && monitors [ 0 ] . ip !== ip ) ;
111112 if ( warn ) ctx . logger ( 'monitor' ) . warn ( `Duplicate monitor ${ mac } from (${ ip } , ${ monitors . length ? monitors [ 0 ] . ip : 'null' } )` ) ;
113+ const hasWifiSignal = wifi_signal !== undefined && wifi_signal !== '' ;
114+ const wifiSignalValue = hasWifiSignal ? Number . parseFloat ( String ( wifi_signal ) ) : Number . NaN ;
115+ const normalizedBssid = typeof wifi_bssid === 'string' ? wifi_bssid . trim ( ) : '' ;
116+ const shouldSetBssid = normalizedBssid && ! / ^ n o t - ? a s s o c i a t e d $ / i. test ( normalizedBssid ) ;
112117 const autoGroupPayload = ( config . autoGroup && / ^ [ A - Z ] [ 0 - 9 ] + $ / . test ( seats ) ) ? {
113118 group : seats [ 0 ] ,
114119 name : seats ,
115120 } : { } ;
116- await ctx . db . monitor . updateOne ( { mac } , {
117- $set : {
118- mac,
119- ip,
120- version,
121- uptime,
122- hostname : seats ,
123- oldMonitor : true ,
124- updateAt : new Date ( ) . getTime ( ) ,
125- ...os && { os } ,
126- ...kernel && { kernel } ,
127- ...cpu && { cpu : cpu . replaceAll ( '_' , ' ' ) } ,
128- ...cpuused && { cpuUsed : cpuused } ,
129- ...mem && { mem } ,
130- ...mem && { memUsed : memused } ,
131- ...load && { load } ,
132- ...autoGroupPayload ,
133- } ,
134- } , { upsert : true } ) ;
121+ const setPayload : Record < string , any > = {
122+ mac,
123+ ip,
124+ version,
125+ uptime,
126+ hostname : seats ,
127+ oldMonitor : true ,
128+ updateAt : new Date ( ) . getTime ( ) ,
129+ ...os && { os } ,
130+ ...kernel && { kernel } ,
131+ ...cpu && { cpu : cpu . replaceAll ( '_' , ' ' ) } ,
132+ ...cpuused && { cpuUsed : cpuused } ,
133+ ...mem && { mem } ,
134+ ...mem && { memUsed : memused } ,
135+ ...load && { load } ,
136+ ...( hasWifiSignal && ! Number . isNaN ( wifiSignalValue ) && { wifiSignal : wifiSignalValue } ) ,
137+ ...( shouldSetBssid && { wifiBssid : normalizedBssid . toUpperCase ( ) } ) ,
138+ ...autoGroupPayload ,
139+ } ;
140+ const unsetPayload : Record < string , 1 > = { } ;
141+ if ( ! hasWifiSignal || Number . isNaN ( wifiSignalValue ) ) unsetPayload . wifiSignal = 1 ;
142+ if ( ! shouldSetBssid ) unsetPayload . wifiBssid = 1 ;
143+ const updateDoc : Record < string , any > = { $set : setPayload } ;
144+ if ( Object . keys ( unsetPayload ) . length ) updateDoc . $unset = unsetPayload ;
145+ await ctx . db . monitor . updateOne ( { mac } , updateDoc , { upsert : true } ) ;
135146}
136147
137148export const Config = Schema . object ( {
0 commit comments