Bacula-users

Re: [Bacula-users] file listing?

2011-03-12 21:36:47
Subject: Re: [Bacula-users] file listing?
From: ganiuszka <ganiuszka AT gmail DOT com>
To: Dan Langille <dan AT langille DOT org>
Date: Sun, 13 Mar 2011 03:33:21 +0100
Hi,

First, many thanks for your feedback.

I researched that behaviour with filesize of your lstat field (
-1443891641). Yes, I made mistake with using shift bitwise operator.
>>From PHP documentation:

"Warning!
Don't right shift for more than 32 bits on 32 bits systems. Don't left
shift in case it results to number longer than 32 bits."
(source: http://php.net/manual/en/language.operators.bitwise.php)

Repairing this bug is replacing the line:

$result <<= 6;

to this line:

$result = bcmul($result, bcpow(2,6));

It should work properly.

Thanks.
gani


W dniu 13 marca 2011 01:01 użytkownik Dan Langille <dan AT langille DOT org> 
napisał:
> On 3/12/2011 9:29 AM, ganiuszka wrote:
>>
>> 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/
>>>>
>>
>>
>>
>
>
>> 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
>>
>
> I tried this function. I got an interesting value for:
>
>  Bn bIgF IGk B Pp Pp BsZ/o Cp7/ZH EAA VQLA BNachF BNacW5 BNachH A A C
>
> The PHP function returns:  -1443891641
>
> The pgsql function returns:
>
> bacula=# select base64_decode_lstat(8,'Bn bIgF IGk B Pp Pp BsZ/o Cp7/ZH EAA
> VQLA BNachF BNacW5 BNachH A A C')
> bacula-# ;
>  base64_decode_lstat
> ---------------------
>          2851075655
> (1 row)
>
> bacula=#
>
> Which is a more likely value....  FYI.
>
> --
> 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