# -*- text -*-
######################################################################
#
#	In 2.0.0, radrelay functionality is integrated into the
#	server core.  This virtual server gives an example of
#	using radrelay functionality inside of the server.
#
#	In this example, the detail file is read, and the packets
#	are proxied to a home server.  You will have to configure
#	realms, home_server_pool, and home_server in proxy.conf
#	for this to work.
#
#	The purpose of this virtual server is to enable duplication
#	of information across a load-balanced, or fail-over set of
#	servers.  For example, if a group of clients lists two
#	home servers (primary, secondary), then RADIUS accounting
#	messages will go only to one server at a time.  This file
#	configures a server (primary, secondary) to send copies of
#	the accounting information to each other.
#
#	That way, each server has the same set of information, and
#	can make the same decision about the user.
#
#	$Id$
#
######################################################################

server copy-acct-to-home-server {
	listen {
		type = detail

		######################################################
		#
		#  !!!! WARNING !!!!
		#
		#  The detail file reader acts just like a NAS.
		#
		#  This means that if accounting fails, the packet
		#  is re-tried FOREVER.  It is YOUR responsibility
		#  to write an accounting policy that returns "ok"
		#  if the packet was processed properly, "fail" on
		#  a database error, AND "ok" if you want to ignore
		#  the packet (e.g. no Acct-Status-Type).
		#
		#  Neither the detail file write OR the detail file
		#  reader look at the contents of the packets.  They
		#  just either dump the packet verbatim to the file,
		#  or read it verbatim from the file and pass it to
		#  the server.
		#
		######################################################


		#  The location where the detail file is located.
		#  This should be on local disk, and NOT on an NFS
		#  mounted location!
		#
		#  On most systems, this should support file globbing
		#  e.g. "${radacctdir}/detail-*:*"
		#  This lets you write many smaller detail files as in
		#  the example in radiusd.conf: ".../detail-%Y%m%d:%H"
		#  Writing many small files is often better than writing
		#  one large file.  File globbing also means that with
		#  a common naming scheme for detail files, then you can
		#  have many detail file writers, and only one reader.
		filename = ${radacctdir}/detail

		#
		#  The server can read accounting packets from the
		#  detail file much more quickly than those packets
		#  can be written to a database.  If the database is
		#  overloaded, then bad things can happen.
		#
		#  The server will keep track of how long it takes to
		#  process an entry from the detail file.  It will
		#  then pause between handling entries.  This pause
		#  allows databases to "catch up", and gives the
		#  server time to notice that other packets may have
		#  arrived.
		#		
		#  The pause is calculated dynamically, to ensure that
		#  the load due to reading the detail files is limited
		#  to a small percentage of CPU time.  The
		#  "load_factor" configuration item is a number
		#  between 1 and 100.  The server will try to keep the
		#  percentage of time taken by "detail" file entries
		#  to "load_factor" percentage of the CPU time.
		#
		#  If the "load_factor" is set to 100, then the server
		#  will read packets as fast as it can, usually
		#  causing databases to go into overload.
		#  
		load_factor = 10
	}

	#
	#  Pre-accounting.  Decide which accounting type to use.
	#
	preacct {
		preprocess
	
		# Since we're just proxying, we don't need acct_unique.

		#
		#  Look for IPASS-style 'realm/', and if not found, look for
		#  '@realm', and decide whether or not to proxy, based on
		#  that.
		#
		#  Accounting requests are generally proxied to the same
		#  home server as authentication requests.
	#	IPASS
		suffix
	#	ntdomain
	
		#
		#  Read the 'acct_users' file.  This isn't always
		#  necessary, and can be deleted if you do not use it.
		files
	}
	
	#
	#  Accounting.  Log the accounting data.
	#
	accounting {
		   #
		   # Since we're proxying, we don't log anything
		   # locally.  Ensure that the accounting section
		   # "succeeds" by forcing an "ok" return.
		   ok	
	}
	
	
	#
	#  When the server decides to proxy a request to a home server,
	#  the proxied request is first passed through the pre-proxy
	#  stage.  This stage can re-write the request, or decide to
	#  cancel the proxy.
	#
	#  Only a few modules currently have this method.
	#
	pre-proxy {
	#	attr_rewrite
	
		#  If you want to have a log of packets proxied to a home
		#  server, un-comment the following line, and the
		#  'detail pre_proxy_log' section in radiusd.conf.
	#	pre_proxy_log
	}
	
	#
	#  When the server receives a reply to a request it proxied
	#  to a home server, the request may be massaged here, in the
	#  post-proxy stage.
	#
	post-proxy {
		#
	
		#  If you want to have a log of replies from a home
		#  server, un-comment the following line, and the
		#  'detail post_proxy_log' section in radiusd.conf.
	#	post_proxy_log
	
	#	attr_rewrite
	
		#  Uncomment the following line if you want to filter
		#  replies from remote proxies based on the rules
		#  defined in the 'attrs' file.
	
	#	attr_filter
	}
}
