@@ -298,15 +298,93 @@ func (srv *Server) Traceroute(req *syspb.TracerouteRequest, stream syspb.System_
298
298
return status .Errorf (codes .Unimplemented , "Method system.Traceroute is unimplemented." )
299
299
}
300
300
301
- // SetPackage is unimplemented.
302
- func ( srv * Server ) SetPackage ( stream syspb. System_SetPackageServer ) error {
303
- ctx := stream . Context ()
301
+ func ( srv * Server ) SetPackage ( rs syspb. System_SetPackageServer ) error {
302
+ ctx := rs . Context ()
303
+
304
304
_ , err := authenticate (srv .config , ctx , true )
305
305
if err != nil {
306
+ log .Errorf ("Authentication failed: %v" , err )
307
+ return status .Errorf (codes .PermissionDenied , "authentication failed: %v" , err )
308
+ }
309
+ log .V (1 ).Info ("gNOI: SetPackage request received" )
310
+
311
+ // Create D-Bus client
312
+ dbus , err := ssc .NewDbusClient ()
313
+ if err != nil {
314
+ log .Errorf ("Failed to create D-Bus client: %v" , err )
315
+ return status .Errorf (codes .Internal , "failed to create D-Bus client: %v" , err )
316
+ }
317
+ defer dbus .Close ()
318
+
319
+ // Receive the package request
320
+ req , err := rs .Recv ()
321
+ if err != nil {
322
+ log .Errorf ("Failed to receive package request: %v" , err )
323
+ return err
324
+ }
325
+
326
+ // Validate request type
327
+ pkg , ok := req .GetRequest ().(* syspb.SetPackageRequest_Package )
328
+ if ! ok {
329
+ errMsg := fmt .Sprintf ("invalid request type: %T, expected SetPackageRequest_Package" , req .GetRequest ())
330
+ log .Errorf (errMsg )
331
+ return status .Errorf (codes .InvalidArgument , errMsg )
332
+ }
333
+
334
+ // A filename and a version must be provided
335
+ if pkg .Package .Filename == "" {
336
+ log .Errorf ("Filename is missing in package request" )
337
+ return status .Errorf (codes .InvalidArgument , "filename is missing in package request" )
338
+ }
339
+ if pkg .Package .Version == "" {
340
+ log .Errorf ("Version is missing in package request" )
341
+ return status .Errorf (codes .InvalidArgument , "version is missing in package request" )
342
+ }
343
+ // Log the package filename and version
344
+ log .V (1 ).Infof ("Package filename: %s, version: %s" , pkg .Package .Filename , pkg .Package .Version )
345
+
346
+ // Download the package if RemoteDownload is provided
347
+ if pkg .Package .RemoteDownload != nil {
348
+ // Validate RemoteDownload
349
+ log .V (1 ).Infof ("RemoteDownload provided" )
350
+ // Check if the path is provided
351
+ if pkg .Package .RemoteDownload .Path == "" {
352
+ log .Errorf ("RemoteDownload path is missing" )
353
+ return status .Errorf (codes .InvalidArgument , "remote download path is missing" )
354
+ }
355
+ log .V (1 ).Infof ("RemoteDownload path: %s" , pkg .Package .RemoteDownload .Path )
356
+
357
+ // Download the package
358
+ err = dbus .DownloadImage (pkg .Package .RemoteDownload .Path , pkg .Package .Filename )
359
+ if err != nil {
360
+ log .Errorf ("Failed to download image: %v" , err )
361
+ return status .Errorf (codes .Internal , "failed to download image: %v" , err )
362
+ }
363
+ log .V (1 ).Infof ("Package %s downloaded successfully to %s" , pkg .Package .Version , pkg .Package .Filename )
364
+ }
365
+
366
+ // If activate is requested, install the package and set it to be the next boot image
367
+ if pkg .Package .Activate {
368
+ log .V (1 ).Infof ("Activate is requested" )
369
+ // Install the package
370
+ err = dbus .InstallImage (pkg .Package .Filename )
371
+ if err != nil {
372
+ log .Errorf ("Failed to install image: %v" , err )
373
+ return status .Errorf (codes .Internal , "failed to install image: %v" , err )
374
+ }
375
+ log .V (1 ).Infof ("Package %s installed successfully" , pkg .Package .Filename )
376
+ // Currently, Installing the image will automatically set it as the next boot image
377
+ log .V (1 ).Infof ("Package %s set as next boot image" , pkg .Package .Filename )
378
+ }
379
+
380
+ // Send response to client
381
+ if err := rs .SendAndClose (& syspb.SetPackageResponse {}); err != nil {
382
+ log .Errorf ("Failed to send response: %v" , err )
306
383
return err
307
384
}
308
- log .V (1 ).Info ("gNOI: SetPackage" )
309
- return status .Errorf (codes .Unimplemented , "Method system.SetPackage is unimplemented." )
385
+
386
+ log .V (1 ).Infof ("SetPackage completed successfully for %s" , pkg .Package .Filename )
387
+ return nil
310
388
}
311
389
312
390
// SwitchControlProcessor implements the corresponding RPC.
0 commit comments