/[Sack]/trunk/lib/Sack/Server.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /trunk/lib/Sack/Server.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 165 by dpavlin, Sun Nov 1 21:03:26 2009 UTC revision 170 by dpavlin, Tue Nov 3 17:19:12 2009 UTC
# Line 8  use IO::Select; Line 8  use IO::Select;
8    
9  use Data::Dump qw(dump);  use Data::Dump qw(dump);
10  use Storable qw();  use Storable qw();
11    use File::Slurp;
12    
13    my @cloud = qw(localhost tab.lan llin.lan);
14    
15    my $cloud_path = $ENV{CLOUD} || '/srv/Sack/etc/lib';
16    @cloud = read_file $cloud_path;
17    @cloud = map { chomp $_; $_ } @cloud;
18    
19    warn "# cloud ",dump( @cloud );
20    
21  my $listen_port = 4444;  my $listen_port = 4444;
22    
23  my $node_path = '/tmp/client.pl';  my $node_path = '/tmp/client.pl';
24    
25  my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => $listen_port, Reuse => 1) or exit;  my $lsn = IO::Socket::INET->new(Listen => 1, LocalPort => $listen_port, Reuse => 1) or die $!;
26  my $sel = IO::Select->new($lsn);  my $sel = IO::Select->new($lsn);
27    
28    my $info;
29    sub info {
30            my $port = shift;
31            push @{ $info->{$port} }, [ @_ ];
32    }
33    
34  sub fork_node {  sub fork_node {
35          my ( $port, $host ) = @_;          my ( $port, $host ) = @_;
36    
37          if ( my $pid = fork ) {          if ( my $pid = fork ) {
38                  # parent                  # parent
39                    info $port => 'forked', $pid;
40                  return $port;                  return $port;
41    
42          } elsif ( ! defined $pid ) {          } elsif ( ! defined $pid ) {
# Line 29  sub fork_node { Line 44  sub fork_node {
44                  return;                  return;
45          } else {          } else {
46                  # child                  # child
47                  my $cmd = qq|ssh -R $port:127.0.0.1:$listen_port $host $node_path $port|;                  my $cmd = qq|ssh -F $cloud_path.ssh -R $port:127.0.0.1:$listen_port $host $node_path $port|;
48                  warn "# exec: $cmd\n";                  warn "# exec: $cmd\n";
49                  exec $cmd;                  exec $cmd;
50          }          }
# Line 37  sub fork_node { Line 52  sub fork_node {
52    
53  my $node_port = 4000;  my $node_port = 4000;
54    
55  foreach my $host ( qw/localhost tab.lan llin.lan/ ) {  foreach my $host ( @cloud ) {
56          system "scp client.pl $host:$node_path";          system "echo $node_path | cpio --create --dereference | ssh -T -F $cloud_path.ssh $host cpio --extract --make-directories --unconditional";
57          fork_node( $node_port++, $host );          fork_node( $node_port++, $host );
58  }  }
59    
# Line 49  while (1) { Line 64  while (1) {
64                  if ($sock == $lsn) {                  if ($sock == $lsn) {
65                          my $new = $lsn->accept;                          my $new = $lsn->accept;
66                          $sel->add($new);                          $sel->add($new);
67                          $session->{$new} = $new->peerhost;                          $session->{$new} = $new->peerport;
68                          warn "[socket] connect\n";                          warn "[socket] connect\n";
69                          Storable::store_fd( { ping => 1 }, $new );                          Storable::store_fd( { ping => 1 }, $new );
70                            info 0 => 'ping', $new->peerport;
71                  } else {                  } else {
72                          my $data = eval { Storable::fd_retrieve( $sock ) };                          my $data = eval { Storable::fd_retrieve( $sock ) };
73                          if ( $@ ) {                          if ( $@ ) {
# Line 62  while (1) { Line 78  while (1) {
78                          } else {                          } else {
79                                  warn "<<<< ", dump($data), $/;                                  warn "<<<< ", dump($data), $/;
80                                  if ( $data->{repl} ) {                                  if ( $data->{repl} ) {
81                                          Storable::store_fd( { repl => $data }, $sock );                                          my $response = { repl => $$, info => $info };
82                                            Storable::store_fd( $response, $sock );
83                                    } elsif ( $data->{ping} ) {
84                                            $info->{_peer_port}->{$sock->peerport} = $data->{port};
85                                            info $data->{port} => 'peer port', $sock->peerport;
86                                  }                                  }
87                          }                          }
88                  }                  }

Legend:
Removed from v.165  
changed lines
  Added in v.170

  ViewVC Help
Powered by ViewVC 1.1.26