import os
import shutil
import glob
import datetime
import errno
import logging
import psutil
import yaml
from esgf_utilities import esg_functions, pybash
from esgf_utilities.esg_exceptions import SubprocessError
from base import esg_tomcat_manager
from index_node import solr
from plumbum.commands import ProcessExecutionError
logger = logging.getLogger("esgf_logger" +"."+ __name__)
with open(os.path.join(os.path.dirname(__file__), 'esg_config.yaml'), 'r') as config_file:
config = yaml.load(config_file)
[docs]def purge_postgres():
'''Removes postgres installation via yum'''
print "\n*******************************"
print "Purging Postgres"
print "******************************* \n"
try:
esg_functions.call_binary("service", ["postgresql", "stop"])
except ProcessExecutionError:
pass
try:
esg_functions.call_binary("yum", ["remove", "-y", "postgresql-server.x86_64", "postgresql.x86_64", "postgresql-devel.x86_64"])
except ProcessExecutionError:
pass
try:
shutil.rmtree("/var/lib/pgsql")
os.remove(os.path.join(os.environ["HOME"], ".pgpass"))
except OSError:
pass
def purge_tomcat():
print "\n*******************************"
print "Purging Tomcat"
print "******************************* \n"
esg_tomcat_manager.stop_tomcat()
try:
os.remove("/etc/logrotate.d/esgf_tomcat")
except OSError, error:
pass
tomcat_directories = glob.glob("/usr/local/tomcat*")
tomcat_directories.extend(glob.glob("/usr/local/apache-tomcat*"))
for directory in tomcat_directories:
try:
shutil.rmtree(directory)
except OSError:
if os.path.islink(directory):
os.unlink(directory)
pass
try:
os.remove("/tmp/catalina.pid")
except OSError, error:
if error.errno == errno.ENOENT:
pass
# Tomcat may leave stuck java processes. Kill them with extreme prejudice
try:
esg_functions.call_binary("pkill", ["-9", "-f", "'java.*/usr/local/tomcat'"])
except ProcessExecutionError:
pass
def purge_java():
print "\n*******************************"
print "Purging Java"
print "******************************* \n"
java_tarfile = "jdk{}-64.tar.gz".format(config["java_version"])
try:
os.remove("/usr/local/src/esgf/workbench/esg/{}".format(java_tarfile))
except OSError:
pass
try:
shutil.rmtree("/usr/local/jdk{}".format(config["java_version"]))
except OSError:
pass
try:
os.unlink("/usr/local/java")
except OSError:
pass
try:
shutil.rmtree("/usr/bin/java")
except OSError:
pass
def purge_ant():
print "\n*******************************"
print "Purging Ant"
print "******************************* \n"
try:
esg_functions.call_binary("yum", ["remove", "-y", "ant"])
except ProcessExecutionError:
pass
def purge_thredds():
print "\n*******************************"
print "Purging Thredds"
print "******************************* \n"
try:
shutil.rmtree("/usr/local/tomcat/webapps/thredds")
except OSError:
pass
def purge_base():
print "\n*******************************"
print "Purging Base ESGF Directories"
print "******************************* \n"
directories_to_delete = ["/esg", "/etc/certs", "/etc/esgfcerts",
"/etc/tempcerts", "/opt/esgf", "/tmp/inputpipe", "/tmp/outputpipe", "/usr/local/cog", "/var/www/.python-eggs", "/usr/local/src/esgf/workbench/esg"]
files_to_delete = ["/etc/httpd/conf/esgf-httpd.conf", "/usr/local/bin/add_checksums_to_map.sh"]
try:
esg_functions.call_binary("umount", ["/esg/gridftp_root/esg_dataroot"])
except ProcessExecutionError:
pass
for directory in directories_to_delete:
try:
print "Deleting {directory}: ".format(directory=directory)
shutil.rmtree(directory)
except OSError:
pass
for file_name in files_to_delete:
try:
print "Deleting {file_name}: ".format(file_name=file_name)
os.remove(file_name)
except OSError, error:
pass
# We want to potentially preserve certificates, as they may be
# annoying to recreate and sign.
if os.path.isfile("/etc/hostcert.pem"):
logger.warning("preserving /etc/hostcert.pem to /tmp/hostcert-%s.pem",str(datetime.date.today()))
shutil.move("/etc/hostcert.pem", "/tmp/hostcert-{DATETIME}.pem".format(DATETIME=str(datetime.date.today())))
if os.path.isfile("/etc/hostkey.pem"):
logger.warning("preserving /etc/hostkey.pem to /tmp/hostkey-%s.pem",str(datetime.date.today()))
shutil.move("/etc/hostkey.pem", "/tmp/hostkey-{DATETIME}.pem".format(DATETIME=str(datetime.date.today())))
# We don't need to preserve the certificate signing request
try:
os.remove("/etc/hostcert_request.pem")
except OSError, error:
pass
# WARNING: if $HOME has been reset from /root during an install
# run, these directories could show up in a different place!
root_dirs = ["/root/.cache", "/root/.python-eggs"]
for directory in root_dirs:
try:
shutil.rmtree(directory)
except OSError, error:
pass
for directory in glob.glob("/usr/local/esgf*"):
for directory in root_dirs:
try:
shutil.rmtree(directory)
except OSError, error:
pass
def purge_cdat():
pass
def purge_cog():
try:
shutil.rmtree("/usr/local/cog")
except OSError:
pass
try:
os.remove("/usr/local/bin/wait_for_postgres.sh")
except OSError:
pass
def purge_apache():
try:
esg_functions.call_binary("yum", ["remove", "-y", "httpd", "httpd-devel", "mod_ssl"])
except ProcessExecutionError:
pass
try:
shutil.rmtree("/etc/httpd")
except OSError, error:
if error.errno == errno.ENOENT:
pass
def purge_conda():
try:
shutil.rmtree("/usr/local/conda")
except OSError, error:
if error.errno == errno.ENOENT:
pass
def purge_solr():
print "\n*******************************"
print "Purging Solr"
print "******************************* \n"
try:
solr.stop_solr()
except (OSError, ProcessExecutionError):
pass
for directory in glob.glob("/usr/local/esgf-solr-*"):
try:
shutil.rmtree(directory)
except OSError:
pass
for directory in glob.glob("/usr/local/solr-*"):
try:
shutil.rmtree(directory)
except OSError:
pass
try:
os.unlink("/usr/local/solr")
except OSError, error:
if error.errno == errno.ENOENT:
pass
else:
logger.exception("Could not delete symlink /usr/local/tomcat")
# Solr may leave stuck java processes. Kill them with extreme prejudice
try:
esg_functions.call_binary("pkill", ["-9", "-f", "'java.*/usr/local/tomcat'"])
except ProcessExecutionError:
pass
def purge_globus():
logger.info("Purging Globus")
esg_functions.call_binary("yum", ["remove", "-y", "globus*" ,"myproxy*"])
try:
shutil.rmtree("/etc/esgfcerts")
except OSError:
pass
try:
os.remove("/etc/globus-host-ssl.conf")
except OSError:
pass
try:
os.remove("/etc/globus-user-ssl.conf")
except OSError:
pass
try:
os.remove("/etc/grid-security.conf")
except OSError:
pass
globus_directories = glob.glob("/etc/globus*")
for directory in globus_directories:
try:
shutil.rmtree(directory)
except OSError, error:
#if not a directory; use file delete method
if error.errno == errno.ENOTDIR:
os.remove(directory)
try:
shutil.rmtree("/etc/grid-security")
except OSError:
pass
gridftp_directories = glob.glob("/etc/gridftp*")
for directory in gridftp_directories:
try:
shutil.rmtree(directory)
except OSError, error:
if error.errno == errno.ENOTDIR:
os.remove(directory)
try:
os.remove("/etc/logrotate.d/globus-connect-server")
except OSError:
pass
myproxy_directories = glob.glob("/etc/myproxy*")
for directory in myproxy_directories:
try:
shutil.rmtree(directory)
except OSError, error:
if error.errno == errno.ENOTDIR:
os.remove(directory)
try:
shutil.rmtree("/etc/pam.d/myproxy")
except OSError:
pass
try:
os.remove("/etc/pam_pgsql.conf")
except OSError:
pass
try:
os.remove("/etc/pam_pgsql.conf.tmpl.bak")
except OSError:
pass
globus_gridftp_directories = glob.glob("/etc/rc.d/init.d/globus-gridftp-*")
for directory in globus_gridftp_directories:
try:
shutil.rmtree(directory)
except OSError, error:
if error.errno == errno.ENOTDIR:
os.remove(directory)
try:
shutil.rmtree(os.path.join(os.environ["HOME"], ".globus"))
except OSError:
pass
try:
shutil.rmtree("/root/.globus")
except OSError:
pass
try:
shutil.rmtree("/usr/local/globus")
except OSError:
pass
try:
shutil.rmtree("/usr/local/gsoap")
except OSError:
pass
try:
shutil.rmtree("/usr/share/myproxy")
except OSError:
pass
try:
shutil.rmtree("/var/lib/globus")
except OSError:
pass
try:
shutil.rmtree("/var/lib/globus-connect-server")
except OSError:
pass
try:
shutil.rmtree("/var/lib/myproxy")
except OSError:
pass
globus_modules = glob.glob("/usr/local/conda/envs/esgf-pub/lib/python2.7/site-packages/globus*")
for module in globus_modules:
try:
shutil.rmtree(module)
except OSError:
pass
globus_binaries = glob.glob("/usr/bin/globus*")
for binary in globus_binaries:
try:
os.remove(binary)
except OSError, error:
if error.errno == errno.EISDIR:
shutil.rmtree(binary)
def purge_publisher():
try:
shutil.rmtree("/tmp/esg-publisher")
except OSError:
pass
publisher_binaries = glob.glob("/usr/local/conda/envs/esgf-pub/bin/esg*")
for binary in publisher_binaries:
try:
os.remove(binary)
except OSError:
pass
publisher_modules = glob.glob("/usr/local/conda/envs/esgf-pub/lib/python2.7/site-packages/esg*")
for module in publisher_modules:
try:
shutil.rmtree(module)
except OSError:
pass
def purge_dashboard():
try:
shutil.rmtree("/esg/config/dashboard")
except OSError:
pass
try:
shutil.rmtree("/usr/local/tomcat/webapps/esgf-stats-api")
except OSError:
pass
try:
shutil.rmtree("/usr/local/dashboard")
except OSError:
pass
try:
shutil.rmtree("/usr/local/esgf-dashboard")
except OSError:
pass
try:
shutil.rmtree("/usr/local/esgf-dashboard-ip")
except OSError:
pass
def confirm_purge():
purged_directories = ["/var/lib/pgsql", "/usr/local/java", "/usr/bin/java", "/usr/local/tomcat", "/esg", "/etc/certs", "/etc/esgfcerts",
"/etc/tempcerts", "/opt/esgf", "/tmp/inputpipe", "/tmp/outputpipe", "/usr/local/cog", "/var/www/.python-eggs", "/usr/local/solr"]
for directory in purged_directories:
if os.path.exists(directory):
print "Purge failed. {} still exists and must be delete manually.".format(directory)
return
print "All ESGF components have been successfully deleted."
def purge_slcs():
try:
shutil.rmtree("/usr/local/src/esgf-slcs-server-playbook")
except OSError, error:
if error.errno == errno.ENOENT:
pass
try:
shutil.rmtree("/usr/local/esgf-slcs-server")
except OSError, error:
if error.errno == errno.ENOENT:
pass
def main():
purge_postgres()
purge_tomcat()
purge_thredds()
purge_ant()
purge_publisher()
purge_dashboard()
purge_solr()
purge_java()
purge_base()
purge_cdat()
purge_apache()
purge_cog()
purge_globus()
purge_slcs()
confirm_purge()
if __name__ == '__main__':
main()