class BuildMasterProject(BuildBotProject): """Install Buildbot master that controls our automated builds & tests. """ name = 'buildmaster' title = 'Installs a buildbot master' config_template = 'master.cfg_tmpl' settings = BuildBotProject.settings + [ Setting('master_dir', default='{{os.path.join(env.base_path, project.name)}}', help="Directory to put the build master in."), Setting( 'stack_to_build', default='openplans', help="Which stack to build (choose one of: openplans, almanac)"), ] actions = BuildBotProject.actions + [ tasks.Script( 'Make a buildbot master', ['bin/buildbot', 'create-master', '{{config.master_dir}}'], cwd='{{config.master_dir}}'), tasks.EnsureFile( 'Overwrite the buildbot master.cfg file', '{{os.path.join(config.master_dir, "master.cfg")}}', content_path= '{{os.path.join(project.skel_dir, config.stack_to_build)}}_master.cfg_tmpl', force_overwrite=True, svn_add=False), ]
class ScriptTranscluderProject(Project): """ Install ScriptTranscluder """ name = 'scripttranscluder' title = 'Install ScriptTranscluder' settings = [ ## FIXME: there should be some higher-level sense of ## tag/branch/trunk, and maybe latest too: Setting('spec', default='requirements/scripttranscluder-req.txt', help='Specification of packages to install'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install ScriptTranscluder on'), Setting('port_offset', default='5', help='Offset from base_port'), Setting('host', default='localhost', help='Host to serve on'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install ScriptTranscluder', '{{config.spec}}'), tasks.InstallPasteConfig( path= 'scripttranscluder/src/scripttranscluder/fassembler_config.ini_tmpl' ), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.SaveURI(path='/include.js', project_local=False, trailing_slash=False), ] depends_on_projects = ['fassembler:topp']
class ErrorListenerProject(Project): """ Install SupervisorErrorListener """ name = 'errorlistener' title = 'Install error listener' settings = [ Setting('spec', default='requirements/errorlistener-req.txt', help='Specification of packages to install'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install SupervisorErrorListener', '{{config.spec}}'), tasks.EnsureFile( 'Install supervisor listener config', '{{env.base_path}}/etc/supervisor.d/errorlistener.ini', content=errorlistener_template), tasks.EnsureDir('Create log directory', '{{env.var}}/logs/errorlistener'), ] depends_on_projects = ['fassembler:topp', 'fassembler:supervisor']
class NYMapProject(Project): """ Install NYMap """ name = 'nymap' title = 'Install NYMap' settings = [ Setting('svn', default='http://svn.opengeo.org/vespucci/branches/woonerf/', help='Location of nymap svn repository'), # Setting('geoserver_url', # default='http://artois.openplans.org/geoserver/ows/', # help='Location where GeoServer is running'), ] actions = [ tasks.SvnCheckout('Checkout nymap', repository='{{config.svn}}', dest='{{env.base_path}}/{{project.name}}/src/nymap'), tasks.Script('Run build script', ['./build', '-f'], cwd='{{env.base_path}}/{{project.name}}/src/nymap/build'), tasks.SaveURI( path='/maps', uri='file://{{env.base_path}}/{{project.name}}/src/nymap', project_local=False, ## FIXME: this should be themable, but currently ## is not (see #2172): theme=False, ), ] depends_on_projects = ['fassembler:topp']
class ErrorEaterProject(Project): """ Install ErrorEater """ name = 'erroreater' title = 'Install ErrorEater' settings = [ Setting('spec', default='requirements/erroreater-req.txt', help='Specification of packages to install'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install ErrorEater on'), Setting('port_offset', default='8', help='Offset from base_port'), Setting('host', default='localhost', help='Host to serve on'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install ErrorEater', '{{config.spec}}'), tasks.InstallPasteConfig( path='erroreater/src/erroreater/fassembler_config.ini_tmpl'), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.SaveURI(path='/.debug/errors', project_local=False, theme=False), tasks. Script('Run setup-app', [ 'paster', 'setup-app', '{{env.base_path}}/etc/{{project.name}}/{{project.name}}.ini#main-app' ], use_virtualenv=True, cwd='{{env.base_path}}/{{project.name}}/src/{{project.name}}'), EnsureHtpasswdFile( 'Write DevAuth htpasswd file with admin password if it does not exist' ), ] ## FIXME: and the listener depends_on_projects = ['fassembler:topp']
class DeliveranceProject(Project): """ Install Deliverance/DeliveranceVHoster """ name = 'deliverance' title = 'Install Deliverance/DeliveranceVHoster' settings = [ Setting('spec', default='requirements/deliverance-req.txt', help='Specification of packages to install'), Setting( 'openplans_hooks_repo', default='https://svn.openplans.org/svn/build/openplans_hooks/trunk', help='SVN location of openplans_hooks'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install Deliverance on'), Setting('port_offset', default='0', help='Offset from base_port for Deliverance'), Setting('host', default='localhost', help='Host to serve on'), Setting('force_ssl', inherit_config=('general', 'force_ssl'), default='False', help='Redirect ssl-only paths to https'), Setting( 'default_rules_repo', default= '{{project.req_settings.get("rules_repo", "https://svn.openplans.org/svn/build/rules/openplans")}}', help='Default svn location of deliverance rules', ) ] actions = [ tasks.SaveSetting('Save force_ssl setting', {'force_ssl': '{{config.force_ssl}}'}), tasks.VirtualEnv(), tasks.InstallSpec('Install Deliverance', '{{config.spec}}'), tasks.TestLxml('{{env.base_path}}/deliverance'), tasks.SvnCheckout('Checkout openplans_hooks', '{{config.openplans_hooks_repo}}', '{{project.name}}/src/openplans_hooks'), tasks.SvnCheckout('Checkout default rules', '{{config.default_rules_repo}}', '{{env.var}}/deliverance/default_rules'), tasks.InstallPasteConfig( path='deliverance/src/deliverancevhoster/fassembler_config.ini_tmpl' ), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.SaveURI(path='/', theme=False), ] depends_on_projects = ['fassembler:topp']
class SupervisorProject(Project): """ Sets up Supervisor2 (http://www.plope.com/software/supervisor2/) """ name = 'supervisor' title = 'Install Supervisor2' project_base_dir = os.path.join(os.path.dirname(__file__), 'supervisor-files') settings = [ Setting('spec', default='requirements/supervisor-req.txt', help='Specification for installing Supervisor'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help="Port to install HTTP server on"), Setting('port_offset', default='10', help='Offset from base_port for HTTP server'), Setting('supervisor_var', default='{{env.var}}/supervisor', help="The path to use for supervisor's socket and pidfile; " "if you are building an instance in parallel to a running site " "you may want to point this elsewhere from env.var so that " "you can run both supervisor processes simultaneously"), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install Supervisor', '{{config.spec}}'), tasks.CopyDir('Create config layout', project_base_dir, './'), tasks.EnsureDir('Ensure log directory exists', '{{env.var}}/logs/supervisor'), tasks.EnsureDir('Ensure pid location exists', '{{config.supervisor_var}}'), ]
class ZineProject(Project): """ Install Zine """ name = 'zine' title = 'Install Zine' settings = [ Setting('zine_instances_directory', default='{{env.var}}/{{project.name}}/instances', help="Directory that will house all projects' Zine instances (config files and sqlite databases)", ), Setting('port', default='{{env.base_port+4}}', help='Port to install Zine on'), Setting('host', default='localhost', help='Host to serve on'), Setting('spec', default='requirements/zine-req.txt', help='Specification of packages to install'), Setting('shared_secret_filename', default='{{env.var}}/secret.txt', help='Path to the file containing the shared secret used to encrypt and decrypt the auth cookie'), Setting('admin_info_filename', default='{{env.var}}/admin.txt', help='Path to the file containing credentials of a site admin user that can be used to query projects for their security policies and memberships'), Setting('internal_root_url', default='http://localhost:{{env.base_port+1}}/openplans/', help='Base url path to the opencore site root; if possible this should hit Zope directly using a non-internet-wide connection, because site admin credentials are passed in the HTTP request'), Setting('use_pip', default='True', help="Use pip to install requirements, or easy_install"), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install Zine', '{{config.spec}}'), tasks.InstallPasteConfig(path=resource_filename( 'fassembler_projects', 'templates/zine/paste.ini_tmpl')), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), ]
class WindmillProject(Project): """ Install Windmill """ name = 'windmill' title = 'Install Windmill' settings = [ Setting('spec', default='requirements/windmill-req.txt', help='Specification of packages to install'), ] actions = [ tasks.VirtualEnv(different_python='python2.5'), tasks.InstallSpec('Install windmill and other dependencies', '{{config.spec}}'), ] depends_on_projects = ['fassembler:topp']
class ProxyProject(Project, ApacheMixin): """ Install Proxy """ name = 'proxy' title = 'Install Proxy' settings = [ Setting('port', default='{{env.base_port+int(config.port_offset)}}', help="Port to install Apache (for proxy) on"), Setting('port_offset', default='11', help='Offset from base_port for Apache (for proxy)'), Setting('host', default='localhost', help='Interface/host to serve Apache/WordPress on'), Setting('apache_exec', default='{{project.apache_exec()}}', help='Location of apache executable'), Setting('apache_module_dir', default='{{project.apache_module_dir()}}', help='Location of apache modules'), Setting('php_cgi_exec', default='{{project.php_cgi_exec()}}', help='Location of php cgi executable'), Setting('server_admin', default='{{env.environ["USER"]}}@{{env.fq_hostname}}', help='Server admin for Apache'), ] skel_dir = os.path.join(os.path.dirname(__file__), 'proxy-files', 'skel') actions = [ #proxy stuff tasks.CopyDir('Create layout', skel_dir, './'), tasks.InstallSupervisorConfig(), tasks.SaveURI(path='/proxy', project_local=False), ] depends_on_projects = ['fassembler:topp']
class RelateMeProject(Project): """ Install RelateMe """ name = 'relateme' title = 'Install RelateMe' settings = [ Setting('db_host', default='localhost', help='Host where database is running'), Setting('db_streetsblog_username', default='streetsblog', help='Database connection username'), Setting('db_streetsblog_password', default='sblog', help='Database connection password'), Setting('db_streetsblog_name', default='streetsblog', help='Name of database'), Setting('db_streetfilms_username', default='sfilms', help='Database connection username'), Setting('db_streetfilms_password', default='sfilms', help='Database connection password'), Setting('db_streetfilms_name', default='sfilms', help='Name of database'), Setting('db_root_password', default='{{env.db_root_password}}', help='Database root password'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install RelateMe on'), Setting('port_offset', default='9', help='Offset from base_port for RelateMe'), Setting('host', default='localhost', help='Host to serve on'), Setting('spec', default='requirements/relateme-req.txt', help='Specification of packages to install'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install RelateMe', '{{config.spec}}'), tasks.InstallPasteConfig( path='relateme/src/relateme/fassembler_config.ini_tmpl'), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), ## RelateMe uses the WordPress database, so it doesn't control anything: #tasks.CheckMySQLDatabase('Check database exists'), #tasks.Script('Run setup-app', # ['paster', 'setup-app', '{{env.base_path}}/etc/{{project.name}}/{{project.name}}.ini#relateme'], # use_virtualenv=True, # cwd='{{env.base_path}}/{{project.name}}/src/{{project.name}}'), ## Currently we are not using Deliverance, so this is kind of redundant: #tasks.SaveURI(path='/api/relateme'), ] depends_on_projects = ['fassembler:topp'] depends_on_executables = ['mysql_config']
class BuildSlaveProject(BuildBotProject): """Install a Buildbot slave to connect to our build master""" name = BuildBotProject.buildslave_dirname title = 'Installs a buildbot slave' settings = BuildBotProject.settings + [ Setting('buildslave_name', help="Name of this build slave."), Setting( 'buildslave_description', default= '{{project.platform}} {{project.version}} running on {{project.hostname}}', help="Public description of your build slave's platform.", ) ] actions = BuildBotProject.actions + [ tasks.EnsureDir('Make sure src directory exists', '{{os.path.join(config.buildslave_dir, "src")}}', svn_add=False), tasks.EnsureFile( 'Install the accept_certificates script', '{{os.path.join(config.buildslave_dir, "bin", "accept_certificates.sh")}}', content_path= '{{os.path.join(project.skel_dir, "accept_certificates.sh")}}', force_overwrite=True, svn_add=False, executable=True), tasks.SourceInstall( 'Install the port killer script', 'https://svn.socialplanning.org/svn/standalone/portutils/trunk/', 'portutils'), tasks.Script( 'Move aside the old config if it exists', 'test -f {{config.buildslave_dir}}/buildbot.tac && mv -f {{config.buildslave_dir}}/buildbot.tac {{config.buildslave_dir}}/buildbot.tac.old || echo nothing to move', cwd='{{env.base_path}}', shell=True), tasks.Script( 'Make a buildbot slave', [ 'bin/buildbot', 'create-slave', '--keepalive=60', # Jeff warns that they lose connection at default '--umask=002', # it's 077 by default. '.', '{{config.buildmaster_host}}:{{config.buildslave_port}}', '{{config.buildslave_name}}', '{{config.buildbot_passwd}}' ], cwd='{{os.path.join(env.base_path, config.buildslave_dir)}}'), tasks.EnsureFile( 'Overwrite the buildslave host info file', '{{os.path.join(config.buildslave_dir, "info", "host")}}', content_path='{{os.path.join(project.skel_dir, "host_tmpl")}}', force_overwrite=True, svn_add=False), tasks.EnsureFile( 'Overwrite the buildslave admin info file', '{{os.path.join(config.buildslave_dir, "info", "admin")}}', content_path='{{os.path.join(project.skel_dir, "admin_tmpl")}}', force_overwrite=True, svn_add=False), ]
class BuildBotProject(Project): """Buildbot base project class""" files_dir = os.path.join(os.path.dirname(__file__), 'buildbot-files') skel_dir = os.path.join(files_dir, 'skel') depends_on_projects = ['fassembler:topp'] hostname, platform, version = get_host_info() buildslave_dirname = 'buildslave' settings = [ Setting( 'buildbot_url', inherit_config=('general', 'buildbot_url'), default='http://buildbot.socialplanning.org', help='Public URL of the buildbot web page', ), Setting('spec', default='requirements/buildbot-req.txt', help='Specification of packages to install'), Setting('buildmaster_host', default='localhost', help='Host the buildmaster runs on'), Setting('baseport', default='{{env.base_port}}', help="Base port"), Setting( 'child_baseport', default='{{env.base_port + 1000}}', help= "Base port for applications built by the bots. There are multiple builders, so choose a number where you have a few hundred ports free after that!" ), # It kind of sucks that the master config is in charge of this. Setting( 'buildmaster_private_port', default='{{env.base_port+int(config.buildmaster_private_offset)}}', help="Port to run the private buildmaster on (force build allowed)" ), Setting('buildmaster_private_offset', default='20', help="Offset from base_port for the private build master."), Setting( 'buildmaster_public_port', default='{{env.base_port+int(config.buildmaster_public_offset)}}', help= "Port to run the public buildmaster on (force build disallowed)"), Setting('buildmaster_public_offset', default='21', help="Offset from base_port for the public build master."), Setting('buildslave_port', default='{{env.base_port+int(config.buildslave_port_offset)}}', help="Port build slaves connect to the master on"), Setting( 'buildslave_port_offset', default='22', help='Offset from base_port for the build slave connect port.'), Setting('buildbot_passwd', help="Password for buildslaves to connect to master."), Setting( 'buildslave_dir', default='{{project.buildslave_dirname}}', help="Subdirectory to put the buildslave in. Must be relative"), Setting( 'basedir', default='build', help='Subdirectory where slave will build stuff.', ), Setting('editwarning', default=editwarning, help='Text to warn people about editing generated files.'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install buildbot dependencies', '{{config.spec}}'), tasks.SaveSetting('Save buildbot settings', {'buildbot_url': '{{config.buildbot_url}}'}, section='general'), ]
class BrainpowerProject(Project): """Brainpower base project class""" name = 'brainpower' title = 'Installs Brainpower' depends_on_projects = ['fassembler:topp'] def get_req_setting(self, setting): return self.req_settings.get(setting, '') settings = [ Setting( 'port_offset', default='11', help='Port offset from base_port to run the dev django server on'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help="Port to run the dev django server on"), Setting('db_engine', default='mysql', help="Engine to use for django's database"), Setting('db_host', default='', help="Database host"), Setting('db_username', default='root', help="Database user"), Setting('db_password', default='', help="Database password"), Setting('db_root_password', default='', help="Database root password"), Setting('db_name', default='brainpower', help="Database name"), Setting('test_db_name', default='brainpower_test', help="Scratch database name for tests"), Setting( 'secret_key', default= '{{maker.ask_password("Enter secret key for Django or press enter for a random one")}}', help="Django's secret key"), Setting('spec', default='requirements/brainpower-req.txt', help='Specification of packages to install'), Setting( 'django_tarball_url', default='{{project.get_req_setting("django_tarball_url")}}', help='Where to download the django source', ), Setting( 'django_tarball_version', default='{{project.get_req_setting("django_tarball_version")}}', help='Version of Django to install', ), Setting( 'python', default='{{project.build_properties.get("virtualenv_python")}}', help='Where our Python gets installed', ), Setting( 'flunc', default= '{{project.build_properties.get("virtualenv_bin_path") + "/flunc"}}', help="Where our Flunc executable is installed.", ) ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install brainpower dependencies', '{{config.spec}}'), InstallDjango(), tasks.CheckMySQLDatabase('Check main brainpower database exists'), tasks.CheckMySQLDatabase('Check test brainpower database exists', db_name='{{config.test_db_name}}'), tasks.SaveSetting('Save brainpower settings', { 'django_tarball_version': '{{config.django_tarball_version}}', 'django_tarball_url': '{{config.django_tarball_url}}', 'dev_port': '{{config.port}}', 'python': '{{config.python}}', 'flunc': '{{config.flunc}}', 'db_engine': '{{config.db_engine}}', 'db_username': '******', 'db_password': '******', 'db_host': '{{config.db_host}}', 'db_name': '{{config.db_name}}', 'secret_key': '{{config.secret_key}}', }, section='brainpower'), tasks.Script('Initialize brainpower database', ['brainpower/bin/manage.py', 'syncdb', '--noinput']), # Order of arguments matters here! Watch out for # django bug http://code.djangoproject.com/ticket/7595 tasks.Script('Initialize brainpower test database', [ 'brainpower/bin/manage.py', 'syncdb', '--settings=brainpower.test_settings', '--noinput' ]), tasks.EnsureFile( 'Copy mod_python handler to bin directory', dest= '{{project.build_properties["virtualenv_bin_path"]}}/brainpower_handler.py', content_path= '{{project.build_properties["virtualenv_path"]}}/src/brainpower/brainpower_handler.py', executable=True, ), MediaLinks('Link media directories into {{task.htdocs}}.'), ]
class BureauProject(Project): """ Install Bureau """ name = 'bureau' title = 'Install Bureau' settings = [ Setting( 'db_sqlobject', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_name}}?charset=utf8', help='Full SQLObject connection string for database'), Setting('db_username', default='piwik', help='Database connection username'), Setting('db_password', default='piwik', help='Database connection password'), Setting('db_host', default='localhost', help='Host where database is running'), Setting('db_name', default='piwik', help='Name of database'), Setting('db_root_password', default='{{env.db_root_password}}', help='Database root password'), Setting('bureau_repo', default='https://svn.openplans.org/svn/bureau/trunk', help='svn location to install Bureau from'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install Bureau on'), Setting('port_offset', default='12', help='Offset from base_port for Bureau'), Setting('host', default='localhost', help='Host to serve on'), Setting('spec', default='requirements/bureau-req.txt', help='Specification of packages to install'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install Bureau', '{{config.spec}}'), tasks.InstallPasteConfig( path='bureau/src/bureau/fassembler_config.ini_tmpl'), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.CheckMySQLDatabase('Check database exists'), tasks.Script( 'Run setup-app', [ 'paster', 'setup-app', '{{env.base_path}}/etc/{{project.name}}/{{project.name}}.ini' ], use_virtualenv=True, cwd='{{env.base_path}}/{{project.name}}/src/{{project.name}}'), tasks.SaveURI(path='/tasks'), ] depends_on_projects = ['fassembler:topp'] depends_on_executables = ['mysql_config']
class HengeProject(Project): """ Install Henge """ name = 'henge' title = 'Install Henge' settings = [ Setting( 'db_sqlobject', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_name}}?charset=utf8', help='Full SQLObject connection string for database'), Setting('db_username', default='henge', help='Database connection username'), Setting('db_password', default='henge', help='Database connection password'), Setting('db_host', default='localhost', help='Host where database is running'), Setting('db_name', default= '{{env.config.getdefault("general", "db_prefix", "")}}henge', help='Name of database'), Setting( 'db_test_sqlobject', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_test_name}}', help='Full SQLObject connection string for test database'), Setting('db_test_name', default='henge_test', help='Name of the test database'), Setting('db_root_password', default='{{env.db_root_password}}', help='Database root password'), #Setting('henge_repo', # default='https://svn.openplans.org/svn/henge/trunk', # help='svn location to install henge from'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install Henge on'), Setting('port_offset', default='13', help='Offset from base_port for Henge'), Setting('host', default='localhost', help='Host to serve on'), Setting('spec', default='requirements/henge-req.txt', help='Specification of packages to install'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install Henge', '{{config.spec}}'), tasks.InstallPasteConfig( path='henge/src/henge/fassembler_config.ini_tmpl'), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.CheckMySQLDatabase('Check database exists'), tasks. Script('Run setup-app', [ 'paster', 'setup-app', '{{env.base_path}}/etc/{{project.name}}/{{project.name}}.ini#henge' ], use_virtualenv=True, cwd='{{env.base_path}}/{{project.name}}/src/{{project.name}}'), tasks.SaveURI(path='/calendar', project_local=True), ] depends_on_projects = ['fassembler:topp'] depends_on_executables = ['mysql_config']
class TaskTrackerProject(Project): """ Install TaskTracker """ name = 'tasktracker' title = 'Install TaskTracker' settings = [ Setting('use_pip', default='1', help="Whether to install with pip or easy_install"), Setting( 'db_sqlobject', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_name}}?charset=utf8', help='Full SQLObject connection string for database'), Setting('db_username', default='tasktracker', help='Database connection username'), Setting('db_password', default='tasktracker', help='Database connection password'), Setting('db_host', default='localhost', help='Host where database is running'), Setting( 'db_name', default= '{{env.config.getdefault("general", "db_prefix", "")}}tasktracker', help='Name of database'), Setting( 'db_test_sqlobject', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_test_name}}', help='Full SQLObject connection string for test database'), Setting('db_test_name', default='tasktracker_test', help='Name of the test database'), Setting('db_root_password', default='{{env.db_root_password}}', help='Database root password'), #Setting('tasktracker_repo', # default='https://svn.openplans.org/svn/TaskTracker/trunk', # help='svn location to install TaskTracker from'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install TaskTracker on'), Setting('port_offset', default='4', help='Offset from base_port for TaskTracker'), Setting('host', default='localhost', help='Host to serve on'), Setting('spec', default='requirements/tasktracker-req.txt', help='Specification of packages to install'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install TaskTracker', '{{config.spec}}'), tasks.InstallPasteConfig( path='tasktracker/src/tasktracker/fassembler_config.ini_tmpl'), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.CheckMySQLDatabase('Check database exists'), tasks. Script('Run setup-app', [ 'paster', 'setup-app', '{{env.base_path}}/etc/{{project.name}}/{{project.name}}.ini#tasktracker' ], use_virtualenv=True, cwd='{{env.base_path}}/{{project.name}}/src/{{project.name}}'), tasks.SaveURI(path='/tasks'), tasks.SaveCabochonSubscriber( {'delete_project': '/projects/{id}/tasks/project/destroy'}, use_base_port=True), ] depends_on_projects = ['fassembler:topp', 'fassembler:cabochon'] depends_on_executables = ['mysql_config']
class WordPressProject(Project, ApacheMixin): """ Install WordPress """ name = 'wordpress' title = 'Install WordPress' required_modules = ('mime', 'dir', 'rewrite') settings = [ Setting('port', default='{{env.base_port+int(config.port_offset)}}', help="Port to install Apache/WordPress on"), Setting('port_offset', default='3', help='Offset from base_port for Apache/WordPress'), Setting('host', default='localhost', help='Interface/host to serve Apache/WordPress on'), Setting('wordpress_repo', default='{{project.req_settings.get("wordpress_repo", \ "https://svn.github.com/socialplanning/opencore-wordpress-mu")}}', help='Location of WordPress MU repository'), Setting( 'wordpress_scripts_repo', default= 'https://svn.github.com/socialplanning/opencore-wordpress-mu-scripts', help='Location of scripts for WordPress'), Setting('apache_exec', default='{{project.apache_exec()}}', help='Location of apache executable'), Setting('apache_module_dir', default='{{project.apache_module_dir()}}', help='Location of apache modules'), Setting('php_cgi_exec', default='{{project.php_cgi_exec()}}', help='Location of php cgi executable'), Setting('server_admin', default='{{env.environ["USER"]}}@{{env.fq_hostname}}', help='Server admin for Apache'), Setting( 'db_name', default= '{{env.config.getdefault("general", "db_prefix", "")}}wordpress', help='Database name'), Setting('db_username', default='wordpress', help='Database user'), Setting('db_password', default='wordpress', help='Database password'), Setting('db_host', default='localhost', help='Database host'), Setting('db_root_password', default='{{env.db_root_password}}', help='Database root password'), Setting( 'topp_wordpress_theme', default= '{{project.req_settings.get("topp_wordpress_theme", "openplans")}}', help='Theme for wordpress (template option)'), ] skel_dir = os.path.join(os.path.dirname(__file__), 'wordpress-files', 'skel') actions = [ tasks.SaveSetting( 'Save the wordpress theme (template)', {'topp_wordpress_theme': '{{config.topp_wordpress_theme}}'}, section='applications'), CheckPHP('{{config.php_cgi_exec}}'), CheckApache(('mime', 'dir', 'rewrite', 'php')), tasks.CopyDir('Create layout', skel_dir, './'), tasks.SvnCheckout('Checkout wordpress-mu', '{{config.wordpress_repo}}', '{{env.base_path}}/wordpress/src/wordpress-mu'), tasks.SvnCheckout('Checkout scripts', '{{config.wordpress_scripts_repo}}', '{{env.base_path}}/wordpress/src/scripts'), tasks.EnsureFile( 'Fill in wp-config.php', '{{env.base_path}}/wordpress/src/wordpress-mu/wp-config.php', content_path= '{{env.base_path}}/wordpress/src/wordpress-mu/wp-config.php_tmpl', svn_add=False, overwrite=True), tasks.InstallSupervisorConfig(), tasks.EnsureDir('Create var subdirectory', '{{env.var}}/wordpress'), tasks.CheckMySQLDatabase('Check database'), tasks.Script('Setup database tables', [ '{{config.php_cgi_exec}}', '-f', 'dbsetup.php', '{{project.secret()}}' ], cwd='{{env.base_path}}/wordpress/src/wordpress-mu'), tasks.SaveURI(path='/blog'), DeleteExtraWPSiteRows(db='{{config.db_name}}', user='******', passwd='{{config.db_password}}'), ] depends_on_projects = ['fassembler:topp'] depends_on_executables = [('httpd', 'apache2')] def secret(self): f = open(self.environ.config.get('general', 'topp_secret_filename'), 'rb') c = f.read() f.close() return c
class FrontendProject(Project): """ Install the libopencore frontend that proxies over http to opencore, tasktracker and wordpress, with a Deliverance theme applied to the tasktracker and wordpress responses. """ name = 'frontend' title = "Install frontend" settings = [ Setting('port', default='{{env.base_port}}', help='Port the frontend should listen on'), Setting('opencore_remote_uri', default='http://localhost:{{env.base_port+1}}{{if env.num_extra_zopes}}{{for i in range(env.num_extra_zopes)}} http://localhost:{{env.base_port+10*(i+1)+1}}{{endfor}}{{endif}}', help="Base domain and port that opencore's Zope instance is listening on"), Setting('tasktracker_remote_uri', default='http://localhost:{{env.base_port+4}}', help="Base domain and port that TaskTracker is listening on"), Setting('wordpress_remote_uri', default='http://localhost:{{env.base_port+3}}', help="Base domain and port that WordPress is listening on"), Setting('zine_remote_uri', default='http://localhost:{{env.base_port+3}}', help="Base domain and port that Zine is listening on"), Setting('use_tasktracker', default='1', help="Set to 0 if you don't have tasktracker enabled"), Setting('use_wordpress', default='1', help="Set to 0 if you don't have wordpress enabled"), Setting('use_zine', default='0', help="Set to 1 if you have zine enabled"), Setting('spec', default='requirements/frontend-req.txt', help='Specification of packages to install'), Setting('only_local_connections', default='0', help="Set to 1 if you want to restrict access to localhost (for example if you are using a proxy server as your frontmost component)"), Setting('static_file_root', default='None', help="(Optional) Full path to a directory on the filesystem where static files will be served from. If set, a Paste#static fileserver will be mounted on the path prefix `/++static++/`"), Setting('use_twirlip', default='1', help="Set to 0 if you don't have twirlip enabled"), Setting('shared_secret_filename', default='{{env.var}}/secret.txt', help='Path to the file containing the shared secret used to encrypt and decrypt the auth cookie'), Setting('twirlip_remote_uri', default='http://localhost:{{env.base_port+7}}', help="Base domain and port that Twirlip is listening on"), Setting("use_pip", default="True"), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install frontend', '{{config.spec}}'), tasks.InstallPasteConfig(path=resource_filename( 'fassembler_projects', 'templates/frontend/paste.ini_tmpl')), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), ]
class CabochonProject(Project): """ Install Cabochon """ depends_on_projects = ['fassembler:topp'] name = 'cabochon' title = 'Install Cabochon' settings = [ Setting('use_pip', default='1', help="Whether to install with pip or easy_install"), Setting( 'db_sqlobject', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_name}}?charset=utf8', help='Full SQLObject connection string for database'), Setting('db_username', default='cabochon', help='Database connection username'), Setting('db_password', default='cabochon', help='Database connection password'), Setting('db_host', default='localhost', help='Host where database is running'), Setting( 'db_name', default= '{{env.config.getdefault("general", "db_prefix", "")}}cabochon', help='Name of database'), Setting( 'db_test_sqlobject', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_test_name}}', help='Full SQLObject connection string for test database'), Setting('db_test_name', default='cabochon_test', help='Name of the test database'), Setting('db_root_password', default='{{env.db_root_password}}', help='Database root password'), #Setting('cabochon_repo', # default='https://svn.openplans.org/svn/Cabochon/trunk', # help='svn location to install Cabochon from'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install Cabochon on'), Setting('port_offset', default='6', help='Offset from base_port for Cabochon'), Setting('host', default='localhost', help='Host to serve on'), Setting('spec', default='requirements/cabochon-req.txt', help='Specification of packages to install'), Setting('cabochon_user_info', default='{{env.var}}/cabochon-password.txt', help='The cabochon admin user info'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install Cabochon', '{{config.spec}}'), tasks.InstallPasteConfig( path='cabochon/src/cabochon/fassembler_config.ini_tmpl'), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.CheckMySQLDatabase('Check database exists'), tasks. Script('Run setup-app', [ 'paster', 'setup-app', '{{env.base_path}}/etc/{{project.name}}/{{project.name}}.ini#cabochon' ], use_virtualenv=True, cwd='{{env.base_path}}/{{project.name}}/src/{{project.name}}'), tasks.EnsureFile('Write cabochon_user_info.txt if necessary', '{{config.cabochon_user_info}}', 'cabochon:{{env.random_string(12, "alphanumeric")}}', overwrite=False), tasks.SaveSetting( 'save setting', {'cabochon_user_info': '{{config.cabochon_user_info}}'}), tasks.SaveURI(path='/', public=False), ] depends_on_projects = ['fassembler:topp'] depends_on_executables = ['mysql_config']
class FeedBackerProject(Project): """ Install FeedBacker """ name = 'feedbacker' title = 'Install FeedBacker' #XXX will depend on cabochon shortly #depends_on_projects = ['fassembler:topp', 'fassembler:cabochon'] depends_on_projects = ['fassembler:topp'] depends_on_executables = ['mysql_config'] settings = [ Setting( 'db_sqlalchemy', default= 'mysql://{{config.db_username}}:{{config.db_password}}@{{config.db_host}}/{{config.db_name}}?charset={{config.charset}}', help='Full sqlalchemy connection string for database'), Setting('charset', default='utf8', help='Database connection charset'), Setting('db_username', default='feedbacker', help='Database connection username'), Setting('db_password', default='feedbacker', help='Database connection password'), Setting('db_host', default='localhost', help='Host where database is running'), Setting( 'db_name', default= '{{env.config.getdefault("general", "db_prefix", "")}}feedbacker', help='Name of database'), Setting('db_test_sqlalchemy', default='sqlite:///:memory:', help='Full sqlalchemy connection string for test database'), Setting('db_root_password', default='{{env.db_root_password}}', help='Database root password'), Setting('port', default='{{env.base_port+int(config.port_offset)}}', help='Port to install TaskTracker on'), Setting('port_offset', default='8', help='Offset from base_port for FeedBacker'), Setting('host', default='localhost', help='Host to serve on'), Setting('spec', default='requirements/feedbacker-req.txt', help='Specification of packages to install'), ] actions = [ tasks.VirtualEnv(), tasks.InstallSpec('Install FeedBacker', '{{config.spec}}'), tasks.InstallPasteConfig( path='feedbacker/src/feedbacker/fassembler_config.ini_tmpl'), tasks.InstallPasteConfig( path='feedbacker/src/feedbacker/fassembler_who.ini_tmpl', ininame='who'), tasks.InstallPasteStartup(), tasks.InstallSupervisorConfig(), tasks.SaveURI(path='/', theme=False), tasks.CheckMySQLDatabase('Check database exists'), tasks.SaveCabochonSubscriber({'send_feed_item': ('/', 'False')}) ]
class ToppProject(Project): """ Create the basic layout used at TOPP for a set of applications. """ name = 'topp' title = 'TOPP (openplans.org) Standard File Layout' project_base_dir = os.path.join(os.path.dirname(__file__), 'topp-files') settings = [ Setting('requirements_svn_repo', inherit_config=('general', 'requirements_svn_repo'), default='https://svn.socialplanning.org/svn/build/requirements/openplans/trunk', help="Location where requirement files will be found for all builds"), Setting('requirements_use_wget', default='0'), Setting('base_port', inherit_config=('general', 'base_port'), help='The base port to use for application (each application is an offset from this port)'), Setting('var', default='{{env.base_path}}/var', inherit_config=('general', 'var'), help='The location where persistent files (persistent across builds) are kept'), Setting('etc_svn_repo', inherit_config=('general', 'etc_repository'), default='https://svn.openplans.org/config/', help='Parent directory where the configuration that will go in etc/ comes from'), Setting('etc_svn_subdir', default='{{env.hostname}}-{{os.path.basename(env.base_path)}}', inherit_config=('general', 'etc_svn_subdir'), help='svn subdirectory where data configuration is kept (will be created if necessary)'), Setting('db_prefix', default='{{re.sub(r"\W+", "_", os.path.basename(env.base_path))}}_', inherit_config=('general', 'db_prefix'), help='The prefix to use for all database names'), Setting('find_links', default='http://dist.socialplanning.org/eggs', help='Custom locations for distutils and easy_install to look in'), Setting('projtxt', default='{{project.req_settings.get("projtxt", "project")}}', help='Displayed name for opencore project/group'), Setting('projprefs', default='{{project.req_settings.get("projprefs", "Preferences")}}', help='Displayed name for opencore project/group settings'), Setting('localbuild', inherit_config=('general', 'localbuild'), default='False', help="Specifies whether this is a single developer's build"), Setting('num_extra_zopes', inherit_config=('general', 'num_extra_zopes'), default='0', help="How many additional Zope instances (besides the primary instance) are deployed in this stack"), Setting('spec', default='requirements/fassembler-req.txt', help="Requirements profile for any add-on packages to install in " \ "the Fassembler environment, providing additional build projects"), ] actions = [ CheckBasePorts(), tasks.CopyDir('Create layout', os.path.join(project_base_dir, 'base-layout'), './'), DeleteBuildIniIfNecessary(), tasks.SvnCheckout('Check out etc/', '{{config.etc_svn_subdir}}', 'etc/', base_repository='{{config.etc_svn_repo}}', on_create_set_props={'svn:ignore': 'projects.txt\n'}, create_if_necessary=True), tasks.FetchRequirements('check out requirements/', '{{config.requirements_svn_repo}}', 'requirements'), EnvironRefresh(), tasks.SaveSetting('Save var setting', {'var': '{{os.path.abspath(config.var)}}'}), tasks.SaveSetting('Save settings', {'base_port': '{{config.base_port}}', 'topp_secret_filename': '{{env.var}}/secret.txt', 'admin_info_filename': '{{env.var}}/admin.txt', 'find_links': '{{config.find_links}}', 'db_prefix': '{{config.db_prefix}}', 'requirements_svn_repo': '{{config.requirements_svn_repo}}', 'projtxt': '{{config.projtxt}}', 'projprefs': '{{config.projprefs}}', 'etc_svn_subdir': '{{config.etc_svn_subdir}}', 'localbuild': '{{config.localbuild}}', 'num_extra_zopes': '{{config.num_extra_zopes}}', }, overwrite=True, validators={ 'db_prefix': validate_db_prefix, 'num_extra_zopes': validate_num_extra_zopes }, ), tasks.SaveSetting( 'Save google maps API key settings', {'openplans.org': 'ABQIAAAAPg0JzaavflEP5HFbvAW11BTB3-H4wTAao1hskyzZKyTqTR1AJRQIyIkPAwUg3Qm5pFsqk78fbsrjDQ', 'localhost': 'ABQIAAAACgq_R1LiJejH1-2eRRyQvBTwM0brOpm-All5BF6PoaKBxRWWERRkYcknpt7YAYi-YjtUb5J69-e2Hg', 'nohost': 'bogus_key_used_for_tests', 'dev.nycstreets.org': 'ABQIAAAACgq_R1LiJejH1-2eRRyQvBQ42FaFWNur_4XCSEHkUOZhqT-5LhT80_6nqiuC2nvOrzbvOLN0PC7grg', 'dev.yourstreets.org': 'ABQIAAAACgq_R1LiJejH1-2eRRyQvBQbz6J6EYtXVUBa7BucdbOEH1SrphRUT2-E4Pe2M5U4iDeS9qzQXHoT1A', }, section='google_maps_keys', overwrite=False), tasks.EnsureDir('Make sure var directory exists', '{{env.var}}', svn_add=False), tasks.EnsureFile('Write OpenCore shared secret to var/secret.txt if it does not exist', '{{env.var}}/secret.txt', '{{env.random_string(40)}}', overwrite=False), EnsureAdminFile('Write Zope administrator login to var/admin.txt if it does not exist'), tasks.VirtualEnv(path='fassembler', never_create_virtualenv=True), tasks.InstallSpecIfPresent('Install Fassembler add-on packages', '{{config.spec}}'), ]