codecombat/scripts/devSetup/mongo.py

109 lines
4.1 KiB
Python

from __future__ import print_function
__author__ = u'schmatz'
from downloader import Downloader
import tarfile
from errors import DownloadCorruptionError
import warnings
import os
from configuration import Configuration
from dependency import Dependency
import sys
import shutil
class MongoDB(Dependency):
def __init__(self,configuration):
super(self.__class__, self).__init__(configuration)
operating_system = configuration.system.operating_system
self.config.directory.create_directory_in_tmp(u"mongo")
if operating_system == u"mac":
self.downloader = MacMongoDBDownloader(self)
elif operating_system == u"win":
self.downloader = WindowsMongoDBDownloader(self)
elif operating_system == u"linux":
self.downloader = LinuxMongoDBDownloader(self)
@property
def tmp_directory(self):
return self.config.directory.tmp_directory
@property
def bin_directory(self):
return self.config.directory.bin_directory
def bashrc_string(self):
return "COCO_MONGOD_PATH=" + self.config.directory.bin_directory + os.sep + u"mongo" + os.sep +"bin" + os.sep + "mongod"
def download_dependencies(self):
install_directory = self.config.directory.bin_directory + os.sep + u"mongo"
if os.path.exists(install_directory):
print(u"Skipping MongoDB download because " + install_directory + " exists.")
else:
self.downloader.download()
self.downloader.decompress()
def install_dependencies(self):
install_directory = self.config.directory.bin_directory + os.sep + u"mongo"
if os.path.exists(install_directory):
print(u"Skipping creation of " + install_directory + " because it exists.")
else:
shutil.copytree(self.findUnzippedMongoBinPath(),install_directory)
def findUnzippedMongoBinPath(self):
return self.downloader.download_directory + os.sep + \
(next(os.walk(self.downloader.download_directory))[1])[0] + os.sep + u"bin"
class MongoDBDownloader(Downloader):
@property
def download_url(self):
raise NotImplementedError
@property
def download_directory(self):
return self.dependency.tmp_directory + os.sep + u"mongo"
@property
def downloaded_file_path(self):
return self.download_directory + os.sep + u"mongodb.tgz"
def download(self):
print(u"Downloading MongoDB from URL " + self.download_url)
self.download_file(self.download_url,self.downloaded_file_path)
self.check_download()
def decompress(self):
print(u"Decompressing MongoDB...")
tfile = tarfile.open(self.downloaded_file_path)
#TODO: make directory handler class
tfile.extractall(self.download_directory)
print(u"Decompressed MongoDB into " + self.download_directory)
def check_download(self):
isFileValid = tarfile.is_tarfile(self.downloaded_file_path)
if not isFileValid:
raise DownloadCorruptionError(u"MongoDB download was corrupted.")
class LinuxMongoDBDownloader(MongoDBDownloader):
@property
def download_url(self):
if self.dependency.config.mem_width == 64:
return u"http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-latest.tgz"
else:
warnings.warn(u"MongoDB *really* doesn't run well on 32 bit systems. You have been warned.")
return u"http://fastdl.mongodb.org/linux/mongodb-linux-i686-latest.tgz"
class WindowsMongoDBDownloader(MongoDBDownloader):
@property
def download_url(self):
#TODO: Implement Windows Vista detection
warnings.warn(u"If you have a version of Windows older than 7, MongoDB may not function properly!")
if self.dependency.config.mem_width == 64:
return u"http://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-latest.zip"
else:
return u"http://fastdl.mongodb.org/win32/mongodb-win32-i386-latest.zip"
class MacMongoDBDownloader(MongoDBDownloader):
@property
def download_url(self):
return u"http://fastdl.mongodb.org/osx/mongodb-osx-x86_64-latest.tgz"