func mount(opts MountOptions, gopts GlobalOptions, mountpoint string) error { debug.Log("start mount") defer debug.Log("finish mount") repo, err := OpenRepository(gopts) if err != nil { return err } err = repo.LoadIndex() if err != nil { return err } if _, err := resticfs.Stat(mountpoint); os.IsNotExist(errors.Cause(err)) { Verbosef("Mountpoint %s doesn't exist, creating it\n", mountpoint) err = resticfs.Mkdir(mountpoint, os.ModeDir|0700) if err != nil { return err } } c, err := systemFuse.Mount( mountpoint, systemFuse.ReadOnly(), systemFuse.FSName("restic"), ) if err != nil { return err } Printf("Now serving the repository at %s\n", mountpoint) Printf("Don't forget to umount after quitting!\n") root := fs.Tree{} root.Add("snapshots", fuse.NewSnapshotsDir(repo, opts.OwnerRoot)) debug.Log("serving mount at %v", mountpoint) err = fs.Serve(c, &root) if err != nil { return err } <-c.Ready return c.MountError }
func (cmd CmdMount) Execute(args []string) error { if len(args) == 0 { return fmt.Errorf("wrong number of parameters, Usage: %s", cmd.Usage()) } repo, err := cmd.global.OpenRepository() if err != nil { return err } err = repo.LoadIndex() if err != nil { return err } mountpoint := args[0] if _, err := os.Stat(mountpoint); os.IsNotExist(err) { cmd.global.Verbosef("Mountpoint %s doesn't exist, creating it\n", mountpoint) err = os.Mkdir(mountpoint, os.ModeDir|0700) if err != nil { return err } } c, err := systemFuse.Mount( mountpoint, systemFuse.ReadOnly(), systemFuse.FSName("restic"), ) if err != nil { return err } root := fs.Tree{} root.Add("snapshots", fuse.NewSnapshotsDir(repo, cmd.Root)) cmd.global.Printf("Now serving %s at %s\n", repo.Backend().Location(), mountpoint) cmd.global.Printf("Don't forget to umount after quitting!\n") AddCleanupHandler(func() error { return systemFuse.Unmount(mountpoint) }) cmd.ready <- struct{}{} errServe := make(chan error) go func() { err = fs.Serve(c, &root) if err != nil { errServe <- err } <-c.Ready errServe <- c.MountError }() select { case err := <-errServe: return err case <-cmd.done: err := c.Close() if err != nil { cmd.global.Printf("Error closing fuse connection: %s\n", err) } return systemFuse.Unmount(mountpoint) } }