bwrap 1.0.0.pre.beta1 → 1.1.0.pre.rc1

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.
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 audio schemes usable inside chroot.
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
- # @return [Boolean] true if Linux library loaders are mounted inside chroot
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
- # /usr/bin can be mounted using {Config#binaries_from=}.
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
- # Often it is enough to use {#full_system_mounts=} instead of binding all
73
- # system libraries using this flag.
96
+ # config.ro_binds["/etc/alternatives"] = "/etc/alternatives"
74
97
  #
75
- # @return [Boolean] true if libdirs are mounted to the chroot
76
- attr_accessor :libdir_mounts
98
+ # @return [Array] Paths to directories where binaries are looked from.
99
+ attr_reader :binaries_from
77
100
 
78
- # Set to `true` if command given to {Bwrap::Bwrap#run} is expected to
79
- # be inside sandbox, and not bound from host.
101
+ # Paths to be added to sandbox instance’s PATH environment variable.
80
102
  #
81
- # @return [Boolean] `true` if executed command is inside sandbox
82
- attr_accessor :command_inside_root
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
@@ -7,6 +7,18 @@ module Bwrap::Execution
7
7
 
8
8
  # Signifies that command execution has failed.
9
9
  class ExecutionFailed < CommandError
10
+ # The command that was executed.
11
+ attr_reader :command
12
+
13
+ # Output of the command.
14
+ attr_reader :output
15
+
16
+ def initialize msg, command:, output:
17
+ @command = command
18
+ @output = output
19
+
20
+ super msg
21
+ end
10
22
  end
11
23
 
12
24
  # Thrown if given command was not found.
@@ -63,13 +63,17 @@ class Bwrap::Execution::Execute
63
63
  end
64
64
 
65
65
  # Checks whether execution failed and acts accordingly.
66
- def self.handle_execution_fail fail:, error:, output:
67
- return unless fail and !$CHILD_STATUS.success?
66
+ def self.handle_execution_fail fail:, error:, output:, command:
67
+ return unless fail and !execution_success?
68
68
 
69
69
  if error == :show and !output.empty?
70
70
  Bwrap::Output.warn_output "Command failed with output:\n“#{output}”"
71
71
  end
72
- raise Bwrap::Execution::ExecutionFailed, "Command execution failed.", caller
72
+
73
+ exception = Bwrap::Execution::ExecutionFailed.new "Command execution failed",
74
+ command: command,
75
+ output: output
76
+ raise exception, caller
73
77
  end
74
78
 
75
79
  # @note It makes sense for caller to just return if wait has been set and not check output.
@@ -101,6 +105,13 @@ class Bwrap::Execution::Execute
101
105
  "to add “self.prepend_rootcmd(command, rootcmd:)” method."
102
106
  end
103
107
 
108
+ # A wrapper to get status of an execution.
109
+ #
110
+ # Mainly here so test implementation is easier.
111
+ private_class_method def self.execution_success?
112
+ $CHILD_STATUS.success?
113
+ end
114
+
104
115
  # Used by `#handle_logging`.
105
116
  private_class_method def self.calculate_log_command command
106
117
  return command.dup unless command.respond_to?(:join)
@@ -61,7 +61,7 @@ module Bwrap::Execution
61
61
  end
62
62
 
63
63
  # If command is string, splat operator (the *) does not do anything. If array, it expand the arguments.
64
- # This causes spawning work correctly, as that’s how spawn() expects to have the argu
64
+ # This causes spawning work correctly, as that’s how spawn() expects to have the arguments.
65
65
  pid = spawn(env, *command, err: [ :child, :out ], out: Execute.w, unsetenv_others: clear_env)
66
66
  output = Execute.finish_execution(log: log, wait: wait, direct_output: direct_output)
67
67
  return pid unless wait
@@ -71,7 +71,7 @@ module Bwrap::Execution
71
71
  @last_status = $CHILD_STATUS
72
72
 
73
73
  output = Execute.process_output output: output
74
- Execute.handle_execution_fail fail: fail, error: error, output: output
74
+ Execute.handle_execution_fail fail: fail, error: error, output: output, command: command
75
75
  output
76
76
  ensure
77
77
  Execute.clean_variables
@@ -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 args.last.is_a? Hash
97
- args.last[:log_callback] = 3
96
+ if kwargs.is_a? Hash
97
+ kwargs[:log_callback] = 3
98
98
  else
99
- args << { log_callback: 3 }
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, rootcmd: nil, env: {}
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: false, rootcmd: rootcmd, env: env)
124
+ execute(*args, fail: fail, log: log, **kwargs)
125
125
  end
126
126
 
127
127
  private def exec_success?
@@ -20,7 +20,7 @@ module Bwrap::Execution::Path
20
20
  #
21
21
  # @yield Command appended to each path in PATH environment variable
22
22
  # @yieldparam path [String] Full path to executable
23
- def self.each_env_path command, env_path_var: ENV["PATH"]
23
+ def self.each_env_path command, env_path_var: ENV.fetch("PATH", nil)
24
24
  exts = ENV["PATHEXT"] ? ENV["PATHEXT"].split(";") : [ "" ]
25
25
 
26
26
  env_path_var.split(File::PATH_SEPARATOR).each do |env_path|
@@ -39,7 +39,7 @@ module Bwrap::Execution::Path
39
39
  # @param command [String] executable to be resolved
40
40
  # @param env_path_var [String] PATH environment variable as string.
41
41
  # Defaults to `ENV["PATH"]`
42
- private def command_available? command, env_path_var: ENV["PATH"]
42
+ private def command_available? command, env_path_var: ENV.fetch("PATH", nil)
43
43
  # Special handling for absolute paths.
44
44
  path = Pathname.new command
45
45
  if path.absolute?
@@ -60,7 +60,7 @@ module Bwrap::Execution::Path
60
60
  # Returns path to given executable.
61
61
  #
62
62
  # @param (see #command_available?)
63
- private def which command, fail: true, env_path_var: ENV["PATH"]
63
+ private def which command, fail: true, env_path_var: ENV.fetch("PATH", nil)
64
64
  # Special handling for absolute paths.
65
65
  path = Pathname.new command
66
66
  if path.absolute?
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "bwrap_module"
4
+
3
5
  # Declare Execution module here so Bwrap::Execution module is
4
6
  # already declared for Execution module classes, to avoid
5
7
  # a circular dependency.
@@ -8,7 +8,8 @@ class Bwrap::Output::Levels
8
8
 
9
9
  @@_verbose = false
10
10
  @@_debug = false
11
- @@_trace = ENV["BWRAP_TRACE"] && true || false
11
+ @@_trace = ENV.fetch("BWRAP_TRACE", nil) && true || false
12
+ @@_quiet = false
12
13
 
13
14
  # @see Bwrap::Output#verbose?
14
15
  def self.verbose?
@@ -25,8 +26,18 @@ class Bwrap::Output::Levels
25
26
  @@_trace
26
27
  end
27
28
 
29
+ # @see Bwrap::Output##quiet?
30
+ def self.quiet?
31
+ @@_quiet
32
+ end
33
+
28
34
  # Takes hash of options received from Optimist and checks output related flags.
29
35
  def self.handle_output_options options
36
+ if options[:quiet] or options[:silent]
37
+ quiet!
38
+ return
39
+ end
40
+
30
41
  # Set output level flags to true or false, if it was given.
31
42
  unless options[:trace].nil?
32
43
  @@_verbose = options[:trace]
@@ -64,6 +75,18 @@ class Bwrap::Output::Levels
64
75
  out
65
76
  end
66
77
 
78
+ # Formats given string and outputs it.
79
+ #
80
+ # @return formatted string
81
+ def self.info_print_formatted str, log_callback: 1
82
+ # TODO: Maybe have different color for NOTICE than for INFO?
83
+ out = "#{Bwrap::Output::Colors.color(130, 230, 130, bold: true)}[NOTICE]#{Bwrap::Output::Colors.stopcolor} #{str}"
84
+ out = append_caller out, log_callback: (log_callback + 1)
85
+ puts out
86
+
87
+ out
88
+ end
89
+
67
90
  # Formats given string and outputs it.
68
91
  #
69
92
  # @return formatted string
@@ -98,9 +121,16 @@ class Bwrap::Output::Levels
98
121
  # Appends caller information to given output.
99
122
  #
100
123
  # Used by *_print_formatted methods.
101
- def self.append_caller out, log_callback: 1
124
+ private_class_method def self.append_caller out, log_callback: 1
102
125
  out = "#{out} (called at #{caller_locations(log_callback, 1)[0]})" if @@_trace
103
126
  out
104
127
  end
105
- private_class_method :append_caller
128
+
129
+ # Sets variables so that no extra output is shown.
130
+ private_class_method def self.quiet!
131
+ @@_verbose = false
132
+ @@_debug = false
133
+ @@_trace = false
134
+ @@_quiet = true
135
+ end
106
136
  end
@@ -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
 
@@ -13,11 +17,17 @@ class Bwrap::Output::Log
13
17
 
14
18
  # Writes given string to log.
15
19
  def self.write_to_log str
20
+ # Guard against invalid input.
21
+ return unless str.respond_to? :force_encoding
22
+
16
23
  @@log_file&.write str.dup.force_encoding("UTF-8")
17
24
  end
18
25
 
19
26
  # Writes given string to log.
20
27
  def self.puts_to_log str
28
+ # Guard against invalid input.
29
+ return unless str.respond_to? :force_encoding
30
+
21
31
  @@log_file&.puts str.dup.force_encoding("UTF-8")
22
32
  end
23
33
 
@@ -29,6 +39,10 @@ class Bwrap::Output::Log
29
39
 
30
40
  # Starts logging to given file.
31
41
  def self.log_to_file log_path
42
+ unless File.writable? log_path
43
+ warn "Given log file #{log_path} is not writable by current user."
44
+ return
45
+ end
32
46
  log_file = File.open log_path, "w"
33
47
 
34
48
  # In default mode, log messages disappears as Ruby’s own buffer gets full.
@@ -3,6 +3,7 @@
3
3
  # Have variables like $CHILD_STATUS which is alias of $?.
4
4
  require "English"
5
5
 
6
+ require "bwrap/bwrap_module"
6
7
  require "bwrap/execution/labels"
7
8
 
8
9
  require_relative "levels"
@@ -31,6 +32,8 @@ require_relative "log"
31
32
  # When using {Bwrap::Bwrap}, {Bwrap::Bwrap#parse_command_line_arguments}
32
33
  # causes output levels to be set if relevant CLI arguments have been
33
34
  # given. TODO: Add documentation about CLI args somewhere. Maybe README?
35
+ #
36
+ # TODO: Add new method info() which can then be silenced using --quiet or --silent.
34
37
  module Bwrap::Output
35
38
  # @see #verbose?
36
39
  def self.verbose?
@@ -42,6 +45,12 @@ module Bwrap::Output
42
45
  Bwrap::Output::Levels.debug?
43
46
  end
44
47
 
48
+ # @see #quiet?
49
+ # @see #info
50
+ def self.quiet?
51
+ Bwrap::Output::Levels.quiet?
52
+ end
53
+
45
54
  # @see #trace?
46
55
  def self.trace?
47
56
  Bwrap::Output::Levels.trace?
@@ -88,6 +97,18 @@ module Bwrap::Output
88
97
  Bwrap::Output::Log.puts_to_log out || str
89
98
  end
90
99
 
100
+ # Handler used by #info to output given string.
101
+ def self.info_output str, raw: false, log_callback: 1
102
+ return if quiet?
103
+
104
+ if raw
105
+ print str
106
+ else
107
+ out = Bwrap::Output::Levels.info_print_formatted str, log_callback: (log_callback + 1)
108
+ end
109
+ Bwrap::Output::Log.puts_to_log out || str
110
+ end
111
+
91
112
  # Handler used by #warn to output given string.
92
113
  def self.warn_output str, raw: false, log_callback: 1
93
114
  if raw
@@ -113,6 +134,13 @@ module Bwrap::Output
113
134
  exit exit_code
114
135
  end
115
136
 
137
+ # @see #info
138
+ #
139
+ # @return true if --quiet or --silent has been passed, false if not.
140
+ private def quiet?
141
+ Bwrap::Output::Levels.quiet?
142
+ end
143
+
116
144
  # @return true if --verbose, --debug or --trace has been passed, false if not.
117
145
  private def verbose?
118
146
  Bwrap::Output::Levels.verbose?
@@ -160,6 +188,33 @@ module Bwrap::Output
160
188
  Bwrap::Output.verb_output(str, raw: raw, log_callback: 2)
161
189
  end
162
190
 
191
+ # Outputs given string if info flag has been set.
192
+ #
193
+ # This is meant for notices, and the log will be labeled with
194
+ # [NOTICE].
195
+ #
196
+ # Output flags can be set with {.handle_output_options}.
197
+ #
198
+ # == Implementation hint
199
+ #
200
+ # Usually implementing --quiet and/or --silent flag
201
+ # to control these messages (and all other output) may make
202
+ # sense.
203
+ #
204
+ # That way it would be possible to have some important
205
+ # informational messages that should be shown, but for script
206
+ # usage, those could be muted.
207
+ #
208
+ # Warning messages are meant to be shown always. Error messages
209
+ # will always be printed, as execution is halted after the
210
+ # error message has been printed.
211
+ #
212
+ # @param str String to be outputted
213
+ # @param raw [Boolean] If true, disables output formatting
214
+ private def info str, raw: false
215
+ Bwrap::Output.info_output(str, raw: raw, log_callback: 2)
216
+ end
217
+
163
218
  # Outputs given string to `$stderr`.
164
219
  #
165
220
  # @param str String to be outputted
data/lib/bwrap/output.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "bwrap_module"
4
+
3
5
  # Declare Output module here so Bwrap::Output module is
4
6
  # already declared for Output module classes, to avoid
5
7
  # a circular dependency.
data/lib/bwrap/version.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Bwrap
4
4
  # Current version of bwrap.
5
- VERSION = "1.0.0-beta1"
5
+ VERSION = "1.1.0-rc1"
6
6
  end
7
7
 
8
8
  require "deep-cover" if ENV["DEEP_COVER"]
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.beta1
4
+ version: 1.1.0.pre.rc1
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: 2021-12-12 00:00:00.000000000 Z
37
+ date: 2022-05-28 00:00:00.000000000 Z
38
38
  dependencies:
39
39
  - !ruby/object:Gem::Dependency
40
40
  name: bundler
@@ -92,20 +92,48 @@ dependencies:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
94
  version: '1.1'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rspec
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '3.11'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '3.11'
95
109
  - !ruby/object:Gem::Dependency
96
110
  name: rspec-expectations
97
111
  requirement: !ruby/object:Gem::Requirement
98
112
  requirements:
99
113
  - - "~>"
100
114
  - !ruby/object:Gem::Version
101
- version: '3.7'
115
+ version: '3.11'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '3.11'
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec-mocks
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '3.11'
102
130
  type: :development
103
131
  prerelease: false
104
132
  version_requirements: !ruby/object:Gem::Requirement
105
133
  requirements:
106
134
  - - "~>"
107
135
  - !ruby/object:Gem::Version
108
- version: '3.7'
136
+ version: '3.11'
109
137
  description: For now this is tailored to my needs, so this may or may not be of any
110
138
  use.
111
139
  email:
@@ -121,16 +149,23 @@ files:
121
149
  - lib/bwrap/args/args.rb
122
150
  - lib/bwrap/args/bind.rb
123
151
  - lib/bwrap/args/bind/library.rb
152
+ - lib/bwrap/args/bind/library/ruby_binds.rb
124
153
  - lib/bwrap/args/bind/mime.rb
125
154
  - lib/bwrap/args/construct.rb
126
155
  - lib/bwrap/args/environment.rb
127
156
  - lib/bwrap/args/features.rb
157
+ - lib/bwrap/args/features/binds_base.rb
158
+ - lib/bwrap/args/features/ruby_binds.rb
128
159
  - lib/bwrap/args/library.rb
129
160
  - lib/bwrap/args/machine_id.rb
130
161
  - lib/bwrap/args/mount.rb
162
+ - lib/bwrap/args/network.rb
131
163
  - lib/bwrap/bwrap.rb
164
+ - lib/bwrap/bwrap_module.rb
132
165
  - lib/bwrap/config.rb
133
166
  - lib/bwrap/config/features.rb
167
+ - lib/bwrap/config/features/base.rb
168
+ - lib/bwrap/config/features/ruby.rb
134
169
  - lib/bwrap/execution.rb
135
170
  - lib/bwrap/execution/exceptions.rb
136
171
  - lib/bwrap/execution/execute.rb
metadata.gz.sig CHANGED
Binary file