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
|