new install_erpnext.py, first cut
This commit is contained in:
parent
7fa2ec40e1
commit
fe44d27d7f
@ -5,15 +5,36 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import os, sys
|
import os, sys
|
||||||
|
|
||||||
apache_user = None
|
|
||||||
is_redhat = is_debian = None
|
is_redhat = is_debian = None
|
||||||
root_password = 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):
|
def install(install_path=None):
|
||||||
|
if os.getuid() != 0:
|
||||||
|
raise Exception, "Please run this script as root"
|
||||||
|
|
||||||
install_pre_requisites()
|
install_pre_requisites()
|
||||||
|
|
||||||
|
if os.environ.get('SUDO_UID'):
|
||||||
|
os.setuid(int(os.environ.get('SUDO_UID')))
|
||||||
|
|
||||||
if not install_path:
|
if not install_path:
|
||||||
install_path = os.getcwd()
|
install_path = os.getcwd()
|
||||||
|
setup_folders(install_path)
|
||||||
install_erpnext(install_path)
|
install_erpnext(install_path)
|
||||||
|
|
||||||
post_install(install_path)
|
post_install(install_path)
|
||||||
@ -44,7 +65,7 @@ def validate_install():
|
|||||||
# check python version
|
# check python version
|
||||||
python_version = sys.version.split(" ")[0]
|
python_version = sys.version.split(" ")[0]
|
||||||
print "Python Version =", python_version
|
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+"
|
raise Exception, "Hey! ERPNext needs Python version to be 2.6+"
|
||||||
|
|
||||||
# check distribution
|
# check distribution
|
||||||
@ -59,7 +80,7 @@ def validate_install():
|
|||||||
return is_redhat, is_debian
|
return is_redhat, is_debian
|
||||||
|
|
||||||
def install_using_yum():
|
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 "-"*80
|
||||||
print "Installing Packages: (This may take some time)"
|
print "Installing Packages: (This may take some time)"
|
||||||
@ -92,9 +113,6 @@ def install_using_yum():
|
|||||||
def update_config_for_redhat():
|
def update_config_for_redhat():
|
||||||
import re
|
import re
|
||||||
|
|
||||||
global apache_user
|
|
||||||
apache_user = "apache"
|
|
||||||
|
|
||||||
# update memcache user
|
# update memcache user
|
||||||
with open("/etc/sysconfig/memcached", "r") as original:
|
with open("/etc/sysconfig/memcached", "r") as original:
|
||||||
memcached_conf = original.read()
|
memcached_conf = original.read()
|
||||||
@ -108,7 +126,7 @@ def update_config_for_redhat():
|
|||||||
|
|
||||||
def install_using_apt():
|
def install_using_apt():
|
||||||
exec_in_shell("apt-get update")
|
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 "-"*80
|
||||||
print "Installing Packages: (This may take some time)"
|
print "Installing Packages: (This may take some time)"
|
||||||
print packages
|
print packages
|
||||||
@ -123,8 +141,6 @@ def install_using_apt():
|
|||||||
update_config_for_debian()
|
update_config_for_debian()
|
||||||
|
|
||||||
def update_config_for_debian():
|
def update_config_for_debian():
|
||||||
global apache_user
|
|
||||||
apache_user = "www-data"
|
|
||||||
|
|
||||||
# update memcache user
|
# update memcache user
|
||||||
with open("/etc/memcached.conf", "r") as original:
|
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:
|
with open("/etc/memcached.conf", "w") as modified:
|
||||||
modified.write(memcached_conf.replace("-u memcache", "-u %s" % apache_user))
|
modified.write(memcached_conf.replace("-u memcache", "-u %s" % apache_user))
|
||||||
|
|
||||||
exec_in_shell("a2enmod rewrite")
|
for service in ("mysql", "memcached", "ntpd"):
|
||||||
|
|
||||||
for service in ("mysql", "apache2", "memcached", "ntpd"):
|
|
||||||
exec_in_shell("service %s restart" % service)
|
exec_in_shell("service %s restart" % service)
|
||||||
|
|
||||||
def install_python_modules():
|
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 "-"*80
|
||||||
print "Installing Python Modules: (This may take some time)"
|
print "Installing Python Modules: (This may take some time)"
|
||||||
print python_modules
|
print python_modules
|
||||||
@ -151,7 +163,7 @@ def install_python_modules():
|
|||||||
exec_in_shell("pip install --upgrade pip")
|
exec_in_shell("pip install --upgrade pip")
|
||||||
exec_in_shell("pip install --upgrade setuptools")
|
exec_in_shell("pip install --upgrade setuptools")
|
||||||
exec_in_shell("pip install --upgrade virtualenv")
|
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):
|
def install_erpnext(install_path):
|
||||||
print
|
print
|
||||||
@ -169,19 +181,15 @@ def install_erpnext(install_path):
|
|||||||
if not db_name:
|
if not db_name:
|
||||||
raise Exception, "Sorry! You must specify ERPNext Database 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
|
# setup paths
|
||||||
sys.path.extend([".", "lib", "app"])
|
sys.path = [".", "lib", "app"] + sys.path
|
||||||
|
import wnf
|
||||||
|
|
||||||
# install database, run patches, update schema
|
# install database, run patches, update schema
|
||||||
setup_db(install_path, root_password, db_name)
|
# setup_db(install_path, root_password, db_name)
|
||||||
|
wnf.install(db_name, root_password=root_password)
|
||||||
setup_cron(install_path)
|
|
||||||
|
# setup_cron(install_path)
|
||||||
setup_apache_conf(install_path)
|
|
||||||
|
|
||||||
def get_root_password():
|
def get_root_password():
|
||||||
# ask for root mysql password
|
# ask for root mysql password
|
||||||
@ -200,7 +208,7 @@ def setup_folders(install_path):
|
|||||||
app = os.path.join(install_path, "app")
|
app = os.path.join(install_path, "app")
|
||||||
if not os.path.exists(app):
|
if not os.path.exists(app):
|
||||||
print "Cloning erpnext"
|
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")
|
exec_in_shell("cd app && git config core.filemode false")
|
||||||
if not os.path.exists(app):
|
if not os.path.exists(app):
|
||||||
raise Exception, "Couldn't clone erpnext repository"
|
raise Exception, "Couldn't clone erpnext repository"
|
||||||
@ -208,7 +216,7 @@ def setup_folders(install_path):
|
|||||||
lib = os.path.join(install_path, "lib")
|
lib = os.path.join(install_path, "lib")
|
||||||
if not os.path.exists(lib):
|
if not os.path.exists(lib):
|
||||||
print "Cloning wnframework"
|
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")
|
exec_in_shell("cd lib && git config core.filemode false")
|
||||||
if not os.path.exists(lib):
|
if not os.path.exists(lib):
|
||||||
raise Exception, "Couldn't clone wnframework repository"
|
raise Exception, "Couldn't clone wnframework repository"
|
||||||
@ -238,86 +246,13 @@ def setup_conf(install_path, db_name):
|
|||||||
|
|
||||||
return db_password
|
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):
|
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
|
||||||
print "-"*80
|
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 "-"*80
|
||||||
print "Installation complete"
|
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"
|
print "Login using username = Administrator and password = admin"
|
||||||
|
|
||||||
def exec_in_shell(cmd):
|
def exec_in_shell(cmd):
|
||||||
|
Loading…
x
Reference in New Issue
Block a user