bwrap 1.0.0.pre.beta1 → 1.0.0.pre.beta2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +9 -0
- data/lib/bwrap/args/bind/library.rb +63 -0
- data/lib/bwrap/args/bind.rb +8 -1
- data/lib/bwrap/args/environment.rb +31 -4
- data/lib/bwrap/args/features.rb +25 -0
- data/lib/bwrap/args/machine_id.rb +5 -3
- data/lib/bwrap/args/mount.rb +1 -0
- data/lib/bwrap/bwrap.rb +1 -0
- data/lib/bwrap/bwrap_module.rb +26 -0
- data/lib/bwrap/config/features.rb +52 -17
- data/lib/bwrap/config.rb +54 -41
- data/lib/bwrap/execution/execution.rb +7 -7
- data/lib/bwrap/execution.rb +2 -0
- data/lib/bwrap/output/log.rb +10 -2
- data/lib/bwrap/output/output_impl.rb +1 -0
- data/lib/bwrap/output.rb +2 -0
- data/lib/bwrap/version.rb +1 -1
- data/lib/bwrap.rb +1 -26
- data.tar.gz.sig +0 -0
- metadata +3 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 807b5065d9a5615be9910e52bf7beed12faf271a6aa533de71fe925d759d68c3
|
4
|
+
data.tar.gz: a3ed8130aac69442f2175b9035aa34392b462fcc3934e3e7a69081b2b936b8f7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66131023be01339b797c21615ce32b5aa639fd0599590724f9262f8393d2cc9226c1bfa87bfad37dba751bac15d6b6fc9efa3babd168cc2f40973f8a5729f9cd
|
7
|
+
data.tar.gz: fcf5fdd36a7728e84502e33efb86d43ce08d44732f0c070ecdaa54b5bbc15a35749238fd79084b688baedd605b98252c59fdaee61ef4434ea967deb00f10a577
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Changes
|
2
2
|
|
3
|
+
## 1.0.0-beta2 (02.02.2022)
|
4
|
+
|
5
|
+
* Added nscd feature
|
6
|
+
* Added gem_env_paths to ruby feature
|
7
|
+
* If Config#root is set, set working directory to /
|
8
|
+
* Execution#execvalue: Allow setting log: true
|
9
|
+
* Execution#execvalue: pass all kwargs as kwargs to execute()
|
10
|
+
* Output::Log: Don’t die if log file can’t be written to
|
11
|
+
|
3
12
|
## 1.0.0-beta1 (12.12.2021)
|
4
13
|
|
5
14
|
* optimist gem is now optional dependency
|
@@ -8,6 +8,9 @@ require_relative "mime"
|
|
8
8
|
class Bwrap::Args::Bind
|
9
9
|
# TODO: documentation
|
10
10
|
#
|
11
|
+
# TODO: It may be that this should be renamed to “Binary” or ”Executable”, as this
|
12
|
+
# handles all binaries, not just libraries.
|
13
|
+
#
|
11
14
|
# @api private
|
12
15
|
class Library
|
13
16
|
include Bwrap::Execution::Path
|
@@ -28,6 +31,47 @@ class Bwrap::Args::Bind
|
|
28
31
|
|
29
32
|
attr_writer :executable_path
|
30
33
|
|
34
|
+
# Ruby feature implementation specific class.
|
35
|
+
#
|
36
|
+
# @api private
|
37
|
+
class RubyBinds
|
38
|
+
# Instance of {Bwrap::Config}.
|
39
|
+
attr_writer :config
|
40
|
+
|
41
|
+
def initialize args
|
42
|
+
@args = args
|
43
|
+
end
|
44
|
+
|
45
|
+
def ruby_binds_for_features
|
46
|
+
return unless @config and @config.features.ruby.enabled?
|
47
|
+
|
48
|
+
@mounts = []
|
49
|
+
|
50
|
+
# Mount some common Ruby executables.
|
51
|
+
|
52
|
+
# This is most often /usr/bin.
|
53
|
+
bindir = Pathname.new RbConfig::CONFIG["bindir"]
|
54
|
+
|
55
|
+
path = bindir / "ruby"
|
56
|
+
if File.exist? path
|
57
|
+
@mounts << "--ro-bind" << path.to_s << path.to_s
|
58
|
+
end
|
59
|
+
|
60
|
+
gem_binds bindir
|
61
|
+
|
62
|
+
@args += @mounts
|
63
|
+
end
|
64
|
+
|
65
|
+
private def gem_binds bindir
|
66
|
+
return unless @config.features.ruby.gem_env_paths?
|
67
|
+
|
68
|
+
path = bindir / "gem"
|
69
|
+
return unless File.exist? path
|
70
|
+
|
71
|
+
@mounts << "--ro-bind" << path.to_s << path.to_s
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
31
75
|
def initialize args
|
32
76
|
@args = args
|
33
77
|
end
|
@@ -92,6 +136,17 @@ class Bwrap::Args::Bind
|
|
92
136
|
@args.append library_mounts
|
93
137
|
end
|
94
138
|
|
139
|
+
# Some features, like {Bwrap::Config::Features::Nscd}, requires some binds
|
140
|
+
# in order to operate properly.
|
141
|
+
def binds_for_features
|
142
|
+
# NOTE: Still nothing here, as I think this is better for library binds than anything else.
|
143
|
+
# The nscd bind is better in another, more generic, place.
|
144
|
+
#
|
145
|
+
# Keeping this method because I think this really makes sense for structure, in future.
|
146
|
+
|
147
|
+
ruby_binds_for_features
|
148
|
+
end
|
149
|
+
|
95
150
|
# Used by {#libs_command_requires}.
|
96
151
|
private def resolve_executable_name command
|
97
152
|
if command.is_a? String
|
@@ -121,5 +176,13 @@ class Bwrap::Args::Bind
|
|
121
176
|
|
122
177
|
which executable_name, env_path_var: env_path
|
123
178
|
end
|
179
|
+
|
180
|
+
private def ruby_binds_for_features
|
181
|
+
return unless @config.features.ruby.enabled?
|
182
|
+
|
183
|
+
binds = RubyBinds.new @args
|
184
|
+
binds.config = @config
|
185
|
+
binds.ruby_binds_for_features
|
186
|
+
end
|
124
187
|
end
|
125
188
|
end
|
data/lib/bwrap/args/bind.rb
CHANGED
@@ -79,6 +79,8 @@ class Bwrap::Args::Bind
|
|
79
79
|
|
80
80
|
library_bind = construct_library_bind
|
81
81
|
|
82
|
+
binds_for_features
|
83
|
+
library_bind.binds_for_features
|
82
84
|
library_bind.extra_executables_mounts
|
83
85
|
|
84
86
|
return unless @config.full_system_mounts
|
@@ -95,7 +97,7 @@ class Bwrap::Args::Bind
|
|
95
97
|
binds << "--ro-bind" << source_path.to_s << destination_path.to_s
|
96
98
|
end
|
97
99
|
|
98
|
-
@args.append binds
|
100
|
+
@args.append binds unless binds.empty?
|
99
101
|
end
|
100
102
|
|
101
103
|
# Performs cleanup operations after execution.
|
@@ -131,4 +133,9 @@ class Bwrap::Args::Bind
|
|
131
133
|
|
132
134
|
library_bind
|
133
135
|
end
|
136
|
+
|
137
|
+
# Binds feature specific common directories.
|
138
|
+
private def binds_for_features
|
139
|
+
# Nya.
|
140
|
+
end
|
134
141
|
end
|
@@ -1,15 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "bwrap/execution"
|
3
4
|
require "bwrap/output"
|
4
5
|
require_relative "args"
|
5
6
|
|
6
7
|
# Environment variable calculation for bwrap.
|
7
8
|
class Bwrap::Args::Environment < Hash
|
9
|
+
include Bwrap::Execution
|
8
10
|
include Bwrap::Output
|
9
11
|
|
10
12
|
# Instance of {Config}.
|
11
13
|
attr_writer :config
|
12
14
|
|
15
|
+
def initialize
|
16
|
+
super
|
17
|
+
|
18
|
+
self["PATH"] ||= []
|
19
|
+
end
|
20
|
+
|
13
21
|
# Returns used environment variables wrapped as bwrap arguments.
|
14
22
|
def environment_variables
|
15
23
|
if debug?
|
@@ -31,11 +39,11 @@ class Bwrap::Args::Environment < Hash
|
|
31
39
|
# @return [Array] All environment paths added via {Config#add_env_path} and other parsing logic
|
32
40
|
def env_paths
|
33
41
|
if @config.env_paths.respond_to? :each
|
34
|
-
self["PATH"] ||= []
|
35
|
-
|
36
42
|
self["PATH"] |= @config.env_paths
|
37
43
|
end
|
38
44
|
|
45
|
+
features_env_paths
|
46
|
+
|
39
47
|
self["PATH"]
|
40
48
|
end
|
41
49
|
|
@@ -43,8 +51,6 @@ class Bwrap::Args::Environment < Hash
|
|
43
51
|
#
|
44
52
|
# @param elements [String, Array] Path(s) to be added added to PATH environment variable
|
45
53
|
def add_to_path elements
|
46
|
-
self["PATH"] ||= []
|
47
|
-
|
48
54
|
if elements.respond_to? :each
|
49
55
|
self["PATH"] += elements
|
50
56
|
else
|
@@ -52,4 +58,25 @@ class Bwrap::Args::Environment < Hash
|
|
52
58
|
self["PATH"] << elements
|
53
59
|
end
|
54
60
|
end
|
61
|
+
|
62
|
+
# Feature specific environment path handling.
|
63
|
+
private def features_env_paths
|
64
|
+
ruby_env_paths
|
65
|
+
end
|
66
|
+
|
67
|
+
# Ruby feature specific environment path handling.
|
68
|
+
private def ruby_env_paths
|
69
|
+
return unless @config.features.ruby.enabled?
|
70
|
+
return unless @config.features.ruby.gem_env_paths?
|
71
|
+
|
72
|
+
unless command_available? "gem"
|
73
|
+
warn "gem is not installed in the system, so can’t add its bindirs to PATH."
|
74
|
+
return
|
75
|
+
end
|
76
|
+
|
77
|
+
gempath = execvalue %w{ gem environment gempath }
|
78
|
+
gempath.split(":").each do |path|
|
79
|
+
self["PATH"] << "#{path}/bin"
|
80
|
+
end
|
81
|
+
end
|
55
82
|
end
|
data/lib/bwrap/args/features.rb
CHANGED
@@ -29,6 +29,22 @@ class Bwrap::Args::Features < Hash
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
+
# Implementation for nscd feature set.
|
33
|
+
#
|
34
|
+
# @api private
|
35
|
+
class NscdBinds
|
36
|
+
# Custom binds needed by the feature.
|
37
|
+
def custom_binds
|
38
|
+
mounts = []
|
39
|
+
|
40
|
+
# TODO: Probably some path checking is needed here. Or somewhere.
|
41
|
+
# TODO: Since on many systems /var/run is symlinked to /run, that probably should be handled.
|
42
|
+
mounts << "--ro-bind" << "/var/run/nscd" << "/var/run/nscd"
|
43
|
+
|
44
|
+
mounts
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
32
48
|
# Implementation for Ruby feature set.
|
33
49
|
#
|
34
50
|
# @api private
|
@@ -79,6 +95,7 @@ class Bwrap::Args::Features < Hash
|
|
79
95
|
# - ruby
|
80
96
|
def feature_binds
|
81
97
|
bash_binds
|
98
|
+
nscd_binds
|
82
99
|
ruby_binds
|
83
100
|
end
|
84
101
|
|
@@ -90,6 +107,14 @@ class Bwrap::Args::Features < Hash
|
|
90
107
|
@args.append binds.bash_mounts
|
91
108
|
end
|
92
109
|
|
110
|
+
private def nscd_binds
|
111
|
+
return unless @config.features.nscd.enabled?
|
112
|
+
|
113
|
+
binds = NscdBinds.new
|
114
|
+
|
115
|
+
@args.append binds.custom_binds
|
116
|
+
end
|
117
|
+
|
93
118
|
# @note This does not allow development headers needed for compilation for now.
|
94
119
|
# I’ll look at it after I have an use for it.
|
95
120
|
private def ruby_binds
|
@@ -25,7 +25,7 @@ class Bwrap::Args::MachineId
|
|
25
25
|
# Returning [] means that execute() will ignore this fully.
|
26
26
|
# Nil would be converted to empty string, causing spawn() to pass it as argument, causing
|
27
27
|
# bwrap to misbehave.
|
28
|
-
return unless @config
|
28
|
+
return unless @config&.machine_id
|
29
29
|
|
30
30
|
machine_id = @config.machine_id
|
31
31
|
|
@@ -52,10 +52,10 @@ class Bwrap::Args::MachineId
|
|
52
52
|
debug "Using random machine id as /etc/machine-id"
|
53
53
|
|
54
54
|
@machine_id_file = Tempfile.new "bwrap-random_machine_id-", @config.tmpdir
|
55
|
-
@machine_id_file.write SecureRandom.uuid.
|
55
|
+
@machine_id_file.write SecureRandom.uuid.tr("-", "")
|
56
56
|
@machine_id_file.flush
|
57
57
|
|
58
|
-
%W{ --ro-bind-data #{machine_id_file.fileno} /etc/machine-id }
|
58
|
+
%W{ --ro-bind-data #{@machine_id_file.fileno} /etc/machine-id }
|
59
59
|
end
|
60
60
|
|
61
61
|
# Uses `10000000000000000000000000000000` as machine id.
|
@@ -80,6 +80,8 @@ class Bwrap::Args::MachineId
|
|
80
80
|
end
|
81
81
|
|
82
82
|
# Uses file inside sandbox directory as machine id.
|
83
|
+
#
|
84
|
+
# TODO: I kind of want to deprecate this one. It may make sense, but eh... Let’s see.
|
83
85
|
private def machine_id_inside_sandbox_dir sandbox_directory
|
84
86
|
machine_id_file = "#{sandbox_directory}/machine-id"
|
85
87
|
|
data/lib/bwrap/args/mount.rb
CHANGED
data/lib/bwrap/bwrap.rb
CHANGED
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# ruby-bwrap provides easy-to-use interface to run complex programs in sandboxes created with
|
4
|
+
# {https://github.com/containers/bubblewrap bubblewrap}.
|
5
|
+
#
|
6
|
+
# To run a program inside bubblewrap, a wrapper executable can be created. For example:
|
7
|
+
#
|
8
|
+
# require "bwrap"
|
9
|
+
#
|
10
|
+
# config = Bwrap::Config.new
|
11
|
+
# config.user = "dummy_user"
|
12
|
+
# config.full_system_mounts = true
|
13
|
+
# config.binaries_from = %w{
|
14
|
+
# /bin
|
15
|
+
# /usr/bin
|
16
|
+
# }
|
17
|
+
#
|
18
|
+
# bwrap = Bwrap::Bwrap.new config
|
19
|
+
# bwrap.parse_command_line_arguments
|
20
|
+
# bwrap.run "/bin/true"
|
21
|
+
#
|
22
|
+
# There also are few generic utilities, {Bwrap::Output} for handling output of scripts and
|
23
|
+
# {Bwrap::Execution} to run executables.
|
24
|
+
module Bwrap
|
25
|
+
# Empty module.
|
26
|
+
end
|
@@ -3,41 +3,72 @@
|
|
3
3
|
class Bwrap::Config
|
4
4
|
# Methods to enable or disable feature sets to control various aspects of sandboxing.
|
5
5
|
class Features
|
6
|
-
#
|
7
|
-
|
6
|
+
# @abstract
|
7
|
+
#
|
8
|
+
# Base of all features.
|
9
|
+
class Base
|
10
|
+
# @param features [Bwrap::Config::Features] Instance of features object in {Config}
|
11
|
+
def initialize features
|
12
|
+
@features = features
|
13
|
+
end
|
14
|
+
|
15
|
+
# Checks if the feature has been enabled.
|
16
|
+
#
|
17
|
+
# @return [Boolean] whether feature is enabled
|
8
18
|
def enabled?
|
9
19
|
@enabled
|
10
20
|
end
|
11
21
|
|
22
|
+
# Enable the feature.
|
12
23
|
def enable
|
13
24
|
@enabled = true
|
14
25
|
end
|
15
26
|
|
16
|
-
# Disable
|
27
|
+
# Disable the feature.
|
17
28
|
def disable
|
18
29
|
@enabled = false
|
19
30
|
end
|
20
31
|
end
|
21
32
|
|
33
|
+
# Defines Bash feature set.
|
34
|
+
class Bash < Base
|
35
|
+
# Nya.
|
36
|
+
end
|
37
|
+
|
38
|
+
# Defines Nscd feature set.
|
39
|
+
#
|
40
|
+
# nscd is short of name service cache daemon. It may make sense to
|
41
|
+
# have this class under another name, but I don’t know how nscd specific
|
42
|
+
# this feature can be, so this name it is for now.
|
43
|
+
class Nscd < Base
|
44
|
+
# Nya.
|
45
|
+
end
|
46
|
+
|
22
47
|
# Defines Ruby feature set.
|
23
|
-
|
48
|
+
#
|
49
|
+
# Implies {Nscd} feature.
|
50
|
+
class Ruby < Base
|
24
51
|
# Extra libraries to be loaded from `RbConfig::CONFIG["rubyarchdir"]`.
|
25
52
|
#
|
26
53
|
# @note This is only required to be called if extra dependencies are necessary.
|
27
54
|
# For example, psych.so requires libyaml.so.
|
28
55
|
#
|
29
|
-
# @note There is stdlib= method also. Yardoc is broken.
|
30
|
-
#
|
31
56
|
# @return [Array] list of needed libraries.
|
57
|
+
#
|
58
|
+
# @overload stdlib
|
59
|
+
# @overload stdlib=(libs)
|
32
60
|
attr_reader :stdlib
|
33
61
|
|
34
|
-
def initialize
|
62
|
+
def initialize features
|
63
|
+
super features
|
64
|
+
|
65
|
+
@gem_env_paths = true
|
35
66
|
@stdlib = []
|
36
67
|
end
|
37
68
|
|
38
|
-
# @
|
39
|
-
def
|
40
|
-
@
|
69
|
+
# @return true if bindirs from “gem environment” should be added to sandbox.
|
70
|
+
def gem_env_paths?
|
71
|
+
@gem_env_paths
|
41
72
|
end
|
42
73
|
|
43
74
|
# Enable Ruby feature set.
|
@@ -46,13 +77,12 @@ class Bwrap::Config
|
|
46
77
|
#
|
47
78
|
# @note This does not allow development headers needed for compilation for now.
|
48
79
|
# I’ll look at it after I have an use for it.
|
80
|
+
#
|
81
|
+
# @note Also enables {Nscd} feature.
|
49
82
|
def enable
|
50
|
-
|
51
|
-
end
|
83
|
+
super
|
52
84
|
|
53
|
-
|
54
|
-
def disable
|
55
|
-
@enabled = false
|
85
|
+
@features.nscd.enable
|
56
86
|
end
|
57
87
|
|
58
88
|
# @see #stdlib
|
@@ -70,12 +100,17 @@ class Bwrap::Config
|
|
70
100
|
|
71
101
|
# @return [Bash] Instance of feature class for Bash
|
72
102
|
def bash
|
73
|
-
@bash ||= Bash.new
|
103
|
+
@bash ||= Bash.new self
|
104
|
+
end
|
105
|
+
|
106
|
+
# @return [Nscd] Instance of feature class for nscd
|
107
|
+
def nscd
|
108
|
+
@nscd ||= Nscd.new self
|
74
109
|
end
|
75
110
|
|
76
111
|
# @return [Ruby] Instance of feature class for Ruby
|
77
112
|
def ruby
|
78
|
-
@ruby ||= Ruby.new
|
113
|
+
@ruby ||= Ruby.new self
|
79
114
|
end
|
80
115
|
end
|
81
116
|
end
|
data/lib/bwrap/config.rb
CHANGED
@@ -18,8 +18,45 @@ require_relative "config/features"
|
|
18
18
|
#
|
19
19
|
# @todo Add some documentation about syntax where necessary, like for #binaries_from.
|
20
20
|
class Bwrap::Config
|
21
|
+
# Array of audio schemes usable inside chroot.
|
22
|
+
#
|
23
|
+
# Currently supports:
|
24
|
+
# - :pulseaudio
|
25
|
+
#
|
26
|
+
attr_accessor :audio
|
27
|
+
|
28
|
+
# Set to `true` if command given to {Bwrap::Bwrap#run} is expected to
|
29
|
+
# be inside sandbox, and not bound from host.
|
30
|
+
#
|
31
|
+
# @return [Boolean] `true` if executed command is inside sandbox
|
32
|
+
attr_accessor :command_inside_root
|
33
|
+
|
34
|
+
attr_accessor :extra_executables
|
35
|
+
|
36
|
+
# TODO: IIRC this doesn’t match the reality any more. So write correct documentation.
|
37
|
+
#
|
38
|
+
# Causes libraries required by the executable given to {Bwrap#run} to be
|
39
|
+
# mounted inside sandbox.
|
40
|
+
#
|
41
|
+
# Often it is enough to use this flag instead of binding all system libraries
|
42
|
+
# using {#libdir_mounts=}
|
43
|
+
#
|
44
|
+
# @return [Boolean] true if Linux library loaders are mounted inside chroot
|
45
|
+
attr_accessor :full_system_mounts
|
46
|
+
|
21
47
|
attr_accessor :hostname
|
22
48
|
|
49
|
+
# Set to true if basic system directories, like /usr/lib and /usr/lib64,
|
50
|
+
# should be bound inside chroot.
|
51
|
+
#
|
52
|
+
# /usr/bin can be mounted using {Config#binaries_from=}.
|
53
|
+
#
|
54
|
+
# Often it is enough to use {#full_system_mounts=} instead of binding all
|
55
|
+
# system libraries using this flag.
|
56
|
+
#
|
57
|
+
# @return [Boolean] true if libdirs are mounted to the chroot
|
58
|
+
attr_accessor :libdir_mounts
|
59
|
+
|
23
60
|
# What should be used as /etc/machine_id file.
|
24
61
|
#
|
25
62
|
# If not specified, no /etc/machine_id handling is done.
|
@@ -34,6 +71,9 @@ class Bwrap::Config
|
|
34
71
|
# Given file as bound as /etc/machine_id.
|
35
72
|
attr_accessor :machine_id
|
36
73
|
|
74
|
+
# @return [Boolean] true if network should be shared from host.
|
75
|
+
attr_accessor :share_net
|
76
|
+
|
37
77
|
# Name of the user inside chroot.
|
38
78
|
#
|
39
79
|
# This is optional and defaults to no user.
|
@@ -45,46 +85,23 @@ class Bwrap::Config
|
|
45
85
|
# @return [Boolean] Whether Xorg specific binds are used.
|
46
86
|
attr_accessor :xorg_application
|
47
87
|
|
48
|
-
# Array of
|
49
|
-
#
|
50
|
-
# Currently supports:
|
51
|
-
# - :pulseaudio
|
52
|
-
#
|
53
|
-
attr_accessor :audio
|
54
|
-
|
55
|
-
# @return [Boolean] true if network should be shared from host.
|
56
|
-
attr_accessor :share_net
|
57
|
-
|
58
|
-
# Causes libraries required by the executable given to {Bwrap#run} to be
|
59
|
-
# mounted inside sandbox.
|
60
|
-
#
|
61
|
-
# Often it is enough to use this flag instead of binding all system libraries
|
62
|
-
# using {#libdir_mounts=}
|
88
|
+
# Array of directories to be bind mounted in sandbox.
|
63
89
|
#
|
64
|
-
#
|
65
|
-
attr_accessor :full_system_mounts
|
66
|
-
|
67
|
-
# Set to true if basic system directories, like /usr/lib and /usr/lib64,
|
68
|
-
# should be bound inside chroot.
|
90
|
+
# Given paths are also added to PATH environment variable inside sandbox.
|
69
91
|
#
|
70
|
-
#
|
92
|
+
# @hint At least on SUSE, many executables are symlinks to /etc/alternatives/*,
|
93
|
+
# which in turn symlinks to versioned executable under the same bindir.
|
94
|
+
# To use these executables, /etc/alternatives should also be bound:
|
71
95
|
#
|
72
|
-
#
|
73
|
-
# system libraries using this flag.
|
96
|
+
# config.ro_binds["/etc/alternatives"] = "/etc/alternatives"
|
74
97
|
#
|
75
|
-
# @return [
|
76
|
-
|
98
|
+
# @return [Array] Paths to directories where binaries are looked from.
|
99
|
+
attr_reader :binaries_from
|
77
100
|
|
78
|
-
#
|
79
|
-
# be inside sandbox, and not bound from host.
|
101
|
+
# Paths to be added to sandbox instance’s PATH environment variable.
|
80
102
|
#
|
81
|
-
# @
|
82
|
-
|
83
|
-
|
84
|
-
attr_accessor :extra_executables
|
85
|
-
|
86
|
-
# Array of directories to be bind mounted and used to construct PATH environment variable.
|
87
|
-
attr_reader :binaries_from
|
103
|
+
# @see #add_env_path
|
104
|
+
attr_reader :env_paths
|
88
105
|
|
89
106
|
# TODO: Document this.
|
90
107
|
# TODO: I wonder if this should just be removed. I don’t know, this is a bit ...
|
@@ -116,16 +133,12 @@ class Bwrap::Config
|
|
116
133
|
# @param dir Path to temporary directory
|
117
134
|
attr_reader :tmpdir
|
118
135
|
|
119
|
-
# Paths to be added to sandbox instance’s PATH environment variable.
|
120
|
-
#
|
121
|
-
# @see #add_env_path
|
122
|
-
attr_reader :env_paths
|
123
|
-
|
124
136
|
def initialize
|
125
|
-
@binaries_from = []
|
126
|
-
@tmpdir = Dir.tmpdir
|
127
137
|
@audio = []
|
138
|
+
@binaries_from = []
|
128
139
|
@env_paths = []
|
140
|
+
@ro_binds = {}
|
141
|
+
@tmpdir = Dir.tmpdir
|
129
142
|
end
|
130
143
|
|
131
144
|
def binaries_from= array
|
@@ -91,14 +91,14 @@ module Bwrap::Execution
|
|
91
91
|
# execute commands.
|
92
92
|
#
|
93
93
|
# @see .do_execute .do_execute for documentation of argument syntax
|
94
|
-
private def execute *args
|
94
|
+
private def execute *args, **kwargs
|
95
95
|
# Mangle proper location to error message.
|
96
|
-
if
|
97
|
-
|
96
|
+
if kwargs.is_a? Hash
|
97
|
+
kwargs[:log_callback] = 3
|
98
98
|
else
|
99
|
-
|
99
|
+
kwargs = { log_callback: 3 }
|
100
100
|
end
|
101
|
-
Bwrap::Execution.do_execute(*args)
|
101
|
+
Bwrap::Execution.do_execute(*args, **kwargs)
|
102
102
|
end
|
103
103
|
|
104
104
|
# Same as ::execute, but uses log: false to avoid unnecessary output when we’re just getting a
|
@@ -106,7 +106,7 @@ module Bwrap::Execution
|
|
106
106
|
#
|
107
107
|
# Defaults to fail: false, since when one just wants to get the value, there is not that much
|
108
108
|
# need to unconditionally die if getting bad exit code.
|
109
|
-
private def execvalue *args, fail: false,
|
109
|
+
private def execvalue *args, fail: false, log: false, **kwargs
|
110
110
|
# This logging handling is a bit of duplication from execute(), but to be extra safe, it is duplicated.
|
111
111
|
# The debug message contents will always be evaluated, so can just do it like this.
|
112
112
|
log_command = args[0].respond_to?(:join) && args[0].join(" ") || args[0]
|
@@ -121,7 +121,7 @@ module Bwrap::Execution
|
|
121
121
|
return
|
122
122
|
end
|
123
123
|
trace "Execvaluing “#{log_command}” at #{caller_locations(1, 1)[0]}"
|
124
|
-
execute(*args, fail: fail, log:
|
124
|
+
execute(*args, fail: fail, log: log, **kwargs)
|
125
125
|
end
|
126
126
|
|
127
127
|
private def exec_success?
|
data/lib/bwrap/execution.rb
CHANGED
data/lib/bwrap/output/log.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# force_encoding modifies string, so can’t freeze strings.
|
4
|
-
|
5
3
|
# Logging methods.
|
4
|
+
#
|
5
|
+
# @note One should require "bwrap/output" instead of this file directly, even
|
6
|
+
# if using only methods from this class.
|
7
|
+
#
|
8
|
+
# This is because Bwrap::Output module would be missing, or there could be
|
9
|
+
# a circular dependency, which is always bad, even if Ruby would break it for you.
|
6
10
|
class Bwrap::Output::Log
|
7
11
|
@@log_file = nil
|
8
12
|
|
@@ -29,6 +33,10 @@ class Bwrap::Output::Log
|
|
29
33
|
|
30
34
|
# Starts logging to given file.
|
31
35
|
def self.log_to_file log_path
|
36
|
+
unless File.writable? log_path
|
37
|
+
warn "Given log file #{log_path} is not writable by current user."
|
38
|
+
return
|
39
|
+
end
|
32
40
|
log_file = File.open log_path, "w"
|
33
41
|
|
34
42
|
# In default mode, log messages disappears as Ruby’s own buffer gets full.
|
data/lib/bwrap/output.rb
CHANGED
data/lib/bwrap/version.rb
CHANGED
data/lib/bwrap.rb
CHANGED
@@ -1,28 +1,3 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "bwrap/bwrap"
|
4
|
-
|
5
|
-
# ruby-bwrap provides easy-to-use interface to run complex programs in sandboxes created with
|
6
|
-
# {https://github.com/containers/bubblewrap bubblewrap}.
|
7
|
-
#
|
8
|
-
# To run a program inside bubblewrap, a wrapper executable can be created. For example:
|
9
|
-
#
|
10
|
-
# require "bwrap"
|
11
|
-
#
|
12
|
-
# config = Bwrap::Config.new
|
13
|
-
# config.user = "dummy_user"
|
14
|
-
# config.full_system_mounts = true
|
15
|
-
# config.binaries_from = %w{
|
16
|
-
# /bin
|
17
|
-
# /usr/bin
|
18
|
-
# }
|
19
|
-
#
|
20
|
-
# bwrap = Bwrap::Bwrap.new config
|
21
|
-
# bwrap.parse_command_line_arguments
|
22
|
-
# bwrap.run "/bin/true"
|
23
|
-
#
|
24
|
-
# There also are few generic utilities, {Bwrap::Output} for handling output of scripts and
|
25
|
-
# {Bwrap::Execution} to run executables.
|
26
|
-
module Bwrap
|
27
|
-
# Empty module.
|
28
|
-
end
|
3
|
+
require "bwrap/bwrap"
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bwrap
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.0.pre.
|
4
|
+
version: 1.0.0.pre.beta2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Samu Voutilainen
|
@@ -34,7 +34,7 @@ cert_chain:
|
|
34
34
|
X4ioQwEn1/9tHs19VO1CLF58451HgEo1BXd7eWLmV1V5cqw0YWok1ly4L/Su/Phf
|
35
35
|
MRxVMHiVAqY=
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date:
|
37
|
+
date: 2022-02-02 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
40
|
name: bundler
|
@@ -129,6 +129,7 @@ files:
|
|
129
129
|
- lib/bwrap/args/machine_id.rb
|
130
130
|
- lib/bwrap/args/mount.rb
|
131
131
|
- lib/bwrap/bwrap.rb
|
132
|
+
- lib/bwrap/bwrap_module.rb
|
132
133
|
- lib/bwrap/config.rb
|
133
134
|
- lib/bwrap/config/features.rb
|
134
135
|
- lib/bwrap/execution.rb
|
metadata.gz.sig
CHANGED
Binary file
|