test for symbol table/package lookup bug
[urisagit/Stem.git] / bin / stem_msg
1 #!/usr/local/bin/perl
2
3 use Getopt::Long ;
4 use strict ;
5
6 use Stem ;
7
8 my %args ;
9 my $hub_name ;
10 my $portal ;
11
12 parse_args() ;
13
14 setup_hub() ;
15
16 send_msg() ;
17
18 Stem::Event::start_loop() ;
19
20 # no return from here.
21 ######################
22
23 sub setup_hub {
24
25         $hub_name = "Stem_msg_$$" ;
26
27         Stem::Route::register_class( __PACKAGE__ ) ;
28
29         Stem::Hub->new( 'reg_name' => $hub_name ) ;
30
31         my @portal_args ;
32
33         push @portal_args, ( 'host' => $args{'host'} ) if $args{'host'} ;
34         push @portal_args, ( 'port' => $args{'port'} ) if $args{'port'} ;
35
36 #print "portal args: @portal_args\n" ;
37
38         $portal = Stem::Portal->new( @portal_args ) ;
39
40         die "Can't create Portal: $portal" if $portal ;
41 }
42
43 sub send_msg {
44
45         my ( @msg_args, @target ) ;
46
47         if ( $args{'cmd'} ) {
48
49                 @msg_args = ( 'type' => 'cmd', 'cmd' => $args{'cmd'} ) ;
50         }
51         else {
52
53                 @msg_args = ( 'type' => 'data' ) ;
54         }
55
56         @target = ( 'to_target' => $args{'target'} ) if $args{'target'} ;
57
58         push( @msg_args, ( 'ack_req' => 1 ) ) if $args{'ack'} ;
59
60         my $data = exists( $args{'data'} ) ? $args{'data'} : '' ;
61
62         my $msg = Stem::Msg->new( 
63                         'to_hub'        => 'DEFAULT',
64                         'to_cell'       => $args{'cell'},
65                         @target,
66                         'from_cell'     => __PACKAGE__,
67                         'from_hub'      => $hub_name,
68                         'data'          => \$data,
69                         @msg_args,
70                 ) ;
71
72         $msg->dispatch() ;
73 }
74
75 # this is the class method that gets back the response and ack messages.
76
77 sub msg_in {
78
79         my( $class, $msg ) = @_ ;
80
81         if( $msg->type() eq 'msg_ack' ) {
82
83 #               print "ACK\n" ;
84                 exit ;
85         }
86
87         if ( my $data = $msg->data() ) {
88
89                 print ${$data} ;
90         }
91
92 #       $portal->shut_down() ;
93
94         exit unless $args{'ack'} ;
95
96         return ;
97 }
98
99
100 sub parse_args {
101
102         Getopt::Long::Configure( 'no_ignore_case' ) ;
103
104         GetOptions( \%args,
105                     'cell|C=s',
106                     'hub|H=s',
107                     'target|T=s',
108                     'cmd|c=s',
109                     'data|d=s',
110                     'ack|a',
111                     'host|h=s',
112                     'port|p=s',
113                     'help|?',
114         ) ;
115
116 #print map "$_ => $args{$_}\n", sort keys %args ;
117
118         usage( '' ) if $args{ 'help' } ;
119
120         usage( 'Missing Cell address' ) unless $args{ 'cell' } ;
121 }
122
123 sub usage {
124
125         my $err_msg = shift ;
126
127         my $usage = <<'=cut' ;
128 =pod
129
130 =head1 NAME
131
132 stem_msg - Inject a message into a Stem Hub
133
134 =head1 SYNOPSIS
135
136 stem_msg -cell <cell> [-hub <hub>] [-target <target>]
137         [-cmd <cmd>] [-data <data>] [-ack]
138         [-host <host>] [-port <port>]
139
140         -C <cell>               The Stem Cell to send this message to.
141         -cell <cell>            This is required.
142
143         -H <hub>                The hub which has the addressed Stem Cell.
144         -hub <hub>              
145
146         -T <target>             The target address of the Stem Cell
147         -target <target>
148
149         -c <cmd>                The cmd type to send in the message
150         -cmd <cmd>              If no cmd is set, it will be a data type
151                                 message. 
152
153         -d <data>               The data to be sent in the message.
154         -data <data>            Default is an empty string.
155
156         -a                      Wait for an acknowledge message before
157         -ack                    exiting.
158
159         -h <host>               The host which the Stem Hub is on.
160         -host <host>            Default: localhost
161
162         -p <port>               The port which the Stem Portal is listening
163         -port <port>            to.
164                                 Default: 10,000 (probably will change)
165
166 =head1 DESCRIPTION
167
168 This program is meant to inject a single message into a Stem Hub. You
169 set the Cell address with the command line options and then which
170 command to execute in that Cell. If you don't set a command, then a
171 data message will be sent. You can send data in the message as well.
172
173 If the Cell generates a response message, then its data will be
174 printed on stdout.
175
176 If the -ack option is set, then the message will have the ack_req flag
177 will be set in the outgoing message. This will cause an 'ack' type
178 message to be sent back after the original message has been
179 delivered. This is meant for when you send a message to a Cell which
180 doesn't generate a response. It lets this program know that it can
181 exit.
182
183 =cut
184
185         $usage =~ s/^=\w+.*$//mg ;
186
187         $usage =~ s/\n{2,}/\n\n/ ;
188         $usage =~ s/\A\n+/\n/ ;
189
190         die "$err_msg\n$usage" ;
191 }