Bacula-users

Re: [Bacula-users] file listing?

2011-03-13 16:10:48
Subject: Re: [Bacula-users] file listing?
From: Dan Langille <dan AT langille DOT org>
To: ganiuszka <ganiuszka AT gmail DOT com>
Date: Sun, 13 Mar 2011 16:07:24 -0400
On 3/12/2011 9:33 PM, ganiuszka wrote:
> 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.

> 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.

bcmul isn't in PHP by default:

   PHP Fatal error:  Call to undefined function bcmul()

I'm running PHP php5-5.3.5

The man page: http://us2.php.net/bcmul

I recompiled PHP with  BCMATH - bc style precision math functions

That's much better.  Thanks.

What I'd like to do, but not today, is compare all values output by the 
PHP function with the values output by the stored procedure.


-- 
Dan Langille - http://langille.org/

------------------------------------------------------------------------------
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

<Prev in Thread] Current Thread [Next in Thread>