@@ -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-
357356if 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 {
359358slog .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 {
369368return nil
370369}
371370
372- func setSerialNumber (serialNumber ,filePath string )error {
371+ func setSerialNumber (ctx context. Context , conn remote. RemoteConn , serialNumber ,filePath string )error {
373372serialCheckRegex := regexp .MustCompile (`<\s*txt-record\s*>\s*serial_number=\S+\s*<\s*/txt-record\s*>` )
374373serviceEndTag := regexp .MustCompile (`</service>` )
375374newSerialTemplate := `<txt-record>serial_number=%s</txt-record>
376375`
377376if serialNumber == "" {
378377return errors .New ("missing or empty serial number" )
379378}
380-
381379data ,err := os .ReadFile (filePath )
382380if err != nil {
383381if os .IsNotExist (err ) {
382+ slog .Warn ("service file does not exist, skipping serial number setup" ,slog .String ("filePath" ,filePath ))
384383return nil
385384}
386385return err
387386}
388-
389387if serialCheckRegex .Match (data ) {
390388return nil
391389}
392-
393390loc := serviceEndTag .FindIndex (data )
394391if loc == nil {
395392return errors .New (" </service> tag not found in the service file" )
396393}
397394
398395var 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 ) {