new install_erpnext.py, first cut

This commit is contained in:
Pratik Vyas 2013-10-24 23:59:53 +05:30
parent 7fa2ec40e1
commit fe44d27d7f

View File

@ -5,15 +5,36 @@
from __future__ import unicode_literals
import os, sys
apache_user = None
is_redhat = is_debian = None
root_password = None
requirements = [
"MySQL-python",
"pytz==2013b",
"python-dateutil",
"jinja2",
"markdown2",
"termcolor",
"python-memcached",
"requests",
"chardet",
"dropbox",
"google-api-python-client ",
"pygeoip"
]
def install(install_path=None):
if os.getuid() != 0:
raise Exception, "Please run this script as root"
install_pre_requisites()
if os.environ.get('SUDO_UID'):
os.setuid(int(os.environ.get('SUDO_UID')))
if not install_path:
install_path = os.getcwd()
setup_folders(install_path)
install_erpnext(install_path)
post_install(install_path)
@ -44,7 +65,7 @@ def validate_install():
# 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]) >= 6):
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.6+"
# check distribution
@ -59,7 +80,7 @@ def validate_install():
return is_redhat, is_debian
def install_using_yum():
packages = "python python-setuptools gcc python-devel MySQL-python httpd git memcached ntp vim-enhanced screen"
packages = "python python-setuptools gcc python-devel MySQL-python git memcached ntp vim-enhanced screen"
print "-"*80
print "Installing Packages: (This may take some time)"
@ -92,9 +113,6 @@ def install_using_yum():
def update_config_for_redhat():
import re
global apache_user
apache_user = "apache"
# update memcache user
with open("/etc/sysconfig/memcached", "r") as original:
memcached_conf = original.read()
@ -108,7 +126,7 @@ def update_config_for_redhat():
def install_using_apt():
exec_in_shell("apt-get update")
packages = "python python-setuptools python-dev build-essential python-pip python-mysqldb apache2 git memcached ntp vim screen htop"
packages = "python python-setuptools python-dev build-essential python-pip python-mysqldb git memcached ntp vim screen htop"
print "-"*80
print "Installing Packages: (This may take some time)"
print packages
@ -123,8 +141,6 @@ def install_using_apt():
update_config_for_debian()
def update_config_for_debian():
global apache_user
apache_user = "www-data"
# update memcache user
with open("/etc/memcached.conf", "r") as original:
@ -132,14 +148,10 @@ def update_config_for_debian():
with open("/etc/memcached.conf", "w") as modified:
modified.write(memcached_conf.replace("-u memcache", "-u %s" % apache_user))
exec_in_shell("a2enmod rewrite")
for service in ("mysql", "apache2", "memcached", "ntpd"):
for service in ("mysql", "memcached", "ntpd"):
exec_in_shell("service %s restart" % service)
def install_python_modules():
python_modules = "pytz python-dateutil jinja2 markdown2 termcolor python-memcached requests chardet dropbox google-api-python-client pygeoip"
print "-"*80
print "Installing Python Modules: (This may take some time)"
print python_modules
@ -151,7 +163,7 @@ def install_python_modules():
exec_in_shell("pip install --upgrade pip")
exec_in_shell("pip install --upgrade setuptools")
exec_in_shell("pip install --upgrade virtualenv")
exec_in_shell("pip install -q %s" % python_modules)
exec_in_shell("pip install -r {}".format(' '.join(requirements)))
def install_erpnext(install_path):
print
@ -169,19 +181,15 @@ def install_erpnext(install_path):
if not db_name:
raise Exception, "Sorry! You must specify ERPNext Database Name"
# install folders and conf
setup_folders(install_path)
setup_conf(install_path, db_name)
# setup paths
sys.path.extend([".", "lib", "app"])
sys.path = [".", "lib", "app"] + sys.path
import wnf
# install database, run patches, update schema
setup_db(install_path, root_password, db_name)
setup_cron(install_path)
setup_apache_conf(install_path)
# 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
@ -200,7 +208,7 @@ def setup_folders(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 https://github.com/webnotes/erpnext.git app" % install_path)
exec_in_shell("cd %s && git clone https://github.com/webnotes/erpnext.git app && cd app && git checkout wsgi" % 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"
@ -208,7 +216,7 @@ def setup_folders(install_path):
lib = os.path.join(install_path, "lib")
if not os.path.exists(lib):
print "Cloning wnframework"
exec_in_shell("cd %s && git clone https://github.com/webnotes/wnframework.git lib" % install_path)
exec_in_shell("cd %s && git clone https://github.com/webnotes/wnframework.git lib && cd lib && git checkout wsgi" % install_path)
exec_in_shell("cd lib && git config core.filemode false")
if not os.path.exists(lib):
raise Exception, "Couldn't clone wnframework repository"
@ -238,86 +246,13 @@ def setup_conf(install_path, db_name):
return db_password
def setup_db(install_path, root_password, db_name):
from webnotes.install_lib.install import Installer
inst = Installer("root", root_password)
inst.import_from_db(db_name, verbose=1)
# run patches and sync
exec_in_shell("./lib/wnf.py --patch_sync_build")
def setup_cron(install_path):
erpnext_cron_entries = [
"*/3 * * * * cd %s && python lib/wnf.py --run_scheduler >> /var/log/erpnext-sch.log 2>&1" % install_path,
"0 */6 * * * cd %s && python lib/wnf.py --backup >> /var/log/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)
def setup_apache_conf(install_path):
apache_conf_content = """Listen 8080
NameVirtualHost *:8080
<VirtualHost *:8080>
ServerName localhost
DocumentRoot %s/public/
AddHandler cgi-script .cgi .xml .py
AddType application/vnd.ms-fontobject .eot
AddType font/ttf .ttf
AddType font/otf .otf
AddType application/x-font-woff .woff
<Directory %s/public/>
# directory specific options
Options -Indexes +FollowSymLinks +ExecCGI
# directory's index file
DirectoryIndex web.py
AllowOverride all
Order Allow,Deny
Allow from all
# rewrite rule
RewriteEngine on
RewriteCond %%{REQUEST_FILENAME} !-f
RewriteCond %%{REQUEST_FILENAME} !-d
RewriteCond %%{REQUEST_FILENAME} !-l
RewriteRule ^([^/]+)$ /web.py?page=$1 [QSA,L]
</Directory>
</VirtualHost>""" % (install_path, install_path)
new_apache_conf_path = os.path.join(install_path, os.path.basename(install_path)+".conf")
with open(new_apache_conf_path, "w") as apache_conf_file:
apache_conf_file.write(apache_conf_content)
def post_install(install_path):
global apache_user
exec_in_shell("chown -R %s %s" % (apache_user, install_path))
apache_conf_filename = os.path.basename(install_path)+".conf"
if is_redhat:
os.symlink(os.path.join(install_path, apache_conf_filename),
os.path.join("/etc/httpd/conf.d", apache_conf_filename))
exec_in_shell("service httpd restart")
elif is_debian:
os.symlink(os.path.join(install_path, apache_conf_filename),
os.path.join("/etc/apache2/sites-enabled", apache_conf_filename))
exec_in_shell("service apache2 restart")
print
print "-"*80
print "To change url domain, run: lib/wnf.py --domain example.com"
print "To start the development server, run lib/wnf.py --serve"
print "-"*80
print "Installation complete"
print "Open your browser and go to http://localhost:8080"
print "Open your browser and go to http://localhost:8000"
print "Login using username = Administrator and password = admin"
def exec_in_shell(cmd):