17.08.2015 12:44, Ulrich Windl wrote:
Hi!
Somewhat stupid question: Why don't you put monsters like
subagent="/sbin/fs-io-throttle %a staging-0 /cluster/storage/staging-0 zone 0
'5000M:300;2500M:100;1500M:50;1000M:35;500M:10;300M:mm'"
ins a shell command file and execute that?
Hmm, probably a good point. I will think about it, thanks.
Regards,
Ulrich
Vladislav Bogdanov <[email protected]> schrieb am 17.08.2015 um 11:22
in
Nachricht <[email protected]>:
17.08.2015 10:39, Kristoffer Grönlund wrote:
Vladislav Bogdanov <[email protected]> writes:
Hi Kristoffer, all.
Could you please look why I get error when trying to update valid
resource value (which already has single quotes inside) with the
slightly different one by running the command in the subject?
It looks like is_value_sane() doesn't accept single quotes just because
crmsh quotes all arguments to crm_resource with them. I need to pass a
command-line with semicolons in one of parameters which is run with eval
in the resource agent. Backslashed double-quoting does not work in this
case, but single-quotes work fine.
Could that be some-how fixed?
Well, first of all passing the command line through bash complicates
things, so if that's what is causing you trouble you could try writing
your command line to a file and passing it to crmsh using crm -f <file>.
Another option is using "crm -f -" and piping the command line into
crmsh.
Do you mean one with double-quotes?
Otherwise is_value_sane() will fail anyways.
Using "... \"string;string\"" notation in the file strips quotes from the
actual command run.
Well, may be function I use is not smart enough, but that works with
single-qouted value.
What I think could be done for single-quotes support is to assume that value
which contains
them was actually passed in the double-quotes, so double-quotes should be
used when
running crm_resource. We may also have in mind that CIB uses double-quotes
for values internally.
If that doesn't help, it would help /me/ in figuring out just what the
problem is if you could give me an example of what the current value is
and what it is you are trying to set it to. :)
Well, this is the (obfuscated a bit due to customer's policies) working
resource definition
(word wrap off):
primitive staging-0-fs ocf:vendor:Filesystem \
params device="/dev/vg_staging_shared/staging_0"
directory="/cluster/storage/staging-0" fstype=gfs2 options=""
manage_directory=true subagent="/sbin/fs-io-throttle %a staging-0
/cluster/storage/staging-0 zone 0
'5000M:300;2500M:100;1500M:50;1000M:35;500M:10;300M:mm'" subagent_timeout=10
\
op start interval=0 timeout=90 \
op stop interval=0 timeout=100 \
op monitor interval=10 timeout=45 depth=0 \
op monitor interval=240 timeout=240 depth=10 \
op monitor interval=360 timeout=240 depth=20
Here is the command which fails:
# crm resource param staging-0-fs set subagent "/sbin/fs-io-throttle %a
staging-0 /cluster/storage/staging-0 zone 0
'5000M:300;2500M:100;1500M:50;1000M:35;500M:10;400M:mm'"
DEBUG: pacemaker version: [err: ][out: CRM Version: 1.1.12 (1b9beb7)]
DEBUG: found pacemaker version: 1.1.12
ERROR: /sbin/fs-io-throttle %a staging-0 /cluster/storage/staging-0 zone 0
'5000M:300;2500M:100;1500M:50;1000M:35;500M:10;400M:mm': bad name
ERROR: Bad usage: Expected valid name, got '/sbin/fs-io-throttle %a
staging-0 /cluster/storage/staging-0 zone 0
'5000M:300;2500M:100;1500M:50;1000M:35;500M:10;400M:mm'', command: 'param
staging-0-fs set subagent /sbin/fs-io-throttle %a staging-0
/cluster/storage/staging-0 zone 0
'5000M:300;2500M:100;1500M:50;1000M:35;500M:10;400M:mm''
Replacing single-quotes with back-slashed double ones
(\"5000M:300;2500M:100;1500M:50;1000M:35;500M:10;400M:mm\")
makes that string unquoted in the CIB, so semicolons are recognized as
command separators by the shell
run from the RA.
Using double-escaping
(\\"5000M:300;2500M:100;1500M:50;1000M:35;500M:10;400M:mm\\") when passing
value in the
double quotes breaks the shell which runs command.
Using single quotes with one or two back-slashes before double-quote inside
for a value produces
unparseable CIB with &dqout; in it.
Here is the function which runs that subagent command (I believe it should
support several
semicolon-separated commands as well, but did not test that yet):
run_subagent() {
local subagent_timeout=$1
local subagent_command=$2
local WRAPPER
subagent_command=${subagent_command//%a/${__OCF_ACTION}}
subagent_command=${subagent_command//%r/${OCF_RESOURCE_INSTANCE%:*}}
subagent_command=${subagent_command//%n/$( crm_node -n )}
case "${subagent_timeout}" in
0|""|*[!0-9]*)
WRAPPER="bash -c \"${subagent_command}\""
;;
*)
WRAPPER="timeout -s KILL ${subagent_timeout} bash -c
\"${subagent_command}\""
;;
esac
ocf_run eval "${WRAPPER}"
}
It is called with:
run_subagent ${OCF_RESKEY_subagent_timeout} "${OCF_RESKEY_subagent}"
Best regards,
Vladislav
_______________________________________________
Users mailing list: [email protected]
http://clusterlabs.org/mailman/listinfo/users
Project Home: http://www.clusterlabs.org
Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
Bugs: http://bugs.clusterlabs.org
_______________________________________________
Users mailing list: [email protected]
http://clusterlabs.org/mailman/listinfo/users
Project Home: http://www.clusterlabs.org
Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
Bugs: http://bugs.clusterlabs.org
_______________________________________________
Users mailing list: [email protected]
http://clusterlabs.org/mailman/listinfo/users
Project Home: http://www.clusterlabs.org
Getting started: http://www.clusterlabs.org/doc/Cluster_from_Scratch.pdf
Bugs: http://bugs.clusterlabs.org