108 lines
3.1 KiB
Nix
108 lines
3.1 KiB
Nix
# https://www.crc.id.au/real-console-on-linksys-srw2024-switch/
|
|
{ self, pkgs, hostName, config, hostConfig, ... }:
|
|
with pkgs;
|
|
with lib;
|
|
''
|
|
#! ${expect}/bin/expect -f
|
|
|
|
spawn ${inetutils}/bin/telnet ${config.site.net.mgmt.hosts4.${hostName}}
|
|
expect "Password:"
|
|
send "admin\t${hostConfig.password}\r"
|
|
|
|
# ^z
|
|
send "\x1A"
|
|
expect ">"
|
|
send "lcli\r"
|
|
|
|
expect "User Name:"
|
|
send "admin\r"
|
|
expect "Password:"
|
|
send "${hostConfig.password}\r"
|
|
|
|
expect "# "
|
|
send "configure\r"
|
|
expect "(config)# "
|
|
send "hostname ${hostName}\r"
|
|
expect "(config)# "
|
|
send "port jumbo-frame\r"
|
|
expect "(config)# "
|
|
send "management vlan 4094\r"
|
|
expect "(config)# "
|
|
send "vlan database\r"
|
|
expect "(config-vlan)# "
|
|
|
|
${concatMapStrings (net: ''
|
|
send "vlan ${toString config.site.net.${net}.vlan}\r"
|
|
expect "(config-vlan)#"
|
|
'') (builtins.attrNames config.site.net)}
|
|
send "exit\r"
|
|
expect "(config)#"
|
|
|
|
${concatMapStrings (net: ''
|
|
send "interface vlan ${toString config.site.net.${net}.vlan}\r"
|
|
expect "(config-if)#"
|
|
send "name ${net}\r"
|
|
expect "(config-if)#"
|
|
send "exit\r"
|
|
expect "(config)#"
|
|
'') (builtins.attrNames config.site.net)}
|
|
|
|
${concatMapStrings (name:
|
|
let
|
|
linkConfig = hostConfig.links.${name};
|
|
isAccess = config.site.net ? ${name};
|
|
netConfig = config.site.net.${name};
|
|
isTrunk = !isAccess;
|
|
isBond = isTrunk && builtins.length linkConfig.ports > 1;
|
|
ports = concatStringsSep "," linkConfig.ports;
|
|
in
|
|
if isTrunk && isBond
|
|
then ''
|
|
send "interface range ethernet ${ports}\r"
|
|
expect "(config-if)#"
|
|
send "switchport trunk allowed vlan remove all\r"
|
|
expect "(config-if)#"
|
|
send "channel-group ${linkConfig.group} mode auto\r"
|
|
expect "(config-if)#"
|
|
send "interface port-channel ${linkConfig.group}\r"
|
|
expect "(config-if)#"
|
|
send "exit\r"
|
|
|
|
send "interface port-channel ${linkConfig.group}\r"
|
|
expect "(config-if)#"
|
|
send "switchport mode trunk\r"
|
|
expect "(config-if)#"
|
|
send "switchport trunk allowed vlan add ${concatStringsSep "," (map toString linkConfig.vlans)}\r"
|
|
expect "(config-if)#"
|
|
|
|
send "exit\r"
|
|
expect "(config)#"
|
|
''
|
|
else if isTrunk
|
|
then concatMapStrings (port: ''
|
|
send "interface ethernet ${port}\r"
|
|
expect "(config-if)#"
|
|
send "no channel-group\r"
|
|
expect "(config-if)#"
|
|
send "switchport mode trunk\r"
|
|
expect "(config-if)#"
|
|
send "switchport trunk allowed vlan add ${concatStringsSep "," (map toString linkConfig.vlans)}\r"
|
|
expect "(config-if)#"
|
|
send "exit\r"
|
|
expect "(config)#"
|
|
'') linkConfig.ports
|
|
else concatMapStrings (port: ''
|
|
send "interface ethernet ${port}\r"
|
|
expect "(config-if)#"
|
|
send "no channel-group\r"
|
|
expect "(config-if)#"
|
|
send "switchport mode access\r"
|
|
expect "(config-if)#"
|
|
send "switchport access vlan ${toString netConfig.vlan}\r"
|
|
expect "(config-if)#"
|
|
send "exit\r"
|
|
expect "(config)#"
|
|
'') linkConfig.ports
|
|
) (builtins.attrNames hostConfig.links)}
|
|
''
|