docs: def setup_beacons(self, before_connect=False):
          '''
          Set up the beacons.
          This is safe to call multiple times.
          '''
          self._setup_core()
  
          loop_interval = self.opts['loop_interval']
          new_periodic_callbacks = {}
  
          if 'beacons' not in self.periodic_callbacks:
              self.beacons = salt.beacons.Beacon(self.opts, self.functions)
  
              def handle_beacons():
                  # Process Beacons
                  beacons = None
                  try:
                      beacons = self.process_beacons(self.functions)
                  except Exception:
                      log.critical('The beacon errored: ', exc_info=True)
                  if beacons and self.connected:
                      self._fire_master(events=beacons)
  
              new_periodic_callbacks['beacons'] = tornado.ioloop.PeriodicCallback(
                      handle_beacons, loop_interval * 1000)
              if before_connect:
                  # Make sure there is a chance for one iteration to occur before connect
                  handle_beacons()
  
          if 'cleanup' not in self.periodic_callbacks:
              new_periodic_callbacks['cleanup'] = tornado.ioloop.PeriodicCallback(
                      self._fallback_cleanups, loop_interval * 1000)
  
          # start all the other callbacks
          for periodic_cb in six.itervalues(new_periodic_callbacks):
              periodic_cb.start()
  
          self.periodic_callbacks.update(new_periodic_callbacks)