진짜 간단한 문제인 데, 이것 때문에 이틀 날렸음;;
setting 값에 use_query_string : true, 를 추가.
위의 값은 기본이 false 이므로 추가가 필요하고,
addPostParam 뿐만 아니라,post_params를 이용하기 위해서도 true로 설정 해야 한다.
2012년 10월 31일 수요일
2012년 10월 11일 목요일
L2 스위치 포트별 아이피 찾기 프로그램 (포트매핑)
L2 스위치에선 포트별 아이피를 찾을 수 없는 데, 이걸 L3장비와 연계하여 찾는 프로그램(포트매핑)을 만들어 봤다.
포항공과대학의 김은희님이 쓰신 논문이 유용한 자료가 되었다.
해당 논문에서 처럼 제대로 된 프로그램으로 만들고 싶지만, 이미 상용프로그램이 많은 상황에서 그정도의 퀄리티를 뛰어넘을 자신도 없고, 그냥 구현 해 본데에 의의를 둔다.
이미 상용으로 솔라윈즈나 OpUtils 등에 해당 기능이 포함되어 있다.
솔라윈즈의 switch port mapper 프로그램과 비교하여 보니, 정확히 비슷하진 않지만, 얼추 맞는 것으로 보인다.
문제 있을 수 있는점.
1. vlan 별로 별도 지정이 안되있어서, vlan을 추가한 L2장비에서는 어떻게 될 지 모르겠다.
2. 구글 검색하다가 보게 된건데, 시스코외의 장비에서는 조금 다른 MIB 를 사용하고 있는 것 같다.(표준MIB라고 해서 사용하기 했는 데, 잘 모르겠다.)
ps.
php 를 통해 구현했는데, 보통 호스팅으로 사용하는 서버에는 snmp 내장함수가 설치되어 있지 않다.
DEMO
다운로드
포항공과대학의 김은희님이 쓰신 논문이 유용한 자료가 되었다.
해당 논문에서 처럼 제대로 된 프로그램으로 만들고 싶지만, 이미 상용프로그램이 많은 상황에서 그정도의 퀄리티를 뛰어넘을 자신도 없고, 그냥 구현 해 본데에 의의를 둔다.
이미 상용으로 솔라윈즈나 OpUtils 등에 해당 기능이 포함되어 있다.
솔라윈즈의 switch port mapper 프로그램과 비교하여 보니, 정확히 비슷하진 않지만, 얼추 맞는 것으로 보인다.
문제 있을 수 있는점.
1. vlan 별로 별도 지정이 안되있어서, vlan을 추가한 L2장비에서는 어떻게 될 지 모르겠다.
2. 구글 검색하다가 보게 된건데, 시스코외의 장비에서는 조금 다른 MIB 를 사용하고 있는 것 같다.(표준MIB라고 해서 사용하기 했는 데, 잘 모르겠다.)
ps.
php 를 통해 구현했는데, 보통 호스팅으로 사용하는 서버에는 snmp 내장함수가 설치되어 있지 않다.
DEMO
다운로드
2012년 10월 2일 화요일
MRTG cpu,mem,hdd,load average,active user, process,traffic 템플릿
아래의 출처에서 다운받은 템플릿.
해당 템플릿을 다운 받고 cfgmaker 에서 옵션을 --host-template=host-generic.htp 추가하여 사용하면된다.
다만 해당사이트에서 다운받은 템플릿으로 생성한 cfg 파일을 indexmaker로 만들때 아래와 같은 에러메시지가 뜬다.
ERROR: no H1 line pagetop property in 아이피-memory section
indexmaker에서 pagetop 옵션에는 H1 태그로 찾는 게 기본값인데, 해당 템플릿에서는 H1 지정이 안되어 있다.
해당 문제는 -section 옵션으로 해결할 수 있다.
아래의 옵션중에 h1 외의 옵션으로 설정하여 실행하면 된다.
- section = h1 섹션의 헤딩으로 PageTop에 h1 태그를 사용 (기본값) - section = title 그래프 섹션 헤딩으로 Title을 사용 - section = name 섹션 헤딩으로 그래프 이름을 사용 - section = descr 섹션 헤딩으로 그래프 description을 사용 - section = portname 섹션 헤딩으로 PageTop에 port 이름 항목을 사용
아래는 H1 태그 추가한 버젼.
# Generic host template for all systems support MIB-II host resources# MIB. Will take care of storage devices as well, but watch out for# changes in enumeration caused by inserting USB devices!# Watch out for lines being wrapped by broken editing software$head_lines .= "#---------------------------------------------------------------------\n";if( $sysdescr =~ /linux/i ) { $target_lines .= "routers.cgi*Icon: linux-sm.gif\n";} elsif( $sysdescr =~ /(windows|microsoft)/i ) { $target_lines .= "routers.cgi*Icon: windows-sm.gif\n";} elsif( $sysdescr =~ /IBM/i ) { $target_lines .= "routers.cgi*Icon: aix-sm.gif\n";} elsif( $sysdescr =~ /(sun|solaris)/i ) { $target_lines .= "routers.cgi*Icon: sun-sm.gif\n";} elsif( $sysdescr =~ /cisco/i ) { $target_lines .= "routers.cgi*Icon: cisco-sm.gif\n";}$target_lines .= <<ECHO;routers.cgi*Description: $router_name ($sysname)routers.cgi*ShortDesc: $sysname#-------------------------------------------------ECHOmy($cpuoid) = oid_pick($router_connect,$v3opt,"1.3.6.1.4.1.2021.11.11.0", "1.3.6.1.4.1.9.2.1.58.0");if($cpuoid) { # this uses the UCD MIB or Cisco MIB$target_lines .= <<ECHO;######################################## CPU loadTarget[$router_name-cpu]: 100 - $cpuoid&$cpuoid:$router_connectPageTop[$router_name-cpu]: <H1>$router_name CPU usage</H1>Title[$router_name-cpu]: CPU on $router_nameMaxbytes[$router_name-cpu]: 100Options[$router_name-cpu]: gaugeYLegend[$router_name-cpu]: percentShortLegend[$router_name-cpu]: %LegendI[$router_name-cpu]: cpu:Legend1[$router_name-cpu]: CPU usageLegend3[$router_name-cpu]: Peak CPU usagerouters.cgi*Options[$router_name-cpu]: noo, nopercent, nototal, fixunitrouters.cgi*InOut[$router_name-cpu]: norouters.cgi*ShortDesc[$router_name-cpu]:CPUrouters.cgi*Icon[$router_name-cpu]: chip-sm.gifrouters.cgi*InSummary[$router_name-cpu]: yesrouters.cgi*InCompact[$router_name-cpu]: yesrouters.cgi*Mode[$router_name-cpu]: cpurouters.cgi*MBLegend[$router_name-cpu]: 100% usageECHO} else { # lets try hrMIB my (@cpus) = snmpwalk($router_connect,'1.3.6.1.2.1.25.3.3.1.2'); foreach my $tmpcpu (@cpus) { $tmpcpu =~ /(\d+):\d/; my( $instance )=$1; my( $target_name )=$router_name.".cpu".$instance; $target_lines .= <<ECHO;Target[$target_name]: 1.3.6.1.2.1.25.3.3.1.2.$instance&1.3.6.1.2.1.25.3.3.1.2.$instance:$router_connectTitle[$target_name]: $sysname processor $instanceMaxBytes[$target_name]: 100Options[$target_name]: gauge, unknaszero, nooDirectory[$target_name]: $directory_nameWithPeak[$target_name]: wmyYLegend[$target_name]: % UtilisationShortLegend[$target_name]: %Legend1[$target_name]: 1min CPU load on proc$instanceLegend3[$target_name]: Max 5min CPU load on proc$instanceLegendI[$target_name]: cpu$instance:PageTop[$target_name]: <H1>$sysname Processor Load</H1>routers.cgi*ShortDesc[$target_name]: CPU #$instancerouters.cgi*Options[$target_name]: nopercent, nototal, fixunitrouters.cgi*InOut[$target_name]: norouters.cgi*Icon[$target_name]: chip-sm.gifrouters.cgi*InSummary[$target_name]: yesrouters.cgi*InCompact[$target_name]: yesrouters.cgi*Mode[$target_name]: cpurouters.cgi*MBLegend[$target_name]: 100% usageECHO if($#cpus > 0) { $target_lines .= "routers.cgi*Graph[$target_name]: $router_name-allcpu average\n"; $target_lines .= "routers.cgi*InMenu[$target_name]: no\n"; } } if($#cpus > 0) { $target_lines .= <<ECHO;routers.cgi*Title[$router_name-allcpu]: All CPUs on $router_namerouters.cgi*Icon[$router_name-allcpu]: chip-sm.gifrouters.cgi*ShortDesc[$router_name-allcpu]: CPUrouters.cgi*LegendAI[$router_name-allcpu]: cpu :ECHO }}my($rmemoid) = oid_pick($router_connect,$v3opt,"1.3.6.1.4.1.2021.4.6.0");my($smemoid) = oid_pick($router_connect,$v3opt,"1.3.6.1.4.1.2021.4.4.0");if($rmemoid and $smemoid) { # this uses the UCD MIBmy($maxreal, $maxswap) = snmpget($router_connect, "1.3.6.1.4.1.2021.4.5.0","1.3.6.1.4.1.2021.4.3.0");$target_lines .= <<ECHO;######################################## Memory usedTarget[$router_name-memory]: $rmemoid&$smemoid:$router_connect * 1024PageTop[$router_name-memory]: <H1>$router_name Memory Available </H1>Title[$router_name-memory]: Available Memory on $router_nameSetEnv[$router_name-memory]: MRTG_INT_DESCR="Memory"MaxBytes1[$router_name-memory]: $maxrealMaxBytes2[$router_name-memory]: $maxswapOptions[$router_name-memory]: gaugeYLegend[$router_name-memory]: BytesShortLegend[$router_name-memory]: bLegendI[$router_name-memory]: real:LegendO[$router_name-memory]: swap:Legend1[$router_name-memory]: Available real memoryLegend2[$router_name-memory]: Available swap spaceLegend3[$router_name-memory]: Peak available realLegend4[$router_name-memory]: Peak available swaprouters.cgi*Options[$router_name-memory]: nototalrouters.cgi*Mode[$router_name-memory]: memoryrouters.cgi*ShortDesc[$router_name-memory]: Memoryrouters.cgi*Description[$router_name-memory]: Memory available: $router_namerouters.cgi*InOut[$router_name-memory]: norouters.cgi*InSummary[$router_name-memory]: yesrouters.cgi*InCompact[$router_name-memory]: yesrouters.cgi*Icon[$router_name-memory]: chip-sm.gifrouters.cgi*MBLegend[$router_name-memory]: 100% usageECHO}my (@storage) = snmpwalk($router_connect,'1.3.6.1.2.1.25.2.3.1.4');my( $fscnt ) = 0;foreach my $tmps (@storage) { $tmps =~ /(\d+):(\d+)/; next if(!$2); my($instance,$blocksize)=($1,$2); my($diskname,$disksize,$disktype) = snmpget($router_connect,'1.3.6.1.2.1.25.2.3.1.3.'.$instance, '1.3.6.1.2.1.25.2.3.1.5.'.$instance, '1.3.6.1.2.1.25.2.3.1.2.'.$instance); $disktype = $1 if($disktype =~ /\.(\d+)$/); next if(!$diskname or !$disksize or ($disktype!=2 and $disktype!=3 and $disktype!=4)); my($shortdisk) = $instance; $shortdisk = $1 if($diskname =~ /^(\w):/); my($target_name)=$router_name.".disk.".$shortdisk; my($maxsize)= $disksize * $blocksize; if($disktype == 2 ) { # memory use next if($rmemoid); # we already have it $target_lines .= <<ECHO;######################################## Memory usedTarget[$router_name-memory]: 1.3.6.1.2.1.25.2.3.1.6.$instance&1.3.6.1.2.1.25.2.3.1.5.$instance:$router_connect * $blocksizePageTop[$router_name-memory]: <H1>$router_name Memory Used</H1>Title[$router_name-memory]: Memory used on $router_nameSetEnv[$router_name-memory]: MRTG_INT_DESCR="Memory"MaxBytes[$router_name-memory]: $maxsizeOptions[$router_name-memory]: gaugeYLegend[$router_name-memory]: BytesShortLegend[$router_name-memory]: bLegendI[$router_name-memory]: used:LegendO[$router_name-memory]: size:Legend1[$router_name-memory]: Memory usedLegend2[$router_name-memory]: Memory totalLegend3[$router_name-memory]: Peak memory usedLegend4[$router_name-memory]: Peak memory totalrouters.cgi*Options[$router_name-memory]: nototal noorouters.cgi*Mode[$router_name-memory]: memoryrouters.cgi*ShortDesc[$router_name-memory]: Memoryrouters.cgi*Description[$router_name-memory]: Memory used: $router_namerouters.cgi*InOut[$router_name-memory]: norouters.cgi*InSummary[$router_name-memory]: yesrouters.cgi*InCompact[$router_name-memory]: yesrouters.cgi*Icon[$router_name-memory]: chip-sm.gifrouters.cgi*MBLegend[$router_name-memory]: 100% usageECHO } elsif($disktype == 3 ) { # swap use next if($smemoid); $target_lines .= <<ECHO;######################################## Swap usedTarget[$router_name-swap]: 1.3.6.1.2.1.25.2.3.1.6.$instance&1.3.6.1.2.1.25.2.3.1.5.$instance:$router_connect * $blocksizePageTop[$router_name-swap]: <H1>$router_name Swap space used</H1>Title[$router_name-swap]: Swap space used on $router_nameSetEnv[$router_name-swap]: MRTG_INT_DESCR="Swap"MaxBytes[$router_name-swap]: $maxsizeOptions[$router_name-swap]: gaugeYLegend[$router_name-swap]: BytesShortLegend[$router_name-swap]: bLegendI[$router_name-swap]: used:LegendO[$router_name-swap]: size:Legend1[$router_name-swap]: Swap space usedLegend2[$router_name-swap]: Swap space totalLegend3[$router_name-swap]: Peak swap usedLegend4[$router_name-swap]: Peak swap totalrouters.cgi*Options[$router_name-swap]: nototal noorouters.cgi*Mode[$router_name-swap]: memoryrouters.cgi*ShortDesc[$router_name-swap]: Swaprouters.cgi*Description[$router_name-swap]: Swap space used: $router_namerouters.cgi*InOut[$router_name-swap]: norouters.cgi*InSummary[$router_name-swap]: yesrouters.cgi*InCompact[$router_name-swap]: yesrouters.cgi*Icon[$router_name-swap]: chip-sm.gifrouters.cgi*MBLegend[$router_name-swap]: 100% usageECHO } elsif($disktype == 4 ) { # filesystems $fscnt += 1;$target_lines .= <<ECHO;######################################## Filesystem $disknameTarget[$target_name]: 1.3.6.1.2.1.25.2.3.1.6.$instance&1.3.6.1.2.1.25.2.3.1.6.$instance:$router_connect * $blocksizePageTop[$target_name]: <H1>$router_name Disk space used ($diskname)</H1>Title[$target_name]: Disk space used on $router_name ($diskname)SetEnv[$target_name]: MRTG_INT_DESCR="$diskname"MaxBytes[$target_name]: $maxsizeOptions[$target_name]: gaugeYLegend[$target_name]: BytesShortLegend[$target_name]: bLegendI[$target_name]: used:Legend1[$target_name]: Space usedLegend3[$target_name]: Peak usedrouters.cgi*Options[$target_name]: nototal, noorouters.cgi*Mode[$target_name]: generalrouters.cgi*ShortDesc[$target_name]: Disk: $disknamerouters.cgi*Description[$target_name]: $router_name space used on $disknamerouters.cgi*InOut[$target_name]: norouters.cgi*InMenu[$target_name]: yesrouters.cgi*InSummary[$target_name]: yesrouters.cgi*InCompact[$target_name]: yesrouters.cgi*Icon[$target_name]: dir-sm.gifrouters.cgi*Graph[$target_name]: $router_name-filesystems "Disk space" withtotal nooECHO }}if($fscnt) {$target_lines .= <<ECHO;routers.cgi*Options[$router_name-filesystems]: availablerouters.cgi*Icon[$router_name-filesystems]: dir-sm.gifrouters.cgi*ShortDesc[$router_name-filesystems]: Filesystemsrouters.cgi*Title[$router_name-filesystems]: Filesystems on $router_nameECHO}my($laoid) = oid_pick($router_connect,$v3opt,"1.3.6.1.4.1.2021.10.1.5.2");my($laoid2) = oid_pick($router_connect,$v3opt,"1.3.6.1.4.1.2021.10.1.5.3");if($laoid and $laoid2) { # this uses the UCD MIB$target_lines .= <<ECHO;######################################## Load averageTarget[$router_name-lavg]: $laoid&$laoid2:$router_connect / 100PageTop[$router_name-lavg]: <H1>$router_name Load Average</H1>Title[$router_name-lavg]: Load Average on $router_nameSetEnv[$router_name-lavg]: MRTG_INT_DESCR="Load Average"MaxBytes[$router_name-lavg]: 1000Options[$router_name-lavg]: nopercent, gaugeYLegend[$router_name-lavg]: ProcessesShortLegend[$router_name-lavg]: &nbsp;LegendI[$router_name-lavg]: 5min avg:LegendO[$router_name-lavg]: 15min avg:Legend1[$router_name-lavg]: 5-min load averageLegend2[$router_name-lavg]: 15-min load averageLegend3[$router_name-lavg]: Peak 5-min load averageLegend4[$router_name-lavg]: Peak 15-min load averagerouters.cgi*Options[$router_name-lavg]: nomax, nototal, fixunit, noorouters.cgi*Mode[$router_name-lavg]: generalrouters.cgi*ShortDesc[$router_name-lavg]: Load Avgrouters.cgi*Description[$router_name-lavg]: Load average: $router_namerouters.cgi*UnScaled[$router_name-lavg]: nonerouters.cgi*WithPeak[$router_name-lavg]: nonerouters.cgi*InOut[$router_name-lavg]: norouters.cgi*InSummary[$router_name-lavg]: yesrouters.cgi*InCompact[$router_name-lavg]: norouters.cgi*Icon[$router_name-lavg]: load-sm.gifECHO}my($ucoid) = oid_pick($router_connect,$v3opt,"1.3.6.1.2.1.25.1.5.0");if($ucoid) {$target_lines .= <<ECHO;######################################## User countTarget[$router_name-users]: $ucoid&$ucoid:$router_connectPageTop[$router_name-users]: <H1>$router_name Active users</H1>Title[$router_name-users]: Active Users on $router_nameMaxBytes[$router_name-users]: 1000SetEnv[$router_name-users]: MRTG_INT_DESCR="Users"Options[$router_name-users]: nopercent, gaugeYLegend[$router_name-users]: UsersShortLegend[$router_name-users]: &nbsp;LegendI[$router_name-users]: UsersLegend1[$router_name-users]: Active UsersLegend3[$router_name-users]: Peak Active Usersrouters.cgi*Options[$router_name-users]: nomax, nototal, fixunit, noorouters.cgi*Mode[$router_name-users]: generalrouters.cgi*ShortDesc[$router_name-users]: Usersrouters.cgi*Description[$router_name-users]: Users on $router_namerouters.cgi*UnScaled[$router_name-users]: nonerouters.cgi*InOut[$router_name-users]: norouters.cgi*InSummary[$router_name-users]: yesrouters.cgi*InCompact[$router_name-users]: norouters.cgi*Icon[$router_name-users]: user-sm.gifECHO}my($proid) = oid_pick($router_connect,$v3opt,"1.3.6.1.2.1.25.1.6.0");if($proid) {my($maxpr) = snmpget($router_connect, "1.3.6.1.2.1.25.1.7.0");$target_lines .= <<ECHO;######################################## Process countTarget[$router_name-procs]: $proid&$proid:$router_connectPageTop[$router_name-procs]: <H1>$router_name Processes</H1>Title[$router_name-procs]: Processes on $router_nameECHOif($maxpr) { $target_lines .= "MaxBytes[$router_name-procs]: $maxpr\n";} else { $target_lines .= "MaxBytes[$router_name-procs]: 10000\n";}$target_lines .= "routers.cgi*Options[$router_name-procs]: nototal, fixunit, noo" .($maxpr?"":", nomax")."\n";$target_lines .= <<ECHO;SetEnv[$router_name-procs]: MRTG_INT_DESCR="Procs"Options[$router_name-procs]: nopercent, gaugeYLegend[$router_name-procs]: ProcessesShortLegend[$router_name-procs]: &nbsp;LegendI[$router_name-procs]: ProcsLegend1[$router_name-procs]: ProcessesLegend3[$router_name-procs]: Peak Processesrouters.cgi*Mode[$router_name-procs]: generalrouters.cgi*ShortDesc[$router_name-procs]: Processesrouters.cgi*Description[$router_name-procs]: Processes on $router_namerouters.cgi*UnScaled[$router_name-procs]: nonerouters.cgi*InOut[$router_name-procs]: norouters.cgi*InSummary[$router_name-procs]: yesrouters.cgi*InCompact[$router_name-procs]: norouters.cgi*Icon[$router_name-procs]: list-sm.gifrouters.cgi*MBLegend[$router_name-procs]: Max capacityECHO}
mrtg cfgmaker 팁
시스코 스위치 vlan 값 주석 처리.
cfgmaker 옵션에 '-if-filter=(!$if_is_ciscovlan)' 를 준다.
예제)
[sourcecode]
cfgmaker --global 'WorkDir:/home/mrtg/test/138' --global 'Language:korean' --global 'Options[_]: bits,growright' --output '/home/mrtg/test/cfgmaker/cfg_test4.cfg' '-if-filter=(!$if_is_ciscovlan)' 커뮤니티@아이피
[/sourcecode]
cfgmaker 옵션에 '-if-filter=(!$if_is_ciscovlan)' 를 준다.
예제)
[sourcecode]
cfgmaker --global 'WorkDir:/home/mrtg/test/138' --global 'Language:korean' --global 'Options[_]: bits,growright' --output '/home/mrtg/test/cfgmaker/cfg_test4.cfg' '-if-filter=(!$if_is_ciscovlan)' 커뮤니티@아이피
[/sourcecode]
피드 구독하기:
글 (Atom)