]> ruderich.org/simon Gitweb - safcm/safcm.git/commitdiff
rpc: prepare to support more operating systems
authorSimon Ruderich <simon@ruderich.org>
Wed, 14 Apr 2021 11:47:28 +0000 (13:47 +0200)
committerSimon Ruderich <simon@ruderich.org>
Thu, 15 Apr 2021 21:39:46 +0000 (23:39 +0200)
rpc/dial.go

index db25cb7b6e823ab5287e039304a31a46c5483ab3..680cb87df39ae0c999ce789d5d53bb168ed64b80 100644 (file)
@@ -98,6 +98,25 @@ func (c *Conn) dialSSH(stdin io.Writer, stdout_ io.Reader) error {
        path := fmt.Sprintf("/tmp/safcm-remote-%d", uid)
 
        c.debugf("DialSSH: probing remote at %q", path)
        path := fmt.Sprintf("/tmp/safcm-remote-%d", uid)
 
        c.debugf("DialSSH: probing remote at %q", path)
+
+       // Compatibility for different operating systems
+       var compat string
+       switch goos {
+       case "linux":
+               compat = `
+dir_stat='drwxrwxrwt 0 0'
+file_stat="-rwx------ $(id -u) $(id -g)"
+compat_stat() {
+       stat -c '%A %u %g' "$1"
+}
+compat_sha512sum() {
+       sha512sum "$1"
+}
+`
+       default:
+               return fmt.Errorf("internal error: no support for %q", goos)
+       }
+
        // Use a function so the shell cannot execute the input line-wise.
        // This is important because we're also using stdin to send data to
        // the script. If the shell executes the input line-wise then our
        // Use a function so the shell cannot execute the input line-wise.
        // This is important because we're also using stdin to send data to
        // the script. If the shell executes the input line-wise then our
@@ -116,18 +135,19 @@ func (c *Conn) dialSSH(stdin io.Writer, stdout_ io.Reader) error {
        // `test -e` is only used to prevent error messages if the file
        // doesn't exist. It does not guard against any races.
        _, err = fmt.Fprintf(stdin, `
        // `test -e` is only used to prevent error messages if the file
        // doesn't exist. It does not guard against any races.
        _, err = fmt.Fprintf(stdin, `
+%s
 f() {
        x=%q
 
        dir="$(dirname "$x")"
 f() {
        x=%q
 
        dir="$(dirname "$x")"
-       if ! test "$(stat -c '%%A %%u %%g' "$dir")" = 'drwxrwxrwt 0 0'; then
+       if ! test "$(compat_stat "$dir")" = "$dir_stat"; then
                echo "unsafe permissions on $dir, aborting" >&2
                exit 1
        fi
 
                echo "unsafe permissions on $dir, aborting" >&2
                exit 1
        fi
 
-       if test -e "$x" && test "$(stat -c '%%A %%u' "$x")" = "-rwx------ $(id -u)"; then
+       if test -e "$x" && test "$(compat_stat "$x")" = "$file_stat"; then
                # Report checksum
                # Report checksum
-               sha512sum "$x"
+               compat_sha512sum "$x"
        else
                # Empty checksum to request upload
                echo
        else
                # Empty checksum to request upload
                echo
@@ -155,7 +175,7 @@ f() {
        exec "$x" sync
 }
 f
        exec "$x" sync
 }
 f
-`, path)
+`, compat, path)
        if err != nil {
                return err
        }
        if err != nil {
                return err
        }