Freeside:3:Documentation:Developer/FS/IP Mixin
From Freeside
Contents
NAME
FS::IP_Mixin - Mixin class for objects that have IP addresses assigned.
INTERFACE
The inheritor may provide the following methods:
- ip_addr [ ADDRESS ]
- Get/set the IP address, as a string. If the inheritor is also an FS::Record subclass and has an 'ip_addr' field, that field will be used. Otherwise an ip_addr method must be defined.
- addr_block [ BLOCK ]
- Get/set the address block, as an FS::addr_block object. By default, the 'blocknum' field will be used.
- router [ ROUTER ]
- Get/set the router, as an FS::router object. By default, the 'routernum' field will be used. This is strictly optional; if present the IP address can be assigned from all those available on a router, rather than in a specific block.
- _used_addresses [ BLOCK ]
- Return a list of all addresses in use (within BLOCK, if it's specified). The inheritor should cache this if possible.
- _is_used ADDRESS
- Test a specific address for availability. Should return an empty string if it's free, or else a description of who or what is using it.
METHODS
- ip_check
- The method that should be called from check() in the subclass. This does the following:
- - In an auto_router situation, sets the router and block to match the object's IP address. - Otherwise, if the router and IP address are both set, validate the choice of router and set the block correctly. - Otherwise, if the router is set, assign an address (in the selected block if there is one). - Check the IP address for availability.
- Returns an error if this fails for some reason (an address can't be assigned from the requested router/block, or the requested address is unavailable, or doesn't seem to be an IP address).
- If router and IP address are both empty, this will do nothing. The object's check() method should decide whether to allow a null IP address.
- assign_ip_addr
- Set the IP address to a free address in the selected block (addr_block) or router (router) for this object. A block or router MUST be selected. If the object already has an IP address and it is in that block/router's address space, it won't be changed.
- assign_router
- If the IP address is set, set the router and block accordingly. If there is no block containing that address, returns an error.
- check_ip_addr
- Validate the IP address. Returns an empty string if it's correct and available (or null), otherwise an error message.
- used_addresses [ BLOCK ]
- Returns a list of all addresses (in BLOCK, or in all blocks) that are in use. If called as an instance method, excludes that instance from the search.
- is_used ADDRESS
- Returns a string describing what object is using ADDRESS, or an empty string if it's not in use.
BUGS
We can't reliably check for duplicate addresses across tables. A more robust implementation would be to put all assigned IP addresses in a single table with a unique index. We do a best-effort check anyway, but it has a race condition.