+ else
+ _, err = call("changes", {})
+
+ if not err then
+ if type(_) == "table" and type(_.changes) == "table" then
+ local k, v
+ for k, v in pairs(_.changes) do
+ _, err = call("commit", { config = k })
+ if err then
+ break
+ end
+ end
+ end
+ end
+
+ if not err then
+ _, err = call("apply", { rollback = false })
+ end
+ end
+
+ return (err == nil), ERRSTR[err]
+end
+
+function confirm(self)
+ local _, err = call("confirm", {})
+ if not err then
+ util.ubus("session", "set", {
+ ubus_rpc_session = session_id,
+ values = { rollback = 0 }
+ })
+ end
+ return (err == nil), ERRSTR[err]
+end
+
+function rollback(self)
+ local _, err = call("rollback", {})
+ if not err then
+ util.ubus("session", "set", {
+ ubus_rpc_session = session_id,
+ values = { rollback = 0 }
+ })
+ end
+ return (err == nil), ERRSTR[err]
+end
+
+function rollback_pending(self)
+ local deadline, err = util.ubus("session", "get", {
+ ubus_rpc_session = session_id,
+ keys = { "rollback" }
+ })
+
+ if type(deadline) == "table" and
+ type(deadline.values) == "table" and
+ type(deadline.values.rollback) == "number" and
+ deadline.values.rollback > os.time()
+ then
+ return true, deadline.values.rollback - os.time()