Esempio n. 1
0
    def map_structure(self):
        output = {}

        for domain, dval in self.structure["sites"].iteritems():
            output[domain] = [];

            for val in dval["subdomains"]:
                subdomain = val["name"]
                site = {"webmaster": dval["webmaster"], "domain_aliases": [], "aliases": [], "redirects": []}
                if not val: val = {}

                # Get DocumentRoot
                if not "null_path" in val:
                    directory = dval["root"] + subdomain + "/"
                    if "path" in val:
                        if val["path"].startswith("/"): # Absolute
                            directory = val["path"]
                        else: # Relative
                            directory = directory + val["path"]

                    site["directory"] = directory
                else:
                    site["directory"] = self.structure["config"]["null_path"]

                if "no_path" in val:
                    del site["directory"]

                # Determine top-level vs subdomain
                full_domain = subdomain + "." + domain
                if "is_root" in val:
                    # Handle actual root and it's subdomain
                    site["domain"] = domain
                    site["domain_aliases"].append(full_domain)
                else:
                    site["domain"] = full_domain

                site["domain_rpn"] = '.'.join(reversed(full_domain.split('.')))

                # Aliases
                if "alt_names" in val:
                    site["domain_aliases"] = site["domain_aliases"].extend(val["alt_names"])

                # Let's Encrypt
                site["letsencrypt_domain"] = "letsencrypt" in dval or "letsencrypt" in val

                # Remove subdomain
                site["remove_subdomain"] = "remove_subdomain" in val

                # Handle redirect parameter
                is_https_redirect = False
                if "http" in val and "redirect" in val["http"]:
                    if "https" in val["http"]:
                        is_https_redirect = True
                    else:
                        site["redirects"].append({"target": val["http"]["redirect"]})

                # Auth
                if "auth" in val:
                    site["restrict"] = val["auth"]

                # FCGI
                if "fcgi" in val:
                    fcgi_type, fcgi_port, fcgi_socket = val["fcgi"].split(" ")
                    site["fcgi_config"] = {"type": fcgi_type, "port": fcgi_port, "socket": fcgi_socket}

                # WSGI
                if "wsgi" in val:
                    site["wsgi_config"] = Generator.listize(val["wsgi"])

                # Proxy
                if "proxy" in val and "sites" in val["proxy"]:
                    site["proxy"] = val["proxy"]

                # Extra
                if "extra_nginx" in val:
                    site["extra_nginx"] = val["extra_nginx"]

                # IPv6
                site["ipv6"] = "ipv6" in self.structure["config"] and not ("ipv6" in dval and "disabled" in dval["ipv6"]) and not ("ipv6" in val and "disabled" in val["ipv6"])

                # Handle HTTP site
                if not "http" in val or not "none" in val["http"]:
                    site["http"] = True

                    # Handle redirect only here
                    if is_https_redirect:
                        redir_site = copy.deepcopy(site)
                        redir_site["https_redirect"] = True
                        redir_site["redirects"].append({"target": "https://" + site["domain"] + "/"});
                        redir_site["directory"] = self.structure["config"]["null_path"]
                        output[domain].append(redir_site)

                # Handle HTTPS site (LE only for now)
                if "https" in val:
                    site["https"] = True
                    if is_https_redirect:
                        site["http"] = False

                output[domain].append(site)

            if "redir_domains" in dval and "domains" in dval["redir_domains"]:
                for rd in dval["redir_domains"]["domains"]:
                    site = {"domain": rd, "redirects": [{"target": dval["redir_domains"]["target"]}]}
                    output[domain].append(site)

        return output