Repository
Munin (contrib)
Last change
2020-10-12
Graph Categories
Family
manual
Keywords
Language
Ruby
License
ADSL
Authors

ag241-adsl

Name

ag241-adsl - retrieve connection statistics from the web admin interface of a Linksys AG241v2 ADSL modem

Description

Data is extracted from the http://modemaddress/ADSLCStatus.htm page.

This plugin has only been tested on a Debian testing system.

This modem also has some basic SNMP support so you can configure it as per the instructions on the munin wiki:

http://munin.projects.linpro.no/wiki/Using_SNMP_plugins

By default the SNMP server is disabled, you can enable it in the web admin. You will need to set up the “virtual node” configuration as detailed for snmp plugins.

Configuration

The plugin requires some configuration in /etc/munin/plugin-conf.d/ag241_MODEMADDRESS e.g.

[ag241_vocume.stargate_*]
env.user admin
env.pass password
#env.port 80

Once you have the above config set you will need to symlink the plugin to

/etc/munin/plugins/ag241_MODEMADDRESS_syncrate
/etc/munin/plugins/ag241_MODEMADDRESS_attenutation
/etc/munin/plugins/ag241_MODEMADDRESS_noise

Restart munin-node afterwards.

Hopefully in 20-30mins you will have some nice graphs.

Authors

Copyright (C) 2010 David Leggett

Magic Markers

#%# family=manual

#!/usr/bin/env ruby

=begin

=head1 NAME

ag241-adsl - retrieve connection statistics from the web admin interface of a Linksys AG241v2 ADSL modem

=head1 DESCRIPTION

Data is extracted from the http://modemaddress/ADSLCStatus.htm page.

This plugin has only been tested on a Debian testing system.

This modem also has some basic SNMP support so you can configure it
as per the instructions on the munin wiki:

  http://munin.projects.linpro.no/wiki/Using_SNMP_plugins

By default the SNMP server is disabled, you can enable it in the web admin.
You will need to set up the "virtual node" configuration as detailed
for snmp plugins.

=head1 CONFIGURATION

The plugin requires some configuration in /etc/munin/plugin-conf.d/ag241_MODEMADDRESS
e.g.

 [ag241_vocume.stargate_*]
 env.user admin
 env.pass password
 #env.port 80

Once you have the above config set you will need to symlink the plugin to

 /etc/munin/plugins/ag241_MODEMADDRESS_syncrate
 /etc/munin/plugins/ag241_MODEMADDRESS_attenutation
 /etc/munin/plugins/ag241_MODEMADDRESS_noise

Restart munin-node afterwards.

Hopefully in 20-30mins you will have some nice graphs.

=head1 AUTHORS

Copyright (C) 2010 David Leggett

=head1 MAGIC MARKERS

#%# family=manual

=end

# Require this module, it is part of the standard ruby lib AFAIK
require 'net/http'

# default parameters
host = nil
port = ENV['port'] || 80
user = ENV['user'] || 'admin'
pass = ENV['pass'] || 'forhax' # don't remember what the default admin password was
stat = nil

# Check executable "name" for parameter count
params = $0.split('_')
if params.size != 3
  puts 'Incorrect number of parameters'
  exit 1
end

# first param after the plugin name is the host to query
# second is the statistic to query
host = params[1]
stat = params[2]

unless ENV['debug'].nil?
  puts 'user = ' + user
  puts 'pass = ' + pass
  puts 'host = ' + host
  puts 'port = ' + port
  puts 'stat = ' + stat
end

# Dump the graph configuration data
if ARGV[0] == 'config'
  puts 'host_name ' + host
  puts 'graph_category network'

  case stat
  when 'syncrate'
    puts 'graph_info This graph shows the ADSL line sync rate.'
    puts 'graph_title ADSL line sync rate'
    puts 'graph_vlabel connection rate bits / second'
    puts 'graph_args --base 1000 -l 0 '
  when 'attenuation'
    puts 'graph_info This graph shows the ADSL line attenuation.'
    puts 'graph_title ADSL line attenuation'
    puts 'graph_vlabel attenuation dB'
  when 'margin', 'noise'
    puts 'graph_info This graph shows the ADSL SNR margin.'
    puts 'graph_title ADSL line SNR margin'
    puts 'graph_vlabel noise margin dB'
  end
  puts 'down.label downstream'
  puts 'up.label upstream'
  exit 0
end

# Connect to the webadmin
http = Net::HTTP.start(host, port)
req = Net::HTTP::Get.new('/ADSLCStatus.htm')
# send the login info
req.basic_auth user, pass
response = http.request(req)
s = response.body

# Make sure we got the page successfully
if response.code != '200'
  puts 'Getting web page failed:'
  case response.code
  when '401'
    puts 'Probably because the username and password are incorrect'
    # Looks like the modem response with 200 when you try to access a page that does not exist >_>
    # when '404'
    #	puts 'Looks like the page this plugin needs isn\'t available...'
    #	puts 'Check your modem make/model/version'
  end
  puts s
  exit 1
end

# Apply voodoo regex to the result HTML to get the data we want.
case stat
when 'syncrate'
  a = s.scan(/.*share\.curstate.*\n.*share\.downstr[^0-9]*([0-9]+).*share\.upstr[^0-9]*([0-9]+).*$/)
  b, c = a[0]
  puts 'down.value ' + (b.to_i * 1000).to_s + "\n" + 'up.value ' + (c.to_i * 1000).to_s
  exit 0
when 'attenuation'
  a = s.scan(/.*share\.lineatt.*\n.*share\.down[^0-9]*([0-9]+).*share\.up[^0-9]*([0-9]+).*$/)
  b, c = a[0]
  puts 'down.value ' + b.to_i.to_s + "\n" + 'up.value ' + c.to_i.to_s
  exit 0
when 'margin', 'noise'
  a = s.scan(/.*share\.noise.*\n.*share\.down[^0-9]*([0-9]+).*share\.up[^0-9]*([0-9]+).*$/)
  b, c = a[0]
  puts 'down.value ' + b.to_i.to_s + "\n" + 'up.value ' + c.to_i.to_s
  exit 0
else
  puts 'Statistic ' + stat.to_s + ' not known, would you like me to fabricate it for you?'
  exit 1
end