import re import requests from django.utils.translation import ugettext_lazy as _ from orchestra.apps.orchestration import ServiceController from . import SaaSServiceMixin from .. import settings class WordpressMuBackend(SaaSServiceMixin, ServiceController): verbose_name = _("Wordpress multisite") @property def script(self): return self.cmds def login(self, session): base_url = self.get_base_url() login_url = base_url + '/wp-login.php' login_data = { 'log': 'admin', 'pwd': settings.WEBAPPS_WORDPRESSMU_ADMIN_PASSWORD, 'redirect_to': '/wp-admin/' } response = session.post(login_url, data=login_data) if response.url != base_url + '/wp-admin/': raise IOError("Failure login to remote application") def get_base_url(self): base_url = settings.WEBAPPS_WORDPRESSMU_BASE_URL if base_url.endswith('/'): base_url = base_url[:-1] return base_url def create_blog(self, webapp, server): emails = webapp.account.contacts.filter(email_usage__contains='') email = emails.values_list('email', flat=True).first() base_url = self.get_base_url() session = requests.Session() self.login(session) url = base_url + '/wp-admin/network/site-new.php' content = session.get(url).content wpnonce = re.compile('name="_wpnonce_add-blog"\s+value="([^"]*)"') wpnonce = wpnonce.search(content).groups()[0] url += '?action=add-site' data = { 'blog[domain]': webapp.name, 'blog[title]': webapp.name, 'blog[email]': email, '_wpnonce_add-blog': wpnonce, } # TODO validate response response = session.post(url, data=data) def delete_blog(self, webapp, server): # OH, I've enjoied so much coding this methods that I want to thanks # the wordpress team for the excellent software they are producing context = self.get_context(webapp) session = requests.Session() self.login(session) base_url = self.get_base_url() search = base_url + '/wp-admin/network/sites.php?s=%(name)s&action=blogs' % context regex = re.compile( '%(name)s' % context ) content = session.get(search).content ids = regex.search(content).groups() if len(ids) > 1: raise ValueError("Multiple matches") delete = re.compile('(.*)') content = delete.search(content).groups()[0] wpnonce = re.compile('_wpnonce=([^"]*)"') wpnonce = wpnonce.search(content).groups()[0] delete = '/wp-admin/network/sites.php?action=confirm&action2=deleteblog' delete += '&id=%d&_wpnonce=%d' % (ids[0], wpnonce) content = session.get(delete).content wpnonce = re.compile('name="_wpnonce"\s+value="([^"]*)"') wpnonce = wpnonce.search(content).groups()[0] data = { 'action': 'deleteblog', 'id': ids[0], '_wpnonce': wpnonce, '_wp_http_referer': '/wp-admin/network/sites.php', } delete = base_url + '/wp-admin/network/sites.php?action=deleteblog' session.post(delete, data=data) def save(self, webapp): self.append(self.create_blog, webapp) def delete(self, webapp): self.append(self.delete_blog, webapp)