From b58085feb8ced4e00bdeb97aa7aa868ed51a02d8 Mon Sep 17 00:00:00 2001 From: Antoine GIRARD Date: Thu, 17 Jan 2019 21:37:19 +0100 Subject: [PATCH] check mount path +fix log --- rclone/driver/driver.go | 47 +++++++++++++++++++++++++++++++-------- rclone/rclone.go | 2 +- support/docker/Dockerfile | 2 +- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/rclone/driver/driver.go b/rclone/driver/driver.go index 35f1409..3d797dc 100644 --- a/rclone/driver/driver.go +++ b/rclone/driver/driver.go @@ -2,8 +2,10 @@ package driver import ( "fmt" + "io/ioutil" "os" "path/filepath" + "strings" "sync" "time" @@ -27,6 +29,16 @@ type rcloneMountpoint struct { Connections int `json:"connections"` } +func (m *rcloneMountpoint) isMounted() (bool, error) { + //TODO Better check for remote /var/lib/docker-volumes/rclone/mountpath fuse.rclone ro,nosuid,nodev,relatime,user_id=0,group_id=0 0 0 + buf, err := ioutil.ReadFile("/proc/mounts") + if err != nil { + return false, err + } + log.Debugf("isMounted Path: path: %s %v", m.Path, strings.Contains(string(buf), " "+m.Path+" fuse.rclone")) + return strings.Contains(string(buf), " "+m.Path+" fuse.rclone"), nil +} + type rcloneVolume struct { Config string `json:"config"` Args string `json:"args"` @@ -254,19 +266,27 @@ func (d *RcloneDriver) Mount(r *volume.MountRequest) (*volume.MountResponse, err return nil, fmt.Errorf("volume mount %s not found for %s", v.Mount, r.Name) } - if m.Connections > 0 { + ready, err := m.isMounted() + if err != nil { + return nil, err + } + if ready { v.Connections++ m.Connections++ if err := d.saveConfig(); err != nil { return nil, err } return &volume.MountResponse{Mountpoint: m.Path}, nil + } else { + //Reset (maybe a reboot) + v.Connections = 0 + m.Connections = 0 } //TODO write temp file before dans don't use base64 var cmd string if log.GetLevel() == log.DebugLevel { - cmd = fmt.Sprintf("/usr/bin/rclone --log-file /var/log/rclone.log --config=<(echo \"%s\"| base64 -d) %s mount \"%s\" \"%s\" & sleep 5s", v.Config, v.Args, v.Remote, m.Path) + cmd = fmt.Sprintf("/usr/bin/rclone --log-file /var/log/rclone.%d.log --config=<(echo \"%s\"| base64 -d) %s mount \"%s\" \"%s\" & sleep 5s", time.Now().Unix(), v.Config, v.Args, v.Remote, m.Path) } else { cmd = fmt.Sprintf("/usr/bin/rclone --config=<(echo \"%s\"| base64 -d) %s mount \"%s\" \"%s\" & sleep 5s", v.Config, v.Args, v.Remote, m.Path) } @@ -310,16 +330,25 @@ func (d *RcloneDriver) Unmount(r *volume.UnmountRequest) error { return fmt.Errorf("volume mount %s not found for %s", v.Mount, r.Name) } - if m.Connections <= 1 { - cmd := fmt.Sprintf("/usr/bin/umount %s", m.Path) - if err := d.runCmd(cmd); err != nil { - return err - } + mounted, err := m.isMounted() + if err != nil { + return err + } + if !mounted { //Force reset if not mounted m.Connections = 0 v.Connections = 0 } else { - m.Connections-- - v.Connections-- + if m.Connections <= 1 { + cmd := fmt.Sprintf("/usr/bin/umount %s", m.Path) + if err := d.runCmd(cmd); err != nil { + return err + } + m.Connections = 0 + v.Connections = 0 + } else { + m.Connections-- + v.Connections-- + } } if err := d.saveConfig(); err != nil { diff --git a/rclone/rclone.go b/rclone/rclone.go index 7b8246e..8d68ede 100644 --- a/rclone/rclone.go +++ b/rclone/rclone.go @@ -86,7 +86,7 @@ func setupLogger(cmd *cobra.Command, args []string) { if verbose, _ := cmd.Flags().GetBool(VerboseFlag); verbose { log.SetLevel(log.DebugLevel) //Activate log to file in debug mode - f, err := os.OpenFile("/var/log/docker-volume-rclone.log", os.O_WRONLY|os.O_CREATE, 0644) + f, err := os.OpenFile("/var/log/docker-volume-rclone.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Fatal(err) } diff --git a/support/docker/Dockerfile b/support/docker/Dockerfile index c5c1786..e0adfeb 100644 --- a/support/docker/Dockerfile +++ b/support/docker/Dockerfile @@ -8,7 +8,7 @@ RUN make clean build RUN go get -u -v github.com/ncw/rclone FROM alpine -MAINTAINER Antoine GIRARD +LABEL maintainer="Antoine GIRARD " RUN apk add --no-cache ca-certificates bash fuse \ && mkdir -p /var/lib/docker-volumes/rclone /etc/docker-volumes/rclone