You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

329 lines
11 KiB

#!/usr/bin/env python
# (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
#
# All Rights Reserved. See copyright.txt for details and a complete list of authors.
# Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
# $Id$
# NOTICE:
# 1. This script is intended to be run as root.
# 2. A lot of optional features must be set to particular values before this script can work.
# For background material see:
# http://tikiwiki.org/tiki-index.php?page=RecipeMultiTiki
# http://tikiwiki.org/tiki-index.php?page=RecipeMultiTiki2
# invoke as ./add1tiki2multi.py -p <mysql-root-password> <new-tiki-url>
# something like: ./add1tiki2multi.py -p password new.wikiplanet.com
import os
import sys
import re
def usage():
print sys.argv[0], "[-p <mysql-root-password>] <new-tiki-domainname>"
if len(sys.argv) == 4:
if sys.argv[1] == "-p":
sMySQLPassword = sys.argv[2]
sNewDomain = sys.argv[3]
else:
usage()
sys.exit(-1)
elif len(sys.argv) == 2:
sNewDomain = sys.argv[1]
os.system("stty -echo")
sMySQLPassword = raw_input("mysql root password:")
os.system("stty echo")
print ""
else:
usage()
sys.exit(-1);
sNewDomain = sNewDomain.lower()
# This script must be run as root
if os.getuid():
print sys.argv[0], "must be run as root."
sys.exit(-1)
# sNewDomain has to look like new.wikiplanet.com
# check for two "."
if sNewDomain.count(".") != 2:
print sys.argv[0]+":", "Your new domain name must contain two \".\" characters. Exiting."
sys.exit(-1)
# check for length
if len(sNewDomain) > 80:
print sys.argv[0]+":", "Your new domain name is too long. Exiting."
sys.exit(-1)
# check for illegal characters
if re.search(r'[^-.a-z0-9]',sNewDomain):
print sys.argv[0]+":", "Your new domain name has illegal characters. Exiting."
sys.exit(-1)
# must start with a letter
if not re.search(r'^[a-z].+',sNewDomain):
print sys.argv[0]+":", "Your new domain name must start a letter. Exiting."
sys.exit(-1)
# must end with a letter
if not re.search(r'[a-z]$',sNewDomain):
print sys.argv[0]+":", "Your new domain name must end with a letter. Exiting."
sys.exit(-1)
# check for /var/www
if not os.path.exists("/var/www"):
print sys.argv[0]+":", "/var/www does not exist. Exiting."
sys.exit(-1)
# check for sNewDomain already in /var/www
if os.path.exists("/var/www/" + sNewDomain + ""):
print sys.argv[0]+":", "file /var/www/" + sNewDomain + " already exists. Exiting."
sys.exit(status)
# sPrefix should be someting like new from new.wikiplanet.com
sPrefix = sNewDomain[0:sNewDomain.find(".")]
# check for illegal characters
if re.search(r'[^-a-z0-9]',sPrefix):
print sys.argv[0]+":", "Your new domain prefix name has illegal characters. Exiting."
sys.exit(-1)
sDBName = "tiki_"+sPrefix
# check to see if the database exists
sTmpOutFileName = "/tmp/clikitiki-"+str(os.getpid())+".out"
sTmpErrFileName = "/tmp/clikitiki-"+str(os.getpid())+".err"
status = os.system("mysqlshow -uroot -p" + sMySQLPassword + " > "+sTmpOutFileName+" 2>"+sTmpErrFileName)
if status:
os.system("rm -f " + sTmpOutFileName + " " + sTmpErrFileName)
print sys.argv[0]+":", "mysqlshow failed. Maybe you used the wrong mysql root password? Exiting."
sys.exit(status)
os.system("rm -f " + sTmpErrFileName)
# The output from mysqlshow in should look something like this:
# +--------------+
# | Databases |
# +--------------+
# | mysql |
# | test |
# | tiki_members |
# | tiki_public |
# | tiki_staff |
# +--------------+
f = open(sTmpOutFileName,"r")
lines = f.readlines()
f.close()
os.system("rm -f " + sTmpOutFileName)
# print lines
pat0 = re.compile("\s([_a-z]+)\s")
for line in lines:
match = pat0.search(line)
if match:
# print match.start(), match.end(), match.group(1)
if match.group(1) == sDBName:
print sys.argv[0]+":", "There is already a database named " + sDBName +". Exiting."
sys.exit(-1)
# check for /etc
if not os.path.exists("/etc/"):
print sys.argv[0]+":", "/etc does not exist. Exiting."
sys.exit(status)
# check for /etc/httpd/conf.d
if not os.path.exists("/etc/httpd/conf.d"):
print sys.argv[0]+":", "File /etc/httpd/conf.d does not exist. Exiting."
sys.exit(status)
#
# Check for something like /etc/httd/conf.d/new.wikiplanet.com.vh
#
sVHFileName = "/etc/httpd/conf.d/" + sNewDomain + ".vh"
if os.path.exists(sVHFileName):
print sys.argv[0]+":", "file " + sVHFileName + " already exists. Exiting."
sys.exit(status)
#
# Check for Include /etc/httpd/conf.d/*.vh in /etc/httpd/conf/httpd.conf
#
f = open("/etc/httpd/conf/httpd.conf","r")
lines = f.readlines()
f.close()
bFound = False
for line in lines:
if line == "Include conf.d/*.vh\n":
bFound = True
break
if not bFound:
print sys.argv[0]+":", "Could not find Include conf.d/*.vh in /etc/httpd/conf/httpd.conf. Exiting."
sys.exit(-1)
#
# Check db/local.php
#
f = open("/var/www/tikiwiki/db/local.php","r")
lines = f.readlines()
f.close
# look for the last else
last = 0;
for i in range (0, len(lines)):
if lines[i].find("else") != -1:
last = i
if last == 0:
print sys.argv[0]+":", "Your db/local.php is not in the expected format. Exiting."
sys.exit(-1)
# Look for sDomainName in local.php
found = False
for i in range (0, len(lines)):
if lines[i].find("sDomainName") != -1:
found = True
if found:
print sys.argv[0]+":", sDomainName, "is aleady defined in db/local.php. Exiting."
sys.exit(-1)
#
# So far, we have not done anything except check the input and the state of the
# system. Now it is time to:
# 1. Create the new database
# 2. Add the right mysql permission to the database
# 3. Load the database from /var/www/tikiwiki/db/tiki.sql
# 4. Create the new symbolic link in /var/www
# 5. Create the new directories in /var/www/tikiwiki
# 6. Create the .vh file in /etc/httpd/conf.d
# 7. Modify /var/www/tikiwiki/db/local.php
# 8. Restart apache
# The data we already have:
# sMySQLPassword - the root password for mysql, something like "password"
# sNewDomain - the name of the new domain, something like "new.wikiplanet.com"
# sPrefix - the prefix of the new domain, something like "new"
# sDBName - the name of the new database, something like "tiki_new"
# sTmpOutFileName - a temp file name, something like "/tmp/clickitiki-1234.out"
# sTmpErrFileName - a temp file name, something like "/tmp/clickitiki-1234.err"
# sVHFileName - new .vh file, something like "/etc/httd/conf.d/new.wikiplanet.com.vh"
# 1. Create the new database
sCommand = "mysqladmin -uroot -p" + sMySQLPassword + " create " + sDBName
status = os.system(sCommand)
if status:
print sys.argv[0]+":", sCommand, "failed. Exiting."
sys.exit(status)
# 2. Add the right mysql permission to the database
f = open(sTmpOutFileName, "w")
f.write("""GRANT ALL PRIVILEGES ON `"""+sDBName+"""` . * TO "tiki"@"localhost";\n""")
f.write("""REVOKE GRANT OPTION ON `"""+sDBName+"""` . * FROM "tiki"@"localhost";\n""")
f.close()
sCommand = "mysql -uroot mysql -p" + sMySQLPassword + "< " + sTmpOutFileName
status = os.system(sCommand)
if status:
print sys.argv[0]+":", sCommand, "failed. Exiting."
sys.exit(status)
os.system("rm -f " + sTmpOutFileName)
# 3. Load the database from tikiwiki/db/tiki.sql
sCommand = "mysql -uroot -p" + sMySQLPassword + " " + sDBName + " < /var/www/tikiwiki/db/tiki.sql"
status = os.system(sCommand)
if status:
print sys.argv[0]+":", sCommand, "failed. Exiting."
sys.exit(status)
# 4. Create the new symbolic link in /var/www
os.chdir("/var/www")
sCommand = "ln -s tikiwiki " + sNewDomain
status = os.system(sCommand)
if status:
print sys.argv[0]+":", sCommand, "failed. Exiting."
sys.exit(status)
os.chdir("/var/www/tikiwiki")
# 5. Create the new directories in /var/www/tikiwiki
sApacheGID = sApacheUID = 48 # FIXME This need to be generalized
# FIXME The following lines need error checking
# FIXME Should maybe set the permission on the new directories
os.mkdir("./backups/" + sNewDomain)
os.chown("./backups/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./db/" + sNewDomain)
os.chown("./db/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./dump/" + sNewDomain)
os.chown("./dump/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./files/" + sNewDomain)
os.chown("./files/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./img/trackers/" + sNewDomain)
os.chown("./img/trackers/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./img/wiki/" + sNewDomain)
os.chown("./img/wiki/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./img/wiki_up/" + sNewDomain)
os.chown("./img/wiki_up/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./installer/" + sNewDomain)
os.chown("./installer/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./maps/" + sNewDomain)
os.chown("./maps/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./mods/" + sNewDomain)
os.chown("./mods/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./modules/cache/" + sNewDomain)
os.chown("./modules/cache/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./styles/" + sNewDomain)
os.chown("./styles/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./temp/" + sNewDomain)
os.chown("./temp/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./temp/cache/" + sNewDomain)
os.chown("./temp/cache/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./templates/" + sNewDomain)
os.chown("./templates/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./temp/templates_c/" + sNewDomain)
os.chown("./temp/templates_c/" + sNewDomain, sApacheUID, sApacheGID)
os.mkdir("./whelp/" + sNewDomain)
os.chown("./whelp/" + sNewDomain, sApacheUID, sApacheGID)
# 6. Create the .vh file in /etc/httpd/conf.d
sDomainLastPart = sNewDomain[sNewDomain.find(".")+1:] # something like "wikiplanet.com"
f = open(sVHFileName, "w");
# These need to be generalized
f.write("<VirtualHost *:80>\n");
f.write(" ServerAdmin webmaster@" + sDomainLastPart + "\n");
f.write(" DocumentRoot /var/www/" + sNewDomain + "\n");
f.write(" ServerName " + sNewDomain + "\n");
f.write(" ErrorLog logs/" + sNewDomain + "-error_log\n");
f.write(" CustomLog logs/" + sNewDomain + "-access_log common\n");
f.write("</VirtualHost>\n");
f.close();
# 7. Modify db/local.php
# insert three lines at the correct place
f = open("/var/www/tikiwiki/db/local.php","r")
lines = f.readlines()
f.close
for i in range (0, len(lines)):
if lines[i].find("else") != -1:
last = i
lout = []
for i in range (0, last):
lout.append(lines[i])
lout.append("""} else if ($_SERVER["HTTP_HOST"] == \"""" + sNewDomain + """\") {\n""")
lout.append(""" $dbs_tiki = \"""" + sDBName + """\";\n""")
lout.append(""" $tikidomain = \"""" + sNewDomain + """\";\n""")
for i in range (last, len(lines)):
lout.append(lines[i])
f = open("db/local.php","w")
f.writelines(lout)
f.close
# 8. Restart apache
os.system("/usr/sbin/apachectl graceful")