Source code for dhcpcanon.dhcpcaplease

# -*- coding: utf-8 -*-
# vim:ts=4:sw=4:expandtab 2
# Copyright 2016, 2017 juga (juga at riseup dot net), MIT license.
"""Lease class for the DHCP client implementation of the Anonymity Profile
([:rfc:`7844`]).."""
from __future__ import absolute_import

import logging

import attr
from attr.validators import instance_of

from .timers import (future_dt_str, gen_rebinding_time, gen_renewing_time,
                     nowutc)

from.constants import (LEASE_ATTRS2LEASE_LOG, ENV_OPTIONS_REQ)

logger = logging.getLogger('dhcpcanon')


[docs] @attr.s class DHCPCAPLease(object): """.""" address = attr.ib(default='', validator=instance_of(str)) server_id = attr.ib(default='', validator=instance_of(str)) next_server = attr.ib(default='', validator=instance_of(str)) router = attr.ib(default='', validator=instance_of(str)) subnet_mask = attr.ib(default='', validator=instance_of(str)) broadcast_address = attr.ib(default='', validator=instance_of(str)) domain = attr.ib(default='', validator=instance_of(str)) name_server = attr.ib(default='', validator=instance_of(str)) subnet = attr.ib(default='', validator=instance_of(str)) lease_time = attr.ib(default='', validator=instance_of(str)) renewal_time = attr.ib(default='', validator=instance_of(str)) rebinding_time = attr.ib(default='', validator=instance_of(str)) # not given by the server interface = attr.ib(default='', validator=instance_of(str)) # not given by the server, calculated on previous subnet_mask_cidr = attr.ib(default='', validator=instance_of(str)) network = attr.ib(default='', validator=instance_of(str)) expiry = attr.ib(default='', validator=instance_of(str)) renew = attr.ib(default='', validator=instance_of(str)) rebind = attr.ib(default='', validator=instance_of(str)) # def __attrs_post_init__(self, sent_dt): # """Initializes attributes after attrs __init__.""" # self.set_times(sent_dt)
[docs] def set_times(self, sent_dt): """ Set timers for the lease given the time in which the request was sent. [:rfc:`2131#section-4.4.1`]:: The client records the lease expiration time as the sum of the time at which the original request was sent and the duration of the lease from the DHCPACK message. """ logger.debug('Modifying Lease obj, setting timers.') elapsed = (nowutc() - sent_dt).seconds if self.renewal_time == '': self.renewal_time = gen_renewing_time(self.lease_time, elapsed) if self.rebinding_time == '': self.rebinding_time = gen_rebinding_time(self.lease_time, elapsed) self.expiry = future_dt_str(sent_dt, self.lease_time) self.renew = future_dt_str(sent_dt, self.renewal_time) self.rebind = future_dt_str(sent_dt, self.rebinding_time) logger.debug('lease time: %s, expires on %s', self.lease_time, self.expiry) logger.debug('renewal_time: %s, expires on %s', self.renewal_time, self.renew) logger.debug('rebinding time: %s, expires on %s', self.rebinding_time, self.rebind)
[docs] def info_lease(self): """Print lease information.""" for k, v in LEASE_ATTRS2LEASE_LOG. items(): logger.debug("'%s'=>'%s'", v, getattr(self, k)) for k, v in ENV_OPTIONS_REQ.items(): logger.debug("option '%s'=>'1'", k) logger.info('address %s', self.address) logger.info('plen %s (%s)', self.subnet_mask_cidr, self.subnet_mask) logger.info('gateway %s', self.router) logger.info('server identifier %s', self.server_id) logger.info('nameserver %s', self.name_server) logger.info('domain name %s', self.domain) logger.info('lease time %s', self.lease_time)