NAME

Filesys::SmbClientParser - Perl client to reach Samba ressources with smbclient

SYNOPSIS

use Filesys::SmbClientParser;
my $smb = new Filesys::SmbClientParser
(undef,
 (
  user     => 'Administrateur',
  password => 'password'
 ));
# Or like -A parameters:
$smb->Auth("/home/alian/.smbpasswd");


# Set host
$smb->Host('jupiter');


# List host available on this network machine
my @l = $smb->GetHosts;
foreach (@l) {print $_->{name},"\t",$_->{comment},"\n";}


# List share disk available
my @l = $smb->GetShr;
foreach (@l) {print $_->{name},"\n";}


# Choose a shared disk
$smb->Share('games2');


# List content
my @l = $smb->dir;
foreach (@l) {print $_->{name},"\n";}


# Send a Winpopup message
$smb->sendWinpopupMessage('jupiter',"Hello world !");


# File manipulation
$smb->cd('jdk1.1.8');
$smb->get("COPYRIGHT");
$smb->mkdir('tata');
$smb->cd('tata');
$smb->put("COPYRIGHT");
$smb->del("COPYRIGHT");
$smb->cd('..');
$smb->rmdir('tata');


# Archive method
$smb->tar('c','/tmp/jdk.tar');
$smb->cd('..');
$smb->mkdir('tatz');
$smb->cd('tatz');
$smb->tar('x','/tmp/jdk.tar');

See test.pl file for others examples.

DESCRIPTION

SmbClientParser work with output of bin smbclient, so it doesn't work on win platform. (but query of win platform work of course)

A best method is work with a samba shared librarie and xs language, but on Nov.2000 (Samba version prior to 2.0.8) there is no public interface and shared library defined in Samba projet.

Request has been submit and accepted on Samba-technical mailing list, so I've build another module called Filesys-SmbClient that use features of this library. (libsmbclient.so)

For Samba client prior to 2.0.8, use this module !

SmbClientParser is adapted from SMB.pm make by Remco van Mook mook@cs.utwente.nl on smb2www project.

INTERFACE

Objects methods

new([$path_of_smbclient], [%param])

Create a new FileSys::SmbClientParser instance. Search bin smbclient, and fail if it can't find it in /usr/bin, /usr/local/bin, /opt/bin or /usr/local/samba/bin/. If it's on another directory, use parameter $path_of_smbclient.

%param is a hash with key user,host,password,workgroup,ipadress,share

Host([$hostname])

Set or get the remote host to be used to $hostname.

User([$username])

Set or get the username to be used to $username.

Share([$sharename])

Set or get the share to be used on the remote host to $sharename.

Password([$password])

Set or get the password to be used

Workgroup([$wg])

Set or get the workgroup to be used. (See -W switch in smbclient man page)

IpAdress([$ip])

Set or get the IP adress of the server to contact (See -I switch in smbclient man page)

Debug([$debug])

Set or get the debug verbosity

0 = no output
1+ = more output
Auth($auth_file)

Use the file $auth_file for username and password. This uses User and Password instead of -A to be backwards compatible.

Network methods

GetGroups([$host],[$user],[$pass],[$wg],[$ip])

If no parameters is given, field will be used.

Return an array with sorted workgroup listing

Syntax: @output = $smb->GetGroups

array contains hashes; keys: name, master

GetShr([$host],[$user],[$pass],[$wg],[$ip])

If no parameters is given, field will be used.

Return an array with sorted share listing

Syntax: @output = $smb->GetShr

array contains hashes; keys: name, type, comment

GetHosts([$host],[$user],[$pass],[$wg],[$ip])

Return an array with sorted host listing

Syntax: @output = $smb->GetHosts

array contains hashes; keys: name, comment

sendWinpopupMessage($dest,$text)

This method allows you to send messages, using the "WinPopup" protocol, to another computer. If the receiving computer is running WinPopup the user will receive the message and probably a beep. If they are not running WinPopup the message will be lost, and no error message will occur.

The message is also automatically truncated if the message is over 1600 bytes, as this is the limit of the protocol.

Parameters :

$dest: name of host or user to send message
$text: text to send

Operations

cd [$dir] [$host ,$user, $pass, $wg, $ip]

cd [directory name] If "directory name" is specified, the current working directory on the server will be changed to the directory specified. This operation will fail if for any reason the specified directory is inaccessible. Return list.

If no directory name is specified, the current working directory on the server will be reported.

dir [$dir] [$host ,$user, $pass, $wg, $ip]

Return an array with sorted dir and filelisting

Syntax: @output = $smb->dir (host,share,dir,user,pass)

Array contains hashes; keys: name, attr, size, date

mkdir($masq, [$dir, $host ,$user, $pass, $wg, $ip])

mkdir <mask> Create a new directory on the server (user access privileges permitting) with the specified name.

rmdir($masq, [$dir, $host ,$user, $pass, $wg, $ip])

Remove the specified directory (user access privileges permitting) from the server.

get($file, [$target], [$dir, $host ,$user, $pass, $wg, $ip])

Gets the file $file, using $user and $pass, to $target on courant SMB server and return the error code. If $target is unspecified, courant directory will be used For use STDOUT, set target to '-'.

Syntax: $smb->get ($file,$target,$dir)

del($mask, [$dir, $host ,$user, $pass, $wg, $ip])

del <mask> The client will request that the server attempt to delete all files matching "mask" from the current working directory on the server

rename($source, $target, [$dir, $host ,$user, $pass, $wg, $ip])

rename source target The file matched by mask will be moved to target. These names can be in differnet directories. It returns a return value.

pwd()

Returns the present working directory on the remote system. If there is an error it returns undef. If you are on smb://jupiter/doc/mysql/, pwd return \doc\mysql\.

du([$path, $unit)

If no path is given current directory is used.

Unit can be in [kbsmg].

b

Posix blocks

k

1Kbyte blocks

s

Samba blocks

m

1Mbyte blocks

g

1Gbyte blocks

If no unit given, k is used (1kb bloc)

In scalar context, return the total size in units for files in current directory.

In array context, return a list with total size in units for files in directory, size left in partition of share, block size used in bytes, total size of partition of share.

mget($file,[$recurse])

Gets file(s) $file on current SMB server,directory and return the error code. If multiple file, push an array ref as first parameter or pattern * or file separated by space

Syntax:

$smb->mget ('file'); #or
$smb->mget (join(' ',@file); #or
$smb->mget (\@file); #or
$smb->mget ("*",1);
put$($orig,[$file],[$dir, $host ,$user, $pass, $wg, $ip])

Puts the file $orig to $file, using $user and $pass on courant SMB server and return the error code. If no $file specified, use same name on local filesystem. If $orig is unspecified, STDIN is used (-).

Syntax: $smb->PutFile ($host,$share,$file,$user,$pass,$orig)

mput($file,[$recurse])

Puts file(s) $file on current SMB server,directory and return the error code. If multiple file, push an array ref as first parameter or pattern * or file separated by space

Syntax:

$smb->mput ('file'); #or
$smb->mput (join(' ',@file); #or
$smb->mput (\@file); #or
$smb->mput ("*",1);

Archives methods

tar($command, $target, [$dir, $host ,$user, $pass, $wg, $ip])

Execute TAR commande on //$host/$share/$dir, using $user and $pass and return the error code. $target is name of tar file that will be used

Syntax: $smb->tar ($command,'/tmp/myar.tar') where command in ('x','c',...) See smbclient man page

Error methods

All methods return undef on error and set err in $smb->err.

err

Return last text error that smbclient found

LastResponse

Return last buffer return by smbclient

Private methods

byname

sort an array of hashes by $_->{name} (for GetSMBDir et al)

operation(...)
command($args,$command)

TODO

Write a wrapper for ActiveState release on win32

AUTHOR

Alain BARBET alian@alianwebserver.com

SEE ALSO

smbclient(1) man pages.