module LXC
This module provides a Ruby API allowing programmatic managing of “Linux Containers”.
The LXC module contains generic methods (which are not related to a specific container instance) and methods related to liblxc. The container-specific methods are contained in the LXC::Container class.
Constants
- VERSION
Public Class Methods
Returns value for the given global config key.
static VALUE
lxc_global_config_item(VALUE self, VALUE rb_key)
{
char *key;
const char *value;
key = StringValuePtr(rb_key);
value = lxc_get_global_config_item(key);
if (value == NULL)
rb_raise(Error, "invalid configuration key %s", key);
return rb_str_new2(value);
}
Returns an array of containers. Which containers are returned depends on the options hash: by default, all containers are returned. One may list only active or defined containers by setting either the :active or :defined keys to true. The :config_path key allows an alternate configuration path to be scanned when building the list.
static VALUE
lxc_list_containers(int argc, VALUE *argv, VALUE self)
{
int i, num_containers;
VALUE rb_active, rb_defined, rb_config;
VALUE rb_opts;
VALUE rb_containers;
struct list_containers_without_gvl_args args;
rb_scan_args(argc, argv, "01", &rb_opts);
args.active = 1;
args.defined = 1;
args.config = NULL;
if (!NIL_P(rb_opts)) {
Check_Type(rb_opts, T_HASH);
rb_active = rb_hash_aref(rb_opts, SYMBOL("active"));
if (!NIL_P(rb_active))
args.active = rb_active != Qfalse;
rb_defined = rb_hash_aref(rb_opts, SYMBOL("defined"));
if (!NIL_P(rb_defined))
args.defined = rb_defined != Qfalse;
rb_config = rb_hash_aref(rb_opts, SYMBOL("config_path"));
if (!NIL_P(rb_config))
args.config = StringValuePtr(rb_config);
}
num_containers = RELEASING_GVL(list_containers_without_gvl, &args);
if (num_containers < 0)
rb_raise(Error, "failure to list containers");
rb_containers = rb_ary_new2(num_containers);
/*
* The `names` array is not NULL-terminated, so free it manually,
* ie, don't use free_c_string_array().
*/
for (i = 0; i < num_containers; i++) {
rb_ary_store(rb_containers, i, rb_str_new2(args.names[i]));
free(args.names[i]);
}
free(args.names);
return rb_containers;
}
Runs the given command (given as a string or as an argv array) in an attached container. Useful in conjunction with +LXC::Container#attach+.
static VALUE
lxc_run_command(VALUE self, VALUE rb_command)
{
int ret;
lxc_attach_command_t cmd;
VALUE rb_program;
if (TYPE(rb_command) == T_STRING)
rb_command = rb_str_split(rb_command, " ");
rb_program = rb_ary_entry(rb_command, 0);
cmd.program = StringValuePtr(rb_program);
cmd.argv = ruby_to_c_string_array(rb_command);
ret = lxc_attach_run_command(&cmd);
if (ret == -1)
rb_raise(Error, "unable to run command on attached container");
/* NOTREACHED */
return Qnil;
}
Runs a shell in an attached container. Useful in conjunction with +LXC::Container#attach+.
static VALUE
lxc_run_shell(VALUE self)
{
int ret;
ret = lxc_attach_run_shell(NULL);
if (ret == -1)
rb_raise(Error, "unable to run shell on attached container");
/* NOTREACHED */
return Qnil;
}
Returns the liblxc version.
static VALUE
lxc_version(VALUE self)
{
return rb_str_new2(lxc_get_version());
}