feat: added sandbox.args
and sandbox.mounts.symlink
This commit is contained in:
parent
5d4e541db4
commit
3505a2ef55
4 changed files with 51 additions and 4 deletions
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "anime-launcher-sdk"
|
||||
version = "1.0.4"
|
||||
version = "1.0.5"
|
||||
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
|
||||
license = "GPL-3.0"
|
||||
readme = "README.md"
|
||||
|
|
|
@ -16,6 +16,9 @@ pub struct Sandbox {
|
|||
/// Spoof original hostname. Default is `None`
|
||||
pub hostname: Option<String>,
|
||||
|
||||
/// Append additional bwrap arguments. Default is `None`
|
||||
pub args: Option<String>,
|
||||
|
||||
/// List of paths to which tmpfs will be mounted. Default is empty
|
||||
pub private: Vec<String>,
|
||||
|
||||
|
@ -30,6 +33,7 @@ impl Default for Sandbox {
|
|||
enabled: false,
|
||||
isolate_home: true,
|
||||
hostname: None,
|
||||
args: None,
|
||||
private: vec![],
|
||||
mounts: Mounts::default()
|
||||
}
|
||||
|
@ -65,6 +69,20 @@ impl From<&JsonValue> for Sandbox {
|
|||
None => default.hostname
|
||||
},
|
||||
|
||||
args: match value.get("args") {
|
||||
Some(value) => {
|
||||
if value.is_null() {
|
||||
None
|
||||
} else {
|
||||
match value.as_str() {
|
||||
Some(value) => Some(value.to_string()),
|
||||
None => default.args
|
||||
}
|
||||
}
|
||||
},
|
||||
None => default.args
|
||||
},
|
||||
|
||||
private: match value.get("private") {
|
||||
Some(value) => match value.as_array() {
|
||||
Some(values) => {
|
||||
|
@ -108,6 +126,7 @@ impl Sandbox {
|
|||
/// | `game_dir` | `/tmp/sandbox/game` | bind | false |
|
||||
/// | <mounts/read_only> | <mounts/read_only> | read-only bind | true |
|
||||
/// | <mounts/binds> | <mounts/binds> | bind | true |
|
||||
/// | <mounts/symlinks> | <mounts/symlinks> | symlink | true |
|
||||
pub fn get_command(&self, wine_dir: impl AsRef<str>, prefix_dir: impl AsRef<str>, game_dir: impl AsRef<str>) -> String {
|
||||
let mut command = String::from("bwrap --ro-bind / /");
|
||||
|
||||
|
@ -142,16 +161,23 @@ impl Sandbox {
|
|||
command += &format!(" --bind '{}' '{}'", from.trim(), to.trim());
|
||||
}
|
||||
|
||||
for (from, to) in &self.mounts.symlinks {
|
||||
command += &format!(" --symlink '{}' '{}'", from.trim(), to.trim());
|
||||
}
|
||||
|
||||
command += &format!(" --bind '{}' /tmp/sandbox/wine", wine_dir.as_ref());
|
||||
command += &format!(" --bind '{}' /tmp/sandbox/prefix", prefix_dir.as_ref());
|
||||
command += &format!(" --bind '{}' /tmp/sandbox/game", game_dir.as_ref());
|
||||
|
||||
command.push_str(" --chdir /");
|
||||
command.push_str(" --die-with-parent");
|
||||
|
||||
command.push_str(" --unshare-all");
|
||||
command.push_str(" --share-net");
|
||||
|
||||
if let Some(args) = &self.args {
|
||||
command.push_str(args.trim());
|
||||
}
|
||||
|
||||
command
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,7 +9,10 @@ pub struct Mounts {
|
|||
pub read_only: HashMap<String, String>,
|
||||
|
||||
/// Bind original directory into the sandbox with writing access
|
||||
pub bind: HashMap<String, String>
|
||||
pub bind: HashMap<String, String>,
|
||||
|
||||
/// Symlink original files into sandbox with writing access
|
||||
pub symlinks: HashMap<String, String>
|
||||
}
|
||||
|
||||
impl From<&JsonValue> for Mounts {
|
||||
|
@ -51,6 +54,24 @@ impl From<&JsonValue> for Mounts {
|
|||
None => default.bind
|
||||
},
|
||||
None => default.bind
|
||||
},
|
||||
|
||||
symlinks: match value.get("symlinks") {
|
||||
Some(value) => match value.as_object() {
|
||||
Some(values) => {
|
||||
let mut vars = HashMap::new();
|
||||
|
||||
for (name, value) in values {
|
||||
if let Some(value) = value.as_str() {
|
||||
vars.insert(name.clone(), value.to_string());
|
||||
}
|
||||
}
|
||||
|
||||
vars
|
||||
},
|
||||
None => default.symlinks
|
||||
},
|
||||
None => default.symlinks
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -185,7 +185,7 @@ pub fn run() -> anyhow::Result<()> {
|
|||
.replace(folders.game.to_str().unwrap(), sandboxed_folders.game.to_str().unwrap())
|
||||
.replace(folders.temp.to_str().unwrap(), sandboxed_folders.temp.to_str().unwrap());
|
||||
|
||||
bash_command = format!("{bwrap} -- {bash_command}");
|
||||
bash_command = format!("{bwrap} --chdir /tmp/sandbox/game -- {bash_command}");
|
||||
folders = sandboxed_folders;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue