From 1af4dd8ae334638adb230925734f6e097e689bbc Mon Sep 17 00:00:00 2001
From: Yaroslav Dynnikov <yaroslav.dynnikov@gmail.com>
Date: Mon, 13 Dec 2021 13:30:18 +0300
Subject: [PATCH] Grant user role before starting listening

---
 picolib/lib.rs       | 25 +++++++++++++++++--------
 picolib/tarantool.rs | 16 +++++++++++-----
 2 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/picolib/lib.rs b/picolib/lib.rs
index ed125713ee..a6287fa225 100644
--- a/picolib/lib.rs
+++ b/picolib/lib.rs
@@ -36,12 +36,10 @@ fn main_run() {
         tarantool::version()
     );
 
-    let mut cfg = tarantool::Cfg::default();
-
-    std::env::var("PICODATA_LISTEN").ok().and_then(|v| {
-        cfg.listen = v.clone();
-        Some(v)
-    });
+    let mut cfg = tarantool::Cfg {
+        listen: None,
+        ..Default::default()
+    };
 
     std::env::var("PICODATA_DATA_DIR").ok().and_then(|v| {
         std::fs::create_dir_all(&v).unwrap();
@@ -50,6 +48,17 @@ fn main_run() {
         Some(v)
     });
 
-    println!("{:?}", cfg);
-    tarantool::set_cfg(cfg);
+    tarantool::set_cfg(&cfg);
+    tarantool::eval(
+        r#"
+        box.schema.user.grant('guest', 'super', nil, nil, {if_not_exists = true})
+    "#,
+    );
+
+    std::env::var("PICODATA_LISTEN").ok().and_then(|v| {
+        cfg.listen = Some(v.clone());
+        Some(v)
+    });
+
+    tarantool::set_cfg(&cfg);
 }
diff --git a/picolib/tarantool.rs b/picolib/tarantool.rs
index 9304ac2dba..6cd9da54a7 100644
--- a/picolib/tarantool.rs
+++ b/picolib/tarantool.rs
@@ -32,7 +32,7 @@ fn tarantool_L() -> Lua {
 
 #[derive(Clone, Debug, hlua::Push, hlua::LuaRead, PartialEq)]
 pub struct Cfg {
-    pub listen: String,
+    pub listen: Option<String>,
     pub wal_dir: String,
     pub memtx_dir: String,
 }
@@ -40,7 +40,7 @@ pub struct Cfg {
 impl Default for Cfg {
     fn default() -> Self {
         Self {
-            listen: "3301".to_owned(),
+            listen: Some("3301".to_owned()),
             wal_dir: ".".to_owned(),
             memtx_dir: ".".to_owned(),
         }
@@ -50,15 +50,21 @@ impl Default for Cfg {
 #[allow(dead_code)]
 pub fn cfg() -> Option<Cfg> {
     let l = tarantool_L();
-    let cfg: Result<Cfg, _> = l.execute("return box.cfg");
+    let cfg: Result<Cfg, _> = l.eval("return box.cfg");
     match cfg {
         Ok(v) => Some(v),
         Err(_) => None,
     }
 }
 
-pub fn set_cfg(cfg: Cfg) {
+pub fn set_cfg(cfg: &Cfg) {
     let l = tarantool_L();
-    let box_cfg = LuaFunction::load(l, "box.cfg(...)").unwrap();
+    let box_cfg = LuaFunction::load(l, "return box.cfg(...)").unwrap();
     box_cfg.call_with_args(cfg).unwrap()
 }
+
+pub fn eval(code: &str) {
+    let l = tarantool_L();
+    let f = LuaFunction::load(l, code).unwrap();
+    f.call().unwrap()
+}
-- 
GitLab