From 50187c319bc5dcfe0f6f3ff7c96826f23716b8ae Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 10 Dec 2009 00:19:35 -0800 Subject: prep for release --- .document | 6 + COPYING | 339 ++++++++++++++++++++++++++++++++++++++++++++ Documentation/.gitignore | 5 + Documentation/GNUmakefile | 30 ++++ Documentation/zbatery.1.txt | 154 ++++++++++++++++++++ GIT-VERSION-GEN | 2 +- GNUmakefile | 12 +- LICENSE | 55 +++++++ README | 130 +++++++++++++++++ Rakefile | 158 +++++++++++++++++++++ lib/zbatery.rb | 25 ++-- local.mk.sample | 78 ++++++++++ zbatery.gemspec | 55 +++++++ 13 files changed, 1030 insertions(+), 19 deletions(-) create mode 100644 .document create mode 100644 COPYING create mode 100644 Documentation/.gitignore create mode 100644 Documentation/GNUmakefile create mode 100644 Documentation/zbatery.1.txt create mode 100644 LICENSE create mode 100644 README create mode 100644 Rakefile create mode 100644 local.mk.sample create mode 100644 zbatery.gemspec diff --git a/.document b/.document new file mode 100644 index 0000000..a324f6a --- /dev/null +++ b/.document @@ -0,0 +1,6 @@ +ChangeLog +lib +LICENSE +NEWS +README +zbatery.1 diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d511905 --- /dev/null +++ b/COPYING @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/Documentation/.gitignore b/Documentation/.gitignore new file mode 100644 index 0000000..46679d6 --- /dev/null +++ b/Documentation/.gitignore @@ -0,0 +1,5 @@ +*.1 +*.5 +*.7 +*.gz +*.html diff --git a/Documentation/GNUmakefile b/Documentation/GNUmakefile new file mode 100644 index 0000000..5f97586 --- /dev/null +++ b/Documentation/GNUmakefile @@ -0,0 +1,30 @@ +all:: + +PANDOC = pandoc +PANDOC_OPTS = -f markdown --email-obfuscation=none --sanitize-html +pandoc = $(PANDOC) $(PANDOC_OPTS) +pandoc_html = $(pandoc) --toc -t html --no-wrap + +man1 := $(addsuffix .1,zbatery) +html1 := $(addsuffix .html,$(man1)) + +all:: html man + +html: $(html1) +man: $(man1) + +install-html: html + mkdir -p ../doc/man1 + install -m 644 $(html1) ../doc/man1 + +install-man: man + mkdir -p ../man/man1 + install -m 644 $(man1) ../man/man1 + +%.1: %.1.txt + $(pandoc) -s -t man < $< > $@+ && mv $@+ $@ +%.1.html: %.1.txt + $(pandoc_html) < $< > $@+ && mv $@+ $@ + +clean:: + $(RM) $(man1) $(html1) diff --git a/Documentation/zbatery.1.txt b/Documentation/zbatery.1.txt new file mode 100644 index 0000000..c352aff --- /dev/null +++ b/Documentation/zbatery.1.txt @@ -0,0 +1,154 @@ +% zbatery(1) Zbatery User Manual +% Zbatery hackers +% December 9, 2009 + +# NAME + +zbatery - rackup-like command to launch Zbatery + +# SYNOPSIS + +zbatery [-c CONFIG_FILE] [-E RACK_ENV] [-D] [RACKUP_FILE] + +# DESCRIPTION + +A rackup(1)-like command to launch Rack applications using +Zbatery. It is expected to be started in your application root +(APP_ROOT), but "Dir.chdir" may also be executed in the CONFIG_FILE or +RACKUP_FILE. + +While Zbatery takes a myriad of command-line options for +compatibility with ruby(1) and rackup(1), it is recommended to stick +to the few command-line options specified in the SYNOPSIS and use +the CONFIG_FILE as much as possible. + +# RACKUP FILE + +This defaults to \"config.ru\" in APP_ROOT. It should be the same +file used by rackup(1) and other Rack launchers, it uses the +*Rack::Builder* DSL. + +Embedded command-line options are mostly parsed for compatibility +with rackup(1) but strongly discouraged. + +# UNICORN OPTIONS +-c, \--config-file CONFIG_FILE +: Path to the Unicorn-specific config file. The config file is + implemented as a Ruby DSL, so Ruby code may executed (e.g. + "Dir.chdir", "Process::UID.change_privilege"). See the RDoc/ri + for the *Unicorn::Configurator* class for the full list of + directives available from the DSL. + +-D, \--daemonize +: Run daemonized in the background. The process is detached from + the controlling terminal and stdin is redirected to "/dev/null". + Unlike many common UNIX daemons, we do not chdir to \"/\" + upon daemonization to allow more control over the startup/upgrade + process. + Unless specified in the CONFIG_FILE, stderr and stdout will + also be redirected to "/dev/null". + +-E, \--env RACK_ENV +: Run under the given RACK_ENV. See the RACK ENVIRONMENT section + for more details. + +-l, \--listen ADDRESS +: Listens on a given ADDRESS. ADDRESS may be in the form of + HOST:PORT or PATH, HOST:PORT is taken to mean a TCP socket + and PATH is meant to be a path to a UNIX domain socket. + Defaults to "0.0.0.0:8080" (all addresses on TCP port 8080) + For production deployments, specifying the "listen" directive in + CONFIG_FILE is recommended as it allows fine-tuning of socket + options. + +# RACKUP COMPATIBILITY OPTIONS +-o, \--host HOST +: Listen on a TCP socket belonging to HOST, default is + "0.0.0.0" (all addresses). + If specified multiple times on the command-line, only the + last-specified value takes effect. + This option only exists for compatibility with the rackup(1) command, + use of "-l"/"\--listen" switch is recommended instead. + +-p, \--port PORT +: Listen on the specified TCP PORT, default is 8080. + If specified multiple times on the command-line, only the last-specified + value takes effect. + This option only exists for compatibility with the rackup(1) command, + use of "-l"/"\--listen" switch is recommended instead. + +-s, \--server SERVER +: No-op, this exists only for compatibility with rackup(1). + +# RUBY OPTIONS +-e, \--eval LINE +: Evaluate a LINE of Ruby code. This evaluation happens + immediately as the command-line is being parsed. + +-d, \--debug +: Turn on debug mode, the $DEBUG variable is set to true. + +-w, \--warn +: Turn on verbose warnings, the $VERBOSE variable is set to true. + +-I, \--include PATH +: specify $LOAD_PATH. PATH will be prepended to $LOAD_PATH. + The \':\' character may be used to delimit multiple directories. + This directive may be used more than once. Modifications to + $LOAD_PATH take place immediately and in the order they were + specified on the command-line. + +-r, \--require LIBRARY +: require a specified LIBRARY before executing the application. The + \"require\" statement will be executed immediately and in the order + they were specified on the command-line. + +# SIGNALS + +The following UNIX signals may be sent to Zbatery +(only supported on UNIX): + +* HUP - reexecute the binary and exit the current one +* INT/TERM - quick shutdown, quit immediately +* QUIT - graceful shutdown, waits for current requests before exiting +* USR1 - reopen all logs owned by the master and all workers + See Unicorn::Util.reopen_logs for what is considered a log. +* USR2 - reexecute the running binary. A separate QUIT + should be sent to the original process once the child is verified to + be up and running. + +# RACK ENVIRONMENT + +Accepted values of RACK_ENV and the middleware they automatically load +(outside of RACKUP_FILE) are exactly as those in rackup(1): + +* development - loads Rack::CommonLogger, Rack::ShowExceptions, and + Rack::Lint middleware +* deployment - loads Rack::CommonLogger middleware +* none - loads no middleware at all, relying + entirely on RACKUP_FILE + +All unrecognized values for RACK_ENV are assumed to be +"none". Production deployments are strongly encouraged to use +"deployment" or "none" for maximum performance. + +Note that the Rack::ContentLength and Rack::Chunked middlewares +are never loaded by default. If needed, they should be +individually specified in the RACKUP_FILE, some frameworks do +not require them. + +# SEE ALSO + +* unicorn(1) +* rainbows(1) +* *Rack::Builder* ri/RDoc +* *Unicorn::Configurator* ri/RDoc +* [Zbatery RDoc][1] +* [Rack RDoc][2] +* [Rackup HowTo][3] +* [Rainbows! RDoc][4] + +[1]: http://zbatery.bogomip.org/ +[2]: http://rack.rubyforge.org/doc/ +[3]: http://wiki.github.com/rack/rack/tutorial-rackup-howto +[4]: http://rainbows.rubyforge.org/ diff --git a/GIT-VERSION-GEN b/GIT-VERSION-GEN index 4e7f0e3..92e03e3 100755 --- a/GIT-VERSION-GEN +++ b/GIT-VERSION-GEN @@ -1,7 +1,7 @@ #!/bin/sh GVF=GIT-VERSION-FILE -DEF_VER=v0.1.0.GIT +DEF_VER=v0.0.0.GIT LF=' ' diff --git a/GNUmakefile b/GNUmakefile index 8655ca8..febc331 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -6,7 +6,6 @@ GIT_URL = git://git.bogomips.org/zbatery.git GIT-VERSION-FILE: .FORCE-GIT-VERSION-FILE @./GIT-VERSION-GEN -RUBY = ruby -include GIT-VERSION-FILE -include local.mk ifeq ($(DLEXT),) # "so" for Linux @@ -59,18 +58,20 @@ NEWS: GIT-VERSION-FILE $(RAKE) -s news_rdoc > $@+ mv $@+ $@ -SINCE = 0.5.0 +SINCE = ChangeLog: LOG_VERSION = \ $(shell git rev-parse -q "$(GIT_VERSION)" >/dev/null 2>&1 && \ echo $(GIT_VERSION) || git describe) +ifneq ($(SINCE),) ChangeLog: log_range = v$(SINCE)..$(LOG_VERSION) +endif ChangeLog: GIT-VERSION-FILE @echo "ChangeLog from $(GIT_URL) ($(log_range))" > $@+ @echo >> $@+ git log $(log_range) | sed -e 's/^/ /' >> $@+ mv $@+ $@ -news_atom := http://zbatery.bogomips.org.org/NEWS.atom.xml +news_atom := http://zbatery.bogomip.org/NEWS.atom.xml cgit_atom := http://git.bogomips.org/cgit/zbatery.git/atom/?h=master atom = @@ -94,11 +95,6 @@ doc: .document NEWS ChangeLog doc/NEWS.html doc/README.html $(RAKE) -s news_atom > doc/NEWS.atom.xml cd doc && ln README.html tmp && mv tmp index.html - $(MAKE) -C Documentation comparison.html - $(RUBY) -i -p -e \ - '$$_.gsub!(/INCLUDE/){File.read("Documentation/comparison.html")}' \ - doc/Summary.html - cat Documentation/comparison.css >> doc/rdoc.css $(RM) $(man1_bins) ifneq ($(VERSION),) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..87eac50 --- /dev/null +++ b/LICENSE @@ -0,0 +1,55 @@ +Zbatery is copyrighted Free Software by all contributors, see the +logs in revision control for all of them. You can redistribute it +and/or modify it under either the terms of the +{GPL2}[http://www.gnu.org/licenses/gpl-2.0.txt] (see link:COPYING) or +the conditions below: + + 1. You may make and give away verbatim copies of the source form of the + software without restriction, provided that you duplicate all of the + original copyright notices and associated disclaimers. + + 2. You may modify your copy of the software in any way, provided that + you do at least ONE of the following: + + a) place your modifications in the Public Domain or otherwise make them + Freely Available, such as by posting said modifications to Usenet or an + equivalent medium, or by allowing the author to include your + modifications in the software. + + b) use the modified software only within your corporation or + organization. + + c) rename any non-standard executables so the names do not conflict with + standard executables, which must also be provided. + + d) make other distribution arrangements with the author. + + 3. You may distribute the software in object code or executable + form, provided that you do at least ONE of the following: + + a) distribute the executables and library files of the software, + together with instructions (in the manual page or equivalent) on where + to get the original distribution. + + b) accompany the distribution with the machine-readable source of the + software. + + c) give non-standard executables non-standard names, with + instructions on where to get the original software distribution. + + d) make other distribution arrangements with the author. + + 4. You may modify and include the part of the software into any other + software (possibly commercial). But some files in the distribution + are not written by the author, so that they are not under this terms. + + 5. The scripts and library files supplied as input to or produced as + output from the software do not automatically fall under the + copyright of the software, but belong to whomever generated them, + and may be sold commercially, and may be aggregated with this + software. + + 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR + IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE. diff --git a/README b/README new file mode 100644 index 0000000..af5ffb0 --- /dev/null +++ b/README @@ -0,0 +1,130 @@ += Zbatery: Rack HTTP server without a fork stuck in it + +Zbatery is an HTTP server for Rack applications on systems that either +do not support fork(), or have no memory (nor need) to run the +master/worker model. It is based on Rainbows! (which is based on +Unicorn (which is based on Mongrel)) and inherits parts of each. +Zbatery supports your choice of all the thread/fiber/event/actor-based +concurrency models and Rack middleware that Rainbows! supports (or will +ever support) in a single process. + +Zbatery will still exploit certain features of Unix for transparent +upgrades, log reopening, and graceful stops, but does not rely on them +for basic functionality. + +== Features + +* Designed for {Rack}[http://rack.rubyforge.org/], the standard for + modern Ruby HTTP applications. + +* Configuration files are compatible with Rainbows!, a superset + of the Unicorn + {DSL}[http://unicorn.bogomips.org/Unicorn/Configurator.html]. + +* Inherits all features and concurrency models Rainbows! supports + (and ever will support): http://rainbows.rubyforge.org/Summary.html + +* -Untested- Works under operating systems that don't support signals, + pipe and fork(). Unicorn 0.95.2+ has rake-compiler support, so + compiling the HTTP parser should be easier at least. + +* -Untested- HTML 5 Web Sockets support + +== License + +Zbatery is copyright 2009 by all contributors (see logs in git). +It is ultimately based on Mongrel and carries the same license. + +Mongrel is copyright 2007 Zed A. Shaw and contributors. It is licensed +under the Ruby license and the GPL2. See the included LICENSE file for +details. + +Zbatery is 100% Free Software. + +== Install + +You may download the tarball from the Rainbows project page on Rubyforge +and run setup.rb after unpacking it: + +http://rubyforge.org/frs/?group_id=8977 + +You may also install it via RubyGems on Gemcutter: + + gem install zbatery + +== Usage + +=== for Rack applications + +In APP_ROOT (where config.ru is located), run: + + zbatery + +Zbatery will bind to all interfaces on TCP port 8080 by default. + +=== Configuration File(s) + +Zbatery will look for the config.ru file used by rackup in APP_ROOT. + +For deployments, it can use a config file for Unicorn and +Rainbows!-specific options specified by the +--config-file/-c+ +command-line switch. Zbatery accepts all options found in +{Unicorn::Configurator}[http://unicorn.bogomips.org/Unicorn/Configurator.html] +as well as the "Rainbows!" block, so you can have the following in your +config file: + + Rainbows! do + use :FiberSpawn + worker_connections 400 + end + +See the Rainbows! configuration +{documentation}[http://rainbows.rubyforge.org/Rainbows.html#M000001] +for more details. + +== Disclaimer + +There is NO WARRANTY whatsoever if anything goes wrong, but let us know +and we'll try our best to fix it. + +This project may be temporary and may eventually have its name encoded +with uncrackable ROT13 encryption leaving you with no way to upgrade. + +== Development + +Most of the work is done in Rainbows!, Zbatery is just a shim to +allow access to Rainbows! without requiring fork() or signals. + +You can get the latest source via git from the following locations: + + git://git.bogomips.org/zbatery.git + git://repo.or.cz/zbatery.git (mirror) + +You may browse the code from the web and download the latest snapshot +tarballs here: + +* http://git.bogomips.org/cgit/zbatery.git (cgit) +* http://repo.or.cz/w/zbatery.git (gitweb) + +Inline patches (from "git format-patch") to the mailing list are +preferred because they allow code review and comments in the reply to +the patch. + +We will adhere to mostly the same conventions for patch submissions as +git itself. See the Documentation/SubmittingPatches document +distributed with git on on patch submission guidelines to follow. Just +don't email the git mailing list or maintainer with Zbatery patches. + +== Tests + +There currently are no tests specific to Zbatery. Keep in mind that +Zbatery is only a small shim to drive Rainbows! (and Unicorn) +underneath. Rainbows! and Unicorn both have extensive (but very +UNIX-specific) test suites. + +== Contact + +All feedback (bug reports, user/development dicussion, patches, pull +requests) go to the mailing list/newsgroup. We are currently +borrowing the Rainbows! mailing list since most of our code (and +problems) are related to Rainbows! mailto:rainbows-talk@rubyforge.org. diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..340ce38 --- /dev/null +++ b/Rakefile @@ -0,0 +1,158 @@ +# -*- encoding: binary -*- + +# most tasks are in the GNUmakefile which offers better parallelism + +def tags + timefmt = '%Y-%m-%dT%H:%M:%SZ' + @tags ||= `git tag -l`.split(/\n/).map do |tag| + if %r{\Av[\d\.]+\z} =~ tag + header, subject, body = `git cat-file tag #{tag}`.split(/\n\n/, 3) + header = header.split(/\n/) + tagger = header.grep(/\Atagger /).first + body ||= "initial" + { + :time => Time.at(tagger.split(/ /)[-2].to_i).utc.strftime(timefmt), + :tagger_name => %r{^tagger ([^<]+)}.match(tagger)[1].strip, + :tagger_email => %r{<([^>]+)>}.match(tagger)[1].strip, + :id => `git rev-parse refs/tags/#{tag}`.chomp!, + :tag => tag, + :subject => subject, + :body => body, + } + end + end.compact.sort { |a,b| b[:time] <=> a[:time] } +end + +cgit_url = "http://git.bogomips.org/cgit/zbatery.git" +git_url = ENV['GIT_URL'] || 'git://git.bogomips.org/zbatery.git' + +desc 'prints news as an Atom feed' +task :news_atom do + require 'nokogiri' + new_tags = tags[0,10] + puts(Nokogiri::XML::Builder.new do + feed :xmlns => "http://www.w3.org/2005/Atom" do + id! "http://zbatery.bogomip.org/NEWS.atom.xml" + title "Zbatery news" + subtitle "HTTP server without a fork stuck in it" + link! :rel => 'alternate', :type => 'text/html', + :href => 'http://zbatery.bogomip.org/NEWS.html' + updated(new_tags.empty? ? "1970-01-01T00:00:00Z" : new_tags.first[:time]) + new_tags.each do |tag| + entry do + title tag[:subject] + updated tag[:time] + published tag[:time] + author { + name tag[:tagger_name] + email tag[:tagger_email] + } + url = "#{cgit_url}/tag/?id=#{tag[:tag]}" + link! :rel => "alternate", :type => "text/html", :href =>url + id! url + message_only = tag[:body].split(/\n.+\(\d+\):\n {6}/s).first.strip + content({:type =>:text}, message_only) + content(:type =>:xhtml) { pre tag[:body] } + end + end + end + end.to_xml) +end + +desc 'prints RDoc-formatted news' +task :news_rdoc do + tags.each do |tag| + time = tag[:time].tr!('T', ' ').gsub!(/:\d\dZ/, ' UTC') + puts "=== #{tag[:tag].sub(/^v/, '')} / #{time}" + puts "" + + body = tag[:body] + puts tag[:body].gsub(/^/sm, " ").gsub(/[ \t]+$/sm, "") + puts "" + end +end + +desc "print release changelog for Rubyforge" +task :release_changes do + version = ENV['VERSION'] or abort "VERSION= needed" + version = "v#{version}" + vtags = tags.map { |tag| tag[:tag] =~ /\Av/ and tag[:tag] }.sort + prev = vtags[vtags.index(version) - 1] + if prev + system('git', 'diff', '--stat', prev, version) or abort $? + puts "" + system('git', 'log', "#{prev}..#{version}") or abort $? + else + system('git', 'log', version) or abort $? + end +end + +desc "print release notes for Rubyforge" +task :release_notes do + require 'rubygems' + + spec = Gem::Specification.load('zbatery.gemspec') + puts spec.description.strip + puts "" + puts "* #{spec.homepage}" + puts "* #{spec.email}" + puts "* #{git_url}" + + _, _, body = `git cat-file tag v#{spec.version}`.split(/\n\n/, 3) + print "\nChanges:\n\n" + puts body +end + +desc "read news article from STDIN and post to rubyforge" +task :publish_news do + require 'rubyforge' + IO.select([STDIN], nil, nil, 1) or abort "E: news must be read from stdin" + msg = STDIN.readlines + subject = msg.shift + blank = msg.shift + blank == "\n" or abort "no newline after subject!" + subject.strip! + body = msg.join("").strip! + + rf = RubyForge.new.configure + rf.login + rf.post_news('rainbows', subject, body) +end + +desc "post to RAA" +task :raa_update do + require 'rubygems' + require 'net/http' + require 'net/netrc' + rc = Net::Netrc.locate('zbatery-raa') or abort "~/.netrc not found" + password = rc.password + + s = Gem::Specification.load('zbatery.gemspec') + desc = [ s.description.strip ] + desc << "" + desc << "* #{s.email}" + desc << "* #{git_url}" + desc << "* #{cgit_url}" + desc = desc.join("\n") + uri = URI.parse('http://raa.ruby-lang.org/regist.rhtml') + form = { + :name => s.name, + :short_description => s.summary, + :version => s.version.to_s, + :status => 'experimental', + :owner => s.authors.first, + :email => s.email, + :category_major => 'Library', + :category_minor => 'Web', + :url => s.homepage, + :download => "http://rubyforge.org/frs/?group_id=8977", + :license => "Ruby's", + :description_style => 'Plain', + :description => desc, + :pass => password, + :submit => "Update", + } + res = Net::HTTP.post_form(uri, form) + p res + puts res.body +end diff --git a/lib/zbatery.rb b/lib/zbatery.rb index 6ed9134..6b69e6d 100644 --- a/lib/zbatery.rb +++ b/lib/zbatery.rb @@ -3,7 +3,21 @@ require 'rainbows' module Zbatery - # check if our Ruby implementation supports unlinked files + # current version of Zbatery + VERSION = "0.0.0" + + class << self + + # runs the Zbatery HttpServer with +app+ and +options+ and does + # not return until the server has exited. + def run(app, options = {}) + HttpServer.new(app, options).start.join + end + end + + Rainbows::Const::RACK_DEFAULTS["SERVER_SOFTWARE"] = "Zbatery #{VERSION}" + + # true if our Ruby implementation supports unlinked files UnlinkedIO = begin tmp = Unicorn::Util.tmpio tmp.chmod(0) @@ -18,15 +32,6 @@ module Zbatery # config files... FORK_HOOK = lambda { |_,_| } - class << self - - # runs the Rainbows! HttpServer with +app+ and +options+ and does - # not return until the server has exited. - def run(app, options = {}) - HttpServer.new(app, options).start.join - end - end - class HttpServer < Rainbows::HttpServer # only used if no concurrency model is specified diff --git a/local.mk.sample b/local.mk.sample new file mode 100644 index 0000000..27311ef --- /dev/null +++ b/local.mk.sample @@ -0,0 +1,78 @@ + +# this is the local.mk file used by Eric Wong on his dev boxes. +# GNUmakefile will source local.mk in the top-level source tree +# if it is present. +# +# This is depends on a bunch of GNU-isms from bash, sed, touch. + +RSYNC = rsync +DLEXT := so +gems := rack-1.0.1 +# gems += unicorn-0.95.2 # installed via setup.rb +# gems += rainbows-0.8.0 # installed via setup.rb +gems += rev-0.3.1 +gems += iobuffer-0.1.1 +gems += eventmachine-0.12.10 +gems += async_sinatra-0.1.5 sinatra-0.9.4 + +# Avoid loading rubygems to speed up tests because gmake is +# fork+exec heavy with Ruby. +prefix = $(HOME) +ifeq ($(r19),) + RUBY := $(prefix)/bin/ruby + gem_paths := $(addprefix $(prefix)/lib/ruby/gems/1.8/gems/,$(gems)) +else + prefix := $(prefix)/ruby-1.9 + export PATH := $(prefix)/bin:$(PATH) + RUBY := $(prefix)/bin/ruby --disable-gems + gems += case-0.5 revactor-0.1.5 + gem_paths := $(addprefix $(prefix)/lib/ruby/gems/1.9.1/gems/,$(gems)) +endif + +ifdef gem_paths + sp := + sp += + export RUBYLIB := $(subst $(sp),:,$(addsuffix /lib,$(gem_paths))) +endif + +# pipefail is THE reason to use bash (v3+) or never revisions of ksh93 +# SHELL := /bin/bash -e -o pipefail +SHELL := /bin/ksh93 -e -o pipefail + +# trace execution of tests +# TRACER = strace -f -o $(t_pfx).strace -s 100000 +TRACER = /usr/bin/time -v -o $(t_pfx).time + +full-test: test-18 test-19 +test-18: + $(MAKE) test 2>&1 | sed -e 's!^!1.8 !' +test-19: + $(MAKE) test r19=t 2>&1 | sed -e 's!^!1.9 !' + +latest: NEWS + @awk 'BEGIN{RS="=== ";ORS=""}NR==2{sub(/\n$$/,"");print RS""$$0 }' < $< + +# publishes docs to http://zbatery.bogomip.org/ +publish_doc: + -git set-file-times + $(RM) -r doc ChangeLog NEWS + $(MAKE) doc LOG_VERSION=$(shell git tag -l | tail -1) + $(MAKE) -s latest > doc/LATEST + find doc/images doc/js -type f | \ + TZ=UTC xargs touch -d '1970-01-01 00:00:00' doc/rdoc.css + $(MAKE) doc_gz + chmod 644 $$(find doc -type f) + $(RSYNC) -av doc/ dcvr:/srv/zbatery/ + git ls-files | xargs touch + +# Create gzip variants of the same timestamp as the original so nginx +# "gzip_static on" can serve the gzipped versions directly. +doc_gz: docs = $(shell find doc -type f ! -regex '^.*\.\(gif\|jpg\|png\|gz\)$$') +doc_gz: + touch doc/NEWS.atom.xml -d "$$(awk 'NR==1{print $$4,$$5,$$6}' NEWS)" + for i in $(docs); do \ + gzip --rsyncable -9 < $$i > $$i.gz; touch -r $$i $$i.gz; done + +# launches any of the following shells with RUBYLIB set +irb sh bash ksh: + $@ diff --git a/zbatery.gemspec b/zbatery.gemspec new file mode 100644 index 0000000..00510ea --- /dev/null +++ b/zbatery.gemspec @@ -0,0 +1,55 @@ +# -*- encoding: binary -*- + +ENV["VERSION"] or abort "VERSION= must be specified" +manifest = File.readlines('.manifest').map! { |x| x.chomp! } + +# don't bother with tests that fork, not worth our time to get working +# with `gem check -t` ... (of course we care for them when testing with +# GNU make when they can run in parallel) +test_files = manifest.grep(%r{\Atest/unit/test_.*\.rb\z}).map do |f| + File.readlines(f).grep(/\bfork\b/).empty? ? f : nil +end.compact + +Gem::Specification.new do |s| + s.name = %q{zbatery} + s.version = ENV["VERSION"] + + s.authors = ["Zbatery hackers"] + s.date = Time.now.utc.strftime('%Y-%m-%d') + s.description = File.read("README").split(/\n\n/)[1] + s.email = %q{rainbows-talk@rubyforge.org} + s.executables = %w(zbatery) + + s.extra_rdoc_files = File.readlines('.document').map! do |x| + x.chomp! + if File.directory?(x) + manifest.grep(%r{\A#{x}/}) + elsif File.file?(x) + x + else + nil + end + end.flatten.compact + + s.files = manifest + s.homepage = %q{http://zbatery.bogomip.org/} + s.summary = %q{Rack HTTP server without a fork stuck in it} + s.rdoc_options = [ "-Na", "-t", "Zbatery - #{s.summary}" ] + s.require_paths = %w(lib) + s.rubyforge_project = %q{rainbows} + + s.test_files = test_files + + # rainbows has a boatload of dependencies + # required: + # unicorn + rack + # optional: + # revactor + rev + iobuffer + # rev + iobuffer + # eventmachine + # espace-neverblock + eventmachine + # async_sinatra + sinatra + eventmachine + s.add_dependency(%q, ["~> 0.8.0"]) + + # s.licenses = %w(GPLv2 Ruby) # accessor not compatible with older RubyGems +end -- cgit v1.2.3-24-ge0c7