# 1. feladat ## 1.a interaktív mód A Python nyelv gyakran használt tudományos és matematika algoritmusok implementálására. Írassuk ki mérföldben 3 tizedes jegy pontossággal egy félmaraton hosszát az interpreter segítségével! Megoldás: ```bash $ python3 >>> dist = 21097.5 >>> dist 21097.5 >>> mile = 1.6093 >>> mile 1.6093 >>> dist_in_miles = (dist / 1000) / mile >>> dist_in_miles 13.109737152799354 >>> print("Distance of a half maraton in miles is: {:.3f}".format(dist_in_miles)) Distance of a half maraton in miles is: 13.110 ``` Ahogy látható, itt elmentem változókba a kapott konstansokat, majd megformázva irattam ki a kapott értéket. ## 1.b Feladat - Külső modul használata **Feladat:** Írassuk ki a *google.com* (nem kell a *www* elé!) tartománynévhez rendelt levelező szervereket (MX rekord)! Megoldás: ```bash $ python3 >>> import dns.resolver >>> answers = dns.resolver.query('google.com', 'MX') <stdin>:1: DeprecationWarning: please use dns.resolver.resolve() instead >>> for rdata in answers: ... print('Host', rdata.exchange, 'has preference', rdata.preference ... Host aspmx.l.google.com. has preference 10 Host alt3.aspmx.l.google.com. has preference 40 Host alt4.aspmx.l.google.com. has preference 50 Host alt1.aspmx.l.google.com. has preference 20 Host alt2.aspmx.l.google.com. has preference 30 ``` Miután beimportáltam a megfelelő könyvtárat, lekérdeztem a `google.com` `MX` rekordjait. A depricated warningot figyelmen kívül hagyva egy `for` ciklussal kiíratom a kapott adatokat. ## 1.c Feladat - Saját DNS modul **Feladat:** Hosszabb kódok esetén az interaktív interpreter használata körülményes. Írjunk Python modult `dns_tool.py` néven az előző feladatban megvalósított funkcióhoz! A forráskód: ```python from dns.resolver import query from dns.exception import DNSException # input: dns name and optional the type of the record and return all the answered data in a list or in # case of exception an empty list def get_mx(dns_name, type="MX"): try: answers = query(dns_name, type) except DNSException: return [] ret = [] for a in answers: element = (str(a.preference), str(a.exchange)) ret.append(element) return ret ``` Futtatás: ```bash $ python3 >>> import dns_tool >>> help() help> dns_tool.get_mx Help on function get_mx in dns_tool: dns_tool.get_mx = get_mx(dns_name, type='MX') # input: dns name and optional the type of the record and return all the answered data in a list # or in case of exception an empty list >>> list = dns_tool.get_mx('google.com') >>> for e in list: ... print(e) ... ('40', 'alt3.aspmx.l.google.com.') ('20', 'alt1.aspmx.l.google.com.') ('50', 'alt4.aspmx.l.google.com.') ('10', 'aspmx.l.google.com.') ('30', 'alt2.aspmx.l.google.com.') >>> >>> list = dns_tool.get_mx('nemletezik.asd') >>> for e in list: ... print(e) ... >>> ``` Készítettem egy függvényt két paraméterrel, majd a korábbi feladat lépéseit implementáltam, csak most függvénybe zárva. Tesztelésnél látszik, hogy a `google.com`-ra szépen jönnek a válaszok, míg a `nemletezik.asd`-re nem, és hibát se dob a kód, egyszerűen üres listát ad vissza. ## 1.d Feladat - Futtatható DNS szkript **Feladat:** Tegyük futtathatóvá az elkészült modult! A forráskód: ```python #!/usr/bin/env python3 from dns.resolver import query from dns.exception import DNSException # input: dns name and optional the type of the record and return all the answered data in a list or in # case of exception an empty list def get_mx(dns_name, type="MX"): try: answers = query(dns_name, type) except DNSException: return [] ret = [] for a in answers: element = (str(a.preference), str(a.exchange)) ret.append(element) return ret if __name__ == "__main__": inp = input("Add meg a lekérdezendő domain-t, valamint ha szeretnéd specifikálni, a rekord típusát is szóközzel " "elválasztva (az alapértelmezett rekord típus az MX): ") inp = inp.split(" ") if len(inp) >= 2: list = get_mx(inp[0], inp[1]) for e in list: print(e) else: list = get_mx(inp[0]) for e in list: print(e) ``` Ahhoz, hogy futtatthatóvá tegyem, elkészítettem neki a `__name__` "függvényt". Itt beállítottam, hogy kérjen be adatot a felhasználótól, és kb leimplementáltam, ahogy eddig kézzel teszteltem. Futtatás: ```bash $ chmod +x dns_tool2.py $ ./dns_tool2.py Add meg a lekérdezendő domain-t, valamint ha szeretnéd specifikálni, a rekord típusát is szóközzel elválasztva (az alapértelmezett rekord típus az MX): google.com MX ./dns_tool2.py:11: DeprecationWarning: please use dns.resolver.resolve() instead answers = query(dns_name, type) ('10', 'aspmx.l.google.com.') ('20', 'alt1.aspmx.l.google.com.') ('50', 'alt4.aspmx.l.google.com.') ('40', 'alt3.aspmx.l.google.com.') ('30', 'alt2.aspmx.l.google.com.') ``` Futtatásnál látszik is, hogy kényelmesen működik. ---