From: Arran Cudbard-Bell Date: Thu, 7 Mar 2013 19:38:18 +0000 (-0500) Subject: Add schemas and support files for IP allocation for SQLite X-Git-Tag: release_3_0_0_beta1~802 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2a71c57005ef6704b2d631cd8595bd91b68e97ee;p=thirdparty%2Ffreeradius-server.git Add schemas and support files for IP allocation for SQLite --- diff --git a/raddb/sql/ippool-dhcp/sqlite/queries.conf b/raddb/sql/ippool-dhcp/sqlite/queries.conf new file mode 100644 index 00000000000..08e0da1e648 --- /dev/null +++ b/raddb/sql/ippool-dhcp/sqlite/queries.conf @@ -0,0 +1,111 @@ +# -*- text -*- +## +## ippool.conf -- SQLite queries for rlm_sqlippool +## +## $Id$ + +# ## This series of queries allocates an IP address +# allocate-clear = "UPDATE ${ippool_table} \ +# SET nasipaddress = '', pool_key = 0, \ +# callingstationid = '', username = '', \ +# expiry_time = NULL \ +# WHERE pool_key = '${pool-key}'" + +## This series of queries allocates an IP address +## (Note: If your pool-key is set to Calling-Station-Id and not NAS-Port +## then you may wish to delete the "AND nasipaddress = '%{Nas-IP-Address}' +## from the WHERE clause) + +allocate-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, \ + callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE expiry_time <= NOW() - INTERVAL 1 SECOND \ + AND nasipaddress = '%{Nas-IP-Address}'" + + + +## The ORDER BY clause of this query tries to allocate the same IP-address +## which user had last session... +allocate-find = "SELECT framedipaddress FROM ${ippool_table} \ + WHERE pool_name = '%{control:Pool-Name}' AND (expiry_time < NOW() OR expiry_time IS NULL) \ + ORDER BY (username <> '%{User-Name}'), \ + (callingstationid <> '%{Calling-Station-Id}'), \ + expiry_time \ + LIMIT 1 \ + FOR UPDATE" + +# ## If you prefer to allocate a random IP address every time, i +# ## use this query instead +# allocate-find = "SELECT framedipaddress FROM ${ippool_table} \ +# WHERE pool_name = '%{control:Pool-Name}' \ +# AND expiry_time IS NULL \ +# ORDER BY RAND() \ +# LIMIT 1 \ +# FOR UPDATE" + + + +## If an IP could not be allocated, check to see if the pool exists or not +## This allows the module to differentiate between a full pool and no pool +## Note: If you are not running redundant pool modules this query may be +## commented out to save running this query every time an ip is not allocated. +pool-check = "SELECT id FROM ${ippool_table} \ + WHERE pool_name='%{control:Pool-Name}' LIMIT 1" + + +## This is the final IP Allocation query, which saves the allocated ip details +allocate-update = "UPDATE ${ippool_table} \ + SET nasipaddress = '%{NAS-IP-Address}', pool_key = '${pool-key}', \ + callingstationid = '%{Calling-Station-Id}', username = '%{User-Name}', \ + expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \ + WHERE framedipaddress = '%I' AND expiry_time IS NULL" + + + +## This series of queries frees an IP number when an accounting +## START record arrives +start-update = "UPDATE ${ippool_table} \ + SET expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \ + WHERE nasipaddress = '%{NAS-IP-Address}' AND pool_key = '${pool-key}' \ + AND username = '%{User-Name}' \ + AND callingstationid = '%{Calling-Station-Id}' \ + AND framedipaddress = '%{Framed-IP-Address}'" + +## This series of queries frees an IP number when an accounting +## STOP record arrives +stop-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE nasipaddress = '%{Nas-IP-Address}' AND pool_key = '${pool-key}' \ + AND username = '%{User-Name}' \ + AND callingstationid = '%{Calling-Station-Id}' \ + AND framedipaddress = '%{Framed-IP-Address}'" + + + +## This series of queries frees an IP number when an accounting +## ALIVE record arrives +alive-update = "UPDATE ${ippool_table} \ + SET expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \ + WHERE nasipaddress = '%{Nas-IP-Address}' AND pool_key = '${pool-key}' \ + AND username = '%{User-Name}' \ + AND callingstationid = '%{Calling-Station-Id}' \ + AND framedipaddress = '%{Framed-IP-Address}'" + + + +## This series of queries frees the IP numbers allocate to a +## NAS when an accounting ON record arrives +on-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE nasipaddress = '%{Nas-IP-Address}'" + +## This series of queries frees the IP numbers allocate to a +## NAS when an accounting OFF record arrives +off-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE nasipaddress = '%{Nas-IP-Address}'" + diff --git a/raddb/sql/ippool/sqlite/queries.conf b/raddb/sql/ippool/sqlite/queries.conf new file mode 100644 index 00000000000..f1c4723701b --- /dev/null +++ b/raddb/sql/ippool/sqlite/queries.conf @@ -0,0 +1,111 @@ +# -*- text -*- +## +## ippool.conf -- SQLite queries for rlm_sqlippool +## +## $Id$ + +# ## This series of queries allocates an IP address +# allocate-clear = "UPDATE ${ippool_table} \ +# SET nasipaddress = '', pool_key = 0, \ +# callingstationid = '', username = '', \ +# expiry_time = NULL \ +# WHERE pool_key = '${pool-key}'" + +## This series of queries allocates an IP address +## (Note: If your pool-key is set to Calling-Station-Id and not NAS-Port +## then you may wish to delete the "AND nasipaddress = '%{Nas-IP-Address}' +## from the WHERE clause) + + allocate-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, \ + callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE expiry_time <= NOW() - INTERVAL 1 SECOND \ + AND nasipaddress = '%{Nas-IP-Address}'" + + + +## The ORDER BY clause of this query tries to allocate the same IP-address +## which user had last session... +allocate-find = "SELECT framedipaddress FROM ${ippool_table} \ + WHERE pool_name = '%{control:Pool-Name}' AND (expiry_time < NOW() OR expiry_time IS NULL) \ + ORDER BY (username <> '%{User-Name}'), \ + (callingstationid <> '%{Calling-Station-Id}'), \ + expiry_time \ + LIMIT 1 \ + FOR UPDATE" + +# ## If you prefer to allocate a random IP address every time, i +# ## use this query instead +# allocate-find = "SELECT framedipaddress FROM ${ippool_table} \ +# WHERE pool_name = '%{control:Pool-Name}' \ +# AND expiry_time IS NULL \ +# ORDER BY RAND() \ +# LIMIT 1 \ +# FOR UPDATE" + + + +## If an IP could not be allocated, check to see if the pool exists or not +## This allows the module to differentiate between a full pool and no pool +## Note: If you are not running redundant pool modules this query may be +## commented out to save running this query every time an ip is not allocated. +pool-check = "SELECT id FROM ${ippool_table} \ + WHERE pool_name='%{control:Pool-Name}' LIMIT 1" + + +## This is the final IP Allocation query, which saves the allocated ip details +allocate-update = "UPDATE ${ippool_table} \ + SET nasipaddress = '%{NAS-IP-Address}', pool_key = '${pool-key}', \ + callingstationid = '%{Calling-Station-Id}', username = '%{User-Name}', \ + expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \ + WHERE framedipaddress = '%I' AND expiry_time IS NULL" + + + +## This series of queries frees an IP number when an accounting +## START record arrives +start-update = "UPDATE ${ippool_table} \ + SET expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \ + WHERE nasipaddress = '%{NAS-IP-Address}' AND pool_key = '${pool-key}' \ + AND username = '%{User-Name}' \ + AND callingstationid = '%{Calling-Station-Id}' \ + AND framedipaddress = '%{Framed-IP-Address}'" + +## This series of queries frees an IP number when an accounting +## STOP record arrives +stop-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE nasipaddress = '%{Nas-IP-Address}' AND pool_key = '${pool-key}' \ + AND username = '%{User-Name}' \ + AND callingstationid = '%{Calling-Station-Id}' \ + AND framedipaddress = '%{Framed-IP-Address}'" + + + +## This series of queries frees an IP number when an accounting +## ALIVE record arrives +alive-update = "UPDATE ${ippool_table} \ + SET expiry_time = NOW() + INTERVAL ${lease-duration} SECOND \ + WHERE nasipaddress = '%{Nas-IP-Address}' AND pool_key = '${pool-key}' \ + AND username = '%{User-Name}' \ + AND callingstationid = '%{Calling-Station-Id}' \ + AND framedipaddress = '%{Framed-IP-Address}'" + + + +## This series of queries frees the IP numbers allocate to a +## NAS when an accounting ON record arrives +on-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE nasipaddress = '%{Nas-IP-Address}'" + +## This series of queries frees the IP numbers allocate to a +## NAS when an accounting OFF record arrives +off-clear = "UPDATE ${ippool_table} \ + SET nasipaddress = '', pool_key = 0, callingstationid = '', username = '', \ + expiry_time = NULL \ + WHERE nasipaddress = '%{Nas-IP-Address}'" + diff --git a/raddb/sql/ippool/sqlite/schema.sql b/raddb/sql/ippool/sqlite/schema.sql new file mode 100644 index 00000000000..d567f0f3ee0 --- /dev/null +++ b/raddb/sql/ippool/sqlite/schema.sql @@ -0,0 +1,18 @@ +-- +-- Table structure for table 'radippool' +-- +CREATE TABLE ( + id int(11) PRIMARY KEY, + pool_name varchar(30) NOT NULL, + framedipaddress varchar(15) NOT NULL default '', + nasipaddress varchar(15) NOT NULL default '', + calledstationid VARCHAR(30) NOT NULL, + callingstationid VARCHAR(30) NOT NULL, + expiry_time DATETIME NULL default NULL, + username varchar(64) NOT NULL default '', + pool_key varchar(30) NOT NULL +); + +CREATE INDEX radippool_poolname_expire ON radippool(pool_name, expiry_time); +CREATE INDEX radippool_framedipaddress ON radippool(framedipaddress); +CREATE INDEX radippool_nasip_poolkey_ipaddress ON radippool(nasipaddress, pool_key, framedipaddress);