From: Michael B. <bro...@ya...> - 2011-07-25 14:38:30
|
Morning folks! I've got some MiniMyth frontends I'd like to control from MH, specifically from an iPhone page I'm working on. I have Network items set up for the hostnames, and am able to see the status of them fine. I have some wakeonlan items configured that worked (but are presently commented out). Is there a way to link them together so they can be managed as one item? Would creating a new item and using tie_items to link them be the right approach? I'm presuming that someone else has already done this, and knows the right way to do this in MH. Thanks for your time! /Mike Sent from my iPhone 4 |
From: Michael B. <bro...@ya...> - 2011-07-27 18:27:48
|
> > Morning folks! > > I've got some MiniMyth frontends I'd like to control from MH, specifically from an iPhone page I'm working on. I have Network items set up for the hostnames, and am able to see the status of them fine. I have some wakeonlan items configured that worked (but are presently commented out). Is there a way to link them together so they can be managed as one item? Would creating a new item and using tie_items to link them be the right approach? I'm presuming that someone else has already done this, and knows the right way to do this in MH. > > Thanks for your time! > > /Mike Ok, I know I'm not doing something right, but I'm not sure the right way to do it (I'm not a programmer by any stretch, but I can hack something together when I understand how it works). > I've got the following in a mht file. Format = A # -*- mode: perl-mode; -*- # # See mh/lib/read_table_A.pl for definition of Format=A items # #noloop=start #NETWORK, ipaddress, Name, Grouplist, ping delay (seconds) NETWORK, 192.168.1.1, intrepid, HTPC|MasterBedroom, 120 NETWORK, 192.168.1.2, freevo, HTPC|FamilyRoom, 120 ##WAKEONLAN, MACADDRESS, Name, Grouplist HTPC_Intrepid, WakeableComputers WAKEONLAN, 00:17:31:xx:xx:xx, HTPC_Freevo, WakeableComputers #WAKEONLAN, 00:17:31:Xx:xx:xx, nighthawk, CODE, $intrepid->tie_items($HTPC_Intrepid); CODE, $HTPC_Intrepid->tie_items($intrepid); CODE, $freevo->tie_items($HTPC_Freevo); CODE, $HTPC_Freevo->tie_items($freevo); #noloop=stop Maybe I'm overcomplicating things, but I'd like to programatically and via a web GUI monitor the state of and wake the various HTPC's, apply friendly labels and icons, and make it easy to use by the other family members. I'd prefer to do it in mht files for simplicity, but would it be better to do in a code file using if statements and explicit state changes? Or would it be better to extend the Network_item.pm to have a "wake" state? Thanks for your time! /Mike |
From: Michael B. <bro...@ya...> - 2011-07-31 20:50:51
|
<snip previous> I guess I'm talking to myself in this thread. I played with a few different options, and decided to extend Network_Item to include WakeOnLan functionality. I've got working code that enables the 'start' state that has always existed, but was never used. It takes a MAC address after the interval, and I've included code to ensure it doesn't break existing functionality. I've got to clean up some error messages and do diffs of files that need to be updated, and I'll submit the lot to the list for peer review and commits. HTH! /Mike |
From: H P. <hp...@gm...> - 2011-07-31 21:24:35
|
Actually I tried this a while back but never got it working. I also thought it might be neat to add a stop method, probably a host command so one could launch an ssh script, get_URL for a web shutdown, etc... Sent from my mobile device. On 2011-07-31, at 2:50 PM, Michael Brown <bro...@ya...> wrote: > <snip previous> > > I guess I'm talking to myself in this thread. I played with a few different options, and decided to extend Network_Item to include WakeOnLan functionality. I've got working code that enables the 'start' state that has always existed, but was never used. It takes a MAC address after the interval, and I've included code to ensure it doesn't break existing functionality. I've got to clean up some error messages and do diffs of files that need to be updated, and I'll submit the lot to the list for peer review and commits. > > HTH! > > /Mike > ------------------------------------------------------------------------------ > Got Input? Slashdot Needs You. > Take our quick survey online. Come on, we don't ask for help often. > Plus, you'll get a chance to win $100 to spend on ThinkGeek. > http://p.sf.net/sfu/slashdot-survey > ________________________________________________________ > To unsubscribe from this list, go to: http://sourceforge.net/mail/?group_id=1365 > |
From: Michael B. <bro...@ya...> - 2011-08-01 00:04:18
|
On 2011-07-31, at 17:24, H Plato <hplato@> wrote: > Actually I tried this a while back but never got it working. I also thought it might be neat to add a stop method, probably a host command so one could launch an ssh script, get_URL for a web shutdown, etc... Ah, so those are your comments in read_table_A? One of the diffs I'm planning on doing is to adjust that section of read_table_A to reflect the present situation; it confused me for a bit thinking that the functionality I was looking for was already built in. Basically, I took code from WakeOnLan.pm and re-worked it to fit into Network_Item. Then I had to add additional error-trapping code to ensure that anyone who didn't have a MAC address configured (existing behaviour) but hit 'start' wouldn't lose existing functionality (it won't ping devices that aren't 'up' or 'down'.) I've tested existing and new configs, and both work as expected. I'm going to enhance iPhone.pl to support the 'start' state, and submit that with the other diffs. /Mike |
From: Michael B. <bro...@ya...> - 2011-08-01 13:14:44
|
On 2011-07-31, at 21:21, H Plato <hplato@> wrote: > Probably. I also modified iPhone.pl to get it working with switchlincs if that helps as another reference point. I monitor about 20 network items and get lots of zombie processes, have you found the same? > > Howard I haven't found any zombies, but I've been bouncing MH regularly through my testing. I'll keep my eyes open for it though... I run MH in a VM, Debian 6 based. I'd be interested in seeing your iPhone.pl script for ideas on this and some other stuff. Maybe we can get the updates into the next release. Presently, I've got the following code in iPhone.pl for "start" support: } elsif ($object->isa('Network_Item')) { $html .= " <li"; $html .= " style=\"background-color:#CCFF99\"" if ($state eq "up"); $html .= ">$name<span>$state</span></li> " if ($state eq "up"); $html .= "><input type=\"button\" class=\"iPush iBWarn\" value=\"Start $name \" style=\"width:100%\" onclick=\"ChangeState('../SET?$item2=start')\" /></li>" if ($ state ne "up"); Which gives a picture like this I'm thinking of either putting in code to detect if a MAC is defined, and presenting the start button (otherwise default to old behaviour of showing down), or putting in a toggle with 'down' and 'start' states. Any opinions as someone who uses the Network_Item code? My new Network_Item code is below. It works well, and I don't think it breaks existing behaviors, but it might be good to have an independent test. The only remaining issue is that when the state is changed via the Web GUI, the state gets set as 'web [ip address]'. I've worked around it for now by explicitly setting the state to down after start, and letting the ping code update it. I think I need to enhance the code to support set_by, but I'm not sure exactly how to yet. The code's below if you want to kick the tires on it. === Network_Item.pm === # This object simply pings the specified address and sets # its state according to status # # 2011-07-30 MKB Enhanced with WakeOnLan functionality package Network_Item; =begin comment Here is an example: use Network_Item; $network_house = new Network_Item('192.168.0.2', 10); $network_hp = new Network_Item('192.168.0.66', 20); print_log "house just changed to $state" if $state = state_changed $network_house; print_log "house is $state" if new_second 15 and $state = state $network_house; Here is an example mht entry: #NETWORK IP_ADDRESS NAME Grouplist Interval MAC_ADDRESS NETWORK, 192.168.4.25, HTPC_Mini, HTPC|HomeGym, 120, 00:1C:C0:AB:CD:AE =cut @Network_Item::ISA = ('Generic_Item'); use IO::Socket qw(AF_INET SOCK_DGRAM SOL_SOCKET SO_BROADCAST); use Socket; sub new { my ($class, $address, $interval, $mac_address) = @_; my $self={}; bless $self,$class; my $ping_test_cmd = ($::OS_win) ? 'ping -n 1 ' : 'ping -c 1 '; my $ping_test_file = "$::config_parms{data_dir}/ping_results.$address.txt"; $self->{address} = $address; $self->{interval} = $interval; $self->{mac_address} = $mac_address; $self->add_states('start'); $self->{timer} = new Timer; $self->{timer}-> set($self->{interval}, sub {&Network_Item::ping_check($self)}, -1); $self->{process} = new Process_Item($ping_test_cmd . $address); $self->{process}-> set_output($ping_test_file); unlink $ping_test_file; return $self; } sub ping_check { my ($self) = @_; my $address = $self->{address}; &::print_log("Network_Item ping on ip=$address") if $::Debug{network}; $self->{process}->stop(); my $ping_test_file = "$::config_parms{data_dir}/ping_results.$address.txt"; if (-e $ping_test_file) { my $ping_results = &::file_read($ping_test_file); print "db ping_results for $address f=$ping_test_file: $ping_results\n" if $::Debug{network}; my $state = ($ping_results =~ /ttl=/i) ? 'up' : 'down'; if ($self->state ne $state) { $self->set($state); }; unlink $ping_test_file; } $self->{process}->start(); } sub default_setstate { my ($self, $state) = @_; if ($state !~ m/^up|down|start$/i){ &::print_log("Invalid state for Network_Item: $state") if $::Debug{network}; return -1; } else { &::print_log("Setting " .$self->{address}." as " .$state) if $::Debug{network}; } } sub setstate_start { my ($self, $substate, $state) = @_; # # wake # # The 'magic packet' consists of 6 times 0xFF followed by 16 times # the hardware address of the NIC. This sequence can be encapsulated # in any kind of packet, in this case UDP to the discard port (9). # my $hwaddr = $self->{mac_address}; my $ipaddr = '255.255.255.255'; my $port = getservbyname('discard', 'udp'); my ($raddr, $them, $proto); my ($hwaddr_re, $pkt); # Validate hardware address (ethernet address) $hwaddr_re = join(':', ('[0-9A-Fa-f]{1,2}') x 6); if ($hwaddr !~ m/^$hwaddr_re$/) { warn "Invalid hardware address: $hwaddr\n"; &::print_log("Missing or invalid MAC address for " .$self->{address}." ( " .$hwaddr." )") if $::Debug{network}; $state='down'; $self->set_states_for_next_pass($state); return -1; } # Generate magic sequence foreach (split /:/, $hwaddr) { $pkt .= chr(hex($_)); } $pkt = chr(0xFF) x 6 . $pkt x 16; # Alocate socket and send packet $raddr = gethostbyname($ipaddr); $them = pack_sockaddr_in($port, $raddr); $proto = getprotobyname('udp'); socket(S, AF_INET, SOCK_DGRAM, $proto) or die "socket : $!"; setsockopt(S, SOL_SOCKET, SO_BROADCAST, 1) or die "setsockopt : $!"; print "Sending magic packet to $ipaddr:$port with $hwaddr\n"; send(S, $pkt, 0, $them) or die "send : $!"; close S; if ($self->state eq "start") { $state eq "down"; $self->set($state); }; &::print_log("Setting " .$self->{address}." substate as " .$state) if $::Debug{network}; &::print_log("Setting " .$self->{address}." state as " .$state) if $::Debug{network}; } === Network_Item.pm === I'm a sys-admin, not a programmer, so I'm sure there's room for improvement ;-) HTH! /Mike |