Muck

 view release on metacpan or  search on metacpan

lib/Muck/FS.pm  view on Meta::CPAN

   }

   carp "mount needs 'dsn' to connect to (e.g. dsn => 'DBI:Pg:dbname=test')" 
      unless ($arg->{'dsn'});
   carp "mount needs 'mount' as mountpoint" unless ($arg->{'mount'});


   # save (some) arguments in self
   foreach ( qw( mount cachedir s3_bucket debug ) ) {
      $self->{$_} = $arg->{$_};
   }

   foreach (qw( aws_access_key_id aws_secret_access_key 
                dsn user password )) {
      carp "mount needs '$_'" unless ($arg->{$_});
   }

   # TODO we choose to add forking in the future, do it here

   ## DB Setup
   $dbh = DBI->connect( $arg->{'dsn'},
                        $arg->{'user'},
                        $arg->{'password'}, 
                        {AutoCommit => 0, RaiseError => 1} ) 
            || die $DBI::errstr;

   # Lets cache our prepared SQL statements in self
   foreach my $s ( @Muck::FS::VFS::statements ) {
      $sth->{$s->{name}} = $dbh->prepare($s->{sql}) || die $dbh->errstr();
   }


   $self->{'dbh'} = $dbh;
   $self->{'sth'} = $sth;

   ## memcached Setup
   if ( $arg->{memcached} ) {
      my $cache = new Cache::Memcached {
         'servers'      => [ "127.0.0.1:11211" ],
         'debug'        => 0,
         'compress_threshold' => 10000,
      };
      $self->{memcached} = $cache;
   }

   ## S3 Setup
   $self->{S3conn} = Muck::FS::S3::AWSAuthConnection->new(
                        $arg->{aws_access_key_id}, 
                        $arg->{aws_secret_access_key});

   ## File Handle Cache Setup
   $self->{Rfh_cache} = {};
   $self->{Wfh_cache} = {};

   $fuse_self = $self;

   Fuse::main(
      mountpoint  => $arg->{'mount'},
      mountopts   => 'allow_other',
      threaded    => '0',
      chown       => \&Muck::FS::VFS::x_chown,
      chmod       => \&Muck::FS::VFS::x_chmod,
      getattr     => \&Muck::FS::VFS::x_getattr,
      getdir      => \&Muck::FS::VFS::x_getdir,
      link        => \&Muck::FS::VFS::x_link,
      mknod       => \&Muck::FS::VFS::x_mknod,
      mkdir       => \&Muck::FS::VFS::x_mkdir,
      open        => \&Muck::FS::VFS::x_open,
      read        => \&Muck::FS::VFS::x_read,
      readlink    => \&Muck::FS::VFS::x_readlink,
      release     => \&Muck::FS::VFS::x_release,
      rename      => \&Muck::FS::VFS::x_rename,
      rmdir       => \&Muck::FS::VFS::x_unlink,
      statfs      => \&Muck::FS::VFS::x_statfs,
      symlink     => \&Muck::FS::VFS::x_symlink,
      truncate    => \&Muck::FS::VFS::x_truncate,
      utime       => \&Muck::FS::VFS::x_utime,
      unlink      => \&Muck::FS::VFS::x_unlink,
      write       => \&Muck::FS::VFS::x_write,
      debug       => ( $arg->{debug} > 2 ? 1 : 0 ),
   );
   
   exit(0) if ($arg->{'fork'});

   return 1;
}

=head2 is_mounted

Check if fuse filesystem is mounted

  if ($mnt->is_mounted) { ... }

=cut

sub is_mounted {
   my $self = shift;

   my $mounted = 0;
   my $mount = $self->{'mount'} || confess "can't find mount point!";
   if (open(MTAB, "/etc/mtab")) {
      while(<MTAB>) {
         $mounted = 1 if (/ $mount fuse /i);
      }
      close(MTAB);
   } else {
      warn "can't open /etc/mtab: $!";
   }

   return $mounted;
}


=head2 umount

Unmount your database as filesystem.

  $mnt->umount;

This will also kill background process which is translating
database to filesystem.



( run in 3.135 seconds using v1.01-cache-2.11-cpan-71847e10f99 )