@@ -353,9 +353,8 @@ func EnableNetworkMode(ctx context.Context, conn remote.RemoteConn) error {
353353 {"sudo" , "systemctl" , "enable" , "avahi-daemon" },
354354 {"sudo" , "systemctl" , "start" , "avahi-daemon" },
355355 }
356-
357356 if sn , err := getSerial (& local.LocalConnection {}); err == nil {
358- if err := setSerialNumber (sn , "/etc/avahi/services/arduino.service" ); err != nil {
357+ if err := setSerialNumber (ctx , conn , sn , "/etc/avahi/services/arduino.service" ); err != nil {
359358 slog .Warn ("failed to set serial number for network mode" , slog .Any ("error" , err ))
360359 }
361360 }
@@ -369,38 +368,55 @@ func EnableNetworkMode(ctx context.Context, conn remote.RemoteConn) error {
369368 return nil
370369}
371370
372- func setSerialNumber (serialNumber , filePath string ) error {
371+ func setSerialNumber (ctx context. Context , conn remote. RemoteConn , serialNumber , filePath string ) error {
373372 serialCheckRegex := regexp .MustCompile (`<\s*txt-record\s*>\s*serial_number=\S+\s*<\s*/txt-record\s*>` )
374373 serviceEndTag := regexp .MustCompile (`</service>` )
375374 newSerialTemplate := `<txt-record>serial_number=%s</txt-record>
376375`
377376 if serialNumber == "" {
378377 return errors .New ("missing or empty serial number" )
379378 }
380-
381379 data , err := os .ReadFile (filePath )
382380 if err != nil {
383381 if os .IsNotExist (err ) {
382+ slog .Warn ("service file does not exist, skipping serial number setup" , slog .String ("filePath" , filePath ))
384383 return nil
385384 }
386385 return err
387386 }
388-
389387 if serialCheckRegex .Match (data ) {
390388 return nil
391389 }
392-
393390 loc := serviceEndTag .FindIndex (data )
394391 if loc == nil {
395392 return errors .New (" </service> tag not found in the service file" )
396393 }
397394
398395 var buf bytes.Buffer
399- buf .Write (data [:loc [0 ]])
400- buf .WriteString (fmt .Sprintf (newSerialTemplate , serialNumber ))
401- buf .Write (data [loc [0 ]:])
396+ _ , err = buf .Write (data [:loc [0 ]])
397+ if err != nil {
398+ return err
399+ }
400+ _ , err = buf .WriteString (fmt .Sprintf (newSerialTemplate , serialNumber ))
401+ if err != nil {
402+ return err
403+ }
404+ _ , err = buf .Write (data [loc [0 ]:])
405+ if err != nil {
406+ return err
407+ }
402408
403- return os .WriteFile (filePath , buf .Bytes (), 0600 )
409+ tmpPath := "/tmp/avahi_arduino_conf.service"
410+ if err := conn .WriteFile (bytes .NewReader (buf .Bytes ()), tmpPath ); err != nil {
411+ return fmt .Errorf ("failed to write temporary file on remote: %w" , err )
412+ }
413+ if out , err := conn .GetCmd ("sudo" , "mv" , tmpPath , filePath ).Output (ctx ); err != nil {
414+ return fmt .Errorf ("failed to move file into place with sudo mv: %w: %s" , err , string (out ))
415+ }
416+ if out , err := conn .GetCmd ("sudo" , "chmod" , "0644" , filePath ).Output (ctx ); err != nil {
417+ slog .Warn ("failed to set permissions on remote service file" , "file" , filePath , "error" , err , "output" , string (out ))
418+ }
419+ return nil
404420}
405421
406422func NetworkModeStatus (ctx context.Context , conn remote.RemoteConn ) (bool , error ) {
0 commit comments