вторник, 5 марта 2019 г.

AMD 2990WX ASUS ROG STRIX X399-E GAMING Raid Ubuntu 16.04.5 працює (AOSP compile time 4 minutes)

Налаштування BIOS

1) Обираємо стабільний XMP профіль для DDR4
2) Переключаємо режим SATA з AHCI на RAID ("F10"-> Reboot)
3) конфігуруємо RAID controller в новому пункті в BIOS

Компіляція драйвера

Компілюємо драйвер від AMD X370 під то ядро, що є а USB ISO (uname -a)
https://www.amd.com/en/support/chipsets/amd-socket-am4/x370
Якщо ядро не 4.4, а нове, то потрібно використати патч звідси https://raw.githubusercontent.com/martinkarlweber/rcraid-patches/master/rcraid.patch  
Копіруємо на другу USB Flash драйвера
Стартуємо з USB Flash, під час detect мережевої плати, перемикаємося в іншу консоль
та робимо insmod rcraid 
Інсталятор зараз побачить Raid 
Встановлюємо як звичайно


Після інсталяції

Після встановлення знову стартуємо з USB flash, перемикаємося, insmod rcraid
Бачимо Raid 
копіруємо на Raid драйвера

  • mount -t proc proc proc/
  • mount -t sysfs sys sys/
  • mount -o bind /dev dev/
  • mount raid disk to folder /mnt/ubuntu
  • chroot /mnt/ubuntu /bin/bash
Робимо chroot
компілюємо драйвер


Оновлюємо initramfs

 update-initramfs -u
Перевіряємо чи все добре
lsinitramfs /boot/initrd.img-<image number>-generic | grep rcraid
Перевантажуємо

AOSP за 4 хвилини пересборка


вторник, 28 августа 2018 г.

Прочитане

Прочитав "Кофе с привкусом пепла"



Це спогади людини, що була в АТО.
Деякі технічні рішення заінтересували, так що підзвонив до авторів, та перепитався

Цікавий емоційний стан людини

Брав тут за гроші електронну копію 

Прочитане неофіціальна біографія грошей

Прочитане
Неофіціальну біографію денег

Брати можно тут

Доволі цікаві факти і ставлення до грошей




среда, 18 июля 2018 г.

понизити (downgrade) kubernetes 1.11.1 назад до 1.11.0 з ceph

1. повертаємо debian пакети

apt-get install kubeadm=1.11.0-00 kubectl=1.11.0-00 kubelet=1.11.0-00
в мене змінений файл в systemd
10-kubeadm.conf\
тому погоджуємося на заміну
там відрізняється формат

2. kubeadm config images pull --kubernetes-version=v1.11.0


3. Робимо файл, пусть буде config.yaml
    apiVersion: kubeadm.k8s.io/v1alpha1
    kind: MasterConfiguration
    api:
      advertiseAddress: 10.1.0.151
    networking:
      podSubnet: 10.244.0.0/16
    kubernetesVersion: 1.11.0
 
4. kubeadm init --config=config.yaml --ignore-preflight-errors=all
5. додаємо в /etc/default/kubelet
KUBELET_EXTRA_ARGS=--max-pods=240
6. Для перестраховки systemctl daemon-reload 
7. service kubelet restart
8. Перевіряємо kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, cap: .status.capacity}' 

среда, 23 мая 2018 г.

kubernetes 1.10  обмеження 110 pods на node

Перевірити так
 kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, cap: .status.capacity}'

kube@kub01pp:/etc/systemd/system/kubelet.service.d$ kubectl get nodes -o json | jq '.items[] | {name: .metadata.name, cap: .status.capacity}'
Щоб було як у у прикладі 240, а не 110
{
  "name": "kub01pp",
  "cap": {
    "cpu": "16",
    "ephemeral-storage": "38703652Ki",
    "hugepages-1Gi": "0",
    "hugepages-2Mi": "0",
    "memory": "65963632Ki",
    "pods": "240"
  }
}
{
  "name": "kub02pp",
  "cap": {
    "cpu": "16",
    "ephemeral-storage": "38703652Ki",
    "hugepages-1Gi": "0",
    "hugepages-2Mi": "0",
    "memory": "65963572Ki",
    "pods": "240"
  }
}
{
  "name": "kub03pp",
  "cap": {
    "cpu": "16",
    "ephemeral-storage": "0",
    "hugepages-1Gi": "0",
    "hugepages-2Mi": "0",
    "memory": "65963632Ki",
    "pods": "240"
  }
}

cd /etc/systemd/system/kubelet.service.d/
у цьому файлі додати Environment="KUBELET_EXTRA_ARGS=--max-pods=240" 10-kubeadm.conf
потім systemctl daemon-reload
service kubelet restart

Оновлення kubernetes з custom controller (with CEPH RBD)

оновлення kubernetes
1) apt-get update&&apt-get upgrade
2) оновлюємо controller
в файлі /home/kube/docker/Dockerfile вписуємо потрібну версію
3)  робимо імідж
docker build -t "my-kube-controller-manager:v1.10.3" docker/
4) перевіряємо
docker images | grep my-kube-controller-manager
5) перевіряємо image чи в ньому є rbd binary
docker run my-kube-controller-manager:v1.10.3 whereis rbd
6) в файлі  /etc/kubernetes/manifests/kube-controller-manager.yaml
image: my-kube-controller-manager:v1.10.3 (замінюємо на наше ім'я та
перевіряємо imagePullPolicy: IfNotPresent )

7) під користувачем kube
kubectl -n kube-system describe pods | grep kube-controller
8)  потім звичайно
kubeadm upgrade plan
а потім
kubeadm upgrade apply <версія> 
9) перевіряємо
docker images | grep my-kube-controller-manager 
 якщо потрібно пункт 6 знову

четверг, 18 января 2018 г.

Aliyun alicloud oss (аналог s3) для простого хранения папок

Вместо pip install aswcli --upgrade
здесь нужно
Политика взять ossutil 
Например здесь 

Создать пользователя в ram.console.alicloud.com с ключами
Создать bucket (бакет/корзина)

Создать политику с желаемыми типами действий (во многих примерах почему-то нет  PutObject)

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "oss:ListObjects",
        "oss:GetObject",
        "oss:PutObject"
      ],
      "Resource": [
        "acs:oss:*:*:имя вашего бакета",
        "acs:oss:*:*:имя вашего бакета/*"
      ]
    }
  ]
}
Применить политику к пользователю

протестировать
1)./ossutl ls oss://имя вашего бакета
2) ./ossutil cp ваш_файл.txt oss://имя вашего бакета
использовать в скриптах :)




пятница, 27 октября 2017 г.

Удаленное восстановление пользовательской машины Ubuntu

Получил удаленную незагружающуюся машину под Ubuntu, удалось найти обычную установочную (инсталяционную) usb flash.
Загрузились в режиме пробовать ubuntu
По viber передавал команды
apt install openssh-server

sudo bash

passwd ubuntu


Когда зашел удаленно
сделал
for i in /sys /proc /run /dev /dev/pts; \
do sudo mount --bind "$i" "/mnt$i"; done

sudo chroot /mnt

 Так как в графическом режиме локальный диск смонтирован, то вместо /mnt правильная папка обычно где нить в /media/имя пользователя/какие то цифры, и так зашел, то скорее всего /etc/resolv.conf копировать не нужно.

Ну а дальше, от исходной проблемы зависит ...

суббота, 21 октября 2017 г.

Planmeca Romexis Viewer ubuntu

Получил снимки сделанные в лаборатории.
На диске записан viewer для macos и windows.
Просмотрщики под android показывали только одну ось, а мне нужен был сагитальный срез.
скопировал java viewer на винт и убрал из скрипта запуска параметры для macos
-Xdock:name='Planmeca Romexis Viewer' -Xdock:icon=../Xtras/Romexis.icns
и память прописал явно
вместо -Xmx$1m  -Xmx2048m

Итого скрипт выглядит так
# scriptPath="${0%/*}"
# export PATH=$PATH:${scriptPath}
# export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:${scriptPath}/dylib
export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:./dylib

java -Xmx2048m -Dj3d.rend=ogl -classpath '*' romexis_client_viewer.ui.RxViewer  -new3d $2 $3 &

Для удобства проставил права chmod +x start.sh

вторник, 19 сентября 2017 г.

audit apache certificates debian

Написал небольшой скрипт для проверки сертификатов в конфигах apache для debian

Проверяет:
владельцев файлов ключей и сертификатов
имена файлов
проверяет expiration date
удобно вывод перенаправить в csv

вот на github

четверг, 7 сентября 2017 г.

Mysql анализ производительности на работающем сайте

Скачиваем percona tool
 wget https://www.percona.com/downloads/percona-toolkit/3.0.4/binary/debian/xenial/x86_64/percona-toolkit_3.0.4-1.xenial_amd64.deb
 
Ставим percona tool
sudo dpkg -i  percona-toolkit_3.0.4-1.xenial_amd64.deb
 
в консоли
 cd /var/log/mysql

вытираем предыдущий файл лога (копируем "ничего" в файл)
> mysql.log

в консоли mysql
 SET GLOBAL general_log = 'ON';
открываем страницу (выполняем нужные действия)

выключаем лог
SET GLOBAL general_log = 'OFF';

 pt-query-digest --type genlog mysql.log  > report

-----------------------------------------------

Проверяем что работает без индексов
set global log_queries_not_using_indexes='on';
делаем что нужно
set global log_queries_not_using_indexes='off';
Отрезаем все выше необходимого времени
sed  '/Time: 2017-09-05/,$!d' mysql-slow.log
>
report_index.log
Запускает анализ
 pt-query-digest report_index.log > report_without_index

вторник, 16 мая 2017 г.

редиректы nginx много SSL бесплатных сертификатов


Сделать отчет по redirect откуда и куда
#!/usr/bin/python
file = open("redirects","r")
pairs={}
for row in file:
    if 'server_name' in row:
        name=row.strip().split(" ")
    if 'return' in row:
        redir = row.strip().split(" ")
        pairs[name[1]]=redir[3]
file2 = open("report","w")
for key, value in pairs.items():
    file2.write( key+" => "+value+"\n")
file2.close




Генерация конфига nginx  для бесплатных SSL сертификатов let's encrypt для большого количества редиректов

#!/usr/bin/python
file = open("source","r")
pairs={}
for row in file:
    if 'server_name' in row:
        name=row.strip().split(" ")
    if 'return' in row:
        redir = row.strip().split(" ")
        pairs[name[1]]=redir[2]

for pair in pairs.keys():
#    print "certbot certonly -d "+pair+" -d "+pair[4:] (раскоментируем если нужно сгенерировать для бота)
# второй вариант вывода, если файл не нужен
    print "server {"
    print "    listen <Реальный IP>:80;"
    print "    listen <Реальный IP>:443 ssl;"
    print "    server_name",pair, pair[4:]+";"
    print "    location /.well-known {"
    print "        root /var/www/html;"
    print "    }"
    print "    location / {"
    print "    return 301 ",pairs[pair]
    print "    }"
    print "    ssl_certificate /etc/letsencrypt/live/"+pair+"/fullchain.pem;"
    print "    ssl_certificate_key /etc/letsencrypt/live/"+pair+"/privkey.pem;"
    print "    ssl_trusted_certificate /etc/letsencrypt/live/"+pair+"/chain.pem;"
    print "}"



понедельник, 23 января 2017 г.

Ansible собрать активные default gateway на unix системах

Иногда по историческим причинам на сервере может быть настроено несколько default gateway, но реально работает,  конечно, один.

Ansible определяет интерфейс по умолчанию с помощью команды
ip -4 route get 8.8.8.8


Если нужно проверить (провести аудит) настроек шлюзов то можно использовать такой коротенький yml

---
- hosts: all
  become: yes
  tasks:
    - local_action: file path=report state=touch
    - local_action: lineinfile line="System {{ inventory_hostname }} \ 
has gateway {{ ansible_default_ipv4.gateway }}" dest=report
 
Можно вставить проверку и выводить нужные условия
---
- hosts: all
  become: yes
  tasks:
    - local_action: file path=report state=touch
    - local_action: lineinfile line="System {{ inventory_hostname }} has {{ansible_hostname}} \
gateway {{ ansible_default_ipv4.gateway }}" dest=report
      when: inventory_hostname !=ansible_hostname
 

пятница, 28 октября 2016 г.

Аудит логинов на unix системах

Очень быстрое решение как собрать все учетные записи с unix серверов для аудита
1. Вспомнили, где стоит ansible
2. Навели порядок в файле /etc/ansible/hosts на контрольной (управляющей) машине. Если не все красиво с точки зрения dns, то пользуйтесь ansible_ssh_host, если нестандартные порты - ansible_ssh_port для тех узлов, где без них не получается
3. ansible all -a "cat /etc/passwd" > в файл.
4. Берем cat файл | egrep -v "nologin|false|еще чтонибудь" и удивляемся, а эти учетки почему не удалены :)

воскресенье, 14 августа 2016 г.

куда же ходит сервер собрать IP Linux tcpdump

Часто команда, которая поддерживает програмное обеспечение на серверах "не до конца уверена" куда же ходит сервер ( к каким другим серверам).

Варианты поиска ответов, которые я нашел:


  1. Netflow и коллектор. В качесте netflow источника может быть как сетевое оборудование, так и модуль ядра.
  2. Tcpdump конечно(если сервер не очень, очень нагружен). В крайнем случае может быть конечно зеркалирование порта на сетевом оборудовании (span, rspan, espan в Cisco, port-mirroring в Juniper)
  3. Iptables с включенным логированием (очень желательно в отдельный файл)


В данном случае мне подходил tcpdump прямо на сервере

Процесс сбора:


  1.  Уменьшаем объем захвата на известные адреса (либо запустив сбор на 5 минут, либо опросить команду поддержки приложения)
  2.  Записали tcpdump с ключиками
    •  -w имя файла
    •  -i имя интерфейса 
    •  -С 1000 (размер файла не более 1000 млн байта - чуть меньше 1 Гб). В этом случае при достижении того самого 1000 млн будет начинать создаваться новый файл. Хорошо создавать на отдельный раздел с ощутимым свободным местом, и если на нем закончится место, то чтобы это не вызвало остановки сервисов.
  3. Так как готового способа, который меня устраивал я не нашел, я скопировал к себе все файлы с размером каждого почти 1 Гб  на ПК, меньше шансов было повлиять на активный сервис.

Обработка:

Приемлемых результатов достиг разделив обработку tcp и udp отдельно.
 Для TCP можно выделить соединения (tcp flow), чтобы не бороться с фильтрацией динамических портов, и отфильтровать сканы несуществующих портов

Обработка TCP

1) Для выделения потоков воспользовался утилитой tcpick (ставится на ubuntu
apt-get install tcpick
).


2) Отобрал только established. Быстро просмотрел результат с помощью вывода в more.
3) Дальше немного почистил с помощью egrep -v 'известное1| известное 2' (кому-то больше нравится писать grep -vE  )
Команда выглядела так

tcpick -a -r 123.pcap | grep 'ESTABLISHED' | egrep -v 'известное1|известное2' > temp


2) склеиваем вывод файла в один файл
temp &gt;&gt; temp_result_tcp
, потом
temp2 >> temp_result_tcp 
и так далее

3) Отбираем только destination. Смотрим файл, например less имя файла

В полученном промежуточном сводный файле:
  • выбираем 5 столбец (destination)
  • сортируем, 
  • считаем дубли - ключ c в uniq
  • оставляем uniq только имеющиеся дубли (за счет ключа -d) не нужны мне случайные соединения за неделю (в моем случае так надо, в вашем может быть иначе) 
  • результат сортируем по числам за счет ключа n
  • Самых активных выводим первыми за счет ключа r в программе sort

awk '{print $5}' |  sort | uniq -cd | sort -nr 

Просматриваем глазами результат ( в моем случае были настойчивые сканеры), убираем явных сканеров.
Кстати, смотреть tcpick с ключом - С (цвет) pcap, созданный  тем же tcpdump, мне понравилось.


Обработка UDP



1) Читаем еще раз исходный файл pcap, но уже читаем только udp
tcpdump udp -r имя файла дампа | more . Бегло просматриваем что можно выбросить сразу
2)   чистим tcpdump udp -r 123.cap| egrep -v '.domain|ntp|sip|mdns|dhcpv6|netbios| и прочее'
в моем случае это был multicast и почему-то порт 53413 (оказалась популярная цель для сканеров)
3) Оставил и source и destination и значок направления. Обьем в моем случае очевидно меньше. Команда awk '{print $3,$4,$5} > в файл.
4)  Склеиваем аналогично результат всех в один файл, проходим
awk '{print $3,$4, $5}' |  sort | uniq -cd | sort -nr 
 
5) Просматриваем глазами, убираем явных сканеров и оставшийся мусор

Сводим два файла в один, сравниваем с полученными ранее результатами опроса. Помогаем коллегам найти все компоненты приложения.

воскресенье, 17 января 2016 г.

Державний реєстр лікарських засобів України просмотр на мобильном телефоне

В связи с продолжительным невыкладыванием справочника по лекарственным препаратам хотелось перейти на онлайн вариант.
И вроде бы поиск по сайту Державний реєстр лікарських засобів України
www.drlz.kiev.ua работает и с мобильного. Только вот посмотреть инструкцию по препарату нельзя, она скачивается в формате .mht.  Чтобы посмотреть это нужно поставить firefox на телефон и поставить add-on unmht (в самом firefox есть возможность добавлять различные add-on -три точки в правом углу-> tools->add-on->browse all firefox add-ons). Шрифт конечно караул, но лучше чем ничего.

пятница, 15 января 2016 г.

сбор информации с маршрутизаторов cisco python paramiko

На основе предыдущего скрипта сделал сбор информации и подсчет подходящих под условие
отличие здесь довольно простое
из функции есть возрат значения, а уже значение (по сути ответ устройства) анализируется на наличие строк.
поиск строки сделан очень просто просто проверяется строка целиком с помощью in.

#!/usr/bin/python
#for work with SSH we need paramiko pip install paramiko
import paramiko
#hide password input 
import getpass
#build in library socket for with exception
import socket
list_bad_ip=[]
receive_buffer=""
client = paramiko.SSHClient()
#for connection via ssh you need to accept SSH keys
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#create function for send command and check answer
def send_string_and_wait_for_string(command, wait_string):
#send command
    shell.send(command)
#clear buffer
    receive_buffer = ""
#until receive WAIT_STRING - remote device ready
    while not wait_string in receive_buffer:
        receive_buffer += shell.recv(1024)
#return buffer with output of command 
 return receive_buffer
#read list of IPs from text file one by line
ips = [i.strip() for i in open("./1")]
username1 = raw_input("enter login :")
#hide password input 
password1 = getpass.getpass("enter password :")
#create loop for each IPs
for ip in ips:
#if we use try easy to work with expection
    try:
#connect to device
        client.connect(ip,port=22,username=username1,password=password1)
#check state
#        print "connect to ",ip
        shell = client.invoke_shell()
#wait for enable
        send_string_and_wait_for_string("", "#")
#enter command and wait for return to #
        receive_buffer = send_string_and_wait_for_string("sh int Vlan12 | i line protocol\n","#")
#first option not interesting 
        if "line protocol is up" in receive_buffer:
            print ip+" protocol is up"
#second possible answer interesting save in separate list 
        else:
            print ip+" line protocol is down"
            list_bad_ip.append(ip)
#close with this device
        shell.close()
        client.close()
#work with timeout error
    except socket.error:
        print ip + '=== Device unreachable'
#add ip with errors to list
        list_bad_ip.append(ip)
#save this list to file
with open('bad_ip', 'w') as f:
    for s in list_bad_ip:
        f.write(s + '\n')
#show list at the screen for lazy admin
print list_bad_ip
(END)

массовая настройка маршрутизаторов Cisco по ssh (mass configuring cisco router via ssh)

Написал небольшой скрипт как пример массовой настройки маршрутизаторов Cisco по ssh на python.
Использовал paramiko, а не модуль clogin из rancid, потому что было интересно уменьшить зависимости.

От других подобных скриптов мне кажется отличает такое
1) за счет ожидания wait for string работает и на каналах с большой латентностью (спутниках и наземных в перемешку)
2) в тоже время за счет выноса цикла отправки и ожидания ответа в функцию код получается более-менее компактным и добавлять команды довольно просто
3) за счет getpass получается скрытый ввод пароля
4) да и вообще в скрипте не храняться учетные данные
5) так как в моем списке ip могут попадаться и неактивные устройства, то используется try и  expect  для вывода адресов, до которых не удалось достучаться.
 
#!/usr/bin/python
#for work with SSH we need paramiko pip install paramiko
import paramiko
import getpass
#build in library socket for with exception
import socket
list_bad_ip=[]
client = paramiko.SSHClient()
#for connection via ssh you need to accept SSH keys
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#create function for send command and check answer
def send_string_and_wait_for_string(command, wait_string):
#send command
    shell.send(command)
#clear buffer
    receive_buffer = ""
#until receive WAIT_STRING - remote device ready
    while not wait_string in receive_buffer:
        receive_buffer += shell.recv(1024)
#read list of IPs from text file one by line
ips = [i.strip() for i in open("./1")]
username1 = raw_input("enter login :")
password1 = getpass.getpass("enter password :")
#create loop for each IPs
for ip in ips:
#if we use try easy to work with expection
    try:
#connect to device
        client.connect(ip,port=22,username=username1,password=password1)
#check state
        print "connect to ",ip
        shell = client.invoke_shell()
#wait for enable
        send_string_and_wait_for_string("", "#")
#enter conf t and wait for #
        send_string_and_wait_for_string("conf t\n", "(config)#")
#enter command and wait for return to #
        send_string_and_wait_for_string("login on-failure log\n","(config)#")
        send_string_and_wait_for_string("login on-success log\n","(config)#")
#end is important, exit worse in this case
        send_string_and_wait_for_string("end\n","#")
#don't forget store in flash
        send_string_and_wait_for_string("wr mem\n","#")
#we are near end with device
        print ip+" ok"
#close with this device
        shell.close()
        client.close()
#work with timeout error
    except socket.error:
        print ip + '=== Device unreachable'
#add ip with errors to list
        list_bad_ip.append(ip)
#save this list to file
with open('bad_ip', 'w') as f:
    for s in list_bad_ip:
        f.write(s + '\n')
#show list at the screen for lazy admin
print list_bad_ip

четверг, 22 октября 2015 г.

Скрипт в помощь поиска неуправляемых коммутаторов/hub на Python (seach unmanaged switch/hub connected to Cisco with python script)


#!/usr/bin/python
# version 0.1 Created Yevgenii Merezhko
# My assumptions:
# There are switches with many vlans. I select only "users switches"
# There are Cisco ip phones in voice vlan.
# Usually Po1 is uplink
# PC connected via IP Phones and somecase we have some hub/unmanaged switches after Cisco IP Phones
# Ip Phones have two mac address (one in voice vlan and second in data vlan)
#just for entering VoiceVlan number
VoiceVlan = str(input("Enter Voice Vlan number: "))
#put file in folder in put name of file
#may be better to work with all files in folder TBD
with open("/home/yevgenii/Downloads/test/test2/192.168.73.252.1.1") as textFile:
    lines = [line.split() for line in textFile]
# I expect some thing like 
# 73    0004.23e7.d793    DYNAMIC     Fa0/22
# 73    0005.1e35.de56    DYNAMIC     Fa0/15
# 
# for example  it could be extracted from "sh mac add" 
# My colleague collect it for me with bash+clogin (module from Rancid)
# and separate file with like this bash script
# #!/bin/sh
# for i in $(ls 1*);
# do 
# cat $i| grep "^\ "| grep -v "Po1" > $i.1
# done
row = 0
MacAddressPhones = []
ListWithoutPhones = []
macaddress = 0
macaddress1 = 0
macaddress2 = 0
mac1phones = 0
mac2phonesswitch = 0
Vlan = 0
x = 0
y = 0
B = 0
port = []
PortNumber = 0
result = {}
#create list with mac in voice vlan
while row < len(lines):
    Vlan = lines[row][0]
    macaddress = lines[row][1]
    if Vlan == VoiceVlan:
        MacAddressPhones.append(macaddress)
        del lines[row][:]
    row += 1
#for easy loop filtering 
ListWithoutPhones = lines
#remove empty from list
lines = filter(None, lines)
#compare Mac in voice vlan with mac in data vlan)
for mac1phones in range(len(MacAddressPhones)):
    macaddress1 = MacAddressPhones[mac1phones]
    mac2phonesswitch = 0
    while mac2phonesswitch < len(lines):
        macaddress2 = lines[mac2phonesswitch][1]
        if macaddress1 == macaddress2:
            del ListWithoutPhones[mac2phonesswitch][:]
        lines = filter(None, lines)
        ListWithoutPhones = filter(None,ListWithoutPhones)
        mac2phonesswitch += 1
    mac1phones += 1
#create only list of port
while x < len(ListWithoutPhones):
    port.append(ListWithoutPhones[x][3])
    x += 1
print("port",port)
#calucate how many times port in list if more then 1, put in interesting list
while y     PortNumber = port[y]
    print("PortNumber",PortNumber)
    B = port.count(PortNumber)
    print("B",B)
    if B >1:
        result[PortNumber]=B
        print("result len:",len(result))
    y += 1
print ("List of Ports: ",result)
# after this it need to be filter uplink port in most case it will be easy

среда, 14 октября 2015 г.

Идея для очистки Cisco ACL IOS на маршрутизаторах

Условия:
  • Есть большое количество маршрутизаторов
  • ACL большого размера
  • ACL более менее похожи
  • ACL используют локальные адреса в качесте source
Идея:
Удалить неиспользуемые правила хотя бы более менее массово, чтобы сделать acl читаемыми человеком

Вариант решения:

  • Зайти на маршрутизатор, выбрать из ACL одного типа все destination у которых счетчики равны 0. 
  • Зайти на следующий маршрутизатор выбрать  destination у которых счетчики равны 0, сравнить с предыдущим, оставить только одинаковые
  • Зайти на следующий маршрутизатор.
В моем случае процент кандидатов на удаление очень приличный