1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
# ABSTRACT: Edit the configuration of an application with fuse
package App::Cme::Command::fusefs ;
use strict;
use warnings;
use 5.10.1;
use App::Cme -command ;
use base qw/App::Cme::Common/;
use Config::Model::ObjTreeScanner;
sub validate_args {
my ($self, $opt, $args) = @_;
$self->check_unknown_args($args);
$self->process_args($opt,$args);
my $has_fuse = eval { require Config::Model::FuseUI; 1; };
die "could not load Config::Model::FuseUI. Is Fuse installed ?\n"
unless $has_fuse;
my $fd = $opt->{fuse_dir};
die "Directory $fd does not exists\n" unless -d $fd;
return;
}
sub opt_spec {
my ( $class, $app ) = @_;
return (
[
"fuse-dir=s" => "Directory where the virtual file system will be mounted",
{required => 1}
],
[ "dfuse!" => "debug fuse problems" ],
[ "dir-char=s" => "string to replace '/' in configuration parameter names"],
[ "backup:s" => "Create a backup of configuration files before saving." ],
$class->cme_global_options,
);
}
sub usage_desc {
my ($self) = @_;
my $desc = $self->SUPER::usage_desc; # "%c COMMAND %o"
return "$desc [application] [file ] -fuse-dir xxx [ -dir-char x ] ";
}
sub description {
my ($self) = @_;
return $self->get_documentation;
}
sub execute {
my ($self, $opt, $args) = @_;
my ($model, $inst, $root) = $self->init_cme($opt,$args);
my @extra;
if (my $dc = $opt->{dir_char}) {
push @extra, dir_char_mockup => $dc;
}
my $fuse_dir = $opt->{fuse_dir};
print "Mounting config on $fuse_dir in background.\n",
"Use command 'fusermount -u $fuse_dir' to unmount\n";
my $ui = Config::Model::FuseUI->new(
root => $root,
mountpoint => $fuse_dir,
@extra,
);
# now fork
my $pid = fork;
if ( defined $pid and $pid == 0 ) {
# child process, just run fuse and wait for exit
$ui->run_loop( debug => $opt->{fuse_debug} );
$self->save($inst,$opt);
}
# parent process simply exits
return;
}
1;
__END__
=head1 SYNOPSIS
=head1 DESCRIPTION
Map the configuration file content to a FUSE virtual file system on a
directory specified with option C<-fuse-dir>. Modifications done in
the fuse file system are saved to the configuration file when
C<< fusermount -u <mounted_fuse_dir> >> is run.
=head1 Common options
See L<cme/"Global Options">.
=head1 options
=over
=item -fuse-dir
Mandatory. Directory where the virtual file system will be mounted.
=item -dfuse
Use this option to debug fuse problems.
=item -dir-char
Fuse fails when an element name or key name contains '/'. You can specify a
substitution string to replace '/' in the fused dir. Default is C<< <slash> >>.
=back
=head1 SEE ALSO
L<cme>, L<fusermount>
=cut
|