lib/piservices/piservice.py
import os, helper, config, glob, loader
from fabops import FabricTaskOperator
from policies import PiServicePolicies
from remote.integration import RemoteFileHelper
from initd import InitScript, InitScriptWithTemplate, AutogeneratedInitScript
pisetup_root_folder_on_pi ='/home/pi/pi-setup'
piservice_standart_commands = ['install', 'uninstall', 'deploy', 'info', 'installed']
piservcie_managed_standart_commands = ['start', 'stop', 'restart', 'enable_autostart', 'disable_autostart']
class PiService(FabricTaskOperator, PiServicePolicies):
default_attributes = {
'source_files' : ['./*'],
'exclude_source_files' : ['.*\.pyc', '\.git', '\.DS_Store'],
'commands' : [],
'managed_service' : True,
'init_script' : False,
'apt_get_install' : False,
'copy_init_script' : False,
'target_init_script' : None #it is the name of the service
}
def __init__(self):
self._init_defaults()
FabricTaskOperator.__init__(self, self.local_path, self.remote_path)
self._init_service()
self._init_initscript()
def _init_defaults(self):
self.default_attributes.update({
'remote_path' : os.path.realpath(pisetup_root_folder_on_pi+'/services/'+self.name),
'local_path' : os.path.realpath(loader.services_path+'/'+self.name),
'local_pi_setup_path' : os.path.realpath(os.path.dirname(__file__)+'/../../'),
'remote_pi_setup_path': pisetup_root_folder_on_pi
})
for key, value in self.default_attributes.iteritems():
if not hasattr(self, key):
self.__dict__[key] = value
def _init_service(self):
self.config = {}
if config.get() and config.get('services').has_key(self.name):
self.config = config.get('services')[self.name]
self.remote = RemoteFileHelper(self)
self.commands.extend(piservice_standart_commands)
if self.managed_service:
self.commands.extend(piservcie_managed_standart_commands)
def _init_initscript(self):
if self.init_script:
if self.init_script == 'installed':
self.init_script = InitScript(self)
elif self.init_script == 'auto':
self.init_script = AutogeneratedInitScript(self)
elif isinstance(self.init_script, basestring):
self.init_script = InitScriptWithTemplate(self, self.init_script)
def install(self, deploy=True):
"""setup the the pi-setup-service"""
if self.is_local():
return
self.api.run('mkdir -p '+self.remote_path)
if self.apt_get_install:
#set the correct terminal, so no notices like "Unable to initialise frontend: Dialog" etc
self.run('export TERM=linux && sudo apt-get -y install '+(' '.join(self.apt_get_install)))
PiService.deploy(self, restart=False)
def deploy(self, restart=True):
"""copy service files to remote service folder"""
self.api.run('mkdir -p '+self.remote_path)
if not self.name == 'setup':
self.service('setup').deploy()
self._copy_src_files()
if self.init_script:
self.init_script.copy()
if restart and not restart in ('0', 'false') and self.init_script:
with self.api.settings(warn_only=True):
self.restart()
def uninstall(self):
"""removes service files from remote service folder"""
self.check_remote_or_exit()
self.check_installed_or_exit()
self.stop();
if self.init_script:
self.init_script.delete()
self.api.run('sudo rm -Rf %s' % self.remote_path)
def _copy_src_files(self):
files = []
for source_file in self.source_files:
for source_file_with_path in glob.glob(self.local_path+'/'+source_file):
files.extend(
helper.collect_files(source_file_with_path))
self.zip_files_and_copy(
helper.filter_files(
files,
self.exclude_source_files),
self.remote_path)
def service(self, name):
return loader.instance(name)
def info(self):
"""print config of this service"""
print self.config
def start(self):
"""start the the service"""
if not self.init_script: return
self.check_installed_or_exit()
self.init_script.start()
def stop(self):
"""stop the the service"""
if not self.init_script: return
self.check_installed_or_exit()
self.init_script.stop()
def restart(self):
"""restart the the service"""
if not self.init_script: return
self.check_installed_or_exit()
self.init_script.restart()
def enable_autostart(self):
"""enable automatic start of this service"""
if not self.init_script: return
self.check_installed_or_exit()
self.init_script.enable_autostart()
def disable_autostart(self):
"""disable automatic start of this service"""
if not self.init_script: return
self.check_installed_or_exit()
self.init_script.disable_autostart()