Added dokuwiki saas support
This commit is contained in:
parent
95edd9e31c
commit
d6bc0daae5
3
TODO.md
3
TODO.md
|
@ -424,3 +424,6 @@ serailzer self.instance on create.
|
||||||
|
|
||||||
|
|
||||||
# check certificate: websites directive ssl + domains search on miscellaneous
|
# check certificate: websites directive ssl + domains search on miscellaneous
|
||||||
|
|
||||||
|
|
||||||
|
# IF modsecurity... and Merge websites locations
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
from django import forms
|
||||||
|
from orchestra.forms.widgets import SpanWidget
|
||||||
|
from orchestra.forms.widgets import paddingCheckboxSelectMultiple
|
||||||
|
|
||||||
|
|
||||||
|
class RouteForm(forms.ModelForm):
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super(RouteForm, self).__init__(*args, **kwargs)
|
||||||
|
if self.instance:
|
||||||
|
self.fields['backend'].widget = SpanWidget()
|
||||||
|
self.fields['backend'].required = False
|
||||||
|
self.fields['async_actions'].widget = paddingCheckboxSelectMultiple(45)
|
||||||
|
actions = self.instance.backend_class.actions
|
||||||
|
self.fields['async_actions'].choices = ((action, action) for action in actions)
|
|
@ -211,7 +211,7 @@ class Route(models.Model):
|
||||||
bool(self.matches(obj))
|
bool(self.matches(obj))
|
||||||
except Exception as exception:
|
except Exception as exception:
|
||||||
name = type(exception).__name__
|
name = type(exception).__name__
|
||||||
raise ValidationError(': '.join((name, exception)))
|
raise ValidationError(': '.join((name, str(exception))))
|
||||||
|
|
||||||
def action_is_async(self, action):
|
def action_is_async(self, action):
|
||||||
return action in self.async_actions
|
return action in self.async_actions
|
||||||
|
|
|
@ -1,8 +1,11 @@
|
||||||
|
import crypt
|
||||||
import os
|
import os
|
||||||
|
import textwrap
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from orchestra.contrib.orchestration import ServiceController, replace
|
from orchestra.contrib.orchestration import ServiceController
|
||||||
|
from orchestra.utils.python import random_ascii
|
||||||
|
|
||||||
from .. import settings
|
from .. import settings
|
||||||
|
|
||||||
|
@ -11,27 +14,53 @@ class DokuWikiMuBackend(ServiceController):
|
||||||
"""
|
"""
|
||||||
Creates a DokuWiki site on a DokuWiki multisite installation.
|
Creates a DokuWiki site on a DokuWiki multisite installation.
|
||||||
"""
|
"""
|
||||||
|
name = 'dokuwiki'
|
||||||
verbose_name = _("DokuWiki multisite")
|
verbose_name = _("DokuWiki multisite")
|
||||||
model = 'webapps.WebApp'
|
model = 'saas.SaaS'
|
||||||
doc_settings = (settings,
|
default_route_match = "saas.service == 'dokuwiki'"
|
||||||
('SAAS_DOKUWIKI_TEMPLATE_PATH', 'SAAS_DOKUWIKI_FARM_PATH')
|
doc_settings = (settings, (
|
||||||
)
|
'SAAS_DOKUWIKI_TEMPLATE_PATH',
|
||||||
|
'SAAS_DOKUWIKI_FARM_PATH',
|
||||||
|
'SAAS_DOKUWIKI_USER',
|
||||||
|
'SAAS_DOKUWIKI_GROUP',
|
||||||
|
))
|
||||||
|
|
||||||
def save(self, webapp):
|
def save(self, saas):
|
||||||
context = self.get_context(webapp)
|
context = self.get_context(saas)
|
||||||
self.append("mkdir %(app_path)" % context)
|
self.append(textwrap.dedent("""
|
||||||
self.append("tar xfz %(template)s -C %(app_path)s" % context)
|
if [[ ! -e %(app_path)s ]]; then
|
||||||
self.append("chown -R www-data %(app_path)s" % context)
|
mkdir %(app_path)s
|
||||||
# TODO move dokuwiki to user directory
|
tar xfz %(template)s -C %(app_path)s
|
||||||
|
chown -R %(user)s:%(group)s %(app_path)s
|
||||||
|
fi""") % context
|
||||||
|
)
|
||||||
|
if context['password']:
|
||||||
|
self.append(textwrap.dedent("""\
|
||||||
|
if [[ $(grep '^admin:' %(users_path)s) ]]; then
|
||||||
|
sed -i 's#^admin:.*$#admin:%(password)s:admin:%(email)s:admin,user#' %(users_path)s
|
||||||
|
else
|
||||||
|
echo 'admin:%(password)s:admin:%(email)s:admin,user' >> %(users_path)s
|
||||||
|
fi""") % context
|
||||||
|
)
|
||||||
|
|
||||||
def delete(self, webapp):
|
def delete(self, saas):
|
||||||
context = self.get_context(webapp)
|
context = self.get_context(saas)
|
||||||
self.append("rm -fr %(app_path)s" % context)
|
self.append("rm -fr %(app_path)s" % context)
|
||||||
|
|
||||||
def get_context(self, webapp):
|
def get_context(self, saas):
|
||||||
context = super(DokuWikiMuBackend, self).get_context(webapp)
|
context = super(DokuWikiMuBackend, self).get_context(saas)
|
||||||
context.update({
|
context.update({
|
||||||
'template': settings.SAAS_DOKUWIKI_TEMPLATE_PATH,
|
'template': settings.SAAS_DOKUWIKI_TEMPLATE_PATH,
|
||||||
'app_path': os.path.join(settings.SAAS_DOKUWIKI_FARM_PATH, webapp.name)
|
'farm_path': settings.SAAS_DOKUWIKI_FARM_PATH,
|
||||||
|
'app_path': os.path.join(settings.SAAS_DOKUWIKI_FARM_PATH, saas.get_site_domain()),
|
||||||
|
'user': settings.SAAS_DOKUWIKI_USER,
|
||||||
|
'group': settings.SAAS_DOKUWIKI_GROUP,
|
||||||
|
'email': saas.account.email,
|
||||||
})
|
})
|
||||||
return replace(context, "'", '"')
|
password = getattr(saas, 'password', None)
|
||||||
|
salt = random_ascii(8)
|
||||||
|
context.update({
|
||||||
|
'password': crypt.crypt(password, '$1$'+salt) if password else None,
|
||||||
|
'users_path': os.path.join(context['app_path'], 'conf/users.auth.php'),
|
||||||
|
})
|
||||||
|
return context
|
||||||
|
|
|
@ -13,7 +13,8 @@ class DrupalMuBackend(ServiceController):
|
||||||
Creates a Drupal site on a Drupal multisite installation
|
Creates a Drupal site on a Drupal multisite installation
|
||||||
"""
|
"""
|
||||||
verbose_name = _("Drupal multisite")
|
verbose_name = _("Drupal multisite")
|
||||||
model = 'webapps.WebApp'
|
model = 'saas.SaaS'
|
||||||
|
default_route_match = "saas.service == 'drupal'"
|
||||||
doc_settings = (settings,
|
doc_settings = (settings,
|
||||||
('SAAS_DRUPAL_SITES_PATH',)
|
('SAAS_DRUPAL_SITES_PATH',)
|
||||||
)
|
)
|
||||||
|
|
|
@ -13,8 +13,8 @@ class WordpressMuBackend(ServiceController):
|
||||||
Creates a wordpress site on a WordPress MultiSite installation.
|
Creates a wordpress site on a WordPress MultiSite installation.
|
||||||
"""
|
"""
|
||||||
verbose_name = _("Wordpress multisite")
|
verbose_name = _("Wordpress multisite")
|
||||||
model = 'webapps.WebApp'
|
model = 'saas.SaaS'
|
||||||
default_route_match = "webapp.type == 'wordpress-mu'"
|
default_route_match = "saas.service == 'wordpress'"
|
||||||
doc_settings = (settings,
|
doc_settings = (settings,
|
||||||
('SAAS_WORDPRESS_ADMIN_PASSWORD', 'SAAS_WORDPRESS_BASE_URL')
|
('SAAS_WORDPRESS_ADMIN_PASSWORD', 'SAAS_WORDPRESS_BASE_URL')
|
||||||
)
|
)
|
||||||
|
|
|
@ -2,5 +2,11 @@ from .options import SoftwareService
|
||||||
|
|
||||||
|
|
||||||
class DokuWikiService(SoftwareService):
|
class DokuWikiService(SoftwareService):
|
||||||
|
name = 'dokuwiki'
|
||||||
verbose_name = "Dowkuwiki"
|
verbose_name = "Dowkuwiki"
|
||||||
icon = 'orchestra/icons/apps/Dokuwiki.png'
|
icon = 'orchestra/icons/apps/Dokuwiki.png'
|
||||||
|
|
||||||
|
@property
|
||||||
|
def site_base_domain(self):
|
||||||
|
from .. import settings
|
||||||
|
return settings.SAAS_DOKUWIKI_BASE_DOMAIN
|
||||||
|
|
|
@ -2,5 +2,6 @@ from .options import SoftwareService
|
||||||
|
|
||||||
|
|
||||||
class DrupalService(SoftwareService):
|
class DrupalService(SoftwareService):
|
||||||
|
name = 'drupal'
|
||||||
verbose_name = "Drupal"
|
verbose_name = "Drupal"
|
||||||
icon = 'orchestra/icons/apps/Drupal.png'
|
icon = 'orchestra/icons/apps/Drupal.png'
|
||||||
|
|
|
@ -56,7 +56,7 @@ class SoftwareServiceForm(PluginDataForm):
|
||||||
else:
|
else:
|
||||||
site_link = '<site_name>.%s' % self.plugin.site_base_domain
|
site_link = '<site_name>.%s' % self.plugin.site_base_domain
|
||||||
self.fields['site_url'].widget.display = site_link
|
self.fields['site_url'].widget.display = site_link
|
||||||
self.fields['name'].label = _("Username")
|
self.fields['name'].label = _("Site name") if self.plugin.site_base_domain else _("Username")
|
||||||
|
|
||||||
def clean_password2(self):
|
def clean_password2(self):
|
||||||
if not self.is_change:
|
if not self.is_change:
|
||||||
|
|
|
@ -7,10 +7,6 @@ from .options import SoftwareService, SoftwareServiceForm
|
||||||
|
|
||||||
class WordPressForm(SoftwareServiceForm):
|
class WordPressForm(SoftwareServiceForm):
|
||||||
email = forms.EmailField(label=_("Email"), widget=forms.TextInput(attrs={'size':'40'}))
|
email = forms.EmailField(label=_("Email"), widget=forms.TextInput(attrs={'size':'40'}))
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
|
||||||
super(WordPressForm, self).__init__(*args, **kwargs)
|
|
||||||
self.fields['name'].label = _("Site name")
|
|
||||||
|
|
||||||
|
|
||||||
class WordPressDataSerializer(serializers.Serializer):
|
class WordPressDataSerializer(serializers.Serializer):
|
||||||
|
@ -18,9 +14,14 @@ class WordPressDataSerializer(serializers.Serializer):
|
||||||
|
|
||||||
|
|
||||||
class WordPressService(SoftwareService):
|
class WordPressService(SoftwareService):
|
||||||
|
name = 'wordpress'
|
||||||
verbose_name = "WordPress"
|
verbose_name = "WordPress"
|
||||||
form = WordPressForm
|
form = WordPressForm
|
||||||
serializer = WordPressDataSerializer
|
serializer = WordPressDataSerializer
|
||||||
icon = 'orchestra/icons/apps/WordPress.png'
|
icon = 'orchestra/icons/apps/WordPress.png'
|
||||||
site_base_domain = 'blogs.orchestra.lan'
|
|
||||||
change_readonly_fileds = ('email',)
|
change_readonly_fileds = ('email',)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def site_base_domain(self):
|
||||||
|
from .. import settings
|
||||||
|
return settings.SAAS_WORDPRESS_BASE_DOMAIN
|
||||||
|
|
|
@ -32,6 +32,11 @@ SAAS_WORDPRESS_BASE_URL = Setting('SAAS_WORDPRESS_BASE_URL',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
SAAS_WORDPRESS_BASE_DOMAIN = Setting('SAAS_WORDPRESS_BASE_DOMAIN',
|
||||||
|
'blogs.{}'.format(ORCHESTRA_BASE_DOMAIN),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
SAAS_DOKUWIKI_TEMPLATE_PATH = Setting('SAAS_DOKUWIKI_TEMPLATE_PATH',
|
SAAS_DOKUWIKI_TEMPLATE_PATH = Setting('SAAS_DOKUWIKI_TEMPLATE_PATH',
|
||||||
'/home/httpd/htdocs/wikifarm/template.tar.gz'
|
'/home/httpd/htdocs/wikifarm/template.tar.gz'
|
||||||
)
|
)
|
||||||
|
@ -42,9 +47,32 @@ SAAS_DOKUWIKI_FARM_PATH = Setting('WEBSITES_DOKUWIKI_FARM_PATH',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
SAAS_DOKUWIKI_BASE_DOMAIN = Setting('SAAS_DOKUWIKI_BASE_DOMAIN',
|
||||||
|
'dokuwiki.{}'.format(ORCHESTRA_BASE_DOMAIN),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
SAAS_DOKUWIKI_TEMPLATE_PATH = Setting('SAAS_DOKUWIKI_TEMPLATE_PATH',
|
||||||
|
'/var/www/wikifarm/template.tar.gz',
|
||||||
|
)
|
||||||
|
|
||||||
|
SAAS_DOKUWIKI_FARM_PATH = Setting('SAAS_DOKUWIKI_FARM_PATH',
|
||||||
|
'/var/www/wikifarm/farm'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
SAAS_DOKUWIKI_USER = Setting('SAAS_DOKUWIKI_USER',
|
||||||
|
'orchestra'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
SAAS_DOKUWIKI_GROUP = Setting('SAAS_DOKUWIKI_GROUP',
|
||||||
|
'orchestra'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
SAAS_DRUPAL_SITES_PATH = Setting('WEBSITES_DRUPAL_SITES_PATH',
|
SAAS_DRUPAL_SITES_PATH = Setting('WEBSITES_DRUPAL_SITES_PATH',
|
||||||
'/home/httpd/htdocs/drupal-mu/sites/%(site_name)s',
|
'/home/httpd/htdocs/drupal-mu/sites/%(site_name)s',
|
||||||
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue