"""
Functions for Drupal sites.
The `drupal_root` environment variable is used in some functions of this module
to run the commands in the correct directory. Make sure it is set to the root
directory of your Drupal project.
This module requires `drush` to be installed on the remote server.
"""
from contextlib import nested
from fabric import api
from fabliip.file import file_exists
[docs]def drush(command):
"""
Runs a drush command on the server.
Requires the `drupal_root` environment variable to be set.
"""
with api.cd(api.env.drupal_root):
output = api.run('drush -y {command}'.format(command=command))
return output
[docs]def enable_disable_modules(site=None):
"""
Enables and disables modules on the Drupal install to reflect the status of
the modules.enabled/disabled files.
The optional `site` parameter allows you to have a multisite project
with a global modules.enabled/disabled file and a site-specific
modules.site.enabled/disabled file.
"""
with nested(api.cd(api.env.project_root), api.hide('commands')):
enabled_modules = set(api.run('cat modules.enabled').splitlines())
disabled_modules = set(api.run('cat modules.disabled').splitlines())
if site is not None:
site_enabled_modules_file = 'modules.%s.enabled' % site
site_disabled_modules_file = 'modules.%s.disabled' % site
if (not file_exists(site_enabled_modules_file)
or not file_exists(site_disabled_modules_file)):
raise Exception("Couldn't find the site-specific modules files"
" (modules.{site}.enabled and"
" modules.{site}.disabled)".format(site=site))
site_enabled_modules = set(
api.run('cat modules.%s.enabled' % site).splitlines()
)
site_disabled_modules = set(
api.run('cat modules.%s.disabled' % site).splitlines()
)
enabled_modules |= site_enabled_modules
disabled_modules |= site_disabled_modules
enabled_modules -= disabled_modules
current_enabled_modules = set(
drush('pm-list --status=enabled --pipe').splitlines()
)
current_disabled_modules = set(
drush('pm-list --status="disabled,not installed" --pipe')
.splitlines()
)
modules_to_enable = current_disabled_modules & enabled_modules
if modules_to_enable:
print("The following modules are being enabled: {modules}".format(
modules=", ".join(modules_to_enable))
)
else:
print("No modules to enable")
for module in modules_to_enable:
drush('pm-enable %s' % module)
clear_cache()
modules_to_disable = current_enabled_modules & disabled_modules
if modules_to_disable:
print("The following modules are being disabled: {modules}".format(
modules=", ".join(modules_to_disable))
)
else:
print("No modules to disable")
for module in modules_to_disable:
drush('pm-disable %s' % module)
clear_cache()
[docs]def set_maintenance_mode(enabled):
"""
Enables or disables the maintenance mode.
"""
drush('vset maintenance_mode %s' % ('1' if enabled else '0'))
[docs]def clear_cache():
"""
Clears the Drupal cache.
"""
drush('cc all')