Hálózati esemény kezelés

Fórumok

SUSE server alatt van olyan lehetőség, hogy ha az egyik network interface lemegy down-ba, akkor ennek hatására egy script-et lefuttasson automatikusan?

Hozzászólások

Az nem hálózati esemény a gépen belül, hülyeség rászervezni bármilyen operációs rendszer folyamatot. Ha a hoston van notification (azaz valaminek az állapota változik) akkor történik ilyen. Ha te hálózat monitorozást szeretnél az egy másik kérdés. Vannak rá programok pl. nagios. (amik tudnak notification, és cselekvést is tudnak tenni). ie: a "nem látszik, felrobban a switch" azért egy komplex probléma (meddig nem látszik, időszakos e, stb)

Ez egy ideiglenes megoldás lenne.
Az a lényeg, ha ennek a gépnek az egyik interface-e pl eth0 down-ba kerül, akkor tegye a másik pl eth1-et is abba, hogy az erre jövő forgalmat az erre küldő eszköz egy másik irányba terelje.
Tehát ha kihúzom a kábelt eth0-ból akkor eth1 mennyen down-ba. Ha lekapcsolom a switch tápját akkor eth1 menjen down-ba. Ha bedugom a kábelt vagy adok tápot a switch-nek, akkor eth1 legyen ismét vagy legyen up.
Primitív hülyeség, de én ezt szeretném egy teszt miatt.

Értem, hogy tesztelsz, de elmondhatnád, konkrétan mi a terved :D

Lehet sokkal jobb megoldások is vannak...

Polling: pazarlás
Event driving: nehézkes...

Viszont lehet lenne jobb megoldás is.
Amit én látok, hogy ha nem cross-link az eth1-ed a másik oldallal (azaz simán csak egy másik switch-be nyomtad), akkor a külvilág nem fogja érzékelni, hogy az eth1-edet lenyomtad...

Szóval mit szeretnél?

--
Debian Linux rulez... :D

Teszt célból be lett illesztve egy gép active/slave interface-es gép forgalmába, mert switch anomáliák vannak. De ha ez az interface leesés előjön, akkor ezt közölni kell ugyebár a másik oldalon lévő géppel, hogy tereljen, ha eddig erre ment minden.
Tükrözni akarom az egyik ethernet port állapotát a másikra. A gépben 3 ethernet port van így nem tűnik el örökre :)

Ezt sikerült összevadászni. Netlink nem 10 perces olvasmány :-)


#include <stdio.h>
#include <netinet/in.h>
#include <linux/rtnetlink.h>
#include <net/if.h>
#include <arpa/inet.h>

char buffer[4096];
struct nlmsghdr *nlh=(struct nlmsghdr *)buffer;
struct sockaddr_nl addr;

int main(void){
  addr.nl_family=AF_NETLINK;
  addr.nl_groups=RTMGRP_IPV4_IFADDR;
  int sock=socket(PF_NETLINK,SOCK_RAW,NETLINK_ROUTE);
  bind(sock,(struct sockaddr*)&addr,sizeof(addr));

  for( int len; 0<(len=recv(sock,nlh,4096,0)); ){
    for( ; (NLMSG_OK(nlh,len)) && (nlh->nlmsg_type != NLMSG_DONE); nlh=NLMSG_NEXT(nlh,len) ){
      if(nlh->nlmsg_type == RTM_DELADDR || nlh->nlmsg_type == RTM_NEWADDR){
        struct ifaddrmsg *ifa=(struct ifaddrmsg*) NLMSG_DATA(nlh);
        struct rtattr *rth=IFA_RTA(ifa);
        int rtl=IFA_PAYLOAD(nlh);
        for( ; rtl && RTA_OK(rth,rtl); rth=RTA_NEXT(rth,rtl) ){
          if(rth->rta_type==IFA_LOCAL){
            char name[IFNAMSIZ];
            if_indextoname(ifa->ifa_index, name);
            printf("%s %s: %s\n", name, (nlh->nlmsg_type==RTM_DELADDR?"DEL":"NEW"),
              inet_ntoa(*(struct in_addr*)RTA_DATA(rth)));
          }
        }
      }
    }
  }
  return 0;
}

A recv() addig vár, amíg a kernel nem üzen.
Futtattam a laptopomon: kihúztam a kábelt, majd visszadugtam. Összesen ez a két üzenet jött:


eth0 DEL: 192.168.1.100
eth0 NEW: 192.168.1.100

Kiírás helyett system(), és még az is lehet hogy jó lesz neked :-)

nem inkább a hálókártyának kellene pl. callback event-et generálnia ha a driver úgy érzékeli megszakadt a link? ez a mp-kénti polling-ozás a lehető legpazarlóbb megoldás, amit csak el lehet képzelni. Ha az interface ugrál le-fel 1 mp alatti időközönként, azt nem fogja érzékelni.