Linux compatibility implementation
This commit is contained in:
parent
6c32ff3af3
commit
63f7abc305
2
main.go
2
main.go
|
@ -199,7 +199,7 @@ func buildMenu() *resticmenu {
|
||||||
systray.AddSeparator()
|
systray.AddSeparator()
|
||||||
mnu.backupNow = systray.AddMenuItem("Backup now", "Backup now")
|
mnu.backupNow = systray.AddMenuItem("Backup now", "Backup now")
|
||||||
mnu.backupNow.Disable()
|
mnu.backupNow.Disable()
|
||||||
mnu.browse = systray.AddMenuItem("Browse backups in Finder...", "Mount and browse backups")
|
mnu.browse = systray.AddMenuItem("Browse backups folders...", "Mount and browse backups")
|
||||||
mnu.logs = systray.AddMenuItem("Open logfile...", "Open logging file")
|
mnu.logs = systray.AddMenuItem("Open logfile...", "Open logging file")
|
||||||
mnu.config = systray.AddMenuItem("Open config file...", "Open config file")
|
mnu.config = systray.AddMenuItem("Open config file...", "Open config file")
|
||||||
systray.AddSeparator()
|
systray.AddSeparator()
|
||||||
|
|
|
@ -45,13 +45,13 @@ func ConfigFile() string {
|
||||||
return filepath.Join(configDir, "config.json")
|
return filepath.Join(configDir, "config.json")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cnf *Config) MountDir() string {
|
func MountDir() string {
|
||||||
return filepath.Join(configDir, "mnt")
|
return filepath.Join(configDir, "mnt")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cnf *Config) CreateMountDirIfDoesntExist() error {
|
func (cnf *Config) CreateMountDirIfDoesntExist() error {
|
||||||
if _, err := os.Stat(cnf.MountDir()); os.IsNotExist(err) {
|
if _, err := os.Stat(MountDir()); os.IsNotExist(err) {
|
||||||
return os.Mkdir(cnf.MountDir(), os.ModePerm)
|
return os.Mkdir(MountDir(), os.ModePerm)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,15 @@ func ReadConfig() (*Config, error) {
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn().Err(err).Msg("No config.json found, writing default")
|
log.Warn().Err(err).Msg("No config.json found, writing default")
|
||||||
|
|
||||||
|
// in case the base config dir doesn't exist, create it
|
||||||
|
if _, err := os.Stat(configDir); os.IsNotExist(err) {
|
||||||
|
err = os.Mkdir(configDir, os.ModePerm)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
conf = defaultConfig()
|
conf = defaultConfig()
|
||||||
confData, _ := json.Marshal(conf)
|
confData, _ := json.Marshal(conf)
|
||||||
os.WriteFile(ConfigFile(), confData, os.ModePerm)
|
os.WriteFile(ConfigFile(), confData, os.ModePerm)
|
||||||
|
@ -89,10 +98,10 @@ func ReadConfig() (*Config, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := os.Stat(ExcludeFile()); os.IsNotExist(err) {
|
if _, err := os.Stat(ExcludeFile()); os.IsNotExist(err) {
|
||||||
os.WriteFile(ExcludeFile(), []byte(""), os.ModePerm)
|
os.WriteFile(ExcludeFile(), []byte("node_modules"), os.ModePerm)
|
||||||
}
|
}
|
||||||
if _, err := os.Stat(PasswordFile()); os.IsNotExist(err) {
|
if _, err := os.Stat(PasswordFile()); os.IsNotExist(err) {
|
||||||
os.WriteFile(PasswordFile(), []byte(""), os.ModePerm)
|
os.WriteFile(PasswordFile(), []byte("password"), os.ModePerm)
|
||||||
}
|
}
|
||||||
|
|
||||||
return conf, nil
|
return conf, nil
|
||||||
|
|
|
@ -2,11 +2,12 @@ package restic
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
"path/filepath"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
var home, _ = os.UserHomeDir()
|
var home, _ = os.UserHomeDir()
|
||||||
var executable, _ = os.Executable()
|
var executable, _ = os.Executable()
|
||||||
var isDev = os.Getenv("RESTICTRAY_DEV")
|
var isDev = os.Getenv("RESTICTRAY_DEV")
|
||||||
var configDir = home + "/.restic/"
|
var configDir = filepath.Join(home, ".restic")
|
||||||
var timeNow = time.Now
|
var timeNow = time.Now
|
||||||
|
|
|
@ -53,7 +53,7 @@ func (w *Wrapper) Cleanup() {
|
||||||
// Could be killed or terminated due to manual unmount, ignore errors and retry anyway
|
// Could be killed or terminated due to manual unmount, ignore errors and retry anyway
|
||||||
w.mountCommand.Process.Kill()
|
w.mountCommand.Process.Kill()
|
||||||
// Sometimes not correctly unmounted causing consecutive open attempts of mounted folder to fail
|
// Sometimes not correctly unmounted causing consecutive open attempts of mounted folder to fail
|
||||||
exec.Command("umount", "restic").Run()
|
exec.Command("umount", MountDir()).Run()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,12 +78,12 @@ func (w *Wrapper) MountBackups(c *Config) error {
|
||||||
w.Cleanup()
|
w.Cleanup()
|
||||||
|
|
||||||
// Open the folder first: MacFuse could take a second; results in occasional weird errors otherwise.
|
// Open the folder first: MacFuse could take a second; results in occasional weird errors otherwise.
|
||||||
err := openFolder(c.MountDir())
|
err := openFolder(MountDir())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
w.mountCommand = resticCmd("--password-file", PasswordFile(), "-r", c.Repository, "mount", c.MountDir())
|
w.mountCommand = resticCmd("--password-file", PasswordFile(), "-r", c.Repository, "mount", MountDir())
|
||||||
err = w.mountCommand.Start() // restic's mount is a blocking call
|
err = w.mountCommand.Start() // restic's mount is a blocking call
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("restic mount cmd: %w", err)
|
return fmt.Errorf("restic mount cmd: %w", err)
|
||||||
|
@ -141,7 +141,7 @@ func (w *Wrapper) UpdateLatestSnapshots(c *Config) error {
|
||||||
// Backup uses "restic backup" to create a new snapshot. This is a blocking call.
|
// Backup uses "restic backup" to create a new snapshot. This is a blocking call.
|
||||||
// Returns a ResticCmdTimeoutError if no response from restic after cmdTimeout
|
// Returns a ResticCmdTimeoutError if no response from restic after cmdTimeout
|
||||||
func (w *Wrapper) Backup(c *Config) error {
|
func (w *Wrapper) Backup(c *Config) error {
|
||||||
cmd := resticCmd("--password-file", PasswordFile(), "-r", c.Repository, "--exclude-file", ExcludeFile(), "backup", c.Backup, "--no-scan")
|
cmd := resticCmd("--password-file", PasswordFile(), "-r", c.Repository, "--exclude-file", ExcludeFile(), "backup", c.Backup)
|
||||||
stdout, _ := cmd.StdoutPipe()
|
stdout, _ := cmd.StdoutPipe()
|
||||||
|
|
||||||
busy := make(chan bool, 1)
|
busy := make(chan bool, 1)
|
||||||
|
|
Loading…
Reference in New Issue