| Installation on macOS |
| ======================== |
| |
| Step by step instruction on getting a full Whimsy test environment up and |
| running on macOS. Not all steps are required for every tool, but steps |
| common to many tools are included here, and additional steps required for |
| specific tools are linked at the bottom of these instructions. |
| See also the general [DEVELOPMENT.md](./DEVELOPMENT.md) configuration notes. |
| |
| :dizzy: **New!** For a simpler way to setup a macOS machine, please |
| check out the [setupmymac script](./SETUPMYMAC.md), which automates |
| configuring and keeping updated a local Whimsy instance. |
| |
| Install Homebrew |
| ---------------- |
| |
| Homebrew is a package manager for macOS, which is used to install other tools. |
| Follow the instructions from [brew.sh](https://brew.sh/). You might |
| have to change shells if you are using csh. Bash and zsh work fine. Be sure to |
| read the Homebrew prerequisites; you may need part(s) of Apple's XCode. |
| |
| Verify minimum version installed using: |
| |
| ``` |
| $ brew --version |
| Homebrew 2.1.16 |
| Homebrew/homebrew-core (git revision 274de; last commit 2019-11-12) |
| ``` |
| |
| Update using: |
| |
| ``` |
| $ brew update |
| ``` |
| |
| Upgrade Ruby (if needed) |
| ------------------------ |
| |
| Much of Whimsy is written in ruby. Versions of macOS prior to 10.15 (Catalina) |
| include an outdated version of ruby. |
| |
| Verify your current ruby version: |
| |
| ``` |
| $ ruby -v |
| ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19] |
| ``` |
| |
| You need at least version 2.4.1 to match the currently deployed Whimsy server. |
| If you don't see 2.3.1 or later, run `hash -r` and try again. If you still need |
| to update your ruby, proceed using one of the common ruby version managers: |
| rbenv (known to work), or rvm. |
| |
| If using rbenv, install: |
| |
| ``` |
| $ brew install rbenv |
| $ cd /srv/whimsy && rbenv install |
| $ rbenv init |
| ``` |
| Follow directions to ensure rbenv is setup in your shell(s), and double-check your ruby version. |
| Note the PATH changes that `rbenv init -` configures; you'll need to duplicate it in your httpd conf later. |
| To use this globally when invoked through rbenv shims, you can use `rbenv global $VERSION` to set that where `$VERSION` is the version in `/srv/whimsy/.ruby-version`. |
| [TODO: describe how to set .ruby-version] |
| To set this system-wide, you can link the specific versions of `ruby` and `gem` in rbenv to `/usr/local/bin` like so: |
| |
| ``` |
| ln -s /usr/local/bin/ruby $HOME/.rbenv/versions/2.5.5/bin/ruby |
| ln -s /usr/local/bin/gem $HOME/.rbenv/versions/2.5.5/bin/gem |
| ``` |
| |
| Install Node.js |
| --------------- |
| |
| Install: |
| |
| ``` |
| $ brew install node |
| $ npm install -g npm |
| ``` |
| |
| Verify: |
| |
| ``` |
| $ node -v |
| v12.12.0 |
| $ npm -v |
| 6.11.3 |
| ``` |
| |
| If you don't see v6 or higher, run `hash -r` and try again. If you previously |
| installed node via brew, you may need to run `brew upgrade node` instead. |
| |
| Install Puppeteer |
| ----------------- |
| There are a couple of scripts that require the Puppeteer node module. |
| Installing this is optional, as the scripts are currently only used for cron jobs. |
| ``` |
| npm install -g puppeteer |
| ``` |
| To enable easy access to the module, define the following environment variable: |
| ```export NODE_PATH=$(npm root -g)``` |
| For example this may produce |
| ```NODE_PATH="/usr/local/lib/node_modules"``` |
| Note: on Ubuntu, it looks as though the default is ```/usr/lib/node_modules``` |
| |
| Clone the Whimsy code |
| ------------ |
| |
| Depending on whether or not you have a GitHub account ([Apache committer setup](https://gitbox.apache.org/)), |
| use GitHub Desktop or run one of the following: |
| |
| ``` |
| git clone git@github.com:apache/whimsy.git |
| git clone https://github.com/apache/whimsy.git |
| git clone https://gitbox.apache.org/repos/asf/whimsy.git |
| ``` |
| |
| The first command makes things easier if you want to push to the GitHub clone |
| and avoid the dual authentication each time. The third command is for pushing |
| to the asf hosted clone. This only establishes the `origin`. You can add |
| other remotes via commands like: |
| |
| ``` |
| git remote add github git@github.com:apache/whimsy.git |
| git remote add asf https://gitbox.apache.org/repos/asf/whimsy.git |
| ``` |
| |
| Establish a link to this repository in a known location. First instructions |
| for macOS version < 10.15 (Mojave, High Sierra, Sierra, ...): |
| |
| ``` |
| cd whimsy |
| sudo mkdir /srv |
| sudo ln -s `pwd` /srv/whimsy |
| ``` |
| |
| Alternate instructions for macOS version >= 10.15 (Catalina): |
| |
| ``` |
| sudo mkdir /var/whimsy |
| echo -e 'srv\t/var/whimsy' | sudo tee -a /etc/synthetic.conf |
| ``` |
| |
| Reboot the machine, then: |
| |
| ``` |
| cd whimsy |
| sudo ln -s `pwd` /srv/whimsy |
| ``` |
| |
| Note: if you had previously created a <tt>/srv</tt> directory and it goes |
| missing when you upgrade to Catalina, the previous contents can be found in |
| <tt>"/Users/Shared/Relocated Items/Security"</tt>. |
| |
| Install Ruby gem dependencies |
| ------------ |
| |
| Install: |
| |
| ``` |
| cd /srv/whimsy |
| bundle install |
| ``` |
| |
| Verify: |
| |
| ``` |
| $ gem list |
| $ bundler -v |
| Bundler version 1.17.2 |
| ``` |
| |
| Notes: |
| |
| * If bundler is not installed, you may need to run `sudo gem install bundler`. |
| If this doesn't work, try `sudo gem install bundler -n /usr/local/bin` |
| in order to install bundler outside of `/usr/bin` |
| * If you get `bundler's executable "bundle" conflicts with /usr/local/bin/bundle |
| Overwrite the executable? [yN]`, respond with `y` (twice!) |
| * Some tools may need a [`bundle |
| install`](DEVELOPMENT.md#running-whimsy-applications-car) run for additional |
| gems. Simply change directory to the tool you wish to develop, and run |
| `bundle install` in that directory. If you want to install all of the |
| dendencies for all of the whimsy tools, run `rake update` in the top whimsy |
| directory. |
| * You may have trouble installing due to the dependency on nokogiri. There are |
| issues with its dependencies. This page suggests some workarounds: |
| https://github.com/sparklemotion/nokogiri/issues/1483 |
| The simplest solution may be `xcode-select --install` unless you know |
| that's already configured. |
| |
| Configure LDAP |
| -------------- |
| |
| Many Whimsy modules use Apache's LDAP directory. Install: |
| |
| ``` |
| $ cd /srv/whimsy |
| $ sudo ruby -I lib -r whimsy/asf -e "ASF::LDAP.configure" |
| ``` |
| |
| Verify: |
| |
| ``` |
| $ ldapsearch -x -LLL uid=rubys cn |
| dn: uid=rubys,ou=people,dc=apache,dc=org |
| cn: Sam Ruby |
| ``` |
| |
| Notes: |
| |
| * See DEVELOPMENT.md for more [LDAP configuration](DEVELOPMENT.md#ldapconfig). |
| * To pick up the latest code, the above needs to be run from the directory |
| you issued the `git clone` command. Alternately, provide the full path |
| to the `whimsy/lib` directory on the `ASF::LDAP.configure` command. |
| * Periodically the infrastructure team reconfigures LDAP servers, which may |
| require this command to be run again. |
| * Alternatives to running this command can be found in step 4 of |
| [DEVELOPMENT.md](https://github.com/apache/whimsy/blob/master/DEVELOPMENT.md) |
| * The `ldapsearch` command is the standard LDAP utility on macOS. |
| |
| |
| Start Apache httpd |
| ------------------ |
| |
| *Note* as an alternative to configuring and starting the version of httpd which |
| is provided with macOS, you can install a separate version using Homebrew. |
| Those instructions can be found in an [older version of these |
| instructions](https://github.com/apache/whimsy/blob/cbe00a45eb949cec8a6798f1172c64166a56e518/MACOSX.md#clone-the-whimsy-code), |
| specifically, the Install Homebrew, Install Apache httpd, Install passenger, |
| Configure whimsy.local, Complete Apache configuration, Make whimsy.local an |
| alias for your machine, and Optional: forward whimsy.local traffic to port 8080 |
| steps. |
| |
| Running Whimsy tools locally depends on httpd. Apple provides a copy of httpd that you can configure and start. |
| |
| Install: |
| |
| ``` |
| sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist |
| ``` |
| |
| Verify: |
| |
| ``` |
| $ curl localhost |
| <html><body><h1>It works!</h1></body></html> |
| ``` |
| |
| Notes: |
| |
| * `sudo lsof -i:80` may be helpful should you find that another process |
| already has port 80 open. |
| * `sudo apachectl restart` is how you restart apache; launchctl itself is for |
| controlling what processes automatically start at startup. |
| * If `curl` gives `Connection refused` then try kicking httpd: |
| * `sudo /usr/sbin/apachectl stop` |
| * `sudo /usr/sbin/httpd` |
| * If it works, then press CTRL-C and `sudo /usr/sbin/apachectl start` |
| * If it gave you `AH00526: Syntax error on line 20 of /private/etc/apache2/extra/httpd-mpm.conf` |
| then you may need to [delete the LockFile section](https://apple.stackexchange.com/questions/211015/el-capitan-apache-error-message-ah00526). |
| |
| Configure Apache httpd to run under your user id |
| ------------------------------------------------ |
| |
| First, lock down Apache so that it can only be accessed from your localhost |
| (using either IPv4 or IPv6). As you will be configuring Apache httpd to be |
| running with your ID, this will prevent external hackers from exploiting that |
| code to update your filesystem and do other nasty things. |
| |
| Edit `/etc/apache2/httpd.conf` using sudo and your favorite text editor. |
| Locate the first line that says `Require all granted`. This should be around |
| line 263 at the end of the section `Directory "/Library/WebServer/Documents"` or similar |
| Replace that line with the following four lines: |
| |
| ``` |
| <RequireAny> |
| Require ip 127.0.0.1 |
| Require ip ::1 |
| </RequireAny> |
| ``` |
| |
| Find the next occurrence of `Require all granted`. It should now be around |
| line 386 in the section `Directory "/Library/WebServer/CGI-Executables` or similar |
| Replace it with `Require all denied`. |
| |
| Now go back to the top of the file and search for `User`. Replace the first |
| `_www` with your local user id. This may be different than your ASF availid -- |
| that's OK. Your local user id is the response to `whoami`. |
| Replace the second `_www` with `staff` (that's the group name). |
| |
| Save your changes. |
| |
| Restart Apache httpd using `sudo apachectl restart`. |
| |
| Verify that you can continue to access the server by re-issuing the following |
| command: |
| |
| ``` |
| $ curl localhost |
| <html><body><h1>It works!</h1></body></html> |
| ``` |
| |
| Make whimsy.local an alias for your machine |
| ------------------------------------------- |
| |
| Edit `/etc/hosts` using sudo and your favorite text editor. |
| |
| Find either line that contains the word `localhost` and add `whimsy.local` to |
| it. For example, if you chose what is likely to be the final line in the file |
| and update it, it would look like this: |
| |
| ``` |
| ::1 localhost whimsy.local |
| ``` |
| |
| Save your changes. |
| |
| Verify that you can access the server using this new alias: |
| |
| ``` |
| $ curl whimsy.local |
| <html><body><h1>It works!</h1></body></html> |
| ``` |
| |
| Install passenger |
| ------------------------------------------------ |
| |
| Follow the [Installing Passenger + Apache on Mac OS X](https://www.phusionpassenger.com/library/install/apache/install/oss/osx/) instructions, which are summaried below:. |
| |
| Install: |
| |
| ``` |
| $ brew install passenger |
| $ brew info passenger |
| ``` |
| |
| For the second step (`brew info passenger`), you will need to |
| follow the instructions -- which essentially is to copy a few lines to |
| a specified location, typically `/etc/apache2/other/passenger.conf`. |
| |
| If your ruby is installed in `/usr/local/bin`, change the last line to |
| |
| ``` |
| PassengerDefaultRuby /usr/local/bin/ruby |
| ``` |
| |
| Likewise, if you used `rbenv` to manage your ruby install, point to that location instead. This should be `$HOME/.rbenv/shims/ruby`. |
| |
| Optional: add `PassengerUser _www` and `PassengerGroup _www` lines if you would like your passenger applications to run under the web user. |
| |
| |
| Restart the server: |
| |
| ``` |
| sudo apachectl restart |
| ``` |
| |
| Verify: |
| |
| Check that the server information includes 'Phusion_Passenger': |
| |
| ``` |
| $ curl --head whimsy.local |
| HTTP/1.1 200 OK |
| Date: Wed, 13 Nov 2019 19:37:12 GMT |
| Server: Apache/2.4.41 (Unix) Phusion_Passenger/6.0.4 |
| Content-Location: index.html.en |
| Vary: negotiate |
| TCN: choice |
| Last-Modified: Thu, 29 Aug 2019 05:05:59 GMT |
| ETag: "2d-5913a76187bc0" |
| Accept-Ranges: bytes |
| Content-Length: 45 |
| Content-Type: text/html |
| ``` |
| |
| This may fail on High Sierra with a [We cannot safely call it or ignore it in |
| the fork() child process. Crashing |
| instead.](https://blog.phusion.nl/2017/10/13/why-ruby-app-servers-break-on-macos-high-sierra-and-what-can-be-done-about-it/) message in your `/var/log/apache/error.log` file. If so, do the following: |
| |
| ``` |
| cp /System/Library/LaunchDaemons/org.apache.httpd.plist /Library/LaunchDaemons/ |
| ``` |
| |
| Edit ` /Library/LaunchDaemons/org.apache.httpd.plist` and add the following to |
| `EnvironmentVariables/Dict`: |
| |
| ``` |
| <key>OBJC_DISABLE_INITIALIZE_FORK_SAFETY</key> |
| <string>YES</string> |
| ``` |
| |
| Finally: |
| |
| ``` |
| sudo launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist |
| sudo launchctl load -w /Library/LaunchDaemons/org.apache.httpd.plist |
| ``` |
| |
| N.B. Because of System Integrity Protection (SIP), it's not possible to edit files under /System. |
| So the change is made to a copy. |
| However the original location is baked into apachectl which is also protected by SIP. |
| This means apachectl ignores the change. |
| A work-round for this is to create an updated copy of apachectl somewhere further up the path. |
| |
| Configure whimsy.local vhost |
| ---------------------------- |
| |
| Once again, Edit `/etc/apache2/httpd.conf` using sudo and your favorite text editor. |
| |
| Uncomment out the following lines: |
| |
| ``` |
| LoadModule proxy_module libexec/apache2/mod_proxy.so |
| |
| LoadModule proxy_wstunnel_module libexec/apache2/mod_proxy_wstunnel.so |
| |
| LoadModule speling_module libexec/apache2/mod_speling.so |
| |
| LoadModule rewrite_module libexec/apache2/mod_rewrite.so |
| |
| LoadModule authnz_ldap_module libexec/apache2/mod_authnz_ldap.so |
| |
| LoadModule ldap_module libexec/apache2/mod_ldap.so |
| |
| LoadModule expires_module libexec/apache2/mod_expires.so |
| |
| LoadModule cgi_module libexec/apache2/mod_cgi.so |
| ``` |
| |
| Add the following line: |
| |
| ``` |
| LDAPVerifyServerCert Off |
| ``` |
| |
| Also from the root of your whimsy git checkout, make a `/srv/cache` directory |
| owned by you, and establish a symbolic link to your whimsy git clone directory: |
| |
| ``` |
| sudo mkdir -p /srv/cache |
| sudo chown `id -un`:`id -gn` /srv/cache |
| sudo ln -s `pwd` /srv/whimsy |
| ``` |
| |
| Copy whimsy vhost definition to your apache2 configuration: |
| |
| ``` |
| sudo cp /srv/whimsy/config/whimsy.conf /private/etc/apache2/other |
| ``` |
| |
| Note: if you reside outside North America you may wish to use the EU LDAP server |
| by changing the references in the whimsy.conf file from |
| ldaps://ldap-us.apache.org:636/ |
| to |
| ldaps://ldap-eu.apache.org:636/ |
| |
| Restart Apache httpd using `sudo apachectl restart`. |
| |
| Verify: |
| |
| + **Static content**: Visit [http://whimsy.local/](http://whimsy.local). You |
| should see the [whimsy home page](https://whimsy.apache.org/). |
| + **CGI scripts**: Visit |
| [http://whimsy.local/test.cgi](http://whimsy.local/test.cgi). You should see |
| a list of environment variables. Compare with [test.cgi on |
| whimsy](https://whimsy.apache.org/test.cgi). |
| + **Passenger/Rack applications**: Visit |
| [http://whimsy.local/racktest](http://whimsy.local/racktest). You should see |
| a list of environment variables. Compare with [racktest on |
| whimsy](https://whimsy.apache.org/racktest). |
| |
| Compare the `PATH` values with your local (command line) environment. |
| Various whimsy tools will make use of a number of commands (`svn`, `pdftk`) |
| and it is important that these tools (and the correct version of each) can |
| be found on the `PATH` defined to the Apache httpd web server. If you find |
| you need to adjust this, edit the `SetEnv PATH` line in |
| `/etc/apache2/other/whimsy.conf`, restart the server and verify the path |
| again. |
| |
| Configure sending of mail |
| ------------------------- |
| |
| Every mail delivery system appears to be different. Once configured, |
| `sendmail` works fine on `whimsy-vm6.apache.org`. Others may require |
| passwords or may throttle the rate at which emails can be sent. |
| |
| The one option that appears to work for everybody is GMail. |
| |
| Create a `~/.whimsy` file, and add the following content: |
| |
| ``` |
| --- |
| :sendmail: |
| delivery_method: smtp |
| address: smtp.gmail.com |
| port: 587 |
| domain: apache.org |
| user_name: username |
| password: password |
| authentication: plain |
| enable_starttls_auto: true |
| ``` |
| |
| Verify this works: |
| |
| ``` |
| $ ruby whimsy/tools/testmail.rb |
| ``` |
| |
| Note Gmail will just be used as a delivery mechanism, you can still |
| use a different address (such as your @apache.org email address) as |
| the *from* address. The `domain` above should match the host portion of |
| the from address. |
| |
| Should your Apache user id differ from your local user id, either specify your |
| ASF user id as the first parameter to the testmail.rb program, or set the USER |
| environment variable to your ASF user id before running this script. |
| |
| If this fails, check your email for a response from Google. You may need |
| to approve this application. |
| |
| Information on other ways to configure sending mail can be found at |
| [DEVELOPMENT.md](DEVELOPMENT.md#setup) step 6. |
| |
| Identify location of svn checkouts |
| ---------------------------------- |
| |
| Edit `~/.whimsy` and add a list of checked out ASF repositories that may |
| be referenced by whimsy tools. For example: |
| |
| ``` |
| :svn: |
| - /Users/clr/apache/foundation |
| - /Users/clr/apache/documents |
| - /Users/clr/apache/committers |
| ``` |
| |
| Note: wildcards are permitted. The above can more economically be expressed |
| as: |
| |
| ``` |
| :svn: |
| - /Users/clr/apache/* |
| ``` |
| |
| Verify by visiting |
| [http://whimsy.local/status/svn](http://whimsy.local/status/svn). |
| |
| If you have at least one entry that ends with a `*`, and the |
| parent directory exists and is writable, this tool |
| will be able to do a check-out for you. |
| |
| Note that some checkouts (and possibly even some updates) may take longer than |
| the Apache httpd |
| [timeout](https://httpd.apache.org/docs/2.4/mod/core.html#timeout), which |
| defaults to 60 seconds, and if so, this tool won't automatically update when |
| the operation completes. Should that happen, simply refresh the page to see |
| the changes. |
| |
| |
| Make applications restart on change |
| ----------------------------------- |
| |
| While CGI scripts and static pages (HTML, CSS, JavaScript) can be changed |
| and are immediately available to be served without restarting the server, |
| Passenger/Rack applications need to be restarted to pick up changes. To |
| make this easier, whimsy has a small tool that will watch for file system |
| changes and restart applications that might be affected on the receipt of |
| the next request. |
| |
| To have this tool launch automatically, copy `whimsy/config/toucher.plist` to |
| '~/Library/LaunchAgents/' and have launchctl load it: |
| |
| ``` |
| mkdir -p ~/Library/LaunchAgents |
| cp /srv/whimsy/config/toucher.plist ~/Library/LaunchAgents/ |
| launchctl load ~/Library/LaunchAgents/toucher.plist |
| ``` |
| |
| **Note**: Adjust the path to `ruby` in `toucher.plist` if necessary. If you |
| make this change after you have loaded the script, unload then reload it. |
| |
| To verify that it is working, touch a file in an application, and verify |
| that `tmp/restart.txt` has been updated. Example: |
| |
| ``` |
| $ ls -l whimsy/www/board/agenda/tmp/restart.txt |
| $ touch whimsy/www/board/agenda/README.md |
| $ ls -l whimsy/www/board/agenda/tmp/restart.txt |
| ``` |
| |
| |
| Additional (application specific) configuration |
| ----------------------------------------------- |
| |
| A number of individual tools require additional configuration: |
| |
| * [config/board-agenda.md](config/board-agenda.md) |
| * [config/secretary-workbench.md](config/secretary-workbench.md) |
| * [config/officers-acreq.md](config/officers-acreq.md) |
| |
| Debugging |
| --------- |
| |
| When things go wrong, either check `whimsy_error.log` and `error_log` in |
| either `/usr/local/var/log/httpd/` or `/var/log/apache2/`. The location depends on how you have installed httpd. |