{ "info": { "author": "Jim Fulton", "author_email": "jim@zope.com", "bugtrack_url": null, "classifiers": [], "description": "*****************************************\nZC Buildout recipe for Redhat RC scripts\n*****************************************\n\nThis package provides a zc.buildout recipe for creating Red-Hat Linux\ncompatible run-control scripts.\n\n.. contents::\n\nChanges\n*******\n\n1.4.2 (2012-12-20)\n==================\n\nFixed: Errors were raised if stopping a run script failed during\n uninstall. This could cause a buildout to be wedged, because\n you couldn't uninstall a broken/missing run script.\n\n\n1.4.1 (2012-08-31)\n==================\n\nFixed: Processes weren't started on update.\n\n In a perfect world, this wouldn't be necessary, as in the\n update case, the process would already be running, however,\n it's helpful to make sure the process is running by trying to\n start it.\n\n1.4.0 (2012-05-18)\n==================\n\n- Added optional process-management support. If requested, then run\n scripts are run as part of install and uninstall.\n\n- Fixed: missing **test** dependency on ``zope.testing``\n\n1.3.0 (2010/05/26)\n==================\n\nNew Features\n------------\n\n- A new independent-processes option causes multiple processes to be\n restarted independently, rather then stoping all of the and the\n starting all of them.\n\nBugs Fixed\n----------\n\n- Generated run scripts had trailing whitespace.\n\n1.2.0 (2009/04/06)\n==================\n\ndisplays the name of the script being run\nfor each script when it is started, stopped, or restarted\n\n1.1.0 (2008/02/01)\n==================\n\nUse the deployment name option (as provided by zc.recipe.deployment\n0.6.0 and later) if present when generating script names.\n\nUse the deployment rc-directory as the destination when a deployment\nis used.\n\nUse /sbin/chkconfig rather than chkconfig, as I'm told it is always in\nthat location and rarely in anyone's path. :)\n\n1.0.0 (2008/01/15)\n==================\n\nInitial public release\n\nDetailed Documentation\n**********************\n\nCreate Red-Hat Linux (chkconfig) rc scripts\n===========================================\n\nThe zc.recipes.rhrc recipe creates Red-Hat Linux (chkconfig) rc\nscripts. It can create individual rc scripts, as well as combined rc\nscripts that start multiple applications.\n\nThe recipe has a parts option that takes the names of sections that\ndefine run scripts. They should either:\n\n- Define a run-script option that contains a one-line shell script, or\n\n- The file /etc/init.d/PART should exist, where PART is the part name.\n\nA simple example will, hopefully make this clearer.\n\n >>> demo = tmpdir('demo')\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ...\n ... [zope]\n ... run-script = /opt/zope/bin/zopectl -C /etc/zope.conf\n ... \"\"\" % dict(dest=demo))\n\nNormally the recipe writes scripts to /etc/init.d. We can override\nthe destination, which we've done here, using a demonstration\ndirectory. We specified a that it should get run-script source from\nthe zope section. Here the zope section is simply a configuration\nsection with a run-script option set directly, but it could have been\na part with a run-script option computed from the recipe.\n\nIf we run the buildout:\n\n >>> print system('bin/buildout'),\n Installing zoperc.\n\nWe'll get a zoperc script in our demo directory:\n\n >>> ls(demo)\n - zoperc\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # This script is for adminstrator convenience. It should\n # NOT be installed as a system startup script!\n \n \n case $1 in\n stop)\n \n /opt/zope/bin/zopectl -C /etc/zope.conf $*\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n /opt/zope/bin/zopectl -C /etc/zope.conf $*\n \n ;;\n esac\n \n\nThere are a couple of things to note about the generated script:\n\n- It uses $* to pass arguments, so arguments can't be quoted. This is\n OK because the arguments will be simple verbs like start and stop.\n\n- It includes a comment saying that the script shouldn't be used as a\n system startup script.\n\nFor the script to be used for system startup, we need to specify\nrun-level information. We can to that using the chkconfig option:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ...\n ... [zope]\n ... run-script = /opt/zope/bin/zopectl -C /etc/zope.conf\n ... \"\"\" % dict(dest=demo))\n\nHere we included a chkconfig option saying that Zope should be started\nat run levels 3, 4, and 5 and that it's start and stop ordered should\nbe 90 and 10.\n\nFor demonstration purposes, we don't *really* want to run chkconfig,\nso we use the chkconfigcommand option to tell the recipe to run echo\ninstead.\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n Installing zoperc.\n --add zoperc\n\nNow the script contains a chkconfig comment:\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n case $1 in\n stop)\n \n /opt/zope/bin/zopectl -C /etc/zope.conf $* \\\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n /opt/zope/bin/zopectl -C /etc/zope.conf $* \\\n \n ;;\n esac\n \n\nWe can specify a user that the script should be run as:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... user = zope\n ...\n ... [zope]\n ... run-script = /opt/zope/bin/zopectl -C /etc/zope.conf\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del zoperc\n Installing zoperc.\n --add zoperc\n\nNote the --del output. If we hadn't set the chkconfigcommand to echo,\nthen chkconfig --del would have been run on the zoperc script.\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n case $1 in\n stop)\n \n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/zope.conf $*\" \\\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/zope.conf $*\" \\\n \n ;;\n esac\n \n\nNote that now the su command is used to run the script. Because the\nscript is included in double quotes, it can't contain double\nquotes. (The recipe makes no attempt to escape double quotes.)\n\nAlso note that now the script must be run as root, so the generated\nscript checks that root is running it.\n\nIf we say the user is root:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... user = root\n ...\n ... [zope]\n ... run-script = /opt/zope/bin/zopectl -C /etc/zope.conf\n ... \"\"\" % dict(dest=demo))\n\n\nThen the generated script won't su, but it will still check that root\nis running it:\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del zoperc\n Installing zoperc.\n --add zoperc\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n case $1 in\n stop)\n \n /opt/zope/bin/zopectl -C /etc/zope.conf $* \\\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n /opt/zope/bin/zopectl -C /etc/zope.conf $* \\\n \n ;;\n esac\n \n\nA part that defines a run script can also define environment-variable\nsettings to be used by the rc script by supplying an env option:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... user = zope\n ...\n ... [zope]\n ... run-script = /opt/zope/bin/zopectl -C /etc/zope.conf\n ... env = LD_LIBRARY_PATH=/opt/foolib\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del zoperc\n Installing zoperc.\n --add zoperc\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n case $1 in\n stop)\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/zope.conf $*\" \\\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/zope.conf $*\" \\\n \n ;;\n esac\n \n\nWorking with existing control scripts\n-------------------------------------\n\nIn the example above, we generated a script based on a command line.\nIf we have a part that creates a control script on it's own, then it\ncan ommit the run-script option and it's already created run script\nwill be used. Let's create a run script ourselves:\n\n >>> write(demo, 'zope', '/opt/zope/bin/zopectl -C /etc/zope.conf $*')\n\nNow we can remove the run-script option from the Zope section:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... user = zope\n ...\n ... [zope]\n ... env = LD_LIBRARY_PATH=/opt/foolib\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del zoperc\n Installing zoperc.\n --add zoperc\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n case $1 in\n stop)\n \n echo zope:\n /demo/zope \"$@\" \\\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n echo zope:\n /demo/zope \"$@\" \\\n \n ;;\n esac\n \n\nHere we just invoke the existing script. Note that don't pay any\nreflect the env or user options in the script. When an existing\nscript is used, it is assumed to be complete.\n\n >>> import os\n >>> os.remove(join(demo, 'zope'))\n\nMultiple processes\n------------------\n\nSometimes, you need to start multiple processes. You can specify\nmultiple parts. For example, suppose we wanted to start 2 Zope\ninstances:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = instance1 instance2\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... user = zope\n ...\n ... [instance1]\n ... run-script = /opt/zope/bin/zopectl -C /etc/instance1.conf\n ... env = LD_LIBRARY_PATH=/opt/foolib\n ...\n ... [instance2]\n ... \"\"\" % dict(dest=demo))\n\n >>> write(demo, 'instance2', '')\n\nNote that for instance 2, we are arranging for the script to pre-exist.\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del zoperc\n Installing zoperc.\n --add zoperc\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n case $1 in\n stop)\n \n echo instance2:\n /demo/instance2 \"$@\" \\\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/instance1.conf $*\" \\\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/instance1.conf $*\" \\\n \n echo instance2:\n /demo/instance2 \"$@\" \\\n \n ;;\n esac\n \n\nNow the rc script starts both instances. Note that it stops them in\nreverese order. This isn't so important in a case like this, but\nwould be more important if a later script depended on an earlier one.\n\nIn addition to the zoperc script, we got scripts for the instance with\nthe run-script option:\n\n >>> ls(demo)\n - instance2\n - zoperc\n - zoperc-instance1\n\n >>> cat(demo, 'zoperc-instance1')\n #!/bin/sh\n \n # This script is for adminstrator convenience. It should\n # NOT be installed as a system startup script!\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n case $1 in\n stop)\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/instance1.conf $*\"\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/instance1.conf $*\"\n \n ;;\n esac\n \n\nThe individual scripts don't have chkconfig information.\n\nIndependent processes\n---------------------\n\nNormally, processes are assumed to be dependent and are started in\norder, stopped in referese order, and, on restart, are all stopped and\nthen all started.\n\nIf the independent-processes option is used, then the generated master\nrun script will treat the processes as independent and restart\nprocessed individually. With lots of independent processes, this can\nreduce the amount of time individual processes are down.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = instance1 instance2\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... user = zope\n ... independent-processes = true\n ...\n ... [instance1]\n ... run-script = /opt/zope/bin/zopectl -C /etc/instance1.conf\n ... env = LD_LIBRARY_PATH=/opt/foolib\n ...\n ... [instance2]\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del zoperc\n Installing zoperc.\n --add zoperc\n\n >>> cat(demo, 'zoperc')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su zope -c \\\n \"/opt/zope/bin/zopectl -C /etc/instance1.conf $*\" \\\n \n echo instance2:\n /demo/instance2 \"$@\" \\\n >> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = instance1 instance2\n ... dest = %(dest)s\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... user = zope\n ... independent-processes = yes\n ...\n ... [instance1]\n ... run-script = /opt/zope/bin/zopectl -C /etc/instance1.conf\n ... env = LD_LIBRARY_PATH=/opt/foolib\n ...\n ... [instance2]\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n zc.recipe.rhrc: Invalid value for independent-processes. Use 'true' or 'false'\n While:\n Installing.\n Getting section zoperc.\n Initializing part zoperc.\n Error: Invalid value for independent-processes: yes\n\n\nDeployments\n-----------\n\nThe zc.recipe.rhrc recipe is designed to work with the\nzc.recipe.deployment recipe. You can specify the name of a deployment\nsection. If a deployment section is specified then:\n\n- the deployment name will be used for the rc scripts\n\n- the user from the deployment section will be used if a user isn't\n specified in the rc script's own section.\n\n- the rc-directory option from the deployment will be used if\n destination isn't specified.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [deployment]\n ... name = acme\n ... user = acme\n ... rc-directory = %(dest)s\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = instance1 instance2\n ... chkconfig = 345 90 10\n ... chkconfigcommand = echo\n ... deployment = deployment\n ...\n ... [instance1]\n ... run-script = /opt/zope/bin/zopectl -C /etc/instance1.conf\n ... env = LD_LIBRARY_PATH=/opt/foolib\n ...\n ... [instance2]\n ... \"\"\" % dict(dest=demo))\n\nIf a deployment is used, then any existing scripts must be\nprefixed with the deployment name. We'll rename the instance2 script\nto reflect that:\n\n >>> os.rename(join(demo, 'instance2'), join(demo, 'acme-instance2'))\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del zoperc\n Installing zoperc.\n --add acme\n\n >>> ls(demo)\n - acme\n - acme-instance1\n - acme-instance2\n\n >>> cat(demo, 'acme')\n #!/bin/sh\n \n # the next line is for chkconfig\n # chkconfig: 345 90 10\n # description: please, please work\n \n \n if [ $(whoami) != \"root\" ]; then\n echo \"You must be root.\"\n exit 1\n fi\n \n case $1 in\n stop)\n \n echo acme-instance2:\n /demo/acme-instance2 \"$@\" \\\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su acme -c \\\n \"/opt/zope/bin/zopectl -C /etc/instance1.conf $*\" \\\n \n ;;\n restart)\n \n ${0} stop\n sleep 1\n ${0} start\n \n ;;\n *)\n \n LD_LIBRARY_PATH=/opt/foolib \\\n su acme -c \\\n \"/opt/zope/bin/zopectl -C /etc/instance1.conf $*\" \\\n \n echo acme-instance2:\n /demo/acme-instance2 \"$@\" \\\n \n ;;\n esac\n \n\n Edge case, when we remove the part, we uninstall acme:\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts =\n ... \"\"\")\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n --del acme\n\nProcess Management\n==================\n\nNormally, the recipe doesn't start and stop processes. If we want it\nto, we can use the process-management option with a 'true' value.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ... process-management = true\n ...\n ... [zope]\n ... run-script = echo zope\n ... \"\"\" % dict(dest=demo))\n\nWhen the part is installed, the process is started:\n\n >>> print system('bin/buildout'),\n Installing zoperc.\n zope start\n\nIt also gets started when the part updates. This is just to make sure\nit is running.\n\n >>> print system('bin/buildout'),\n Updating zoperc.\n zope start\n\nIf we update the part, then when the part is uninstalled and\nreinstalled, the process will be stopped and started. We'll often\nforce this adding a digest option that exists solely to force a\nreinstall, typically because something else in the buildout has\nchanged.\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ... process-management = true\n ... digest = 1\n ...\n ... [zope]\n ... run-script = echo zope\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n Uninstalling zoperc.\n Running uninstall recipe.\n zope stop\n Installing zoperc.\n zope start\n\n >>> print system('bin/buildout buildout:parts='),\n Uninstalling zoperc.\n Running uninstall recipe.\n zope stop\n\n.. make sure it works with multiple parts\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope zeo\n ... dest = %(dest)s\n ... process-management = true\n ...\n ... [zeo]\n ... run-script = echo zeo\n ...\n ... [zope]\n ... run-script = echo zope\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n Installing zoperc.\n zope start\n zeo start\n\n >>> print system('bin/buildout buildout:parts='),\n Uninstalling zoperc.\n Running uninstall recipe.\n zeo stop\n zope stop\n\n.. make sure it works even if run script is missing\n\n\n >>> write(demo, 'zeo', '#!/bin/sh\\necho zeo\\n')\n >>> os.chmod(join(demo, 'zeo'), 0755)\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zeo\n ... dest = %(dest)s\n ... process-management = true\n ... [zeo]\n ... \"\"\" % dict(dest=demo))\n\n >>> print system('bin/buildout'),\n Installing zoperc.\n zeo:\n zeo\n\n >>> remove(demo, 'zeo')\n\n >>> print system('bin/buildout buildout:parts=') # doctest: +ELLIPSIS\n Uninstalling zoperc.\n Running uninstall recipe.\n zeo:\n ...\n\nRegression Tests\n================\n\nException formatting bug\n------------------------\n\nIf we do not provide a runscript, we get an exception (bug was: improperly\nformatted exception string, contained literal '%s'):\n\n >>> write('buildout.cfg',\n ... \"\"\"\n ... [buildout]\n ... parts = zoperc\n ...\n ... [zoperc]\n ... recipe = zc.recipe.rhrc\n ... parts = zope\n ... dest = %(dest)s\n ...\n ... [zope]\n ... \"\"\" % dict(dest=demo))\n >>> print system('bin/buildout'),\n Installing zoperc.\n zc.recipe.rhrc: Part zope doesn't define run-script and /demo/zope doesn't exist.\n While:\n Installing zoperc.\n Error: No script for zope\n\nDownload\n**********************", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "UNKNOWN", "keywords": "buildout", "license": "ZPL 2.1", "maintainer": null, "maintainer_email": null, "name": "zc.recipe.rhrc", "package_url": "https://pypi.org/project/zc.recipe.rhrc/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/zc.recipe.rhrc/", "project_urls": { "Download": "UNKNOWN", "Homepage": "UNKNOWN" }, "release_url": "https://pypi.org/project/zc.recipe.rhrc/1.4.2/", "requires_dist": null, "requires_python": null, "summary": "ZC Buildout recipe for Redhat RC scripts", "version": "1.4.2" }, "last_serial": 802193, "releases": { "1.0.0": [ { "comment_text": "", "digests": { "md5": "495c024120f5cbea0fb3866934f446d0", "sha256": "189d7e9f3624831931dbf352c604cf2296686b09dc419bf35a2478b8d65674d8" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.0.0.tar.gz", "has_sig": false, "md5_digest": "495c024120f5cbea0fb3866934f446d0", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 7438, "upload_time": "2008-01-15T17:15:58", "url": "https://files.pythonhosted.org/packages/e3/f5/de0671e8b6d25949bacde038c5582f755ede0d1e65046b506a02dd0ca778/zc.recipe.rhrc-1.0.0.tar.gz" } ], "1.1.0": [ { "comment_text": "", "digests": { "md5": "51fd14650799c291213ff029dfad52cc", "sha256": "a38ff2c891a1f10ac388e5eebe9a2dadb3af68f995cdbea9305d6c4a220409d5" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.1.0.tar.gz", "has_sig": false, "md5_digest": "51fd14650799c291213ff029dfad52cc", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 9290, "upload_time": "2008-02-01T21:26:44", "url": "https://files.pythonhosted.org/packages/dd/3a/3ad15afe49d94cc751bc70c96b0c12d0da04a43c53d02f928192e5b3ded4/zc.recipe.rhrc-1.1.0.tar.gz" } ], "1.2": [ { "comment_text": "", "digests": { "md5": "5bc074d0d72613824f8aeeaecc399322", "sha256": "e04bd79c1c8206a20a9dbbd1467bd6c0dd07e66edf8cfdb9ec041581a7d18046" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.2.tar.gz", "has_sig": false, "md5_digest": "5bc074d0d72613824f8aeeaecc399322", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 10130, "upload_time": "2009-04-06T16:45:03", "url": "https://files.pythonhosted.org/packages/bc/5c/703bcad4687547a60bd9a3b17da1a48bc49dc1f5d1686718935169c9c7fb/zc.recipe.rhrc-1.2.tar.gz" } ], "1.3.0": [ { "comment_text": "", "digests": { "md5": "dad585ef40f27ad6e4373671ce1848c7", "sha256": "6e1c176153b2de65f40726794e6ea8baa1042101fdd079aa71d40b173d838863" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.3.0.tar.gz", "has_sig": false, "md5_digest": "dad585ef40f27ad6e4373671ce1848c7", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13035, "upload_time": "2010-05-26T17:49:32", "url": "https://files.pythonhosted.org/packages/df/aa/fa1a3f64dd8c2f0ffd52e764192267973892fce7d995fdadee29d3cd2f6b/zc.recipe.rhrc-1.3.0.tar.gz" } ], "1.4.0": [ { "comment_text": "", "digests": { "md5": "b5278e7dd7e1470d2e7086600f72d38a", "sha256": "527f561801a64601045e49f13b973b68014e58b440f0e851654138db347b84f7" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.4.0.tar.gz", "has_sig": false, "md5_digest": "b5278e7dd7e1470d2e7086600f72d38a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14775, "upload_time": "2012-05-18T14:57:48", "url": "https://files.pythonhosted.org/packages/21/2b/ab3b33522bdf5b84447233493f7c2fe820eee93c65abe1c8b123718dd76f/zc.recipe.rhrc-1.4.0.tar.gz" } ], "1.4.1": [ { "comment_text": "", "digests": { "md5": "c68d5f7524414461ea2f77d4ea076d71", "sha256": "507c17ad2db79b0353b0fa0b8ce1ea8c92b43b595ce6bd4cf6d4e11e051944ee" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.4.1.tar.gz", "has_sig": false, "md5_digest": "c68d5f7524414461ea2f77d4ea076d71", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16265, "upload_time": "2012-08-31T21:24:05", "url": "https://files.pythonhosted.org/packages/f6/fa/150df68d856b54524ec05fd8aca48bd1e6c77b1365b4ccb01407358bb2c1/zc.recipe.rhrc-1.4.1.tar.gz" } ], "1.4.2": [ { "comment_text": "", "digests": { "md5": "97e03cf373886a140f2b09aaba01ea23", "sha256": "33bd3809cafe01af40a5187dd003450b823f75bc3b5e62a3e7dc710c79a3e3f3" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.4.2.tar.gz", "has_sig": false, "md5_digest": "97e03cf373886a140f2b09aaba01ea23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16824, "upload_time": "2012-12-20T19:36:41", "url": "https://files.pythonhosted.org/packages/3f/4e/f9894a63808a72cb0e63efb5aa142acb3f701e030170eba5c6f5de8e2d64/zc.recipe.rhrc-1.4.2.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "97e03cf373886a140f2b09aaba01ea23", "sha256": "33bd3809cafe01af40a5187dd003450b823f75bc3b5e62a3e7dc710c79a3e3f3" }, "downloads": -1, "filename": "zc.recipe.rhrc-1.4.2.tar.gz", "has_sig": false, "md5_digest": "97e03cf373886a140f2b09aaba01ea23", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 16824, "upload_time": "2012-12-20T19:36:41", "url": "https://files.pythonhosted.org/packages/3f/4e/f9894a63808a72cb0e63efb5aa142acb3f701e030170eba5c6f5de8e2d64/zc.recipe.rhrc-1.4.2.tar.gz" } ] }