From 1327e6dd94dcd181a6e1d8b16010ecbf6db431db Mon Sep 17 00:00:00 2001 From: Florent Becker Date: Tue, 21 Sep 2021 17:01:29 +0200 Subject: [PATCH] =?UTF-8?q?200=20d=C3=A9mons=20triviaux?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- source/1_echauffement.rst.in | 11 +++++ source/exercice0.rst | 11 +++++ source/exercice0/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice0/daemon.py.old | 52 +++++++++++++++++++ source/exercice0/requirements.txt | 3 ++ source/exercice0/setup.py | 7 +++ source/exercice0/shell.nix | 3 ++ source/exercice1.rst | 11 +++++ source/exercice1/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice1/daemon.py.old | 52 +++++++++++++++++++ source/exercice1/requirements.txt | 3 ++ source/exercice1/setup.py | 7 +++ source/exercice1/shell.nix | 3 ++ source/exercice10.rst | 11 +++++ source/exercice10/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice10/daemon.py.old | 52 +++++++++++++++++++ source/exercice10/requirements.txt | 3 ++ source/exercice10/setup.py | 7 +++ source/exercice10/shell.nix | 3 ++ source/exercice100.rst | 11 +++++ source/exercice100/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice100/daemon.py.old | 52 +++++++++++++++++++ source/exercice100/requirements.txt | 3 ++ source/exercice100/setup.py | 7 +++ source/exercice100/shell.nix | 3 ++ source/exercice101.rst | 11 +++++ source/exercice101/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice101/daemon.py.old | 52 +++++++++++++++++++ source/exercice101/requirements.txt | 3 ++ source/exercice101/setup.py | 7 +++ source/exercice101/shell.nix | 3 ++ source/exercice102.rst | 11 +++++ source/exercice102/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice102/daemon.py.old | 52 +++++++++++++++++++ source/exercice102/requirements.txt | 3 ++ source/exercice102/setup.py | 7 +++ source/exercice102/shell.nix | 3 ++ source/exercice103.rst | 11 +++++ source/exercice103/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice103/daemon.py.old | 52 +++++++++++++++++++ source/exercice103/requirements.txt | 3 ++ source/exercice103/setup.py | 7 +++ source/exercice103/shell.nix | 3 ++ source/exercice104.rst | 11 +++++ source/exercice104/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice104/daemon.py.old | 52 +++++++++++++++++++ source/exercice104/requirements.txt | 3 ++ source/exercice104/setup.py | 7 +++ source/exercice104/shell.nix | 3 ++ source/exercice105.rst | 11 +++++ source/exercice105/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice105/daemon.py.old | 52 +++++++++++++++++++ source/exercice105/requirements.txt | 3 ++ source/exercice105/setup.py | 7 +++ source/exercice105/shell.nix | 3 ++ source/exercice106.rst | 11 +++++ source/exercice106/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice106/daemon.py.old | 52 +++++++++++++++++++ source/exercice106/requirements.txt | 3 ++ source/exercice106/setup.py | 7 +++ source/exercice106/shell.nix | 3 ++ source/exercice107.rst | 11 +++++ source/exercice107/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice107/daemon.py.old | 52 +++++++++++++++++++ source/exercice107/requirements.txt | 3 ++ source/exercice107/setup.py | 7 +++ source/exercice107/shell.nix | 3 ++ source/exercice108.rst | 11 +++++ source/exercice108/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice108/daemon.py.old | 52 +++++++++++++++++++ source/exercice108/requirements.txt | 3 ++ source/exercice108/setup.py | 7 +++ source/exercice108/shell.nix | 3 ++ source/exercice109.rst | 11 +++++ source/exercice109/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice109/daemon.py.old | 52 +++++++++++++++++++ source/exercice109/requirements.txt | 3 ++ source/exercice109/setup.py | 7 +++ source/exercice109/shell.nix | 3 ++ source/exercice11.rst | 11 +++++ source/exercice11/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice11/daemon.py.old | 52 +++++++++++++++++++ source/exercice11/requirements.txt | 3 ++ source/exercice11/setup.py | 7 +++ source/exercice11/shell.nix | 3 ++ source/exercice110.rst | 11 +++++ source/exercice110/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice110/daemon.py.old | 52 +++++++++++++++++++ source/exercice110/requirements.txt | 3 ++ source/exercice110/setup.py | 7 +++ source/exercice110/shell.nix | 3 ++ source/exercice111.rst | 11 +++++ source/exercice111/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice111/daemon.py.old | 52 +++++++++++++++++++ source/exercice111/requirements.txt | 3 ++ source/exercice111/setup.py | 7 +++ source/exercice111/shell.nix | 3 ++ source/exercice112.rst | 11 +++++ source/exercice112/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice112/daemon.py.old | 52 +++++++++++++++++++ source/exercice112/requirements.txt | 3 ++ source/exercice112/setup.py | 7 +++ source/exercice112/shell.nix | 3 ++ source/exercice113.rst | 11 +++++ source/exercice113/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice113/daemon.py.old | 52 +++++++++++++++++++ source/exercice113/requirements.txt | 3 ++ source/exercice113/setup.py | 7 +++ source/exercice113/shell.nix | 3 ++ source/exercice114.rst | 11 +++++ source/exercice114/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice114/daemon.py.old | 52 +++++++++++++++++++ source/exercice114/requirements.txt | 3 ++ source/exercice114/setup.py | 7 +++ source/exercice114/shell.nix | 3 ++ source/exercice115.rst | 11 +++++ source/exercice115/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice115/daemon.py.old | 52 +++++++++++++++++++ source/exercice115/requirements.txt | 3 ++ source/exercice115/setup.py | 7 +++ source/exercice115/shell.nix | 3 ++ source/exercice116.rst | 11 +++++ source/exercice116/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice116/daemon.py.old | 52 +++++++++++++++++++ source/exercice116/requirements.txt | 3 ++ source/exercice116/setup.py | 7 +++ source/exercice116/shell.nix | 3 ++ source/exercice117.rst | 11 +++++ source/exercice117/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice117/daemon.py.old | 52 +++++++++++++++++++ source/exercice117/requirements.txt | 3 ++ source/exercice117/setup.py | 7 +++ source/exercice117/shell.nix | 3 ++ source/exercice118.rst | 11 +++++ source/exercice118/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice118/daemon.py.old | 52 +++++++++++++++++++ source/exercice118/requirements.txt | 3 ++ source/exercice118/setup.py | 7 +++ source/exercice118/shell.nix | 3 ++ source/exercice119.rst | 11 +++++ source/exercice119/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice119/daemon.py.old | 52 +++++++++++++++++++ source/exercice119/requirements.txt | 3 ++ source/exercice119/setup.py | 7 +++ source/exercice119/shell.nix | 3 ++ source/exercice12.rst | 11 +++++ source/exercice12/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice12/daemon.py.old | 52 +++++++++++++++++++ source/exercice12/requirements.txt | 3 ++ source/exercice12/setup.py | 7 +++ source/exercice12/shell.nix | 3 ++ source/exercice120.rst | 11 +++++ source/exercice120/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice120/daemon.py.old | 52 +++++++++++++++++++ source/exercice120/requirements.txt | 3 ++ source/exercice120/setup.py | 7 +++ source/exercice120/shell.nix | 3 ++ source/exercice121.rst | 11 +++++ source/exercice121/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice121/daemon.py.old | 52 +++++++++++++++++++ source/exercice121/requirements.txt | 3 ++ source/exercice121/setup.py | 7 +++ source/exercice121/shell.nix | 3 ++ source/exercice122.rst | 11 +++++ source/exercice122/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice122/daemon.py.old | 52 +++++++++++++++++++ source/exercice122/requirements.txt | 3 ++ source/exercice122/setup.py | 7 +++ source/exercice122/shell.nix | 3 ++ source/exercice123.rst | 11 +++++ source/exercice123/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice123/daemon.py.old | 52 +++++++++++++++++++ source/exercice123/requirements.txt | 3 ++ source/exercice123/setup.py | 7 +++ source/exercice123/shell.nix | 3 ++ source/exercice124.rst | 11 +++++ source/exercice124/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice124/daemon.py.old | 52 +++++++++++++++++++ source/exercice124/requirements.txt | 3 ++ source/exercice124/setup.py | 7 +++ source/exercice124/shell.nix | 3 ++ source/exercice125.rst | 11 +++++ source/exercice125/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice125/daemon.py.old | 52 +++++++++++++++++++ source/exercice125/requirements.txt | 3 ++ source/exercice125/setup.py | 7 +++ source/exercice125/shell.nix | 3 ++ source/exercice126.rst | 11 +++++ source/exercice126/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice126/daemon.py.old | 52 +++++++++++++++++++ source/exercice126/requirements.txt | 3 ++ source/exercice126/setup.py | 7 +++ source/exercice126/shell.nix | 3 ++ source/exercice127.rst | 11 +++++ source/exercice127/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice127/daemon.py.old | 52 +++++++++++++++++++ source/exercice127/requirements.txt | 3 ++ source/exercice127/setup.py | 7 +++ source/exercice127/shell.nix | 3 ++ source/exercice128.rst | 11 +++++ source/exercice128/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice128/daemon.py.old | 52 +++++++++++++++++++ source/exercice128/requirements.txt | 3 ++ source/exercice128/setup.py | 7 +++ source/exercice128/shell.nix | 3 ++ source/exercice129.rst | 11 +++++ source/exercice129/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice129/daemon.py.old | 52 +++++++++++++++++++ source/exercice129/requirements.txt | 3 ++ source/exercice129/setup.py | 7 +++ source/exercice129/shell.nix | 3 ++ source/exercice13.rst | 11 +++++ source/exercice13/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice13/daemon.py.old | 52 +++++++++++++++++++ source/exercice13/requirements.txt | 3 ++ source/exercice13/setup.py | 7 +++ source/exercice13/shell.nix | 3 ++ source/exercice130.rst | 11 +++++ source/exercice130/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice130/daemon.py.old | 52 +++++++++++++++++++ source/exercice130/requirements.txt | 3 ++ source/exercice130/setup.py | 7 +++ source/exercice130/shell.nix | 3 ++ source/exercice131.rst | 11 +++++ source/exercice131/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice131/daemon.py.old | 52 +++++++++++++++++++ source/exercice131/requirements.txt | 3 ++ source/exercice131/setup.py | 7 +++ source/exercice131/shell.nix | 3 ++ source/exercice132.rst | 11 +++++ source/exercice132/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice132/daemon.py.old | 52 +++++++++++++++++++ source/exercice132/requirements.txt | 3 ++ source/exercice132/setup.py | 7 +++ source/exercice132/shell.nix | 3 ++ source/exercice133.rst | 11 +++++ source/exercice133/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice133/daemon.py.old | 52 +++++++++++++++++++ source/exercice133/requirements.txt | 3 ++ source/exercice133/setup.py | 7 +++ source/exercice133/shell.nix | 3 ++ source/exercice134.rst | 11 +++++ source/exercice134/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice134/daemon.py.old | 52 +++++++++++++++++++ source/exercice134/requirements.txt | 3 ++ source/exercice134/setup.py | 7 +++ source/exercice134/shell.nix | 3 ++ source/exercice135.rst | 11 +++++ source/exercice135/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice135/daemon.py.old | 52 +++++++++++++++++++ source/exercice135/requirements.txt | 3 ++ source/exercice135/setup.py | 7 +++ source/exercice135/shell.nix | 3 ++ source/exercice136.rst | 11 +++++ source/exercice136/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice136/daemon.py.old | 52 +++++++++++++++++++ source/exercice136/requirements.txt | 3 ++ source/exercice136/setup.py | 7 +++ source/exercice136/shell.nix | 3 ++ source/exercice137.rst | 11 +++++ source/exercice137/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice137/daemon.py.old | 52 +++++++++++++++++++ source/exercice137/requirements.txt | 3 ++ source/exercice137/setup.py | 7 +++ source/exercice137/shell.nix | 3 ++ source/exercice138.rst | 11 +++++ source/exercice138/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice138/daemon.py.old | 52 +++++++++++++++++++ source/exercice138/requirements.txt | 3 ++ source/exercice138/setup.py | 7 +++ source/exercice138/shell.nix | 3 ++ source/exercice139.rst | 11 +++++ source/exercice139/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice139/daemon.py.old | 52 +++++++++++++++++++ source/exercice139/requirements.txt | 3 ++ source/exercice139/setup.py | 7 +++ source/exercice139/shell.nix | 3 ++ source/exercice14.rst | 11 +++++ source/exercice14/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice14/daemon.py.old | 52 +++++++++++++++++++ source/exercice14/requirements.txt | 3 ++ source/exercice14/setup.py | 7 +++ source/exercice14/shell.nix | 3 ++ source/exercice140.rst | 11 +++++ source/exercice140/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice140/daemon.py.old | 52 +++++++++++++++++++ source/exercice140/requirements.txt | 3 ++ source/exercice140/setup.py | 7 +++ source/exercice140/shell.nix | 3 ++ source/exercice141.rst | 11 +++++ source/exercice141/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice141/daemon.py.old | 52 +++++++++++++++++++ source/exercice141/requirements.txt | 3 ++ source/exercice141/setup.py | 7 +++ source/exercice141/shell.nix | 3 ++ source/exercice142.rst | 11 +++++ source/exercice142/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice142/daemon.py.old | 52 +++++++++++++++++++ source/exercice142/requirements.txt | 3 ++ source/exercice142/setup.py | 7 +++ source/exercice142/shell.nix | 3 ++ source/exercice143.rst | 11 +++++ source/exercice143/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice143/daemon.py.old | 52 +++++++++++++++++++ source/exercice143/requirements.txt | 3 ++ source/exercice143/setup.py | 7 +++ source/exercice143/shell.nix | 3 ++ source/exercice144.rst | 11 +++++ source/exercice144/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice144/daemon.py.old | 52 +++++++++++++++++++ source/exercice144/requirements.txt | 3 ++ source/exercice144/setup.py | 7 +++ source/exercice144/shell.nix | 3 ++ source/exercice145.rst | 11 +++++ source/exercice145/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice145/daemon.py.old | 52 +++++++++++++++++++ source/exercice145/requirements.txt | 3 ++ source/exercice145/setup.py | 7 +++ source/exercice145/shell.nix | 3 ++ source/exercice146.rst | 11 +++++ source/exercice146/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice146/daemon.py.old | 52 +++++++++++++++++++ source/exercice146/requirements.txt | 3 ++ source/exercice146/setup.py | 7 +++ source/exercice146/shell.nix | 3 ++ source/exercice147.rst | 11 +++++ source/exercice147/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice147/daemon.py.old | 52 +++++++++++++++++++ source/exercice147/requirements.txt | 3 ++ source/exercice147/setup.py | 7 +++ source/exercice147/shell.nix | 3 ++ source/exercice148.rst | 11 +++++ source/exercice148/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice148/daemon.py.old | 52 +++++++++++++++++++ source/exercice148/requirements.txt | 3 ++ source/exercice148/setup.py | 7 +++ source/exercice148/shell.nix | 3 ++ source/exercice149.rst | 11 +++++ source/exercice149/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice149/daemon.py.old | 52 +++++++++++++++++++ source/exercice149/requirements.txt | 3 ++ source/exercice149/setup.py | 7 +++ source/exercice149/shell.nix | 3 ++ source/exercice15.rst | 11 +++++ source/exercice15/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice15/daemon.py.old | 52 +++++++++++++++++++ source/exercice15/requirements.txt | 3 ++ source/exercice15/setup.py | 7 +++ source/exercice15/shell.nix | 3 ++ source/exercice150.rst | 11 +++++ source/exercice150/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice150/daemon.py.old | 52 +++++++++++++++++++ source/exercice150/requirements.txt | 3 ++ source/exercice150/setup.py | 7 +++ source/exercice150/shell.nix | 3 ++ source/exercice151.rst | 11 +++++ source/exercice151/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice151/daemon.py.old | 52 +++++++++++++++++++ source/exercice151/requirements.txt | 3 ++ source/exercice151/setup.py | 7 +++ source/exercice151/shell.nix | 3 ++ source/exercice152.rst | 11 +++++ source/exercice152/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice152/daemon.py.old | 52 +++++++++++++++++++ source/exercice152/requirements.txt | 3 ++ source/exercice152/setup.py | 7 +++ source/exercice152/shell.nix | 3 ++ source/exercice153.rst | 11 +++++ source/exercice153/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice153/daemon.py.old | 52 +++++++++++++++++++ source/exercice153/requirements.txt | 3 ++ source/exercice153/setup.py | 7 +++ source/exercice153/shell.nix | 3 ++ source/exercice154.rst | 11 +++++ source/exercice154/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice154/daemon.py.old | 52 +++++++++++++++++++ source/exercice154/requirements.txt | 3 ++ source/exercice154/setup.py | 7 +++ source/exercice154/shell.nix | 3 ++ source/exercice155.rst | 11 +++++ source/exercice155/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice155/daemon.py.old | 52 +++++++++++++++++++ source/exercice155/requirements.txt | 3 ++ source/exercice155/setup.py | 7 +++ source/exercice155/shell.nix | 3 ++ source/exercice156.rst | 11 +++++ source/exercice156/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice156/daemon.py.old | 52 +++++++++++++++++++ source/exercice156/requirements.txt | 3 ++ source/exercice156/setup.py | 7 +++ source/exercice156/shell.nix | 3 ++ source/exercice157.rst | 11 +++++ source/exercice157/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice157/daemon.py.old | 52 +++++++++++++++++++ source/exercice157/requirements.txt | 3 ++ source/exercice157/setup.py | 7 +++ source/exercice157/shell.nix | 3 ++ source/exercice158.rst | 11 +++++ source/exercice158/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice158/daemon.py.old | 52 +++++++++++++++++++ source/exercice158/requirements.txt | 3 ++ source/exercice158/setup.py | 7 +++ source/exercice158/shell.nix | 3 ++ source/exercice159.rst | 11 +++++ source/exercice159/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice159/daemon.py.old | 52 +++++++++++++++++++ source/exercice159/requirements.txt | 3 ++ source/exercice159/setup.py | 7 +++ source/exercice159/shell.nix | 3 ++ source/exercice16.rst | 11 +++++ source/exercice16/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice16/daemon.py.old | 52 +++++++++++++++++++ source/exercice16/requirements.txt | 3 ++ source/exercice16/setup.py | 7 +++ source/exercice16/shell.nix | 3 ++ source/exercice160.rst | 11 +++++ source/exercice160/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice160/daemon.py.old | 52 +++++++++++++++++++ source/exercice160/requirements.txt | 3 ++ source/exercice160/setup.py | 7 +++ source/exercice160/shell.nix | 3 ++ source/exercice161.rst | 11 +++++ source/exercice161/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice161/daemon.py.old | 52 +++++++++++++++++++ source/exercice161/requirements.txt | 3 ++ source/exercice161/setup.py | 7 +++ source/exercice161/shell.nix | 3 ++ source/exercice162.rst | 11 +++++ source/exercice162/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice162/daemon.py.old | 52 +++++++++++++++++++ source/exercice162/requirements.txt | 3 ++ source/exercice162/setup.py | 7 +++ source/exercice162/shell.nix | 3 ++ source/exercice163.rst | 11 +++++ source/exercice163/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice163/daemon.py.old | 52 +++++++++++++++++++ source/exercice163/requirements.txt | 3 ++ source/exercice163/setup.py | 7 +++ source/exercice163/shell.nix | 3 ++ source/exercice164.rst | 11 +++++ source/exercice164/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice164/daemon.py.old | 52 +++++++++++++++++++ source/exercice164/requirements.txt | 3 ++ source/exercice164/setup.py | 7 +++ source/exercice164/shell.nix | 3 ++ source/exercice165.rst | 11 +++++ source/exercice165/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice165/daemon.py.old | 52 +++++++++++++++++++ source/exercice165/requirements.txt | 3 ++ source/exercice165/setup.py | 7 +++ source/exercice165/shell.nix | 3 ++ source/exercice166.rst | 11 +++++ source/exercice166/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice166/daemon.py.old | 52 +++++++++++++++++++ source/exercice166/requirements.txt | 3 ++ source/exercice166/setup.py | 7 +++ source/exercice166/shell.nix | 3 ++ source/exercice167.rst | 11 +++++ source/exercice167/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice167/daemon.py.old | 52 +++++++++++++++++++ source/exercice167/requirements.txt | 3 ++ source/exercice167/setup.py | 7 +++ source/exercice167/shell.nix | 3 ++ source/exercice168.rst | 11 +++++ source/exercice168/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice168/daemon.py.old | 52 +++++++++++++++++++ source/exercice168/requirements.txt | 3 ++ source/exercice168/setup.py | 7 +++ source/exercice168/shell.nix | 3 ++ source/exercice169.rst | 11 +++++ source/exercice169/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice169/daemon.py.old | 52 +++++++++++++++++++ source/exercice169/requirements.txt | 3 ++ source/exercice169/setup.py | 7 +++ source/exercice169/shell.nix | 3 ++ source/exercice17.rst | 11 +++++ source/exercice17/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice17/daemon.py.old | 52 +++++++++++++++++++ source/exercice17/requirements.txt | 3 ++ source/exercice17/setup.py | 7 +++ source/exercice17/shell.nix | 3 ++ source/exercice170.rst | 11 +++++ source/exercice170/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice170/daemon.py.old | 52 +++++++++++++++++++ source/exercice170/requirements.txt | 3 ++ source/exercice170/setup.py | 7 +++ source/exercice170/shell.nix | 3 ++ source/exercice171.rst | 11 +++++ source/exercice171/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice171/daemon.py.old | 52 +++++++++++++++++++ source/exercice171/requirements.txt | 3 ++ source/exercice171/setup.py | 7 +++ source/exercice171/shell.nix | 3 ++ source/exercice172.rst | 11 +++++ source/exercice172/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice172/daemon.py.old | 52 +++++++++++++++++++ source/exercice172/requirements.txt | 3 ++ source/exercice172/setup.py | 7 +++ source/exercice172/shell.nix | 3 ++ source/exercice173.rst | 11 +++++ source/exercice173/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice173/daemon.py.old | 52 +++++++++++++++++++ source/exercice173/requirements.txt | 3 ++ source/exercice173/setup.py | 7 +++ source/exercice173/shell.nix | 3 ++ source/exercice174.rst | 11 +++++ source/exercice174/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice174/daemon.py.old | 52 +++++++++++++++++++ source/exercice174/requirements.txt | 3 ++ source/exercice174/setup.py | 7 +++ source/exercice174/shell.nix | 3 ++ source/exercice175.rst | 11 +++++ source/exercice175/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice175/daemon.py.old | 52 +++++++++++++++++++ source/exercice175/requirements.txt | 3 ++ source/exercice175/setup.py | 7 +++ source/exercice175/shell.nix | 3 ++ source/exercice176.rst | 11 +++++ source/exercice176/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice176/daemon.py.old | 52 +++++++++++++++++++ source/exercice176/requirements.txt | 3 ++ source/exercice176/setup.py | 7 +++ source/exercice176/shell.nix | 3 ++ source/exercice177.rst | 11 +++++ source/exercice177/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice177/daemon.py.old | 52 +++++++++++++++++++ source/exercice177/requirements.txt | 3 ++ source/exercice177/setup.py | 7 +++ source/exercice177/shell.nix | 3 ++ source/exercice178.rst | 11 +++++ source/exercice178/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice178/daemon.py.old | 52 +++++++++++++++++++ source/exercice178/requirements.txt | 3 ++ source/exercice178/setup.py | 7 +++ source/exercice178/shell.nix | 3 ++ source/exercice179.rst | 11 +++++ source/exercice179/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice179/daemon.py.old | 52 +++++++++++++++++++ source/exercice179/requirements.txt | 3 ++ source/exercice179/setup.py | 7 +++ source/exercice179/shell.nix | 3 ++ source/exercice18.rst | 11 +++++ source/exercice18/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice18/daemon.py.old | 52 +++++++++++++++++++ source/exercice18/requirements.txt | 3 ++ source/exercice18/setup.py | 7 +++ source/exercice18/shell.nix | 3 ++ source/exercice180.rst | 11 +++++ source/exercice180/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice180/daemon.py.old | 52 +++++++++++++++++++ source/exercice180/requirements.txt | 3 ++ source/exercice180/setup.py | 7 +++ source/exercice180/shell.nix | 3 ++ source/exercice181.rst | 11 +++++ source/exercice181/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice181/daemon.py.old | 52 +++++++++++++++++++ source/exercice181/requirements.txt | 3 ++ source/exercice181/setup.py | 7 +++ source/exercice181/shell.nix | 3 ++ source/exercice182.rst | 11 +++++ source/exercice182/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice182/daemon.py.old | 52 +++++++++++++++++++ source/exercice182/requirements.txt | 3 ++ source/exercice182/setup.py | 7 +++ source/exercice182/shell.nix | 3 ++ source/exercice183.rst | 11 +++++ source/exercice183/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice183/daemon.py.old | 52 +++++++++++++++++++ source/exercice183/requirements.txt | 3 ++ source/exercice183/setup.py | 7 +++ source/exercice183/shell.nix | 3 ++ source/exercice184.rst | 11 +++++ source/exercice184/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice184/daemon.py.old | 52 +++++++++++++++++++ source/exercice184/requirements.txt | 3 ++ source/exercice184/setup.py | 7 +++ source/exercice184/shell.nix | 3 ++ source/exercice185.rst | 11 +++++ source/exercice185/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice185/daemon.py.old | 52 +++++++++++++++++++ source/exercice185/requirements.txt | 3 ++ source/exercice185/setup.py | 7 +++ source/exercice185/shell.nix | 3 ++ source/exercice186.rst | 11 +++++ source/exercice186/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice186/daemon.py.old | 52 +++++++++++++++++++ source/exercice186/requirements.txt | 3 ++ source/exercice186/setup.py | 7 +++ source/exercice186/shell.nix | 3 ++ source/exercice187.rst | 11 +++++ source/exercice187/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice187/daemon.py.old | 52 +++++++++++++++++++ source/exercice187/requirements.txt | 3 ++ source/exercice187/setup.py | 7 +++ source/exercice187/shell.nix | 3 ++ source/exercice188.rst | 11 +++++ source/exercice188/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice188/daemon.py.old | 52 +++++++++++++++++++ source/exercice188/requirements.txt | 3 ++ source/exercice188/setup.py | 7 +++ source/exercice188/shell.nix | 3 ++ source/exercice189.rst | 11 +++++ source/exercice189/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice189/daemon.py.old | 52 +++++++++++++++++++ source/exercice189/requirements.txt | 3 ++ source/exercice189/setup.py | 7 +++ source/exercice189/shell.nix | 3 ++ source/exercice19.rst | 11 +++++ source/exercice19/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice19/daemon.py.old | 52 +++++++++++++++++++ source/exercice19/requirements.txt | 3 ++ source/exercice19/setup.py | 7 +++ source/exercice19/shell.nix | 3 ++ source/exercice190.rst | 11 +++++ source/exercice190/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice190/daemon.py.old | 52 +++++++++++++++++++ source/exercice190/requirements.txt | 3 ++ source/exercice190/setup.py | 7 +++ source/exercice190/shell.nix | 3 ++ source/exercice191.rst | 11 +++++ source/exercice191/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice191/daemon.py.old | 52 +++++++++++++++++++ source/exercice191/requirements.txt | 3 ++ source/exercice191/setup.py | 7 +++ source/exercice191/shell.nix | 3 ++ source/exercice192.rst | 11 +++++ source/exercice192/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice192/daemon.py.old | 52 +++++++++++++++++++ source/exercice192/requirements.txt | 3 ++ source/exercice192/setup.py | 7 +++ source/exercice192/shell.nix | 3 ++ source/exercice193.rst | 11 +++++ source/exercice193/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice193/daemon.py.old | 52 +++++++++++++++++++ source/exercice193/requirements.txt | 3 ++ source/exercice193/setup.py | 7 +++ source/exercice193/shell.nix | 3 ++ source/exercice194.rst | 11 +++++ source/exercice194/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice194/daemon.py.old | 52 +++++++++++++++++++ source/exercice194/requirements.txt | 3 ++ source/exercice194/setup.py | 7 +++ source/exercice194/shell.nix | 3 ++ source/exercice195.rst | 11 +++++ source/exercice195/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice195/daemon.py.old | 52 +++++++++++++++++++ source/exercice195/requirements.txt | 3 ++ source/exercice195/setup.py | 7 +++ source/exercice195/shell.nix | 3 ++ source/exercice196.rst | 11 +++++ source/exercice196/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice196/daemon.py.old | 52 +++++++++++++++++++ source/exercice196/requirements.txt | 3 ++ source/exercice196/setup.py | 7 +++ source/exercice196/shell.nix | 3 ++ source/exercice197.rst | 11 +++++ source/exercice197/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice197/daemon.py.old | 52 +++++++++++++++++++ source/exercice197/requirements.txt | 3 ++ source/exercice197/setup.py | 7 +++ source/exercice197/shell.nix | 3 ++ source/exercice198.rst | 11 +++++ source/exercice198/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice198/daemon.py.old | 52 +++++++++++++++++++ source/exercice198/requirements.txt | 3 ++ source/exercice198/setup.py | 7 +++ source/exercice198/shell.nix | 3 ++ source/exercice199.rst | 11 +++++ source/exercice199/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice199/daemon.py.old | 52 +++++++++++++++++++ source/exercice199/requirements.txt | 3 ++ source/exercice199/setup.py | 7 +++ source/exercice199/shell.nix | 3 ++ source/exercice2.rst | 11 +++++ source/exercice2/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice2/daemon.py.old | 52 +++++++++++++++++++ source/exercice2/requirements.txt | 3 ++ source/exercice2/setup.py | 7 +++ source/exercice2/shell.nix | 3 ++ source/exercice20.rst | 11 +++++ source/exercice20/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice20/daemon.py.old | 52 +++++++++++++++++++ source/exercice20/requirements.txt | 3 ++ source/exercice20/setup.py | 7 +++ source/exercice20/shell.nix | 3 ++ source/exercice200.rst | 11 +++++ source/exercice200/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice200/daemon.py.old | 52 +++++++++++++++++++ source/exercice200/requirements.txt | 3 ++ source/exercice200/setup.py | 7 +++ source/exercice200/shell.nix | 3 ++ source/exercice21.rst | 11 +++++ source/exercice21/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice21/daemon.py.old | 52 +++++++++++++++++++ source/exercice21/requirements.txt | 3 ++ source/exercice21/setup.py | 7 +++ source/exercice21/shell.nix | 3 ++ source/exercice22.rst | 11 +++++ source/exercice22/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice22/daemon.py.old | 52 +++++++++++++++++++ source/exercice22/requirements.txt | 3 ++ source/exercice22/setup.py | 7 +++ source/exercice22/shell.nix | 3 ++ source/exercice23.rst | 11 +++++ source/exercice23/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice23/daemon.py.old | 52 +++++++++++++++++++ source/exercice23/requirements.txt | 3 ++ source/exercice23/setup.py | 7 +++ source/exercice23/shell.nix | 3 ++ source/exercice24.rst | 11 +++++ source/exercice24/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice24/daemon.py.old | 52 +++++++++++++++++++ source/exercice24/requirements.txt | 3 ++ source/exercice24/setup.py | 7 +++ source/exercice24/shell.nix | 3 ++ source/exercice25.rst | 11 +++++ source/exercice25/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice25/daemon.py.old | 52 +++++++++++++++++++ source/exercice25/requirements.txt | 3 ++ source/exercice25/setup.py | 7 +++ source/exercice25/shell.nix | 3 ++ source/exercice26.rst | 11 +++++ source/exercice26/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice26/daemon.py.old | 52 +++++++++++++++++++ source/exercice26/requirements.txt | 3 ++ source/exercice26/setup.py | 7 +++ source/exercice26/shell.nix | 3 ++ source/exercice27.rst | 11 +++++ source/exercice27/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice27/daemon.py.old | 52 +++++++++++++++++++ source/exercice27/requirements.txt | 3 ++ source/exercice27/setup.py | 7 +++ source/exercice27/shell.nix | 3 ++ source/exercice28.rst | 11 +++++ source/exercice28/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice28/daemon.py.old | 52 +++++++++++++++++++ source/exercice28/requirements.txt | 3 ++ source/exercice28/setup.py | 7 +++ source/exercice28/shell.nix | 3 ++ source/exercice29.rst | 11 +++++ source/exercice29/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice29/daemon.py.old | 52 +++++++++++++++++++ source/exercice29/requirements.txt | 3 ++ source/exercice29/setup.py | 7 +++ source/exercice29/shell.nix | 3 ++ source/exercice3.rst | 11 +++++ source/exercice3/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice3/daemon.py.old | 52 +++++++++++++++++++ source/exercice3/requirements.txt | 3 ++ source/exercice3/setup.py | 7 +++ source/exercice3/shell.nix | 3 ++ source/exercice30.rst | 11 +++++ source/exercice30/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice30/daemon.py.old | 52 +++++++++++++++++++ source/exercice30/requirements.txt | 3 ++ source/exercice30/setup.py | 7 +++ source/exercice30/shell.nix | 3 ++ source/exercice31.rst | 11 +++++ source/exercice31/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice31/daemon.py.old | 52 +++++++++++++++++++ source/exercice31/requirements.txt | 3 ++ source/exercice31/setup.py | 7 +++ source/exercice31/shell.nix | 3 ++ source/exercice32.rst | 11 +++++ source/exercice32/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice32/daemon.py.old | 52 +++++++++++++++++++ source/exercice32/requirements.txt | 3 ++ source/exercice32/setup.py | 7 +++ source/exercice32/shell.nix | 3 ++ source/exercice33.rst | 11 +++++ source/exercice33/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice33/daemon.py.old | 52 +++++++++++++++++++ source/exercice33/requirements.txt | 3 ++ source/exercice33/setup.py | 7 +++ source/exercice33/shell.nix | 3 ++ source/exercice34.rst | 11 +++++ source/exercice34/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice34/daemon.py.old | 52 +++++++++++++++++++ source/exercice34/requirements.txt | 3 ++ source/exercice34/setup.py | 7 +++ source/exercice34/shell.nix | 3 ++ source/exercice35.rst | 11 +++++ source/exercice35/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice35/daemon.py.old | 52 +++++++++++++++++++ source/exercice35/requirements.txt | 3 ++ source/exercice35/setup.py | 7 +++ source/exercice35/shell.nix | 3 ++ source/exercice36.rst | 11 +++++ source/exercice36/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice36/daemon.py.old | 52 +++++++++++++++++++ source/exercice36/requirements.txt | 3 ++ source/exercice36/setup.py | 7 +++ source/exercice36/shell.nix | 3 ++ source/exercice37.rst | 11 +++++ source/exercice37/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice37/daemon.py.old | 52 +++++++++++++++++++ source/exercice37/requirements.txt | 3 ++ source/exercice37/setup.py | 7 +++ source/exercice37/shell.nix | 3 ++ source/exercice38.rst | 11 +++++ source/exercice38/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice38/daemon.py.old | 52 +++++++++++++++++++ source/exercice38/requirements.txt | 3 ++ source/exercice38/setup.py | 7 +++ source/exercice38/shell.nix | 3 ++ source/exercice39.rst | 11 +++++ source/exercice39/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice39/daemon.py.old | 52 +++++++++++++++++++ source/exercice39/requirements.txt | 3 ++ source/exercice39/setup.py | 7 +++ source/exercice39/shell.nix | 3 ++ source/exercice4.rst | 11 +++++ source/exercice4/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice4/daemon.py.old | 52 +++++++++++++++++++ source/exercice4/requirements.txt | 3 ++ source/exercice4/setup.py | 7 +++ source/exercice4/shell.nix | 3 ++ source/exercice40.rst | 11 +++++ source/exercice40/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice40/daemon.py.old | 52 +++++++++++++++++++ source/exercice40/requirements.txt | 3 ++ source/exercice40/setup.py | 7 +++ source/exercice40/shell.nix | 3 ++ source/exercice41.rst | 11 +++++ source/exercice41/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice41/daemon.py.old | 52 +++++++++++++++++++ source/exercice41/requirements.txt | 3 ++ source/exercice41/setup.py | 7 +++ source/exercice41/shell.nix | 3 ++ source/exercice42.rst | 11 +++++ source/exercice42/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice42/daemon.py.old | 52 +++++++++++++++++++ source/exercice42/requirements.txt | 3 ++ source/exercice42/setup.py | 7 +++ source/exercice42/shell.nix | 3 ++ source/exercice43.rst | 11 +++++ source/exercice43/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice43/daemon.py.old | 52 +++++++++++++++++++ source/exercice43/requirements.txt | 3 ++ source/exercice43/setup.py | 7 +++ source/exercice43/shell.nix | 3 ++ source/exercice44.rst | 11 +++++ source/exercice44/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice44/daemon.py.old | 52 +++++++++++++++++++ source/exercice44/requirements.txt | 3 ++ source/exercice44/setup.py | 7 +++ source/exercice44/shell.nix | 3 ++ source/exercice45.rst | 11 +++++ source/exercice45/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice45/daemon.py.old | 52 +++++++++++++++++++ source/exercice45/requirements.txt | 3 ++ source/exercice45/setup.py | 7 +++ source/exercice45/shell.nix | 3 ++ source/exercice46.rst | 11 +++++ source/exercice46/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice46/daemon.py.old | 52 +++++++++++++++++++ source/exercice46/requirements.txt | 3 ++ source/exercice46/setup.py | 7 +++ source/exercice46/shell.nix | 3 ++ source/exercice47.rst | 11 +++++ source/exercice47/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice47/daemon.py.old | 52 +++++++++++++++++++ source/exercice47/requirements.txt | 3 ++ source/exercice47/setup.py | 7 +++ source/exercice47/shell.nix | 3 ++ source/exercice48.rst | 11 +++++ source/exercice48/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice48/daemon.py.old | 52 +++++++++++++++++++ source/exercice48/requirements.txt | 3 ++ source/exercice48/setup.py | 7 +++ source/exercice48/shell.nix | 3 ++ source/exercice49.rst | 11 +++++ source/exercice49/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice49/daemon.py.old | 52 +++++++++++++++++++ source/exercice49/requirements.txt | 3 ++ source/exercice49/setup.py | 7 +++ source/exercice49/shell.nix | 3 ++ source/exercice5.rst | 11 +++++ source/exercice5/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice5/daemon.py.old | 52 +++++++++++++++++++ source/exercice5/requirements.txt | 3 ++ source/exercice5/setup.py | 7 +++ source/exercice5/shell.nix | 3 ++ source/exercice50.rst | 11 +++++ source/exercice50/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice50/daemon.py.old | 52 +++++++++++++++++++ source/exercice50/requirements.txt | 3 ++ source/exercice50/setup.py | 7 +++ source/exercice50/shell.nix | 3 ++ source/exercice51.rst | 11 +++++ source/exercice51/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice51/daemon.py.old | 52 +++++++++++++++++++ source/exercice51/requirements.txt | 3 ++ source/exercice51/setup.py | 7 +++ source/exercice51/shell.nix | 3 ++ source/exercice52.rst | 11 +++++ source/exercice52/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice52/daemon.py.old | 52 +++++++++++++++++++ source/exercice52/requirements.txt | 3 ++ source/exercice52/setup.py | 7 +++ source/exercice52/shell.nix | 3 ++ source/exercice53.rst | 11 +++++ source/exercice53/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice53/daemon.py.old | 52 +++++++++++++++++++ source/exercice53/requirements.txt | 3 ++ source/exercice53/setup.py | 7 +++ source/exercice53/shell.nix | 3 ++ source/exercice54.rst | 11 +++++ source/exercice54/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice54/daemon.py.old | 52 +++++++++++++++++++ source/exercice54/requirements.txt | 3 ++ source/exercice54/setup.py | 7 +++ source/exercice54/shell.nix | 3 ++ source/exercice55.rst | 11 +++++ source/exercice55/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice55/daemon.py.old | 52 +++++++++++++++++++ source/exercice55/requirements.txt | 3 ++ source/exercice55/setup.py | 7 +++ source/exercice55/shell.nix | 3 ++ source/exercice56.rst | 11 +++++ source/exercice56/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice56/daemon.py.old | 52 +++++++++++++++++++ source/exercice56/requirements.txt | 3 ++ source/exercice56/setup.py | 7 +++ source/exercice56/shell.nix | 3 ++ source/exercice57.rst | 11 +++++ source/exercice57/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice57/daemon.py.old | 52 +++++++++++++++++++ source/exercice57/requirements.txt | 3 ++ source/exercice57/setup.py | 7 +++ source/exercice57/shell.nix | 3 ++ source/exercice58.rst | 11 +++++ source/exercice58/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice58/daemon.py.old | 52 +++++++++++++++++++ source/exercice58/requirements.txt | 3 ++ source/exercice58/setup.py | 7 +++ source/exercice58/shell.nix | 3 ++ source/exercice59.rst | 11 +++++ source/exercice59/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice59/daemon.py.old | 52 +++++++++++++++++++ source/exercice59/requirements.txt | 3 ++ source/exercice59/setup.py | 7 +++ source/exercice59/shell.nix | 3 ++ source/exercice6.rst | 11 +++++ source/exercice6/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice6/daemon.py.old | 52 +++++++++++++++++++ source/exercice6/requirements.txt | 3 ++ source/exercice6/setup.py | 7 +++ source/exercice6/shell.nix | 3 ++ source/exercice60.rst | 11 +++++ source/exercice60/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice60/daemon.py.old | 52 +++++++++++++++++++ source/exercice60/requirements.txt | 3 ++ source/exercice60/setup.py | 7 +++ source/exercice60/shell.nix | 3 ++ source/exercice61.rst | 11 +++++ source/exercice61/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice61/daemon.py.old | 52 +++++++++++++++++++ source/exercice61/requirements.txt | 3 ++ source/exercice61/setup.py | 7 +++ source/exercice61/shell.nix | 3 ++ source/exercice62.rst | 11 +++++ source/exercice62/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice62/daemon.py.old | 52 +++++++++++++++++++ source/exercice62/requirements.txt | 3 ++ source/exercice62/setup.py | 7 +++ source/exercice62/shell.nix | 3 ++ source/exercice63.rst | 11 +++++ source/exercice63/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice63/daemon.py.old | 52 +++++++++++++++++++ source/exercice63/requirements.txt | 3 ++ source/exercice63/setup.py | 7 +++ source/exercice63/shell.nix | 3 ++ source/exercice64.rst | 11 +++++ source/exercice64/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice64/daemon.py.old | 52 +++++++++++++++++++ source/exercice64/requirements.txt | 3 ++ source/exercice64/setup.py | 7 +++ source/exercice64/shell.nix | 3 ++ source/exercice65.rst | 11 +++++ source/exercice65/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice65/daemon.py.old | 52 +++++++++++++++++++ source/exercice65/requirements.txt | 3 ++ source/exercice65/setup.py | 7 +++ source/exercice65/shell.nix | 3 ++ source/exercice66.rst | 11 +++++ source/exercice66/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice66/daemon.py.old | 52 +++++++++++++++++++ source/exercice66/requirements.txt | 3 ++ source/exercice66/setup.py | 7 +++ source/exercice66/shell.nix | 3 ++ source/exercice67.rst | 11 +++++ source/exercice67/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice67/daemon.py.old | 52 +++++++++++++++++++ source/exercice67/requirements.txt | 3 ++ source/exercice67/setup.py | 7 +++ source/exercice67/shell.nix | 3 ++ source/exercice68.rst | 11 +++++ source/exercice68/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice68/daemon.py.old | 52 +++++++++++++++++++ source/exercice68/requirements.txt | 3 ++ source/exercice68/setup.py | 7 +++ source/exercice68/shell.nix | 3 ++ source/exercice69.rst | 11 +++++ source/exercice69/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice69/daemon.py.old | 52 +++++++++++++++++++ source/exercice69/requirements.txt | 3 ++ source/exercice69/setup.py | 7 +++ source/exercice69/shell.nix | 3 ++ source/exercice7.rst | 11 +++++ source/exercice7/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice7/daemon.py.old | 52 +++++++++++++++++++ source/exercice7/requirements.txt | 3 ++ source/exercice7/setup.py | 7 +++ source/exercice7/shell.nix | 3 ++ source/exercice70.rst | 11 +++++ source/exercice70/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice70/daemon.py.old | 52 +++++++++++++++++++ source/exercice70/requirements.txt | 3 ++ source/exercice70/setup.py | 7 +++ source/exercice70/shell.nix | 3 ++ source/exercice71.rst | 11 +++++ source/exercice71/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice71/daemon.py.old | 52 +++++++++++++++++++ source/exercice71/requirements.txt | 3 ++ source/exercice71/setup.py | 7 +++ source/exercice71/shell.nix | 3 ++ source/exercice72.rst | 11 +++++ source/exercice72/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice72/daemon.py.old | 52 +++++++++++++++++++ source/exercice72/requirements.txt | 3 ++ source/exercice72/setup.py | 7 +++ source/exercice72/shell.nix | 3 ++ source/exercice73.rst | 11 +++++ source/exercice73/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice73/daemon.py.old | 52 +++++++++++++++++++ source/exercice73/requirements.txt | 3 ++ source/exercice73/setup.py | 7 +++ source/exercice73/shell.nix | 3 ++ source/exercice74.rst | 11 +++++ source/exercice74/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice74/daemon.py.old | 52 +++++++++++++++++++ source/exercice74/requirements.txt | 3 ++ source/exercice74/setup.py | 7 +++ source/exercice74/shell.nix | 3 ++ source/exercice75.rst | 11 +++++ source/exercice75/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice75/daemon.py.old | 52 +++++++++++++++++++ source/exercice75/requirements.txt | 3 ++ source/exercice75/setup.py | 7 +++ source/exercice75/shell.nix | 3 ++ source/exercice76.rst | 11 +++++ source/exercice76/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice76/daemon.py.old | 52 +++++++++++++++++++ source/exercice76/requirements.txt | 3 ++ source/exercice76/setup.py | 7 +++ source/exercice76/shell.nix | 3 ++ source/exercice77.rst | 11 +++++ source/exercice77/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice77/daemon.py.old | 52 +++++++++++++++++++ source/exercice77/requirements.txt | 3 ++ source/exercice77/setup.py | 7 +++ source/exercice77/shell.nix | 3 ++ source/exercice78.rst | 11 +++++ source/exercice78/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice78/daemon.py.old | 52 +++++++++++++++++++ source/exercice78/requirements.txt | 3 ++ source/exercice78/setup.py | 7 +++ source/exercice78/shell.nix | 3 ++ source/exercice79.rst | 11 +++++ source/exercice79/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice79/daemon.py.old | 52 +++++++++++++++++++ source/exercice79/requirements.txt | 3 ++ source/exercice79/setup.py | 7 +++ source/exercice79/shell.nix | 3 ++ source/exercice8.rst | 11 +++++ source/exercice8/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice8/daemon.py.old | 52 +++++++++++++++++++ source/exercice8/requirements.txt | 3 ++ source/exercice8/setup.py | 7 +++ source/exercice8/shell.nix | 3 ++ source/exercice80.rst | 11 +++++ source/exercice80/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice80/daemon.py.old | 52 +++++++++++++++++++ source/exercice80/requirements.txt | 3 ++ source/exercice80/setup.py | 7 +++ source/exercice80/shell.nix | 3 ++ source/exercice81.rst | 11 +++++ source/exercice81/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice81/daemon.py.old | 52 +++++++++++++++++++ source/exercice81/requirements.txt | 3 ++ source/exercice81/setup.py | 7 +++ source/exercice81/shell.nix | 3 ++ source/exercice82.rst | 11 +++++ source/exercice82/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice82/daemon.py.old | 52 +++++++++++++++++++ source/exercice82/requirements.txt | 3 ++ source/exercice82/setup.py | 7 +++ source/exercice82/shell.nix | 3 ++ source/exercice83.rst | 11 +++++ source/exercice83/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice83/daemon.py.old | 52 +++++++++++++++++++ source/exercice83/requirements.txt | 3 ++ source/exercice83/setup.py | 7 +++ source/exercice83/shell.nix | 3 ++ source/exercice84.rst | 11 +++++ source/exercice84/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice84/daemon.py.old | 52 +++++++++++++++++++ source/exercice84/requirements.txt | 3 ++ source/exercice84/setup.py | 7 +++ source/exercice84/shell.nix | 3 ++ source/exercice85.rst | 11 +++++ source/exercice85/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice85/daemon.py.old | 52 +++++++++++++++++++ source/exercice85/requirements.txt | 3 ++ source/exercice85/setup.py | 7 +++ source/exercice85/shell.nix | 3 ++ source/exercice86.rst | 11 +++++ source/exercice86/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice86/daemon.py.old | 52 +++++++++++++++++++ source/exercice86/requirements.txt | 3 ++ source/exercice86/setup.py | 7 +++ source/exercice86/shell.nix | 3 ++ source/exercice87.rst | 11 +++++ source/exercice87/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice87/daemon.py.old | 52 +++++++++++++++++++ source/exercice87/requirements.txt | 3 ++ source/exercice87/setup.py | 7 +++ source/exercice87/shell.nix | 3 ++ source/exercice88.rst | 11 +++++ source/exercice88/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice88/daemon.py.old | 52 +++++++++++++++++++ source/exercice88/requirements.txt | 3 ++ source/exercice88/setup.py | 7 +++ source/exercice88/shell.nix | 3 ++ source/exercice89.rst | 11 +++++ source/exercice89/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice89/daemon.py.old | 52 +++++++++++++++++++ source/exercice89/requirements.txt | 3 ++ source/exercice89/setup.py | 7 +++ source/exercice89/shell.nix | 3 ++ source/exercice9.rst | 11 +++++ source/exercice9/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice9/daemon.py.old | 52 +++++++++++++++++++ source/exercice9/requirements.txt | 3 ++ source/exercice9/setup.py | 7 +++ source/exercice9/shell.nix | 3 ++ source/exercice90.rst | 11 +++++ source/exercice90/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice90/daemon.py.old | 52 +++++++++++++++++++ source/exercice90/requirements.txt | 3 ++ source/exercice90/setup.py | 7 +++ source/exercice90/shell.nix | 3 ++ source/exercice91.rst | 11 +++++ source/exercice91/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice91/daemon.py.old | 52 +++++++++++++++++++ source/exercice91/requirements.txt | 3 ++ source/exercice91/setup.py | 7 +++ source/exercice91/shell.nix | 3 ++ source/exercice92.rst | 11 +++++ source/exercice92/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice92/daemon.py.old | 52 +++++++++++++++++++ source/exercice92/requirements.txt | 3 ++ source/exercice92/setup.py | 7 +++ source/exercice92/shell.nix | 3 ++ source/exercice93.rst | 11 +++++ source/exercice93/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice93/daemon.py.old | 52 +++++++++++++++++++ source/exercice93/requirements.txt | 3 ++ source/exercice93/setup.py | 7 +++ source/exercice93/shell.nix | 3 ++ source/exercice94.rst | 11 +++++ source/exercice94/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice94/daemon.py.old | 52 +++++++++++++++++++ source/exercice94/requirements.txt | 3 ++ source/exercice94/setup.py | 7 +++ source/exercice94/shell.nix | 3 ++ source/exercice95.rst | 11 +++++ source/exercice95/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice95/daemon.py.old | 52 +++++++++++++++++++ source/exercice95/requirements.txt | 3 ++ source/exercice95/setup.py | 7 +++ source/exercice95/shell.nix | 3 ++ source/exercice96.rst | 11 +++++ source/exercice96/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice96/daemon.py.old | 52 +++++++++++++++++++ source/exercice96/requirements.txt | 3 ++ source/exercice96/setup.py | 7 +++ source/exercice96/shell.nix | 3 ++ source/exercice97.rst | 11 +++++ source/exercice97/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice97/daemon.py.old | 52 +++++++++++++++++++ source/exercice97/requirements.txt | 3 ++ source/exercice97/setup.py | 7 +++ source/exercice97/shell.nix | 3 ++ source/exercice98.rst | 11 +++++ source/exercice98/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice98/daemon.py.old | 52 +++++++++++++++++++ source/exercice98/requirements.txt | 3 ++ source/exercice98/setup.py | 7 +++ source/exercice98/shell.nix | 3 ++ source/exercice99.rst | 11 +++++ source/exercice99/daemon.py | 77 +++++++++++++++++++++++++++++ source/exercice99/daemon.py.old | 52 +++++++++++++++++++ source/exercice99/requirements.txt | 3 ++ source/exercice99/setup.py | 7 +++ source/exercice99/shell.nix | 3 ++ source/index.rst | 16 ++++++ 1208 files changed, 30780 insertions(+) create mode 100644 source/1_echauffement.rst.in create mode 100644 source/exercice0.rst create mode 100644 source/exercice0/daemon.py create mode 100644 source/exercice0/daemon.py.old create mode 100644 source/exercice0/requirements.txt create mode 100644 source/exercice0/setup.py create mode 100644 source/exercice0/shell.nix create mode 100644 source/exercice1.rst create mode 100644 source/exercice1/daemon.py create mode 100644 source/exercice1/daemon.py.old create mode 100644 source/exercice1/requirements.txt create mode 100644 source/exercice1/setup.py create mode 100644 source/exercice1/shell.nix create mode 100644 source/exercice10.rst create mode 100644 source/exercice10/daemon.py create mode 100644 source/exercice10/daemon.py.old create mode 100644 source/exercice10/requirements.txt create mode 100644 source/exercice10/setup.py create mode 100644 source/exercice10/shell.nix create mode 100644 source/exercice100.rst create mode 100644 source/exercice100/daemon.py create mode 100644 source/exercice100/daemon.py.old create mode 100644 source/exercice100/requirements.txt create mode 100644 source/exercice100/setup.py create mode 100644 source/exercice100/shell.nix create mode 100644 source/exercice101.rst create mode 100644 source/exercice101/daemon.py create mode 100644 source/exercice101/daemon.py.old create mode 100644 source/exercice101/requirements.txt create mode 100644 source/exercice101/setup.py create mode 100644 source/exercice101/shell.nix create mode 100644 source/exercice102.rst create mode 100644 source/exercice102/daemon.py create mode 100644 source/exercice102/daemon.py.old create mode 100644 source/exercice102/requirements.txt create mode 100644 source/exercice102/setup.py create mode 100644 source/exercice102/shell.nix create mode 100644 source/exercice103.rst create mode 100644 source/exercice103/daemon.py create mode 100644 source/exercice103/daemon.py.old create mode 100644 source/exercice103/requirements.txt create mode 100644 source/exercice103/setup.py create mode 100644 source/exercice103/shell.nix create mode 100644 source/exercice104.rst create mode 100644 source/exercice104/daemon.py create mode 100644 source/exercice104/daemon.py.old create mode 100644 source/exercice104/requirements.txt create mode 100644 source/exercice104/setup.py create mode 100644 source/exercice104/shell.nix create mode 100644 source/exercice105.rst create mode 100644 source/exercice105/daemon.py create mode 100644 source/exercice105/daemon.py.old create mode 100644 source/exercice105/requirements.txt create mode 100644 source/exercice105/setup.py create mode 100644 source/exercice105/shell.nix create mode 100644 source/exercice106.rst create mode 100644 source/exercice106/daemon.py create mode 100644 source/exercice106/daemon.py.old create mode 100644 source/exercice106/requirements.txt create mode 100644 source/exercice106/setup.py create mode 100644 source/exercice106/shell.nix create mode 100644 source/exercice107.rst create mode 100644 source/exercice107/daemon.py create mode 100644 source/exercice107/daemon.py.old create mode 100644 source/exercice107/requirements.txt create mode 100644 source/exercice107/setup.py create mode 100644 source/exercice107/shell.nix create mode 100644 source/exercice108.rst create mode 100644 source/exercice108/daemon.py create mode 100644 source/exercice108/daemon.py.old create mode 100644 source/exercice108/requirements.txt create mode 100644 source/exercice108/setup.py create mode 100644 source/exercice108/shell.nix create mode 100644 source/exercice109.rst create mode 100644 source/exercice109/daemon.py create mode 100644 source/exercice109/daemon.py.old create mode 100644 source/exercice109/requirements.txt create mode 100644 source/exercice109/setup.py create mode 100644 source/exercice109/shell.nix create mode 100644 source/exercice11.rst create mode 100644 source/exercice11/daemon.py create mode 100644 source/exercice11/daemon.py.old create mode 100644 source/exercice11/requirements.txt create mode 100644 source/exercice11/setup.py create mode 100644 source/exercice11/shell.nix create mode 100644 source/exercice110.rst create mode 100644 source/exercice110/daemon.py create mode 100644 source/exercice110/daemon.py.old create mode 100644 source/exercice110/requirements.txt create mode 100644 source/exercice110/setup.py create mode 100644 source/exercice110/shell.nix create mode 100644 source/exercice111.rst create mode 100644 source/exercice111/daemon.py create mode 100644 source/exercice111/daemon.py.old create mode 100644 source/exercice111/requirements.txt create mode 100644 source/exercice111/setup.py create mode 100644 source/exercice111/shell.nix create mode 100644 source/exercice112.rst create mode 100644 source/exercice112/daemon.py create mode 100644 source/exercice112/daemon.py.old create mode 100644 source/exercice112/requirements.txt create mode 100644 source/exercice112/setup.py create mode 100644 source/exercice112/shell.nix create mode 100644 source/exercice113.rst create mode 100644 source/exercice113/daemon.py create mode 100644 source/exercice113/daemon.py.old create mode 100644 source/exercice113/requirements.txt create mode 100644 source/exercice113/setup.py create mode 100644 source/exercice113/shell.nix create mode 100644 source/exercice114.rst create mode 100644 source/exercice114/daemon.py create mode 100644 source/exercice114/daemon.py.old create mode 100644 source/exercice114/requirements.txt create mode 100644 source/exercice114/setup.py create mode 100644 source/exercice114/shell.nix create mode 100644 source/exercice115.rst create mode 100644 source/exercice115/daemon.py create mode 100644 source/exercice115/daemon.py.old create mode 100644 source/exercice115/requirements.txt create mode 100644 source/exercice115/setup.py create mode 100644 source/exercice115/shell.nix create mode 100644 source/exercice116.rst create mode 100644 source/exercice116/daemon.py create mode 100644 source/exercice116/daemon.py.old create mode 100644 source/exercice116/requirements.txt create mode 100644 source/exercice116/setup.py create mode 100644 source/exercice116/shell.nix create mode 100644 source/exercice117.rst create mode 100644 source/exercice117/daemon.py create mode 100644 source/exercice117/daemon.py.old create mode 100644 source/exercice117/requirements.txt create mode 100644 source/exercice117/setup.py create mode 100644 source/exercice117/shell.nix create mode 100644 source/exercice118.rst create mode 100644 source/exercice118/daemon.py create mode 100644 source/exercice118/daemon.py.old create mode 100644 source/exercice118/requirements.txt create mode 100644 source/exercice118/setup.py create mode 100644 source/exercice118/shell.nix create mode 100644 source/exercice119.rst create mode 100644 source/exercice119/daemon.py create mode 100644 source/exercice119/daemon.py.old create mode 100644 source/exercice119/requirements.txt create mode 100644 source/exercice119/setup.py create mode 100644 source/exercice119/shell.nix create mode 100644 source/exercice12.rst create mode 100644 source/exercice12/daemon.py create mode 100644 source/exercice12/daemon.py.old create mode 100644 source/exercice12/requirements.txt create mode 100644 source/exercice12/setup.py create mode 100644 source/exercice12/shell.nix create mode 100644 source/exercice120.rst create mode 100644 source/exercice120/daemon.py create mode 100644 source/exercice120/daemon.py.old create mode 100644 source/exercice120/requirements.txt create mode 100644 source/exercice120/setup.py create mode 100644 source/exercice120/shell.nix create mode 100644 source/exercice121.rst create mode 100644 source/exercice121/daemon.py create mode 100644 source/exercice121/daemon.py.old create mode 100644 source/exercice121/requirements.txt create mode 100644 source/exercice121/setup.py create mode 100644 source/exercice121/shell.nix create mode 100644 source/exercice122.rst create mode 100644 source/exercice122/daemon.py create mode 100644 source/exercice122/daemon.py.old create mode 100644 source/exercice122/requirements.txt create mode 100644 source/exercice122/setup.py create mode 100644 source/exercice122/shell.nix create mode 100644 source/exercice123.rst create mode 100644 source/exercice123/daemon.py create mode 100644 source/exercice123/daemon.py.old create mode 100644 source/exercice123/requirements.txt create mode 100644 source/exercice123/setup.py create mode 100644 source/exercice123/shell.nix create mode 100644 source/exercice124.rst create mode 100644 source/exercice124/daemon.py create mode 100644 source/exercice124/daemon.py.old create mode 100644 source/exercice124/requirements.txt create mode 100644 source/exercice124/setup.py create mode 100644 source/exercice124/shell.nix create mode 100644 source/exercice125.rst create mode 100644 source/exercice125/daemon.py create mode 100644 source/exercice125/daemon.py.old create mode 100644 source/exercice125/requirements.txt create mode 100644 source/exercice125/setup.py create mode 100644 source/exercice125/shell.nix create mode 100644 source/exercice126.rst create mode 100644 source/exercice126/daemon.py create mode 100644 source/exercice126/daemon.py.old create mode 100644 source/exercice126/requirements.txt create mode 100644 source/exercice126/setup.py create mode 100644 source/exercice126/shell.nix create mode 100644 source/exercice127.rst create mode 100644 source/exercice127/daemon.py create mode 100644 source/exercice127/daemon.py.old create mode 100644 source/exercice127/requirements.txt create mode 100644 source/exercice127/setup.py create mode 100644 source/exercice127/shell.nix create mode 100644 source/exercice128.rst create mode 100644 source/exercice128/daemon.py create mode 100644 source/exercice128/daemon.py.old create mode 100644 source/exercice128/requirements.txt create mode 100644 source/exercice128/setup.py create mode 100644 source/exercice128/shell.nix create mode 100644 source/exercice129.rst create mode 100644 source/exercice129/daemon.py create mode 100644 source/exercice129/daemon.py.old create mode 100644 source/exercice129/requirements.txt create mode 100644 source/exercice129/setup.py create mode 100644 source/exercice129/shell.nix create mode 100644 source/exercice13.rst create mode 100644 source/exercice13/daemon.py create mode 100644 source/exercice13/daemon.py.old create mode 100644 source/exercice13/requirements.txt create mode 100644 source/exercice13/setup.py create mode 100644 source/exercice13/shell.nix create mode 100644 source/exercice130.rst create mode 100644 source/exercice130/daemon.py create mode 100644 source/exercice130/daemon.py.old create mode 100644 source/exercice130/requirements.txt create mode 100644 source/exercice130/setup.py create mode 100644 source/exercice130/shell.nix create mode 100644 source/exercice131.rst create mode 100644 source/exercice131/daemon.py create mode 100644 source/exercice131/daemon.py.old create mode 100644 source/exercice131/requirements.txt create mode 100644 source/exercice131/setup.py create mode 100644 source/exercice131/shell.nix create mode 100644 source/exercice132.rst create mode 100644 source/exercice132/daemon.py create mode 100644 source/exercice132/daemon.py.old create mode 100644 source/exercice132/requirements.txt create mode 100644 source/exercice132/setup.py create mode 100644 source/exercice132/shell.nix create mode 100644 source/exercice133.rst create mode 100644 source/exercice133/daemon.py create mode 100644 source/exercice133/daemon.py.old create mode 100644 source/exercice133/requirements.txt create mode 100644 source/exercice133/setup.py create mode 100644 source/exercice133/shell.nix create mode 100644 source/exercice134.rst create mode 100644 source/exercice134/daemon.py create mode 100644 source/exercice134/daemon.py.old create mode 100644 source/exercice134/requirements.txt create mode 100644 source/exercice134/setup.py create mode 100644 source/exercice134/shell.nix create mode 100644 source/exercice135.rst create mode 100644 source/exercice135/daemon.py create mode 100644 source/exercice135/daemon.py.old create mode 100644 source/exercice135/requirements.txt create mode 100644 source/exercice135/setup.py create mode 100644 source/exercice135/shell.nix create mode 100644 source/exercice136.rst create mode 100644 source/exercice136/daemon.py create mode 100644 source/exercice136/daemon.py.old create mode 100644 source/exercice136/requirements.txt create mode 100644 source/exercice136/setup.py create mode 100644 source/exercice136/shell.nix create mode 100644 source/exercice137.rst create mode 100644 source/exercice137/daemon.py create mode 100644 source/exercice137/daemon.py.old create mode 100644 source/exercice137/requirements.txt create mode 100644 source/exercice137/setup.py create mode 100644 source/exercice137/shell.nix create mode 100644 source/exercice138.rst create mode 100644 source/exercice138/daemon.py create mode 100644 source/exercice138/daemon.py.old create mode 100644 source/exercice138/requirements.txt create mode 100644 source/exercice138/setup.py create mode 100644 source/exercice138/shell.nix create mode 100644 source/exercice139.rst create mode 100644 source/exercice139/daemon.py create mode 100644 source/exercice139/daemon.py.old create mode 100644 source/exercice139/requirements.txt create mode 100644 source/exercice139/setup.py create mode 100644 source/exercice139/shell.nix create mode 100644 source/exercice14.rst create mode 100644 source/exercice14/daemon.py create mode 100644 source/exercice14/daemon.py.old create mode 100644 source/exercice14/requirements.txt create mode 100644 source/exercice14/setup.py create mode 100644 source/exercice14/shell.nix create mode 100644 source/exercice140.rst create mode 100644 source/exercice140/daemon.py create mode 100644 source/exercice140/daemon.py.old create mode 100644 source/exercice140/requirements.txt create mode 100644 source/exercice140/setup.py create mode 100644 source/exercice140/shell.nix create mode 100644 source/exercice141.rst create mode 100644 source/exercice141/daemon.py create mode 100644 source/exercice141/daemon.py.old create mode 100644 source/exercice141/requirements.txt create mode 100644 source/exercice141/setup.py create mode 100644 source/exercice141/shell.nix create mode 100644 source/exercice142.rst create mode 100644 source/exercice142/daemon.py create mode 100644 source/exercice142/daemon.py.old create mode 100644 source/exercice142/requirements.txt create mode 100644 source/exercice142/setup.py create mode 100644 source/exercice142/shell.nix create mode 100644 source/exercice143.rst create mode 100644 source/exercice143/daemon.py create mode 100644 source/exercice143/daemon.py.old create mode 100644 source/exercice143/requirements.txt create mode 100644 source/exercice143/setup.py create mode 100644 source/exercice143/shell.nix create mode 100644 source/exercice144.rst create mode 100644 source/exercice144/daemon.py create mode 100644 source/exercice144/daemon.py.old create mode 100644 source/exercice144/requirements.txt create mode 100644 source/exercice144/setup.py create mode 100644 source/exercice144/shell.nix create mode 100644 source/exercice145.rst create mode 100644 source/exercice145/daemon.py create mode 100644 source/exercice145/daemon.py.old create mode 100644 source/exercice145/requirements.txt create mode 100644 source/exercice145/setup.py create mode 100644 source/exercice145/shell.nix create mode 100644 source/exercice146.rst create mode 100644 source/exercice146/daemon.py create mode 100644 source/exercice146/daemon.py.old create mode 100644 source/exercice146/requirements.txt create mode 100644 source/exercice146/setup.py create mode 100644 source/exercice146/shell.nix create mode 100644 source/exercice147.rst create mode 100644 source/exercice147/daemon.py create mode 100644 source/exercice147/daemon.py.old create mode 100644 source/exercice147/requirements.txt create mode 100644 source/exercice147/setup.py create mode 100644 source/exercice147/shell.nix create mode 100644 source/exercice148.rst create mode 100644 source/exercice148/daemon.py create mode 100644 source/exercice148/daemon.py.old create mode 100644 source/exercice148/requirements.txt create mode 100644 source/exercice148/setup.py create mode 100644 source/exercice148/shell.nix create mode 100644 source/exercice149.rst create mode 100644 source/exercice149/daemon.py create mode 100644 source/exercice149/daemon.py.old create mode 100644 source/exercice149/requirements.txt create mode 100644 source/exercice149/setup.py create mode 100644 source/exercice149/shell.nix create mode 100644 source/exercice15.rst create mode 100644 source/exercice15/daemon.py create mode 100644 source/exercice15/daemon.py.old create mode 100644 source/exercice15/requirements.txt create mode 100644 source/exercice15/setup.py create mode 100644 source/exercice15/shell.nix create mode 100644 source/exercice150.rst create mode 100644 source/exercice150/daemon.py create mode 100644 source/exercice150/daemon.py.old create mode 100644 source/exercice150/requirements.txt create mode 100644 source/exercice150/setup.py create mode 100644 source/exercice150/shell.nix create mode 100644 source/exercice151.rst create mode 100644 source/exercice151/daemon.py create mode 100644 source/exercice151/daemon.py.old create mode 100644 source/exercice151/requirements.txt create mode 100644 source/exercice151/setup.py create mode 100644 source/exercice151/shell.nix create mode 100644 source/exercice152.rst create mode 100644 source/exercice152/daemon.py create mode 100644 source/exercice152/daemon.py.old create mode 100644 source/exercice152/requirements.txt create mode 100644 source/exercice152/setup.py create mode 100644 source/exercice152/shell.nix create mode 100644 source/exercice153.rst create mode 100644 source/exercice153/daemon.py create mode 100644 source/exercice153/daemon.py.old create mode 100644 source/exercice153/requirements.txt create mode 100644 source/exercice153/setup.py create mode 100644 source/exercice153/shell.nix create mode 100644 source/exercice154.rst create mode 100644 source/exercice154/daemon.py create mode 100644 source/exercice154/daemon.py.old create mode 100644 source/exercice154/requirements.txt create mode 100644 source/exercice154/setup.py create mode 100644 source/exercice154/shell.nix create mode 100644 source/exercice155.rst create mode 100644 source/exercice155/daemon.py create mode 100644 source/exercice155/daemon.py.old create mode 100644 source/exercice155/requirements.txt create mode 100644 source/exercice155/setup.py create mode 100644 source/exercice155/shell.nix create mode 100644 source/exercice156.rst create mode 100644 source/exercice156/daemon.py create mode 100644 source/exercice156/daemon.py.old create mode 100644 source/exercice156/requirements.txt create mode 100644 source/exercice156/setup.py create mode 100644 source/exercice156/shell.nix create mode 100644 source/exercice157.rst create mode 100644 source/exercice157/daemon.py create mode 100644 source/exercice157/daemon.py.old create mode 100644 source/exercice157/requirements.txt create mode 100644 source/exercice157/setup.py create mode 100644 source/exercice157/shell.nix create mode 100644 source/exercice158.rst create mode 100644 source/exercice158/daemon.py create mode 100644 source/exercice158/daemon.py.old create mode 100644 source/exercice158/requirements.txt create mode 100644 source/exercice158/setup.py create mode 100644 source/exercice158/shell.nix create mode 100644 source/exercice159.rst create mode 100644 source/exercice159/daemon.py create mode 100644 source/exercice159/daemon.py.old create mode 100644 source/exercice159/requirements.txt create mode 100644 source/exercice159/setup.py create mode 100644 source/exercice159/shell.nix create mode 100644 source/exercice16.rst create mode 100644 source/exercice16/daemon.py create mode 100644 source/exercice16/daemon.py.old create mode 100644 source/exercice16/requirements.txt create mode 100644 source/exercice16/setup.py create mode 100644 source/exercice16/shell.nix create mode 100644 source/exercice160.rst create mode 100644 source/exercice160/daemon.py create mode 100644 source/exercice160/daemon.py.old create mode 100644 source/exercice160/requirements.txt create mode 100644 source/exercice160/setup.py create mode 100644 source/exercice160/shell.nix create mode 100644 source/exercice161.rst create mode 100644 source/exercice161/daemon.py create mode 100644 source/exercice161/daemon.py.old create mode 100644 source/exercice161/requirements.txt create mode 100644 source/exercice161/setup.py create mode 100644 source/exercice161/shell.nix create mode 100644 source/exercice162.rst create mode 100644 source/exercice162/daemon.py create mode 100644 source/exercice162/daemon.py.old create mode 100644 source/exercice162/requirements.txt create mode 100644 source/exercice162/setup.py create mode 100644 source/exercice162/shell.nix create mode 100644 source/exercice163.rst create mode 100644 source/exercice163/daemon.py create mode 100644 source/exercice163/daemon.py.old create mode 100644 source/exercice163/requirements.txt create mode 100644 source/exercice163/setup.py create mode 100644 source/exercice163/shell.nix create mode 100644 source/exercice164.rst create mode 100644 source/exercice164/daemon.py create mode 100644 source/exercice164/daemon.py.old create mode 100644 source/exercice164/requirements.txt create mode 100644 source/exercice164/setup.py create mode 100644 source/exercice164/shell.nix create mode 100644 source/exercice165.rst create mode 100644 source/exercice165/daemon.py create mode 100644 source/exercice165/daemon.py.old create mode 100644 source/exercice165/requirements.txt create mode 100644 source/exercice165/setup.py create mode 100644 source/exercice165/shell.nix create mode 100644 source/exercice166.rst create mode 100644 source/exercice166/daemon.py create mode 100644 source/exercice166/daemon.py.old create mode 100644 source/exercice166/requirements.txt create mode 100644 source/exercice166/setup.py create mode 100644 source/exercice166/shell.nix create mode 100644 source/exercice167.rst create mode 100644 source/exercice167/daemon.py create mode 100644 source/exercice167/daemon.py.old create mode 100644 source/exercice167/requirements.txt create mode 100644 source/exercice167/setup.py create mode 100644 source/exercice167/shell.nix create mode 100644 source/exercice168.rst create mode 100644 source/exercice168/daemon.py create mode 100644 source/exercice168/daemon.py.old create mode 100644 source/exercice168/requirements.txt create mode 100644 source/exercice168/setup.py create mode 100644 source/exercice168/shell.nix create mode 100644 source/exercice169.rst create mode 100644 source/exercice169/daemon.py create mode 100644 source/exercice169/daemon.py.old create mode 100644 source/exercice169/requirements.txt create mode 100644 source/exercice169/setup.py create mode 100644 source/exercice169/shell.nix create mode 100644 source/exercice17.rst create mode 100644 source/exercice17/daemon.py create mode 100644 source/exercice17/daemon.py.old create mode 100644 source/exercice17/requirements.txt create mode 100644 source/exercice17/setup.py create mode 100644 source/exercice17/shell.nix create mode 100644 source/exercice170.rst create mode 100644 source/exercice170/daemon.py create mode 100644 source/exercice170/daemon.py.old create mode 100644 source/exercice170/requirements.txt create mode 100644 source/exercice170/setup.py create mode 100644 source/exercice170/shell.nix create mode 100644 source/exercice171.rst create mode 100644 source/exercice171/daemon.py create mode 100644 source/exercice171/daemon.py.old create mode 100644 source/exercice171/requirements.txt create mode 100644 source/exercice171/setup.py create mode 100644 source/exercice171/shell.nix create mode 100644 source/exercice172.rst create mode 100644 source/exercice172/daemon.py create mode 100644 source/exercice172/daemon.py.old create mode 100644 source/exercice172/requirements.txt create mode 100644 source/exercice172/setup.py create mode 100644 source/exercice172/shell.nix create mode 100644 source/exercice173.rst create mode 100644 source/exercice173/daemon.py create mode 100644 source/exercice173/daemon.py.old create mode 100644 source/exercice173/requirements.txt create mode 100644 source/exercice173/setup.py create mode 100644 source/exercice173/shell.nix create mode 100644 source/exercice174.rst create mode 100644 source/exercice174/daemon.py create mode 100644 source/exercice174/daemon.py.old create mode 100644 source/exercice174/requirements.txt create mode 100644 source/exercice174/setup.py create mode 100644 source/exercice174/shell.nix create mode 100644 source/exercice175.rst create mode 100644 source/exercice175/daemon.py create mode 100644 source/exercice175/daemon.py.old create mode 100644 source/exercice175/requirements.txt create mode 100644 source/exercice175/setup.py create mode 100644 source/exercice175/shell.nix create mode 100644 source/exercice176.rst create mode 100644 source/exercice176/daemon.py create mode 100644 source/exercice176/daemon.py.old create mode 100644 source/exercice176/requirements.txt create mode 100644 source/exercice176/setup.py create mode 100644 source/exercice176/shell.nix create mode 100644 source/exercice177.rst create mode 100644 source/exercice177/daemon.py create mode 100644 source/exercice177/daemon.py.old create mode 100644 source/exercice177/requirements.txt create mode 100644 source/exercice177/setup.py create mode 100644 source/exercice177/shell.nix create mode 100644 source/exercice178.rst create mode 100644 source/exercice178/daemon.py create mode 100644 source/exercice178/daemon.py.old create mode 100644 source/exercice178/requirements.txt create mode 100644 source/exercice178/setup.py create mode 100644 source/exercice178/shell.nix create mode 100644 source/exercice179.rst create mode 100644 source/exercice179/daemon.py create mode 100644 source/exercice179/daemon.py.old create mode 100644 source/exercice179/requirements.txt create mode 100644 source/exercice179/setup.py create mode 100644 source/exercice179/shell.nix create mode 100644 source/exercice18.rst create mode 100644 source/exercice18/daemon.py create mode 100644 source/exercice18/daemon.py.old create mode 100644 source/exercice18/requirements.txt create mode 100644 source/exercice18/setup.py create mode 100644 source/exercice18/shell.nix create mode 100644 source/exercice180.rst create mode 100644 source/exercice180/daemon.py create mode 100644 source/exercice180/daemon.py.old create mode 100644 source/exercice180/requirements.txt create mode 100644 source/exercice180/setup.py create mode 100644 source/exercice180/shell.nix create mode 100644 source/exercice181.rst create mode 100644 source/exercice181/daemon.py create mode 100644 source/exercice181/daemon.py.old create mode 100644 source/exercice181/requirements.txt create mode 100644 source/exercice181/setup.py create mode 100644 source/exercice181/shell.nix create mode 100644 source/exercice182.rst create mode 100644 source/exercice182/daemon.py create mode 100644 source/exercice182/daemon.py.old create mode 100644 source/exercice182/requirements.txt create mode 100644 source/exercice182/setup.py create mode 100644 source/exercice182/shell.nix create mode 100644 source/exercice183.rst create mode 100644 source/exercice183/daemon.py create mode 100644 source/exercice183/daemon.py.old create mode 100644 source/exercice183/requirements.txt create mode 100644 source/exercice183/setup.py create mode 100644 source/exercice183/shell.nix create mode 100644 source/exercice184.rst create mode 100644 source/exercice184/daemon.py create mode 100644 source/exercice184/daemon.py.old create mode 100644 source/exercice184/requirements.txt create mode 100644 source/exercice184/setup.py create mode 100644 source/exercice184/shell.nix create mode 100644 source/exercice185.rst create mode 100644 source/exercice185/daemon.py create mode 100644 source/exercice185/daemon.py.old create mode 100644 source/exercice185/requirements.txt create mode 100644 source/exercice185/setup.py create mode 100644 source/exercice185/shell.nix create mode 100644 source/exercice186.rst create mode 100644 source/exercice186/daemon.py create mode 100644 source/exercice186/daemon.py.old create mode 100644 source/exercice186/requirements.txt create mode 100644 source/exercice186/setup.py create mode 100644 source/exercice186/shell.nix create mode 100644 source/exercice187.rst create mode 100644 source/exercice187/daemon.py create mode 100644 source/exercice187/daemon.py.old create mode 100644 source/exercice187/requirements.txt create mode 100644 source/exercice187/setup.py create mode 100644 source/exercice187/shell.nix create mode 100644 source/exercice188.rst create mode 100644 source/exercice188/daemon.py create mode 100644 source/exercice188/daemon.py.old create mode 100644 source/exercice188/requirements.txt create mode 100644 source/exercice188/setup.py create mode 100644 source/exercice188/shell.nix create mode 100644 source/exercice189.rst create mode 100644 source/exercice189/daemon.py create mode 100644 source/exercice189/daemon.py.old create mode 100644 source/exercice189/requirements.txt create mode 100644 source/exercice189/setup.py create mode 100644 source/exercice189/shell.nix create mode 100644 source/exercice19.rst create mode 100644 source/exercice19/daemon.py create mode 100644 source/exercice19/daemon.py.old create mode 100644 source/exercice19/requirements.txt create mode 100644 source/exercice19/setup.py create mode 100644 source/exercice19/shell.nix create mode 100644 source/exercice190.rst create mode 100644 source/exercice190/daemon.py create mode 100644 source/exercice190/daemon.py.old create mode 100644 source/exercice190/requirements.txt create mode 100644 source/exercice190/setup.py create mode 100644 source/exercice190/shell.nix create mode 100644 source/exercice191.rst create mode 100644 source/exercice191/daemon.py create mode 100644 source/exercice191/daemon.py.old create mode 100644 source/exercice191/requirements.txt create mode 100644 source/exercice191/setup.py create mode 100644 source/exercice191/shell.nix create mode 100644 source/exercice192.rst create mode 100644 source/exercice192/daemon.py create mode 100644 source/exercice192/daemon.py.old create mode 100644 source/exercice192/requirements.txt create mode 100644 source/exercice192/setup.py create mode 100644 source/exercice192/shell.nix create mode 100644 source/exercice193.rst create mode 100644 source/exercice193/daemon.py create mode 100644 source/exercice193/daemon.py.old create mode 100644 source/exercice193/requirements.txt create mode 100644 source/exercice193/setup.py create mode 100644 source/exercice193/shell.nix create mode 100644 source/exercice194.rst create mode 100644 source/exercice194/daemon.py create mode 100644 source/exercice194/daemon.py.old create mode 100644 source/exercice194/requirements.txt create mode 100644 source/exercice194/setup.py create mode 100644 source/exercice194/shell.nix create mode 100644 source/exercice195.rst create mode 100644 source/exercice195/daemon.py create mode 100644 source/exercice195/daemon.py.old create mode 100644 source/exercice195/requirements.txt create mode 100644 source/exercice195/setup.py create mode 100644 source/exercice195/shell.nix create mode 100644 source/exercice196.rst create mode 100644 source/exercice196/daemon.py create mode 100644 source/exercice196/daemon.py.old create mode 100644 source/exercice196/requirements.txt create mode 100644 source/exercice196/setup.py create mode 100644 source/exercice196/shell.nix create mode 100644 source/exercice197.rst create mode 100644 source/exercice197/daemon.py create mode 100644 source/exercice197/daemon.py.old create mode 100644 source/exercice197/requirements.txt create mode 100644 source/exercice197/setup.py create mode 100644 source/exercice197/shell.nix create mode 100644 source/exercice198.rst create mode 100644 source/exercice198/daemon.py create mode 100644 source/exercice198/daemon.py.old create mode 100644 source/exercice198/requirements.txt create mode 100644 source/exercice198/setup.py create mode 100644 source/exercice198/shell.nix create mode 100644 source/exercice199.rst create mode 100644 source/exercice199/daemon.py create mode 100644 source/exercice199/daemon.py.old create mode 100644 source/exercice199/requirements.txt create mode 100644 source/exercice199/setup.py create mode 100644 source/exercice199/shell.nix create mode 100644 source/exercice2.rst create mode 100644 source/exercice2/daemon.py create mode 100644 source/exercice2/daemon.py.old create mode 100644 source/exercice2/requirements.txt create mode 100644 source/exercice2/setup.py create mode 100644 source/exercice2/shell.nix create mode 100644 source/exercice20.rst create mode 100644 source/exercice20/daemon.py create mode 100644 source/exercice20/daemon.py.old create mode 100644 source/exercice20/requirements.txt create mode 100644 source/exercice20/setup.py create mode 100644 source/exercice20/shell.nix create mode 100644 source/exercice200.rst create mode 100644 source/exercice200/daemon.py create mode 100644 source/exercice200/daemon.py.old create mode 100644 source/exercice200/requirements.txt create mode 100644 source/exercice200/setup.py create mode 100644 source/exercice200/shell.nix create mode 100644 source/exercice21.rst create mode 100644 source/exercice21/daemon.py create mode 100644 source/exercice21/daemon.py.old create mode 100644 source/exercice21/requirements.txt create mode 100644 source/exercice21/setup.py create mode 100644 source/exercice21/shell.nix create mode 100644 source/exercice22.rst create mode 100644 source/exercice22/daemon.py create mode 100644 source/exercice22/daemon.py.old create mode 100644 source/exercice22/requirements.txt create mode 100644 source/exercice22/setup.py create mode 100644 source/exercice22/shell.nix create mode 100644 source/exercice23.rst create mode 100644 source/exercice23/daemon.py create mode 100644 source/exercice23/daemon.py.old create mode 100644 source/exercice23/requirements.txt create mode 100644 source/exercice23/setup.py create mode 100644 source/exercice23/shell.nix create mode 100644 source/exercice24.rst create mode 100644 source/exercice24/daemon.py create mode 100644 source/exercice24/daemon.py.old create mode 100644 source/exercice24/requirements.txt create mode 100644 source/exercice24/setup.py create mode 100644 source/exercice24/shell.nix create mode 100644 source/exercice25.rst create mode 100644 source/exercice25/daemon.py create mode 100644 source/exercice25/daemon.py.old create mode 100644 source/exercice25/requirements.txt create mode 100644 source/exercice25/setup.py create mode 100644 source/exercice25/shell.nix create mode 100644 source/exercice26.rst create mode 100644 source/exercice26/daemon.py create mode 100644 source/exercice26/daemon.py.old create mode 100644 source/exercice26/requirements.txt create mode 100644 source/exercice26/setup.py create mode 100644 source/exercice26/shell.nix create mode 100644 source/exercice27.rst create mode 100644 source/exercice27/daemon.py create mode 100644 source/exercice27/daemon.py.old create mode 100644 source/exercice27/requirements.txt create mode 100644 source/exercice27/setup.py create mode 100644 source/exercice27/shell.nix create mode 100644 source/exercice28.rst create mode 100644 source/exercice28/daemon.py create mode 100644 source/exercice28/daemon.py.old create mode 100644 source/exercice28/requirements.txt create mode 100644 source/exercice28/setup.py create mode 100644 source/exercice28/shell.nix create mode 100644 source/exercice29.rst create mode 100644 source/exercice29/daemon.py create mode 100644 source/exercice29/daemon.py.old create mode 100644 source/exercice29/requirements.txt create mode 100644 source/exercice29/setup.py create mode 100644 source/exercice29/shell.nix create mode 100644 source/exercice3.rst create mode 100644 source/exercice3/daemon.py create mode 100644 source/exercice3/daemon.py.old create mode 100644 source/exercice3/requirements.txt create mode 100644 source/exercice3/setup.py create mode 100644 source/exercice3/shell.nix create mode 100644 source/exercice30.rst create mode 100644 source/exercice30/daemon.py create mode 100644 source/exercice30/daemon.py.old create mode 100644 source/exercice30/requirements.txt create mode 100644 source/exercice30/setup.py create mode 100644 source/exercice30/shell.nix create mode 100644 source/exercice31.rst create mode 100644 source/exercice31/daemon.py create mode 100644 source/exercice31/daemon.py.old create mode 100644 source/exercice31/requirements.txt create mode 100644 source/exercice31/setup.py create mode 100644 source/exercice31/shell.nix create mode 100644 source/exercice32.rst create mode 100644 source/exercice32/daemon.py create mode 100644 source/exercice32/daemon.py.old create mode 100644 source/exercice32/requirements.txt create mode 100644 source/exercice32/setup.py create mode 100644 source/exercice32/shell.nix create mode 100644 source/exercice33.rst create mode 100644 source/exercice33/daemon.py create mode 100644 source/exercice33/daemon.py.old create mode 100644 source/exercice33/requirements.txt create mode 100644 source/exercice33/setup.py create mode 100644 source/exercice33/shell.nix create mode 100644 source/exercice34.rst create mode 100644 source/exercice34/daemon.py create mode 100644 source/exercice34/daemon.py.old create mode 100644 source/exercice34/requirements.txt create mode 100644 source/exercice34/setup.py create mode 100644 source/exercice34/shell.nix create mode 100644 source/exercice35.rst create mode 100644 source/exercice35/daemon.py create mode 100644 source/exercice35/daemon.py.old create mode 100644 source/exercice35/requirements.txt create mode 100644 source/exercice35/setup.py create mode 100644 source/exercice35/shell.nix create mode 100644 source/exercice36.rst create mode 100644 source/exercice36/daemon.py create mode 100644 source/exercice36/daemon.py.old create mode 100644 source/exercice36/requirements.txt create mode 100644 source/exercice36/setup.py create mode 100644 source/exercice36/shell.nix create mode 100644 source/exercice37.rst create mode 100644 source/exercice37/daemon.py create mode 100644 source/exercice37/daemon.py.old create mode 100644 source/exercice37/requirements.txt create mode 100644 source/exercice37/setup.py create mode 100644 source/exercice37/shell.nix create mode 100644 source/exercice38.rst create mode 100644 source/exercice38/daemon.py create mode 100644 source/exercice38/daemon.py.old create mode 100644 source/exercice38/requirements.txt create mode 100644 source/exercice38/setup.py create mode 100644 source/exercice38/shell.nix create mode 100644 source/exercice39.rst create mode 100644 source/exercice39/daemon.py create mode 100644 source/exercice39/daemon.py.old create mode 100644 source/exercice39/requirements.txt create mode 100644 source/exercice39/setup.py create mode 100644 source/exercice39/shell.nix create mode 100644 source/exercice4.rst create mode 100644 source/exercice4/daemon.py create mode 100644 source/exercice4/daemon.py.old create mode 100644 source/exercice4/requirements.txt create mode 100644 source/exercice4/setup.py create mode 100644 source/exercice4/shell.nix create mode 100644 source/exercice40.rst create mode 100644 source/exercice40/daemon.py create mode 100644 source/exercice40/daemon.py.old create mode 100644 source/exercice40/requirements.txt create mode 100644 source/exercice40/setup.py create mode 100644 source/exercice40/shell.nix create mode 100644 source/exercice41.rst create mode 100644 source/exercice41/daemon.py create mode 100644 source/exercice41/daemon.py.old create mode 100644 source/exercice41/requirements.txt create mode 100644 source/exercice41/setup.py create mode 100644 source/exercice41/shell.nix create mode 100644 source/exercice42.rst create mode 100644 source/exercice42/daemon.py create mode 100644 source/exercice42/daemon.py.old create mode 100644 source/exercice42/requirements.txt create mode 100644 source/exercice42/setup.py create mode 100644 source/exercice42/shell.nix create mode 100644 source/exercice43.rst create mode 100644 source/exercice43/daemon.py create mode 100644 source/exercice43/daemon.py.old create mode 100644 source/exercice43/requirements.txt create mode 100644 source/exercice43/setup.py create mode 100644 source/exercice43/shell.nix create mode 100644 source/exercice44.rst create mode 100644 source/exercice44/daemon.py create mode 100644 source/exercice44/daemon.py.old create mode 100644 source/exercice44/requirements.txt create mode 100644 source/exercice44/setup.py create mode 100644 source/exercice44/shell.nix create mode 100644 source/exercice45.rst create mode 100644 source/exercice45/daemon.py create mode 100644 source/exercice45/daemon.py.old create mode 100644 source/exercice45/requirements.txt create mode 100644 source/exercice45/setup.py create mode 100644 source/exercice45/shell.nix create mode 100644 source/exercice46.rst create mode 100644 source/exercice46/daemon.py create mode 100644 source/exercice46/daemon.py.old create mode 100644 source/exercice46/requirements.txt create mode 100644 source/exercice46/setup.py create mode 100644 source/exercice46/shell.nix create mode 100644 source/exercice47.rst create mode 100644 source/exercice47/daemon.py create mode 100644 source/exercice47/daemon.py.old create mode 100644 source/exercice47/requirements.txt create mode 100644 source/exercice47/setup.py create mode 100644 source/exercice47/shell.nix create mode 100644 source/exercice48.rst create mode 100644 source/exercice48/daemon.py create mode 100644 source/exercice48/daemon.py.old create mode 100644 source/exercice48/requirements.txt create mode 100644 source/exercice48/setup.py create mode 100644 source/exercice48/shell.nix create mode 100644 source/exercice49.rst create mode 100644 source/exercice49/daemon.py create mode 100644 source/exercice49/daemon.py.old create mode 100644 source/exercice49/requirements.txt create mode 100644 source/exercice49/setup.py create mode 100644 source/exercice49/shell.nix create mode 100644 source/exercice5.rst create mode 100644 source/exercice5/daemon.py create mode 100644 source/exercice5/daemon.py.old create mode 100644 source/exercice5/requirements.txt create mode 100644 source/exercice5/setup.py create mode 100644 source/exercice5/shell.nix create mode 100644 source/exercice50.rst create mode 100644 source/exercice50/daemon.py create mode 100644 source/exercice50/daemon.py.old create mode 100644 source/exercice50/requirements.txt create mode 100644 source/exercice50/setup.py create mode 100644 source/exercice50/shell.nix create mode 100644 source/exercice51.rst create mode 100644 source/exercice51/daemon.py create mode 100644 source/exercice51/daemon.py.old create mode 100644 source/exercice51/requirements.txt create mode 100644 source/exercice51/setup.py create mode 100644 source/exercice51/shell.nix create mode 100644 source/exercice52.rst create mode 100644 source/exercice52/daemon.py create mode 100644 source/exercice52/daemon.py.old create mode 100644 source/exercice52/requirements.txt create mode 100644 source/exercice52/setup.py create mode 100644 source/exercice52/shell.nix create mode 100644 source/exercice53.rst create mode 100644 source/exercice53/daemon.py create mode 100644 source/exercice53/daemon.py.old create mode 100644 source/exercice53/requirements.txt create mode 100644 source/exercice53/setup.py create mode 100644 source/exercice53/shell.nix create mode 100644 source/exercice54.rst create mode 100644 source/exercice54/daemon.py create mode 100644 source/exercice54/daemon.py.old create mode 100644 source/exercice54/requirements.txt create mode 100644 source/exercice54/setup.py create mode 100644 source/exercice54/shell.nix create mode 100644 source/exercice55.rst create mode 100644 source/exercice55/daemon.py create mode 100644 source/exercice55/daemon.py.old create mode 100644 source/exercice55/requirements.txt create mode 100644 source/exercice55/setup.py create mode 100644 source/exercice55/shell.nix create mode 100644 source/exercice56.rst create mode 100644 source/exercice56/daemon.py create mode 100644 source/exercice56/daemon.py.old create mode 100644 source/exercice56/requirements.txt create mode 100644 source/exercice56/setup.py create mode 100644 source/exercice56/shell.nix create mode 100644 source/exercice57.rst create mode 100644 source/exercice57/daemon.py create mode 100644 source/exercice57/daemon.py.old create mode 100644 source/exercice57/requirements.txt create mode 100644 source/exercice57/setup.py create mode 100644 source/exercice57/shell.nix create mode 100644 source/exercice58.rst create mode 100644 source/exercice58/daemon.py create mode 100644 source/exercice58/daemon.py.old create mode 100644 source/exercice58/requirements.txt create mode 100644 source/exercice58/setup.py create mode 100644 source/exercice58/shell.nix create mode 100644 source/exercice59.rst create mode 100644 source/exercice59/daemon.py create mode 100644 source/exercice59/daemon.py.old create mode 100644 source/exercice59/requirements.txt create mode 100644 source/exercice59/setup.py create mode 100644 source/exercice59/shell.nix create mode 100644 source/exercice6.rst create mode 100644 source/exercice6/daemon.py create mode 100644 source/exercice6/daemon.py.old create mode 100644 source/exercice6/requirements.txt create mode 100644 source/exercice6/setup.py create mode 100644 source/exercice6/shell.nix create mode 100644 source/exercice60.rst create mode 100644 source/exercice60/daemon.py create mode 100644 source/exercice60/daemon.py.old create mode 100644 source/exercice60/requirements.txt create mode 100644 source/exercice60/setup.py create mode 100644 source/exercice60/shell.nix create mode 100644 source/exercice61.rst create mode 100644 source/exercice61/daemon.py create mode 100644 source/exercice61/daemon.py.old create mode 100644 source/exercice61/requirements.txt create mode 100644 source/exercice61/setup.py create mode 100644 source/exercice61/shell.nix create mode 100644 source/exercice62.rst create mode 100644 source/exercice62/daemon.py create mode 100644 source/exercice62/daemon.py.old create mode 100644 source/exercice62/requirements.txt create mode 100644 source/exercice62/setup.py create mode 100644 source/exercice62/shell.nix create mode 100644 source/exercice63.rst create mode 100644 source/exercice63/daemon.py create mode 100644 source/exercice63/daemon.py.old create mode 100644 source/exercice63/requirements.txt create mode 100644 source/exercice63/setup.py create mode 100644 source/exercice63/shell.nix create mode 100644 source/exercice64.rst create mode 100644 source/exercice64/daemon.py create mode 100644 source/exercice64/daemon.py.old create mode 100644 source/exercice64/requirements.txt create mode 100644 source/exercice64/setup.py create mode 100644 source/exercice64/shell.nix create mode 100644 source/exercice65.rst create mode 100644 source/exercice65/daemon.py create mode 100644 source/exercice65/daemon.py.old create mode 100644 source/exercice65/requirements.txt create mode 100644 source/exercice65/setup.py create mode 100644 source/exercice65/shell.nix create mode 100644 source/exercice66.rst create mode 100644 source/exercice66/daemon.py create mode 100644 source/exercice66/daemon.py.old create mode 100644 source/exercice66/requirements.txt create mode 100644 source/exercice66/setup.py create mode 100644 source/exercice66/shell.nix create mode 100644 source/exercice67.rst create mode 100644 source/exercice67/daemon.py create mode 100644 source/exercice67/daemon.py.old create mode 100644 source/exercice67/requirements.txt create mode 100644 source/exercice67/setup.py create mode 100644 source/exercice67/shell.nix create mode 100644 source/exercice68.rst create mode 100644 source/exercice68/daemon.py create mode 100644 source/exercice68/daemon.py.old create mode 100644 source/exercice68/requirements.txt create mode 100644 source/exercice68/setup.py create mode 100644 source/exercice68/shell.nix create mode 100644 source/exercice69.rst create mode 100644 source/exercice69/daemon.py create mode 100644 source/exercice69/daemon.py.old create mode 100644 source/exercice69/requirements.txt create mode 100644 source/exercice69/setup.py create mode 100644 source/exercice69/shell.nix create mode 100644 source/exercice7.rst create mode 100644 source/exercice7/daemon.py create mode 100644 source/exercice7/daemon.py.old create mode 100644 source/exercice7/requirements.txt create mode 100644 source/exercice7/setup.py create mode 100644 source/exercice7/shell.nix create mode 100644 source/exercice70.rst create mode 100644 source/exercice70/daemon.py create mode 100644 source/exercice70/daemon.py.old create mode 100644 source/exercice70/requirements.txt create mode 100644 source/exercice70/setup.py create mode 100644 source/exercice70/shell.nix create mode 100644 source/exercice71.rst create mode 100644 source/exercice71/daemon.py create mode 100644 source/exercice71/daemon.py.old create mode 100644 source/exercice71/requirements.txt create mode 100644 source/exercice71/setup.py create mode 100644 source/exercice71/shell.nix create mode 100644 source/exercice72.rst create mode 100644 source/exercice72/daemon.py create mode 100644 source/exercice72/daemon.py.old create mode 100644 source/exercice72/requirements.txt create mode 100644 source/exercice72/setup.py create mode 100644 source/exercice72/shell.nix create mode 100644 source/exercice73.rst create mode 100644 source/exercice73/daemon.py create mode 100644 source/exercice73/daemon.py.old create mode 100644 source/exercice73/requirements.txt create mode 100644 source/exercice73/setup.py create mode 100644 source/exercice73/shell.nix create mode 100644 source/exercice74.rst create mode 100644 source/exercice74/daemon.py create mode 100644 source/exercice74/daemon.py.old create mode 100644 source/exercice74/requirements.txt create mode 100644 source/exercice74/setup.py create mode 100644 source/exercice74/shell.nix create mode 100644 source/exercice75.rst create mode 100644 source/exercice75/daemon.py create mode 100644 source/exercice75/daemon.py.old create mode 100644 source/exercice75/requirements.txt create mode 100644 source/exercice75/setup.py create mode 100644 source/exercice75/shell.nix create mode 100644 source/exercice76.rst create mode 100644 source/exercice76/daemon.py create mode 100644 source/exercice76/daemon.py.old create mode 100644 source/exercice76/requirements.txt create mode 100644 source/exercice76/setup.py create mode 100644 source/exercice76/shell.nix create mode 100644 source/exercice77.rst create mode 100644 source/exercice77/daemon.py create mode 100644 source/exercice77/daemon.py.old create mode 100644 source/exercice77/requirements.txt create mode 100644 source/exercice77/setup.py create mode 100644 source/exercice77/shell.nix create mode 100644 source/exercice78.rst create mode 100644 source/exercice78/daemon.py create mode 100644 source/exercice78/daemon.py.old create mode 100644 source/exercice78/requirements.txt create mode 100644 source/exercice78/setup.py create mode 100644 source/exercice78/shell.nix create mode 100644 source/exercice79.rst create mode 100644 source/exercice79/daemon.py create mode 100644 source/exercice79/daemon.py.old create mode 100644 source/exercice79/requirements.txt create mode 100644 source/exercice79/setup.py create mode 100644 source/exercice79/shell.nix create mode 100644 source/exercice8.rst create mode 100644 source/exercice8/daemon.py create mode 100644 source/exercice8/daemon.py.old create mode 100644 source/exercice8/requirements.txt create mode 100644 source/exercice8/setup.py create mode 100644 source/exercice8/shell.nix create mode 100644 source/exercice80.rst create mode 100644 source/exercice80/daemon.py create mode 100644 source/exercice80/daemon.py.old create mode 100644 source/exercice80/requirements.txt create mode 100644 source/exercice80/setup.py create mode 100644 source/exercice80/shell.nix create mode 100644 source/exercice81.rst create mode 100644 source/exercice81/daemon.py create mode 100644 source/exercice81/daemon.py.old create mode 100644 source/exercice81/requirements.txt create mode 100644 source/exercice81/setup.py create mode 100644 source/exercice81/shell.nix create mode 100644 source/exercice82.rst create mode 100644 source/exercice82/daemon.py create mode 100644 source/exercice82/daemon.py.old create mode 100644 source/exercice82/requirements.txt create mode 100644 source/exercice82/setup.py create mode 100644 source/exercice82/shell.nix create mode 100644 source/exercice83.rst create mode 100644 source/exercice83/daemon.py create mode 100644 source/exercice83/daemon.py.old create mode 100644 source/exercice83/requirements.txt create mode 100644 source/exercice83/setup.py create mode 100644 source/exercice83/shell.nix create mode 100644 source/exercice84.rst create mode 100644 source/exercice84/daemon.py create mode 100644 source/exercice84/daemon.py.old create mode 100644 source/exercice84/requirements.txt create mode 100644 source/exercice84/setup.py create mode 100644 source/exercice84/shell.nix create mode 100644 source/exercice85.rst create mode 100644 source/exercice85/daemon.py create mode 100644 source/exercice85/daemon.py.old create mode 100644 source/exercice85/requirements.txt create mode 100644 source/exercice85/setup.py create mode 100644 source/exercice85/shell.nix create mode 100644 source/exercice86.rst create mode 100644 source/exercice86/daemon.py create mode 100644 source/exercice86/daemon.py.old create mode 100644 source/exercice86/requirements.txt create mode 100644 source/exercice86/setup.py create mode 100644 source/exercice86/shell.nix create mode 100644 source/exercice87.rst create mode 100644 source/exercice87/daemon.py create mode 100644 source/exercice87/daemon.py.old create mode 100644 source/exercice87/requirements.txt create mode 100644 source/exercice87/setup.py create mode 100644 source/exercice87/shell.nix create mode 100644 source/exercice88.rst create mode 100644 source/exercice88/daemon.py create mode 100644 source/exercice88/daemon.py.old create mode 100644 source/exercice88/requirements.txt create mode 100644 source/exercice88/setup.py create mode 100644 source/exercice88/shell.nix create mode 100644 source/exercice89.rst create mode 100644 source/exercice89/daemon.py create mode 100644 source/exercice89/daemon.py.old create mode 100644 source/exercice89/requirements.txt create mode 100644 source/exercice89/setup.py create mode 100644 source/exercice89/shell.nix create mode 100644 source/exercice9.rst create mode 100644 source/exercice9/daemon.py create mode 100644 source/exercice9/daemon.py.old create mode 100644 source/exercice9/requirements.txt create mode 100644 source/exercice9/setup.py create mode 100644 source/exercice9/shell.nix create mode 100644 source/exercice90.rst create mode 100644 source/exercice90/daemon.py create mode 100644 source/exercice90/daemon.py.old create mode 100644 source/exercice90/requirements.txt create mode 100644 source/exercice90/setup.py create mode 100644 source/exercice90/shell.nix create mode 100644 source/exercice91.rst create mode 100644 source/exercice91/daemon.py create mode 100644 source/exercice91/daemon.py.old create mode 100644 source/exercice91/requirements.txt create mode 100644 source/exercice91/setup.py create mode 100644 source/exercice91/shell.nix create mode 100644 source/exercice92.rst create mode 100644 source/exercice92/daemon.py create mode 100644 source/exercice92/daemon.py.old create mode 100644 source/exercice92/requirements.txt create mode 100644 source/exercice92/setup.py create mode 100644 source/exercice92/shell.nix create mode 100644 source/exercice93.rst create mode 100644 source/exercice93/daemon.py create mode 100644 source/exercice93/daemon.py.old create mode 100644 source/exercice93/requirements.txt create mode 100644 source/exercice93/setup.py create mode 100644 source/exercice93/shell.nix create mode 100644 source/exercice94.rst create mode 100644 source/exercice94/daemon.py create mode 100644 source/exercice94/daemon.py.old create mode 100644 source/exercice94/requirements.txt create mode 100644 source/exercice94/setup.py create mode 100644 source/exercice94/shell.nix create mode 100644 source/exercice95.rst create mode 100644 source/exercice95/daemon.py create mode 100644 source/exercice95/daemon.py.old create mode 100644 source/exercice95/requirements.txt create mode 100644 source/exercice95/setup.py create mode 100644 source/exercice95/shell.nix create mode 100644 source/exercice96.rst create mode 100644 source/exercice96/daemon.py create mode 100644 source/exercice96/daemon.py.old create mode 100644 source/exercice96/requirements.txt create mode 100644 source/exercice96/setup.py create mode 100644 source/exercice96/shell.nix create mode 100644 source/exercice97.rst create mode 100644 source/exercice97/daemon.py create mode 100644 source/exercice97/daemon.py.old create mode 100644 source/exercice97/requirements.txt create mode 100644 source/exercice97/setup.py create mode 100644 source/exercice97/shell.nix create mode 100644 source/exercice98.rst create mode 100644 source/exercice98/daemon.py create mode 100644 source/exercice98/daemon.py.old create mode 100644 source/exercice98/requirements.txt create mode 100644 source/exercice98/setup.py create mode 100644 source/exercice98/shell.nix create mode 100644 source/exercice99.rst create mode 100644 source/exercice99/daemon.py create mode 100644 source/exercice99/daemon.py.old create mode 100644 source/exercice99/requirements.txt create mode 100644 source/exercice99/setup.py create mode 100644 source/exercice99/shell.nix create mode 100644 source/index.rst diff --git a/source/1_echauffement.rst.in b/source/1_echauffement.rst.in new file mode 100644 index 0000000..72db175 --- /dev/null +++ b/source/1_echauffement.rst.in @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro {{word}}. + +.. easypython:: ./exercice{{word}} + :language: DémonPython + :titre: Exercice Stupide {{word}} + + + diff --git a/source/exercice0.rst b/source/exercice0.rst new file mode 100644 index 0000000..8d86d14 --- /dev/null +++ b/source/exercice0.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 0. + +.. easypython:: ./exercice0 + :language: DémonPython + :titre: Exercice Stupide 0 + + + diff --git a/source/exercice0/daemon.py b/source/exercice0/daemon.py new file mode 100644 index 0000000..fcbf081 --- /dev/null +++ b/source/exercice0/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala0 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice0/daemon.py.old b/source/exercice0/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice0/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice0/requirements.txt b/source/exercice0/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice0/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice0/setup.py b/source/exercice0/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice0/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice0/shell.nix b/source/exercice0/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice0/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice1.rst b/source/exercice1.rst new file mode 100644 index 0000000..81bff5a --- /dev/null +++ b/source/exercice1.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 1. + +.. easypython:: ./exercice1 + :language: DémonPython + :titre: Exercice Stupide 1 + + + diff --git a/source/exercice1/daemon.py b/source/exercice1/daemon.py new file mode 100644 index 0000000..adf3364 --- /dev/null +++ b/source/exercice1/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala1 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice1/daemon.py.old b/source/exercice1/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice1/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice1/requirements.txt b/source/exercice1/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice1/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice1/setup.py b/source/exercice1/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice1/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice1/shell.nix b/source/exercice1/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice1/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice10.rst b/source/exercice10.rst new file mode 100644 index 0000000..1980a19 --- /dev/null +++ b/source/exercice10.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 10. + +.. easypython:: ./exercice10 + :language: DémonPython + :titre: Exercice Stupide 10 + + + diff --git a/source/exercice10/daemon.py b/source/exercice10/daemon.py new file mode 100644 index 0000000..62492b7 --- /dev/null +++ b/source/exercice10/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala10 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice10/daemon.py.old b/source/exercice10/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice10/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice10/requirements.txt b/source/exercice10/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice10/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice10/setup.py b/source/exercice10/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice10/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice10/shell.nix b/source/exercice10/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice10/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice100.rst b/source/exercice100.rst new file mode 100644 index 0000000..331a242 --- /dev/null +++ b/source/exercice100.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 100. + +.. easypython:: ./exercice100 + :language: DémonPython + :titre: Exercice Stupide 100 + + + diff --git a/source/exercice100/daemon.py b/source/exercice100/daemon.py new file mode 100644 index 0000000..ac315aa --- /dev/null +++ b/source/exercice100/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala100 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice100/daemon.py.old b/source/exercice100/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice100/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice100/requirements.txt b/source/exercice100/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice100/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice100/setup.py b/source/exercice100/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice100/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice100/shell.nix b/source/exercice100/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice100/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice101.rst b/source/exercice101.rst new file mode 100644 index 0000000..ec766a7 --- /dev/null +++ b/source/exercice101.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 101. + +.. easypython:: ./exercice101 + :language: DémonPython + :titre: Exercice Stupide 101 + + + diff --git a/source/exercice101/daemon.py b/source/exercice101/daemon.py new file mode 100644 index 0000000..227d81e --- /dev/null +++ b/source/exercice101/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala101 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice101/daemon.py.old b/source/exercice101/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice101/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice101/requirements.txt b/source/exercice101/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice101/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice101/setup.py b/source/exercice101/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice101/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice101/shell.nix b/source/exercice101/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice101/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice102.rst b/source/exercice102.rst new file mode 100644 index 0000000..027b70a --- /dev/null +++ b/source/exercice102.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 102. + +.. easypython:: ./exercice102 + :language: DémonPython + :titre: Exercice Stupide 102 + + + diff --git a/source/exercice102/daemon.py b/source/exercice102/daemon.py new file mode 100644 index 0000000..fbe95a3 --- /dev/null +++ b/source/exercice102/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala102 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice102/daemon.py.old b/source/exercice102/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice102/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice102/requirements.txt b/source/exercice102/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice102/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice102/setup.py b/source/exercice102/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice102/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice102/shell.nix b/source/exercice102/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice102/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice103.rst b/source/exercice103.rst new file mode 100644 index 0000000..a7f4071 --- /dev/null +++ b/source/exercice103.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 103. + +.. easypython:: ./exercice103 + :language: DémonPython + :titre: Exercice Stupide 103 + + + diff --git a/source/exercice103/daemon.py b/source/exercice103/daemon.py new file mode 100644 index 0000000..5cbf06a --- /dev/null +++ b/source/exercice103/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala103 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice103/daemon.py.old b/source/exercice103/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice103/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice103/requirements.txt b/source/exercice103/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice103/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice103/setup.py b/source/exercice103/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice103/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice103/shell.nix b/source/exercice103/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice103/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice104.rst b/source/exercice104.rst new file mode 100644 index 0000000..aae3f6c --- /dev/null +++ b/source/exercice104.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 104. + +.. easypython:: ./exercice104 + :language: DémonPython + :titre: Exercice Stupide 104 + + + diff --git a/source/exercice104/daemon.py b/source/exercice104/daemon.py new file mode 100644 index 0000000..2ea57db --- /dev/null +++ b/source/exercice104/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala104 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice104/daemon.py.old b/source/exercice104/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice104/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice104/requirements.txt b/source/exercice104/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice104/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice104/setup.py b/source/exercice104/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice104/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice104/shell.nix b/source/exercice104/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice104/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice105.rst b/source/exercice105.rst new file mode 100644 index 0000000..b668ccc --- /dev/null +++ b/source/exercice105.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 105. + +.. easypython:: ./exercice105 + :language: DémonPython + :titre: Exercice Stupide 105 + + + diff --git a/source/exercice105/daemon.py b/source/exercice105/daemon.py new file mode 100644 index 0000000..927e556 --- /dev/null +++ b/source/exercice105/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala105 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice105/daemon.py.old b/source/exercice105/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice105/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice105/requirements.txt b/source/exercice105/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice105/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice105/setup.py b/source/exercice105/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice105/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice105/shell.nix b/source/exercice105/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice105/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice106.rst b/source/exercice106.rst new file mode 100644 index 0000000..b87761a --- /dev/null +++ b/source/exercice106.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 106. + +.. easypython:: ./exercice106 + :language: DémonPython + :titre: Exercice Stupide 106 + + + diff --git a/source/exercice106/daemon.py b/source/exercice106/daemon.py new file mode 100644 index 0000000..77a85e2 --- /dev/null +++ b/source/exercice106/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala106 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice106/daemon.py.old b/source/exercice106/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice106/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice106/requirements.txt b/source/exercice106/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice106/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice106/setup.py b/source/exercice106/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice106/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice106/shell.nix b/source/exercice106/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice106/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice107.rst b/source/exercice107.rst new file mode 100644 index 0000000..cba807a --- /dev/null +++ b/source/exercice107.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 107. + +.. easypython:: ./exercice107 + :language: DémonPython + :titre: Exercice Stupide 107 + + + diff --git a/source/exercice107/daemon.py b/source/exercice107/daemon.py new file mode 100644 index 0000000..66851ce --- /dev/null +++ b/source/exercice107/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala107 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice107/daemon.py.old b/source/exercice107/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice107/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice107/requirements.txt b/source/exercice107/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice107/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice107/setup.py b/source/exercice107/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice107/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice107/shell.nix b/source/exercice107/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice107/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice108.rst b/source/exercice108.rst new file mode 100644 index 0000000..4659e65 --- /dev/null +++ b/source/exercice108.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 108. + +.. easypython:: ./exercice108 + :language: DémonPython + :titre: Exercice Stupide 108 + + + diff --git a/source/exercice108/daemon.py b/source/exercice108/daemon.py new file mode 100644 index 0000000..c3ce9d8 --- /dev/null +++ b/source/exercice108/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala108 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice108/daemon.py.old b/source/exercice108/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice108/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice108/requirements.txt b/source/exercice108/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice108/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice108/setup.py b/source/exercice108/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice108/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice108/shell.nix b/source/exercice108/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice108/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice109.rst b/source/exercice109.rst new file mode 100644 index 0000000..c14f1f9 --- /dev/null +++ b/source/exercice109.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 109. + +.. easypython:: ./exercice109 + :language: DémonPython + :titre: Exercice Stupide 109 + + + diff --git a/source/exercice109/daemon.py b/source/exercice109/daemon.py new file mode 100644 index 0000000..649a8c0 --- /dev/null +++ b/source/exercice109/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala109 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice109/daemon.py.old b/source/exercice109/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice109/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice109/requirements.txt b/source/exercice109/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice109/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice109/setup.py b/source/exercice109/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice109/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice109/shell.nix b/source/exercice109/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice109/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice11.rst b/source/exercice11.rst new file mode 100644 index 0000000..bb837bc --- /dev/null +++ b/source/exercice11.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 11. + +.. easypython:: ./exercice11 + :language: DémonPython + :titre: Exercice Stupide 11 + + + diff --git a/source/exercice11/daemon.py b/source/exercice11/daemon.py new file mode 100644 index 0000000..9339a40 --- /dev/null +++ b/source/exercice11/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala11 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice11/daemon.py.old b/source/exercice11/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice11/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice11/requirements.txt b/source/exercice11/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice11/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice11/setup.py b/source/exercice11/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice11/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice11/shell.nix b/source/exercice11/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice11/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice110.rst b/source/exercice110.rst new file mode 100644 index 0000000..b5915f4 --- /dev/null +++ b/source/exercice110.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 110. + +.. easypython:: ./exercice110 + :language: DémonPython + :titre: Exercice Stupide 110 + + + diff --git a/source/exercice110/daemon.py b/source/exercice110/daemon.py new file mode 100644 index 0000000..a5db1e9 --- /dev/null +++ b/source/exercice110/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala110 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice110/daemon.py.old b/source/exercice110/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice110/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice110/requirements.txt b/source/exercice110/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice110/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice110/setup.py b/source/exercice110/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice110/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice110/shell.nix b/source/exercice110/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice110/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice111.rst b/source/exercice111.rst new file mode 100644 index 0000000..0b015f8 --- /dev/null +++ b/source/exercice111.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 111. + +.. easypython:: ./exercice111 + :language: DémonPython + :titre: Exercice Stupide 111 + + + diff --git a/source/exercice111/daemon.py b/source/exercice111/daemon.py new file mode 100644 index 0000000..50674b2 --- /dev/null +++ b/source/exercice111/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala111 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice111/daemon.py.old b/source/exercice111/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice111/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice111/requirements.txt b/source/exercice111/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice111/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice111/setup.py b/source/exercice111/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice111/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice111/shell.nix b/source/exercice111/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice111/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice112.rst b/source/exercice112.rst new file mode 100644 index 0000000..60f0023 --- /dev/null +++ b/source/exercice112.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 112. + +.. easypython:: ./exercice112 + :language: DémonPython + :titre: Exercice Stupide 112 + + + diff --git a/source/exercice112/daemon.py b/source/exercice112/daemon.py new file mode 100644 index 0000000..423fffb --- /dev/null +++ b/source/exercice112/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala112 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice112/daemon.py.old b/source/exercice112/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice112/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice112/requirements.txt b/source/exercice112/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice112/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice112/setup.py b/source/exercice112/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice112/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice112/shell.nix b/source/exercice112/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice112/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice113.rst b/source/exercice113.rst new file mode 100644 index 0000000..c473940 --- /dev/null +++ b/source/exercice113.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 113. + +.. easypython:: ./exercice113 + :language: DémonPython + :titre: Exercice Stupide 113 + + + diff --git a/source/exercice113/daemon.py b/source/exercice113/daemon.py new file mode 100644 index 0000000..b764505 --- /dev/null +++ b/source/exercice113/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala113 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice113/daemon.py.old b/source/exercice113/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice113/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice113/requirements.txt b/source/exercice113/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice113/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice113/setup.py b/source/exercice113/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice113/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice113/shell.nix b/source/exercice113/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice113/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice114.rst b/source/exercice114.rst new file mode 100644 index 0000000..977f9ca --- /dev/null +++ b/source/exercice114.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 114. + +.. easypython:: ./exercice114 + :language: DémonPython + :titre: Exercice Stupide 114 + + + diff --git a/source/exercice114/daemon.py b/source/exercice114/daemon.py new file mode 100644 index 0000000..12fc7f6 --- /dev/null +++ b/source/exercice114/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala114 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice114/daemon.py.old b/source/exercice114/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice114/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice114/requirements.txt b/source/exercice114/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice114/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice114/setup.py b/source/exercice114/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice114/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice114/shell.nix b/source/exercice114/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice114/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice115.rst b/source/exercice115.rst new file mode 100644 index 0000000..b7c6a19 --- /dev/null +++ b/source/exercice115.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 115. + +.. easypython:: ./exercice115 + :language: DémonPython + :titre: Exercice Stupide 115 + + + diff --git a/source/exercice115/daemon.py b/source/exercice115/daemon.py new file mode 100644 index 0000000..e609644 --- /dev/null +++ b/source/exercice115/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala115 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice115/daemon.py.old b/source/exercice115/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice115/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice115/requirements.txt b/source/exercice115/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice115/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice115/setup.py b/source/exercice115/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice115/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice115/shell.nix b/source/exercice115/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice115/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice116.rst b/source/exercice116.rst new file mode 100644 index 0000000..fd1122d --- /dev/null +++ b/source/exercice116.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 116. + +.. easypython:: ./exercice116 + :language: DémonPython + :titre: Exercice Stupide 116 + + + diff --git a/source/exercice116/daemon.py b/source/exercice116/daemon.py new file mode 100644 index 0000000..f41140a --- /dev/null +++ b/source/exercice116/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala116 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice116/daemon.py.old b/source/exercice116/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice116/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice116/requirements.txt b/source/exercice116/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice116/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice116/setup.py b/source/exercice116/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice116/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice116/shell.nix b/source/exercice116/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice116/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice117.rst b/source/exercice117.rst new file mode 100644 index 0000000..9b82c5f --- /dev/null +++ b/source/exercice117.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 117. + +.. easypython:: ./exercice117 + :language: DémonPython + :titre: Exercice Stupide 117 + + + diff --git a/source/exercice117/daemon.py b/source/exercice117/daemon.py new file mode 100644 index 0000000..280ee6c --- /dev/null +++ b/source/exercice117/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala117 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice117/daemon.py.old b/source/exercice117/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice117/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice117/requirements.txt b/source/exercice117/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice117/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice117/setup.py b/source/exercice117/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice117/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice117/shell.nix b/source/exercice117/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice117/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice118.rst b/source/exercice118.rst new file mode 100644 index 0000000..25be284 --- /dev/null +++ b/source/exercice118.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 118. + +.. easypython:: ./exercice118 + :language: DémonPython + :titre: Exercice Stupide 118 + + + diff --git a/source/exercice118/daemon.py b/source/exercice118/daemon.py new file mode 100644 index 0000000..9632b52 --- /dev/null +++ b/source/exercice118/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala118 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice118/daemon.py.old b/source/exercice118/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice118/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice118/requirements.txt b/source/exercice118/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice118/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice118/setup.py b/source/exercice118/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice118/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice118/shell.nix b/source/exercice118/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice118/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice119.rst b/source/exercice119.rst new file mode 100644 index 0000000..3f27d5e --- /dev/null +++ b/source/exercice119.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 119. + +.. easypython:: ./exercice119 + :language: DémonPython + :titre: Exercice Stupide 119 + + + diff --git a/source/exercice119/daemon.py b/source/exercice119/daemon.py new file mode 100644 index 0000000..268b415 --- /dev/null +++ b/source/exercice119/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala119 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice119/daemon.py.old b/source/exercice119/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice119/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice119/requirements.txt b/source/exercice119/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice119/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice119/setup.py b/source/exercice119/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice119/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice119/shell.nix b/source/exercice119/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice119/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice12.rst b/source/exercice12.rst new file mode 100644 index 0000000..f1af55f --- /dev/null +++ b/source/exercice12.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 12. + +.. easypython:: ./exercice12 + :language: DémonPython + :titre: Exercice Stupide 12 + + + diff --git a/source/exercice12/daemon.py b/source/exercice12/daemon.py new file mode 100644 index 0000000..819491d --- /dev/null +++ b/source/exercice12/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala12 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice12/daemon.py.old b/source/exercice12/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice12/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice12/requirements.txt b/source/exercice12/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice12/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice12/setup.py b/source/exercice12/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice12/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice12/shell.nix b/source/exercice12/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice12/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice120.rst b/source/exercice120.rst new file mode 100644 index 0000000..c4cda6c --- /dev/null +++ b/source/exercice120.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 120. + +.. easypython:: ./exercice120 + :language: DémonPython + :titre: Exercice Stupide 120 + + + diff --git a/source/exercice120/daemon.py b/source/exercice120/daemon.py new file mode 100644 index 0000000..2a0b950 --- /dev/null +++ b/source/exercice120/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala120 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice120/daemon.py.old b/source/exercice120/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice120/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice120/requirements.txt b/source/exercice120/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice120/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice120/setup.py b/source/exercice120/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice120/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice120/shell.nix b/source/exercice120/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice120/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice121.rst b/source/exercice121.rst new file mode 100644 index 0000000..21da3c9 --- /dev/null +++ b/source/exercice121.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 121. + +.. easypython:: ./exercice121 + :language: DémonPython + :titre: Exercice Stupide 121 + + + diff --git a/source/exercice121/daemon.py b/source/exercice121/daemon.py new file mode 100644 index 0000000..c7c3f84 --- /dev/null +++ b/source/exercice121/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala121 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice121/daemon.py.old b/source/exercice121/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice121/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice121/requirements.txt b/source/exercice121/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice121/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice121/setup.py b/source/exercice121/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice121/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice121/shell.nix b/source/exercice121/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice121/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice122.rst b/source/exercice122.rst new file mode 100644 index 0000000..22b50ea --- /dev/null +++ b/source/exercice122.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 122. + +.. easypython:: ./exercice122 + :language: DémonPython + :titre: Exercice Stupide 122 + + + diff --git a/source/exercice122/daemon.py b/source/exercice122/daemon.py new file mode 100644 index 0000000..9c60371 --- /dev/null +++ b/source/exercice122/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala122 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice122/daemon.py.old b/source/exercice122/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice122/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice122/requirements.txt b/source/exercice122/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice122/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice122/setup.py b/source/exercice122/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice122/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice122/shell.nix b/source/exercice122/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice122/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice123.rst b/source/exercice123.rst new file mode 100644 index 0000000..562b4bf --- /dev/null +++ b/source/exercice123.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 123. + +.. easypython:: ./exercice123 + :language: DémonPython + :titre: Exercice Stupide 123 + + + diff --git a/source/exercice123/daemon.py b/source/exercice123/daemon.py new file mode 100644 index 0000000..f2c7fa1 --- /dev/null +++ b/source/exercice123/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala123 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice123/daemon.py.old b/source/exercice123/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice123/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice123/requirements.txt b/source/exercice123/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice123/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice123/setup.py b/source/exercice123/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice123/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice123/shell.nix b/source/exercice123/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice123/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice124.rst b/source/exercice124.rst new file mode 100644 index 0000000..94f1072 --- /dev/null +++ b/source/exercice124.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 124. + +.. easypython:: ./exercice124 + :language: DémonPython + :titre: Exercice Stupide 124 + + + diff --git a/source/exercice124/daemon.py b/source/exercice124/daemon.py new file mode 100644 index 0000000..086681c --- /dev/null +++ b/source/exercice124/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala124 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice124/daemon.py.old b/source/exercice124/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice124/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice124/requirements.txt b/source/exercice124/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice124/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice124/setup.py b/source/exercice124/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice124/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice124/shell.nix b/source/exercice124/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice124/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice125.rst b/source/exercice125.rst new file mode 100644 index 0000000..cb1c615 --- /dev/null +++ b/source/exercice125.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 125. + +.. easypython:: ./exercice125 + :language: DémonPython + :titre: Exercice Stupide 125 + + + diff --git a/source/exercice125/daemon.py b/source/exercice125/daemon.py new file mode 100644 index 0000000..75d89d7 --- /dev/null +++ b/source/exercice125/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala125 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice125/daemon.py.old b/source/exercice125/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice125/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice125/requirements.txt b/source/exercice125/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice125/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice125/setup.py b/source/exercice125/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice125/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice125/shell.nix b/source/exercice125/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice125/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice126.rst b/source/exercice126.rst new file mode 100644 index 0000000..bd6ba8e --- /dev/null +++ b/source/exercice126.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 126. + +.. easypython:: ./exercice126 + :language: DémonPython + :titre: Exercice Stupide 126 + + + diff --git a/source/exercice126/daemon.py b/source/exercice126/daemon.py new file mode 100644 index 0000000..25fb6f3 --- /dev/null +++ b/source/exercice126/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala126 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice126/daemon.py.old b/source/exercice126/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice126/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice126/requirements.txt b/source/exercice126/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice126/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice126/setup.py b/source/exercice126/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice126/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice126/shell.nix b/source/exercice126/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice126/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice127.rst b/source/exercice127.rst new file mode 100644 index 0000000..a1781b6 --- /dev/null +++ b/source/exercice127.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 127. + +.. easypython:: ./exercice127 + :language: DémonPython + :titre: Exercice Stupide 127 + + + diff --git a/source/exercice127/daemon.py b/source/exercice127/daemon.py new file mode 100644 index 0000000..bc19fd8 --- /dev/null +++ b/source/exercice127/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala127 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice127/daemon.py.old b/source/exercice127/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice127/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice127/requirements.txt b/source/exercice127/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice127/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice127/setup.py b/source/exercice127/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice127/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice127/shell.nix b/source/exercice127/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice127/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice128.rst b/source/exercice128.rst new file mode 100644 index 0000000..cd27125 --- /dev/null +++ b/source/exercice128.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 128. + +.. easypython:: ./exercice128 + :language: DémonPython + :titre: Exercice Stupide 128 + + + diff --git a/source/exercice128/daemon.py b/source/exercice128/daemon.py new file mode 100644 index 0000000..b83dec2 --- /dev/null +++ b/source/exercice128/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala128 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice128/daemon.py.old b/source/exercice128/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice128/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice128/requirements.txt b/source/exercice128/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice128/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice128/setup.py b/source/exercice128/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice128/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice128/shell.nix b/source/exercice128/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice128/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice129.rst b/source/exercice129.rst new file mode 100644 index 0000000..1a1483f --- /dev/null +++ b/source/exercice129.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 129. + +.. easypython:: ./exercice129 + :language: DémonPython + :titre: Exercice Stupide 129 + + + diff --git a/source/exercice129/daemon.py b/source/exercice129/daemon.py new file mode 100644 index 0000000..754635c --- /dev/null +++ b/source/exercice129/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala129 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice129/daemon.py.old b/source/exercice129/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice129/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice129/requirements.txt b/source/exercice129/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice129/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice129/setup.py b/source/exercice129/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice129/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice129/shell.nix b/source/exercice129/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice129/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice13.rst b/source/exercice13.rst new file mode 100644 index 0000000..957ae92 --- /dev/null +++ b/source/exercice13.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 13. + +.. easypython:: ./exercice13 + :language: DémonPython + :titre: Exercice Stupide 13 + + + diff --git a/source/exercice13/daemon.py b/source/exercice13/daemon.py new file mode 100644 index 0000000..c9a6111 --- /dev/null +++ b/source/exercice13/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala13 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice13/daemon.py.old b/source/exercice13/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice13/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice13/requirements.txt b/source/exercice13/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice13/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice13/setup.py b/source/exercice13/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice13/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice13/shell.nix b/source/exercice13/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice13/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice130.rst b/source/exercice130.rst new file mode 100644 index 0000000..78b413d --- /dev/null +++ b/source/exercice130.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 130. + +.. easypython:: ./exercice130 + :language: DémonPython + :titre: Exercice Stupide 130 + + + diff --git a/source/exercice130/daemon.py b/source/exercice130/daemon.py new file mode 100644 index 0000000..68c2ceb --- /dev/null +++ b/source/exercice130/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala130 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice130/daemon.py.old b/source/exercice130/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice130/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice130/requirements.txt b/source/exercice130/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice130/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice130/setup.py b/source/exercice130/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice130/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice130/shell.nix b/source/exercice130/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice130/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice131.rst b/source/exercice131.rst new file mode 100644 index 0000000..d184985 --- /dev/null +++ b/source/exercice131.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 131. + +.. easypython:: ./exercice131 + :language: DémonPython + :titre: Exercice Stupide 131 + + + diff --git a/source/exercice131/daemon.py b/source/exercice131/daemon.py new file mode 100644 index 0000000..0ff901c --- /dev/null +++ b/source/exercice131/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala131 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice131/daemon.py.old b/source/exercice131/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice131/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice131/requirements.txt b/source/exercice131/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice131/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice131/setup.py b/source/exercice131/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice131/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice131/shell.nix b/source/exercice131/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice131/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice132.rst b/source/exercice132.rst new file mode 100644 index 0000000..2563d51 --- /dev/null +++ b/source/exercice132.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 132. + +.. easypython:: ./exercice132 + :language: DémonPython + :titre: Exercice Stupide 132 + + + diff --git a/source/exercice132/daemon.py b/source/exercice132/daemon.py new file mode 100644 index 0000000..6915b85 --- /dev/null +++ b/source/exercice132/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala132 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice132/daemon.py.old b/source/exercice132/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice132/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice132/requirements.txt b/source/exercice132/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice132/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice132/setup.py b/source/exercice132/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice132/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice132/shell.nix b/source/exercice132/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice132/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice133.rst b/source/exercice133.rst new file mode 100644 index 0000000..13c0582 --- /dev/null +++ b/source/exercice133.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 133. + +.. easypython:: ./exercice133 + :language: DémonPython + :titre: Exercice Stupide 133 + + + diff --git a/source/exercice133/daemon.py b/source/exercice133/daemon.py new file mode 100644 index 0000000..77ea237 --- /dev/null +++ b/source/exercice133/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala133 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice133/daemon.py.old b/source/exercice133/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice133/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice133/requirements.txt b/source/exercice133/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice133/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice133/setup.py b/source/exercice133/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice133/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice133/shell.nix b/source/exercice133/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice133/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice134.rst b/source/exercice134.rst new file mode 100644 index 0000000..e40f225 --- /dev/null +++ b/source/exercice134.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 134. + +.. easypython:: ./exercice134 + :language: DémonPython + :titre: Exercice Stupide 134 + + + diff --git a/source/exercice134/daemon.py b/source/exercice134/daemon.py new file mode 100644 index 0000000..611e88f --- /dev/null +++ b/source/exercice134/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala134 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice134/daemon.py.old b/source/exercice134/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice134/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice134/requirements.txt b/source/exercice134/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice134/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice134/setup.py b/source/exercice134/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice134/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice134/shell.nix b/source/exercice134/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice134/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice135.rst b/source/exercice135.rst new file mode 100644 index 0000000..ef292a0 --- /dev/null +++ b/source/exercice135.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 135. + +.. easypython:: ./exercice135 + :language: DémonPython + :titre: Exercice Stupide 135 + + + diff --git a/source/exercice135/daemon.py b/source/exercice135/daemon.py new file mode 100644 index 0000000..9a4ad52 --- /dev/null +++ b/source/exercice135/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala135 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice135/daemon.py.old b/source/exercice135/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice135/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice135/requirements.txt b/source/exercice135/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice135/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice135/setup.py b/source/exercice135/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice135/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice135/shell.nix b/source/exercice135/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice135/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice136.rst b/source/exercice136.rst new file mode 100644 index 0000000..2dfa8d7 --- /dev/null +++ b/source/exercice136.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 136. + +.. easypython:: ./exercice136 + :language: DémonPython + :titre: Exercice Stupide 136 + + + diff --git a/source/exercice136/daemon.py b/source/exercice136/daemon.py new file mode 100644 index 0000000..b5baa0e --- /dev/null +++ b/source/exercice136/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala136 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice136/daemon.py.old b/source/exercice136/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice136/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice136/requirements.txt b/source/exercice136/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice136/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice136/setup.py b/source/exercice136/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice136/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice136/shell.nix b/source/exercice136/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice136/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice137.rst b/source/exercice137.rst new file mode 100644 index 0000000..e8779c6 --- /dev/null +++ b/source/exercice137.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 137. + +.. easypython:: ./exercice137 + :language: DémonPython + :titre: Exercice Stupide 137 + + + diff --git a/source/exercice137/daemon.py b/source/exercice137/daemon.py new file mode 100644 index 0000000..9bcd66a --- /dev/null +++ b/source/exercice137/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala137 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice137/daemon.py.old b/source/exercice137/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice137/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice137/requirements.txt b/source/exercice137/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice137/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice137/setup.py b/source/exercice137/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice137/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice137/shell.nix b/source/exercice137/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice137/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice138.rst b/source/exercice138.rst new file mode 100644 index 0000000..8187133 --- /dev/null +++ b/source/exercice138.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 138. + +.. easypython:: ./exercice138 + :language: DémonPython + :titre: Exercice Stupide 138 + + + diff --git a/source/exercice138/daemon.py b/source/exercice138/daemon.py new file mode 100644 index 0000000..a0c64e2 --- /dev/null +++ b/source/exercice138/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala138 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice138/daemon.py.old b/source/exercice138/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice138/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice138/requirements.txt b/source/exercice138/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice138/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice138/setup.py b/source/exercice138/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice138/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice138/shell.nix b/source/exercice138/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice138/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice139.rst b/source/exercice139.rst new file mode 100644 index 0000000..bd76f2c --- /dev/null +++ b/source/exercice139.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 139. + +.. easypython:: ./exercice139 + :language: DémonPython + :titre: Exercice Stupide 139 + + + diff --git a/source/exercice139/daemon.py b/source/exercice139/daemon.py new file mode 100644 index 0000000..d55baaf --- /dev/null +++ b/source/exercice139/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala139 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice139/daemon.py.old b/source/exercice139/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice139/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice139/requirements.txt b/source/exercice139/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice139/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice139/setup.py b/source/exercice139/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice139/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice139/shell.nix b/source/exercice139/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice139/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice14.rst b/source/exercice14.rst new file mode 100644 index 0000000..dd4f9b3 --- /dev/null +++ b/source/exercice14.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 14. + +.. easypython:: ./exercice14 + :language: DémonPython + :titre: Exercice Stupide 14 + + + diff --git a/source/exercice14/daemon.py b/source/exercice14/daemon.py new file mode 100644 index 0000000..aab254f --- /dev/null +++ b/source/exercice14/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala14 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice14/daemon.py.old b/source/exercice14/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice14/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice14/requirements.txt b/source/exercice14/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice14/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice14/setup.py b/source/exercice14/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice14/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice14/shell.nix b/source/exercice14/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice14/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice140.rst b/source/exercice140.rst new file mode 100644 index 0000000..df9fd52 --- /dev/null +++ b/source/exercice140.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 140. + +.. easypython:: ./exercice140 + :language: DémonPython + :titre: Exercice Stupide 140 + + + diff --git a/source/exercice140/daemon.py b/source/exercice140/daemon.py new file mode 100644 index 0000000..e39eec3 --- /dev/null +++ b/source/exercice140/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala140 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice140/daemon.py.old b/source/exercice140/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice140/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice140/requirements.txt b/source/exercice140/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice140/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice140/setup.py b/source/exercice140/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice140/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice140/shell.nix b/source/exercice140/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice140/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice141.rst b/source/exercice141.rst new file mode 100644 index 0000000..df59991 --- /dev/null +++ b/source/exercice141.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 141. + +.. easypython:: ./exercice141 + :language: DémonPython + :titre: Exercice Stupide 141 + + + diff --git a/source/exercice141/daemon.py b/source/exercice141/daemon.py new file mode 100644 index 0000000..2759fde --- /dev/null +++ b/source/exercice141/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala141 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice141/daemon.py.old b/source/exercice141/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice141/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice141/requirements.txt b/source/exercice141/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice141/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice141/setup.py b/source/exercice141/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice141/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice141/shell.nix b/source/exercice141/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice141/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice142.rst b/source/exercice142.rst new file mode 100644 index 0000000..eadab50 --- /dev/null +++ b/source/exercice142.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 142. + +.. easypython:: ./exercice142 + :language: DémonPython + :titre: Exercice Stupide 142 + + + diff --git a/source/exercice142/daemon.py b/source/exercice142/daemon.py new file mode 100644 index 0000000..1aec614 --- /dev/null +++ b/source/exercice142/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala142 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice142/daemon.py.old b/source/exercice142/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice142/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice142/requirements.txt b/source/exercice142/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice142/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice142/setup.py b/source/exercice142/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice142/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice142/shell.nix b/source/exercice142/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice142/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice143.rst b/source/exercice143.rst new file mode 100644 index 0000000..85165f7 --- /dev/null +++ b/source/exercice143.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 143. + +.. easypython:: ./exercice143 + :language: DémonPython + :titre: Exercice Stupide 143 + + + diff --git a/source/exercice143/daemon.py b/source/exercice143/daemon.py new file mode 100644 index 0000000..2674313 --- /dev/null +++ b/source/exercice143/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala143 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice143/daemon.py.old b/source/exercice143/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice143/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice143/requirements.txt b/source/exercice143/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice143/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice143/setup.py b/source/exercice143/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice143/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice143/shell.nix b/source/exercice143/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice143/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice144.rst b/source/exercice144.rst new file mode 100644 index 0000000..d963a3d --- /dev/null +++ b/source/exercice144.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 144. + +.. easypython:: ./exercice144 + :language: DémonPython + :titre: Exercice Stupide 144 + + + diff --git a/source/exercice144/daemon.py b/source/exercice144/daemon.py new file mode 100644 index 0000000..142b356 --- /dev/null +++ b/source/exercice144/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala144 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice144/daemon.py.old b/source/exercice144/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice144/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice144/requirements.txt b/source/exercice144/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice144/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice144/setup.py b/source/exercice144/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice144/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice144/shell.nix b/source/exercice144/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice144/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice145.rst b/source/exercice145.rst new file mode 100644 index 0000000..d19afaf --- /dev/null +++ b/source/exercice145.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 145. + +.. easypython:: ./exercice145 + :language: DémonPython + :titre: Exercice Stupide 145 + + + diff --git a/source/exercice145/daemon.py b/source/exercice145/daemon.py new file mode 100644 index 0000000..75fa0ba --- /dev/null +++ b/source/exercice145/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala145 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice145/daemon.py.old b/source/exercice145/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice145/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice145/requirements.txt b/source/exercice145/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice145/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice145/setup.py b/source/exercice145/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice145/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice145/shell.nix b/source/exercice145/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice145/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice146.rst b/source/exercice146.rst new file mode 100644 index 0000000..9555759 --- /dev/null +++ b/source/exercice146.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 146. + +.. easypython:: ./exercice146 + :language: DémonPython + :titre: Exercice Stupide 146 + + + diff --git a/source/exercice146/daemon.py b/source/exercice146/daemon.py new file mode 100644 index 0000000..f914c60 --- /dev/null +++ b/source/exercice146/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala146 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice146/daemon.py.old b/source/exercice146/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice146/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice146/requirements.txt b/source/exercice146/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice146/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice146/setup.py b/source/exercice146/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice146/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice146/shell.nix b/source/exercice146/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice146/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice147.rst b/source/exercice147.rst new file mode 100644 index 0000000..1774525 --- /dev/null +++ b/source/exercice147.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 147. + +.. easypython:: ./exercice147 + :language: DémonPython + :titre: Exercice Stupide 147 + + + diff --git a/source/exercice147/daemon.py b/source/exercice147/daemon.py new file mode 100644 index 0000000..8193505 --- /dev/null +++ b/source/exercice147/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala147 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice147/daemon.py.old b/source/exercice147/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice147/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice147/requirements.txt b/source/exercice147/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice147/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice147/setup.py b/source/exercice147/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice147/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice147/shell.nix b/source/exercice147/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice147/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice148.rst b/source/exercice148.rst new file mode 100644 index 0000000..b705eed --- /dev/null +++ b/source/exercice148.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 148. + +.. easypython:: ./exercice148 + :language: DémonPython + :titre: Exercice Stupide 148 + + + diff --git a/source/exercice148/daemon.py b/source/exercice148/daemon.py new file mode 100644 index 0000000..f10ef52 --- /dev/null +++ b/source/exercice148/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala148 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice148/daemon.py.old b/source/exercice148/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice148/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice148/requirements.txt b/source/exercice148/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice148/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice148/setup.py b/source/exercice148/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice148/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice148/shell.nix b/source/exercice148/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice148/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice149.rst b/source/exercice149.rst new file mode 100644 index 0000000..3dfdad3 --- /dev/null +++ b/source/exercice149.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 149. + +.. easypython:: ./exercice149 + :language: DémonPython + :titre: Exercice Stupide 149 + + + diff --git a/source/exercice149/daemon.py b/source/exercice149/daemon.py new file mode 100644 index 0000000..c1569e3 --- /dev/null +++ b/source/exercice149/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala149 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice149/daemon.py.old b/source/exercice149/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice149/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice149/requirements.txt b/source/exercice149/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice149/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice149/setup.py b/source/exercice149/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice149/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice149/shell.nix b/source/exercice149/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice149/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice15.rst b/source/exercice15.rst new file mode 100644 index 0000000..a0fd710 --- /dev/null +++ b/source/exercice15.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 15. + +.. easypython:: ./exercice15 + :language: DémonPython + :titre: Exercice Stupide 15 + + + diff --git a/source/exercice15/daemon.py b/source/exercice15/daemon.py new file mode 100644 index 0000000..cd8d1cc --- /dev/null +++ b/source/exercice15/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala15 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice15/daemon.py.old b/source/exercice15/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice15/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice15/requirements.txt b/source/exercice15/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice15/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice15/setup.py b/source/exercice15/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice15/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice15/shell.nix b/source/exercice15/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice15/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice150.rst b/source/exercice150.rst new file mode 100644 index 0000000..241d45c --- /dev/null +++ b/source/exercice150.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 150. + +.. easypython:: ./exercice150 + :language: DémonPython + :titre: Exercice Stupide 150 + + + diff --git a/source/exercice150/daemon.py b/source/exercice150/daemon.py new file mode 100644 index 0000000..3faf317 --- /dev/null +++ b/source/exercice150/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala150 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice150/daemon.py.old b/source/exercice150/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice150/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice150/requirements.txt b/source/exercice150/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice150/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice150/setup.py b/source/exercice150/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice150/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice150/shell.nix b/source/exercice150/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice150/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice151.rst b/source/exercice151.rst new file mode 100644 index 0000000..a0509f9 --- /dev/null +++ b/source/exercice151.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 151. + +.. easypython:: ./exercice151 + :language: DémonPython + :titre: Exercice Stupide 151 + + + diff --git a/source/exercice151/daemon.py b/source/exercice151/daemon.py new file mode 100644 index 0000000..1391307 --- /dev/null +++ b/source/exercice151/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala151 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice151/daemon.py.old b/source/exercice151/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice151/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice151/requirements.txt b/source/exercice151/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice151/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice151/setup.py b/source/exercice151/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice151/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice151/shell.nix b/source/exercice151/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice151/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice152.rst b/source/exercice152.rst new file mode 100644 index 0000000..b5a0895 --- /dev/null +++ b/source/exercice152.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 152. + +.. easypython:: ./exercice152 + :language: DémonPython + :titre: Exercice Stupide 152 + + + diff --git a/source/exercice152/daemon.py b/source/exercice152/daemon.py new file mode 100644 index 0000000..bed1610 --- /dev/null +++ b/source/exercice152/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala152 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice152/daemon.py.old b/source/exercice152/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice152/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice152/requirements.txt b/source/exercice152/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice152/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice152/setup.py b/source/exercice152/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice152/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice152/shell.nix b/source/exercice152/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice152/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice153.rst b/source/exercice153.rst new file mode 100644 index 0000000..6365d88 --- /dev/null +++ b/source/exercice153.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 153. + +.. easypython:: ./exercice153 + :language: DémonPython + :titre: Exercice Stupide 153 + + + diff --git a/source/exercice153/daemon.py b/source/exercice153/daemon.py new file mode 100644 index 0000000..1a15029 --- /dev/null +++ b/source/exercice153/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala153 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice153/daemon.py.old b/source/exercice153/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice153/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice153/requirements.txt b/source/exercice153/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice153/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice153/setup.py b/source/exercice153/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice153/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice153/shell.nix b/source/exercice153/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice153/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice154.rst b/source/exercice154.rst new file mode 100644 index 0000000..3bc882f --- /dev/null +++ b/source/exercice154.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 154. + +.. easypython:: ./exercice154 + :language: DémonPython + :titre: Exercice Stupide 154 + + + diff --git a/source/exercice154/daemon.py b/source/exercice154/daemon.py new file mode 100644 index 0000000..4ce7f64 --- /dev/null +++ b/source/exercice154/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala154 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice154/daemon.py.old b/source/exercice154/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice154/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice154/requirements.txt b/source/exercice154/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice154/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice154/setup.py b/source/exercice154/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice154/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice154/shell.nix b/source/exercice154/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice154/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice155.rst b/source/exercice155.rst new file mode 100644 index 0000000..4115831 --- /dev/null +++ b/source/exercice155.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 155. + +.. easypython:: ./exercice155 + :language: DémonPython + :titre: Exercice Stupide 155 + + + diff --git a/source/exercice155/daemon.py b/source/exercice155/daemon.py new file mode 100644 index 0000000..704710a --- /dev/null +++ b/source/exercice155/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala155 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice155/daemon.py.old b/source/exercice155/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice155/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice155/requirements.txt b/source/exercice155/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice155/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice155/setup.py b/source/exercice155/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice155/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice155/shell.nix b/source/exercice155/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice155/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice156.rst b/source/exercice156.rst new file mode 100644 index 0000000..dd28f5e --- /dev/null +++ b/source/exercice156.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 156. + +.. easypython:: ./exercice156 + :language: DémonPython + :titre: Exercice Stupide 156 + + + diff --git a/source/exercice156/daemon.py b/source/exercice156/daemon.py new file mode 100644 index 0000000..2449e2b --- /dev/null +++ b/source/exercice156/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala156 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice156/daemon.py.old b/source/exercice156/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice156/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice156/requirements.txt b/source/exercice156/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice156/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice156/setup.py b/source/exercice156/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice156/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice156/shell.nix b/source/exercice156/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice156/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice157.rst b/source/exercice157.rst new file mode 100644 index 0000000..f4eb901 --- /dev/null +++ b/source/exercice157.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 157. + +.. easypython:: ./exercice157 + :language: DémonPython + :titre: Exercice Stupide 157 + + + diff --git a/source/exercice157/daemon.py b/source/exercice157/daemon.py new file mode 100644 index 0000000..61144b4 --- /dev/null +++ b/source/exercice157/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala157 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice157/daemon.py.old b/source/exercice157/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice157/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice157/requirements.txt b/source/exercice157/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice157/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice157/setup.py b/source/exercice157/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice157/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice157/shell.nix b/source/exercice157/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice157/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice158.rst b/source/exercice158.rst new file mode 100644 index 0000000..b3cc51f --- /dev/null +++ b/source/exercice158.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 158. + +.. easypython:: ./exercice158 + :language: DémonPython + :titre: Exercice Stupide 158 + + + diff --git a/source/exercice158/daemon.py b/source/exercice158/daemon.py new file mode 100644 index 0000000..b07e0f7 --- /dev/null +++ b/source/exercice158/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala158 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice158/daemon.py.old b/source/exercice158/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice158/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice158/requirements.txt b/source/exercice158/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice158/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice158/setup.py b/source/exercice158/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice158/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice158/shell.nix b/source/exercice158/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice158/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice159.rst b/source/exercice159.rst new file mode 100644 index 0000000..9e02be3 --- /dev/null +++ b/source/exercice159.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 159. + +.. easypython:: ./exercice159 + :language: DémonPython + :titre: Exercice Stupide 159 + + + diff --git a/source/exercice159/daemon.py b/source/exercice159/daemon.py new file mode 100644 index 0000000..dfdc1ca --- /dev/null +++ b/source/exercice159/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala159 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice159/daemon.py.old b/source/exercice159/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice159/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice159/requirements.txt b/source/exercice159/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice159/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice159/setup.py b/source/exercice159/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice159/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice159/shell.nix b/source/exercice159/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice159/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice16.rst b/source/exercice16.rst new file mode 100644 index 0000000..cedf113 --- /dev/null +++ b/source/exercice16.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 16. + +.. easypython:: ./exercice16 + :language: DémonPython + :titre: Exercice Stupide 16 + + + diff --git a/source/exercice16/daemon.py b/source/exercice16/daemon.py new file mode 100644 index 0000000..cd84310 --- /dev/null +++ b/source/exercice16/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala16 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice16/daemon.py.old b/source/exercice16/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice16/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice16/requirements.txt b/source/exercice16/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice16/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice16/setup.py b/source/exercice16/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice16/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice16/shell.nix b/source/exercice16/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice16/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice160.rst b/source/exercice160.rst new file mode 100644 index 0000000..f9e0667 --- /dev/null +++ b/source/exercice160.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 160. + +.. easypython:: ./exercice160 + :language: DémonPython + :titre: Exercice Stupide 160 + + + diff --git a/source/exercice160/daemon.py b/source/exercice160/daemon.py new file mode 100644 index 0000000..9c6c9b3 --- /dev/null +++ b/source/exercice160/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala160 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice160/daemon.py.old b/source/exercice160/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice160/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice160/requirements.txt b/source/exercice160/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice160/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice160/setup.py b/source/exercice160/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice160/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice160/shell.nix b/source/exercice160/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice160/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice161.rst b/source/exercice161.rst new file mode 100644 index 0000000..175d13e --- /dev/null +++ b/source/exercice161.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 161. + +.. easypython:: ./exercice161 + :language: DémonPython + :titre: Exercice Stupide 161 + + + diff --git a/source/exercice161/daemon.py b/source/exercice161/daemon.py new file mode 100644 index 0000000..711cf39 --- /dev/null +++ b/source/exercice161/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala161 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice161/daemon.py.old b/source/exercice161/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice161/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice161/requirements.txt b/source/exercice161/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice161/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice161/setup.py b/source/exercice161/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice161/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice161/shell.nix b/source/exercice161/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice161/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice162.rst b/source/exercice162.rst new file mode 100644 index 0000000..43fce8c --- /dev/null +++ b/source/exercice162.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 162. + +.. easypython:: ./exercice162 + :language: DémonPython + :titre: Exercice Stupide 162 + + + diff --git a/source/exercice162/daemon.py b/source/exercice162/daemon.py new file mode 100644 index 0000000..c8f59fe --- /dev/null +++ b/source/exercice162/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala162 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice162/daemon.py.old b/source/exercice162/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice162/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice162/requirements.txt b/source/exercice162/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice162/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice162/setup.py b/source/exercice162/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice162/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice162/shell.nix b/source/exercice162/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice162/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice163.rst b/source/exercice163.rst new file mode 100644 index 0000000..a24ea2f --- /dev/null +++ b/source/exercice163.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 163. + +.. easypython:: ./exercice163 + :language: DémonPython + :titre: Exercice Stupide 163 + + + diff --git a/source/exercice163/daemon.py b/source/exercice163/daemon.py new file mode 100644 index 0000000..8910496 --- /dev/null +++ b/source/exercice163/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala163 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice163/daemon.py.old b/source/exercice163/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice163/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice163/requirements.txt b/source/exercice163/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice163/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice163/setup.py b/source/exercice163/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice163/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice163/shell.nix b/source/exercice163/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice163/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice164.rst b/source/exercice164.rst new file mode 100644 index 0000000..ac1dc49 --- /dev/null +++ b/source/exercice164.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 164. + +.. easypython:: ./exercice164 + :language: DémonPython + :titre: Exercice Stupide 164 + + + diff --git a/source/exercice164/daemon.py b/source/exercice164/daemon.py new file mode 100644 index 0000000..f87b57c --- /dev/null +++ b/source/exercice164/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala164 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice164/daemon.py.old b/source/exercice164/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice164/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice164/requirements.txt b/source/exercice164/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice164/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice164/setup.py b/source/exercice164/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice164/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice164/shell.nix b/source/exercice164/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice164/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice165.rst b/source/exercice165.rst new file mode 100644 index 0000000..88fb7b0 --- /dev/null +++ b/source/exercice165.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 165. + +.. easypython:: ./exercice165 + :language: DémonPython + :titre: Exercice Stupide 165 + + + diff --git a/source/exercice165/daemon.py b/source/exercice165/daemon.py new file mode 100644 index 0000000..cd0a9dd --- /dev/null +++ b/source/exercice165/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala165 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice165/daemon.py.old b/source/exercice165/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice165/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice165/requirements.txt b/source/exercice165/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice165/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice165/setup.py b/source/exercice165/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice165/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice165/shell.nix b/source/exercice165/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice165/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice166.rst b/source/exercice166.rst new file mode 100644 index 0000000..d39ca35 --- /dev/null +++ b/source/exercice166.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 166. + +.. easypython:: ./exercice166 + :language: DémonPython + :titre: Exercice Stupide 166 + + + diff --git a/source/exercice166/daemon.py b/source/exercice166/daemon.py new file mode 100644 index 0000000..4a667c4 --- /dev/null +++ b/source/exercice166/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala166 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice166/daemon.py.old b/source/exercice166/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice166/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice166/requirements.txt b/source/exercice166/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice166/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice166/setup.py b/source/exercice166/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice166/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice166/shell.nix b/source/exercice166/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice166/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice167.rst b/source/exercice167.rst new file mode 100644 index 0000000..eb9985e --- /dev/null +++ b/source/exercice167.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 167. + +.. easypython:: ./exercice167 + :language: DémonPython + :titre: Exercice Stupide 167 + + + diff --git a/source/exercice167/daemon.py b/source/exercice167/daemon.py new file mode 100644 index 0000000..581afb5 --- /dev/null +++ b/source/exercice167/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala167 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice167/daemon.py.old b/source/exercice167/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice167/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice167/requirements.txt b/source/exercice167/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice167/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice167/setup.py b/source/exercice167/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice167/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice167/shell.nix b/source/exercice167/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice167/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice168.rst b/source/exercice168.rst new file mode 100644 index 0000000..dbe896d --- /dev/null +++ b/source/exercice168.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 168. + +.. easypython:: ./exercice168 + :language: DémonPython + :titre: Exercice Stupide 168 + + + diff --git a/source/exercice168/daemon.py b/source/exercice168/daemon.py new file mode 100644 index 0000000..fbcd550 --- /dev/null +++ b/source/exercice168/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala168 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice168/daemon.py.old b/source/exercice168/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice168/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice168/requirements.txt b/source/exercice168/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice168/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice168/setup.py b/source/exercice168/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice168/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice168/shell.nix b/source/exercice168/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice168/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice169.rst b/source/exercice169.rst new file mode 100644 index 0000000..6d0d08b --- /dev/null +++ b/source/exercice169.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 169. + +.. easypython:: ./exercice169 + :language: DémonPython + :titre: Exercice Stupide 169 + + + diff --git a/source/exercice169/daemon.py b/source/exercice169/daemon.py new file mode 100644 index 0000000..4368335 --- /dev/null +++ b/source/exercice169/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala169 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice169/daemon.py.old b/source/exercice169/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice169/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice169/requirements.txt b/source/exercice169/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice169/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice169/setup.py b/source/exercice169/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice169/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice169/shell.nix b/source/exercice169/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice169/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice17.rst b/source/exercice17.rst new file mode 100644 index 0000000..45d95e2 --- /dev/null +++ b/source/exercice17.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 17. + +.. easypython:: ./exercice17 + :language: DémonPython + :titre: Exercice Stupide 17 + + + diff --git a/source/exercice17/daemon.py b/source/exercice17/daemon.py new file mode 100644 index 0000000..9268c66 --- /dev/null +++ b/source/exercice17/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala17 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice17/daemon.py.old b/source/exercice17/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice17/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice17/requirements.txt b/source/exercice17/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice17/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice17/setup.py b/source/exercice17/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice17/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice17/shell.nix b/source/exercice17/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice17/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice170.rst b/source/exercice170.rst new file mode 100644 index 0000000..b8ea7a2 --- /dev/null +++ b/source/exercice170.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 170. + +.. easypython:: ./exercice170 + :language: DémonPython + :titre: Exercice Stupide 170 + + + diff --git a/source/exercice170/daemon.py b/source/exercice170/daemon.py new file mode 100644 index 0000000..e85e431 --- /dev/null +++ b/source/exercice170/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala170 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice170/daemon.py.old b/source/exercice170/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice170/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice170/requirements.txt b/source/exercice170/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice170/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice170/setup.py b/source/exercice170/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice170/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice170/shell.nix b/source/exercice170/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice170/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice171.rst b/source/exercice171.rst new file mode 100644 index 0000000..c973af8 --- /dev/null +++ b/source/exercice171.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 171. + +.. easypython:: ./exercice171 + :language: DémonPython + :titre: Exercice Stupide 171 + + + diff --git a/source/exercice171/daemon.py b/source/exercice171/daemon.py new file mode 100644 index 0000000..9778259 --- /dev/null +++ b/source/exercice171/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala171 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice171/daemon.py.old b/source/exercice171/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice171/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice171/requirements.txt b/source/exercice171/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice171/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice171/setup.py b/source/exercice171/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice171/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice171/shell.nix b/source/exercice171/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice171/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice172.rst b/source/exercice172.rst new file mode 100644 index 0000000..68a6632 --- /dev/null +++ b/source/exercice172.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 172. + +.. easypython:: ./exercice172 + :language: DémonPython + :titre: Exercice Stupide 172 + + + diff --git a/source/exercice172/daemon.py b/source/exercice172/daemon.py new file mode 100644 index 0000000..78456fe --- /dev/null +++ b/source/exercice172/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala172 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice172/daemon.py.old b/source/exercice172/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice172/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice172/requirements.txt b/source/exercice172/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice172/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice172/setup.py b/source/exercice172/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice172/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice172/shell.nix b/source/exercice172/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice172/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice173.rst b/source/exercice173.rst new file mode 100644 index 0000000..3dc3729 --- /dev/null +++ b/source/exercice173.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 173. + +.. easypython:: ./exercice173 + :language: DémonPython + :titre: Exercice Stupide 173 + + + diff --git a/source/exercice173/daemon.py b/source/exercice173/daemon.py new file mode 100644 index 0000000..d4419ef --- /dev/null +++ b/source/exercice173/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala173 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice173/daemon.py.old b/source/exercice173/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice173/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice173/requirements.txt b/source/exercice173/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice173/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice173/setup.py b/source/exercice173/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice173/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice173/shell.nix b/source/exercice173/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice173/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice174.rst b/source/exercice174.rst new file mode 100644 index 0000000..ce20d24 --- /dev/null +++ b/source/exercice174.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 174. + +.. easypython:: ./exercice174 + :language: DémonPython + :titre: Exercice Stupide 174 + + + diff --git a/source/exercice174/daemon.py b/source/exercice174/daemon.py new file mode 100644 index 0000000..2cf3817 --- /dev/null +++ b/source/exercice174/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala174 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice174/daemon.py.old b/source/exercice174/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice174/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice174/requirements.txt b/source/exercice174/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice174/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice174/setup.py b/source/exercice174/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice174/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice174/shell.nix b/source/exercice174/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice174/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice175.rst b/source/exercice175.rst new file mode 100644 index 0000000..d19b4c4 --- /dev/null +++ b/source/exercice175.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 175. + +.. easypython:: ./exercice175 + :language: DémonPython + :titre: Exercice Stupide 175 + + + diff --git a/source/exercice175/daemon.py b/source/exercice175/daemon.py new file mode 100644 index 0000000..4483a84 --- /dev/null +++ b/source/exercice175/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala175 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice175/daemon.py.old b/source/exercice175/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice175/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice175/requirements.txt b/source/exercice175/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice175/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice175/setup.py b/source/exercice175/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice175/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice175/shell.nix b/source/exercice175/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice175/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice176.rst b/source/exercice176.rst new file mode 100644 index 0000000..48b38a0 --- /dev/null +++ b/source/exercice176.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 176. + +.. easypython:: ./exercice176 + :language: DémonPython + :titre: Exercice Stupide 176 + + + diff --git a/source/exercice176/daemon.py b/source/exercice176/daemon.py new file mode 100644 index 0000000..24bc889 --- /dev/null +++ b/source/exercice176/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala176 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice176/daemon.py.old b/source/exercice176/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice176/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice176/requirements.txt b/source/exercice176/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice176/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice176/setup.py b/source/exercice176/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice176/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice176/shell.nix b/source/exercice176/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice176/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice177.rst b/source/exercice177.rst new file mode 100644 index 0000000..39c3d72 --- /dev/null +++ b/source/exercice177.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 177. + +.. easypython:: ./exercice177 + :language: DémonPython + :titre: Exercice Stupide 177 + + + diff --git a/source/exercice177/daemon.py b/source/exercice177/daemon.py new file mode 100644 index 0000000..e565231 --- /dev/null +++ b/source/exercice177/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala177 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice177/daemon.py.old b/source/exercice177/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice177/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice177/requirements.txt b/source/exercice177/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice177/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice177/setup.py b/source/exercice177/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice177/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice177/shell.nix b/source/exercice177/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice177/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice178.rst b/source/exercice178.rst new file mode 100644 index 0000000..3184ae6 --- /dev/null +++ b/source/exercice178.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 178. + +.. easypython:: ./exercice178 + :language: DémonPython + :titre: Exercice Stupide 178 + + + diff --git a/source/exercice178/daemon.py b/source/exercice178/daemon.py new file mode 100644 index 0000000..50e61dd --- /dev/null +++ b/source/exercice178/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala178 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice178/daemon.py.old b/source/exercice178/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice178/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice178/requirements.txt b/source/exercice178/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice178/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice178/setup.py b/source/exercice178/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice178/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice178/shell.nix b/source/exercice178/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice178/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice179.rst b/source/exercice179.rst new file mode 100644 index 0000000..b62da6b --- /dev/null +++ b/source/exercice179.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 179. + +.. easypython:: ./exercice179 + :language: DémonPython + :titre: Exercice Stupide 179 + + + diff --git a/source/exercice179/daemon.py b/source/exercice179/daemon.py new file mode 100644 index 0000000..83d432f --- /dev/null +++ b/source/exercice179/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala179 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice179/daemon.py.old b/source/exercice179/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice179/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice179/requirements.txt b/source/exercice179/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice179/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice179/setup.py b/source/exercice179/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice179/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice179/shell.nix b/source/exercice179/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice179/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice18.rst b/source/exercice18.rst new file mode 100644 index 0000000..ef6c0ae --- /dev/null +++ b/source/exercice18.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 18. + +.. easypython:: ./exercice18 + :language: DémonPython + :titre: Exercice Stupide 18 + + + diff --git a/source/exercice18/daemon.py b/source/exercice18/daemon.py new file mode 100644 index 0000000..3b36039 --- /dev/null +++ b/source/exercice18/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala18 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice18/daemon.py.old b/source/exercice18/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice18/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice18/requirements.txt b/source/exercice18/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice18/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice18/setup.py b/source/exercice18/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice18/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice18/shell.nix b/source/exercice18/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice18/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice180.rst b/source/exercice180.rst new file mode 100644 index 0000000..25411f9 --- /dev/null +++ b/source/exercice180.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 180. + +.. easypython:: ./exercice180 + :language: DémonPython + :titre: Exercice Stupide 180 + + + diff --git a/source/exercice180/daemon.py b/source/exercice180/daemon.py new file mode 100644 index 0000000..de22b47 --- /dev/null +++ b/source/exercice180/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala180 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice180/daemon.py.old b/source/exercice180/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice180/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice180/requirements.txt b/source/exercice180/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice180/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice180/setup.py b/source/exercice180/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice180/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice180/shell.nix b/source/exercice180/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice180/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice181.rst b/source/exercice181.rst new file mode 100644 index 0000000..97d9a66 --- /dev/null +++ b/source/exercice181.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 181. + +.. easypython:: ./exercice181 + :language: DémonPython + :titre: Exercice Stupide 181 + + + diff --git a/source/exercice181/daemon.py b/source/exercice181/daemon.py new file mode 100644 index 0000000..243acad --- /dev/null +++ b/source/exercice181/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala181 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice181/daemon.py.old b/source/exercice181/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice181/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice181/requirements.txt b/source/exercice181/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice181/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice181/setup.py b/source/exercice181/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice181/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice181/shell.nix b/source/exercice181/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice181/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice182.rst b/source/exercice182.rst new file mode 100644 index 0000000..45bf6c4 --- /dev/null +++ b/source/exercice182.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 182. + +.. easypython:: ./exercice182 + :language: DémonPython + :titre: Exercice Stupide 182 + + + diff --git a/source/exercice182/daemon.py b/source/exercice182/daemon.py new file mode 100644 index 0000000..8f7d646 --- /dev/null +++ b/source/exercice182/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala182 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice182/daemon.py.old b/source/exercice182/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice182/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice182/requirements.txt b/source/exercice182/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice182/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice182/setup.py b/source/exercice182/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice182/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice182/shell.nix b/source/exercice182/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice182/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice183.rst b/source/exercice183.rst new file mode 100644 index 0000000..e0b92ef --- /dev/null +++ b/source/exercice183.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 183. + +.. easypython:: ./exercice183 + :language: DémonPython + :titre: Exercice Stupide 183 + + + diff --git a/source/exercice183/daemon.py b/source/exercice183/daemon.py new file mode 100644 index 0000000..5dc835e --- /dev/null +++ b/source/exercice183/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala183 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice183/daemon.py.old b/source/exercice183/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice183/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice183/requirements.txt b/source/exercice183/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice183/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice183/setup.py b/source/exercice183/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice183/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice183/shell.nix b/source/exercice183/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice183/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice184.rst b/source/exercice184.rst new file mode 100644 index 0000000..13b18d9 --- /dev/null +++ b/source/exercice184.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 184. + +.. easypython:: ./exercice184 + :language: DémonPython + :titre: Exercice Stupide 184 + + + diff --git a/source/exercice184/daemon.py b/source/exercice184/daemon.py new file mode 100644 index 0000000..f543e08 --- /dev/null +++ b/source/exercice184/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala184 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice184/daemon.py.old b/source/exercice184/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice184/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice184/requirements.txt b/source/exercice184/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice184/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice184/setup.py b/source/exercice184/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice184/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice184/shell.nix b/source/exercice184/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice184/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice185.rst b/source/exercice185.rst new file mode 100644 index 0000000..471a532 --- /dev/null +++ b/source/exercice185.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 185. + +.. easypython:: ./exercice185 + :language: DémonPython + :titre: Exercice Stupide 185 + + + diff --git a/source/exercice185/daemon.py b/source/exercice185/daemon.py new file mode 100644 index 0000000..0c66827 --- /dev/null +++ b/source/exercice185/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala185 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice185/daemon.py.old b/source/exercice185/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice185/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice185/requirements.txt b/source/exercice185/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice185/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice185/setup.py b/source/exercice185/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice185/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice185/shell.nix b/source/exercice185/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice185/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice186.rst b/source/exercice186.rst new file mode 100644 index 0000000..49de760 --- /dev/null +++ b/source/exercice186.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 186. + +.. easypython:: ./exercice186 + :language: DémonPython + :titre: Exercice Stupide 186 + + + diff --git a/source/exercice186/daemon.py b/source/exercice186/daemon.py new file mode 100644 index 0000000..8f38cff --- /dev/null +++ b/source/exercice186/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala186 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice186/daemon.py.old b/source/exercice186/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice186/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice186/requirements.txt b/source/exercice186/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice186/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice186/setup.py b/source/exercice186/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice186/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice186/shell.nix b/source/exercice186/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice186/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice187.rst b/source/exercice187.rst new file mode 100644 index 0000000..1c09ffa --- /dev/null +++ b/source/exercice187.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 187. + +.. easypython:: ./exercice187 + :language: DémonPython + :titre: Exercice Stupide 187 + + + diff --git a/source/exercice187/daemon.py b/source/exercice187/daemon.py new file mode 100644 index 0000000..353339d --- /dev/null +++ b/source/exercice187/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala187 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice187/daemon.py.old b/source/exercice187/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice187/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice187/requirements.txt b/source/exercice187/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice187/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice187/setup.py b/source/exercice187/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice187/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice187/shell.nix b/source/exercice187/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice187/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice188.rst b/source/exercice188.rst new file mode 100644 index 0000000..1d6977a --- /dev/null +++ b/source/exercice188.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 188. + +.. easypython:: ./exercice188 + :language: DémonPython + :titre: Exercice Stupide 188 + + + diff --git a/source/exercice188/daemon.py b/source/exercice188/daemon.py new file mode 100644 index 0000000..edff5d1 --- /dev/null +++ b/source/exercice188/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala188 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice188/daemon.py.old b/source/exercice188/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice188/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice188/requirements.txt b/source/exercice188/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice188/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice188/setup.py b/source/exercice188/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice188/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice188/shell.nix b/source/exercice188/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice188/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice189.rst b/source/exercice189.rst new file mode 100644 index 0000000..e691f5f --- /dev/null +++ b/source/exercice189.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 189. + +.. easypython:: ./exercice189 + :language: DémonPython + :titre: Exercice Stupide 189 + + + diff --git a/source/exercice189/daemon.py b/source/exercice189/daemon.py new file mode 100644 index 0000000..3aa0a6d --- /dev/null +++ b/source/exercice189/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala189 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice189/daemon.py.old b/source/exercice189/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice189/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice189/requirements.txt b/source/exercice189/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice189/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice189/setup.py b/source/exercice189/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice189/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice189/shell.nix b/source/exercice189/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice189/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice19.rst b/source/exercice19.rst new file mode 100644 index 0000000..74760c6 --- /dev/null +++ b/source/exercice19.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 19. + +.. easypython:: ./exercice19 + :language: DémonPython + :titre: Exercice Stupide 19 + + + diff --git a/source/exercice19/daemon.py b/source/exercice19/daemon.py new file mode 100644 index 0000000..aea1abe --- /dev/null +++ b/source/exercice19/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala19 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice19/daemon.py.old b/source/exercice19/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice19/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice19/requirements.txt b/source/exercice19/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice19/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice19/setup.py b/source/exercice19/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice19/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice19/shell.nix b/source/exercice19/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice19/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice190.rst b/source/exercice190.rst new file mode 100644 index 0000000..30972a2 --- /dev/null +++ b/source/exercice190.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 190. + +.. easypython:: ./exercice190 + :language: DémonPython + :titre: Exercice Stupide 190 + + + diff --git a/source/exercice190/daemon.py b/source/exercice190/daemon.py new file mode 100644 index 0000000..043c673 --- /dev/null +++ b/source/exercice190/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala190 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice190/daemon.py.old b/source/exercice190/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice190/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice190/requirements.txt b/source/exercice190/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice190/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice190/setup.py b/source/exercice190/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice190/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice190/shell.nix b/source/exercice190/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice190/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice191.rst b/source/exercice191.rst new file mode 100644 index 0000000..e6b641e --- /dev/null +++ b/source/exercice191.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 191. + +.. easypython:: ./exercice191 + :language: DémonPython + :titre: Exercice Stupide 191 + + + diff --git a/source/exercice191/daemon.py b/source/exercice191/daemon.py new file mode 100644 index 0000000..d3fb59b --- /dev/null +++ b/source/exercice191/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala191 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice191/daemon.py.old b/source/exercice191/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice191/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice191/requirements.txt b/source/exercice191/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice191/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice191/setup.py b/source/exercice191/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice191/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice191/shell.nix b/source/exercice191/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice191/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice192.rst b/source/exercice192.rst new file mode 100644 index 0000000..e96d420 --- /dev/null +++ b/source/exercice192.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 192. + +.. easypython:: ./exercice192 + :language: DémonPython + :titre: Exercice Stupide 192 + + + diff --git a/source/exercice192/daemon.py b/source/exercice192/daemon.py new file mode 100644 index 0000000..54748dc --- /dev/null +++ b/source/exercice192/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala192 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice192/daemon.py.old b/source/exercice192/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice192/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice192/requirements.txt b/source/exercice192/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice192/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice192/setup.py b/source/exercice192/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice192/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice192/shell.nix b/source/exercice192/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice192/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice193.rst b/source/exercice193.rst new file mode 100644 index 0000000..b1f8d39 --- /dev/null +++ b/source/exercice193.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 193. + +.. easypython:: ./exercice193 + :language: DémonPython + :titre: Exercice Stupide 193 + + + diff --git a/source/exercice193/daemon.py b/source/exercice193/daemon.py new file mode 100644 index 0000000..d66894c --- /dev/null +++ b/source/exercice193/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala193 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice193/daemon.py.old b/source/exercice193/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice193/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice193/requirements.txt b/source/exercice193/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice193/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice193/setup.py b/source/exercice193/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice193/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice193/shell.nix b/source/exercice193/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice193/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice194.rst b/source/exercice194.rst new file mode 100644 index 0000000..dfdf641 --- /dev/null +++ b/source/exercice194.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 194. + +.. easypython:: ./exercice194 + :language: DémonPython + :titre: Exercice Stupide 194 + + + diff --git a/source/exercice194/daemon.py b/source/exercice194/daemon.py new file mode 100644 index 0000000..139ccf0 --- /dev/null +++ b/source/exercice194/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala194 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice194/daemon.py.old b/source/exercice194/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice194/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice194/requirements.txt b/source/exercice194/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice194/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice194/setup.py b/source/exercice194/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice194/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice194/shell.nix b/source/exercice194/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice194/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice195.rst b/source/exercice195.rst new file mode 100644 index 0000000..6c073a0 --- /dev/null +++ b/source/exercice195.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 195. + +.. easypython:: ./exercice195 + :language: DémonPython + :titre: Exercice Stupide 195 + + + diff --git a/source/exercice195/daemon.py b/source/exercice195/daemon.py new file mode 100644 index 0000000..15d46a6 --- /dev/null +++ b/source/exercice195/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala195 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice195/daemon.py.old b/source/exercice195/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice195/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice195/requirements.txt b/source/exercice195/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice195/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice195/setup.py b/source/exercice195/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice195/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice195/shell.nix b/source/exercice195/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice195/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice196.rst b/source/exercice196.rst new file mode 100644 index 0000000..0aa8f3c --- /dev/null +++ b/source/exercice196.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 196. + +.. easypython:: ./exercice196 + :language: DémonPython + :titre: Exercice Stupide 196 + + + diff --git a/source/exercice196/daemon.py b/source/exercice196/daemon.py new file mode 100644 index 0000000..7e13f15 --- /dev/null +++ b/source/exercice196/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala196 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice196/daemon.py.old b/source/exercice196/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice196/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice196/requirements.txt b/source/exercice196/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice196/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice196/setup.py b/source/exercice196/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice196/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice196/shell.nix b/source/exercice196/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice196/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice197.rst b/source/exercice197.rst new file mode 100644 index 0000000..0886c30 --- /dev/null +++ b/source/exercice197.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 197. + +.. easypython:: ./exercice197 + :language: DémonPython + :titre: Exercice Stupide 197 + + + diff --git a/source/exercice197/daemon.py b/source/exercice197/daemon.py new file mode 100644 index 0000000..5617012 --- /dev/null +++ b/source/exercice197/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala197 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice197/daemon.py.old b/source/exercice197/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice197/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice197/requirements.txt b/source/exercice197/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice197/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice197/setup.py b/source/exercice197/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice197/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice197/shell.nix b/source/exercice197/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice197/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice198.rst b/source/exercice198.rst new file mode 100644 index 0000000..52b9be0 --- /dev/null +++ b/source/exercice198.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 198. + +.. easypython:: ./exercice198 + :language: DémonPython + :titre: Exercice Stupide 198 + + + diff --git a/source/exercice198/daemon.py b/source/exercice198/daemon.py new file mode 100644 index 0000000..85539fb --- /dev/null +++ b/source/exercice198/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala198 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice198/daemon.py.old b/source/exercice198/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice198/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice198/requirements.txt b/source/exercice198/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice198/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice198/setup.py b/source/exercice198/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice198/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice198/shell.nix b/source/exercice198/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice198/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice199.rst b/source/exercice199.rst new file mode 100644 index 0000000..d64792d --- /dev/null +++ b/source/exercice199.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 199. + +.. easypython:: ./exercice199 + :language: DémonPython + :titre: Exercice Stupide 199 + + + diff --git a/source/exercice199/daemon.py b/source/exercice199/daemon.py new file mode 100644 index 0000000..3145e3a --- /dev/null +++ b/source/exercice199/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala199 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice199/daemon.py.old b/source/exercice199/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice199/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice199/requirements.txt b/source/exercice199/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice199/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice199/setup.py b/source/exercice199/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice199/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice199/shell.nix b/source/exercice199/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice199/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice2.rst b/source/exercice2.rst new file mode 100644 index 0000000..4ec479d --- /dev/null +++ b/source/exercice2.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 2. + +.. easypython:: ./exercice2 + :language: DémonPython + :titre: Exercice Stupide 2 + + + diff --git a/source/exercice2/daemon.py b/source/exercice2/daemon.py new file mode 100644 index 0000000..ebd9ce4 --- /dev/null +++ b/source/exercice2/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala2 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice2/daemon.py.old b/source/exercice2/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice2/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice2/requirements.txt b/source/exercice2/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice2/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice2/setup.py b/source/exercice2/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice2/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice2/shell.nix b/source/exercice2/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice2/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice20.rst b/source/exercice20.rst new file mode 100644 index 0000000..3f11883 --- /dev/null +++ b/source/exercice20.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 20. + +.. easypython:: ./exercice20 + :language: DémonPython + :titre: Exercice Stupide 20 + + + diff --git a/source/exercice20/daemon.py b/source/exercice20/daemon.py new file mode 100644 index 0000000..760e6e3 --- /dev/null +++ b/source/exercice20/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala20 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice20/daemon.py.old b/source/exercice20/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice20/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice20/requirements.txt b/source/exercice20/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice20/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice20/setup.py b/source/exercice20/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice20/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice20/shell.nix b/source/exercice20/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice20/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice200.rst b/source/exercice200.rst new file mode 100644 index 0000000..30c72a8 --- /dev/null +++ b/source/exercice200.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 200. + +.. easypython:: ./exercice200 + :language: DémonPython + :titre: Exercice Stupide 200 + + + diff --git a/source/exercice200/daemon.py b/source/exercice200/daemon.py new file mode 100644 index 0000000..3642e45 --- /dev/null +++ b/source/exercice200/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala200 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice200/daemon.py.old b/source/exercice200/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice200/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice200/requirements.txt b/source/exercice200/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice200/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice200/setup.py b/source/exercice200/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice200/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice200/shell.nix b/source/exercice200/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice200/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice21.rst b/source/exercice21.rst new file mode 100644 index 0000000..1fbfbed --- /dev/null +++ b/source/exercice21.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 21. + +.. easypython:: ./exercice21 + :language: DémonPython + :titre: Exercice Stupide 21 + + + diff --git a/source/exercice21/daemon.py b/source/exercice21/daemon.py new file mode 100644 index 0000000..76f65ed --- /dev/null +++ b/source/exercice21/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala21 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice21/daemon.py.old b/source/exercice21/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice21/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice21/requirements.txt b/source/exercice21/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice21/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice21/setup.py b/source/exercice21/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice21/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice21/shell.nix b/source/exercice21/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice21/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice22.rst b/source/exercice22.rst new file mode 100644 index 0000000..6f3e91b --- /dev/null +++ b/source/exercice22.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 22. + +.. easypython:: ./exercice22 + :language: DémonPython + :titre: Exercice Stupide 22 + + + diff --git a/source/exercice22/daemon.py b/source/exercice22/daemon.py new file mode 100644 index 0000000..f98bff7 --- /dev/null +++ b/source/exercice22/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala22 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice22/daemon.py.old b/source/exercice22/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice22/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice22/requirements.txt b/source/exercice22/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice22/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice22/setup.py b/source/exercice22/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice22/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice22/shell.nix b/source/exercice22/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice22/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice23.rst b/source/exercice23.rst new file mode 100644 index 0000000..2ed1e95 --- /dev/null +++ b/source/exercice23.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 23. + +.. easypython:: ./exercice23 + :language: DémonPython + :titre: Exercice Stupide 23 + + + diff --git a/source/exercice23/daemon.py b/source/exercice23/daemon.py new file mode 100644 index 0000000..d81c4a8 --- /dev/null +++ b/source/exercice23/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala23 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice23/daemon.py.old b/source/exercice23/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice23/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice23/requirements.txt b/source/exercice23/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice23/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice23/setup.py b/source/exercice23/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice23/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice23/shell.nix b/source/exercice23/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice23/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice24.rst b/source/exercice24.rst new file mode 100644 index 0000000..d657906 --- /dev/null +++ b/source/exercice24.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 24. + +.. easypython:: ./exercice24 + :language: DémonPython + :titre: Exercice Stupide 24 + + + diff --git a/source/exercice24/daemon.py b/source/exercice24/daemon.py new file mode 100644 index 0000000..6bb58a9 --- /dev/null +++ b/source/exercice24/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala24 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice24/daemon.py.old b/source/exercice24/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice24/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice24/requirements.txt b/source/exercice24/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice24/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice24/setup.py b/source/exercice24/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice24/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice24/shell.nix b/source/exercice24/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice24/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice25.rst b/source/exercice25.rst new file mode 100644 index 0000000..c90240b --- /dev/null +++ b/source/exercice25.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 25. + +.. easypython:: ./exercice25 + :language: DémonPython + :titre: Exercice Stupide 25 + + + diff --git a/source/exercice25/daemon.py b/source/exercice25/daemon.py new file mode 100644 index 0000000..d458da5 --- /dev/null +++ b/source/exercice25/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala25 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice25/daemon.py.old b/source/exercice25/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice25/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice25/requirements.txt b/source/exercice25/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice25/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice25/setup.py b/source/exercice25/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice25/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice25/shell.nix b/source/exercice25/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice25/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice26.rst b/source/exercice26.rst new file mode 100644 index 0000000..cbaa9b5 --- /dev/null +++ b/source/exercice26.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 26. + +.. easypython:: ./exercice26 + :language: DémonPython + :titre: Exercice Stupide 26 + + + diff --git a/source/exercice26/daemon.py b/source/exercice26/daemon.py new file mode 100644 index 0000000..f4c3ac0 --- /dev/null +++ b/source/exercice26/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala26 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice26/daemon.py.old b/source/exercice26/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice26/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice26/requirements.txt b/source/exercice26/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice26/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice26/setup.py b/source/exercice26/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice26/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice26/shell.nix b/source/exercice26/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice26/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice27.rst b/source/exercice27.rst new file mode 100644 index 0000000..90d8225 --- /dev/null +++ b/source/exercice27.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 27. + +.. easypython:: ./exercice27 + :language: DémonPython + :titre: Exercice Stupide 27 + + + diff --git a/source/exercice27/daemon.py b/source/exercice27/daemon.py new file mode 100644 index 0000000..b8bfe63 --- /dev/null +++ b/source/exercice27/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala27 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice27/daemon.py.old b/source/exercice27/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice27/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice27/requirements.txt b/source/exercice27/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice27/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice27/setup.py b/source/exercice27/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice27/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice27/shell.nix b/source/exercice27/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice27/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice28.rst b/source/exercice28.rst new file mode 100644 index 0000000..8341d7d --- /dev/null +++ b/source/exercice28.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 28. + +.. easypython:: ./exercice28 + :language: DémonPython + :titre: Exercice Stupide 28 + + + diff --git a/source/exercice28/daemon.py b/source/exercice28/daemon.py new file mode 100644 index 0000000..8ab4656 --- /dev/null +++ b/source/exercice28/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala28 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice28/daemon.py.old b/source/exercice28/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice28/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice28/requirements.txt b/source/exercice28/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice28/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice28/setup.py b/source/exercice28/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice28/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice28/shell.nix b/source/exercice28/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice28/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice29.rst b/source/exercice29.rst new file mode 100644 index 0000000..3672898 --- /dev/null +++ b/source/exercice29.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 29. + +.. easypython:: ./exercice29 + :language: DémonPython + :titre: Exercice Stupide 29 + + + diff --git a/source/exercice29/daemon.py b/source/exercice29/daemon.py new file mode 100644 index 0000000..2984cef --- /dev/null +++ b/source/exercice29/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala29 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice29/daemon.py.old b/source/exercice29/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice29/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice29/requirements.txt b/source/exercice29/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice29/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice29/setup.py b/source/exercice29/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice29/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice29/shell.nix b/source/exercice29/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice29/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice3.rst b/source/exercice3.rst new file mode 100644 index 0000000..d0545e3 --- /dev/null +++ b/source/exercice3.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 3. + +.. easypython:: ./exercice3 + :language: DémonPython + :titre: Exercice Stupide 3 + + + diff --git a/source/exercice3/daemon.py b/source/exercice3/daemon.py new file mode 100644 index 0000000..0316fc3 --- /dev/null +++ b/source/exercice3/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala3 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice3/daemon.py.old b/source/exercice3/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice3/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice3/requirements.txt b/source/exercice3/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice3/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice3/setup.py b/source/exercice3/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice3/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice3/shell.nix b/source/exercice3/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice3/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice30.rst b/source/exercice30.rst new file mode 100644 index 0000000..d578639 --- /dev/null +++ b/source/exercice30.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 30. + +.. easypython:: ./exercice30 + :language: DémonPython + :titre: Exercice Stupide 30 + + + diff --git a/source/exercice30/daemon.py b/source/exercice30/daemon.py new file mode 100644 index 0000000..c155c5a --- /dev/null +++ b/source/exercice30/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala30 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice30/daemon.py.old b/source/exercice30/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice30/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice30/requirements.txt b/source/exercice30/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice30/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice30/setup.py b/source/exercice30/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice30/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice30/shell.nix b/source/exercice30/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice30/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice31.rst b/source/exercice31.rst new file mode 100644 index 0000000..e6e74da --- /dev/null +++ b/source/exercice31.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 31. + +.. easypython:: ./exercice31 + :language: DémonPython + :titre: Exercice Stupide 31 + + + diff --git a/source/exercice31/daemon.py b/source/exercice31/daemon.py new file mode 100644 index 0000000..2f0c887 --- /dev/null +++ b/source/exercice31/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala31 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice31/daemon.py.old b/source/exercice31/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice31/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice31/requirements.txt b/source/exercice31/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice31/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice31/setup.py b/source/exercice31/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice31/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice31/shell.nix b/source/exercice31/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice31/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice32.rst b/source/exercice32.rst new file mode 100644 index 0000000..c031a79 --- /dev/null +++ b/source/exercice32.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 32. + +.. easypython:: ./exercice32 + :language: DémonPython + :titre: Exercice Stupide 32 + + + diff --git a/source/exercice32/daemon.py b/source/exercice32/daemon.py new file mode 100644 index 0000000..4126614 --- /dev/null +++ b/source/exercice32/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala32 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice32/daemon.py.old b/source/exercice32/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice32/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice32/requirements.txt b/source/exercice32/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice32/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice32/setup.py b/source/exercice32/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice32/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice32/shell.nix b/source/exercice32/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice32/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice33.rst b/source/exercice33.rst new file mode 100644 index 0000000..4b8f140 --- /dev/null +++ b/source/exercice33.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 33. + +.. easypython:: ./exercice33 + :language: DémonPython + :titre: Exercice Stupide 33 + + + diff --git a/source/exercice33/daemon.py b/source/exercice33/daemon.py new file mode 100644 index 0000000..695685d --- /dev/null +++ b/source/exercice33/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala33 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice33/daemon.py.old b/source/exercice33/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice33/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice33/requirements.txt b/source/exercice33/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice33/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice33/setup.py b/source/exercice33/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice33/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice33/shell.nix b/source/exercice33/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice33/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice34.rst b/source/exercice34.rst new file mode 100644 index 0000000..b4162eb --- /dev/null +++ b/source/exercice34.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 34. + +.. easypython:: ./exercice34 + :language: DémonPython + :titre: Exercice Stupide 34 + + + diff --git a/source/exercice34/daemon.py b/source/exercice34/daemon.py new file mode 100644 index 0000000..5020091 --- /dev/null +++ b/source/exercice34/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala34 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice34/daemon.py.old b/source/exercice34/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice34/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice34/requirements.txt b/source/exercice34/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice34/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice34/setup.py b/source/exercice34/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice34/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice34/shell.nix b/source/exercice34/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice34/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice35.rst b/source/exercice35.rst new file mode 100644 index 0000000..69b0700 --- /dev/null +++ b/source/exercice35.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 35. + +.. easypython:: ./exercice35 + :language: DémonPython + :titre: Exercice Stupide 35 + + + diff --git a/source/exercice35/daemon.py b/source/exercice35/daemon.py new file mode 100644 index 0000000..a1ffd36 --- /dev/null +++ b/source/exercice35/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala35 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice35/daemon.py.old b/source/exercice35/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice35/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice35/requirements.txt b/source/exercice35/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice35/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice35/setup.py b/source/exercice35/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice35/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice35/shell.nix b/source/exercice35/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice35/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice36.rst b/source/exercice36.rst new file mode 100644 index 0000000..13e2d7c --- /dev/null +++ b/source/exercice36.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 36. + +.. easypython:: ./exercice36 + :language: DémonPython + :titre: Exercice Stupide 36 + + + diff --git a/source/exercice36/daemon.py b/source/exercice36/daemon.py new file mode 100644 index 0000000..90ccc62 --- /dev/null +++ b/source/exercice36/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala36 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice36/daemon.py.old b/source/exercice36/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice36/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice36/requirements.txt b/source/exercice36/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice36/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice36/setup.py b/source/exercice36/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice36/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice36/shell.nix b/source/exercice36/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice36/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice37.rst b/source/exercice37.rst new file mode 100644 index 0000000..20ce469 --- /dev/null +++ b/source/exercice37.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 37. + +.. easypython:: ./exercice37 + :language: DémonPython + :titre: Exercice Stupide 37 + + + diff --git a/source/exercice37/daemon.py b/source/exercice37/daemon.py new file mode 100644 index 0000000..c0ab2bb --- /dev/null +++ b/source/exercice37/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala37 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice37/daemon.py.old b/source/exercice37/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice37/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice37/requirements.txt b/source/exercice37/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice37/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice37/setup.py b/source/exercice37/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice37/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice37/shell.nix b/source/exercice37/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice37/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice38.rst b/source/exercice38.rst new file mode 100644 index 0000000..2694a4b --- /dev/null +++ b/source/exercice38.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 38. + +.. easypython:: ./exercice38 + :language: DémonPython + :titre: Exercice Stupide 38 + + + diff --git a/source/exercice38/daemon.py b/source/exercice38/daemon.py new file mode 100644 index 0000000..4546f8a --- /dev/null +++ b/source/exercice38/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala38 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice38/daemon.py.old b/source/exercice38/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice38/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice38/requirements.txt b/source/exercice38/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice38/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice38/setup.py b/source/exercice38/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice38/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice38/shell.nix b/source/exercice38/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice38/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice39.rst b/source/exercice39.rst new file mode 100644 index 0000000..5c139f7 --- /dev/null +++ b/source/exercice39.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 39. + +.. easypython:: ./exercice39 + :language: DémonPython + :titre: Exercice Stupide 39 + + + diff --git a/source/exercice39/daemon.py b/source/exercice39/daemon.py new file mode 100644 index 0000000..fe49400 --- /dev/null +++ b/source/exercice39/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala39 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice39/daemon.py.old b/source/exercice39/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice39/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice39/requirements.txt b/source/exercice39/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice39/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice39/setup.py b/source/exercice39/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice39/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice39/shell.nix b/source/exercice39/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice39/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice4.rst b/source/exercice4.rst new file mode 100644 index 0000000..c1b804c --- /dev/null +++ b/source/exercice4.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 4. + +.. easypython:: ./exercice4 + :language: DémonPython + :titre: Exercice Stupide 4 + + + diff --git a/source/exercice4/daemon.py b/source/exercice4/daemon.py new file mode 100644 index 0000000..0063574 --- /dev/null +++ b/source/exercice4/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala4 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice4/daemon.py.old b/source/exercice4/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice4/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice4/requirements.txt b/source/exercice4/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice4/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice4/setup.py b/source/exercice4/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice4/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice4/shell.nix b/source/exercice4/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice4/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice40.rst b/source/exercice40.rst new file mode 100644 index 0000000..c9097c3 --- /dev/null +++ b/source/exercice40.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 40. + +.. easypython:: ./exercice40 + :language: DémonPython + :titre: Exercice Stupide 40 + + + diff --git a/source/exercice40/daemon.py b/source/exercice40/daemon.py new file mode 100644 index 0000000..ac4e935 --- /dev/null +++ b/source/exercice40/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala40 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice40/daemon.py.old b/source/exercice40/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice40/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice40/requirements.txt b/source/exercice40/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice40/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice40/setup.py b/source/exercice40/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice40/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice40/shell.nix b/source/exercice40/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice40/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice41.rst b/source/exercice41.rst new file mode 100644 index 0000000..9ac7242 --- /dev/null +++ b/source/exercice41.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 41. + +.. easypython:: ./exercice41 + :language: DémonPython + :titre: Exercice Stupide 41 + + + diff --git a/source/exercice41/daemon.py b/source/exercice41/daemon.py new file mode 100644 index 0000000..98e464a --- /dev/null +++ b/source/exercice41/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala41 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice41/daemon.py.old b/source/exercice41/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice41/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice41/requirements.txt b/source/exercice41/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice41/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice41/setup.py b/source/exercice41/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice41/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice41/shell.nix b/source/exercice41/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice41/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice42.rst b/source/exercice42.rst new file mode 100644 index 0000000..90a18da --- /dev/null +++ b/source/exercice42.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 42. + +.. easypython:: ./exercice42 + :language: DémonPython + :titre: Exercice Stupide 42 + + + diff --git a/source/exercice42/daemon.py b/source/exercice42/daemon.py new file mode 100644 index 0000000..7f30938 --- /dev/null +++ b/source/exercice42/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala42 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice42/daemon.py.old b/source/exercice42/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice42/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice42/requirements.txt b/source/exercice42/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice42/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice42/setup.py b/source/exercice42/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice42/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice42/shell.nix b/source/exercice42/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice42/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice43.rst b/source/exercice43.rst new file mode 100644 index 0000000..1c7ee34 --- /dev/null +++ b/source/exercice43.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 43. + +.. easypython:: ./exercice43 + :language: DémonPython + :titre: Exercice Stupide 43 + + + diff --git a/source/exercice43/daemon.py b/source/exercice43/daemon.py new file mode 100644 index 0000000..d11b092 --- /dev/null +++ b/source/exercice43/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala43 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice43/daemon.py.old b/source/exercice43/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice43/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice43/requirements.txt b/source/exercice43/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice43/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice43/setup.py b/source/exercice43/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice43/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice43/shell.nix b/source/exercice43/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice43/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice44.rst b/source/exercice44.rst new file mode 100644 index 0000000..0280c8d --- /dev/null +++ b/source/exercice44.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 44. + +.. easypython:: ./exercice44 + :language: DémonPython + :titre: Exercice Stupide 44 + + + diff --git a/source/exercice44/daemon.py b/source/exercice44/daemon.py new file mode 100644 index 0000000..83c4735 --- /dev/null +++ b/source/exercice44/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala44 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice44/daemon.py.old b/source/exercice44/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice44/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice44/requirements.txt b/source/exercice44/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice44/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice44/setup.py b/source/exercice44/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice44/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice44/shell.nix b/source/exercice44/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice44/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice45.rst b/source/exercice45.rst new file mode 100644 index 0000000..6d37714 --- /dev/null +++ b/source/exercice45.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 45. + +.. easypython:: ./exercice45 + :language: DémonPython + :titre: Exercice Stupide 45 + + + diff --git a/source/exercice45/daemon.py b/source/exercice45/daemon.py new file mode 100644 index 0000000..142d9bd --- /dev/null +++ b/source/exercice45/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala45 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice45/daemon.py.old b/source/exercice45/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice45/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice45/requirements.txt b/source/exercice45/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice45/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice45/setup.py b/source/exercice45/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice45/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice45/shell.nix b/source/exercice45/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice45/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice46.rst b/source/exercice46.rst new file mode 100644 index 0000000..c25f438 --- /dev/null +++ b/source/exercice46.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 46. + +.. easypython:: ./exercice46 + :language: DémonPython + :titre: Exercice Stupide 46 + + + diff --git a/source/exercice46/daemon.py b/source/exercice46/daemon.py new file mode 100644 index 0000000..0850ee1 --- /dev/null +++ b/source/exercice46/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala46 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice46/daemon.py.old b/source/exercice46/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice46/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice46/requirements.txt b/source/exercice46/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice46/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice46/setup.py b/source/exercice46/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice46/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice46/shell.nix b/source/exercice46/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice46/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice47.rst b/source/exercice47.rst new file mode 100644 index 0000000..ddf39c7 --- /dev/null +++ b/source/exercice47.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 47. + +.. easypython:: ./exercice47 + :language: DémonPython + :titre: Exercice Stupide 47 + + + diff --git a/source/exercice47/daemon.py b/source/exercice47/daemon.py new file mode 100644 index 0000000..ab271e2 --- /dev/null +++ b/source/exercice47/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala47 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice47/daemon.py.old b/source/exercice47/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice47/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice47/requirements.txt b/source/exercice47/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice47/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice47/setup.py b/source/exercice47/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice47/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice47/shell.nix b/source/exercice47/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice47/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice48.rst b/source/exercice48.rst new file mode 100644 index 0000000..e1c1e7a --- /dev/null +++ b/source/exercice48.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 48. + +.. easypython:: ./exercice48 + :language: DémonPython + :titre: Exercice Stupide 48 + + + diff --git a/source/exercice48/daemon.py b/source/exercice48/daemon.py new file mode 100644 index 0000000..e8e47a6 --- /dev/null +++ b/source/exercice48/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala48 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice48/daemon.py.old b/source/exercice48/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice48/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice48/requirements.txt b/source/exercice48/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice48/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice48/setup.py b/source/exercice48/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice48/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice48/shell.nix b/source/exercice48/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice48/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice49.rst b/source/exercice49.rst new file mode 100644 index 0000000..b7edf43 --- /dev/null +++ b/source/exercice49.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 49. + +.. easypython:: ./exercice49 + :language: DémonPython + :titre: Exercice Stupide 49 + + + diff --git a/source/exercice49/daemon.py b/source/exercice49/daemon.py new file mode 100644 index 0000000..715e481 --- /dev/null +++ b/source/exercice49/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala49 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice49/daemon.py.old b/source/exercice49/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice49/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice49/requirements.txt b/source/exercice49/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice49/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice49/setup.py b/source/exercice49/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice49/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice49/shell.nix b/source/exercice49/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice49/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice5.rst b/source/exercice5.rst new file mode 100644 index 0000000..f0e8957 --- /dev/null +++ b/source/exercice5.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 5. + +.. easypython:: ./exercice5 + :language: DémonPython + :titre: Exercice Stupide 5 + + + diff --git a/source/exercice5/daemon.py b/source/exercice5/daemon.py new file mode 100644 index 0000000..e050244 --- /dev/null +++ b/source/exercice5/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala5 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice5/daemon.py.old b/source/exercice5/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice5/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice5/requirements.txt b/source/exercice5/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice5/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice5/setup.py b/source/exercice5/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice5/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice5/shell.nix b/source/exercice5/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice5/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice50.rst b/source/exercice50.rst new file mode 100644 index 0000000..4392393 --- /dev/null +++ b/source/exercice50.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 50. + +.. easypython:: ./exercice50 + :language: DémonPython + :titre: Exercice Stupide 50 + + + diff --git a/source/exercice50/daemon.py b/source/exercice50/daemon.py new file mode 100644 index 0000000..d0d1c94 --- /dev/null +++ b/source/exercice50/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala50 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice50/daemon.py.old b/source/exercice50/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice50/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice50/requirements.txt b/source/exercice50/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice50/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice50/setup.py b/source/exercice50/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice50/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice50/shell.nix b/source/exercice50/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice50/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice51.rst b/source/exercice51.rst new file mode 100644 index 0000000..d4092e6 --- /dev/null +++ b/source/exercice51.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 51. + +.. easypython:: ./exercice51 + :language: DémonPython + :titre: Exercice Stupide 51 + + + diff --git a/source/exercice51/daemon.py b/source/exercice51/daemon.py new file mode 100644 index 0000000..a47df4a --- /dev/null +++ b/source/exercice51/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala51 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice51/daemon.py.old b/source/exercice51/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice51/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice51/requirements.txt b/source/exercice51/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice51/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice51/setup.py b/source/exercice51/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice51/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice51/shell.nix b/source/exercice51/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice51/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice52.rst b/source/exercice52.rst new file mode 100644 index 0000000..127aa7e --- /dev/null +++ b/source/exercice52.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 52. + +.. easypython:: ./exercice52 + :language: DémonPython + :titre: Exercice Stupide 52 + + + diff --git a/source/exercice52/daemon.py b/source/exercice52/daemon.py new file mode 100644 index 0000000..503ce76 --- /dev/null +++ b/source/exercice52/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala52 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice52/daemon.py.old b/source/exercice52/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice52/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice52/requirements.txt b/source/exercice52/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice52/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice52/setup.py b/source/exercice52/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice52/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice52/shell.nix b/source/exercice52/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice52/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice53.rst b/source/exercice53.rst new file mode 100644 index 0000000..585b1d5 --- /dev/null +++ b/source/exercice53.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 53. + +.. easypython:: ./exercice53 + :language: DémonPython + :titre: Exercice Stupide 53 + + + diff --git a/source/exercice53/daemon.py b/source/exercice53/daemon.py new file mode 100644 index 0000000..b014f5f --- /dev/null +++ b/source/exercice53/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala53 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice53/daemon.py.old b/source/exercice53/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice53/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice53/requirements.txt b/source/exercice53/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice53/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice53/setup.py b/source/exercice53/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice53/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice53/shell.nix b/source/exercice53/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice53/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice54.rst b/source/exercice54.rst new file mode 100644 index 0000000..da03b6f --- /dev/null +++ b/source/exercice54.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 54. + +.. easypython:: ./exercice54 + :language: DémonPython + :titre: Exercice Stupide 54 + + + diff --git a/source/exercice54/daemon.py b/source/exercice54/daemon.py new file mode 100644 index 0000000..1832b1a --- /dev/null +++ b/source/exercice54/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala54 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice54/daemon.py.old b/source/exercice54/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice54/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice54/requirements.txt b/source/exercice54/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice54/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice54/setup.py b/source/exercice54/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice54/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice54/shell.nix b/source/exercice54/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice54/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice55.rst b/source/exercice55.rst new file mode 100644 index 0000000..6f80e4f --- /dev/null +++ b/source/exercice55.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 55. + +.. easypython:: ./exercice55 + :language: DémonPython + :titre: Exercice Stupide 55 + + + diff --git a/source/exercice55/daemon.py b/source/exercice55/daemon.py new file mode 100644 index 0000000..921de2a --- /dev/null +++ b/source/exercice55/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala55 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice55/daemon.py.old b/source/exercice55/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice55/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice55/requirements.txt b/source/exercice55/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice55/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice55/setup.py b/source/exercice55/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice55/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice55/shell.nix b/source/exercice55/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice55/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice56.rst b/source/exercice56.rst new file mode 100644 index 0000000..7866846 --- /dev/null +++ b/source/exercice56.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 56. + +.. easypython:: ./exercice56 + :language: DémonPython + :titre: Exercice Stupide 56 + + + diff --git a/source/exercice56/daemon.py b/source/exercice56/daemon.py new file mode 100644 index 0000000..614a33a --- /dev/null +++ b/source/exercice56/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala56 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice56/daemon.py.old b/source/exercice56/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice56/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice56/requirements.txt b/source/exercice56/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice56/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice56/setup.py b/source/exercice56/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice56/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice56/shell.nix b/source/exercice56/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice56/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice57.rst b/source/exercice57.rst new file mode 100644 index 0000000..12f0cd2 --- /dev/null +++ b/source/exercice57.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 57. + +.. easypython:: ./exercice57 + :language: DémonPython + :titre: Exercice Stupide 57 + + + diff --git a/source/exercice57/daemon.py b/source/exercice57/daemon.py new file mode 100644 index 0000000..b59d41e --- /dev/null +++ b/source/exercice57/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala57 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice57/daemon.py.old b/source/exercice57/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice57/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice57/requirements.txt b/source/exercice57/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice57/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice57/setup.py b/source/exercice57/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice57/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice57/shell.nix b/source/exercice57/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice57/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice58.rst b/source/exercice58.rst new file mode 100644 index 0000000..12a6ac6 --- /dev/null +++ b/source/exercice58.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 58. + +.. easypython:: ./exercice58 + :language: DémonPython + :titre: Exercice Stupide 58 + + + diff --git a/source/exercice58/daemon.py b/source/exercice58/daemon.py new file mode 100644 index 0000000..527f290 --- /dev/null +++ b/source/exercice58/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala58 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice58/daemon.py.old b/source/exercice58/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice58/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice58/requirements.txt b/source/exercice58/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice58/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice58/setup.py b/source/exercice58/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice58/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice58/shell.nix b/source/exercice58/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice58/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice59.rst b/source/exercice59.rst new file mode 100644 index 0000000..2333e57 --- /dev/null +++ b/source/exercice59.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 59. + +.. easypython:: ./exercice59 + :language: DémonPython + :titre: Exercice Stupide 59 + + + diff --git a/source/exercice59/daemon.py b/source/exercice59/daemon.py new file mode 100644 index 0000000..17bb7c4 --- /dev/null +++ b/source/exercice59/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala59 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice59/daemon.py.old b/source/exercice59/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice59/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice59/requirements.txt b/source/exercice59/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice59/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice59/setup.py b/source/exercice59/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice59/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice59/shell.nix b/source/exercice59/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice59/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice6.rst b/source/exercice6.rst new file mode 100644 index 0000000..ca37e06 --- /dev/null +++ b/source/exercice6.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 6. + +.. easypython:: ./exercice6 + :language: DémonPython + :titre: Exercice Stupide 6 + + + diff --git a/source/exercice6/daemon.py b/source/exercice6/daemon.py new file mode 100644 index 0000000..428fff0 --- /dev/null +++ b/source/exercice6/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala6 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice6/daemon.py.old b/source/exercice6/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice6/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice6/requirements.txt b/source/exercice6/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice6/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice6/setup.py b/source/exercice6/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice6/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice6/shell.nix b/source/exercice6/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice6/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice60.rst b/source/exercice60.rst new file mode 100644 index 0000000..94bbc3e --- /dev/null +++ b/source/exercice60.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 60. + +.. easypython:: ./exercice60 + :language: DémonPython + :titre: Exercice Stupide 60 + + + diff --git a/source/exercice60/daemon.py b/source/exercice60/daemon.py new file mode 100644 index 0000000..de27210 --- /dev/null +++ b/source/exercice60/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala60 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice60/daemon.py.old b/source/exercice60/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice60/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice60/requirements.txt b/source/exercice60/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice60/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice60/setup.py b/source/exercice60/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice60/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice60/shell.nix b/source/exercice60/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice60/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice61.rst b/source/exercice61.rst new file mode 100644 index 0000000..0b89fcd --- /dev/null +++ b/source/exercice61.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 61. + +.. easypython:: ./exercice61 + :language: DémonPython + :titre: Exercice Stupide 61 + + + diff --git a/source/exercice61/daemon.py b/source/exercice61/daemon.py new file mode 100644 index 0000000..57eb77c --- /dev/null +++ b/source/exercice61/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala61 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice61/daemon.py.old b/source/exercice61/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice61/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice61/requirements.txt b/source/exercice61/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice61/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice61/setup.py b/source/exercice61/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice61/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice61/shell.nix b/source/exercice61/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice61/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice62.rst b/source/exercice62.rst new file mode 100644 index 0000000..16bbbce --- /dev/null +++ b/source/exercice62.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 62. + +.. easypython:: ./exercice62 + :language: DémonPython + :titre: Exercice Stupide 62 + + + diff --git a/source/exercice62/daemon.py b/source/exercice62/daemon.py new file mode 100644 index 0000000..8056605 --- /dev/null +++ b/source/exercice62/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala62 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice62/daemon.py.old b/source/exercice62/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice62/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice62/requirements.txt b/source/exercice62/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice62/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice62/setup.py b/source/exercice62/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice62/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice62/shell.nix b/source/exercice62/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice62/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice63.rst b/source/exercice63.rst new file mode 100644 index 0000000..d3f0ecc --- /dev/null +++ b/source/exercice63.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 63. + +.. easypython:: ./exercice63 + :language: DémonPython + :titre: Exercice Stupide 63 + + + diff --git a/source/exercice63/daemon.py b/source/exercice63/daemon.py new file mode 100644 index 0000000..855f89b --- /dev/null +++ b/source/exercice63/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala63 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice63/daemon.py.old b/source/exercice63/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice63/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice63/requirements.txt b/source/exercice63/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice63/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice63/setup.py b/source/exercice63/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice63/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice63/shell.nix b/source/exercice63/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice63/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice64.rst b/source/exercice64.rst new file mode 100644 index 0000000..916b385 --- /dev/null +++ b/source/exercice64.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 64. + +.. easypython:: ./exercice64 + :language: DémonPython + :titre: Exercice Stupide 64 + + + diff --git a/source/exercice64/daemon.py b/source/exercice64/daemon.py new file mode 100644 index 0000000..6ebc16f --- /dev/null +++ b/source/exercice64/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala64 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice64/daemon.py.old b/source/exercice64/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice64/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice64/requirements.txt b/source/exercice64/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice64/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice64/setup.py b/source/exercice64/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice64/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice64/shell.nix b/source/exercice64/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice64/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice65.rst b/source/exercice65.rst new file mode 100644 index 0000000..3f0a7b9 --- /dev/null +++ b/source/exercice65.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 65. + +.. easypython:: ./exercice65 + :language: DémonPython + :titre: Exercice Stupide 65 + + + diff --git a/source/exercice65/daemon.py b/source/exercice65/daemon.py new file mode 100644 index 0000000..0e50d12 --- /dev/null +++ b/source/exercice65/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala65 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice65/daemon.py.old b/source/exercice65/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice65/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice65/requirements.txt b/source/exercice65/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice65/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice65/setup.py b/source/exercice65/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice65/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice65/shell.nix b/source/exercice65/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice65/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice66.rst b/source/exercice66.rst new file mode 100644 index 0000000..9f1e1c1 --- /dev/null +++ b/source/exercice66.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 66. + +.. easypython:: ./exercice66 + :language: DémonPython + :titre: Exercice Stupide 66 + + + diff --git a/source/exercice66/daemon.py b/source/exercice66/daemon.py new file mode 100644 index 0000000..2e0ed96 --- /dev/null +++ b/source/exercice66/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala66 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice66/daemon.py.old b/source/exercice66/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice66/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice66/requirements.txt b/source/exercice66/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice66/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice66/setup.py b/source/exercice66/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice66/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice66/shell.nix b/source/exercice66/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice66/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice67.rst b/source/exercice67.rst new file mode 100644 index 0000000..cdf4e7e --- /dev/null +++ b/source/exercice67.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 67. + +.. easypython:: ./exercice67 + :language: DémonPython + :titre: Exercice Stupide 67 + + + diff --git a/source/exercice67/daemon.py b/source/exercice67/daemon.py new file mode 100644 index 0000000..800fd40 --- /dev/null +++ b/source/exercice67/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala67 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice67/daemon.py.old b/source/exercice67/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice67/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice67/requirements.txt b/source/exercice67/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice67/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice67/setup.py b/source/exercice67/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice67/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice67/shell.nix b/source/exercice67/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice67/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice68.rst b/source/exercice68.rst new file mode 100644 index 0000000..6c4db7d --- /dev/null +++ b/source/exercice68.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 68. + +.. easypython:: ./exercice68 + :language: DémonPython + :titre: Exercice Stupide 68 + + + diff --git a/source/exercice68/daemon.py b/source/exercice68/daemon.py new file mode 100644 index 0000000..efa552c --- /dev/null +++ b/source/exercice68/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala68 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice68/daemon.py.old b/source/exercice68/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice68/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice68/requirements.txt b/source/exercice68/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice68/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice68/setup.py b/source/exercice68/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice68/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice68/shell.nix b/source/exercice68/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice68/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice69.rst b/source/exercice69.rst new file mode 100644 index 0000000..c2a4fcb --- /dev/null +++ b/source/exercice69.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 69. + +.. easypython:: ./exercice69 + :language: DémonPython + :titre: Exercice Stupide 69 + + + diff --git a/source/exercice69/daemon.py b/source/exercice69/daemon.py new file mode 100644 index 0000000..980e472 --- /dev/null +++ b/source/exercice69/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala69 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice69/daemon.py.old b/source/exercice69/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice69/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice69/requirements.txt b/source/exercice69/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice69/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice69/setup.py b/source/exercice69/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice69/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice69/shell.nix b/source/exercice69/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice69/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice7.rst b/source/exercice7.rst new file mode 100644 index 0000000..5694439 --- /dev/null +++ b/source/exercice7.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 7. + +.. easypython:: ./exercice7 + :language: DémonPython + :titre: Exercice Stupide 7 + + + diff --git a/source/exercice7/daemon.py b/source/exercice7/daemon.py new file mode 100644 index 0000000..1f8373a --- /dev/null +++ b/source/exercice7/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala7 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice7/daemon.py.old b/source/exercice7/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice7/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice7/requirements.txt b/source/exercice7/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice7/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice7/setup.py b/source/exercice7/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice7/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice7/shell.nix b/source/exercice7/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice7/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice70.rst b/source/exercice70.rst new file mode 100644 index 0000000..14650ea --- /dev/null +++ b/source/exercice70.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 70. + +.. easypython:: ./exercice70 + :language: DémonPython + :titre: Exercice Stupide 70 + + + diff --git a/source/exercice70/daemon.py b/source/exercice70/daemon.py new file mode 100644 index 0000000..cac73e6 --- /dev/null +++ b/source/exercice70/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala70 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice70/daemon.py.old b/source/exercice70/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice70/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice70/requirements.txt b/source/exercice70/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice70/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice70/setup.py b/source/exercice70/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice70/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice70/shell.nix b/source/exercice70/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice70/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice71.rst b/source/exercice71.rst new file mode 100644 index 0000000..02202fd --- /dev/null +++ b/source/exercice71.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 71. + +.. easypython:: ./exercice71 + :language: DémonPython + :titre: Exercice Stupide 71 + + + diff --git a/source/exercice71/daemon.py b/source/exercice71/daemon.py new file mode 100644 index 0000000..a7b01b6 --- /dev/null +++ b/source/exercice71/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala71 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice71/daemon.py.old b/source/exercice71/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice71/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice71/requirements.txt b/source/exercice71/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice71/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice71/setup.py b/source/exercice71/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice71/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice71/shell.nix b/source/exercice71/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice71/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice72.rst b/source/exercice72.rst new file mode 100644 index 0000000..765eeb7 --- /dev/null +++ b/source/exercice72.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 72. + +.. easypython:: ./exercice72 + :language: DémonPython + :titre: Exercice Stupide 72 + + + diff --git a/source/exercice72/daemon.py b/source/exercice72/daemon.py new file mode 100644 index 0000000..aa5ec46 --- /dev/null +++ b/source/exercice72/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala72 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice72/daemon.py.old b/source/exercice72/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice72/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice72/requirements.txt b/source/exercice72/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice72/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice72/setup.py b/source/exercice72/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice72/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice72/shell.nix b/source/exercice72/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice72/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice73.rst b/source/exercice73.rst new file mode 100644 index 0000000..0debe30 --- /dev/null +++ b/source/exercice73.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 73. + +.. easypython:: ./exercice73 + :language: DémonPython + :titre: Exercice Stupide 73 + + + diff --git a/source/exercice73/daemon.py b/source/exercice73/daemon.py new file mode 100644 index 0000000..2ac991d --- /dev/null +++ b/source/exercice73/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala73 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice73/daemon.py.old b/source/exercice73/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice73/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice73/requirements.txt b/source/exercice73/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice73/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice73/setup.py b/source/exercice73/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice73/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice73/shell.nix b/source/exercice73/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice73/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice74.rst b/source/exercice74.rst new file mode 100644 index 0000000..7a37326 --- /dev/null +++ b/source/exercice74.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 74. + +.. easypython:: ./exercice74 + :language: DémonPython + :titre: Exercice Stupide 74 + + + diff --git a/source/exercice74/daemon.py b/source/exercice74/daemon.py new file mode 100644 index 0000000..056470d --- /dev/null +++ b/source/exercice74/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala74 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice74/daemon.py.old b/source/exercice74/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice74/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice74/requirements.txt b/source/exercice74/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice74/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice74/setup.py b/source/exercice74/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice74/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice74/shell.nix b/source/exercice74/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice74/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice75.rst b/source/exercice75.rst new file mode 100644 index 0000000..d3bf7b0 --- /dev/null +++ b/source/exercice75.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 75. + +.. easypython:: ./exercice75 + :language: DémonPython + :titre: Exercice Stupide 75 + + + diff --git a/source/exercice75/daemon.py b/source/exercice75/daemon.py new file mode 100644 index 0000000..1052f3a --- /dev/null +++ b/source/exercice75/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala75 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice75/daemon.py.old b/source/exercice75/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice75/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice75/requirements.txt b/source/exercice75/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice75/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice75/setup.py b/source/exercice75/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice75/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice75/shell.nix b/source/exercice75/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice75/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice76.rst b/source/exercice76.rst new file mode 100644 index 0000000..8c35b0f --- /dev/null +++ b/source/exercice76.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 76. + +.. easypython:: ./exercice76 + :language: DémonPython + :titre: Exercice Stupide 76 + + + diff --git a/source/exercice76/daemon.py b/source/exercice76/daemon.py new file mode 100644 index 0000000..0ca9e42 --- /dev/null +++ b/source/exercice76/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala76 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice76/daemon.py.old b/source/exercice76/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice76/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice76/requirements.txt b/source/exercice76/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice76/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice76/setup.py b/source/exercice76/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice76/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice76/shell.nix b/source/exercice76/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice76/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice77.rst b/source/exercice77.rst new file mode 100644 index 0000000..11c649b --- /dev/null +++ b/source/exercice77.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 77. + +.. easypython:: ./exercice77 + :language: DémonPython + :titre: Exercice Stupide 77 + + + diff --git a/source/exercice77/daemon.py b/source/exercice77/daemon.py new file mode 100644 index 0000000..b77b975 --- /dev/null +++ b/source/exercice77/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala77 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice77/daemon.py.old b/source/exercice77/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice77/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice77/requirements.txt b/source/exercice77/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice77/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice77/setup.py b/source/exercice77/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice77/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice77/shell.nix b/source/exercice77/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice77/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice78.rst b/source/exercice78.rst new file mode 100644 index 0000000..fc203af --- /dev/null +++ b/source/exercice78.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 78. + +.. easypython:: ./exercice78 + :language: DémonPython + :titre: Exercice Stupide 78 + + + diff --git a/source/exercice78/daemon.py b/source/exercice78/daemon.py new file mode 100644 index 0000000..6b106b1 --- /dev/null +++ b/source/exercice78/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala78 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice78/daemon.py.old b/source/exercice78/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice78/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice78/requirements.txt b/source/exercice78/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice78/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice78/setup.py b/source/exercice78/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice78/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice78/shell.nix b/source/exercice78/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice78/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice79.rst b/source/exercice79.rst new file mode 100644 index 0000000..a93b14f --- /dev/null +++ b/source/exercice79.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 79. + +.. easypython:: ./exercice79 + :language: DémonPython + :titre: Exercice Stupide 79 + + + diff --git a/source/exercice79/daemon.py b/source/exercice79/daemon.py new file mode 100644 index 0000000..7b49a56 --- /dev/null +++ b/source/exercice79/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala79 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice79/daemon.py.old b/source/exercice79/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice79/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice79/requirements.txt b/source/exercice79/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice79/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice79/setup.py b/source/exercice79/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice79/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice79/shell.nix b/source/exercice79/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice79/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice8.rst b/source/exercice8.rst new file mode 100644 index 0000000..e0e037a --- /dev/null +++ b/source/exercice8.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 8. + +.. easypython:: ./exercice8 + :language: DémonPython + :titre: Exercice Stupide 8 + + + diff --git a/source/exercice8/daemon.py b/source/exercice8/daemon.py new file mode 100644 index 0000000..15f3b9e --- /dev/null +++ b/source/exercice8/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala8 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice8/daemon.py.old b/source/exercice8/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice8/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice8/requirements.txt b/source/exercice8/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice8/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice8/setup.py b/source/exercice8/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice8/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice8/shell.nix b/source/exercice8/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice8/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice80.rst b/source/exercice80.rst new file mode 100644 index 0000000..a6235a7 --- /dev/null +++ b/source/exercice80.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 80. + +.. easypython:: ./exercice80 + :language: DémonPython + :titre: Exercice Stupide 80 + + + diff --git a/source/exercice80/daemon.py b/source/exercice80/daemon.py new file mode 100644 index 0000000..b5e911c --- /dev/null +++ b/source/exercice80/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala80 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice80/daemon.py.old b/source/exercice80/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice80/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice80/requirements.txt b/source/exercice80/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice80/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice80/setup.py b/source/exercice80/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice80/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice80/shell.nix b/source/exercice80/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice80/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice81.rst b/source/exercice81.rst new file mode 100644 index 0000000..60cb758 --- /dev/null +++ b/source/exercice81.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 81. + +.. easypython:: ./exercice81 + :language: DémonPython + :titre: Exercice Stupide 81 + + + diff --git a/source/exercice81/daemon.py b/source/exercice81/daemon.py new file mode 100644 index 0000000..a3af4f9 --- /dev/null +++ b/source/exercice81/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala81 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice81/daemon.py.old b/source/exercice81/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice81/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice81/requirements.txt b/source/exercice81/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice81/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice81/setup.py b/source/exercice81/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice81/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice81/shell.nix b/source/exercice81/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice81/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice82.rst b/source/exercice82.rst new file mode 100644 index 0000000..2143cfe --- /dev/null +++ b/source/exercice82.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 82. + +.. easypython:: ./exercice82 + :language: DémonPython + :titre: Exercice Stupide 82 + + + diff --git a/source/exercice82/daemon.py b/source/exercice82/daemon.py new file mode 100644 index 0000000..f687aa4 --- /dev/null +++ b/source/exercice82/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala82 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice82/daemon.py.old b/source/exercice82/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice82/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice82/requirements.txt b/source/exercice82/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice82/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice82/setup.py b/source/exercice82/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice82/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice82/shell.nix b/source/exercice82/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice82/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice83.rst b/source/exercice83.rst new file mode 100644 index 0000000..90d0096 --- /dev/null +++ b/source/exercice83.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 83. + +.. easypython:: ./exercice83 + :language: DémonPython + :titre: Exercice Stupide 83 + + + diff --git a/source/exercice83/daemon.py b/source/exercice83/daemon.py new file mode 100644 index 0000000..18c09c1 --- /dev/null +++ b/source/exercice83/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala83 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice83/daemon.py.old b/source/exercice83/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice83/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice83/requirements.txt b/source/exercice83/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice83/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice83/setup.py b/source/exercice83/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice83/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice83/shell.nix b/source/exercice83/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice83/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice84.rst b/source/exercice84.rst new file mode 100644 index 0000000..2188bf8 --- /dev/null +++ b/source/exercice84.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 84. + +.. easypython:: ./exercice84 + :language: DémonPython + :titre: Exercice Stupide 84 + + + diff --git a/source/exercice84/daemon.py b/source/exercice84/daemon.py new file mode 100644 index 0000000..21212ba --- /dev/null +++ b/source/exercice84/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala84 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice84/daemon.py.old b/source/exercice84/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice84/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice84/requirements.txt b/source/exercice84/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice84/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice84/setup.py b/source/exercice84/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice84/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice84/shell.nix b/source/exercice84/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice84/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice85.rst b/source/exercice85.rst new file mode 100644 index 0000000..69be0ef --- /dev/null +++ b/source/exercice85.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 85. + +.. easypython:: ./exercice85 + :language: DémonPython + :titre: Exercice Stupide 85 + + + diff --git a/source/exercice85/daemon.py b/source/exercice85/daemon.py new file mode 100644 index 0000000..82612f2 --- /dev/null +++ b/source/exercice85/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala85 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice85/daemon.py.old b/source/exercice85/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice85/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice85/requirements.txt b/source/exercice85/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice85/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice85/setup.py b/source/exercice85/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice85/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice85/shell.nix b/source/exercice85/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice85/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice86.rst b/source/exercice86.rst new file mode 100644 index 0000000..e21d7a9 --- /dev/null +++ b/source/exercice86.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 86. + +.. easypython:: ./exercice86 + :language: DémonPython + :titre: Exercice Stupide 86 + + + diff --git a/source/exercice86/daemon.py b/source/exercice86/daemon.py new file mode 100644 index 0000000..b381e0a --- /dev/null +++ b/source/exercice86/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala86 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice86/daemon.py.old b/source/exercice86/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice86/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice86/requirements.txt b/source/exercice86/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice86/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice86/setup.py b/source/exercice86/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice86/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice86/shell.nix b/source/exercice86/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice86/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice87.rst b/source/exercice87.rst new file mode 100644 index 0000000..4c11678 --- /dev/null +++ b/source/exercice87.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 87. + +.. easypython:: ./exercice87 + :language: DémonPython + :titre: Exercice Stupide 87 + + + diff --git a/source/exercice87/daemon.py b/source/exercice87/daemon.py new file mode 100644 index 0000000..df2a735 --- /dev/null +++ b/source/exercice87/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala87 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice87/daemon.py.old b/source/exercice87/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice87/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice87/requirements.txt b/source/exercice87/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice87/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice87/setup.py b/source/exercice87/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice87/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice87/shell.nix b/source/exercice87/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice87/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice88.rst b/source/exercice88.rst new file mode 100644 index 0000000..cae23d9 --- /dev/null +++ b/source/exercice88.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 88. + +.. easypython:: ./exercice88 + :language: DémonPython + :titre: Exercice Stupide 88 + + + diff --git a/source/exercice88/daemon.py b/source/exercice88/daemon.py new file mode 100644 index 0000000..7310c16 --- /dev/null +++ b/source/exercice88/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala88 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice88/daemon.py.old b/source/exercice88/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice88/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice88/requirements.txt b/source/exercice88/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice88/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice88/setup.py b/source/exercice88/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice88/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice88/shell.nix b/source/exercice88/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice88/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice89.rst b/source/exercice89.rst new file mode 100644 index 0000000..ae22b53 --- /dev/null +++ b/source/exercice89.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 89. + +.. easypython:: ./exercice89 + :language: DémonPython + :titre: Exercice Stupide 89 + + + diff --git a/source/exercice89/daemon.py b/source/exercice89/daemon.py new file mode 100644 index 0000000..f5f4354 --- /dev/null +++ b/source/exercice89/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala89 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice89/daemon.py.old b/source/exercice89/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice89/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice89/requirements.txt b/source/exercice89/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice89/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice89/setup.py b/source/exercice89/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice89/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice89/shell.nix b/source/exercice89/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice89/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice9.rst b/source/exercice9.rst new file mode 100644 index 0000000..e03288a --- /dev/null +++ b/source/exercice9.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 9. + +.. easypython:: ./exercice9 + :language: DémonPython + :titre: Exercice Stupide 9 + + + diff --git a/source/exercice9/daemon.py b/source/exercice9/daemon.py new file mode 100644 index 0000000..90c98fe --- /dev/null +++ b/source/exercice9/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala9 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice9/daemon.py.old b/source/exercice9/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice9/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice9/requirements.txt b/source/exercice9/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice9/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice9/setup.py b/source/exercice9/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice9/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice9/shell.nix b/source/exercice9/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice9/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice90.rst b/source/exercice90.rst new file mode 100644 index 0000000..fde1c35 --- /dev/null +++ b/source/exercice90.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 90. + +.. easypython:: ./exercice90 + :language: DémonPython + :titre: Exercice Stupide 90 + + + diff --git a/source/exercice90/daemon.py b/source/exercice90/daemon.py new file mode 100644 index 0000000..b77d9f2 --- /dev/null +++ b/source/exercice90/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala90 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice90/daemon.py.old b/source/exercice90/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice90/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice90/requirements.txt b/source/exercice90/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice90/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice90/setup.py b/source/exercice90/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice90/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice90/shell.nix b/source/exercice90/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice90/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice91.rst b/source/exercice91.rst new file mode 100644 index 0000000..950eb14 --- /dev/null +++ b/source/exercice91.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 91. + +.. easypython:: ./exercice91 + :language: DémonPython + :titre: Exercice Stupide 91 + + + diff --git a/source/exercice91/daemon.py b/source/exercice91/daemon.py new file mode 100644 index 0000000..dad5bfa --- /dev/null +++ b/source/exercice91/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala91 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice91/daemon.py.old b/source/exercice91/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice91/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice91/requirements.txt b/source/exercice91/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice91/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice91/setup.py b/source/exercice91/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice91/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice91/shell.nix b/source/exercice91/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice91/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice92.rst b/source/exercice92.rst new file mode 100644 index 0000000..41b0c46 --- /dev/null +++ b/source/exercice92.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 92. + +.. easypython:: ./exercice92 + :language: DémonPython + :titre: Exercice Stupide 92 + + + diff --git a/source/exercice92/daemon.py b/source/exercice92/daemon.py new file mode 100644 index 0000000..b48ac38 --- /dev/null +++ b/source/exercice92/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala92 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice92/daemon.py.old b/source/exercice92/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice92/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice92/requirements.txt b/source/exercice92/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice92/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice92/setup.py b/source/exercice92/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice92/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice92/shell.nix b/source/exercice92/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice92/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice93.rst b/source/exercice93.rst new file mode 100644 index 0000000..9c5d310 --- /dev/null +++ b/source/exercice93.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 93. + +.. easypython:: ./exercice93 + :language: DémonPython + :titre: Exercice Stupide 93 + + + diff --git a/source/exercice93/daemon.py b/source/exercice93/daemon.py new file mode 100644 index 0000000..aa4a1a4 --- /dev/null +++ b/source/exercice93/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala93 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice93/daemon.py.old b/source/exercice93/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice93/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice93/requirements.txt b/source/exercice93/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice93/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice93/setup.py b/source/exercice93/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice93/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice93/shell.nix b/source/exercice93/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice93/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice94.rst b/source/exercice94.rst new file mode 100644 index 0000000..da53ed5 --- /dev/null +++ b/source/exercice94.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 94. + +.. easypython:: ./exercice94 + :language: DémonPython + :titre: Exercice Stupide 94 + + + diff --git a/source/exercice94/daemon.py b/source/exercice94/daemon.py new file mode 100644 index 0000000..2a3f3a7 --- /dev/null +++ b/source/exercice94/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala94 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice94/daemon.py.old b/source/exercice94/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice94/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice94/requirements.txt b/source/exercice94/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice94/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice94/setup.py b/source/exercice94/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice94/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice94/shell.nix b/source/exercice94/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice94/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice95.rst b/source/exercice95.rst new file mode 100644 index 0000000..8bbbf02 --- /dev/null +++ b/source/exercice95.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 95. + +.. easypython:: ./exercice95 + :language: DémonPython + :titre: Exercice Stupide 95 + + + diff --git a/source/exercice95/daemon.py b/source/exercice95/daemon.py new file mode 100644 index 0000000..4dc94f9 --- /dev/null +++ b/source/exercice95/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala95 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice95/daemon.py.old b/source/exercice95/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice95/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice95/requirements.txt b/source/exercice95/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice95/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice95/setup.py b/source/exercice95/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice95/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice95/shell.nix b/source/exercice95/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice95/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice96.rst b/source/exercice96.rst new file mode 100644 index 0000000..7c77d16 --- /dev/null +++ b/source/exercice96.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 96. + +.. easypython:: ./exercice96 + :language: DémonPython + :titre: Exercice Stupide 96 + + + diff --git a/source/exercice96/daemon.py b/source/exercice96/daemon.py new file mode 100644 index 0000000..0b8a10c --- /dev/null +++ b/source/exercice96/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala96 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice96/daemon.py.old b/source/exercice96/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice96/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice96/requirements.txt b/source/exercice96/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice96/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice96/setup.py b/source/exercice96/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice96/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice96/shell.nix b/source/exercice96/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice96/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice97.rst b/source/exercice97.rst new file mode 100644 index 0000000..244dbc2 --- /dev/null +++ b/source/exercice97.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 97. + +.. easypython:: ./exercice97 + :language: DémonPython + :titre: Exercice Stupide 97 + + + diff --git a/source/exercice97/daemon.py b/source/exercice97/daemon.py new file mode 100644 index 0000000..97d5020 --- /dev/null +++ b/source/exercice97/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala97 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice97/daemon.py.old b/source/exercice97/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice97/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice97/requirements.txt b/source/exercice97/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice97/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice97/setup.py b/source/exercice97/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice97/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice97/shell.nix b/source/exercice97/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice97/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice98.rst b/source/exercice98.rst new file mode 100644 index 0000000..bb5074d --- /dev/null +++ b/source/exercice98.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 98. + +.. easypython:: ./exercice98 + :language: DémonPython + :titre: Exercice Stupide 98 + + + diff --git a/source/exercice98/daemon.py b/source/exercice98/daemon.py new file mode 100644 index 0000000..13ce7e4 --- /dev/null +++ b/source/exercice98/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala98 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice98/daemon.py.old b/source/exercice98/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice98/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice98/requirements.txt b/source/exercice98/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice98/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice98/setup.py b/source/exercice98/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice98/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice98/shell.nix b/source/exercice98/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice98/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/exercice99.rst b/source/exercice99.rst new file mode 100644 index 0000000..948791c --- /dev/null +++ b/source/exercice99.rst @@ -0,0 +1,11 @@ +Echauffement +------------ + +Exercice stupide numéro 99. + +.. easypython:: ./exercice99 + :language: DémonPython + :titre: Exercice Stupide 99 + + + diff --git a/source/exercice99/daemon.py b/source/exercice99/daemon.py new file mode 100644 index 0000000..6fbec15 --- /dev/null +++ b/source/exercice99/daemon.py @@ -0,0 +1,77 @@ +#!/usr/bin/env python +from flask import Flask, request, jsonify +from waitress import serve +import os + +def handle(event, context): + return { + "statusCode": 200, + "body": { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement tralala99 que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + } + +app = Flask(__name__) + +class Event: + def __init__(self): + self.body = request.get_data() + self.headers = request.headers + self.method = request.method + self.query = request.args + self.path = request.path + +class Context: + def __init__(self): + self.hostname = os.getenv('HOSTNAME', 'localhost') + +def format_status_code(resp): + if 'statusCode' in resp: + return resp['statusCode'] + + return 200 + +def format_body(resp): + if 'body' not in resp: + return "" + elif type(resp['body']) == dict: + return jsonify(resp['body']) + else: + return str(resp['body']) + +def format_headers(resp): + if 'headers' not in resp: + return [] + elif type(resp['headers']) == dict: + headers = [] + for key in resp['headers'].keys(): + header_tuple = (key, resp['headers'][key]) + headers.append(header_tuple) + return headers + + return resp['headers'] + +def format_response(resp): + if resp == None: + return ('', 200) + + statusCode = format_status_code(resp) + body = format_body(resp) + headers = format_headers(resp) + + return (body, statusCode, headers) + +@app.route('/', defaults={'path': ''}, methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +@app.route('/', methods=['GET', 'PUT', 'POST', 'PATCH', 'DELETE']) +def call_handler(path): + event = Event() + context = Context() + response_data = handle(event, context) + + resp = format_response(response_data) + return resp + +if __name__ == '__main__': + serve(app, port=8082) diff --git a/source/exercice99/daemon.py.old b/source/exercice99/daemon.py.old new file mode 100644 index 0000000..e0cab31 --- /dev/null +++ b/source/exercice99/daemon.py.old @@ -0,0 +1,52 @@ +#!/usr/bin/env python3 +""" +Un serveur pour répondre à une tentative étudiante +On est content quoi qu'on nous propose… +""" + +import cbor +import sys +import json +import signal +from http.server import BaseHTTPRequestHandler +import socketserver + + +def résultat(code_etu): + return { + "_valide": True, + "_messages": ["T'es un·e champion·ne", "C'est exactement '" + str(code_etu) + "' que j'attendais"], + 'feedbacks_html': "
\n

Exercice réussi!

\n
    \n
  • T'es un·e champion·ne
  • \n
  • C'est exactement 'b'coucou'' que j'attendais
  • \n
\n
\n" + } + + +class Handler(BaseHTTPRequestHandler): + + def do_POST(self): + mesg=b"" + while True: + line = self.rfile.readline().strip() + chunk_length = int(line, 16) + if chunk_length != 0: + chunk = self.rfile.read(chunk_length) + mesg+=chunk + self.rfile.readline() + else: + break + + + self.send_response(200) + self.end_headers() + dict_code_etu = cbor.loads(mesg) + code_etu = dict_code_etu["code_etu"] + print("reçu: ", code_etu) + self.wfile.write(json.dumps(résultat(code_etu)).encode() + b'\n') + self.wfile.flush() + +def sigterm_handler(_signo, _stack_frame): + exit(0) + +if __name__ == "__main__": + signal.signal(signal.SIGTERM, sigterm_handler) + with socketserver.TCPServer(("", 8082), Handler ) as httpd: + httpd.serve_forever() diff --git a/source/exercice99/requirements.txt b/source/exercice99/requirements.txt new file mode 100644 index 0000000..368d570 --- /dev/null +++ b/source/exercice99/requirements.txt @@ -0,0 +1,3 @@ +cbor +flask +waitress diff --git a/source/exercice99/setup.py b/source/exercice99/setup.py new file mode 100644 index 0000000..b28fc4e --- /dev/null +++ b/source/exercice99/setup.py @@ -0,0 +1,7 @@ +from setuptools import setup, find_packages +setup( + name="ToujoursContent", + version="0.1", + packages=find_packages(), + scripts=['daemon.py'] +) diff --git a/source/exercice99/shell.nix b/source/exercice99/shell.nix new file mode 100644 index 0000000..fa90299 --- /dev/null +++ b/source/exercice99/shell.nix @@ -0,0 +1,3 @@ +with (import {}); + +(python3.withPackages (ps: [ps.flask ps.waitress ps.pip])).env diff --git a/source/index.rst b/source/index.rst new file mode 100644 index 0000000..bee48aa --- /dev/null +++ b/source/index.rst @@ -0,0 +1,16 @@ +.. EasySphinx documentation master file, created by + sphinx-quickstart on Thu Oct 20 12:10:31 2016. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Bienvenue sur EasyPython +======================== + +Les sujets de TP: + +.. toctree:: + :maxdepth: 2 + :glob: + :caption: Cralala + + exercice*