@@ -159,13 +159,13 @@ _wo_complete()
|
|||||||
|
|
||||||
"create")
|
"create")
|
||||||
COMPREPLY=( $(compgen \
|
COMPREPLY=( $(compgen \
|
||||||
-W "--user --pass --email --html --php --php72 --php73 --php74 --php80 --php81 --php82 --php83 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --proxy= --alias --wpredis --wprocket --wpce -le --letsencrypt --letsencrypt=wildcard -le=wildcard --dns --dns=dns_cf --dns=dns_dgon" \
|
-W "--user --pass --email --html --php --php72 --php73 --php74 --php80 --php81 --php82 --php83 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --proxy= --alias --subsiteof --wpredis --wprocket --wpce -le --letsencrypt --letsencrypt=wildcard -le=wildcard --dns --dns=dns_cf --dns=dns_dgon" \
|
||||||
-- $cur) )
|
-- $cur) )
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"update")
|
"update")
|
||||||
COMPREPLY=( $(compgen \
|
COMPREPLY=( $(compgen \
|
||||||
-W "--password --php --php72 --php73 --php74 --php80 --php81 --php82 --php83 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --wpredis --wprocket --wpce --alias -le -le=off --letsencrypt --letsencrypt=off --letsencrypt=clean -le=wildcard -le=clean --dns --dns=dns_cf --dns=dns_dgon --ngxblocker --ngxblocker=off" \
|
-W "--password --php --php72 --php73 --php74 --php80 --php81 --php82 --php83 --mysql --wp --wpsubdir --wpsubdomain --wpfc --wpsc --wpredis --wprocket --wpce --alias --subsiteof -le -le=off --letsencrypt --letsencrypt=off --letsencrypt=clean -le=wildcard -le=clean --dns --dns=dns_cf --dns=dns_dgon --ngxblocker --ngxblocker=off" \
|
||||||
-- $cur) )
|
-- $cur) )
|
||||||
;;
|
;;
|
||||||
"delete")
|
"delete")
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from wo.cli.plugins.site_functions import (
|
|||||||
doCleanupAction, setupdatabase, setupwordpress, setwebrootpermissions,
|
doCleanupAction, setupdatabase, setupwordpress, setwebrootpermissions,
|
||||||
display_cache_settings, copyWildcardCert)
|
display_cache_settings, copyWildcardCert)
|
||||||
from wo.cli.plugins.sitedb import (addNewSite, deleteSiteInfo,
|
from wo.cli.plugins.sitedb import (addNewSite, deleteSiteInfo,
|
||||||
updateSiteInfo)
|
updateSiteInfo, getSiteInfo)
|
||||||
from wo.core.acme import WOAcme
|
from wo.core.acme import WOAcme
|
||||||
from wo.core.domainvalidate import WODomain
|
from wo.core.domainvalidate import WODomain
|
||||||
from wo.core.git import WOGit
|
from wo.core.git import WOGit
|
||||||
@@ -64,6 +64,9 @@ class WOSiteCreateController(CementBaseController):
|
|||||||
(['--alias'],
|
(['--alias'],
|
||||||
dict(help="domain name to redirect to",
|
dict(help="domain name to redirect to",
|
||||||
action='store', nargs='?')),
|
action='store', nargs='?')),
|
||||||
|
(['--subsiteof'],
|
||||||
|
dict(help="create a subsite of a multisite install",
|
||||||
|
action='store', nargs='?')),
|
||||||
(['-le', '--letsencrypt'],
|
(['-le', '--letsencrypt'],
|
||||||
dict(help="configure letsencrypt ssl for the site",
|
dict(help="configure letsencrypt ssl for the site",
|
||||||
action='store' or 'store_const',
|
action='store' or 'store_const',
|
||||||
@@ -124,17 +127,24 @@ class WOSiteCreateController(CementBaseController):
|
|||||||
proxyinfo = proxyinfo.split(':')
|
proxyinfo = proxyinfo.split(':')
|
||||||
host = proxyinfo[0].strip()
|
host = proxyinfo[0].strip()
|
||||||
port = '80' if len(proxyinfo) < 2 else proxyinfo[1].strip()
|
port = '80' if len(proxyinfo) < 2 else proxyinfo[1].strip()
|
||||||
elif stype is None and not pargs.proxy and not pargs.alias:
|
elif stype is None and not pargs.proxy and not pargs.alias and not pargs.subsiteof:
|
||||||
stype, cache = 'html', 'basic'
|
stype, cache = 'html', 'basic'
|
||||||
elif stype is None and pargs.alias:
|
elif stype is None and pargs.alias:
|
||||||
stype, cache = 'alias', ''
|
stype, cache = 'alias', ''
|
||||||
alias_name = pargs.alias.strip()
|
alias_name = pargs.alias.strip()
|
||||||
if not alias_name:
|
if not alias_name:
|
||||||
Log.error(self, "Please provide alias name")
|
Log.error(self, "Please provide alias name")
|
||||||
|
elif stype is None and pargs.subsiteof:
|
||||||
|
stype, cache = 'subsite', ''
|
||||||
|
subsiteof_name = pargs.subsiteof.strip()
|
||||||
|
if not subsiteof_name:
|
||||||
|
Log.error(self, "Please provide multisite parent name")
|
||||||
elif stype and pargs.proxy:
|
elif stype and pargs.proxy:
|
||||||
Log.error(self, "proxy should not be used with other site types")
|
Log.error(self, "proxy should not be used with other site types")
|
||||||
elif stype and pargs.alias:
|
elif stype and pargs.alias:
|
||||||
Log.error(self, "alias should not be used with other site types")
|
Log.error(self, "alias should not be used with other site types")
|
||||||
|
elif stype and pargs.subsiteof:
|
||||||
|
Log.error(self, "subsiteof should not be used with other site types")
|
||||||
|
|
||||||
if not pargs.site_name:
|
if not pargs.site_name:
|
||||||
try:
|
try:
|
||||||
@@ -185,6 +195,36 @@ class WOSiteCreateController(CementBaseController):
|
|||||||
data['alias_name'] = alias_name
|
data['alias_name'] = alias_name
|
||||||
data['basic'] = True
|
data['basic'] = True
|
||||||
|
|
||||||
|
if stype == 'subsite':
|
||||||
|
# Get parent site data
|
||||||
|
parent_site_info = getSiteInfo(self, subsiteof_name)
|
||||||
|
if not parent_site_info:
|
||||||
|
Log.error(self, "Parent site {0} does not exist"
|
||||||
|
.format(subsiteof_name))
|
||||||
|
if not parent_site_info.is_enabled:
|
||||||
|
Log.error(self, "Parent site {0} is not enabled"
|
||||||
|
.format(subsiteof_name))
|
||||||
|
if parent_site_info.site_type not in ['wpsubdomain', 'wpsubdir']:
|
||||||
|
Log.error(self, "Parent site {0} is not WordPress multisite"
|
||||||
|
.format(subsiteof_name))
|
||||||
|
|
||||||
|
data = dict(
|
||||||
|
site_name=wo_domain, www_domain=wo_www_domain,
|
||||||
|
static=False, basic=False, multisite=False, webroot=wo_site_webroot)
|
||||||
|
|
||||||
|
data["wp"] = parent_site_info.site_type == 'wp'
|
||||||
|
data["wpfc"] = parent_site_info.cache_type == 'wpfc'
|
||||||
|
data["wpsc"] = parent_site_info.cache_type == 'wpsc'
|
||||||
|
data["wprocket"] = parent_site_info.cache_type == 'wprocket'
|
||||||
|
data["wpce"] = parent_site_info.cache_type == 'wpce'
|
||||||
|
data["wpredis"] = parent_site_info.cache_type == 'wpredis'
|
||||||
|
data["wpsubdir"] = parent_site_info.site_type == 'wpsubdir'
|
||||||
|
data["wo_php"] = ("php" + parent_site_info.php_version).replace(".", "")
|
||||||
|
data['subsite'] = True
|
||||||
|
data['subsiteof_name'] = subsiteof_name
|
||||||
|
data['subsiteof_webroot'] = parent_site_info.site_path
|
||||||
|
|
||||||
|
|
||||||
if (pargs.php72 or pargs.php73 or pargs.php74 or
|
if (pargs.php72 or pargs.php73 or pargs.php74 or
|
||||||
pargs.php80 or pargs.php81 or pargs.php82 or pargs.php83):
|
pargs.php80 or pargs.php81 or pargs.php82 or pargs.php83):
|
||||||
data = dict(
|
data = dict(
|
||||||
@@ -255,7 +295,8 @@ class WOSiteCreateController(CementBaseController):
|
|||||||
if ((not pargs.wpfc) and (not pargs.wpsc) and
|
if ((not pargs.wpfc) and (not pargs.wpsc) and
|
||||||
(not pargs.wprocket) and
|
(not pargs.wprocket) and
|
||||||
(not pargs.wpce) and
|
(not pargs.wpce) and
|
||||||
(not pargs.wpredis)):
|
(not pargs.wpredis) and
|
||||||
|
(not pargs.subsiteof)):
|
||||||
data['basic'] = True
|
data['basic'] = True
|
||||||
|
|
||||||
if (cache == 'wpredis'):
|
if (cache == 'wpredis'):
|
||||||
@@ -332,6 +373,26 @@ class WOSiteCreateController(CementBaseController):
|
|||||||
Log.info(self, "Successfully created site"
|
Log.info(self, "Successfully created site"
|
||||||
" http://{0}".format(wo_domain))
|
" http://{0}".format(wo_domain))
|
||||||
|
|
||||||
|
elif 'subsite' in data.keys() and data['subsite']:
|
||||||
|
addNewSite(self, wo_domain, stype, cache, wo_site_webroot)
|
||||||
|
# Service Nginx Reload
|
||||||
|
if not WOService.reload_service(self, 'nginx'):
|
||||||
|
Log.info(self, Log.FAIL +
|
||||||
|
"There was a serious error encountered...")
|
||||||
|
Log.info(self, Log.FAIL + "Cleaning up afterwards...")
|
||||||
|
doCleanupAction(self, domain=wo_domain)
|
||||||
|
deleteSiteInfo(self, wo_domain)
|
||||||
|
Log.error(self, "service nginx reload failed. "
|
||||||
|
"check issues with `nginx -t` command")
|
||||||
|
Log.error(self, "Check the log for details: "
|
||||||
|
"`tail /var/log/wo/wordops.log` "
|
||||||
|
"and please try again")
|
||||||
|
if wo_auth and len(wo_auth):
|
||||||
|
for msg in wo_auth:
|
||||||
|
Log.info(self, Log.ENDC + msg, log=False)
|
||||||
|
Log.info(self, "Successfully created site"
|
||||||
|
" http://{0}".format(wo_domain))
|
||||||
|
|
||||||
else:
|
else:
|
||||||
addNewSite(self, wo_domain, stype, cache, wo_site_webroot,
|
addNewSite(self, wo_domain, stype, cache, wo_site_webroot,
|
||||||
php_version=php_version)
|
php_version=php_version)
|
||||||
|
|||||||
@@ -836,7 +836,7 @@ def site_package_check(self, stype):
|
|||||||
stack.app = self.app
|
stack.app = self.app
|
||||||
pargs = self.app.pargs
|
pargs = self.app.pargs
|
||||||
if stype in ['html', 'proxy', 'php', 'php72', 'mysql', 'wp', 'wpsubdir',
|
if stype in ['html', 'proxy', 'php', 'php72', 'mysql', 'wp', 'wpsubdir',
|
||||||
'wpsubdomain', 'php73', 'php74', 'php80', 'php81', 'php82', 'php83', 'alias']:
|
'wpsubdomain', 'php73', 'php74', 'php80', 'php81', 'php82', 'php83', 'alias', 'subsite']:
|
||||||
Log.debug(self, "Setting apt_packages variable for Nginx")
|
Log.debug(self, "Setting apt_packages variable for Nginx")
|
||||||
|
|
||||||
# Check if server has nginx-custom package
|
# Check if server has nginx-custom package
|
||||||
|
|||||||
@@ -64,6 +64,9 @@ class WOSiteUpdateController(CementBaseController):
|
|||||||
(['--alias'],
|
(['--alias'],
|
||||||
dict(help="domain name to redirect to",
|
dict(help="domain name to redirect to",
|
||||||
action='store', nargs='?')),
|
action='store', nargs='?')),
|
||||||
|
(['--subsiteof'],
|
||||||
|
dict(help="create a subsite of a multisite install",
|
||||||
|
action='store', nargs='?')),
|
||||||
(['-le', '--letsencrypt'],
|
(['-le', '--letsencrypt'],
|
||||||
dict(help="configure letsencrypt ssl for the site",
|
dict(help="configure letsencrypt ssl for the site",
|
||||||
action='store' or 'store_const',
|
action='store' or 'store_const',
|
||||||
@@ -155,11 +158,18 @@ class WOSiteUpdateController(CementBaseController):
|
|||||||
alias_name = pargs.alias.strip()
|
alias_name = pargs.alias.strip()
|
||||||
if not alias_name:
|
if not alias_name:
|
||||||
Log.error(self, "Please provide alias name")
|
Log.error(self, "Please provide alias name")
|
||||||
|
elif stype is None and pargs.subsiteof:
|
||||||
|
stype, cache = 'subsite', ''
|
||||||
|
subsiteof_name = pargs.subsiteof.strip()
|
||||||
|
if not subsiteof_name:
|
||||||
|
Log.error(self, "Please provide multisite parent name")
|
||||||
elif stype is None and not (pargs.proxy or
|
elif stype is None and not (pargs.proxy or
|
||||||
pargs.letsencrypt or pargs.alias):
|
pargs.letsencrypt or
|
||||||
|
pargs.alias or
|
||||||
|
pargs.subsiteof):
|
||||||
stype, cache = 'html', 'basic'
|
stype, cache = 'html', 'basic'
|
||||||
elif stype and (pargs.proxy or pargs.alias):
|
elif stype and (pargs.proxy or pargs.alias or pargs.subsiteof):
|
||||||
Log.error(self, "--proxy/alias can not be used with other site types")
|
Log.error(self, "--proxy/alias/subsiteof can not be used with other site types")
|
||||||
|
|
||||||
if not pargs.site_name:
|
if not pargs.site_name:
|
||||||
try:
|
try:
|
||||||
@@ -293,6 +303,35 @@ class WOSiteUpdateController(CementBaseController):
|
|||||||
data['alias'] = True
|
data['alias'] = True
|
||||||
data['alias_name'] = alias_name
|
data['alias_name'] = alias_name
|
||||||
|
|
||||||
|
if stype == 'subsite':
|
||||||
|
# Get parent site data
|
||||||
|
parent_site_info = getSiteInfo(self, subsiteof_name)
|
||||||
|
if not parent_site_info:
|
||||||
|
Log.error(self, "Parent site {0} does not exist"
|
||||||
|
.format(subsiteof_name))
|
||||||
|
if not parent_site_info.is_enabled:
|
||||||
|
Log.error(self, "Parent site {0} is not enabled"
|
||||||
|
.format(subsiteof_name))
|
||||||
|
if parent_site_info.site_type not in ['wpsubdomain', 'wpsubdir']:
|
||||||
|
Log.error(self, "Parent site {0} is not WordPress multisite"
|
||||||
|
.format(subsiteof_name))
|
||||||
|
|
||||||
|
data = dict(
|
||||||
|
site_name=wo_domain, www_domain=wo_www_domain,
|
||||||
|
static=False, basic=False, multisite=False, webroot=wo_site_webroot)
|
||||||
|
|
||||||
|
data["wp"] = parent_site_info.site_type == 'wp'
|
||||||
|
data["wpfc"] = parent_site_info.cache_type == 'wpfc'
|
||||||
|
data["wpsc"] = parent_site_info.cache_type == 'wpsc'
|
||||||
|
data["wprocket"] = parent_site_info.cache_type == 'wprocket'
|
||||||
|
data["wpce"] = parent_site_info.cache_type == 'wpce'
|
||||||
|
data["wpredis"] = parent_site_info.cache_type == 'wpredis'
|
||||||
|
data["wpsubdir"] = parent_site_info.site_type == 'wpsubdir'
|
||||||
|
data["wo_php"] = ("php" + parent_site_info.php_version).replace(".", "")
|
||||||
|
data['subsite'] = True
|
||||||
|
data['subsiteof_name'] = subsiteof_name
|
||||||
|
data['subsiteof_webroot'] = parent_site_info.site_path
|
||||||
|
|
||||||
if stype == 'php':
|
if stype == 'php':
|
||||||
data = dict(
|
data = dict(
|
||||||
site_name=wo_domain, www_domain=wo_www_domain,
|
site_name=wo_domain, www_domain=wo_www_domain,
|
||||||
@@ -483,7 +522,8 @@ class WOSiteUpdateController(CementBaseController):
|
|||||||
version in WOVar.wo_php_versions.items()) and (stype == oldsitetype
|
version in WOVar.wo_php_versions.items()) and (stype == oldsitetype
|
||||||
and cache == oldcachetype
|
and cache == oldcachetype
|
||||||
and stype != 'alias'
|
and stype != 'alias'
|
||||||
and stype != 'proxy'):
|
and stype != 'proxy'
|
||||||
|
and stype != 'subsite'):
|
||||||
Log.debug(self, "Nothing to update")
|
Log.debug(self, "Nothing to update")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@@ -548,6 +588,13 @@ class WOSiteUpdateController(CementBaseController):
|
|||||||
" http://{0}".format(wo_domain))
|
" http://{0}".format(wo_domain))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if 'subsite' in data.keys() and data['subsite']:
|
||||||
|
updateSiteInfo(self, wo_domain, stype=stype, cache=cache,
|
||||||
|
ssl=(bool(check_site.is_ssl)))
|
||||||
|
Log.info(self, "Successfully updated site"
|
||||||
|
" http://{0}".format(wo_domain))
|
||||||
|
return 0
|
||||||
|
|
||||||
if pargs.letsencrypt:
|
if pargs.letsencrypt:
|
||||||
if data['letsencrypt'] is True:
|
if data['letsencrypt'] is True:
|
||||||
# DNS API configuration
|
# DNS API configuration
|
||||||
|
|||||||
@@ -45,7 +45,14 @@ server {
|
|||||||
|
|
||||||
{{^proxy}}
|
{{^proxy}}
|
||||||
{{^alias}}
|
{{^alias}}
|
||||||
|
|
||||||
|
{{^subsite}}
|
||||||
root {{webroot}}/htdocs;
|
root {{webroot}}/htdocs;
|
||||||
|
{{/subsite}}
|
||||||
|
|
||||||
|
{{#subsite}}
|
||||||
|
root {{subsiteof_webroot}}/htdocs;
|
||||||
|
{{/subsite}}
|
||||||
|
|
||||||
index {{^static}}index.php{{/static}} index.html index.htm;
|
index {{^static}}index.php{{/static}} index.html index.htm;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user