Skip to content

Commit b49b748

Browse files
authored
Merge pull request #137 from MichaelWasher/change_chewie_interface
Add __main__ and Update API with kwargs
2 parents 28cdc43 + 1766438 commit b49b748

File tree

6 files changed

+84
-43
lines changed

6 files changed

+84
-43
lines changed

chewie/__main__.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import logging
2+
import sys
3+
import argparse
4+
5+
from chewie.chewie import Chewie
6+
7+
8+
def get_logger(name, log_level=logging.DEBUG):
9+
logger = logging.getLogger(name)
10+
if not logger.handlers:
11+
logger.setLevel(log_level)
12+
ch = logging.StreamHandler(sys.stdout)
13+
ch.setLevel(log_level)
14+
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
15+
ch.setFormatter(formatter)
16+
logger.addHandler(ch)
17+
return logger
18+
19+
20+
def auth_handler(address, group_address, *args, **kwargs):
21+
logger = get_logger("CHEWIE")
22+
logger.info("Authentication successful for address {} on port {}".format(str(address), str(group_address)))
23+
logger.info("Arguments passed from Chewie to Faucet: \n*args:{}\n**kwargs{}".format(str(
24+
args), str(kwargs)))
25+
26+
27+
def failure_handler(address, group_address):
28+
print("failure of address %s on port %s" % (str(address), str(group_address)))
29+
30+
31+
def logoff_handler(address, group_address):
32+
print("logoff of address %s on port %s" % (str(address), str(group_address)))
33+
34+
35+
def main():
36+
parser = argparse.ArgumentParser(description='Run Chewie 802.1x Authenticator independently of '
37+
'Faucet SDN Controller')
38+
39+
parser.add_argument('-i', '--interface', dest='interface',
40+
help='Set the interface for Chewie to listen on - Default: eth0',
41+
default="eth0")
42+
parser.add_argument('-ri', '--radius_ip', dest='radius_ip',
43+
help='Set the IP Address for the RADIUS Server that Chewie will forward requests to '
44+
'- DEFAULT: 127.0.0.1', default='127.0.0.1')
45+
parser.add_argument('-rs', '--radius_secret', dest='radius_secret',
46+
help='Set the Secret used for connecting to the RADIUS Server - Default: SECRET',
47+
default='SECRET')
48+
args = parser.parse_args()
49+
50+
logger = get_logger("CHEWIE")
51+
logger.info('Starting Chewie...')
52+
53+
chewie = Chewie(args.interface, logger, auth_handler, failure_handler, logoff_handler,
54+
radius_server_ip=args.radius_ip, radius_server_secret=args.radius_secret)
55+
chewie.run()
56+
57+
58+
if __name__ == '__main__':
59+
main()

chewie/chewie.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ def __init__(self, interface_name, logger=None,
4444
radius_server_ip=None, radius_server_port=None, radius_server_secret=None,
4545
chewie_id=None):
4646
self.interface_name = interface_name
47-
self.log_name = logger.name + "." + Chewie.__name__
47+
self.log_name = Chewie.__name__
48+
if logger:
49+
self.log_name = logger.name + "." + Chewie.__name__
50+
4851
self.logger = get_logger(self.log_name)
4952
self.auth_handler = auth_handler
5053
self.failure_handler = failure_handler
@@ -117,15 +120,17 @@ def start_threads_and_wait(self):
117120

118121
self.pool.waitall()
119122

120-
def auth_success(self, src_mac, port_id, period, vlan_name, filter_id):
123+
def auth_success(self, src_mac, port_id, period,
124+
*args, **kwargs): # pylint: disable=unused-variable
121125
"""authentication shim between faucet and chewie
122126
Args:
123127
src_mac (MacAddress): the mac of the successful supplicant
124128
port_id (MacAddress): the 'mac' identifier of what switch port the success is on
125129
period (int): time (seconds) until the session times out.
126130
"""
131+
127132
if self.auth_handler:
128-
self.auth_handler(src_mac, port_id, vlan_name, filter_id)
133+
self.auth_handler(src_mac, port_id, *args, **kwargs)
129134

130135
self.port_to_identity_job[port_id] = self.timer_scheduler.call_later(
131136
period,

chewie/state_machines/eap_state_machine.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,8 +815,18 @@ def handle_success(self):
815815
"""Notify the success callback and sets a timer event to expire this session"""
816816
self.logger.info('Yay authentication successful %s %s',
817817
self.src_mac, self.aaa_identity.identity)
818+
819+
kwargs = {}
820+
if self.radius_tunnel_private_group_id:
821+
kwargs['vlan_name'] = self.radius_tunnel_private_group_id
822+
823+
if self.filter_id:
824+
kwargs['filter_id'] = self.filter_id
825+
818826
self.auth_handler(self.src_mac, str(self.port_id_mac),
819-
self.session_timeout, self.radius_tunnel_private_group_id, self.filter_id)
827+
self.session_timeout,
828+
**kwargs)
829+
820830
self.aaa_eap_resp_data = None
821831

822832
# new authentication so cancel the old session timeout event

chewie/state_machines/mab_state_machine.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from chewie.event import EventMessageReceived, EventRadiusMessageReceived
77
from chewie.radius import RadiusAccessAccept, RadiusAccessReject
88
from chewie.utils import get_logger, log_method, RadiusQueueMessage
9+
import chewie.radius_attributes as radius_attributes
910

1011

1112
class MacAuthenticationBypassStateMachine:
@@ -74,6 +75,7 @@ class MacAuthenticationBypassStateMachine:
7475
eth_message_data = None
7576

7677
radius_state_attribute = None
78+
# NOTE: This is not dynamic at this stage. Session timeout Attributes from radius are ignored
7779
session_timeout = DEFAULT_SESSION_TIMEOUT
7880
port_id_mac = None
7981

@@ -184,7 +186,6 @@ def reset_variables(self):
184186
self.eth_received = False
185187
self.eth_message_data = None
186188
self.aaa_response_attributes = None
187-
self.port_id_mac = None
188189

189190
def event(self, event):
190191
"""Processes an event for the state machine"""
@@ -205,7 +206,8 @@ def event(self, event):
205206
def handle_success(self):
206207
"""Handle a AAA_Success event"""
207208
self.logger.info("Successful MAB Authentication. Running Auth Handler")
208-
self.auth_handler(self.src_mac, str(self.port_id_mac), self.session_timeout, None, None)
209+
self.auth_handler(self.src_mac, str(self.port_id_mac), self.session_timeout,
210+
self.aaa_response_attributes)
209211

210212
def handle_failure(self):
211213
"""Handle a AAA_Failure event"""

run.py

Lines changed: 0 additions & 35 deletions
This file was deleted.

test/test_full_state_machine.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,8 @@ def tearDown(self):
8484
self.assertNotIn('aaaEapResp is true. but data is false. This should never happen',
8585
log.read())
8686

87-
def auth_handler(self, client_mac, port_id_mac, timer, vlan_name,
88-
filter_id): # pylint: disable=unused-argument
87+
def auth_handler(self, client_mac,
88+
port_id_mac, *args, **kwargs): # pylint: disable=unused-argument
8989
self.auth_counter += 1
9090
print('Successful auth from MAC %s' % str(client_mac))
9191

0 commit comments

Comments
 (0)