diff --git a/README.md b/README.md index 497ad707de419c44e12817c235ad290f47652bc3..ddf4b627e5d06e1eb8b78287ebe071fca8765104 100644 --- a/README.md +++ b/README.md @@ -166,4 +166,48 @@ A Python standard kĂśnyvtĂĄrai egyarĂĄnt tĂĄmogatjĂĄk az alacsony-szintĹą, socke Az alacsony-szintĹą hĂĄlĂłzatkezelĂŠs (CPython ĂŠs Linux kĂśrnyezet rĂŠvĂŠn) a C nyelvi szintaktikĂĄra ĂŠpĂźl, ahol a nyelv a Linux socket-kezelĹ rendszerhĂvĂĄsait ajĂĄnlja ki. A kĂśvetezĹ kĂŠp ezt az alacsony-szintĹą TCP kommunikĂĄciĂłt ĂŠs az ahhoz meghĂvandĂł fĂźggvĂŠnyeket szemlĂŠlteti: - \ No newline at end of file + + +- [time_server.py.txt](https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/time_server.py.txt2): +Skeleton fĂĄjl a 3. feladathoz - Nevezd ĂĄt! + +HASZNOS PARANCSOK ElĹfordulhat a szkriptek futtatĂĄsĂĄnĂĄl, hogy a fĂŠlkĂŠsz kĂłdok miatt a socket-ek beragadnak ĂŠs +lefoglaljĂĄk az adott portot/cĂmet. Ekkor a mĂŠg futĂł programokat manuĂĄlisan kell leĂĄllĂtanunk: + +- Nyitott portok listĂĄzĂĄsa: `$ netstat -tuplen` (vagy `ss -tulpn` modernebb rendszereken - blint) +- FutĂł Python programok kilistĂĄzĂĄsa: `$ ps auxf | grep python` +- Program lelĂśvĂŠse: `$ sudo kill <PID> vagy a drasztikusabb $ sudo kill -9 <PID> ` + +## 3.a Feladat - Time szerver + +**Feladat:** Ărjunk Python szkriptet `time_server.py` nĂŠven, ami megvalĂłsĂt egy pontos idĹt visszaadĂł, +TCP alapĂş szerver funkciĂłt. A szerver a kliensek kapcsolĂłdĂĄsa utĂĄn szimplĂĄn adja vissza a pontos idĹt +(a klienseket kĂźlĂśn szĂĄlon kezelve), majd bontsa a kapcsolatot. A megvalĂłsĂtĂĄshoz hasznĂĄljuk a +Python magas-szintĹą [socketserver](https://docs.python.org/3.5/library/socketserver.html#socketserver-tcpserver-example) +csomagjĂĄban definiĂĄlt `ThreadingTCPServer` osztĂĄlyt. + +- [time_server.py.txt](https://qosip.tmit.bme.hu/foswiki/pub/Meres/PythonFeladatok/time_server.py.txt2): +Skeleton fĂĄjl a 2. feladathoz + +- A szerver implementĂĄciĂłkat ĂŠs handler osztĂĄlyokat a socketserver csomagban talĂĄljuk. +- A szerver osztĂĄlyok csak a kapcsolĂłdĂĄst menedzselik a Python alacsony-szintĹą socket interfĂŠszĂŠn keresztĂźl. +A kĂŠrĂŠseket speciĂĄlis `RequestHandler` osztĂĄlyok kezelik le. Ărjunk sajĂĄt osztĂĄlyt a kĂŠrĂŠsek kezelĂŠsĂŠhez, +amely a `BaseRequestHandler` osztĂĄlybĂłl szĂĄrmazzon! +- NĂŠzzĂźnk utĂĄna a server ĂŠs handler osztĂĄlyok kapcsolatĂĄnak, mĹąkĂśdĂŠsĂŠnek ĂŠs a kĂŠrĂŠsek kezelĂŠsĂŠnek! +DefiniĂĄljuk felĂźl a `handle()` metĂłdust, amiben rĂśgtĂśn a kapcsolĂłdĂĄs utĂĄn adjuk vissza a pontos idĹt! +- Ăzenet kĂźldĂŠsĂŠhez hasznĂĄljuk a `socket` objektum `sendall()` metĂłdusĂĄt. +Ne felejtsĂźk el lezĂĄrni a kapcsolatot a vĂĄlasz utĂĄn (`close()`)! +- A `socket` objektum a handler osztĂĄlyban a `request` attribĂştumkĂŠnt ĂŠrhetĹ el. +- A pontos idĹ visszaadĂĄsĂĄhoz hasznĂĄljuk a `time` csomagot (`ctime()` fĂźggvĂŠny)! +- A socket kommunikĂĄciĂłhoz `bytes` tĂpusra konvertĂĄlĂĄs szĂźksĂŠges. Ehhez hasznĂĄljuk az `str` tĂpus beĂŠpĂtett +`encode()` fĂźggvĂŠnyĂŠt. +- Ne felejtsĂźk el elindĂtani a szervert a szkriptben, paramĂŠterĂźl megadva a (*cĂm - port*) tuple-t ĂŠs a sajĂĄt handler +osztĂĄlyunkat! **Ehhez pĂŠldakĂłdot talĂĄlunk a `socketserver` modul dokumentĂĄciĂłjĂĄban!** +- A szerver IP cĂmĂŠt ĂŠs port szĂĄmĂĄt kĂŠrjĂźk be a szkript indĂtĂĄsi paramĂŠterekĂŠnt. +Ehhez hasznĂĄljuk a beĂŠpĂtett `argparse` csomagot! DokumentĂĄciĂł ĂŠs pĂŠldakĂłdok: +[argparse](https://docs.python.org/3.5/library/argparse.html) +- Minden beolvasott paramĂŠter string! Port szĂĄm esetĂŠn explicite konvertĂĄljuk az ĂŠrtĂŠket `int` tĂpusĂşra! +- *Ctrl-C* kombinĂĄciĂłval valĂł szabĂĄlyos kilĂŠpĂŠshez kezeljĂźk le a dobott `KeyboardInterrupt` kivĂŠtelt ĂŠs ĂĄllĂtsuk le +a szervert (`server.shutdown()`)! +- TesztelĂŠshez hasznĂĄljuk a `telnet` programot. Pl.: `$ telnet localhost 8000` + diff --git a/solutions/2_feladat.md b/solutions/2_feladat.md index ad6957be9f5132fca314330b4e2a125136c78056..a31b1f4e1f735d6998723ebddb9b4be7b03639dc 100644 --- a/solutions/2_feladat.md +++ b/solutions/2_feladat.md @@ -1,6 +1,7 @@ # 2. fealadat - Statisztika szkript - +**Feladat:** KĂŠszĂtsĂźnk futtathatĂł Python szkriptet `mirror_stat.py` nĂŠven, amely statisztikĂĄt kĂŠszĂt megadott +Debian mirror szerverek elĂŠrhetĹsĂŠgĂŠrĹl, amit a futĂĄsa vĂŠgĂŠn ki is listĂĄz! A forrĂĄskĂłd: @@ -26,7 +27,7 @@ def pingging(domains): for domain in domains: stats[domain] = ping3.ping(domain) - # don't need sudo prev for this in a modern system + # don't need sudo priv for this in a modern system return stats @@ -47,7 +48,7 @@ if __name__ == '__main__': FuttatĂĄs: ```bash -$ ./mirror_stat.py # don't need sudo prev for this in a modern system +$ ./mirror_stat.py # don't need sudo priv for this in a modern system {'ftp.at.debian.org': 0.03299736976623535, 'ftp.au.debian.org': 0.34027576446533203, 'ftp.be.debian.org': 0.03146529197692871, diff --git a/solutions/3_feladat.md b/solutions/3_feladat.md new file mode 100644 index 0000000000000000000000000000000000000000..9934e705c760e6345b2b8de8329e9ec9b48662b7 --- /dev/null +++ b/solutions/3_feladat.md @@ -0,0 +1,50 @@ +# 3. Feladat - HĂĄlĂłzati kommunikĂĄciĂł - port szkenner + +## 3.a Feladat - Time szerver + +**Feladat:** Ărjunk Python szkriptet `time_server.py` nĂŠven, ami megvalĂłsĂt egy pontos idĹt visszaadĂł, +TCP alapĂş szerver funkciĂłt. A szerver a kliensek kapcsolĂłdĂĄsa utĂĄn szimplĂĄn adja vissza a pontos idĹt +(a klienseket kĂźlĂśn szĂĄlon kezelve), majd bontsa a kapcsolatot. + +A forrĂĄskĂłd: + +```python +#!/usr/bin/env python3 + +from socketserver import BaseRequestHandler, ThreadingTCPServer +import time +import argparse + + +class MyHandler(BaseRequestHandler): + def handle(self): + self.request.sendall(str.encode(time.ctime())) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Time server") + parser.add_argument('--ip', type=str) + parser.add_argument('--port', type=int) + args = parser.parse_args() + a = vars(args) + HOST, PORT = a["ip"], int(a["port"]) + server = ThreadingTCPServer((HOST, PORT), MyHandler) + try: + server.serve_forever() + except KeyboardInterrupt: + server.shutdown() +``` + +FuttatĂĄs: + +```bash +$ chmod +x time_server.py +$ ./time_server.py --ip="localhost" --port=9999 +``` + +TesztelĂŠs: + +```bash +$ nc localhost 9999 +Mon Mar 7 17:56:58 2022 +``` \ No newline at end of file diff --git a/time_server.py b/time_server.py new file mode 100755 index 0000000000000000000000000000000000000000..005441ea8ce5434cac6b3339c54797890c260802 --- /dev/null +++ b/time_server.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 + +from socketserver import BaseRequestHandler, ThreadingTCPServer +import time +import argparse + + +class MyHandler(BaseRequestHandler): + def handle(self): + self.request.sendall(str.encode(time.ctime())) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Time server") + parser.add_argument('--ip', type=str) + parser.add_argument('--port', type=int) + args = parser.parse_args() + a = vars(args) + HOST, PORT = a["ip"], int(a["port"]) + server = ThreadingTCPServer((HOST, PORT), MyHandler) + try: + server.serve_forever() + except KeyboardInterrupt: + server.shutdown()