Skip to content

Commit 67ffee0

Browse files
Deomid Ryabkovcesantabot
authored andcommitted
Allow getting and setting config at different levels
Also add arguments to `Config.Set` RPC: * `level` (int, default: 9 [user]) - make changes at the given level. * `save` (bool, default: true) - save the changes * `try_once` (bool, default: false) - when saving, make the changes only apply on next boot. * `reboot` (bool, default: false) - reboot after saving. `Config.Save` is now optional and obsolete. Make `mos license` save to level 1 by default to avoid blowing away license on user config reset. CL: Allow getting and setting config at different levels PUBLISHED_FROM=16dd8c6059bf4e347e9df71ace4e955100510e6e
1 parent cb7f5f1 commit 67ffee0

File tree

2 files changed

+57
-26
lines changed

2 files changed

+57
-26
lines changed

fw/include/mgos_sys_config.h

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,19 @@ bool mgos_sys_config_is_initialized(void);
6868
bool mgos_sys_config_save(const struct mgos_config *cfg, bool try_once,
6969
char **msg);
7070

71+
/* Saves given coonfig at the specified level. Performs diff against level-1. */
72+
bool mgos_sys_config_save_level(const struct mgos_config *cfg,
73+
enum mgos_config_level level, bool try_once,
74+
char **msg);
75+
76+
/* Loads config up to and including level. */
77+
bool mgos_sys_config_load_level(struct mgos_config *cfg,
78+
enum mgos_config_level level);
79+
7180
/* Deprecated API, equivalent to mgos_sys_config_save(cfg, false, msg). */
7281
bool save_cfg(const struct mgos_config *cfg, char **msg);
7382

74-
/*
75-
* Reset all config values to defaults.
76-
*/
83+
/* Loads configs up to MGOS_CONFIG_LEVEL_USER - 1. Deprecated. */
7784
bool load_config_defaults(struct mgos_config *cfg);
7885

7986
/*

fw/src/mgos_sys_config.c

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,10 @@ static int s_num_validators;
6767
static int load_config_file(const char *filename, const char *acl,
6868
bool check_try, bool delete_try,
6969
struct mgos_config *cfg);
70-
static bool load_config_defaults_internal(struct mgos_config *cfg,
71-
bool check_try, bool delete_try);
70+
static bool mgos_sys_config_load_level_internal(struct mgos_config *cfg,
71+
enum mgos_config_level level,
72+
bool check_try,
73+
bool delete_try);
7274

7375
void mgos_expand_mac_address_placeholders(char *str) {
7476
struct mg_str s = mg_mk_str(str);
@@ -92,32 +94,42 @@ void mgos_expand_placeholders(const struct mg_str src, struct mg_str *str) {
9294
}
9395
}
9496

95-
static bool load_config_defaults_internal(struct mgos_config *cfg,
96-
bool check_try, bool delete_try) {
97+
static bool mgos_sys_config_load_level_internal(struct mgos_config *cfg,
98+
enum mgos_config_level level,
99+
bool check_try,
100+
bool delete_try) {
97101
int i;
98102
char fname[sizeof(CONF_USER_FILE) + 10];
99103
memset(cfg, 0, sizeof(*cfg));
104+
if (level > MGOS_CONFIG_LEVEL_USER) return false;
100105
memcpy(fname, CONF_USER_FILE, sizeof(CONF_USER_FILE));
101106
const char *acl = "*";
102-
for (i = 0; i < MGOS_CONFIG_LEVEL_USER; i++) {
107+
for (i = 0; i <= (int) level; i++) {
103108
fname[CONF_USER_FILE_NUM_IDX] = '0' + i;
109+
/* Backward compat: load conf_vendor.json at level 5.5 */
110+
if (i == 6) {
111+
load_config_file(CONF_VENDOR_FILE, cfg->conf_acl, false, false, cfg);
112+
acl = cfg->conf_acl;
113+
}
104114
if (!load_config_file(fname, acl, check_try, delete_try, cfg)) {
105115
/* conf0 must exist, everything else is optional. */
106116
if (i == 0) return false;
107117
}
108118
acl = cfg->conf_acl;
109-
/* Backward compat: load conf_vendor.json at level 5.5 */
110-
if (i == 5) {
111-
load_config_file(CONF_VENDOR_FILE, cfg->conf_acl, false, false, cfg);
112-
acl = cfg->conf_acl;
113-
}
114119
}
115120
return true;
116121
}
117122

123+
bool mgos_sys_config_load_level(struct mgos_config *cfg,
124+
enum mgos_config_level level) {
125+
return mgos_sys_config_load_level_internal(cfg, level, true /* check_try */,
126+
false /* delete_try */);
127+
}
128+
118129
bool load_config_defaults(struct mgos_config *cfg) {
119-
return load_config_defaults_internal(cfg, true /* check_try */,
120-
false /* delete_try */);
130+
return mgos_sys_config_load_level_internal(cfg, MGOS_CONFIG_LEVEL_VENDOR_8,
131+
true /* check_try */,
132+
false /* delete_try */);
121133
}
122134

123135
bool mgos_config_validate(const struct mgos_config *cfg, char **msg) {
@@ -128,25 +140,31 @@ bool mgos_config_validate(const struct mgos_config *cfg, char **msg) {
128140
return true;
129141
}
130142

131-
bool mgos_sys_config_save(const struct mgos_config *cfg, bool try_once,
132-
char **msg) {
143+
bool mgos_sys_config_save_level(const struct mgos_config *cfg,
144+
enum mgos_config_level level, bool try_once,
145+
char **msg) {
133146
bool result = false;
134-
const char *fname, *try_fname;
147+
char fname[sizeof(CONF_USER_FILE) + 10],
148+
try_fname[sizeof(CONF_USER_FILE) + 10];
135149
struct mgos_config *defaults = calloc(1, sizeof(*defaults));
136150
char *ptr = NULL;
137151
if (defaults == NULL) goto clean;
152+
if (level > MGOS_CONFIG_LEVEL_USER) goto clean;
138153
if (msg == NULL) msg = &ptr;
139154
if (!mgos_config_validate(cfg, msg)) goto clean;
140-
if (!load_config_defaults_internal(defaults, true /* check_try */,
141-
false /* delete_try */)) {
155+
if (!mgos_sys_config_load_level(
156+
defaults, (enum mgos_config_level)(((int) level) - 1))) {
142157
*msg = strdup("failed to load defaults");
143158
goto clean;
144159
}
145-
try_fname = CONF_USER_FILE CONF_FILE_TRY_SUFFIX;
160+
snprintf(fname, sizeof(fname), "%s", CONF_USER_FILE);
161+
snprintf(try_fname, sizeof(try_fname), "%s%s", CONF_USER_FILE,
162+
CONF_FILE_TRY_SUFFIX);
163+
fname[CONF_USER_FILE_NUM_IDX] = '0' + level;
164+
try_fname[CONF_USER_FILE_NUM_IDX] = '0' + level;
146165
if (try_once) {
147-
fname = try_fname;
166+
strncpy(fname, try_fname, sizeof(fname));
148167
} else {
149-
fname = CONF_USER_FILE;
150168
/* Delete stale try file that may be there. */
151169
remove(try_fname);
152170
}
@@ -166,8 +184,13 @@ bool mgos_sys_config_save(const struct mgos_config *cfg, bool try_once,
166184
return result;
167185
}
168186

187+
bool mgos_sys_config_save(const struct mgos_config *cfg, bool try_once,
188+
char **msg) {
189+
return mgos_sys_config_save_level(cfg, MGOS_CONFIG_LEVEL_USER, try_once, msg);
190+
}
191+
169192
bool save_cfg(const struct mgos_config *cfg, char **msg) {
170-
return mgos_sys_config_save(cfg, false, msg);
193+
return mgos_sys_config_save_level(cfg, MGOS_CONFIG_LEVEL_USER, false, msg);
171194
}
172195

173196
void mgos_config_reset(int level) {
@@ -233,8 +256,9 @@ void mbedtls_debug_set_threshold(int threshold);
233256

234257
enum mgos_init_result mgos_sys_config_init(void) {
235258
/* Load system defaults - mandatory */
236-
if (!load_config_defaults_internal(&mgos_sys_config, true /* check_try */,
237-
true /* delete_try */)) {
259+
if (!mgos_sys_config_load_level_internal(
260+
&mgos_sys_config, MGOS_CONFIG_LEVEL_VENDOR_8, true /* check_try */,
261+
true /* delete_try */)) {
238262
LOG(LL_ERROR, ("Failed to load config defaults"));
239263
return MGOS_INIT_CONFIG_LOAD_DEFAULTS_FAILED;
240264
}

0 commit comments

Comments
 (0)