[CRIU] [PATCH 2/2] Do not error out in RPC mode with wrong config file entries
Radostin Stoyanov
rstoyanov1 at gmail.com
Wed Dec 5 12:52:34 MSK 2018
On 30/11/2018 13:36, Adrian Reber wrote:
> So this fails in CI because we have a test to make sure RPC correctly
> detects wrong configuration file entries:
>
> $ ./config_file.py /tmp
> Connecting to CRIU in swrk mode.
> FAIL: CRIU should have returned 1 instead of -9
>
> So, not sure if we actually want to skip wrong entries in the
> configuration file. Any preferences? How should we handle wrong entries
> in configuration files in RPC mode?
One example where invalid configuration file entries are not ignored is
sshd.
For instance, if we set an invalid option in /etc/ssh/sshd_config,
followed by
"systemctl restart sshd" will cause sshd to fail, and therefore users
will no longer
be able to access the server via ssh. I find this behaviour very annoying.
I can imagine a similar example with CRIU. If a user is trying to live
migrate a
container but an invalid option has been set in CRIU's config file, the
container
migration is going to fail.
IMHO a more "user friendly" behaviour would be to show a warning in the log
file rather than fail.
Radostin
> Adrian
>
> On Fri, Nov 30, 2018 at 11:51:37AM +0000, Adrian Reber wrote:
>> From: Adrian Reber <areber at redhat.com>
>>
>> Relates: https://github.com/checkpoint-restore/criu/issues/578
>>
>> If the config parser finds a unknown option in the configuration file,
>> the wrong option is printed out and CRIU exits.
>>
>> In RPC mode this is not the best thing to do, as CRIU might not be able
>> to print the message to the user.
>>
>> This changes CRIU's behaviour in RPC mode to write a wrong configuration
>> option to the log file. In CLI mode nothing changes:
>>
>> $ echo test >> /etc/criu/default.conf
>> $ criu check
>> criu: unrecognized option '--test'
>> $ runc checkpoint <container>
>> $ grep Unknown dump.log
>> Warn (criu/config.c:812): Unknown option encountered: --test
>> $ echo test-runc >> /etc/criu/runc.conf
>> $ runc restore -d <container>
>> $ grep Unknown restore.log
>> Warn (criu/config.c:812): Unknown option encountered: --test
>> Warn (criu/config.c:812): Unknown option encountered: --test-runc
>>
>> This way unknown configuration file entries do not break RPC mode, but
>> they are reported.
>>
>> Reported-by: Radostin Stoyanov <rstoyanov1 at gmail.com>
>> Signed-off-by: Adrian Reber <areber at redhat.com>
>> ---
>> criu/config.c | 38 ++++++++++++++++++++++++++++++++++++++
>> 1 file changed, 38 insertions(+)
>>
>> diff --git a/criu/config.c b/criu/config.c
>> index f4fb39b..3c54fa7 100644
>> --- a/criu/config.c
>> +++ b/criu/config.c
>> @@ -31,6 +31,8 @@
>>
>> struct cr_options opts;
>>
>> +static bool rpc_mode = false;
>> +
>> static int count_elements(char **to_count)
>> {
>> int count = 0;
>> @@ -235,6 +237,20 @@ static int pre_parse(int argc, char **argv, bool *usage_error, bool *no_default_
>> } else if (strstr(argv[i], "--config=") != NULL) {
>> *cfg_file = argv[i] + strlen("--config=");
>> *no_default_config = true;
>> + } else if (!strcmp(argv[i], "swrk")) {
>> + /*
>> + * In RPC mode we do not want to error out if we
>> + * encounter unknown options. The options can only
>> + * be from a configuration file. To not error out
>> + * because of wrong lines in the configuration file
>> + * this just prints the wrong option into the log.
>> + */
>> + rpc_mode = true;
>> + /*
>> + * This is only needed so that getopt() does not
>> + * print invalid options to stderr.
>> + */
>> + opterr = 0;
>> }
>> }
>>
>> @@ -787,6 +803,28 @@ int parse_options(int argc, char **argv, bool *usage_error,
>> case 'h':
>> *usage_error = false;
>> return 2;
>> + case '?':
>> + /*
>> + * In RPC mode we do not want to
>> + * error out if an unknown option is found.
>> + * This writes it to the log file and continues.
>> + */
>> + if (rpc_mode) {
>> + pr_warn("Unknown option encountered: %s\n", _argv[optind - 1]);
>> + break;
>> + } else {
>> + /*
>> + * Only an unknown option that starts with '-' needs to be
>> + * reported to the user. getopt() knows nothing about our
>> + * commands (dump, check, swrk, ...). Those should be
>> + * ignored.
>> + */
>> + if (_argv[optind - 1][0] == '-') {
>> + *usage_error = true;
>> + return 2;
>> + }
>> + }
>> + break;
>> default:
>> return 2;
>> }
>> --
>> 1.8.3.1
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
> Adrian
>
More information about the CRIU
mailing list