lars.ellenberg at linbit
Nov 16, 2011, 12:00 PM
Post #4 of 4
On Mon, Nov 14, 2011 at 09:53:12PM +0100, Florian Haas wrote:
Re: ocf_run: sanitize output before logging?
[In reply to]
> Dejan, Lars, and other shell gurus in attendance,
> maybe I'm totally off my rocker, and one of you guys can set me
> straight. But to me this part of the ocf_run function seems a bit fishy:
> output=`"$@" 2>&1`
> output=`echo $output`
> Am I gravely mistaken, or would any funny control characters produced by
> the wrapped command line totally mess up the content of "output" here as
> it is mangled by the backticks?
> What I'm noticing is the invocation of "ocf_run sipsak -v -s <uri>",
> which we put into the asterisk RA as per Russell Bryant's suggestion,
> seems to totally garble the output.
> Compare this:
> $ sipsak -v -s sip:somenotexistantextension [at] ekiga 2>&1
> SIP/2.0 200 OK
> Via: SIP/2.0/UDP
> From: sip:sipsak [at] 127:43665;tag=6dafacb9
> sip:somenotexistantextension [at] ekiga;tag=c64e1f832a41ec1c1f4e5673ac5b80f6.3109
> Call-ID: 1840229561 [at] 127
> CSeq: 1 OPTIONS
> Server: Kamailio (1.5.3-notls (i386/linux))
> Content-Length: 0
> To this:
> $ output=`sipsak -v -s sip:somenotexistantextension [at] ekiga 2>&1`
> $ echo $output
> Content-Length: 0(1.5.3-notls
> In this case it appears to be due to carriage-return (0x0d, ^M)
> characters that sipsak injects into its output, which is annoying but
> relatively benign. But maybe we want to sanitize the ocf_run output
> before we hand it off to be written to the logs?
output=`echo $output` is there to make it one "line", I think.
Any funny control characters should not be a problem.
well, unless you echo them to a terminal.
ASCII NUL may be fun, though,
and will probably differ accross shel flavour and versions.
The terminal is also the "problem" you are seing there.
In a log file, it will all be one line, with some spurious "^M".
But on a terminal, well, CR is carriage return: start again at column 0.
so it just prints one line over the other, and the "trailing garbage"
is simply from the previous, longer lines.
Of course, you could do
output=`echo $output | cat -v`
instead, but it loses information.
If you are only bothered by CR, do
IFS=$' \t\r\n' output=`echo $output`
where $'' is most likely a bashism, but you get the idea.
A tr equivalent is obviously
output=`echo $output | tr -s ' \r' ' '`
(\t and \n have been squeezed already by the leaving off the ""
: Lars Ellenberg
: LINBIT | Your Way to High Availability
: DRBD/HA support and consulting http://www.linbit.com
Linux-HA-Dev: Linux-HA-Dev [at] lists
Home Page: http://linux-ha.org/