diff --git a/install_erpnext.py b/install_erpnext.py deleted file mode 100644 index 51debce9ed..0000000000 --- a/install_erpnext.py +++ /dev/null @@ -1,311 +0,0 @@ -# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors -# License: GNU General Public License v3. See license.txt - -#!/usr/bin/env python -from __future__ import unicode_literals -import os, sys -import argparse -import subprocess - -is_redhat = is_debian = None -root_password = None - -requirements = [ - "chardet", - "cssmin", - "dropbox", - "google-api-python-client", - "gunicorn", - "httplib2", - "jinja2", - "markdown2", - "markupsafe", - "mysql-python", - "pygeoip", - "python-dateutil", - "python-memcached", - "pytz==2013d", - "requests", - "six", - "slugify", - "termcolor", - "werkzeug", - "semantic_version", - "gitpython==0.3.2.RC1" -] - -def install(install_path): - setup_folders(install_path) - install_erpnext(install_path) - - post_install(install_path) - -def install_pre_requisites(): - global is_redhat, is_debian - is_redhat, is_debian = validate_install() - if is_redhat: - install_using_yum() - elif is_debian: - install_using_apt() - - install_python_modules() - - print "-"*80 - print "Pre-requisites Installed" - print "-"*80 - -def validate_install(): - import platform - - # check os - operating_system = platform.system() - print "Operating System =", operating_system - if operating_system != "Linux": - raise Exception, "Sorry! This installer works only for Linux based Operating Systems" - - # check python version - python_version = sys.version.split(" ")[0] - print "Python Version =", python_version - if not (python_version and int(python_version.split(".")[0])==2 and int(python_version.split(".")[1]) >= 7): - raise Exception, "Hey! ERPNext needs Python version to be 2.7+" - - # check distribution - distribution = platform.linux_distribution()[0].lower().replace('"', '') - print "Distribution = ", distribution - is_redhat = distribution in ("redhat", "red hat enterprise linux server", "centos", "centos linux", "fedora") - is_debian = distribution in ("debian", "ubuntu", "elementary os", "linuxmint") - - if not (is_redhat or is_debian): - raise Exception, "Sorry! This installer works only with yum or apt-get package management" - - return is_redhat, is_debian - -def install_using_yum(): - packages = "gcc MySQL-python git memcached ntp vim-enhanced screen" - - print "-"*80 - print "Installing Packages: (This may take some time)" - print packages - print "-"*80 - exec_in_shell("yum install -y %s" % packages) - - - try: - exec_in_shell("which mysql") - except subprocess.CalledProcessError: - packages = "mysql mysql-server mysql-devel" - print "Installing Packages:", packages - exec_in_shell("yum install -y %s" % packages) - exec_in_shell("service mysqld restart") - - # set a root password post install - global root_password - print "Please create a password for root user of MySQL" - root_password = (get_root_password() or "erpnext").strip() - exec_in_shell('mysqladmin -u root password "%s"' % (root_password,)) - print "Root password set as", root_password - - update_config_for_redhat() - -def update_config_for_redhat(): - import re - - # set to autostart on startup - for service in ("mysqld", "memcached"): - exec_in_shell("chkconfig --level 2345 %s on" % service) - exec_in_shell("service %s restart" % service) - -def install_using_apt(): - exec_in_shell("apt-get update") - packages = "python python-setuptools python-dev build-essential python-mysqldb git memcached ntp vim screen htop" - print "-"*80 - print "Installing Packages: (This may take some time)" - print packages - print "-"*80 - exec_in_shell("apt-get install -y %s" % packages) - global root_password - if not root_password: - root_password = get_root_password() - exec_in_shell("echo mysql-server mysql-server/root_password password %s | sudo debconf-set-selections" % root_password) - exec_in_shell("echo mysql-server mysql-server/root_password_again password %s | sudo debconf-set-selections" % root_password) - - try: - exec_in_shell("which mysql") - except subprocess.CalledProcessError: - packages = "mysql-server libmysqlclient-dev" - print "Installing Packages:", packages - exec_in_shell("apt-get install -y %s" % packages) - - update_config_for_debian() - -def update_config_for_debian(): - for service in ("mysql",): - exec_in_shell("service %s restart" % service) - -def install_python_modules(): - print "-"*80 - print "Installing Python Modules: (This may take some time)" - print "-"*80 - - try: - exec_in_shell("which pip2.7") - except subprocess.CalledProcessError: - exec_in_shell("easy_install-2.7 pip") - - exec_in_shell("pip2.7 install --upgrade setuptools --no-use-wheel") - exec_in_shell("pip2.7 install --upgrade setuptools") - exec_in_shell("pip2.7 install {}".format(' '.join(requirements))) - -def install_erpnext(install_path): - print - print "-"*80 - print "Installing ERPNext" - print "-"*80 - - # ask for details - global root_password - if not root_password: - root_password = get_root_password() - test_root_connection(root_password) - - db_name = raw_input("ERPNext Database Name: ") - if not db_name: - raise Exception, "Sorry! You must specify ERPNext Database Name" - - # setup paths - sys.path = [".", "lib", "app"] + sys.path - import wnf - - # install database, run patches, update schema - # setup_db(install_path, root_password, db_name) - wnf.install(db_name, root_password=root_password) - - setup_cron(install_path) - -def get_root_password(): - # ask for root mysql password - import getpass - root_pwd = None - root_pwd = getpass.getpass("MySQL Root user's Password: ") - return root_pwd - -def test_root_connection(root_pwd): - out = exec_in_shell("mysql -u root %s -e 'exit'" % \ - (("-p"+root_pwd) if root_pwd else "").replace('$', '\$').replace(' ', '\ ')) - if "access denied" in out.lower(): - raise Exception("Incorrect MySQL Root user's password") - -def setup_folders(install_path): - os.chdir(install_path) - app = os.path.join(install_path, "app") - if not os.path.exists(app): - print "Cloning erpnext" - exec_in_shell("cd %s && git clone --branch master https://github.com/frappe/erpnext.git app" % install_path) - exec_in_shell("cd app && git config core.filemode false") - if not os.path.exists(app): - raise Exception, "Couldn't clone erpnext repository" - - lib = os.path.join(install_path, "lib") - if not os.path.exists(lib): - print "Cloning frappe" - exec_in_shell("cd %s && git clone --branch master https://github.com/frappe/frappe.git lib" % install_path) - exec_in_shell("cd lib && git config core.filemode false") - if not os.path.exists(lib): - raise Exception, "Couldn't clone frappe repository" - - public = os.path.join(install_path, "public") - for p in [public, os.path.join(public, "files"), os.path.join(public, "backups"), - os.path.join(install_path, "logs")]: - if not os.path.exists(p): - os.mkdir(p) - -def setup_conf(install_path, db_name): - import os, string, random, re - - # generate db password - char_range = string.ascii_letters + string.digits - db_password = "".join((random.choice(char_range) for n in xrange(16))) - - # make conf file - with open(os.path.join(install_path, "lib", "conf", "conf.py"), "r") as template: - conf = template.read() - - conf = re.sub("db_name.*", 'db_name = "%s"' % (db_name,), conf) - conf = re.sub("db_password.*", 'db_password = "%s"' % (db_password,), conf) - - with open(os.path.join(install_path, "conf.py"), "w") as conf_file: - conf_file.write(conf) - - return db_password - -def post_install(install_path): - pass - -def exec_in_shell(cmd): - # using Popen instead of os.system - as recommended by python docs - import subprocess - out = subprocess.check_output(cmd, shell=True) - return out - -def parse_args(): - parser = argparse.ArgumentParser() - parser.add_argument('--create_user', default=False, action='store_true') - parser.add_argument('--username', default='erpnext') - parser.add_argument('--password', default='erpnext') - parser.add_argument('--no_install_prerequisites', default=False, action='store_true') - return parser.parse_args() - -def create_user(username, password): - import subprocess, pwd - p = subprocess.Popen("useradd -m -d /home/{username} -s {shell} {username}".format(username=username, shell=os.environ.get('SHELL')).split()) - p.wait() - p = subprocess.Popen("passwd {username}".format(username=username).split(), stdin=subprocess.PIPE) - p.communicate('{password}\n{password}\n'.format(password=password)) - p.wait() - return pwd.getpwnam(username).pw_uid - -def setup_cron(install_path): - erpnext_cron_entries = [ - "*/3 * * * * cd %s && python2.7 lib/wnf.py --run_scheduler >> erpnext-sch.log 2>&1" % install_path, - "0 */6 * * * cd %s && python2.7 lib/wnf.py --backup >> erpnext-backup.log 2>&1" % install_path - ] - for row in erpnext_cron_entries: - try: - existing_cron = exec_in_shell("crontab -l") - if row not in existing_cron: - exec_in_shell('{ crontab -l; echo "%s"; } | crontab' % row) - except: - exec_in_shell('echo "%s" | crontab' % row) - -if __name__ == "__main__": - args = parse_args() - install_path = os.getcwd() - if os.getuid() != 0 and args.create_user and not args.no_install_prequisites: - raise Exception, "Please run this script as root" - - if args.create_user: - uid = create_user(args.username, args.password) - install_path = '/home/{username}/erpnext'.format(username=args.username) - - if not args.no_install_prerequisites: - install_pre_requisites() - - if os.environ.get('SUDO_UID') and not args.create_user: - os.setuid(int(os.environ.get('SUDO_UID'))) - - if os.getuid() == 0 and args.create_user: - os.setuid(uid) - if install_path: - os.mkdir(install_path) - - install(install_path=install_path) - print - print "-"*80 - print "Installation complete" - print "To start the development server," - print "Login as {username} with password {password}".format(username=args.username, password=args.password) - print "cd {}".format(install_path) - print "./lib/wnf.py --serve" - print "-"*80 - print "Open your browser and go to http://localhost:8000" - print "Login using username = Administrator and password = admin"