Vraag


Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Hallo iedereen,

Ik ben een bestaand eerder (op Mikrotik forum) gepost script aan het omzetten naar de nieuwste versie zodat ik kan gebruiken (https://forum.mikrotik.com/viewtopic.php?t=87565#).
Ik gebruik RouterOS v6.38.5 op Winbox v3.11 op hEX Routerboard.
Ik haal tx-bytes en rx-bytes op maar krijg een waarde terug met spaties in het getal. Wanneer ik tx-bytes en rx-bytes optel worden ze achter elkaar geplaatst met een ; ertussen alsof het tekst/string is. Ik kan de getallen nu dus niet gebruiken. Ik krijg:
41 045 997;41 045 997
Dit is de code die ik wil gebruiken;
code:
1
2
3
4
5
6
7
8
9
10
11
:local counterrx [/interface ethernet get eth2-master rx-bytes]
:put "counterrx:"
:put $counterrx
:local countertx [/interface ethernet get eth2-master tx-bytes]
:put "countertx:"
:put $countertx
:tonum $counterrx
:tonum $countertx
set $counter ( $counterrx + $countertx )
:put "counter:"
:put $counter

Mijn output is:
counterrx:
41 278 785
countertx:
391 157 213
counter:
41 278 785;391 157 213
Ik verwacht de volgende nummers als integer terug te krijgen 41278785 (zonder spaties) en 391157213 voor rx-bytes ($counterrx) en tx-bytes ($countertx)
Ik heb het volgende geprobeerd te debuggen;
'tonum' veranderd de waarde niet (spaties blijven)
Ik heb een script gemaakt om spaties te verwijderen, echter, het script kan helemaal geen spaties vinden in de integers $counterrx and $countertx
Bij het opvragen van de lengte van de integer komt ie terug met waarde 1 ??? 8)7
Ik heb het volgende script gebruikt;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
:local counterrx [/interface ethernet get eth2-master rx-bytes]
:put "counterrx:"
:put $counterrx
:local Replacechar do={
  :for i from=0 to=([:len $1] - 1) do={
    :local char [:pick $1 $i]
    :if ($char = $2) do={
      :set $char $3
    }
    :set $output ($output . $char)
  }
  :return $output
}

:local counterrx2 [ $Replacechar $counterrx " " "" ]
:put $counterrx2
:put "counterrx length:"
:put [ len $counterrx ]
:local blub "blubblub"
:put "blubblub length:"
:put [ len $blub ]

Laatste blubblub om te checken dat de syntax echt wel juist is
Output is:
counterrx:
41 946 248
41 946 248
counterrx length:
1
blubblub length:
8
Als laatste heb ik gechecked of number $counterrx een array is en heb ik de elements geteld;
code:
1
2
3
4
:local counterrx [/interface ethernet get eth2-master rx-bytes]
:foreach nr,xxx in={$counterrx} do={
:put ("$nr=$xxx")
};

Output:
0=42 147 960
Alleen het eerste nummer wordt geteld, dit snap ik ook niet, waarschijnlijk is de code niet correct (heb ik van t mikrotik forum gehaald ergens).
Gebrobeerd nog spaties te vinden met deze code;
code:
1
2
3
4
:local posspace [ :find $counterrx " " -1]
:put $posspace
:local counterrx2 [:pick $counterrx 0 $posspace]
:put $counterrx2

maar helaas werkt dat ook niet. posspace blijft leeg en counterrx2 veranderd niet. Ik heb ook op , geprobeerd te zoeken maar zelfde gedrag (geeft exact hetzelfde getal terug met spaties)
De waarde die gegeven wordt is wel correct heb ik geverifieerd in stats in Winbox.

Kan iemand me hier aub mee helpen, helluuup

Alvast bedankt!
Maikel

PS: ik programmeer nu een aantal uurtjes met ROS (in C ?) dus ik ben nog zo groen als gras, vergeef me als ik heel essensiele fouten heb gemaakt :X

Beste antwoord (via M.E op 14-06-2017 04:21)


  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Pfft... wat een moeilijk gedoe allemaal, dat kan veel eenvoudiger :)

Bijvoorbeeld:
[user@router] > put [/interface get wan1 rx-byte]                   
5754676964656

Blog [Stackoverflow] [LinkedIn]

Alle reacties


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 29-07 21:22

Hero of Time

Moderator LNX

There is only one Legend

Lijkt eerder iets als een locale setting dat duizendtallen met een spatie ertussen weergeeft, maar feitelijk dus geen spatie bevat. Het opvragen van de lengte zegt dat eigenlijk al, 8 tekens. Er zit geen speciaal ding tussen, want dan zou het op z'n minst 10 moeten zijn.

Kan je ook met Bash werken in dit geval? Lijkt mij wel aardig om te zien wat je daarmee krijgt.

Commandline FTW | Tweakt met mate


Acties:
  • +1 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
Waarom zou de lengte van een integer niet 1 zijn? Het is onlogisch om de lengte van de representerende string te verwachten.

Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Hero of Time schreef op maandag 12 juni 2017 @ 08:00:
Lijkt eerder iets als een locale setting dat duizendtallen met een spatie ertussen weergeeft, maar feitelijk dus geen spatie bevat. Het opvragen van de lengte zegt dat eigenlijk al, 8 tekens. Er zit geen speciaal ding tussen, want dan zou het op z'n minst 10 moeten zijn.

Kan je ook met Bash werken in dit geval? Lijkt mij wel aardig om te zien wat je daarmee krijgt.
Schijnt wel te kunnen (heb t net gegoogled. maar volgens mij erg ingewikkeld.
Ik werk liever ook in Bash maar RouterOS schijnt een eigen OS te zijn, gebaseerd op C
Die ' spaties' of wat t ook zijn zijn er schijbaabr eind 2016 met een update in gekomen, in ROS
Het maakt me ook niet zoveel uit hoe die t op t scherm laat zien, maar ik kan er ook niet mee rekenen schijnbaar (bij concatenate ze, plakt ze aan elkaar volgens mij)
Mijzelf schreef op maandag 12 juni 2017 @ 10:11:
Waarom zou de lengte van een integer niet 1 zijn? Het is onlogisch om de lengte van de representerende string te verwachten.
is len in bytes dan, dus 8 bits geeft len=1 ??
Edit: Overigens zetten de zichtbare 'spaties' me waarschijnlijk op t verkeerde been, en dacht ik daarom het als string te moeten benaderen, maar als ik t omzet naar integer met 'tonum' dan blijven de spaties zichtbaar...
Maar waarom, als het integers zijn, kan ik ze dan niet optellen?
(heb ook geprobeerd om 1+4 op te tellen en dat gaat (natuurlijk) wel goed

[ Voor 13% gewijzigd door M.E op 12-06-2017 10:55 ]


Acties:
  • 0 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
M.E schreef op maandag 12 juni 2017 @ 10:52:
[...]

is len in bytes dan, dus 8 bits geeft len=1 ??
Geen idee. Om de lengte van een getal op te vragen, moet je eerst definiëren wat je ermee bedoeld. Het is hier niet het geheugengebruik in bytes, want dat zou minstens 4 zijn, gezien de grootte van de getallen.
Mogelijk is het de lengte van het array, als in RouterOS iedere variabele impliciet een array is.

Als ik zo door de documentatie kijk, heb ik de indruk dat
code:
1
set $counter ( $counterrx + $countertx )
zou moeten zijn:
code:
1
set counter ( $counterrx + $countertx )
Zo staat het tenminste in de voorbeelden. Maar ik zie nergens staan wat die dollar nou eigenlijk betekent.

Wat geeft
code:
1
:put ( $counterrx + $countertx )

Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Mijzelf schreef op maandag 12 juni 2017 @ 13:14:
[...]
Geen idee. Om de lengte van een getal op te vragen, moet je eerst definiëren wat je ermee bedoeld. Het is hier niet het geheugengebruik in bytes, want dat zou minstens 4 zijn, gezien de grootte van de getallen.
Mogelijk is het de lengte van het array, als in RouterOS iedere variabele impliciet een array is.

Als ik zo door de documentatie kijk, heb ik de indruk dat
code:
1
set $counter ( $counterrx + $countertx )
zou moeten zijn:
code:
1
set counter ( $counterrx + $countertx )
Zo staat het tenminste in de voorbeelden. Maar ik zie nergens staan wat die dollar nou eigenlijk betekent.

Wat geeft
code:
1
:put ( $counterrx + $countertx )
Dank je voor je snelle reactie weer. Fijn om met Mijzelf te praten :9
De $ is om aan te geven dat het een variabele betreft. De enige (wat ik nu weet) moment dat je m zonder $ mag gebruiken is bij het eerste keer definieren, dus
code:
1
2
:local variabele 12345      <- hier definieer je m als locale var
:put $variabele                <- dit geeft 12345 op t scherm


ik heb het volgende geprobeerd;
code:
1
set counter ( $counterrx + $countertx )

dit geeft foutmelding; "syntax error (line 7 column 6)"

code:
1
:put ( $counterrx + $countertx )

geeft hetzelfde als
code:
1
2
:set $newdata ( $counterrx + $countertx )
:put $newdata

output;
rx: 165 147 921
tx: 867 440 823
165 147 921;867 440 823
165 147 921;867 440 823
[/code]
als ik zelf 2 variabelen vul met waarden telt ie t wel goed op, dus;
code:
1
2
3
4
5
:local a 12345
:local b 54321
:local c
:set $c ($a+$b)
:put $c

geeft keurig
66666
Wat betekent die ; tussen de twee getallen
Volgens de documentatie heb je alleen de volgende variabele-typen;
num (number) - 64bit signed integer, possible hexadecimal input;
bool (boolean) - values can bee true or false;
str (string) - character sequence;
ip - IP address;
ip6-prefix - IPv6 prefix
id (internal ID) - hexadecimal value prefixed by '*' sign. Each menu item has assigned unique number - internal ID;
time - date and time value;
array - sequence of values organized in an array;
nil - default variable type if no value is assigned;

Als ik de functie 'tonum' gebruik voor het omzetten naar number, dan blijft het getal hetzelfde eruit zien.
Daar kan ik uit afleiden dat het getal waarschijnlijk al number is.

Begrijp jij de tekst in het volgende bericht?; daarin staat misschien de oplossing, maar ik begrijp inhoudelijk niet wat hij bedoeld; https://forum.mikrotik.co...82&hilit=tx+bytes#p533082

Acties:
  • +1 Henk 'm!

  • Mijzelf
  • Registratie: September 2004
  • Niet online
M.E schreef op maandag 12 juni 2017 @ 14:01:
Begrijp jij de tekst in het volgende bericht?; daarin staat misschien de oplossing, maar ik begrijp inhoudelijk niet wat hij bedoeld; https://forum.mikrotik.co...82&hilit=tx+bytes#p533082
Voor zover ik het begrijp gaat het er daar over of 'get ether1 tx-bytes' mogelijk een array teruggeeft, omdat een standaard (32 bits) integer maar tot 2 miljard gaat, wat voor tx-bytes een beetje weinig is.
Het antwoord is dat tx-bytes een 64 bits integer is, en dat die een bij een vol-belaste gigabit poort pas na 293 jaar 'vol' is.

Iets anders, zou die 'tonum' niet als return value de integer hebben, en niet de operand aanpassen?
code:
1
set $countertx [:tonum $countertx]

Acties:
  • +2 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Dit is echt idioot maar 't werkt:

code:
1
2
3
4
5
6
7
[cyber@MikroTik] /interface ethernet> :global ctr1 [:tonum [$replaceChar [:pick [/interface ethernet get sfp1 tx-bytes] 0] " " ""] ] 
[cyber@MikroTik] /interface ethernet> :put $ctr1                                                                                    
1124131538765
[cyber@MikroTik] /interface ethernet> :put [:typeof $ctr1]
num
[cyber@MikroTik] /interface ethernet> :put ($ctr1 + $ctr2) 
1671761000167

[ Voor 49% gewijzigd door CyBeR op 12-06-2017 16:18 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Mijzelf schreef op maandag 12 juni 2017 @ 14:57:
[...]

Voor zover ik het begrijp gaat het er daar over of 'get ether1 tx-bytes' mogelijk een array teruggeeft, omdat een standaard (32 bits) integer maar tot 2 miljard gaat, wat voor tx-bytes een beetje weinig is.
Het antwoord is dat tx-bytes een 64 bits integer is, en dat die een bij een vol-belaste gigabit poort pas na 293 jaar 'vol' is.

Iets anders, zou die 'tonum' niet als return value de integer hebben, en niet de operand aanpassen?
code:
1
set $countertx [:tonum $countertx]
Dat klopt inderdaad, volgens mij heeft tonum als resultaat (return value) een integer
Dank je voor je vele antwoorden, dat heeft enorm gehlopen om uiteindelijk tot de essentie te komen.
CyBeR schreef op maandag 12 juni 2017 @ 16:10:
Dit is echt idioot maar 't werkt:

code:
1
2
3
4
5
6
7
[cyber@MikroTik] /interface ethernet> :global ctr1 [:tonum [$replaceChar [:pick [/interface ethernet get sfp1 tx-bytes] 0] " " ""] ] 
[cyber@MikroTik] /interface ethernet> :put $ctr1                                                                                    
1124131538765
[cyber@MikroTik] /interface ethernet> :put [:typeof $ctr1]
num
[cyber@MikroTik] /interface ethernet> :put ($ctr1 + $ctr2) 
1671761000167
Geweldig!!
Dit is inderdaad de oplossing, das nogal een geneste constructie. Hartstikke bedankt _/-\o_
Ik ben hier zo ontzettend mee geholpen, ik kan eindelijk weer verder. Ondertussen had ik de rest van t script al klaar.
De code is als volgt (voor toekomstige bezoekers);
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#replace each character in stringvar ($1) and change from charvar ($2) to charvar ($3) 
#where $1,$2,$3 are given after replaceChar, e.g.  $replaceChar "abcdzfg" "z" "e"     
#makes $replaceChar="abcdefg". $replaceChar is a variable that is used as a function here 
:local replaceChar do={
#count from 0 to length of string -1 (start from 0) 
  :for i from=0 to=([:len $1] - 1) do={
#pick te 0,1,2,3,etc char of string and every loop put in charvar
  :local char [:pick $1 $i]
#if char to be replaced is found...
  :if ($char = $2) do={
#replace char from $2 to $3
  :set $char $3
    }
#reconstruct string
    :set $output ($output . $char)
  }
#give string back to $replaceChar
  :return $output
}
:global traffic
#read tx-bytes from interface with name "eth2-master" en remove spaces (from " " to "") with $replaceChar`
:global tx [:tonum [$replaceChar [:pick [/interface ethernet get eth2-master tx-bytes] 0] " " ""] ] 
:put "tx: $tx"
:global rx [:tonum [$replaceChar [:pick [/interface ethernet get eth2-master rx-bytes] 0] " " ""] ] 
:put "rx: $rx"
:set $traffic ( $tx + $rx )
:put "Traffic: $traffic"

Edit: commentaarregels toegevoegd zoals Hero of Time suggereerde voor betere leesbaarheid script

[ Voor 13% gewijzigd door M.E op 13-06-2017 08:17 ]


Acties:
  • +1 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 29-07 21:22

Hero of Time

Moderator LNX

There is only one Legend

Voor toekomstige bezoekers ook wel handig om je script een beetje uit te leggen. Wat regels 11 t/m 17 doen is wel te raden adhv de reacties en voorbeelden hier, maar 1 t/m 10 is dan niet zo duidelijk wat dat nou doen. ;) Sowieso is het altijd fijn om scripts van commentaar te voorzien (op de juiste manier, in bash dingen als "command options \ #comment" op een enkele regel is niet zo handig :P).

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Hero of Time schreef op maandag 12 juni 2017 @ 19:02:
Voor toekomstige bezoekers ook wel handig om je script een beetje uit te leggen. Wat regels 11 t/m 17 doen is wel te raden adhv de reacties en voorbeelden hier, maar 1 t/m 10 is dan niet zo duidelijk wat dat nou doen. ;) Sowieso is het altijd fijn om scripts van commentaar te voorzien (op de juiste manier, in bash dingen als "command options \ #comment" op een enkele regel is niet zo handig :P).
Doe ik
"command options \ #comment" op een regel is niet toegestaan/kan niet met ROS/C
Ik werk t vandaag even bij

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 29-07 21:22

Hero of Time

Moderator LNX

There is only one Legend

M.E schreef op dinsdag 13 juni 2017 @ 07:47:
"command options \ #comment" op een regel is niet toegestaan/kan niet met ROS/C
Dat zal vast. Ik noemde ook specifiek bash, omdat je dan namelijk dit soort dingen krijgt. ;)

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Hero of Time schreef op dinsdag 13 juni 2017 @ 07:54:
[...]

Dat zal vast. Ik noemde ook specifiek bash, omdat je dan namelijk dit soort dingen krijgt. ;)
Mmmm ik heb onlangs een 400+ regels script in bash geschreven op deze manier, ik zet altijd wel meerdere spaties voor het #-je. Je raad dus aan om altijd commentaarregels op 1 regel te zetten en niet achter commando's in bash?

Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 29-07 21:22

Hero of Time

Moderator LNX

There is only one Legend

M.E schreef op dinsdag 13 juni 2017 @ 07:58:
[...]

Mmmm ik heb onlangs een 400+ regels script in bash geschreven op deze manier, ik zet altijd wel meerdere spaties voor het #-je. Je raad dus aan om altijd commentaarregels op 1 regel te zetten en niet achter commando's in bash?
Lees het report eens goed door. Het is geen probleem als je "commando # uitleg" doet, maar je moet niet "commando \ # uitleg" gaan doen om op de volgende regel de opties e.d. van het commando te zetten, of in dit geval het if-statement vervolgen.

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Hero of Time schreef op dinsdag 13 juni 2017 @ 08:01:
[...]

Lees het report eens goed door. Het is geen probleem als je "commando # uitleg" doet, maar je moet niet "commando \ # uitleg" gaan doen om op de volgende regel de opties e.d. van het commando te zetten, of in dit geval het if-statement vervolgen.
Aaah check, ik snap m nu, dank en sorry :X

Acties:
  • Beste antwoord
  • +2 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Pfft... wat een moeilijk gedoe allemaal, dat kan veel eenvoudiger :)

Bijvoorbeeld:
[user@router] > put [/interface get wan1 rx-byte]                   
5754676964656

Blog [Stackoverflow] [LinkedIn]


Acties:
  • +1 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Wolfboy schreef op dinsdag 13 juni 2017 @ 12:34:
Pfft... wat een moeilijk gedoe allemaal, dat kan veel eenvoudiger :)

Bijvoorbeeld:
[user@router] > put [/interface get wan1 rx-byte]                   
5754676964656
Wtf.

[cyber@MikroTik] > put [/interface ethernet get sfp1 rx-bytes] 
608 834 437 086
[cyber@MikroTik] > put [/interface get sfp1 rx-byte]           
608834340838


Die eerste had ik uiteraard ook geprobeerd, maar je verwacht toch niet dat dat 2e wild ander gedrag vertoont.

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • +1 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Nee, dat verwacht je inderdaad niet. De mikrotik scripting taal is ook best wel waardeloos te noemen, ze beloven het flink te verbeteren bij versie 7 dus we kunnen alleen hopen.

Ik begrijp er in ieder geval ook helemaal niets van waarom er zoveel inconsistenties in de API en taal zitten.

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Wolfboy schreef op woensdag 14 juni 2017 @ 01:14:
Nee, dat verwacht je inderdaad niet. De mikrotik scripting taal is ook best wel waardeloos te noemen, ze beloven het flink te verbeteren bij versie 7 dus we kunnen alleen hopen.

Ik begrijp er in ieder geval ook helemaal niets van waarom er zoveel inconsistenties in de API en taal zitten.
Goeiedag zeg, pfffffff das inderdaad wel redelijk waardeloos te noemen :F haha
Dit maakt het wel een heel stuk leesbaarder en compacter. Hoop dat 7 dat waarmaakt wat ze beloven.
Thanx! :*)

Acties:
  • 0 Henk 'm!

  • M.E
  • Registratie: December 2010
  • Laatst online: 13-10-2020
Een link naar het Mikrotik forum waar ik zojuist mn gefabriceerde script neergezet heb;
https://forum.mikrotik.co...&t=87565&p=603513#p603513
Pagina: 1