예제 #1
0
파일: cmd_hdlr.py 프로젝트: randix/aprsna
  def handle_read(self):
    data = self.recv(1024)
    if data == '':
      self.handle_close()
      return
    log.l.LogIt('RTC006', 'D', 'cmd i: %s', (data))
    args = string.split(data)
    if len(args) == 0:
      return;
    self.mode = args[0]
    self.target = args[1]
    args = args[2:]
    log.l.LogIt('RTC007', '1', '%s', (str(args)))
    if len(args) == 0:
      return

    #--------------------
    if args[0] == 'close':
      self.senddata.append(util.close(self.mode == 'router', self.target, args[1:]))

    #--------------------
    elif args[0] == 'data':
      if self.mode == 'domain':
        self.senddata.append('command: '+args[0]+': address only to router')
      if self.mode == 'router':
        self.senddata.append(util.data(args[1:]))

    elif args[0] == 'dump':
      if self.mode == 'domain':
        self.senddata.append('command: '+args[0]+': address only to router')
      if self.mode == 'router':
        self.senddata.append(util.dump())

    #--------------------
    elif args[0] == 'event':
      if self.mode == 'domain':
        self.senddata.append('command: '+args[0]+': address only to router')
      if self.mode == 'router':
        self.senddata.append(util.event(args[1:]))

    #--------------------
    elif args[0] == 'fb' or args[0] == 'fallback' or args[0] == 'secondary':
      if len(args) > 1 and args[1] == 'auto':
        auto = 1
      else:
        auto = 0
      if self.mode == 'domain':
        cfg.domain[self.target]['fallback'] = 1
        self.senddata.append(util.switch_secondary(self.target, auto))
      if self.mode == 'router':
        for i in cfg.domain.keys():
          if cfg.domain[i]['apr'] == cfg.name:
            cfg.domain[i]['fallback'] = 1
            self.senddata.append(i+' '+util.switch_secondary(i, auto))

    #--------------------
    elif args[0] == 'ff' or args[0] == 'fallforward' or args[0] == 'primary':
      if len(args) > 1 and args[1] == 'auto':
        auto = 1
      else:
        auto = 0
      if self.mode == 'domain':
        cfg.domain[self.target]['fallback'] = 0
        self.senddata.append(util.switch_primary(self.target, auto))
      if self.mode == 'router':
        for i in cfg.domain.keys():
          if cfg.domain[i]['apr'] == cfg.name:
            cfg.domain[i]['fallback'] = 0
            self.senddata.append(i+' '+util.switch_primary(i, auto))

    #--------------------
    elif args[0] == 'pvc':
      if self.mode == 'domain':
        self.senddata.append('command: '+args[0]+': address only to router')
      if self.mode == 'router':
        self.senddata.append(util.pvc(args[1:]))

    #--------------------
    elif args[0] == 'refresh':
      evt_hdlr.refresh()
      self.senddata.append('status refreshed')

    #--------------------
    elif args[0] == 'set':
      self.senddata = util.set(self.mode == 'router', self.target, args[1:])

    #--------------------
    elif args[0] == 'sna':
      if self.mode == 'domain':
        self.senddata.append('command: '+args[0]+': address only to router')
      if self.mode == 'router':
        self.senddata.append(util.sna(args[1:]))

    #--------------------
    elif args[0] == 'status':
      if self.mode == 'domain':
        self.senddata.append(util.status(self.target))
      if self.mode == 'router':
        for i in cfg.domain.keys():
          if cfg.domain[i]['apr'] == cfg.name:
            self.senddata.append(i+' '+util.status(i))
      if len(self.senddata) == 0:
        self.senddata.append('not active')

    #--------------------
    elif args[0] == 'stop':
      if self.mode == 'domain':
        self.senddata.append('command: '+args[0]+': address only to router')
      if self.mode == 'router':
        log.l.LogIt('RTC008', 'I', 'command termination', ())
        cfg.stopping = 1
        msg = '%s terminating' % self.target
        self.senddata.append(msg)
        for i in cfg.domain.keys():
          util.closeall(i)

    #--------------------
    elif args[0] == 'trace':
      if self.mode == 'domain':
        self.senddata.append('command: '+args[0]+': address only to router')
      if self.mode == 'router':
        if len(args) > 1:
          log.l.SetTraceLevel(int(args[1]))
          self.senddata.append('trace level %s' % (args[1]))
          log.l.LogIt('RTC009', 'I', 'command trace %s', (args[1]))
        else:
          level = log.l.GetTraceLevel()
          self.senddata.append('trace level %d' % (level))
          log.l.LogIt('RTC010', 'I', 'command get trace: %d', (level))

    #--------------------
    elif args[0] == 'version':
      msg = ver.getVersion()
      if cfg.snasrv_version != '':
        msg = msg + ' snasrv: ' + cfg.snasrv_version
      self.senddata.append(msg)

    #--------------------
    else:
      self.senddata.append('command: '+args[0]+': not implemented')
예제 #2
0
파일: poll.py 프로젝트: randix/aprsna
def poll():
  global lasttime_snasrv
  global lasttime_server
  global lasttime_event
  global lasttime_atmx25
  global lasttime_refresh
  global lasttime_settime
  global lasttime_poll

  #--------------------------now
  now = int(time.time())

  sys.stdout.flush()
  sys.stderr.flush()
  if now == lasttime_poll:
    return
  lasttime_poll = now

  #--------------------------shutdown
  drain = 0

  if cfg.stopping:
    log.l.LogIt('RTP002', '1', 'stopping', ())

    # close sna server channel
    if cfg.sna_hdlr:
      cfg.sna_hdlr.handle_close()
      drain = 1

    # wait io
    if drain: return

    # close data and event channels (if open)
    if cfg.event_hdlr:
      cfg.event_ip = ''
      cfg.event_hdlr.handle_close()
      drain = 1

    if cfg.data_hdlr:
      cfg.data_ip = ''
      cfg.data_hdlr.handle_close()
      drain = 1

    # wait io
    if drain: return

    # close server channels
    for ip in cfg.servers.keys():
      if cfg.servers[ip]['cmdchan']:
        cfg.servers[ip]['cmdchan'].handle_close()
        drain = 1

    # wait io
    if drain:
      return

    # stop cmd listener
    if cfg.listeners.has_key('cmd'):
      cfg.listeners['cmd'].handle_close()
      drain = 1

    # wait io
    if drain:
      return

    cfg.counter = cfg.counter - 1
    if cfg.counter >= 0:
      log.l.LogIt('RTP003', '1', 'counter', ())
      return

    print 'socket_map', sock.socket_map        # to be found in init.log
    print 'router: cannot get here'
    sys.exit(0)

  #--------------------------check atm request timeouts
  for wsid in cfg.atm.keys():
    if cfg.atm[wsid]['gastate'] == '=':
      log.l.LogIt('RTP004', '1', '%s: wait for config server', (wsid))
      if (now - cfg.atm[wsid]['ga_conn']) > (routercfg.config):
        cfg.atm[wsid]['ga_conn'] = now 
        ga_hdlr.getdomain_next(wsid)

  #--------------------------restart ga listeners
  # Listen for client GAs
  for port in routercfg.DomainPorts:
    if not cfg.listeners.has_key(port):
      ga_hdlr.ga(port)

  #--------------------------reconnect snasrv
  if (now - lasttime_snasrv) > routercfg.snasrv:
    lasttime_snasrv = now
    if cfg.sna_use:
      if not cfg.sna_hdlr:
        sna_hdlr.sna()

  #--------------------------reconnect cfg, bnmroutc, ga, stat
  if (now - lasttime_server) > routercfg.server:
    lasttime_server = now

    # check ports, attempt to reopen as necessary
    list = cfg.servers.keys()
    list.sort()
    for ip in list:
      if not cfg.servers[ip]['cmdchan']:
        srv_hdlr.srv(ip)
      if not cfg.servers[ip]['routc']:
        routc_hdlr.bnmroutc(ip)
      else:
        cfg.servers[ip]['routc'].routcHB()

    list = cfg.atm.keys()
    list.sort()
    for wsid in list:
      # check open ga's, attempt to connect bnm as necessary
      if cfg.atm[wsid]['gastate'] == 'o' and cfg.atm[wsid]['bnmstate'] != 'o':
        ga_hdlr.gaconnect(wsid, 0)

    if not cfg.stat_hdlr:
      cfg.stat_buf = []
      evt_hdlr.stat()

  #--------------------------reconnect event and data
  if (now - lasttime_event) > routercfg.event:
    lasttime_event = now

    if not cfg.event_hdlr:
      if cfg.event_ip != '':
        evt_hdlr.event()
    else:
      if cfg.event_ip == '':
        cfg.event_hdlr.handle_close()

    if not cfg.data_hdlr:
      if cfg.data_ip != '':
        evt_hdlr.data()
    else:
      if cfg.data_ip == '':
        cfg.data_hdlr.handle_close()

  #--------------------------reconnect X25 ATMs
  if (now - lasttime_atmx25) > routercfg.atmx25:
    lasttime_atmx25 = now

    if cfg.sna_use:
      sna_hdlr.snapoll()

  #--------------------------refresh aprstat
  if routercfg.refresh:
    if (now - lasttime_refresh) > routercfg.refresh:
      lasttime_refresh = now

      evt_hdlr.refresh()