/[mdap]/mdap-server.pl
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /mdap-server.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17 - (hide annotations)
Mon Apr 23 17:42:42 2007 UTC (17 years ago) by dpavlin
File MIME type: text/plain
File size: 4517 byte(s)
support list of login\tpasswd, optionally from passwd file and try each one
in turn until correct one is found
1 dpavlin 2 #!/usr/bin/perl
2    
3     use strict;
4     use IO::Socket::Multicast;
5     use Data::Dump qw/dump/;
6    
7     use constant GROUP => '224.0.0.103';
8     use constant PORT => '3235';
9    
10 dpavlin 8 my $debug = shift @ARGV;
11    
12 dpavlin 2 my $resend_search_delay = 3;
13 dpavlin 7 my $tftp_path = '/srv/tftp/';
14 dpavlin 2
15 dpavlin 17 # tab-delimited list of user id/passwd to try on ants
16     my @try_accounts = ( "Administrator\t" );
17 dpavlin 14
18 dpavlin 17 my $passwd_path = $0;
19     $passwd_path =~ s/[^\/]+$/passwd/;
20    
21     if (-e $passwd_path) {
22     open(my $fh, $passwd_path) || die "can't open $passwd_path: $!";
23     while(<$fh>) {
24     chomp;
25     next if /^#/ || /^$/ || /^\s+$/;
26     if (/^\S+\t\S+$/) {
27     push @try_accounts, $_;
28     } else {
29     warn "invalid $passwd_path entry: $_\n";
30     }
31     }
32     print "found ", $#try_accounts, " accounts to try on password protected ants\n";
33     }
34    
35 dpavlin 9 warn "search for ants every ${resend_search_delay}s\ntftp server path: $tftp_path\n";
36    
37 dpavlin 7 sub fw {
38     my ($board, $offset,$len) = @_;
39     open(my $fh, "$tftp_path/$board") || die "Can't open image $tftp_path/$board: $!";
40     my $b;
41     seek($fh, $offset, 0) || die "can't seek to $offset: $!";
42     read($fh, $b, $len) || die "can't read $len bytes from $offset: $!";
43     close($fh);
44     return $b;
45     }
46    
47     sub fw_build {
48     my $board_name = shift || return 0;
49     my $v = join('.', unpack('CCCC',fw($board_name,0x20,4)) );
50     print "# fw_build $board_name $v\n";
51     return $v;
52     }
53    
54     sub fw_exists {
55     my $board = shift;
56     return -e "$tftp_path/$board";
57     }
58    
59 dpavlin 2 my $sock = IO::Socket::Multicast->new(LocalPort=>PORT,ReuseAddr=>1);
60     $sock->mcast_add(GROUP) || die "Couldn't set group: $!\n";
61     $sock->mcast_ttl(1);
62    
63     sub ant2hash {
64     my $data = shift;
65     my $hash;
66     map {
67     if ( m/:/ ) {
68     my ($n,$v) = split(/:/,$_,2);
69     $hash->{$n} = $v;
70     }
71     } split(/[\n\r]/, $data);
72     return $hash;
73     }
74    
75     sub mdap_send {
76     my $data = shift;
77 dpavlin 14
78     my $xor = 0;
79     map { $xor ^= ord($_) } split(//,$data);
80     $data .= sprintf('%02X', $xor);
81    
82     $sock->mcast_send( $data, GROUP . ':' . PORT );
83 dpavlin 9 if ($debug) {
84     warn ">> ", dump( $data ), $/;
85     } else {
86     $data =~ s/\s+/ /gi;
87     warn ">> ", substr($data,0,70), $/;
88     }
89 dpavlin 2 }
90    
91 dpavlin 17 my $ant_passwd_try;
92    
93     sub ant_credentials {
94     my $ant = shift || die "no ant?";
95     my $i = $ant_passwd_try->{$ant} || 0;
96     my ($user_id,$user_pwd) = split(/\t/, $try_accounts[$i]);
97     #warn "ant $ant as [$i] $user_id / $user_pwd\n";
98     return ($user_id,$user_pwd);
99     }
100    
101     sub ant_another_passwd {
102     my $ant = shift || die "no ant?";
103     $ant_passwd_try->{$ant}++;
104     $ant_passwd_try->{$ant} = 0 if ( $ant_passwd_try->{$ant} > $#try_accounts );
105     }
106    
107 dpavlin 2 local $SIG{ALRM} = sub {
108 dpavlin 14 mdap_send("ANT-SEARCH MDAP/1.1\r\n");
109 dpavlin 2 alarm( $resend_search_delay );
110     };
111    
112     alarm( $resend_search_delay );
113    
114 dpavlin 14 mdap_send("ANT-SEARCH MDAP/1.1\r\n");
115 dpavlin 7
116 dpavlin 2 while (1) {
117     my $data;
118     next unless $sock->recv($data,1024);
119    
120 dpavlin 9 if ( $data =~ m#^(INFO|ANT-SEARCH|EXEC-CLI|REPLY-\S+)\s(MDAP)/(\d+\.\d+)# ) {
121 dpavlin 2
122 dpavlin 9 my ($type,$proto,$mdap_ver) = ($1,$2,$3);
123 dpavlin 2
124     my $h = ant2hash($data);
125    
126 dpavlin 9 my $client_version = $h->{'MDAP-VERSION'};
127     $mdap_ver = $client_version if ($client_version);
128 dpavlin 7
129 dpavlin 9 print "<< $type $proto/$mdap_ver << ", length($data), " bytes\n";
130 dpavlin 2
131 dpavlin 8 warn dump($h),$/ if ($debug);
132    
133 dpavlin 17 # we are getting our own messages (since our source port
134     # is same as destination)
135 dpavlin 9 next if ( $type =~ m#^(INFO|ANT-SEARCH|EXEC-CLI)# );
136    
137     my $ant = $h->{'ANT-ID'} || die "no ANT-ID in ", dump( $h );
138    
139 dpavlin 17 my ($user_id,$user_pwd) = ant_credentials( $ant );
140    
141 dpavlin 2 if ($type eq 'REPLY-ANT-SEARCH') {
142 dpavlin 14 mdap_send("INFO MDAP/$mdap_ver\r\nSEQ-NR:1\r\nTO-ANT:$ant\r\nUSER-ID:$user_id\r\nUSER-PWD:$user_pwd\r\n");
143 dpavlin 2 } elsif ($type eq 'REPLY-INFO') {
144 dpavlin 15
145     if ($h->{'SEQ-NR'} < 0) {
146     warn "!! password protected ant $ant, skipping\n";
147 dpavlin 17 ant_another_passwd( $ant );
148 dpavlin 15 next;
149     }
150    
151 dpavlin 7 my $board = $h->{'_BOARD_NAME'} || die "no _BOARD_NAME?";
152     if ( fw_exists( $board ) ) {
153 dpavlin 14 my $build = $h->{'_BUILD'} || die "no _BUILD?";
154     my $new_build = fw_build( $board );
155     if ( $build ne $new_build ) {
156     print "UPDATE STEP 1 on ant $ant version $build -> $new_build\n";
157     mdap_send("EXEC-CLI MDAP/$mdap_ver\r\nCLI-CMD:software upgrade\r\nSEQ-NR:1\r\nTO-ANT:$ant\r\nUSER-ID:$user_id\r\nUSER-PWD:$user_pwd\r\n");
158 dpavlin 7 } else {
159     print "OK ant $ant allready updated...\n";
160     }
161 dpavlin 2 } else {
162 dpavlin 7 print "!! NO FIRMWARE for $board in $tftp_path for ant $ant, skipping update\n";
163 dpavlin 2 }
164 dpavlin 3 } elsif ( $type eq 'REPLY-EXEC-CLI' && $h->{'SEQ-NR'} == 1 ) {
165 dpavlin 7 print "UPDATE STEP 2 on ant $ant\n";
166 dpavlin 14 mdap_send("EXEC-CLI MDAP/$mdap_ver\r\nSEQ-NR:2\r\nTO-ANT:$ant\r\nUSER-ID:$user_id\r\nUSER-PWD:$user_pwd\r\n");
167 dpavlin 2 } else {
168 dpavlin 8 print "!! reply ignored ", dump( $h ), $/;
169 dpavlin 2 }
170    
171     } else {
172 dpavlin 8 warn "<=" x 15, "\n", $data, "\n", "<=" x 15, "\n";
173 dpavlin 2 }
174     }

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26