Mercurial > public > src > rhodecode
changeset 601:2642f128ad46
removed egg info, update files for distutils build
updated READMES some config files
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Wed, 06 Oct 2010 15:37:23 +0200 |
parents | f57aaf673743 |
children | 65c27fd21769 |
files | MANIFEST.in README.rst init.d/rhodecode-daemon init.d/rhodecode-daemon2 init.d/rhodecode_daemon init.d/rhodecode_daemon2 rhodecode.egg-info/PKG-INFO rhodecode.egg-info/SOURCES.txt rhodecode.egg-info/dependency_links.txt rhodecode.egg-info/entry_points.txt rhodecode.egg-info/not-zip-safe rhodecode.egg-info/paster_plugins.txt rhodecode.egg-info/requires.txt rhodecode.egg-info/top_level.txt rhodecode/config/deployment.ini_tmpl rhodecode/lib/db_manage.py rhodecode/lib/utils.py rhodecode/websetup.py setup.py test.ini |
diffstat | 20 files changed, 254 insertions(+), 255 deletions(-) [+] |
line wrap: on
line diff
--- a/MANIFEST.in Wed Oct 06 11:36:23 2010 +0200 +++ b/MANIFEST.in Wed Oct 06 15:37:23 2010 +0200 @@ -1,15 +1,23 @@ +include MANIFEST.in include COPYING -include README.rst +include development.ini +include production.ini + include rhodecode/config/deployment.ini_tmpl -include rhodecode_daemon -include rhodecode_daemon2 +#init.d scripts +include init.d/rhodecode-daemon +include init.d/rhodecode-daemon2 +#celery config +include celeryconfig.py + +#images recursive-include rhodecode/public/css * recursive-include rhodecode/public/images * - +#js include rhodecode/public/js/yui2.js include rhodecode/public/js/excanvas.min.js include rhodecode/public/js/yui.flot.js - -recursive-include rhodecode/templates * \ No newline at end of file +#templates +recursive-include rhodecode/templates *
--- a/README.rst Wed Oct 06 11:36:23 2010 +0200 +++ b/README.rst Wed Oct 06 15:37:23 2010 +0200 @@ -46,22 +46,34 @@ Installation ------------- +quick setup + +- pip install -E rhodecode-venv http://bitbucket.org/marcinkuzminski/rhodecode/get/tip.zip +- activate virtualenv +- run `paster make-config RhodeCode production.ini` +- run `paster setup-app production.ini` +- run `paster runserver production.ini` + +You're ready to go. + + +MORE DETAILED INSTRUCTIONS + - I highly recommend to install new virtualenv for rhodecode see - http://pypi.python.org/pypi/virtualenv + http://pypi.python.org/pypi/virtualenv for more details. - Create new virtualenv using `virtualenv --no-site-packages /var/www/rhodecode-venv` this will install new virtual env into /var/www/rhodecode-venv. Activate the virtualenv by running `source activate /var/www/rhodecode-venv/bin/activate` - Make a folder for rhodecode somewhere on the filesystem for example /var/www/rhodecode -- Download and extract http://bitbucket.org/marcinkuzminski/rhodecode/get/tip.zip - into created directory. -- Run `python setup.py install` in order to install the application and all - needed dependencies. Make sure that You're using activated virutalenv +- Run easy_install http://bitbucket.org/marcinkuzminski/rhodecode/get/tip.zip. +- Run `paster make-config RhodeCode production.inii` in order to install + the application config. You can play with the app settings later - Run `paster setup-app production.ini` it should create all needed tables and an admin account make sure You specify correct path to repositories. - Remember that the given path for mercurial repositories must be write accessible for the application -- Run paster serve development.ini - or you can use sample init.d scripts. +- Run paster serve production.ini - or you can use sample init.d scripts. the app should be available at the 127.0.0.1:5000 - Use admin account you created to login. - Default permissions on each repository is read, and owner is admin. So remember
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/init.d/rhodecode-daemon Wed Oct 06 15:37:23 2010 +0200 @@ -0,0 +1,61 @@ +#!/sbin/runscript +######################################## +#### THIS IS AN GENTOO INIT.D SCRIPT#### +######################################## + +APP_NAME="rhodecode" +APP_HOMEDIR="marcink/python_workspace" +APP_PATH="/home/$APP_HOMEDIR/$APP_NAME" + +CONF_NAME="production.ini" + +PID_PATH="$APP_PATH/$APP_NAME.pid" +LOG_PATH="$APP_PATH/$APP_NAME.log" + +PYTHON_PATH="/home/$APP_HOMEDIR/v-env" + +RUN_AS="marcink" + +DAEMON="$PYTHON_PATH/bin/paster" + +DAEMON_OPTS="serve --daemon \ +--user=$RUN_AS \ +--group=$RUN_AS \ +--pid-file=$PID_PATH \ +--log-file=$LOG_PATH $APP_PATH/$CONF_NAME" + +#extra options +opts="${opts} restartdelay" + +depend() { + need nginx +} + +start() { + ebegin "Starting $APP_NAME" + start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \ + --start --quiet \ + --pidfile $PID_PATH \ + --user $RUN_AS \ + --exec $DAEMON -- $DAEMON_OPTS + eend $? +} + +stop() { + ebegin "Stopping $APP_NAME" + start-stop-daemon -d $APP_PATH \ + --stop --quiet \ + --pidfile $PID_PATH || echo "$APP_NAME - Not running!" + if [ -f $PID_PATH ]; then + rm $PID_PATH + fi + eend $? +} + +restartdelay() { + #stop() + echo "sleep3" + sleep 3 + + #start() +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/init.d/rhodecode-daemon2 Wed Oct 06 15:37:23 2010 +0200 @@ -0,0 +1,77 @@ +#!/bin/sh -e +######################################## +#### THIS IS AN DEBIAN INIT.D SCRIPT#### +######################################## + +### BEGIN INIT INFO +# Provides: rhodecode +# Required-Start: $all +# Required-Stop: $all +# Default-Start: 2 3 4 5 +# Default-Stop: 0 1 6 +# Short-Description: starts instance of rhodecode +# Description: starts instance of rhodecode using start-stop-daemon +### END INIT INFO + +APP_NAME="rhodecode" +APP_HOMEDIR="marcink/python_workspace" +APP_PATH="/home/$APP_HOMEDIR/$APP_NAME" + +CONF_NAME="production.ini" + +PID_PATH="$APP_PATH/$APP_NAME.pid" +LOG_PATH="$APP_PATH/$APP_NAME.log" + +PYTHON_PATH="/home/$APP_HOMEDIR/v-env" + +RUN_AS="marcink" + +DAEMON="$PYTHON_PATH/bin/paster" + +DAEMON_OPTS="serve --daemon \ +--user=$RUN_AS \ +--group=$RUN_AS \ +--pid-file=$PID_PATH \ +--log-file=$LOG_PATH $APP_PATH/$CONF_NAME" + + +case "$1" in + start) + echo "Starting $APP_NAME" + start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \ + --start --quiet \ + --pidfile $PID_PATH \ + --user $RUN_AS \ + --exec $DAEMON -- $DAEMON_OPTS + ;; + stop) + echo "Stopping $APP_NAME" + start-stop-daemon -d $APP_PATH \ + --stop --quiet \ + --pidfile $PID_PATH || echo "$APP_NAME - Not running!" + if [ -f $PID_PATH ]; then + rm $PID_PATH + fi + ;; + restart) + echo "Restarting $APP_NAME" + ### stop ### + echo "Stopping $APP_NAME" + start-stop-daemon -d $APP_PATH \ + --stop --quiet \ + --pidfile $PID_PATH || echo "$APP_NAME - Not running!" + if [ -f $PID_PATH ]; then + rm $PID_PATH + fi + ### start ### + echo "Starting $APP_NAME" + start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \ + --start --quiet \ + --pidfile $PID_PATH \ + --user $RUN_AS \ + --exec $DAEMON -- $DAEMON_OPTS + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 +esac \ No newline at end of file
--- a/init.d/rhodecode_daemon Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -#!/sbin/runscript -######################################## -#### THIS IS AN GENTOO INIT.D SCRIPT#### -######################################## - -APP_NAME="rhodecode" -APP_HOMEDIR="marcink/python_workspace" -APP_PATH="/home/$APP_HOMEDIR/$APP_NAME" - -CONF_NAME="production.ini" - -PID_PATH="$APP_PATH/$APP_NAME.pid" -LOG_PATH="$APP_PATH/$APP_NAME.log" - -PYTHON_PATH="/home/$APP_HOMEDIR/v-env" - -RUN_AS="marcink" - -DAEMON="$PYTHON_PATH/bin/paster" - -DAEMON_OPTS="serve --daemon \ ---user=$RUN_AS \ ---group=$RUN_AS \ ---pid-file=$PID_PATH \ ---log-file=$LOG_PATH $APP_PATH/$CONF_NAME" - -#extra options -opts="${opts} restartdelay" - -depend() { - need nginx -} - -start() { - ebegin "Starting $APP_NAME" - start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \ - --start --quiet \ - --pidfile $PID_PATH \ - --user $RUN_AS \ - --exec $DAEMON -- $DAEMON_OPTS - eend $? -} - -stop() { - ebegin "Stopping $APP_NAME" - start-stop-daemon -d $APP_PATH \ - --stop --quiet \ - --pidfile $PID_PATH || echo "$APP_NAME - Not running!" - if [ -f $PID_PATH ]; then - rm $PID_PATH - fi - eend $? -} - -restartdelay() { - #stop() - echo "sleep3" - sleep 3 - - #start() -}
--- a/init.d/rhodecode_daemon2 Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,77 +0,0 @@ -#!/bin/sh -e -######################################## -#### THIS IS AN DEBIAN INIT.D SCRIPT#### -######################################## - -### BEGIN INIT INFO -# Provides: rhodecode -# Required-Start: $all -# Required-Stop: $all -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: starts instance of rhodecode -# Description: starts instance of rhodecode using start-stop-daemon -### END INIT INFO - -APP_NAME="rhodecode" -APP_HOMEDIR="marcink/python_workspace" -APP_PATH="/home/$APP_HOMEDIR/$APP_NAME" - -CONF_NAME="production.ini" - -PID_PATH="$APP_PATH/$APP_NAME.pid" -LOG_PATH="$APP_PATH/$APP_NAME.log" - -PYTHON_PATH="/home/$APP_HOMEDIR/v-env" - -RUN_AS="marcink" - -DAEMON="$PYTHON_PATH/bin/paster" - -DAEMON_OPTS="serve --daemon \ ---user=$RUN_AS \ ---group=$RUN_AS \ ---pid-file=$PID_PATH \ ---log-file=$LOG_PATH $APP_PATH/$CONF_NAME" - - -case "$1" in - start) - echo "Starting $APP_NAME" - start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \ - --start --quiet \ - --pidfile $PID_PATH \ - --user $RUN_AS \ - --exec $DAEMON -- $DAEMON_OPTS - ;; - stop) - echo "Stopping $APP_NAME" - start-stop-daemon -d $APP_PATH \ - --stop --quiet \ - --pidfile $PID_PATH || echo "$APP_NAME - Not running!" - if [ -f $PID_PATH ]; then - rm $PID_PATH - fi - ;; - restart) - echo "Restarting $APP_NAME" - ### stop ### - echo "Stopping $APP_NAME" - start-stop-daemon -d $APP_PATH \ - --stop --quiet \ - --pidfile $PID_PATH || echo "$APP_NAME - Not running!" - if [ -f $PID_PATH ]; then - rm $PID_PATH - fi - ### start ### - echo "Starting $APP_NAME" - start-stop-daemon -d $APP_PATH -e PYTHON_EGG_CACHE="/tmp" \ - --start --quiet \ - --pidfile $PID_PATH \ - --user $RUN_AS \ - --exec $DAEMON -- $DAEMON_OPTS - ;; - *) - echo "Usage: $0 {start|stop|restart}" - exit 1 -esac \ No newline at end of file
--- a/rhodecode.egg-info/PKG-INFO Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,10 +0,0 @@ -Metadata-Version: 1.0 -Name: sample-app -Version: 0.1dev -Summary: UNKNOWN -Home-page: UNKNOWN -Author: UNKNOWN -Author-email: UNKNOWN -License: UNKNOWN -Description: UNKNOWN -Platform: UNKNOWN
--- a/rhodecode.egg-info/SOURCES.txt Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -MANIFEST.in -README.txt -setup.cfg -setup.py -rhodecode/__init__.py -rhodecode/websetup.py -rhodecode.egg-info/PKG-INFO -rhodecode.egg-info/SOURCES.txt -rhodecode.egg-info/dependency_links.txt -rhodecode.egg-info/entry_points.txt -rhodecode.egg-info/not-zip-safe -rhodecode.egg-info/paster_plugins.txt -rhodecode.egg-info/requires.txt -rhodecode.egg-info/top_level.txt -rhodecode/config/__init__.py -rhodecode/config/deployment.ini_tmpl -rhodecode/config/environment.py -rhodecode/config/middleware.py -rhodecode/config/routing.py -rhodecode/controllers/__init__.py -rhodecode/controllers/error.py -rhodecode/lib/__init__.py -rhodecode/lib/app_globals.py -rhodecode/lib/base.py -rhodecode/lib/helpers.py -rhodecode/model/__init__.py -rhodecode/public/bg.png -rhodecode/public/favicon.ico -rhodecode/public/index.html -rhodecode/public/pylons-logo.gif -rhodecode/tests/__init__.py -rhodecode/tests/test_models.py -rhodecode/tests/functional/__init__.py \ No newline at end of file
--- a/rhodecode.egg-info/dependency_links.txt Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -
--- a/rhodecode.egg-info/entry_points.txt Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,7 +0,0 @@ - - [paste.app_factory] - main = rhodecode.config.middleware:make_app - - [paste.app_install] - main = pylons.util:PylonsInstaller - \ No newline at end of file
--- a/rhodecode.egg-info/not-zip-safe Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -
--- a/rhodecode.egg-info/paster_plugins.txt Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -PasteScript -Pylons
--- a/rhodecode.egg-info/requires.txt Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -Pylons>=0.9.7 \ No newline at end of file
--- a/rhodecode.egg-info/top_level.txt Wed Oct 06 11:36:23 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -rhodecode
--- a/rhodecode/config/deployment.ini_tmpl Wed Oct 06 11:36:23 2010 +0200 +++ b/rhodecode/config/deployment.ini_tmpl Wed Oct 06 15:37:23 2010 +0200 @@ -1,6 +1,6 @@ ################################################################################ ################################################################################ -# rhodecode - Pylons environment configuration # +# rhodecode - Pylons environment configuration # # # # The %(here)s variable will be replaced with the parent directory of this file# ################################################################################ @@ -9,8 +9,8 @@ debug = true ################################################################################ ## Uncomment and replace with the address which should receive ## -## any error reports after application crash ## -## Additionally those settings will be used by rhodecode mailing system ## +## any error reports after application crash ## +## Additionally those settings will be used by rhodecode mailing system ## ################################################################################ #email_to = admin@localhost #error_email_from = paste_error@localhost @@ -35,12 +35,12 @@ use = egg:Paste#http host = 127.0.0.1 -port = 8001 +port = 5000 [app:main] use = egg:rhodecode full_stack = true -static_files = false +static_files = true lang=en cache_dir = %(here)s/data app_instance_uuid = ${app_instance_uuid}
--- a/rhodecode/lib/db_manage.py Wed Oct 06 11:36:23 2010 +0200 +++ b/rhodecode/lib/db_manage.py Wed Oct 06 15:37:23 2010 +0200 @@ -28,8 +28,6 @@ import os import sys import uuid -ROOT = dn(dn(dn(os.path.realpath(__file__)))) -sys.path.append(ROOT) from rhodecode.lib.auth import get_crypt_password from rhodecode.lib.utils import ask_ok @@ -43,20 +41,22 @@ log = logging.getLogger(__name__) class DbManage(object): - def __init__(self, log_sql, dbname, tests=False): + def __init__(self, log_sql, dbname, root, tests=False): self.dbname = dbname self.tests = tests - dburi = 'sqlite:////%s' % jn(ROOT, self.dbname) + self.root = root + dburi = 'sqlite:////%s' % jn(self.root, self.dbname) engine = create_engine(dburi, echo=log_sql) init_model(engine) self.sa = meta.Session self.db_exists = False def check_for_db(self, override): - log.info('checking for exisiting db') - if os.path.isfile(jn(ROOT, self.dbname)): + db_path = jn(self.root, self.dbname) + log.info('checking for existing db in %s', db_path) + if os.path.isfile(db_path): self.db_exists = True - log.info('database exisist') + log.info('database exist') if not override: raise Exception('database already exists') @@ -66,7 +66,7 @@ """ self.check_for_db(override) if override: - log.info("database exisist and it's going to be destroyed") + log.info("database exist and it's going to be destroyed") if self.tests: destroy = True else: @@ -74,7 +74,7 @@ if not destroy: sys.exit() if self.db_exists and destroy: - os.remove(jn(ROOT, self.dbname)) + os.remove(jn(self.root, self.dbname)) checkfirst = not override meta.Base.metadata.create_all(checkfirst=checkfirst) log.info('Created tables for %s', self.dbname) @@ -84,6 +84,10 @@ import getpass username = raw_input('Specify admin username:') password = getpass.getpass('Specify admin password:') + confirm = getpass.getpass('Confirm password:') + if password != confirm: + log.error('passwords mismatch') + sys.exit() email = raw_input('Specify admin email:') self.create_user(username, password, email, True) else:
--- a/rhodecode/lib/utils.py Wed Oct 06 11:36:23 2010 +0200 +++ b/rhodecode/lib/utils.py Wed Oct 06 15:37:23 2010 +0200 @@ -467,9 +467,11 @@ log.addHandler(ch) #PART ONE create db - log.debug('making test db') + log.debug('making test db in %s', repos_test_path) dbname = config['sqlalchemy.db1.url'].split('/')[-1] - dbmanage = DbManage(log_sql=True, dbname=dbname, tests=True) + + dbmanage = DbManage(log_sql=True, dbname=dbname, root=config['here'], + tests=True) dbmanage.create_tables(override=True) dbmanage.config_prompt(repos_test_path) dbmanage.create_default_user()
--- a/rhodecode/websetup.py Wed Oct 06 11:36:23 2010 +0200 +++ b/rhodecode/websetup.py Wed Oct 06 15:37:23 2010 +0200 @@ -1,32 +1,44 @@ """Setup the rhodecode application""" - -from os.path import dirname as dn +from os.path import dirname as dn, join as jn from rhodecode.config.environment import load_environment from rhodecode.lib.db_manage import DbManage import logging import os -import sys +import shutil log = logging.getLogger(__name__) - -ROOT = dn(dn(os.path.realpath(__file__))) -sys.path.append(ROOT) - +ROOT = dn(os.path.realpath(__file__)) def setup_app(command, conf, vars): """Place any commands to setup rhodecode here""" - log_sql = True - tests = False - REPO_TEST_PATH = None - + print dn(os.path.realpath(__file__)) + print(ROOT) dbname = os.path.split(conf['sqlalchemy.db1.url'])[-1] - - dbmanage = DbManage(log_sql, dbname, tests) + dbmanage = DbManage(log_sql=True, dbname=dbname, root=conf['here'], + tests=False) dbmanage.create_tables(override=True) - dbmanage.config_prompt(REPO_TEST_PATH) + dbmanage.config_prompt(None) dbmanage.create_default_user() dbmanage.admin_prompt() dbmanage.create_permissions() dbmanage.populate_default_permissions() - load_environment(conf.global_conf, conf.local_conf, initial=True) + + celeryconfig_file = 'celeryconfig.py' + + celeryconfig_path = jn(ROOT, celeryconfig_file) + + + if not os.path.isfile(jn(conf['here'], celeryconfig_file)): + try: + shutil.copy(celeryconfig_path, conf['here']) + except IOError: + log.error('failed to copy celeryconfig.py from source %s ' + ' to this directory please copy it manually ', + celeryconfig_path) + else: + load_environment(conf.global_conf, conf.local_conf, initial=True) + + + +
--- a/setup.py Wed Oct 06 11:36:23 2010 +0200 +++ b/setup.py Wed Oct 06 15:37:23 2010 +0200 @@ -1,4 +1,31 @@ from rhodecode import get_version + + +requirements = [ + "Pylons>=1.0.0", + "SQLAlchemy>=0.6", + "babel", + "Mako>=0.3.2", + "vcs>=0.1.7", + "pygments>=1.3.0", + "mercurial>=1.6", + "pysqlite", + "whoosh==1.0.0", + "py-bcrypt", + "celery", + ] + +#additional files for project +data_files = [ + ('init.d', ['init.d/rhodecode-daemon', + 'init.d/rhodecode-daemon2', + 'init.d/celeryd']), + ('', ['celeryconfig.py', 'production.ini', 'development.ini']), + ] + + +long_description = '\n' + open('README.rst').read() + try: from setuptools import setup, find_packages except ImportError: @@ -7,28 +34,18 @@ from setuptools import setup, find_packages setup( - name='RhodeCode-%s' % get_version(), + name='RhodeCode', version=get_version(), description='Mercurial repository serving and browsing app', + long_description=long_description, keywords='mercurial web hgwebdir replacement serving hgweb rhodecode', license='BSD', - author='marcin kuzminski', + author='Marcin Kuzminski', author_email='marcin@python-works.com', url='http://hg.python-works.com', - install_requires=[ - "Pylons>=1.0.0", - "SQLAlchemy>=0.6", - "babel", - "Mako>=0.3.2", - "vcs>=0.1.7", - "pygments>=1.3.0", - "mercurial>=1.6", - "pysqlite", - "whoosh==1.0.0b20", - "py-bcrypt", - "celery", - ], + install_requires=requirements, setup_requires=["PasteScript>=1.6.3"], + data_files=data_files, packages=find_packages(exclude=['ez_setup']), include_package_data=True, test_suite='nose.collector',
--- a/test.ini Wed Oct 06 11:36:23 2010 +0200 +++ b/test.ini Wed Oct 06 15:37:23 2010 +0200 @@ -1,6 +1,6 @@ ################################################################################ ################################################################################ -# rhodecode - Pylons environment configuration # +# rhodecode - Pylons environment configuration # # # # The %(here)s variable will be replaced with the parent directory of this file# ################################################################################ @@ -9,8 +9,8 @@ debug = true ################################################################################ ## Uncomment and replace with the address which should receive ## -## any error reports after application crash ## -## Additionally those settings will be used by rhodecode mailing system ## +## any error reports after application crash ## +## Additionally those settings will be used by rhodecode mailing system ## ################################################################################ #email_to = admin@localhost #error_email_from = paste_error@localhost