I don't mind the monkeysphere-ssh-proxycommand output on regular connections.

For me it looks something like this with a server not participating in the
monkey sphere:

		ms: processing host: chavez.mayfirst.org
		ms:   - key not found.
	
And like this for a server participating:

		ms: processing host: george.riseup.net
		ms:  primary key found: 7353A74E3B757F8C
		ms:   * acceptable key found.
		ms: known_hosts file updated.

However, I have some batch scripts that run ssh that also provide
output, so the monkeysphere output clutters things up.

I would really like to either have a -q/--quiet option, or, preferable for me
at least, would be for silent output to be the default and have a -v/--verbose
option to get the output. Or - maybe these should be environmental variables?
In any event - someway to suppress informational output would be a useful
improvement.

------

I'd be fine with silent mode as a default, with a more verbose mode
accessible to the user who desires it.

I'd prefer an environment variable (e.g. `MONKEYSPHERE_VERBOSE` or
`MONKEYSPHERE_DEBUG`) over a command-line (e.g. `--verbose`) option,
personally.  It's more in keeping with the model we've used in general
so far.

--dkg

------

I just completed this feature. I published it to a separate branch
(called quiet-mode). I haven't committed it to my master branch for a
couple reasons:

 * I made some significant changes and wanted to ask Big Jimmy to take
 a look since it's mostly his stuff I mucked about with.

 * Sometime between starting my hacking and mid-way through, my
 ~.ssh/known_hosts file got truncted to nothing. I recovered from a
 backup. I couldn't figure out what caused that to happen and couldn't
 replicate it. I was debugging my bash and what I was debugging
 involved bash redirection, so it's reasonable to think that something
 I did caused the problem. However, before committing we incorporate
 this, I would appreciate another set of eyes on my code to make sure
 I'm not doing something dangerous or just dumb :).

Here's an overview of what I did: 

There were two function defined in common that handle sending messages
to the user: log and loge. They both echo the argument passed to
standard error. The first one also echo's "ms: " (as a preface to the
message).  loge was only called in two places and I think is left over
cruft (let me know if I'm wrong please!).

I've added drop in replacement functions: notice, info, and
debug. I've replaced all instances of log and loge with info.

If you use notice, your message will always be sent to standard error.
If you use info, it will be sent to standard error if the env variable
`MONKEYSPHERE_OUTPUT_QUIET` is set to off (it is off by default).  If
you use debug, it will be sent to standard error only if
`MONKEYSPHERE_OUTPUT_DEBUG` is set to on (it's off by default).

Lastly, in monkeysphere-ssh-proxycommand, I've set
`MONKEYSPHERE_QUIET_MODE` to on by default.

So the result is: when using monkeysphere-ssh-proxycommand, you will
not get any output unless you set `MONEKYSPHERE_OUTPUT_QUIET` to off
or `MONKEYSPHERE_OUTPUT_DEBUG` to on. All other commands should work
exactly like they did in the past.

And... we can go through the code and change calls to the info
function to either notice (if we want them to be sent regardless of
the `QUIET` variable) or debug (if we want it only sent if `DEBUG` is
set).

I'm open to suggestions, problems, etc :).

-- SJJ

------

Hey, your Royal Highness.  I do think it's good that I look over these
changes, because there are definitely some stuff (ie. key processing)
that requires that things go to stderr and definitely not to stdout.
I can see that if that were changed, it's possible that things could
go wrong (ie. cause a `known_hosts` file to get truncated maybe).

I have to say that I'm still not sure I totally see why it's necessary
to implement such nuanced output switches.  All of the stuff you were
worried about when you reported this bug, and all the stuff that
starts with "ms:", goes to stderr.  If you didn't want to see it, can
you not just redirect stderr to /dev/null?

For what it's worth, I'm not sure *I* can ever imagine *not* wanting
to see that stuff, since it effectively reports on whether the host
you're connecting to is acceptable or not.  I feel like I would always
want to see that.  I guess that's neither here nor there, though,
cause if a user thinks it would be a good switch to have, and it's not
too difficult to implement (as this is), then it's worth implementing.

I think before we really start trying to tackle this, though, we
should outline what is the behavior we ultimately want.  What output
do we want to go to stdout, and do we want to be able to turn that off
or on?  What output do we want to go to stderr, and do we want to be
able to turn that off or on?  At the moment, most output is really
just info for the user, which is why I was sending it all to stderr.
Should all output then just go to stderr, with a switch to either turn
it off or on?

I should point out that we're sort of hitting a bit of a bash
limitation here.  Some monkeysphere internal functions pass info on to
other stuff via stdout, but also need to report stuff to the user as
well, which means this stuff can only be passed to the user via
stderr.

In any event, I just want to outline a straightforward policy about
output so we can know how to best handle it.

-- Big Jimmy.

-----

I think it's important to be able to suppress "normal operation,
everything is fine" messages *without* directing stderr to
`/dev/null`.  This is the normal state of UNIX-style tools, especially
tools like SSH which are used as piece of a larger toolchain.  If
every tool in a toolchain emitted some output during successful
operation, many scripts would be hopeless seas of noise, as it's not
unusual for even a simple backup script to make use of a half-dozen
separate tools.

What you really want is to see some output from when a tool knows
something is wrong.  With the proxycommand, the job of complaining
will often be left up to `ssh` itself, after `~/.ssh/known_hosts` has
been appropriately modified.  But sometimes, the proxycommand itself
will fail, and if you've already directed stderr to `/dev/null` you
won't get any reasonable information about the failure at the time it
happens.

As for the interface to adjust the verbosity, HRH SJJ's current
proposal with a large number of environment variables seems confusing
and overly-complex to me.

i think we should follow OpenSSH's lead (since all monkeysphere users
are likely to be somewhat familiar with it) and use a single variable
that is set to a level.  For example, see `LogLevel` in
`ssh_config(5)`.  It should probably default to `INFO`, same as
`/usr/bin/ssh`.  If there was a way to extract this value from the
user's SSH configuration/invocation itself and adopt it in the
ProxyCommand, that would be even better, but i don't think that's a
possibility with OpenSSH 5.1p1 at this point.

Also, i agree with HRH SJJ that the distinction in the monkeysphere
source between `log` and `loge` is unclear, and one of them should be
dropped (or they should be better-documented in `/src/common`).

	--dkg

----

Thanks Big Jimmy and dkg all for the good feedback.

I think you're right Big Jimmy about the sterr/stout. I may have
accidentally output to stout instead of sterr. In any event - I think
all of the logging should go to sterr to avoid that.

Here's a proposed fix based on both of your responses - it tries to make
my changes a bit simpler and more consistent with ssh behavior:

 * Use on environmental variable: `MONKEYSPHERE_LOG_LEVEL` that can be set
 to `ERROR` or `INFO`, with the default being `INFO`.
 `monkeysphere-ssh-proxycommand`, however, will set the
 `MONKEYSPHERE_LOG_LEVEL` to `ERROR` unless the user overrides that setting.

 * Use two functions for reporting messages to the user via sterr that
 will replace the existing log/loge functions: info (for outputting
 "normal operation, everything's fine" messages) and error (for
 outputting messages that indicate a problem that we think a user should
 know about). Reporting a message to the user with the info function
 will only be sent if the `MONKEYSPHERE_LOG_LEVEL` setting is `INFO`.
 Reporting a message to the user with the error function will always be
 output regardless of the `MONKEYSPHERE_LOG_LEVEL` value.

 * Go through the code and, for each use of the current log/loge
 function, determine if they should be replaced with info or error 
 depending on how critical we think the message is.

How does that sound? 

  --Sir Jam Jam

-----

Sir Jam Jam's proposal sounds good to me, but why make it two separate
functions?  Given the number of log levels used by OpenSSH, i'd prefer
to make a single function that takes two arguments: the first argument
is the level of the log, and the second argument is the data to be
logged itself.  So you'd say:

  log error "This is really terrible and broken!"
  log info "The fuzzy bunny just smiled at you and nodded."

Is that a reasonable amendment?  It seems like it will make it easier
to add more levels if we find we need them, and it makes it easy to
find every single log message in the source code at the same time.

  --dkg

-----

I just implemented the proposal (incorporating dkg's suggestion about
only having one function). It's committed in my quiet-mode branch (still
not merged with master - pending review). 

Thanks for all the feedback!

-- SJJ

----

Ok, this plans makes sense.  I'll merge SJJ's patches as soon as I get
the chance.

-- BJ