====== Python ======
* hlavička má být něco takového
#!/usr/bin/env python
===== Funkce =====
* funkce s parametry
# Příklad funkce s return annotation (říká, co by to vracet mělo)
def add(first, second) -> int:
return first+second
# Volání funkce
add(5,10)
* default hodnoty parametru a specifikování typu
def add(first: int = 5, second: int = 10) -> int:
return first+second
add()
add(second=6)
* anonymní funkce
# Uložení reference na funkci
add = lambda first, second: first+second
# Volání funkce
add(5,10)
# Definice a přímé použití
(lambda first, second: first+second)(5,10)
===== OOP =====
* třída se definuje klíčovým slovem ''Class''
* metody třídy se zapisují jako normální funkce
* Python nepodporuje privátní proměnné, symbolicky se zapisuje podržítkem na začátku
* klíčové slovo ''self'' odkazuje na sebe sama
class MyClass():
# Konstruktor
def __init__(self):
self._count = 0
# Metoda tridy
@classmethod
def add(number):
_count += number
# Ekvivalentni zapis bez pouziti dekoratoru
'''
def add(self,number):
self._count += number
'''
# Getter pomoci dekorátoru
@property
def count():
return self._count
* dědičná třída se zapisuje
class MyClass(MyParentClass):
def __init__(self):
super.__init__()
* klíčové slovo ''super'' referencuje nadřazenou třídu
* Vlastní vyjímky se vytváří z třídy Exception
* Klíčové slovo ''pass'' pouze informuje, že se má pokračovat.
* U prázdné třídy/funkce se musí použít, jinak by to hlásilo chybu, že třída nemá žádnou definici.
class MyException(Exception):
pass
===== Scapy =====
* odeslání jednoduchého paketu ([[https://thepacketgeek.com/scapy-p-05-sending-our-first-packet-arp-response|zdroj]])
from scapy.all import *
pkt = Ether()/IP() // vytvoří objekt, dvě vrstvy: Ethernet, TCP
pkt[Ether].src = my_mac
pkt[Ether].dst = "ff:ff:ff:ff:ff:ff"
pkt[IP].src = "192.168.1.100"
pkt[IP].dst = "192.168.1.255"
sendp(pkt)
* scapy má i přímo cli, pro jednoduší zkoušení
* užitečný příkaz je ls, který vypíše informace o možných položkách
>>> ls(Ether)
dst : DestMACField = (None)
src : SourceMACField = (None)
type : XShortEnumField = (0)
* příklad vytvoření pcap s VLAN tagem
mypkt2=Ether()/Dot1Q(vlan=42)/IP(dst="1.2.3.4")/Raw("example")
sendp(mypkt2, iface="eth0")
===== setuptools (setup.py) =====
* vytvoření rpm ([[http://jeromebelleman.gitlab.io/posts/devops/setuppy/|zdroj]])
python setup.py bdist_rpm
* vyrvoření whl ([[https://www.realpythonproject.com/how-to-create-a-wheel-file-for-your-python-package-and-import-it-in-another-project/|zdroj]])
python setup.py bdist_wheel
* whl by se už nemělo vytvářet přes setup.py, jde o deprecated volbu
* mělo by být nahrazeno:
pip wheel .
* nebo
python -m build --wheel
* který čte pyproject.toml, připadně setup.py, pokud první neexistuje