
* 1.4.0 - May 30 2016
- Add alert mail functionality - When a program is started/restarted and
"email_alerts" is set on a program config, an email will be sent to that
address. Also adds "sendmail_path" on MainConfig, which defines an explicit
location of the "sendmail" program. Default is to try to find it on PATH and
in common places.
- Fix issue where usrsvcd would try to start a process after usrsvc stopped
it, if "usrsvc restart" was issued. This tests if usrsvc is holding a lock on a program before testing if it's down
and before restarting.  Only one instance would have been started, but it's
excess work and logging.
- Add util function to search PATH for an executable. If not given absolute
path when calling usrsvcd, search PATH first, otherwise try to identify based
on relative and cwd. This adds the last option (like when calling with
relative path into a virtualenv), since the second was implicit prior.
- Some minor cleanups and tunings

* 1.3.5 - ??? ?? ????
- Update time reported in Activity File log. It was reporting the number of
seconds past the threshold, but it makes more sense to report the total age.

* 1.3.4 - May 27 2016
- Remove unintentional change that caused restarts/startups happen async. They should
have always been parallel

* 1.3.3 - May 23 2016
- When useshell=True, give up to success_seconds for the subprocess of the shell to start. This covers if some pre-tasks take a few seconds to perform before the final app is started.

* 1.3.2 - May 23 2016
- Fix issue when proctitle_re is provided. 
- Better handle automatic proctitle_re when '&&' is used in a command. 
- Make useshell default to False. 
- When useshell is True, ensure we dont match the wrapping shell process but the final process itself.

* 1.3.1 - May 23 2016
- Instead of calling "usrsvc" as a subprocess from "usrsvcd", move the usrsvc client into a module and have usrsvcd fork and execute it. This allows usrsvcd to continue to manage processes after a bad configuration, by having usrsvc inherit the previous configuration as stored in usrsvcd.
- If "usrsvcd restart" was called with an absolute path to usrsvcd, use that same path (incase usrsvcd is not on PATH).

* 1.2.6 - May 23 2016
- Wait 1 second after spawning subprocess during "usrsvcd restart", or we may exit before child process is created.
- Inherit env during "usrsvcd restart" to inherit any PATH

* 1.2.5 - May 17 2016
- Fix program stop not working after refactoring

* 1.2.4 - May 16 2016
- Fix some typos found by Sergey Fukanchik. Thanks!

* 1.2.3 - May 16 2016
- Fix stupid RST MISformatting of README. Why can't it use markdown?

* 1.2.2 - May 11 2016
- Wait longer before sending kill -9 for "usrsvcd stop"
- Add "usrsvcd start" which is same as just "usrsvcd" but intuitive.
- Add a --readme  option which will print the README
- Cleanup the usage for usrsvc

* 1.2.1 - Apr 28 2016
- Fix README path
- Ensure dict keys when printed in error messages are str(list) instead of just str() because python3 otherwise adds "dict_keys(['blah'])" to the str.

* 1.2.0 - Mar 21 2016
- Refactoring of Monitoring to allow more and better monitoring
- Add new property to Monitoring, rss_limit, which if specified will cause the
program to restart if it exceeds that many kB of Resident Set Size (private
memory)
- Some fixes and improvements to using --debug
- Set a maximum 3-second timeout to run monitors per program, so some issue
with some monitor is isolated



* 1.1.1 - Mar 11 2016
- Turns out python 2.7.8 does not have the enum type, and we should support older python 2.7s, so 
give a fallback method for returnCodeToString that doesn't rely on enum

* 1.1.0 - Mar 11 2016
- Add "--parallel" flag that can be used with "usrsvc start/stop/restart all"
to perform the action in parallel instead of serially.
- Instead of a flat "did" or "did not" start, capture more conditions on WHY
we couldn't start a program
- Much more logging in the realm of starting programs, relating to conditions
of failure
- Add more error codes to ReturnCodes for more specific reasons of failure
- Implement ReturnCodes.returnCodeToString which will get the string
representation of the return code.
- Use the string representation of return codes in logging
- Be more verbose in several places with logging
- Change from raising exceptions in startProgram to returning relevant error
code for better reporting

* 1.0.0 - Mar 9 2016
- Initial Beta Release
