view release on metacpan or search on metacpan
2019-02-06T18:18:33+08:00 : ä¿®å¤ä¸ä¸æ¬¡æäº¤çé®é¢ï¼MYDan::Agent::Load éè¦ä¼ épcb
2019-02-06T17:47:39+08:00 : tools/grsync æ·»å immediately åæ°,æ¯æä¸é离ç½ç»çLoadè¿åº¦æ¾ç¤º
2019-02-03T22:46:20+08:00 : tools/rtail è¾åºæ¥å¿å颿·»å æºå¨å
2019-02-03T22:41:32+08:00 : tools/rcall æ·»å 宿¶æ¾ç¤ºå½ä»¤è¾åºåè½
2019-02-03T22:38:35+08:00 : add agent/argv/scriptsx,agent/code/scriptsx
2019-02-03T22:19:50+08:00 : tcpserver ææ¬å°åè¿ç¨ç«¯å£ä¼ éç»æä»¶
2019-02-03T22:08:15+08:00 : tcpserver æ·»å TCPSERVERINDEXç¯å¢åé
2019-02-02T23:42:15+08:00 : agent ééï¼é»è®¤20M
2019-02-01T11:58:24+08:00 : merge release-0.0.1
2019-02-01T11:55:40+08:00 : åå¸0.1.59å°cpan.org
2019-02-01T11:50:37+08:00 : grsync 忥ç®å½ä¼åï¼å
ç»è¿å缩ã空ç®å½ãè½¯é¾æ¥ï¼chmodãchownççå¤ç
2019-01-25T21:58:15+08:00 : ä¿®å¤éè¿ä»£çloadæä»¶çé®é¢
2019-01-25T18:15:01+08:00 : fastmd5 é»è®¤å¤§æä»¶ä¸º5G
2019-01-25T16:32:54+08:00 : ä¿®æ¹etc/agent/proxy é¿å
åçå®ä½¿ç¨çipç¸æ
2019-01-25T16:18:45+08:00 : fix éè¿ä»£çloadæä»¶æ¶å没æfilecacheæ¥é
2019-01-25T13:29:57+08:00 : åå¸0.1.58å°cpan.org
2019-01-25T13:24:44+08:00 : agent/code/scripts pkillææscriptsæä»¶å¯å¨çææè¿ç¨
2019-01-25T09:54:44+08:00 : åå¸0.1.57å°cpan.org
2019-01-25T09:54:03+08:00 : Util::FastMD5æ·»å read åseekå¤±è´¥å¤æ
2019-01-24T22:00:18+08:00 : 忥æä»¶ä½¿ç¨fastmd5
2019-01-24T21:02:02+08:00 : æ·»å fastmd5å·¥å
·ï¼ç¨äºå¿«éè®¡ç®æä»¶md5
2017-11-21T18:01:14+00:00 : - Added MANIFEST to the .gitignore
2017-11-21T17:59:09+00:00 : - Added MANIFEST.SKIP to help in creating nice MANIFEST file.
2017-11-21T17:58:27+00:00 : - Removed auto generated META.json from source.
2017-11-21T22:25:49+08:00 : åå¸0.1.10çæ¬å°cpan.org
2017-11-21T22:03:47+08:00 : argv/code/{download,load} é¦é使ç¨argvï¼æ²¡æargvæ
åµä¸ä½¿ç¨data
2017-11-21T21:57:39+08:00 : argv/code/download, Agent::Mrsync download æä»¶argv使ç¨hash
2017-11-21T21:49:42+08:00 : æMYDan::Agent::Grsyncé»è®¤çæ¹å¼æ¹æV1
2017-11-21T21:42:21+08:00 : MYDan::Agent::Grsync new彿°ä¿çproxyä¿¡æ¯
2017-11-21T21:36:18+08:00 : .config,Util::Tcpserver æ·»å ä¼ è¾buféå¶
2017-11-21T21:28:10+08:00 : MYDan::Agent::Client 代çè¿ç©ºçæ
åµå¤ç
2017-11-21T21:23:22+08:00 : tools/grsync MYDan::Agent::Grsync æ·»å --chown --chmod --ccåæ°
2017-11-21T13:02:28+08:00 : tools/rcall,agent/code/version,MYDan::Agent::Client æ·»å æ¥ççæ¬åæ°åæä»¶
2017-11-21T12:54:37+08:00 : Agent::Mrsync 使ç¨Agent::Client ï¼å¯ä»¥å¹é
ä¸ä»£çï¼è䏿¯ç´æ¥å»ºç«tcpå°ç®æ æº
2017-11-21T12:50:45+08:00 : fix ä¼ échown chmod ccåæ°ä½ç½®é误
2017-11-20T23:02:47+08:00 : åå¸0.1.9çæ¬å°cpan.org
2017-11-20T23:00:40+08:00 : æåè®®ä¸çkeepalive æ¹æ MYDan_$version
2017-11-20T22:48:51+08:00 : tools/mrsync MYDan::Agent::Mrsync æ·»å --chown --chmod --ccåæ°
2017-11-20T22:45:12+08:00 : tools/load MYDan::Agent::Load æ·»å --chown --chmod --ccåæ°
2017-11-20T22:39:47+08:00 : tools/{load,mrsync,grsync} é»è®¤ç¨æ·æ¹æid -unï¼ä¸ä½¿ç¨logname
2017-11-20T22:37:05+08:00 : æ·»å --ccåæ°ï¼é»è®¤æ
åµä¸ä¸dumpæä»¶ç屿§ï¼æ·»å -âccç»§æ¿æä»¶å±æ§ï¼æåç¬--chown --chmod æ§å¶
2017-11-20T22:33:22+08:00 : agent/code/{dump,sdump} ä¿®æ¹ï¼å
chmodåchown å renameï¼å¤±è´¥çæ
åµä¸ä¿çæä»¶ãåæ¶å¤±è´¥çæ¶åæä¿¡æ¯è¿åç» å®¢æ·ç«¯
2017-11-20T22:28:03+08:00 : fix å¨todoçä»»å¡ä¸ï¼spæ¹ædp
2017-11-20T22:26:03+08:00 : ä¿®æ¹mydanå®è£
è·¯å¾
2017-11-20T22:24:03+08:00 : MYDan::VSSH::Comp Bareword "Term::Completion" not allowed while "strict subs" in use
2017-11-20T13:06:25+08:00 : åå¸0.1.8çæ¬å°cpan.org
2017-11-20T13:04:06+08:00 : æºå¸¦çdataæ°æ®è¿è¡åç¼©ä¼ è¾ï¼åæ¶å
许dataæ¯æ°ç»æè
hashç
2017-11-20T12:59:51+08:00 : éè¿apiè¯·æ±æéæ¶ï¼ä¸æäº¤dataæ°æ®ï¼è¯·æ±ç»æåæ¼æ¥åæ¥
2017-11-19T16:04:56+08:00 : agent dumpæä»¶ä½¿ç¨ä¸å 坿°æ®,忥çdumpæ¹åæsdump
2017-11-19T15:59:02+08:00 : ä¿®å¤å级agentåè®®æ¶å¼å
¥çbug
2017-11-19T14:27:04+08:00 : å级agentåè®®ï¼å¨å¤´é¨å¯ä»¥æºå¸¦ä¸ç¨å å¯çæ°æ®
2017-11-18T23:24:30+08:00 : åå¸0.1.7çæ¬å°cpan.org
2017-09-26T21:34:13+08:00 : add alias unalias
2017-09-25T22:21:45+08:00 : æ·»å mydan/bin ç¨äºæ¾å°PATHç¯å¢åéä¸
2017-09-25T13:03:59+08:00 : fix Util::ExpSSH, éè¿è¿åç 夿hostä¸åç¡®
2017-09-25T11:11:16+08:00 : tools/rcall 使ç¨vsshçæå°ç»æå½æ°
2017-09-24T12:59:51+08:00 : node/bin/* æ¹æä¸å¿
sudo
2017-09-24T02:19:46+08:00 : tools/go æ·»å è§£æ etc/hosts
2017-09-24T02:19:01+08:00 : fix Hosts.pmæ£åé误
2017-09-24T01:57:53+08:00 : add etc/hosts å Util::Hosts ç¨äºmydanç³»ç»é´èªå®ä¹hostsæä»¶
2017-09-23T12:16:08-05:00 : Merge pull request #10 from g112wdh/wdh_dev
2017-09-23T23:07:01+08:00 : æ¢å¤code/dump 䏿¬¡æäº¤é误
2017-09-23T23:02:27+08:00 : set dump default chmod and chown
2017-09-17T18:02:28+08:00 : rcall add --port
2017-09-17T00:36:57+08:00 : Revert "ä¿®æ¹Proxy.pm å¢å defaultç代çï¼0.0.0.0/0)"
2017-09-17T00:36:41+08:00 : Revert "add range"
2017-09-17T00:19:06+08:00 : add srsync for rsync single host password come from MYDan::Util::Pass
2017-09-05T21:48:33+08:00 : add range
2017-09-05T21:37:56+08:00 : ä¿®æ¹Proxy.pm å¢å defaultç代çï¼0.0.0.0/0) ä¿®æ¹etc/agent/proxy åæyamlçæ ¼å¼ 使key æ¯ææ£åårangeï¼Node 表达å¼ï¼
2017-08-29T21:33:04+08:00 : å¦æè§£å䏿¬¡å¤±è´¥éæ°ä¸è½½å®è£
å
2017-08-20T00:56:56+08:00 : add META.json
2017-08-20T00:51:45+08:00 : dan/tools/release æ·»å $mydan/etc/agent/proxy
2017-08-20T00:47:12+08:00 : tools/release æå
æ¶åæ¶æå¯æ§è¡å
2017-08-12T11:33:08+08:00 : ä¿®æ¹projecté
ç½®æä»¶çè·¯å¾å°etcä¸
2017-08-12T10:28:00+08:00 : agent读åproxyæä»¶æ¹æåªè¯»
2017-08-12T10:14:16+08:00 : load æ·»å 代çåè½ï¼åæ¶æ¹proxyå
2017-08-06T23:42:02-05:00 : Merge pull request #7 from g112wdh/wdh_dev
2017-08-04T18:43:37+08:00 : Merge branch 'wdh_dev' of https://github.com/g112wdh/mayi into wdh_dev
2017-08-04T18:40:41+08:00 : ä¿®æ¹æç¹ç»ä¼ æ¶å æå¼æä»¶çæ¹å¼ï¼ä¹åçæ¹å¼ææµäºæé®é¢
2017-08-02T23:15:21+08:00 : agentæ·»å ä»£çæ§è¡åè½
2017-07-27T08:20:32-05:00 : Merge pull request #6 from MYDan/release-0.0.1-dev
2017-07-27T08:12:01-05:00 : Merge pull request #5 from g112wdh/wdh_dev
2017-07-27T21:06:55+08:00 : åå°stat次æ°
2017-07-27T14:10:05+08:00 : å¢å load 使ä¸è½½æ¥ç å
å«chmod åchown ï¼éè¿uid gid æ¥è®¾å®ï¼å¦ææ¬æºæ²¡æååºçç¨æ·çè¯ï¼ç´æ¥å°±æ¯æ°åçuidågidäºï¼
2017-07-19T22:08:53+08:00 : æ·»å agent代ççé»è®¤é
ç½®
2017-07-19T22:07:15+08:00 : add agent.porxy to .config
2017-07-19T22:02:29+08:00 : æ·»å Porxy.pm
2017-07-18T23:44:57-05:00 : Merge pull request #3 from g112wdh/master
2017-07-19T10:07:17+08:00 : fix shell
2017-07-18T00:57:44+08:00 : ä¿®æ¹è¿åº¦æ¾ç¤ºç¸å
³
2017-07-17T23:59:00+08:00 : agentè°ç¨æ¶æ¾ç¤ºè¿åº¦
2017-07-17T23:57:59+08:00 : è¿åº¦æ¾ç¤ºæ¨¡åupdate
2017-07-16T14:49:45+08:00 : agentè°ç¨errorä¿¡æ¯æå¨æ¥å¿çåæ¶è¿åç»è°ç¨è
2017-07-16T14:23:10+08:00 : clean
box/tools/mrsync view on Meta::CPAN
use MYDan::Node;
use MYDan::Util::Mrsync;
use MYDan::Util::OptConf;
$| ++;
@MYDan::Util::OptConf::CONF = qw( pass_through no_ignore_case );
my $option = MYDan::Util::OptConf->load();
my %o = $option->set( retry => 2, timeout => 300, gave => 3, src => hostname() )
->get( qw( src=s dst=s sp=s dp=s timeout=i max=i retry=i nice=i user=s sudo=s gave=i chown=s chmod=s cc ) )
->dump();
$option->assert( qw( src dst sp ) );
$o{user} = `id -un` and chop $o{user} unless $o{user};
my $range = MYDan::Node->new( $option->dump( 'range' ) );
my $mrsync = MYDan::Util::Mrsync->new
(
( map { $_ => delete $o{$_} } qw( sp dp ) ),
dan/agent/argv/dump view on Meta::CPAN
use MYDan::Util::FastMD5;
return sub
{
local $/;
my ( $file, %o ) = shift;
return [ %o ] unless $file && -f $file;
%o = ( path => $file =~ /^\// ? $file : Cwd::abs_path( $file ) );
Getopt::Long::GetOptionsFromArray( \@_, \%o, qw( path=s chmod=s chown=s cc ) );
if( delete $o{cc} )
{
my ( $uid, $mode ) = ( stat $file )[ 4, 2 ];
$o{chmod} ||= $mode = sprintf( "%04o", $mode & 07777 );
$o{chown} ||= ( getpwuid($uid) )[0];
}
$o{md5} = MYDan::Util::FastMD5->hexdigest( $file );
$ENV{MYDanExtractFile} = $file;
$ENV{MYDanExtractFileAim} = $o{path};
return \%o;
};
dan/agent/argv/edump view on Meta::CPAN
return sub
{
local $/;
my ( $file, %o, $data ) = shift;
return [ %o ] unless $file && -f $file;
%o = ( path => $file =~ /^\// ? $file : Cwd::abs_path( $file ) );
Getopt::Long::GetOptionsFromArray( \@_, \%o, qw( path=s chmod=s chown=s cc ) );
if( delete $o{cc} )
{
my ( $uid, $mode ) = ( stat $file )[ 4, 2 ];
$o{chmod} ||= $mode = sprintf( "%04o", $mode & 07777 );
$o{chown} ||= ( getpwuid($uid) )[0];
}
$o{md5} = Digest::MD5->new()->add( $data = `cat $file` )->hexdigest();
return ( \%o, data => $data );
};
dan/agent/argv/mrsync view on Meta::CPAN
return sub
{
local $/;
my ( %o, $data );
unless( defined $_[0] ) { shift; %o = @_; }
else
{
Getopt::Long::GetOptionsFromArray( \@_, \%o,
qw( src=s dst=s sp=s dp=s timeout=i max=i retry=i nice=i user=s sudo=s gave=i chown=s chmod=s cc env )
);
}
$o{retry} = 2 unless defined $o{retry};
$o{timeout} = 300 unless defined $o{timeout};
$o{gave} = 3 unless defined $o{gave};
$o{user} = `id -un` and chop $o{user} unless $o{user};
my $option = MYDan::Util::OptConf->load();
my $range = MYDan::Node->new( $option->dump( 'range' ) );
dan/agent/argv/sdump view on Meta::CPAN
return sub
{
local $/;
my ( $file, %o ) = shift;
return [ %o ] unless $file && -f $file;
%o = ( path => $file =~ /^\// ? $file : Cwd::abs_path( $file ) );
Getopt::Long::GetOptionsFromArray( \@_, \%o, qw( path=s chmod=s chown=s cc ) );
if( delete $o{cc} )
{
my ( $uid, $mode ) = ( stat $file )[ 4, 2 ];
$o{chmod} ||= $mode = sprintf( "%04o", $mode & 07777 );
$o{chown} ||= ( getpwuid($uid) )[0];
}
$o{md5} = Digest::MD5->new()->add( $o{file} = `cat $file` )->hexdigest();
return [ \%o ];
};
dan/agent/argv/unzipdir view on Meta::CPAN
use strict;
use warnings;
use Getopt::Long;
return sub
{
local $/;
my %o;
Getopt::Long::GetOptionsFromArray( \@_, \%o, qw( uuid=s chmod=s chown=s delete ) );
$o{path} = \@_;
return \%o;
};
dan/agent/code/access view on Meta::CPAN
line => $conf->{$_}, lazy => 1 ) } keys %file;
}
map { $_->commit() } values %file;
for my $conf ( @{ $param{argv} } )
{
next unless my $user = $conf->{user};
my $home = "/home/$user";
my $ssh = "$home/.ssh";
system( "mkdir -m 0700 -p $ssh && chown $user $ssh $home" )
if $conf->{passwd};
}
print "ok\n";
exit 0;
dan/agent/code/dump view on Meta::CPAN
if( $filecache->usable() && -f $path )
{
my $md5 = eval{ MYDan::Util::FastMD5->hexdigest( $path ) };
&$idie( "fastmd5 fail: $@" ) if $@;
if( $md5 eq $conf->{md5} )
{
$do = 0;
$do = 1 if $conf->{chmod}
&& ! chmod oct $conf->{chmod}, $path;
$do = 1 if $conf->{chown} && ! ( my @pw = getpwnam $conf->{chown} );
$do = 1 if @pw && ! chown @pw[2,3], $path;
}
}
if( $do )
{
my $tmp = "$MYDan::PATH/tmp";
unless( -d $tmp ){ mkdir $tmp;chmod 0777, $tmp; }
$tmp .= '/dump.data.';
for my $f ( grep{ -f } glob "$tmp*" )
{
my $t = ( stat $f )[9];
unlink $f if $t && $t < time - 3600;
}
my $temp = $tmp. Digest::MD5->new->add( sprintf "$path.%d.%stmp", time, $$ )->hexdigest;
&$idie( 'param error' ) unless defined $conf->{md5} && $path;
&$idie( "get $conf->{chown} uid fail" ) if $conf->{chown} && ! ( my @pw = getpwnam $conf->{chown} );
&$unlink( $temp, "save fail: $!" ) if system "mv '$MYDanExtractFile' '$temp'";
my $md5 = eval{ MYDan::Util::FastMD5->hexdigest( $temp ) };
&$idie( "fastmd5 fail MYDanExtractFile: $@" ) if $@;
&$unlink( $temp, 'chomd fail' ) if $conf->{chmod}
&& ! chmod oct $conf->{chmod}, $temp;
&$unlink( $temp, 'chown fail' ) if @pw && ! chown @pw[2,3], $temp;
&$unlink( $temp, 'md5 nomatch' ) if $md5 ne $conf->{md5};
my $dir = File::Basename::dirname( $path );
unless( -d $dir )
{
&$unlink( $temp, 'mkdir dir fail' ) if system "mkdir -p '$dir'";
}
&$unlink( $temp, 'dst path error' ) if -e $path && ! -f $path;
dan/agent/code/edump view on Meta::CPAN
my $path = delete $conf->{path};
my ( $fh, $temp ) = File::Temp::tempfile();
my $idie = sub{ print shift;exit 1; };
my $unlink = sub { unlink shift; print shift; exit 1 };
&$idie( 'param error' ) unless defined $conf->{md5}
&& $path && $fh && length $param{data};
&$idie( "get $conf->{chown} uid fail" ) if $conf->{chown} && ! ( my @pw = getpwnam $conf->{chown} );
print $fh $param{data};
close $fh;
my $md5 = MYDan::Util::FastMD5->hexdigest( $temp );
&$unlink( $temp, 'chomd fail' ) if $conf->{chmod}
&& ! chmod oct $conf->{chmod}, $temp;
&$unlink( $temp, 'chown fail' ) if @pw && ! chown @pw[2,3], $temp;
&$unlink( $temp, 'md5 nomatch' ) if $md5 ne $conf->{md5};
&$unlink( $temp, 'rename fail' ) if system "mv '$temp' '$path'";
print "ok\n";
exit 0;
dan/agent/code/sdump view on Meta::CPAN
my $unlink = sub { unlink shift; print shift;exit 1 };
for my $conf ( ref $param{argv}[0] ? @{ $param{argv} } : $param{argv} )
{
my $path = delete $conf->{path};
my ( $fh, $temp ) = File::Temp::tempfile();
&$idie( 'param error' ) unless defined $conf->{md5}
&& $path && $fh && length $conf->{file};
&$idie( "get $conf->{chown} uid fail" ) if $conf->{chown} && ! ( my @pw = getpwnam $conf->{chown} );
print $fh $conf->{file};
close $fh;
my $md5 = MYDan::Util::FastMD5->hexdigest( $temp );
&$unlink( $temp, 'md5 nomatch' ) if $md5 ne $conf->{md5};
&$unlink( $temp, 'chmod fail' ) if $conf->{chmod}
&& ! chmod oct $conf->{chmod}, $temp;
&$unlink( $temp, 'chown fail' ) if @pw && ! chown @pw[2,3], $temp;
&$unlink( $temp, 'rename fail' ) if system "mv '$temp' '$path'";
}
print "ok\n";
exit 0;
dan/agent/code/unzipdir view on Meta::CPAN
use strict;
use warnings;
use YAML::XS;
local $/ = undef;
my %param = %{ YAML::XS::Load( <> ) };
local $/ = "\n";
my ( $path, $uuid, $chmod, $chown, $delete ) = map{ $param{argv}{$_}}qw( path uuid chmod chown delete );
my $idie = sub{ print shift;exit 1; };
my $call = sub
{
my $cmd = shift;
my $pid = open( my $H, "$cmd|" );
my @list = <$H>;
chomp @list;
waitpid( $pid, 0 );
&$idie( "run $cmd fail" ) if $? >> 8;
dan/agent/code/unzipdir view on Meta::CPAN
{
&$idie( "mkdir $dir fail" ) unless mkdir $dir;
}
&$idie( "chmod fail:$!( chmod $mode $dir )" ) if system "chmod $mode '$dir'";
if( defined $owner )
{
&$idie( "getpwnam fail" ) unless my @pw = getpwnam $owner;
&$idie( "getpwnam fail" ) unless my $gname = getgrgid($pw[3]);
&$idie( "chmod fail:$!" ) if system "chown $chown.$gname '$dir'";
}
else
{
print "[warn]$dir not chown\n";
}
}
else
{
unless( -d $d )
{
&$idie( "mkdir $d fail" ) unless mkdir $d;
}
}
}
if( defined $chmod )
{
&$idie( "chmod format error: $chmod" ) unless $chmod =~ /^\d+$/;
&$idie( "chmod fail:$!" ) if system "chmod $chmod . -R";
}
if( defined $chown )
{
&$idie( "chown format error: $chown" ) unless $chown =~ /^[a-zA-Z0-9_\-\.]+$/;
&$idie( "getpwnam fail" ) unless my @pw = getpwnam $chown;
&$idie( "getpwnam fail" ) unless my $gname = getgrgid($pw[3]);
&$idie( "chmod fail:$!" ) if system "chown $chown.$gname . -R";
}
if( $delete )
{
my $list = eval{ YAML::XS::LoadFile "$temp.flist" };
&$idie( "load flist fail: $@" ) if $@;
my %list = map{ $_ => 1 }@$list;
my @file = &$call( 'find . -type f && find . -type l' );
map{
dan/tools/grsync view on Meta::CPAN
=head1 SYNOPSIS
$0 [--src src-range(default `hostname`)] --dst dst-range --sp src-path [--dp dst-path] \
[--timeout seconds(default 300)]
[--max number(default 128)]
[--retry number(default 2)]
[--gave number(default 3)]
[--user username(default `id -un`)]
[--sudo user1 ]
[--chown root]
[--chmod 777]
[--cc]
[--delete]
-1 Forces grsync to try protocol version 1
-2 Forces grsync to try protocol version 2
-3 Forces grsync to try protocol version 3
-4 Forces grsync to try protocol version 4
--sp /path/file --dp /path/foo/newfile
dan/tools/grsync view on Meta::CPAN
use MYDan::Util::Progress;
use MYDan::Util::Percent;
$| ++;
@MYDan::Util::OptConf::CONF = qw( pass_through no_ignore_case );
my $option = MYDan::Util::OptConf->load();
my %o = $option->set( retry => 2, timeout => 300, gave => 3, addr => 0 )
->get( qw( src=s dst=s sp=s dp=s timeout=i max=i retry=i nice=i user=s sudo=s gave=i chown=s chmod=s cc delete 1 2 3 4 immediately addr=s listen=i ) )
->dump();
$o{delete $o{ProtocolVersion}} = 1 unless $o{ProtocolVersion} && $o{ProtocolVersion} =~ /^\d$/ && grep{ $o{$_} }1..3;
$option->assert( qw( dst sp ) );
my ( $ptime, $pcb, $p ) = ( 0 );
my %pp:shared;
dan/tools/keys view on Meta::CPAN
{
next unless my $dir = ( getpwnam $user )[7];
next unless -d ( $dir = "$dir/.ssh" );
for my $file ( @file )
{
next unless -f ( $file = "$dir/$file" );
my $cont = `cat $file`;
push @conf,
{
path => $file, chown => $user, file => $cont,
md5 => Digest::MD5->new()->add( $cont )->hexdigest(),
chmod => sprintf "%lo", ( stat $file )[2] & 07777,
}
}
}
die "invalid user or user has no key\n" unless @conf;
my %query = ( code => 'sdump', argv => \@conf, sudo => 'root' );
$query{user} = `id -un`;chop $query{user};
dan/tools/load view on Meta::CPAN
=head1 SYNOPSIS
$0 -host host [--sp srcfile] [--verbose]
[--dp dstfile (default sp )]
[--sudo sudoer ]
[--user username (default `id -un`)]
[--timeout seconds (default 500)]
[--continue]
[--chown root]
[--chmod 777]
[--cc]
=cut
$MYDan::Util::OptConf::THIS = 'agent';
my $option = MYDan::Util::OptConf->load();
my %o = $option->get(
qw( host=s sp=s dp=s verbose user=s sudo=s timeout=i continue chown=s chmod=s cc )
)->dump();
$option->assert( 'host', 'sp' );
$o{dp} ||= $o{sp};
$o{verbose} = 1;
$o{user} = `id -un` and chop $o{user} unless $o{user};
MYDan::Agent::Load->new(
node => $o{host},
dan/tools/mrsync view on Meta::CPAN
=head1 SYNOPSIS
$0 [--src src-range(default `hostname`)] --dst dst-range --sp src-path [--dp dst-path] \
[--timeout seconds(default 300)]
[--max number(default 128)]
[--retry number(default 2)]
[--gave number(default 3)]
[--user username(default `id -un`)]
[--sudo user1 ]
[--chown root]
[--chmod 777]
[--cc]
-1 Forces mrsync to try protocol version 1
-2 Forces mrsync to try protocol version 2
=cut
use strict;
use warnings;
use Sys::Hostname;
dan/tools/mrsync view on Meta::CPAN
use MYDan::Node;
use MYDan::Agent::Mrsync;
use MYDan::Util::OptConf;
$| ++;
@MYDan::Util::OptConf::CONF = qw( pass_through no_ignore_case );
my $option = MYDan::Util::OptConf->load();
my %o = $option->set( retry => 2, timeout => 300, gave => 3, src => hostname() )
->get( qw( src=s dst=s sp=s dp=s timeout=i max=i retry=i nice=i user=s sudo=s gave=i chown=s chmod=s cc 1 2 ) )
->dump();
$o{delete $o{ProtocolVersion}} = 1 unless $o{ProtocolVersion} && $o{ProtocolVersion} =~ /^\d$/ && grep{ $o{$_} }1..2;
$option->assert( qw( src dst sp ) );
$o{user} = `id -un` and chop $o{user} unless $o{user};
my $range = MYDan::Node->new( $option->dump( 'range' ) );
lib/MYDan/Agent/Grsync/V12.pm view on Meta::CPAN
print "$host => localhost: LOAD\n";
delete $ENV{MYDanExtractFile};
delete $ENV{MYDanExtractFileAim};
eval{
MYDan::Agent::Load->new(
node => $host,
sp => $path{sp}, dp => $load,
)->run( %{$this->{agent}}, %o,
( defined $o{cc} ) ? ()
: ( 'chown' => undef, 'chmod' => undef )
);
};
my $stat = $@ ? "FAIL $@" : 'OK';
print "$host <= localhost: $stat\n";
if( $stat eq 'OK' )
{
$loadok = 1;
last;
}
lib/MYDan/Agent/Grsync/V12.pm view on Meta::CPAN
{
delete $ENV{MYDanExtractFile};
delete $ENV{MYDanExtractFileAim};
my $code = File::Spec->join( $this->{agent}{argv}, shift );
return -f $code && ( $code = do $code ) && ref $code eq 'CODE'
? &$code( @_ ) : \@_;
};
my @argv;
map{ push( @argv, "--$_", $o{$_} ) if defined $o{$_} }qw( chown chmod );
push( @argv, "--cc" ) if $o{cc};
my %query = (
code => 'dump',
argv => &$argv( 'dump',$load || $path{sp} , '--path', $path{dp}, @argv ),
map{ $_ => $o{$_} }qw( user sudo )
);
map{ print "localhost => $_: DUMP\n" }keys %dump;
my %result = MYDan::Agent::Client->new(
lib/MYDan/Agent/Grsync/V3.pm view on Meta::CPAN
print "$host => localhost: LOAD\n";
delete $ENV{MYDanExtractFile};
delete $ENV{MYDanExtractFileAim};
eval{
MYDan::Agent::Load->new(
node => $host,
sp => $path{sp}, dp => $load,
)->run( %{$this->{agent}}, %o, verbose => $o{pcb} ? 1 : 0,
( defined $o{cc} ) ? ()
: ( 'chown' => undef, 'chmod' => undef )
);
};
my $stat = $@ ? "FAIL $@" : 'OK';
print "$host <= localhost: $stat\n";
if( $stat eq 'OK' )
{
$loadok = 1;
last;
lib/MYDan/Agent/Grsync/V3.pm view on Meta::CPAN
next if $todo->{ok};
my @dst = @{$todo->{dst}};
my $i = int( rand time ) % @dst;
my $dst = $dst[$i];
$dump{$dst} = $id;
}
last unless keys %dump;
my @argv;
map{ push( @argv, "--$_", $o{$_} ) if defined $o{$_} }qw( chown chmod );
push( @argv, "--cc" ) if $o{cc};
my %query = (
code => 'dump',
argv => &$argv( 'dump',$load || $path{sp} , '--path', $path{dp}, @argv ),
map{ $_ => $o{$_} }qw( user sudo )
);
map{ print "localhost => $_: DUMP\n" }keys %dump;
my %MYDan_rlog = ( MYDan_rlog => $o{env}{MYDan_rlog} ) if $o{env} && $o{env}{MYDan_rlog};
lib/MYDan/Agent/Grsync/V4.pm view on Meta::CPAN
print "$host => localhost: LOAD\n";
delete $ENV{MYDanExtractFile};
delete $ENV{MYDanExtractFileAim};
eval{
MYDan::Agent::Load->new(
node => $host,
sp => $path{sp}, dp => $load,
)->run( %{$this->{agent}}, %o,
( defined $o{cc} ) ? ()
: ( 'chown' => undef, 'chmod' => undef )
);
};
my $stat = $@ ? "FAIL $@" : 'OK';
print "$host <= localhost: $stat\n";
if( $stat eq 'OK' )
{
$loadok = 1;
last;
lib/MYDan/Agent/Grsync/V4.pm view on Meta::CPAN
}
my %dump = %{$task{dst}};
if( %dump && ( ( !%{$task{src}} ) || $loadok ) )
{
for ( 0 .. $o{retry} )
{
last unless keys %dump;
my @argv;
map{ push( @argv, "--$_", $o{$_} ) if defined $o{$_} }qw( chown chmod );
push( @argv, "--cc" ) if $o{cc};
my %query = (
code => 'dump',
argv => &$argv( 'dump',$load || $path{sp} , '--path', $path{dp}, @argv ),
map{ $_ => $o{$_} }qw( user sudo )
);
map{ print "localhost => $_: DUMP\n" }keys %dump;
my %result = MYDan::Agent::Client->new(
lib/MYDan/Agent/GrsyncM.pm view on Meta::CPAN
print '=' x 60, "\n";
if( $this->{spIsDir} )
{
delete $ENV{MYDanExtractFile};
delete $ENV{MYDanExtractFileAim};
my %query = (
code => 'unzipdir', argv => +{ uuid => $this->{uuid},
path => [ $this->{opt}{dp} ], map{ $_ => $opt->{$_} }qw( delete chown chmod ) },
map{ $_ => $opt->{$_} }qw( user sudo ) );
my %result = MYDan::Agent::Client->new( @{$sync->{dst}} )
->run( %$opt, %{$sync->{agent}}, query => \%query );
print "untar.\n";
for my $node ( keys %result )
{
if( $result{$node} =~ s/--- 0\n$// )
{
print "$node: $result{$node}\n" if $result{$node};
lib/MYDan/Agent/Load.pm view on Meta::CPAN
{
undef $hdl;
$cv->send;
}
if( $keepalive{cont} =~ s/\**#\*MYDan_\d+\*#(\d+):([a-z0-9]+):(\w+):(\d+):// )
{
( $size, $filemd5, $own, $mode ) = ( $1, $2, $3, $4 );
if( $run{cc} )
{
$run{chown} ||= $own;
$run{chmod} ||= $mode;
}
if( $filecache->check( $filemd5 ) && ! -e $dp )
{
print "get data from filecache\n";
eval{ $filecache->get( $dp, $filemd5) };
warn "get filecache fail: $@" if $@;
}
if( -f $dp )
{
my $x = eval{ MYDan::Util::FastMD5->hexdigest( $dp ) };
if( $x && $filemd5 && $x eq $filemd5 )
{
die "chmod fail\n" if $run{chmod} && ! chmod oct($run{chmod}), $dp;
if( $run{chown} )
{
die "get $run{chown} uid fail\n" unless my @pw = getpwnam $run{chown};
die "chown fail\n" unless chown @pw[2,3], $dp;
}
undef $hdl; $cv->send; $ok = $size;
}
}
$percent->renew( $size )->add( length $keepalive{cont} );
syswrite( $TEMP, delete $keepalive{cont} );
$keepalive{save} = 1;
}
}
lib/MYDan/Agent/Load.pm view on Meta::CPAN
truncate $TEMP, $size;
unless( $filemd5 eq MYDan::Util::FastMD5->hexdigest( $temp ) )
{
unlink $temp;
die "md5 nomatch\n";
}
die "chmod fail\n" if$run{chmod} && ! chmod oct($run{chmod}), $temp;
if( $run{chown} )
{
die "get $run{chown} uid fail\n" unless my @pw = getpwnam $run{chown};
die "chown fail\n" unless chown @pw[2,3], $temp;
}
my $dir = File::Basename::dirname( $dp );
unless( -d $dir )
{
die "mkdir dir fail\n" if system "mkdir -p '$dir'";
}
die "dst path error\n" if -e $dp && ! -f $dp;
lib/MYDan/Agent/Mrsync.pm view on Meta::CPAN
eval{
if( $queryx )
{
my $load = [ $sp ];
$load = Compress::Zlib::compress( YAML::XS::Dump $load );
$load = 'data:' . length( $load ) . ':'. $load;
$load .= $queryx->{load};
my $dl = +{ load => $load, src => $src, port => $agent{port}, sp => $sp, dp => $dp, map{ $_ => $param{$_} }qw( chown chmod cc ) };
my $download = Compress::Zlib::compress( YAML::XS::Dump $dl );
$download = 'data:' . length( $download ) . ':'. $download;
$download .= $queryx->{download};
my %query = (
argv => $dl,
code => 'download', map{ $_ => $param{$_} }qw( user sudo env )
);
%result = MYDan::Agent::Client->new(
lib/MYDan/Agent/Mrsync.pm view on Meta::CPAN
code => 'load', map{ $_ => $param{$_} }qw( user sudo )
);
$load{node} = [ $src ] if $isc;
my $load = MYDan::Agent::Query->dump(\%load);
eval{ $load = MYDan::API::Agent->new()->encryption( $load ) if $isc };
die "encryption fail:$@" if $@;
my %query = (
argv => +{ load => $load, src => $src, port => $agent{port}, sp => $sp, dp => $dp, map{ $_ => $param{$_} }qw( chown chmod cc ) },
code => 'download', map{ $_ => $param{$_} }qw( user sudo env )
);
%result = MYDan::Agent::Client->new(
$dst
)->run( %agent, query => \%query, timeout => $param{timeout} );
}
my $result = $result{$dst}||'';
lib/MYDan/Util/File.pm view on Meta::CPAN
backup: back up original file
=cut
sub commit
{
my ( $self, %param ) = splice @_;
my $path = $param{path} || $self->{path}; $path = readlink if -l $path;
my $temp = $self->{temp};
my $error = "$temp -> $path: failed to";
confess "$error chown" unless chown @$self{ qw( uid gid ) }, $temp;
confess "$error chmod" unless chmod $self->{mode}, $temp;
system "cp $path $path.bk" if $param{backup} && -e $path;
confess "$error mv" if system "mv $temp $path";
return $self;
}
sub DESTROY
{
my $self = shift;