Bacula-users

Re: [Bacula-users] file listing?

2011-03-12 09:32:42
Subject: Re: [Bacula-users] file listing?
From: ganiuszka <ganiuszka AT gmail DOT com>
To: Dan Langille <dan AT langille DOT org>
Date: Sat, 12 Mar 2011 15:29:23 +0100
Hi,

I wrote the Bacula LStat decoder implementation in PHP. I made WebGUI
for this also. Now online LStat decoder (beta version) is available on
my page Bacula.pl:

http://www.bacula.pl/bacula-lstat-decoder/

In the near future I need to make description of fields.

Here is Bacula LStat decoder function in PHP:

function decode_bacula_lstat($lstat) {
        $base64 = 
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
        $lstat = trim($lstat);
        $lstat_fields = explode(' ', $lstat);

        if(count($lstat_fields) !== 16) {
                die('Error! Number of lstat fields is invalid. Please make sure 
that
it is valid lstat string.');
        }

        list($dev, $inode, $mode, $links, $uid, $gid, $rdev, $size, $blksize,
$blocks, $atime, $mtime, $ctime, $linkfi, $flags, $data) =
$lstat_fields;
        $encoded_values = array('dev' => $dev, 'inode' => $inode, 'mode' =>
$mode, 'links' => $links, 'uid' => $uid, 'gid' => $gid, 'rdev' =>
$rdev, 'size' => $size, 'blksize' => $blksize, 'blocks' => $blocks,
'atime' => $atime, 'mtime' => $mtime, 'ctime' => $ctime, 'linkfi' =>
$linkfi, 'flags' => $flags, 'data' => $data);

        $ret = array();
        foreach($encoded_values as $key => $val) {
                $result = 0;
                $is_minus = false;
                $start = 0;

                if(substr($val, 0, 1) === '-') {
                        $is_minus = true;
                        $start++;
                }

                for($i = $start; $i < strlen($val); $i++) {
                        $result <<= 6;
                        $result +=  strpos($base64, substr($val, $i , 1));
                }
                $ret[$key] = ($is_minus === true) ? -$result : $result;
        }
        return $ret;
}

and here is usage for this:

$lstat = 'gB DL+b IGg B A y A D5dZR BAA fN4 BNeR+z BNeR+7 BNeR+7 A A C';
$decoded_lstat = decode_bacula_lstat($lstat);
print_r($decoded_lstat);

Any suggestions and modifications are welcome.
Regards
gani


W dniu 11 marca 2011 21:45 użytkownik ganiuszka <ganiuszka AT gmail DOT com> 
napisał:
> Hi,
> In my example jobid is putting in:
> ... File.JobId=8...
> but this "eight":
>
> base64_decode_lstat(8,File.LStat)
>
> is exactly eight field (encoded filesize field). I seem that you used
> standard base64 decoder to decode eighth field. Am I right?
>
> Bacula lstat is encoded by using non-standard base64 algorithm. Your
> decoded lstat shows like this:
>
> [dev] => 89
> [inodes] => 1366434
> [mode] => 33200
> [links] => 1
> [uid] => 80
> [gid] => 91
> [rdev] => 5481898
> [size] => 315
> [blksize] => 16384
> [blocks] => 4
> [atime] => 1299770037
> [mtime] => 1299770037
> [ctime] => 1299770066
> [LinkFl] => 0
> [flags] => 0
> [data] => 2
>
> I do not understand every field, but most fields is clear. Now, I
> wrote implementation of Bacula base64_decoder in PHP. I need finish it
> and make WebGUI for this and I will share this decoder here. For this
> I am using source code of base64 implementation in Bacula and this:
>
> http://old.nabble.com/The-File.LStat-field-td940366.html
>
> Regards.
> gani
>
> 2011/3/11 Dan Langille <dan AT langille DOT org>:
>> On 3/9/2011 5:36 PM, ganiuszka wrote:
>>
>>> 2011/3/9 Mike Eggleston<mikeegg1 AT mac DOT com>:
>>>>
>>>> Afternoon,
>>>>
>>>> I just noticed one of my clients had a huge incremental (level 2)
>>>> backup. I want to see what file caused the huge increase. I tried 'list
>>>> files jobid=20097' and though I'm shown the files, I'm not shown the
>>>> size of each file. Is there a command or query that shows me the size
>>>> of the file?
>>>>
>>>> Mike
>>
>>> Hi,
>>> Here you have SQL function for PostgreSQL (I took it from bweb):
>>>
>>> CREATE PROCEDURAL LANGUAGE plpgsql;
>>> BEGIN;
>>>
>>> CREATE OR REPLACE FUNCTION base64_decode_lstat(int4, varchar) RETURNS int8
>>> AS $$
>>> DECLARE
>>> val int8;
>>> b64 varchar(64);
>>> size varchar(64);
>>> i int;
>>> BEGIN
>>> size := split_part($2, ' ', $1);
>>> b64 := 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
>>> val := 0;
>>> FOR i IN 1..length(size) LOOP
>>> val := val + (strpos(b64, substr(size, i, 1))-1) * (64^(length(size)-i));
>>> END LOOP;
>>> RETURN val;
>>> END;
>>> $$ language 'plpgsql';
>>>
>>> COMMIT;
>>>
>>> and this is a query which lists file path, filename and size in Bytes
>>> (in this example for jobid=8):
>>>
>>> SELECT Path.Path, Filename.Name, base64_decode_lstat(8,File.LStat) AS
>>> size FROM Filename, File, Path WHERE File.JobId=8 AND
>>> File.PathId=Path.PathId AND Filename.FilenameId=File.FilenameId ORDER
>>> BY size ASC;
>>>
>>> I tested it. It works.
>>
>> For the record:
>>
>> In this query, I see base64_decode_lstat(8,File.LStat)
>>
>> What is 8?  It is not jobid.  It is a field id.  This lstat value:
>>
>> BZ FNmi IGw B BQ Bb U6Wq E7 EAA E BNeOq1 BNeOq1 BNeOrS A A C
>>
>> The eight field, as defined by ' ', is E7.
>>
>> --
>> Dan Langille - http://langille.org/
>>



-- 
"Większej miłości nikt nie ma nad tę, jak gdy kto życie swoje kładzie
za przyjaciół swoich." Jezus Chrystus

------------------------------------------------------------------------------
Colocation vs. Managed Hosting
A question and answer guide to determining the best fit
for your organization - today and in the future.
http://p.sf.net/sfu/internap-sfd2d
_______________________________________________
Bacula-users mailing list
Bacula-users AT lists.sourceforge DOT net
https://lists.sourceforge.net/lists/listinfo/bacula-users