Django, queryset 결과의 문자열을 변경하는 방법.

Django3.1, queryset 결과 문자열을 변경하는 방법.

아래의 모델에 저장된 MAC 주소는 ‘0021ccd3792f’ 같은 형식으로 일반적으로 표현되는 : 이나 – 이 제거된 형태다.

models.py

class MacTable(models.Model):
...
    mac = models.CharField(max_length=32, verbose_name='MAC Address.')
    device = models.ForeignKey(
        'NetworkDevice', on_delete=models.CASCADE, verbose_name='Network Device'
    )
    interface = models.CharField(max_length=32, verbose_name='Interface')
    vlan = models.CharField(max_length=32, verbose_name='VLAN')
    dropped = models.BooleanField(default=False, verbose_name='Dropped')
....

    class Meta:
        verbose_name_plural = 'MAC address table'
        # unique_together = ('mac', 'device')

이것을 queryset 결과로 템플릿에서 보여주면 ‘0021ccd3792f’ 형식으로 보인다.

이것을 보다 일반적인 ’00:21:cc:d3:79:2f’ 와 같은 형식으로 보여 주려면 몇 가지 방법이 있겠지만, 기존의 queryset이나 view를 수정하지 않고 해당 모델에 아래와 같은 메소드를 추가해 주면 된다.

    @property
    def colon_view_mac(self):
        tmp = self.mac
        mac = f'{tmp[0:2]}:{tmp[2:4]}:{tmp[4:6]}:{tmp[6:8]}:{tmp[8:10]}:{tmp[10:12]}'
        return mac.lower()

그리고, 템플릿 파일을 수정해 준다.

기존의 템플릿에서 mac을 보여주는 부분이 {{ i.mac }} 이었다면, 이 메소드 이름으로 바꿔주면된다.
즉, {{ i.mac }} 을 {{ i.colon_view_mac }} 로 바꿔주면 된다.

익스트림 스위치 ssh/telnet 세션.

익스트림 스위치 ssh/telnet 세션.

익스트림 스위치에 ssh 접속시도했는데, 아래와 같은 접속 거부 메시지가 보였다.

$ ssh wadmin@172.16.100.2
ssh_exchange_identification: read: Connection reset by peer

다행히 telnet 접속도 허용해 놓은 상태여서 일단 접속 가능했다.

현재 세션을 확인해 보면 아래 처럼 8개의 ssh 연결된 상태다. 익스트림 스위치의 ssh 최대 동시 접속은 8 이다. 아래는 8개의 ssh 접속이 있어서 더이상 접속을 허용하지 않는 상태가 되었다.

C-1F.1 # show session
                                                             CLI
    #       Login Time               User     Type    Auth   Auth Location
================================================================================
 79359      Mon Sep 27 12:25:20 2021 wadmin   ssh2    local  dis  192.168.100.122
 79361      Mon Sep 27 12:29:10 2021 wadmin   ssh2    local  dis  192.168.100.122
 79363      Mon Sep 27 12:32:55 2021 wadmin   ssh2    local  dis  192.168.100.122
 79365      Mon Sep 27 12:39:20 2021 wadmin   ssh2    local  dis  192.168.100.122
 79366      Mon Sep 27 12:43:05 2021 wadmin   ssh2    local  dis  192.168.100.122
 79378      Mon Sep 27 13:37:30 2021 wadmin   ssh2    local  dis  192.168.100.122
 79380      Mon Sep 27 13:41:15 2021 wadmin   ssh2    local  dis  192.168.100.122
 79381      Mon Sep 27 13:41:41 2021 wadmin   telnet  local  dis  192.168.100.121
*79382      Mon Sep 27 13:42:39 2021 wadmin   telnet  local  dis  192.168.100.122

Continue reading

mysql, 1040, ‘Too many connections’

mysql, 1040, ‘Too many connections’

mysql을 이용해서 스크립트 작성중 too many connections 오류가 발생했다.

스크립트 실행 전에 processlist를 확인해 보면 아래와 같다.

ysql> show full processlist\g
+--------+----------+-----------------+----------+---------+------+----------+-----------------------+
| Id     | User     | Host            | db       | Command | Time | State    | Info                  |
+--------+----------+-----------------+----------+---------+------+----------+-----------------------+
| 142415 | foxxipam | localhost:42880 | foxxipam | Sleep   |  239 |          | NULL                  |
| 142416 | foxxipam | localhost:42898 | foxxipam | Sleep   |  239 |          | NULL                  |
| 144300 | foxxipam | localhost       | foxxipam | Sleep   |  750 |          | NULL                  |
| 144325 | foxxipam | localhost       | foxxipam | Query   |    0 | starting | show full processlist |
+--------+----------+-----------------+----------+---------+------+----------+-----------------------+
4 rows in set (0.00 sec)

Continue reading

익스트림 스위치 로그 필터 (exos log filter)

익스트림 스위치 로그 필터 (exos log filter)

아래처럼 동일한 로그가 반복되어 발생(192.168.100.122 에서 5분단위로 mac 수집 스크립트를 실행하고 있는 상태로 로그인 로그아웃 로그가 발생)하는 상황이다.
192.168.100.22에서 로그인/로그아웃 되는 로그는 많기도 하고 불필요하기도 해서 기록에 남기지 않고 싶다. 이것은 log filter를 설정하여 해결 할 수 있다.

Switch.5 # show log
08/27/2021 15:32:31.15 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)
08/27/2021 15:32:30.39 <Info:AAA.authPass> Login passed for user wadmin through telnet (192.168.100.122)
08/27/2021 15:26:49.16 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)
08/27/2021 15:26:48.91 <Info:AAA.authPass> Login passed for user wadmin through telnet (192.168.100.122)
08/27/2021 15:21:09.45 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)
08/27/2021 15:21:09.20 <Info:AAA.authPass> Login passed for user wadmin through telnet (192.168.100.122)
08/27/2021 15:15:29.67 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)
08/27/2021 15:15:28.92 <Info:AAA.authPass> Login passed for user wadmin through telnet (192.168.100.122)
08/27/2021 15:09:49.07 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)
08/27/2021 15:09:48.77 <Info:AAA.authPass> Login passed for user wadmin through telnet (192.168.100.122)
08/27/2021 15:04:10.48 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)
08/27/2021 15:04:09.69 <Info:AAA.authPass> Login passed for user wadmin through telnet (192.168.100.122)
08/27/2021 14:58:29.28 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)
08/27/2021 14:58:28.99 <Info:AAA.authPass> Login passed for user wadmin through telnet (192.168.100.122)
08/27/2021 14:52:49.75 <Info:AAA.logout> User wadmin logout from telnet (192.168.100.122)

Continue reading

django admin 페이지에서 다른 모델의 필드값을 drop-down 리스트로 사용하기.

Django 관리자 페이지에서 다른 모델 필드값 drop-down list로 사용하기

모델은 아래와 같다.

class Category(models.Model):
    name = models.CharField(max_length=64, unique=True)


class NetworkDevice(models.Model):
    ...
    category = models.CharField(max_length=64, null=True, blank=True, verbose_name='Category')

위의 모델에서, NetworkDevice 모델의 category 필드의 입력값을 Category 모델의 값에서 가져오기를 원하는경우, ForeignKey를 사용하면 되지만, 외래키를 사용하는경우 Category 쪽의 데이타를 삭제하는 경우 문제가 발생할 수도 있다.
그런 경우를 비롯해 외래키를 사용하지 않고 비슷한 효과를 보려면, 모델이 choices 파라메터를 튜플 타입으로 지정하면 된다.

위의 모델을 아래 처럼 수정하면, 원하는 결과를 얻을 수 있다.

class Category(models.Model):
    name = models.CharField(max_length=64, unique=True)

categories = []
for c in Category.objects.all():
    cat = (c.name, c.name)
    categories.append(cat)

class NetworkDevice(models.Model):
    ...
    category = models.CharField(max_length=64, choices=tuple(categories), null=True, blank=True, verbose_name='Category')

이제, 관리자 페이지에서 NetworkDevice를 추가 할때 아래 그림처럼 category를 선택할 수 있다.

Nornir 네트워크 자동화 – 4 (nornir-napalm)

Nonir 네트워크 자동화 – 4 (nornir-napalm)

1. NAPALM

NAPALM(Network Automation and Programmability Abstraction Layer with Multivendor support)
NAPALM은 통합된 API를 사용하여 다양한 네트워크 장비의 OS와 상호작용하는 기능을 구현한 파이썬 라이브러리.
현재 버전(napalm 3)에서 지원하는 NOS는 Arista EOS, Cisco IOS, Cisco IOS-XR, Cisco NX-OS, Juniper JunOS이다.

* NAPALM의 단점
지원되는 OS가 적다(하지만 지원되지 않는 장비들에 대한 커뮤니티 드라이버들이 존재함).
지원되는 매트릭스가 제한적임(https://napalm.readthedocs.io/en/latest/support/ 참고)

* 장점
결과를 Dictionary 타입으로 반환하므로 원하는 항목을 별도 작업없이 추출하는데 유리하다.

Continue reading

Nornir 네트워크 자동화 – 3 (활용편)

Nornir 네트워크 자동화 – 3 (활용편)

이전 글(Nornir 네트워크 자동화 -2 (활용편))에서 nornir-netmiko 를 통해 시스코스위치에 명령을 내리고 결과를 가져오는 파이썬 스크립트를 작성했다.

이제, 남은것은 가져온 결과에서 원하는 부분을 추출하여 excel 에 저장하는 것이다.
만약, 결과를 눈으로 확인하기만 하면 된다고하면 print_result 사용만으로 충분할 수도 있겠지만, 장비의 시리얼 번호 추출이나 os 버전을 업그레이드 하기 위해 현재 os 버전을 확인하고자 한다면 결과를 파싱하여 정리하는 것이 보기에 좋을 것이다.

파싱의 원래 개념은 문자열을 토큰으로 분해하여 parse tree를 만드는 과정을 말하므로 엄격한 의미의 파싱이라 할 수 없을지도 모르겠지만, 넓은 의미로 원하는 데이타를 추출하는 행위도 의미한다.

어떤 문자열에서 원하는 문자열을 추출하기 위한 방법으로는 여러 가지가 있겠지만 정규표현식을 이용하는것이 좋다.

Continue reading

Nornir 네트워크 자동화 -2 (활용편)

Nornir 네트워크 자동화 – 2 활용편

목표: Nornir를 이용하여 시스코 스위치 점검하는 파이썬 스크립트를 작성

사람이 장비점검을 한다고 하면 보통 아래 과정을 거쳐야한다.

1. 스위치의 목록 확인(ID, 비밀번호, 접속방법 등등)
2. 장비 접속, 보통 순서대로 접속하지만, 터미널 프로그램에 등록해서 한번에 여러대 접속이 가능하다.
3. 장비별로 명령을 내린다. 이것 역시 순서대로 하거나 여러 장비에 동시 가능.
4. 명령의 실행 결과를 확인하고 체크리스트를 작성한다.(이부분에서 사람은 동시에 하기 어려움)

이것을 자동화한다면,
1. 장비 목록에서 hosts.yaml 작성. 또는 파이썬 딕셔너리 타입의 hosts 데이타를 작성.
2. Nornir netmiko_task로 장비에 명령을 내리고 실행 결과를 받음.
3. 실행결과에서 원하는 결과를 추출하고 체크리스트를 작성한다.

인벤토리는 기본적으로 hosts 정보만으로 Nornir를 초기화하고 실행할 수 있다. 따라서 이전 글에서 살펴본 hosts의 스키마를 기본으로 아래 항목으로 excel 파일을 작성하고, 명령을 실행한 후 결과를 excel 파일에 저장하도록 스크립트를 작성해 보도록 한다.

Continue reading

Nornir 네트워크 자동화 – 1

Nornir 네트워크 자동화 – 1 (기초편)

1. Nornir란 무엇인가?

Nornir는 파이썬으로 작성된 자동화 프레임워크다. Ansible의 경우 파이썬으로 작성되었지만 프로그래밍을 몰라도 사용하는데 문제는 없지만, Nornir를 사용하려면 파이썬 프로그래밍을 알아야한다.
Nornir는 파이썬 버전 3.6.2 이상에서 동작한다.

2. Nornir 설치

Nornir는 PyPI에 게시되며, 다른 파이썬 패키지들처럼 pip 명령으로 설치가 가능하다. 또한 개발단계에서는 virtual environment를 사용하는것이 좋다.

아래 명령으로 설치한다.

(venv) $ pip install nornir

설치후 파이썬 쉘에서 Nornir 시험해본다.

$ python
Python 3.8.5 (default, Jan 27 2021, 15:41:15)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from nornir import InitNornir
>>>

오류가 발생하지 않는다면 잘 설치된 것이다.

Continue reading

C3550, %SYS-2-MALLOCFAIL

C3550, %SYS-2-MALLOCFAIL 메시지 발생.

시스코 스위치에서 대략 30초 간격으로 아래 메시지 무한 반복.

May 10 16:23:07: %SYS-2-MALLOCFAIL: Memory allocation of 1692 bytes failed from 0x153AE4, alignment 0 
Pool: I/O  Free: 57212  Cause: Memory fragmentation 
Alternate Pool: None  Free: 0  Cause: No Alternate pool 
 -Process= "Pool Manager", ipl= 0, pid= 5
May 10 16:23:37: %SYS-2-MALLOCFAIL: Memory allocation of 1692 bytes failed from 0x153AE4, alignment 0 
Pool: I/O  Free: 57212  Cause: Memory fragmentation 
Alternate Pool: None  Free: 0  Cause: No Alternate pool 
 -Process= "Pool Manager", ipl= 0, pid= 5
May 10 16:24:07: %SYS-2-MALLOCFAIL: Memory allocation of 1692 bytes failed from 0x153AE4, alignment 0 
Pool: I/O  Free: 57212  Cause: Memory fragmentation 
Alternate Pool: None  Free: 0  Cause: No Alternate pool 
 -Process= "Pool Manager", ipl= 0, pid= 5

Continue reading