ctlmgr_ctl funktioniert nicht wie vorher im 6.20

frater

Mitglied
Mitglied seit
23 Nov 2008
Beiträge
455
Punkte für Reaktionen
3
Punkte
18
Ich nutze diese Befehle im Zabbix.
Jetzt im 6.20 funktioniert das nicht mehr.

Wie bekomme ich jetzt diese Werten?

Code:
ctlmgr_ctl r sar status/us_margin
ctlmgr_ctl r sar status/ds_margin
ctlmgr_ctl r sar status/us_crc
ctlmgr_ctl r sar status/ds_crc
ctlmgr_ctl r sar status/ds_los
 
Du müßtest Dir aus der Lua-Seite, in der die Daten angezeigt werden (das sollte imho bei den DSL-Werten irgendwo stehen), die korrekten Abfragen heraussuchen und kannst diese dann mit den neuen "Pfaden" mit ctlmgr_ctl probieren oder auch per Lua abfragen (ein Skript dafür habe ich z.B. im Freetz-Ticket 2499 hochgeladen - inkl. kleiner Erklärung).
 
Ich habe ins /usr/www/all/internet/dsl_overview.lua geguckt, aber kann nichts funktionierend daraus bekommen...
 
Wenn ich mich nicht vertue, wäre auch /usr/www/avm/internet/dsl_stats_tab.lua die richtige Stelle ... wenn Du Freetz hast (schließe ich aus dem abweichenden Pfad), dann eben entsprechend angepaßt.

Da das luadsl-Objekt offenbar ein direkter Export ist (require "libluadsl"), bringt Dir allerdings das allgemein gehaltene queries.lua nichts und Du müßtest Dir selbst ein passendes Lua-Skript (das also nicht mit box.query abfragt, sondern eben die luadsl-Objekteigenschaften direkt ausliest) basteln ... Lua ist eine ziemlich simple Sprache. Das dann (wie queries.lua) durch 'luavar' gejagt, sollte eigentlich auch die Abfrage des luadsl-Objekts möglich machen.
 
hier nen script mit dem die Daten ausgelesen werden können.

Code:
#! /bin/luavar
require("libluadsl")
g_data={}
g_data.port = {}
g_data.port[1] = {}
g_data.port[2] = {}
g_data.port[1].ds_negotiated= luadsl.getNegotiatedValues(1, "DS")
for i = 1, g_data.port[1].ds_negotiated.PORTS, 1 do
g_data.port[i] = {}
g_data.port[i].ds_negotiated= luadsl.getNegotiatedValues(i, "DS")
g_data.port[i].us_negotiated = luadsl.getNegotiatedValues(i, "US")
g_data.port[i].ds_errors = luadsl.getErrorCounters(i, "DS")
g_data.port[i].us_errors = luadsl.getErrorCounters(i, "US")
g_data.port[i].ds_overview = luadsl.getOverviewStatus(i, "DS")
g_data.port[i].us_overview = luadsl.getOverviewStatus(i, "US")
end

print("ds_state :",g_data.port[1].ds_overview.STATE);
print("us_state :",g_data.port[1].us_overview.STATE);
print("ds_timeinstate :",g_data.port[1].ds_overview.TIME_IN_STATE);
print("us_timeinstate :",g_data.port[1].us_overview.TIME_IN_STATE);
print("ds_showtime :",g_data.port[1].ds_overview.SHOWTIME);
print("us_showtime :",g_data.port[1].us_overview.SHOWTIME);
print("ds_mode :",g_data.port[1].ds_overview.MODE);
print("us_mode :",g_data.port[1].us_overview.MODE);
print("ds_attain_dr :",g_data.port[1].ds_negotiated.ATTAIN_DR);
print("us_attain_dr :",g_data.port[1].us_negotiated.ATTAIN_DR);
print("ds_actual_dr :",g_data.port[1].ds_negotiated.ACTUAL_DR);
print("us_actual_dr :",g_data.port[1].us_negotiated.ACTUAL_DR);
print("ds_margin :",g_data.port[1].ds_negotiated.MARGIN);
print("us_margin :",g_data.port[1].us_negotiated.MARGIN);
print("ds_attenuation :",g_data.port[1].ds_negotiated.ATTENUATION);
print("us_attenuation :",g_data.port[1].us_negotiated.ATTENUATION);
print("ds_delay :",g_data.port[1].ds_negotiated.DELAY);
print("us_delay :",g_data.port[1].us_negotiated.DELAY);

ausgabe
Code:
ds_state :      SHOWTIME
us_state :      SHOWTIME
ds_timeinstate :        40058
us_timeinstate :        40058
ds_showtime :   40058
us_showtime :   40058
ds_mode :       VDSL2
us_mode :       VDSL2
ds_attain_dr :  121792
us_attain_dr :  47642
ds_actual_dr :  109344
us_actual_dr :  41997
ds_margin :     10
us_margin :     6
ds_attenuation :        9
us_attenuation :        8
ds_delay :      0
us_delay :      2

Wer noch mehr Infos auslesen will soll in die dsl_stats_tab.lua datei schauen.
have fun
 
Zuletzt bearbeitet:
Moins


Danke fürs Skript.

Bei mir siehts dann so aus...
Vorbereitung, Erstellung und Aufruf...
Code:
~ # cd /var/media/ftp/SanDisk-Cruzer-01/scripts/
/var/media/ftp/SanDisk-Cruzer-01/scripts # vi dslinfo.lua
/var/media/ftp/SanDisk-Cruzer-01/scripts # chmod +x dslinfo.lua
/var/media/ftp/SanDisk-Cruzer-01/scripts # ./dslinfo.lua
Ausgabe...
Code:
ds_state :      SHOWTIME
us_state :      SHOWTIME
ds_timeinstate :        432482
us_timeinstate :        432482
ds_showtime :   432482
us_showtime :   432482
ds_mode :       VDSL2
us_mode :       VDSL2
ds_attain_dr :  113466
us_attain_dr :  25889
ds_actual_dr :  51392
us_actual_dr :  10048
ds_margin :     15
us_margin :     14
ds_attenuation :        6
us_attenuation :        4
ds_delay :      7
us_delay :      6
 
@speedyking

Vielen dank....
 
Zuletzt bearbeitet:
@speedyking

Ich bekomme jetzt wieder die "saturation werte" mit zabbix.
Möchte auch gerne die errors bekommen

Dein script angesehen und hier geguckt /usr/www/all/internet ....
Ich versteh nicht ganz wie es functioniert

Auch niemals etwas mit LUA gemacht...

Kannst du das noch hinzufugen und vielleicht einige "comments" im script setzen
Vielleicht kann ich es nächstes mahl selbst.


So lese ich die werte mit zabbix
/sbin/dsl.lua ist dein script

Code:
UserParameter=dsl.upstream, sudo /sbin/dsl.lua | tee /tmp/dsl.output | grep ^us_actual_dr | awk -F: '{print $2}' | tr -cd '0-9'
UserParameter=dsl.downstream, grep ^ds_actual_dr /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'


UserParameter=saturation.tx, adsl.saturation tx
UserParameter=saturation.rx, adsl.saturation rx


UserParameter=dsl.bytes.tx, dsl.bytes tx
UserParameter=dsl.bytes.rx, dsl.bytes rx


UserParameter=dsl.upsnr, grep ^us_margin /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'
UserParameter=dsl.downsnr, grep ^ds_margin /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'
 
Zuletzt bearbeitet:
Hi,

füge das in die script Datei ein.

Code:
print("ds_es :",g_data.port[1].ds_errors.ES);
print("us_es :",g_data.port[1].us_errors.ES);
print("ds_ses :",g_data.port[1].ds_errors.SES);
print("us_ses :",g_data.port[1].us_errors.SES);
print("ds_crc_min :",g_data.port[1].ds_errors.CRC_MIN);
print("us_crc_min :",g_data.port[1].us_errors.CRC_MIN);
print("ds_crc_15min :",g_data.port[1].ds_errors.CRC_15MIN);
print("us_crc_15min :",g_data.port[1].us_errors.CRC_15MIN);

Und nun such mal nach "ES, SES, CRC_MIN, CRC_15MIN" in der Datei "/usr/www/all/internet/dsl_stats_tab.lua".
 
Thanks to speedyking I have implemented my saturation script in Zabbix again.
It works like this.

The zabbix-agent contains (among other stuff) these entries:

Code:
# Freetz DSL
UserParameter=dsl.upstream, sudo /sbin/dsl.lua | tee /tmp/dsl.output | grep ^us_actual_dr | awk -F: '{print $2}' | tr -cd '0-9'
UserParameter=dsl.downstream, grep ^ds_actual_dr /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'


UserParameter=saturation.tx, adsl.saturation tx
UserParameter=saturation.rx, adsl.saturation rx


UserParameter=dsl.bytes.tx, dsl.bytes tx
UserParameter=dsl.bytes.rx, dsl.bytes rx


UserParameter=dsl.upsnr, grep ^us_margin /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'
UserParameter=dsl.downsnr, grep ^ds_margin /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'
UserParameter=dsl.upcrc, grep ^us_crc_min  /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'
UserParameter=dsl.downcrc, grep ^ds_crc_min  /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'
UserParameter=dsl.los, sudo ctlmgr_ctl r sar status/ds_los

The first entry will call the script dsl.lua
It will be called each minute invoked by the zabbix-server. The output of dsl.lua will be "teed" to the file /tmp/dsl.output
The file /tmp/dsl.output will get re-used by the other zabbix entries. This way it only needs to run once each minute,

The 2nd script is dsl.bytes
This script tries to give the amount of bytes that have been transferred using the DSL-interface.
It should work on all models with all flavours (ADSL / VDSL)

The 3rd script is adsl.saturation
This script calculates the difference between amount of bytes transferred since it last call. It will divide this by the time since it was last called.
Normally this is 1 minute, but this is determined by the interval set in the Zabbix server.
To work optimally I have enabled "nanoseconds" in busybox

I am now monitoring the saturation of the DSL-interface and made triggers in Zabbix that will alert me if more than 95% saturations happens over a longer period of time.
I have also a "packetloss" trigger in Zabbix and if this trigger is shown together with the saturation trigger I will already have the cause of performance degradation.
If that client then calls me I can answer him immediately the reason for this degraded performance.
If it doesn't coincide with a saturation then it's either some ISP-problem or a problem with his DSL (CRC-errors)

Of course I am also monitoring the DSL-speeds and have triggers on those.
On ADSL it should always be at least 1 MBit/s upload speed.
Code:
freetz@freetz:~/trunk$ grep -i nano= ~/trunk/.config
FREETZ_BUSYBOX_FEATURE_DATE_NANO=y


Here are the 3 files


cat ~/trunk/make/zabbix_agentd-support/files/root/sbin/dsl.bytes
Code:
#!/bin/sh


# the parameter rx or tx has to be given
echo "$1" | egrep -q '^(tx|rx)$' || exit 1


# Fetch the corresponding DSL-speed of physical layer
DSL_BYTES=`grep -A3 internet /proc/net/avm_pa/vpids 2>/dev/null | grep -i $1 | awk '{print $7}' | tr -cd '0-9'`


[ -z "${DSL_BYTES}" ] && DSL_BYTES=`grep -v '^0$' /sys/class/net/vdsl/statistics/${1}_bytes 2>/dev/null`
[ -z "${DSL_BYTES}" ] && DSL_BYTES=`grep -v '^0$' /sys/class/net/adsl/statistics/${1}_bytes 2>/dev/null`
[ -z "${DSL_BYTES}" ] && DSL_BYTES=`grep -v '^0$' /sys/class/net/dsl/statistics/${1}_bytes 2>/dev/null`


echo ${DSL_BYTES}

freetz@freetz:~/trunk$ cat ~/trunk/make/zabbix_agentd-support/files/root/sbin/adsl.saturation
Code:
#!/bin/sh


# You do need to turn on support for %N (nanoseconds) in busybox


# the parameter rx or tx has to be given
echo "$1" | egrep -q '^(tx|rx)$' || exit 1


# Create a file in /tmp to fetch the previous sample
SCRATCH=/tmp/${0##*/}.$1


# Fetch the corresponding DSL-speed of physical layer
if [ "$1" = 'rx' ] ; then
  DSL_SPEED=`grep ^ds_actual_dr /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'`
else
  DSL_SPEED=`grep ^us_actual_dr /tmp/dsl.output | awk -F: '{print $2}' | tr -cd '0-9'`
fi


if [ -z "${DSL_SPEED}" ] || [ ${DSL_SPEED} -eq 0 ] ; then
  echo 0
  exit
fi


# Fetch date and Bytes from DSL-interface
NOW_TIME=`date +%s.%N`
NOW_BYTES=`dsl.bytes $1`


# On first run, these vars do not exist
LAST_BYTES=${NOW_BYTES}
LAST_TIME=0


# read previous values
[ -f ${SCRATCH} ] && . ${SCRATCH}


# Sanity check in case previous value is somehow off
LAST_BYTES=`echo "${NOW_BYTES} ${LAST_BYTES}" | awk '{if($1 > $2) {print $2} else print $1}'`


DIFF_BYTES=`echo "${NOW_BYTES} ${LAST_BYTES}" | awk '{print $1 - $2}'`
DIFF_TIME=`echo  "${NOW_TIME} ${LAST_TIME}"   | awk '{print $1 - $2}' | tr -cd '[0-9].'`


BITS_PER_SEC=0
[ "${DIFF_TIME}" = '0' ] || BITS_PER_SEC=`echo "${DIFF_BYTES} ${DIFF_TIME}" | awk '{printf"%.0f\n", 8 * $1 / $2}'`


# Write Bytes and Time to ${SCRATCH}
echo -e "LAST_BYTES=${NOW_BYTES}\nLAST_TIME=${NOW_TIME}" >${SCRATCH}


# There's some overhead going from ATM over DSL to Ethernet (PPPoA)... a bit less for PPPoE
# I don't know (yet) how to detect an IPoE connection. I don't have such a connection..... (not such a big deal)
#NETTO=0.895
NETTO=0.93


# showdsldstat | egrep -qi '(vlan|/PPPoE)' && NETTO=0.91


# echo "${BITS_PER_SEC} ${DSL_SPEED} ${NETTO}"
RETVAL=`echo "${BITS_PER_SEC} ${DSL_SPEED} ${NETTO}" | awk '{printf"%.0f\n", $1 / ($2 * $3 * 10)}' 2>/dev/null`
[ -z "${RETVAL}" ] && RETVAL=0
echo ${RETVAL}


freetz@freetz:~/trunk$ cat ~/trunk/make/zabbix_agentd-support/files/root/sbin/dsl.lua
Code:
#! /bin/luavar
require("libluadsl")
g_data={}
g_data.port = {}
g_data.port[1] = {}
g_data.port[2] = {}
g_data.port[1].ds_negotiated= luadsl.getNegotiatedValues(1, "DS")
for i = 1, g_data.port[1].ds_negotiated.PORTS, 1 do
g_data.port[i] = {}
g_data.port[i].ds_negotiated= luadsl.getNegotiatedValues(i, "DS")
g_data.port[i].us_negotiated = luadsl.getNegotiatedValues(i, "US")
g_data.port[i].ds_errors = luadsl.getErrorCounters(i, "DS")
g_data.port[i].us_errors = luadsl.getErrorCounters(i, "US")
g_data.port[i].ds_overview = luadsl.getOverviewStatus(i, "DS")
g_data.port[i].us_overview = luadsl.getOverviewStatus(i, "US")
end


print("ds_state :",g_data.port[1].ds_overview.STATE);
print("us_state :",g_data.port[1].us_overview.STATE);
print("ds_timeinstate :",g_data.port[1].ds_overview.TIME_IN_STATE);
print("us_timeinstate :",g_data.port[1].us_overview.TIME_IN_STATE);
print("ds_showtime :",g_data.port[1].ds_overview.SHOWTIME);
print("us_showtime :",g_data.port[1].us_overview.SHOWTIME);
print("ds_mode :",g_data.port[1].ds_overview.MODE);
print("us_mode :",g_data.port[1].us_overview.MODE);
print("ds_attain_dr :",g_data.port[1].ds_negotiated.ATTAIN_DR);
print("us_attain_dr :",g_data.port[1].us_negotiated.ATTAIN_DR);
print("ds_actual_dr :",g_data.port[1].ds_negotiated.ACTUAL_DR);
print("us_actual_dr :",g_data.port[1].us_negotiated.ACTUAL_DR);
print("ds_margin :",g_data.port[1].ds_negotiated.MARGIN);
print("us_margin :",g_data.port[1].us_negotiated.MARGIN);
print("ds_attenuation :",g_data.port[1].ds_negotiated.ATTENUATION);
print("us_attenuation :",g_data.port[1].us_negotiated.ATTENUATION);
print("ds_delay :",g_data.port[1].ds_negotiated.DELAY);
print("us_delay :",g_data.port[1].us_negotiated.DELAY);
print("ds_es :",g_data.port[1].ds_errors.ES);
print("us_es :",g_data.port[1].us_errors.ES);
print("ds_ses :",g_data.port[1].ds_errors.SES);
print("us_ses :",g_data.port[1].us_errors.SES);
print("ds_crc_min :",g_data.port[1].ds_errors.CRC_MIN);
print("us_crc_min :",g_data.port[1].us_errors.CRC_MIN);
print("ds_crc_15min :",g_data.port[1].ds_errors.CRC_15MIN);
print("us_crc_15min :",g_data.port[1].us_errors.CRC_15MIN);
 
@speedyking

Your script does not work in the new 6.8 firmware and now I lost the DSL-parameters.
Because I never knew how you "mined" that library I don't know what to do to regain this.

Maybe you can be of help another time?
 
Code:
#! /bin/luavar

require("libluadsl")

g_data={}
g_data.bondedInfo = luadsl.getBondedInfo(0, "NO" )
g_data.port = {}
g_data.port[1] = {}
g_data.port[2] = {}
g_data.port[1].ds_negotiated= luadsl.getNegotiatedValues(1, "DS")


for i = 1, g_data.bondedInfo.PORTS, 1 do
g_data.port[i] = {}
g_data.port[i].ds_negotiated= luadsl.getNegotiatedValues(i, "DS")
g_data.port[i].us_negotiated = luadsl.getNegotiatedValues(i, "US")
g_data.port[i].ds_errors = luadsl.getErrorCounters(i, "DS")
g_data.port[i].us_errors = luadsl.getErrorCounters(i, "US")
g_data.port[i].ds_overview = luadsl.getOverviewStatus(i, "DS")
g_data.port[i].us_overview = luadsl.getOverviewStatus(i, "US")
print(i);
end


print("ds_state :",g_data.bondedInfo.STATE);
print("us_state :",g_data.port[1].us_overview.STATE);
print("ds_timeinstate :",g_data.port[1].ds_overview.TIME_IN_STATE);
print("us_timeinstate :",g_data.port[1].us_overview.TIME_IN_STATE);
print("ds_showtime :",g_data.port[1].ds_overview.SHOWTIME);
print("us_showtime :",g_data.port[1].us_overview.SHOWTIME);
print("ds_mode :",g_data.port[1].ds_overview.MODE);
print("us_mode :",g_data.port[1].us_overview.MODE);
print("ds_attain_dr :",g_data.port[1].ds_negotiated.ATTAIN_DR);
print("us_attain_dr :",g_data.port[1].us_negotiated.ATTAIN_DR);
print("ds_actual_dr :",g_data.port[1].ds_negotiated.ACTUAL_DR);
print("us_actual_dr :",g_data.port[1].us_negotiated.ACTUAL_DR);
print("ds_margin :",g_data.port[1].ds_negotiated.MARGIN);
print("us_margin :",g_data.port[1].us_negotiated.MARGIN);
print("ds_attenuation :",g_data.port[1].ds_negotiated.ATTENUATION);
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.