diff --git a/maestral/resources/com.samschott.maestral.plist b/maestral/resources/com.samschott.maestral.plist
index 7603d657..1a8eb9c0 100644
--- a/maestral/resources/com.samschott.maestral.plist
+++ b/maestral/resources/com.samschott.maestral.plist
@@ -8,7 +8,7 @@
Interactive
ProgramArguments
- {start_cmd}
+{start_cmd}
RunAtLoad
diff --git a/maestral/utils/autostart.py b/maestral/utils/autostart.py
index 83b13025..05635ac1 100644
--- a/maestral/utils/autostart.py
+++ b/maestral/utils/autostart.py
@@ -17,6 +17,7 @@ import stat
import platform
import subprocess
import pkg_resources
+import json
from enum import Enum
try:
@@ -82,21 +83,14 @@ class AutoStartMaestralBase(AutoStartBase):
def __init__(self, config_name, gui):
super().__init__(config_name, gui)
- self.config_opt = f'-c \'{self.config_name}\''
+ self.maestral_path = self.get_maestral_command_path()
- if hasattr(sys, '_MEIPASS'): # PyInstaller bundle
- self.maestral_path = os.path.join(sys._MEIPASS, 'main')
- self.start_cmd = f'{self.maestral_path} {self.config_opt}'
- self.stop_cmd = ''
+ if self.gui:
+ self.start_cmd = [self.maestral_path, 'gui', '-c', json.dumps(self.config_name)]
+ self.stop_cmd = []
else:
- self.maestral_path = self.get_maestral_command_path()
-
- if self.gui:
- self.start_cmd = f'{self.maestral_path} gui {self.config_opt}'
- self.stop_cmd = ''
- else:
- self.start_cmd = f'{self.maestral_path} start -f {self.config_opt}'
- self.stop_cmd = f'{self.maestral_path} stop {self.config_opt}'
+ self.start_cmd = [self.maestral_path, 'start', '-f', '-c', json.dumps(self.config_name)]
+ self.stop_cmd = [self.maestral_path, 'stop', '-c', json.dumps(self.config_name)]
@staticmethod
def get_maestral_command_path():
@@ -105,6 +99,10 @@ class AutoStartMaestralBase(AutoStartBase):
"""
# try to get location of console script from package metadata
# fall back to 'which' otherwise
+
+ if hasattr(sys, '_MEIPASS'): # PyInstaller bundle
+ return os.path.join(sys._MEIPASS, 'main')
+
try:
pkg_path = next(p for p in files('maestral')
if str(p).endswith('/bin/maestral'))
@@ -161,14 +159,14 @@ class AutoStartSystemd(AutoStartMaestralBase):
service_type = 'gui' if self.gui else 'daemon'
self.service_name = f'maestral-{service_type}@{self.config_name}.service'
- with open(osp.join(_resources, 'maestral@.service'), 'r') as f:
+ with open(osp.join(_resources, 'maestral@.service')) as f:
unit_template = f.read()
filename = 'maestral-{}@.service'.format('gui' if self.gui else 'daemon')
self.destination = get_data_path(osp.join('systemd', 'user'), filename)
self.contents = unit_template.format(
- start_cmd=f'{self.maestral_path} start -f',
- stop_cmd=f'{self.maestral_path} stop',
+ start_cmd=' '.join(self.start_cmd),
+ stop_cmd=' '.join(self.stop_cmd),
)
with open(self.destination, 'w') as f:
@@ -205,13 +203,16 @@ class AutoStartLaunchd(AutoStartMaestralBase):
bundle_id = '{}-{}.{}'.format(BUNDLE_ID, 'daemon', self.config_name)
filename = bundle_id + '.plist'
- with open(osp.join(_resources, 'com.samschott.maestral.plist'), 'r') as f:
+ with open(osp.join(_resources, 'com.samschott.maestral.plist')) as f:
plist_template = f.read()
self.destination = osp.join(get_home_dir(), 'Library', 'LaunchAgents', filename)
+
+ arguments = [f'\t\t{arg}' for arg in self.start_cmd]
+
self.contents = plist_template.format(
bundle_id=bundle_id,
- start_cmd=self.start_cmd
+ start_cmd='\n'.join(arguments)
)
def _enable(self):
@@ -248,13 +249,13 @@ class AutoStartXDGDesktop(AutoStartMaestralBase):
filename = f'maestral-{config_name}.desktop'
- with open(osp.join(_resources, 'maestral.desktop'), 'r') as f:
+ with open(osp.join(_resources, 'maestral.desktop')) as f:
desktop_entry_template = f.read()
self.destination = get_conf_path('autostart', filename)
self.contents = desktop_entry_template.format(
version=__version__,
- start_cmd=self.start_cmd
+ start_cmd=''.join(self.start_cmd)
)
def _enable(self):