creative-workflow/pi-setup

View on GitHub
lib/piservices/piservice.py

Summary

Maintainability
B
4 hrs
Test Coverage
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()