Holger Parplies wrote at about 03:29:00 +0200 on Wednesday, July 20, 2011: > Hi, > > sorry for not replying earlier. In case you're still wondering (otherwise for > the archives) ... > > Jeffrey J. Kosowsky wrote on 2011-02-07 14:15:05 -0500 [[BackupPC-users] > *BUMP* *BUMP* Re: BackupPC perl code hacking question... (Craig any chance > you might have a suggestion?)]: > > Let me rewrite my earlier posting to be more clear so maybe someone > > can help me. > > Well, let's rearrange your message so it makes sense (did I ever mention that > I don't like top posting? ;-). > > > > Jeffrey J. Kosowsky wrote at about 12:53:28 -0500 on Monday, December > > 13, 2010: > > > > For reasons I can explain later, I am trying to set > > > > $Conf{RsyncdPasswd} in the main routine of BackupPC_dump (I am > > > > actually trying to do something a bit more complex but this is easier > > > > to understand). > > > > > > > > Now since %Conf = $bpc->Conf(), > > You are aware that this is a hash copy operation, right? > > > > > I would have thought that for example > > > > setting $Conf{RsyncPasswd} = "mypasswd" would then be pushed down to > > > > all the routines called directly or indirectly from BackupPC_dump. > > Well, it is as long as they use the "my %Conf" from BackupPC_dump and not > $bpc->Conf(). You modified the copy, not the original hash in the > BackupPC::Lib object. > > > > > However, in Rsync.pm where the value of $Conf{RsyncPasswd} is > > actually > > > > used, the value remains at ''. > > Yes, because Rsync.pm gets a reference to the unmodified BackupPC::Lib > object's > hash (BackupPC::Xfer::Protocol, line 59, sub new, "conf => $bpc->{Conf}"). > > > > > (Of course setting the paramter the "normal" way within a config file > > > > works and shows up as set in Rsync.pm) > > That is because the code in BackupPC::Lib that reads the config file saves > the > values. > > > > > I'm sure I must be missing something about how perl inherits and/or > > > > overwrites variables... but I am stumped here... > > It's really simple. If you get a reference to a hash ($conf = \%conf), then > you modify the original, if you get a copy (%conf = %conf_orig), you don't. > What makes things complicated here is that you need to follow the code around > through various modules and subs, and that each copy of %conf is named the > same :-). > > > Here is a simplified version of my actual command > > > > $Conf{DumpPreUserCmd} = "&{sub {\$args[1]{RsyncdPasswd} = `ssh > > -x mybackuypclient get_rsyncd_secret`}}"; > > > > This uses the fact that $args[1]=$Conf > > Actually, it's \%Conf (a reference, not a copy), so modifying > *BackupPC_dump's > copy* works. $Conf would be a scalar, which might coincidentally contain a > reference to a hash. Using an element of a hash is "$Conf{Foo}", using an > element of a hash a scalar is pointing to is "$Conf->{Foo}". You might even > have both visible at the same time, but only if you are either a bad > programmer or enjoy confusing people. > > my $Conf = $bpc->Conf(); > my %Conf = (XferMethod => "snailmail"); > print $Conf{XferMethod}, "\n"; # probably prints "rsync" > print $Conf->{XferMethod}, "\n"; # prints "snailmail" > > > So, that \$args[1]{RsyncdPasswd} is equivalent to > > ... a syntax error? ;-) > > $args [1] should be a reference to BackupPC_dump's %Conf, and > $args [1] -> {RsyncdPasswd} should reference the corresponding entry (as an > lvalue, so you can assign to it). "->" between braces "[]"/"{}" is implied > and > may be left out. I'm not sure how the reference operator binds in your > example. > As it seems to work, let's ignore it for now. > > > $Conf{RsyncdPasswd}. > > ... in BackupPC_dump (because that is what was passed in). > > > [...] > > So, my question is is there any way to dynamically set Conf parameters > > along the lines I am trying to do? > > Well, you'd have to modify the original hash. > > $bpc->{Conf}->{RsyncdPasswd} = `ssh ...`; > > That is not strictly legal, but it should work. Note that this change would > *not* propagate to any copies previously made (like the "my %Conf" in > BackupPC_dump). Using references to $bpc->{Conf} everywhere instead of copies > would probably make things much easier, but on the downside, it would mean > you > can't make local modifications to $Conf->{...} that are not meant to > propagate > to the rest of the code (or, put differently, you could more easily > accidentally clobber BackupPC::Lib's state). You'll notice that > BackupPC::Xfer::Protocol (as quoted above) actually *does* use a reference. > > Hope that helps.
Hmmmm... very helpful... Got it to work after correcting a pair of bugs in Lib.pm ------------------------------------------------------------------------------ BlackBerry® DevCon Americas, Oct. 18-20, San Francisco, CA The must-attend event for mobile developers. Connect with experts. Get tools for creating Super Apps. See the latest technologies. Sessions, hands-on labs, demos & much more. Register early & save! http://p.sf.net/sfu/rim-blackberry-1 _______________________________________________ BackupPC-users mailing list BackupPC-users@lists.sourceforge.net List: https://lists.sourceforge.net/lists/listinfo/backuppc-users Wiki: http://backuppc.wiki.sourceforge.net Project: http://backuppc.sourceforge.net/