Skip to content

Commit

Permalink
Add en_version
Browse files Browse the repository at this point in the history
  • Loading branch information
shendr404 committed Aug 23, 2024
1 parent 5e5b457 commit bdf54a5
Show file tree
Hide file tree
Showing 3 changed files with 278 additions and 36 deletions.
115 changes: 104 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,111 @@
# Сisco Auto Cdp Description

[English](#english) | [Русский](#русский)

## English

Cisco Auto Cdp Description is a script for automating the configuration of Cisco switches, allowing bulk interface description setup based on data obtained through the proprietary CDP (Cisco Discovery Protocol). The script facilitates easy management of multiple switches using IP ranges and includes a mechanism for handling authentication and privileged access errors.

### Features

- **Bulk Configuration:** Ability to configure multiple switches using an IP range.
- **Authentication:** Supports login and password with optional enable password support.
- **Error Handling:** If authentication errors or the need for an enable password occur, the script will prompt for re-entry of the necessary information.
- **Flexibility:** The script works with Cisco switches that support `show cdp neighbors detail`.
- **Color-coded Output:** Interactive and informative output using ANSI codes for event indication.

### Installation

#### Option 1: Using a Virtual Environment (venv)
1. Clone the repository:
```bash
git clone https://github.com/shendr404/cisco-auto-cdp-description.git
```
2. Navigate to the project directory:
```bash
cd cisco-auto-cdp-description
```
3. Create a virtual environment:
```bash
python3 -m venv venv
```
4. Activate the virtual environment:
- On Windows:
```bash
venv\Scripts\activate
```
- On macOS/Linux:
```bash
source venv/bin/activate
```

#### Option 2: Run in the System Shell
1. Clone the repository:
```bash
git clone https://github.com/shendr404/cisco-auto-cdp-description.git
```
2. Navigate to the project directory:
```bash
cd CiscoAutoConfig
```
3. Install the required dependencies (if needed):
```bash
pip install netmiko
```

### Usage
1. Run the script:
```bash
python en/cdp_description.py
```
2. Enter the IP address or range of IP addresses for the switches you want to configure (e.g., 192.168.0.1 or 192.168.0.1-192.168.0.10).
3. Enter the login, password, and, if necessary, the enable password to connect to the switches.
4. The script will automatically connect to all switches within the specified range, gather information about neighboring devices via CDP, and configure the interface descriptions.

### Error Handling
- If any errors occur during connection or when entering configuration mode, the script will notify you and prompt for re-entry of the necessary information.
- If an enable password was not provided at the start but is required during the script's execution, you will be prompted to enter it.
### Example Usage
```plaintext
Enter the IP address or range of IP addresses (e.g., 192.168.0.1-192.168.0.10): 192.168.0.1-192.168.0.10
Enter login: admin
Enter password: password
Is an enable password required? (y/n): y
Enter enable password: enablepassword
```
After entering the information, the script will sequentially connect to each switch in the range, configure the interfaces, and save the configuration.
### Requirements
- Python 3.6+
- `netmiko` module
### License
This project is licensed under the GPL-3.0 License — see the [LICENSE](https://github.com/shendr404/cisco-auto-cdp-description/blob/main/LICENSE) file for details.
### Support
If you have any questions or suggestions, you can contact the author via [GitHub Issues](https://github.com/shendr404/cisco-auto-cdp-description/issues).
Author: [shendr404](https://github.com/shendr404)
## Русский
Сisco Auto Cdp Description — это скрипт автоматизации настройки коммутаторов Cisco, который позволяет выполнять массовую настройку описания интерфейсов на основе данных, полученных с помощью проприетарного протокола CDP (Cisco Discovery Protocol). Скрипт позволяет легко управлять большим количеством коммутаторов, используя IP-диапазоны, и включает механизм обработки ошибок аутентификации и привилегированного доступа.
## Особенности
### Особенности
- **Массовая настройка**: Возможность конфигурации нескольких коммутаторов по диапазону IP-адресов.
- **Аутентификация**: Поддержка логина и пароля с возможностью использования enable пароля.
- **Обработка ошибок**: При возникновении ошибок аутентификации или необходимости использования enable пароля скрипт предложит повторный ввод данных.
- **Гибкость**: Скрипт работает с коммутаторами Cisco, поддерживающими `show cdp neighbors detail`.
- **Цветной вывод**: Интерактивный и информативный вывод с использованием ANSI-кодов для цветовой индикации событий.
## Установка
### Установка
### Вариант 1: Использование виртуального окружения (venv)
#### Вариант 1: Использование виртуального окружения (venv)
1. Клонируйте репозиторий:
```bash
git clone https://github.com/shendr404/cisco-auto-cdp-description.git
Expand All @@ -35,7 +128,7 @@
source venv/bin/activate
```
### Вариант 2: Запуск в системной оболочке
#### Вариант 2: Запуск в системной оболочке
1. Клонируйте репозиторий:
```bash
git clone https://github.com/shendr404/cisco-auto-cdp-description.git
Expand All @@ -49,20 +142,20 @@
pip install netmiko
```
## Использование
### Использование
1. Запустите скрипт:
```bash
python cdp_description.py
python ru/cdp_description.py
```
2. Введите IP-адрес или диапазон IP-адресов коммутаторов, которые вы хотите настроить (например, 192.168.0.1 или 192.168.0.1-192.168.0.10).
3. Введите логин, пароль, и при необходимости, enable пароль для подключения к коммутаторам.
4. Скрипт автоматически подключится ко всем коммутаторам в указанном диапазоне, соберет информацию о соседних устройствах через CDP, и настроит описание интерфейсов.
## Обработка ошибок
### Обработка ошибок
- Если на каком-либо этапе подключения или при переходе в конфигурационный режим возникнет ошибка, скрипт уведомит вас об этом и предложит повторно ввести соответствующие данные.
- Если enable пароль не был указан при запуске, но потребовался во время работы скрипта, его также можно будет ввести при необходимости.
## Пример использования
### Пример использования
```plaintext
Введите диапазон IP-адресов (например, 192.168.0.1-192.168.0.10): 192.168.0.1-192.168.0.10
Введите логин: admin
Expand All @@ -72,15 +165,15 @@
```
После ввода данных скрипт последовательно подключится к каждому коммутатору в диапазоне, настроит интерфейсы и сохранит конфигурацию.
## Требования
### Требования
- Python 3.6+
- Модуль `netmiko`
## Лицензия
### Лицензия
Этот проект лицензирован под лицензией GPL-3.0 - подробности см. в файле [LICENSE](https://github.com/shendr404/cisco-auto-cdp-description/blob/main/LICENSE).
## Поддержка
### Поддержка
Если у вас возникли вопросы или предложения, вы можете связаться с автором через [GitHub Issues](https://github.com/shendr404/cisco-auto-cdp-description/issues).
Expand Down
148 changes: 148 additions & 0 deletions en/cdp_description.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
import re
from netmiko import ConnectHandler
from netmiko.exceptions import NetmikoAuthenticationException, NetmikoTimeoutException
from ipaddress import ip_address

# ANSI-коды для цвета
COLOR_RED = "\033[91m"
COLOR_GREEN = "\033[92m"
COLOR_YELLOW = "\033[93m"
COLOR_CYAN = "\033[96m"
COLOR_RESET = "\033[0m"

def is_valid_ip(ip):
try:
ip_address(ip)
return True
except ValueError:
return False

def generate_ip_range(start_ip, end_ip):
start = ip_address(start_ip)
end = ip_address(end_ip)

if start > end:
print(f"{COLOR_RED}Error: The starting IP address is greater than the ending IP address.{COLOR_RESET}")
return []

ip_list = []
while start <= end:
ip_list.append(str(start))
start += 1

return ip_list

def process_switch(ip_address, credentials):
ip_address_str = str(ip_address)
print(f"{COLOR_CYAN}Processing {ip_address_str}...{COLOR_RESET}")

cisco_device = {
'device_type': 'cisco_ios',
'host': ip_address_str,
'username': credentials['username'],
'password': credentials['password'],
'secret': credentials.get('secret', ''),
'timeout': 10,
}

try:
net_connect = ConnectHandler(**cisco_device)
if credentials.get('secret'):
net_connect.enable()

cdp_output = net_connect.send_command("show cdp neighbors detail")

device_id = None
local_interface = None

for line in cdp_output.splitlines():
if "Device ID:" in line:
device_id = re.split(r'\(|\.', line.split("Device ID:")[1].strip())[0]
device_id = re.sub(r'[^\w-]', '', device_id)

if "Interface:" in line:
match = re.search(r"Interface:\s+(\S+),", line)
if match:
local_interface = match.group(1)
print(f"{COLOR_YELLOW}Interface discovered: {local_interface} to the device {device_id}{COLOR_RESET}")

if device_id and local_interface:
commands = [
f"interface {local_interface}",
f"description (to_{device_id})"
]

output = net_connect.send_config_set(commands)
print(f"{COLOR_GREEN}Sent commands: {commands}{COLOR_RESET}")
print(f"Device response:\n{output}")

device_id = None
local_interface = None

save_output = net_connect.send_command_timing("copy running-config startup-config")
if "Destination filename" in save_output:
save_output += net_connect.send_command_timing("\n")

print(f"{COLOR_GREEN}Saving configuration on {ip_address_str}:{COLOR_RESET}\n{save_output}")

net_connect.disconnect()

print(f"{COLOR_CYAN}Interface descriptions on {ip_address_str} have been successfully updated.{COLOR_RESET}")
return True

except NetmikoAuthenticationException:
print(f"{COLOR_RED}Authentication error for {ip_address_str}.{COLOR_RESET}")
return False
except ValueError as e:
if "Failed to enter configuration mode" in str(e):
print(f"{COLOR_RED}Error: Failed to enter configuration mode on {ip_address_str}. Enable password is required.{COLOR_RESET}")
return 'enable_failed'
print(f"{COLOR_RED}Connection error to {ip_address_str}: {e}{COLOR_RESET}")
return False


def main():
ip_range_input = input("Enter the IP address or range of IP addresses (e.g., 192.168.0.1-192.168.0.10): ")

if '-' in ip_range_input:
start_ip, end_ip = ip_range_input.split('-')
if is_valid_ip(start_ip) and is_valid_ip(end_ip):
ip_list = generate_ip_range(start_ip, end_ip)
if not ip_list:
print(f"{COLOR_RED}Error: The IP range could not be created.{COLOR_RESET}")
return
print(f"{COLOR_CYAN}IP range is valid. Processing addresses: {ip_list}{COLOR_RESET}")
else:
print(f"{COLOR_RED}Error: One of the entered IP addresses is invalid.{COLOR_RESET}")
return
elif is_valid_ip(ip_range_input):
ip_list = [ip_range_input]
print(f"{COLOR_CYAN}Single IP address is valid: {ip_list[0]}{COLOR_RESET}")
else:
print(f"{COLOR_RED}Error: The entered IP address is invalid.{COLOR_RESET}")
return

credentials = {
'username': input("Enter login: "),
'password': input("Enter password: "),
}

use_enable = input("Is an enable password required? (y/n): ").strip().lower()
if use_enable == 'y':
credentials['secret'] = input("Enter enable password: ")

for ip in ip_list:
result = process_switch(ip, credentials)
if result == 'enable_failed':
credentials['secret'] = input(f"{COLOR_RED}Please re-enter the enable password for {ip}: {COLOR_RESET}")
result = process_switch(ip, credentials)
elif not result:
print(f"{COLOR_RED}Please re-enter your credentials.{COLOR_RESET}")
credentials['username'] = input("Enter login: ")
credentials['password'] = input("Enter password: ")
if 'secret' in credentials:
credentials['secret'] = input("Enter enable password: ")
result = process_switch(ip, credentials)

if __name__ == "__main__":
main()
Loading

0 comments on commit bdf54a5

Please sign in to comment.