From 0e8ada1eff8799437c9be1bc2af10d6198fa8cad Mon Sep 17 00:00:00 2001 From: jwansek Date: Tue, 29 Apr 2025 18:51:40 +0100 Subject: Added inline HTML into blogposts, refactored a bit --- Dockerfile | 4 +- app.py | 252 -------------- cache.py | 18 - database.py | 248 -------------- downloader.py | 54 --- edaweb/app.py | 256 +++++++++++++++ edaweb/cache.py | 18 + edaweb/database.py | 248 ++++++++++++++ edaweb/downloader.py | 54 +++ edaweb/parser.py | 209 ++++++++++++ edaweb/services.py | 365 +++++++++++++++++++++ edaweb/static/images/0don0t4ofuc41-3776935852.jpg | Bin 0 -> 131290 bytes edaweb/static/images/1544552064683.jpg | Bin 0 -> 171824 bytes edaweb/static/images/1549844950404.jpg | Bin 0 -> 112071 bytes edaweb/static/images/1555824429083.png | Bin 0 -> 170252 bytes edaweb/static/images/1555824491105.png | Bin 0 -> 177365 bytes edaweb/static/images/1671540582317176.png | Bin 0 -> 3276156 bytes edaweb/static/images/1urouter.jpg | Bin 0 -> 183429 bytes edaweb/static/images/20220401_222149.jpg | Bin 0 -> 38897 bytes .../324162a23865a6a7e75761871d29935314cbc2b3.jpg | Bin 0 -> 531668 bytes ...02e26d0181c684bc17b56188bde6e80569d191_full.jpg | Bin 0 -> 13920 bytes edaweb/static/images/5600x.jpg | Bin 0 -> 151209 bytes edaweb/static/images/9400t.jpg | Bin 0 -> 2603012 bytes edaweb/static/images/9400t_cooler.jpg | Bin 0 -> 4997396 bytes edaweb/static/images/E1NlPc1X0AEkB-s.png | Bin 0 -> 3029 bytes edaweb/static/images/E3xdm-hWYAEADNx.jpg | Bin 0 -> 13609 bytes edaweb/static/images/E4WhXAvWYAIFwEa.png | Bin 0 -> 10560 bytes edaweb/static/images/E4cjVaPXEAU83U0.png | Bin 0 -> 15418 bytes edaweb/static/images/E7ODIBeX0AAivRV.jpg | Bin 0 -> 75338 bytes edaweb/static/images/E7ODIZEWUAMQjty.jpg | Bin 0 -> 94889 bytes edaweb/static/images/E7ODIv0WUAUp-ad.jpg | Bin 0 -> 88028 bytes edaweb/static/images/E7ODJELX0AAVqna.jpg | Bin 0 -> 107275 bytes edaweb/static/images/EbmVCYKWkAAwXKW.jpg | Bin 0 -> 34657 bytes edaweb/static/images/Ffi1ducXEAArXDg.jpg | Bin 0 -> 18055 bytes edaweb/static/images/GGBDzuSXMAA1Ktk.jpg | Bin 0 -> 65355 bytes edaweb/static/images/GSxGe_rXQAAgEhj.jpg | Bin 0 -> 1443057 bytes edaweb/static/images/GTq-GOgWQAErvCp.jpg | Bin 0 -> 376374 bytes edaweb/static/images/GcyexeCW0AAYssz.jpg | Bin 0 -> 992976 bytes edaweb/static/images/IMG_-g4wqat.jpg | Bin 0 -> 82371 bytes edaweb/static/images/IMG_1602.jpg | Bin 0 -> 24762 bytes edaweb/static/images/IMG_1603.jpg | Bin 0 -> 26478 bytes edaweb/static/images/IMG_1604.jpg | Bin 0 -> 35792 bytes edaweb/static/images/IMG_1605.jpg | Bin 0 -> 33782 bytes edaweb/static/images/IMG_1606.jpg | Bin 0 -> 34771 bytes edaweb/static/images/IMG_1607.jpg | Bin 0 -> 39764 bytes edaweb/static/images/IMG_1609.jpg | Bin 0 -> 48287 bytes edaweb/static/images/IMG_1610.jpg | Bin 0 -> 41368 bytes edaweb/static/images/IMG_1611.jpg | Bin 0 -> 24732 bytes edaweb/static/images/IMG_1612.jpg | Bin 0 -> 26570 bytes edaweb/static/images/IMG_1613.png | Bin 0 -> 2339298 bytes edaweb/static/images/IMG_1614.png | Bin 0 -> 317510 bytes edaweb/static/images/IMG_1615.jpg | Bin 0 -> 27792 bytes edaweb/static/images/IMG_1616.jpg | Bin 0 -> 43497 bytes edaweb/static/images/IMG_1617.jpg | Bin 0 -> 11756 bytes edaweb/static/images/IMG_1618.jpg | Bin 0 -> 21924 bytes edaweb/static/images/IMG_1619.jpg | Bin 0 -> 10839 bytes edaweb/static/images/IMG_1620.jpg | Bin 0 -> 25630 bytes edaweb/static/images/IMG_1621.jpg | Bin 0 -> 246181 bytes edaweb/static/images/IMG_1622.jpg | Bin 0 -> 163205 bytes edaweb/static/images/IMG_1623.jpg | Bin 0 -> 65738 bytes edaweb/static/images/IMG_1624.png | Bin 0 -> 337723 bytes edaweb/static/images/IMG_1625.jpg | Bin 0 -> 31273 bytes edaweb/static/images/IMG_1626.jpg | Bin 0 -> 28916 bytes edaweb/static/images/IMG_1627.jpg | Bin 0 -> 33325 bytes edaweb/static/images/IMG_1628.jpg | Bin 0 -> 21475 bytes edaweb/static/images/IMG_1629.jpg | Bin 0 -> 13153 bytes edaweb/static/images/IMG_1630.jpg | Bin 0 -> 33638 bytes edaweb/static/images/IMG_1632.jpg | Bin 0 -> 52252 bytes edaweb/static/images/IMG_1633.jpg | Bin 0 -> 32028 bytes edaweb/static/images/IMG_1636.jpg | Bin 0 -> 45916 bytes edaweb/static/images/IMG_1637.jpg | Bin 0 -> 13999 bytes edaweb/static/images/IMG_1638.jpg | Bin 0 -> 79337 bytes edaweb/static/images/IMG_1639.jpg | Bin 0 -> 130710 bytes edaweb/static/images/IMG_1640.jpg | Bin 0 -> 77986 bytes edaweb/static/images/IMG_1641.jpg | Bin 0 -> 41247 bytes edaweb/static/images/IMG_20210422_212009.jpg | Bin 0 -> 2976182 bytes edaweb/static/images/IMG_20210824_175000.jpg | Bin 0 -> 3292970 bytes .../static/images/IMG_20220809_172130442_HDR.jpg | Bin 0 -> 2715100 bytes .../static/images/IMG_20220811_133224877_HDR.jpg | Bin 0 -> 3336994 bytes .../images/IMG_20220811_133224877_HDR_crop.jpg | Bin 0 -> 2168764 bytes .../static/images/IMG_20220812_112838125_HDR.jpg | Bin 0 -> 3440299 bytes .../static/images/IMG_20220823_154457137_HDR.jpg | Bin 0 -> 3971263 bytes edaweb/static/images/IMG_20221023_163821542.jpg | Bin 0 -> 1461946 bytes .../static/images/IMG_20230812_132400733_HDR.jpg | Bin 0 -> 3044563 bytes .../static/images/IMG_20230812_132632784_HDR.jpg | Bin 0 -> 3452950 bytes edaweb/static/images/PXL_20250314_150055804.jpg | Bin 0 -> 1835356 bytes .../static/images/Screenshot_20210520-221830.png | Bin 0 -> 275641 bytes .../static/images/Screenshot_20210527_122432.png | Bin 0 -> 1683456 bytes .../static/images/Screenshot_20210620-144127.png | Bin 0 -> 142673 bytes .../static/images/Screenshot_20210620-231652.png | Bin 0 -> 133513 bytes .../static/images/Screenshot_20210727-072303.png | Bin 0 -> 138225 bytes .../static/images/Screenshot_20210727-072344.png | Bin 0 -> 129039 bytes .../static/images/Screenshot_20210727-223004.png | Bin 0 -> 136574 bytes .../static/images/Screenshot_20210731-181223.png | Bin 0 -> 359217 bytes .../static/images/Screenshot_20210731-181229.png | Bin 0 -> 152242 bytes .../static/images/Screenshot_20210811-125853.png | Bin 0 -> 129411 bytes .../static/images/Screenshot_20210818-203828.png | Bin 0 -> 112321 bytes .../static/images/Screenshot_20210825-131938.png | Bin 0 -> 120763 bytes edaweb/static/images/Startech.jpg | Bin 0 -> 456042 bytes edaweb/static/images/a4-5000.jpg | Bin 0 -> 6252 bytes edaweb/static/images/aaaaahh.jpg | Bin 0 -> 52325 bytes edaweb/static/images/anti_nft_b.png | Bin 0 -> 2311 bytes edaweb/static/images/arenas.jpg | Bin 0 -> 294229 bytes edaweb/static/images/basil.jpg | Bin 0 -> 6068 bytes edaweb/static/images/bigshark.png | Bin 0 -> 2355827 bytes edaweb/static/images/bob.gif | Bin 0 -> 142993 bytes edaweb/static/images/braindamage.png | Bin 0 -> 22441 bytes edaweb/static/images/catonlap.jpg | Bin 0 -> 68382 bytes edaweb/static/images/chuddy.jpg | Bin 0 -> 78447 bytes edaweb/static/images/cloudfree.png | Bin 0 -> 3080 bytes edaweb/static/images/embedded_img2.png | Bin 0 -> 8613 bytes edaweb/static/images/embedded_img3.png | Bin 0 -> 18291 bytes edaweb/static/images/embedded_img4.png | Bin 0 -> 16801 bytes edaweb/static/images/embedded_img5.PNG | Bin 0 -> 11374 bytes edaweb/static/images/face.jpg | Bin 0 -> 226207 bytes edaweb/static/images/first_server.jpg | Bin 0 -> 2700813 bytes edaweb/static/images/fstab.png | Bin 0 -> 88618 bytes edaweb/static/images/graduation.jpg | Bin 0 -> 290228 bytes edaweb/static/images/greenboi.jpg | Bin 0 -> 17079 bytes edaweb/static/images/hpkvm_puttyconf.png | Bin 0 -> 17830 bytes edaweb/static/images/hpkvm_serialconf.png | Bin 0 -> 13801 bytes edaweb/static/images/i5-1145G7.png | Bin 0 -> 118559 bytes edaweb/static/images/icons.png | Bin 0 -> 46132 bytes edaweb/static/images/ioporn.jpg | Bin 0 -> 51451 bytes edaweb/static/images/its_true_1.jpg | Bin 0 -> 71857 bytes edaweb/static/images/its_true_2.jpg | Bin 0 -> 109263 bytes edaweb/static/images/j1800.jpg | Bin 0 -> 1589479 bytes edaweb/static/images/j5040.jpg | Bin 0 -> 3220569 bytes edaweb/static/images/j5040_server.jpg | Bin 0 -> 2767061 bytes edaweb/static/images/kvm_1.png | Bin 0 -> 60072 bytes edaweb/static/images/kvm_2.png | Bin 0 -> 150115 bytes edaweb/static/images/lackrack1.jpg | Bin 0 -> 335971 bytes edaweb/static/images/lackrack2.jpg | Bin 0 -> 381379 bytes edaweb/static/images/libreboot.jpg | Bin 0 -> 1910228 bytes edaweb/static/images/liostore.png | Bin 0 -> 691184 bytes edaweb/static/images/media_E9lTIldWUAEeT63.jpg | Bin 0 -> 180897 bytes edaweb/static/images/media_FPus_2aXsAUhCu9.jpg | Bin 0 -> 480286 bytes edaweb/static/images/media_FRlRqYKXoAIw82O.jpg | Bin 0 -> 55076 bytes edaweb/static/images/media_FeP_m8FXEAAqcJs.jpg | Bin 0 -> 279374 bytes edaweb/static/images/media_FfcNNZ2WYAAz97v.jpg | Bin 0 -> 377136 bytes edaweb/static/images/media_FlBsMq2XwAATJX5.jpg | Bin 0 -> 885129 bytes edaweb/static/images/media_FlBsfDcWQAQhJdP.jpg | Bin 0 -> 660235 bytes edaweb/static/images/minecraft.png | Bin 0 -> 27516 bytes edaweb/static/images/new_switch_opened.jpg | Bin 0 -> 4348235 bytes edaweb/static/images/newdiscord.jpg | Bin 0 -> 56309 bytes edaweb/static/images/nicfan.jpg | Bin 0 -> 2593649 bytes edaweb/static/images/notstolenvalour4.png | Bin 0 -> 1752598 bytes edaweb/static/images/notstolenvalour5.png | Bin 0 -> 1703482 bytes edaweb/static/images/notstolenvalour8.png | Bin 0 -> 1706779 bytes edaweb/static/images/oldpic.png | Bin 0 -> 938082 bytes .../static/images/pfsenseswissvpnportforwards.png | Bin 0 -> 118254 bytes edaweb/static/images/photo_2022-12-07_14-06-03.jpg | Bin 0 -> 12097 bytes .../static/images/photo_5857106224099739202_y.jpg | Bin 0 -> 124721 bytes edaweb/static/images/powerani.gif | Bin 0 -> 7203 bytes ...profile_images_1598652418580963328_ENk7xKDw.jpg | Bin 0 -> 42497 bytes edaweb/static/images/rack1.jpg | Bin 0 -> 210052 bytes edaweb/static/images/rack2.jpg | Bin 0 -> 190057 bytes edaweb/static/images/router.jpg | Bin 0 -> 694385 bytes edaweb/static/images/russian_isp.png | Bin 0 -> 52664 bytes edaweb/static/images/russian_isp_abuse.png | Bin 0 -> 52880 bytes edaweb/static/images/russian_nginx_logs.jpg | Bin 0 -> 224155 bytes edaweb/static/images/russian_yt.jpg | Bin 0 -> 130618 bytes edaweb/static/images/s-l1600.jpg | Bin 0 -> 152914 bytes edaweb/static/images/s-l16001.jpg | Bin 0 -> 226604 bytes edaweb/static/images/s-l500.jpg | Bin 0 -> 31862 bytes ...le_ede336afca555579dd78f051e4a23feaa838716d.jpg | Bin 0 -> 185850 bytes edaweb/static/images/selfie.jpg | Bin 0 -> 73451 bytes edaweb/static/images/server.jpg | Bin 0 -> 2578909 bytes edaweb/static/images/server2.jpg | Bin 0 -> 2877532 bytes edaweb/static/images/shark1.jpg | Bin 0 -> 449065 bytes edaweb/static/images/shark2.jpg | Bin 0 -> 433903 bytes edaweb/static/images/shark3.jpg | Bin 0 -> 518122 bytes edaweb/static/images/shark3.png | Bin 0 -> 2944760 bytes .../static/images/shun-hashimoto-mio-chibana.gif | Bin 0 -> 1472535 bytes edaweb/static/images/sicp.jpg | Bin 0 -> 3664911 bytes edaweb/static/images/startech_rack_1.jpg | Bin 0 -> 3083071 bytes edaweb/static/images/startech_rack_2.jpg | Bin 0 -> 2093105 bytes edaweb/static/images/stolenvalour.jpg | Bin 0 -> 234621 bytes edaweb/static/images/sun.gif | Bin 0 -> 3097 bytes edaweb/static/images/switch.jpg | Bin 0 -> 90618 bytes edaweb/static/images/switches.jpg | Bin 0 -> 3169089 bytes edaweb/static/images/t30.jpg | Bin 0 -> 235413 bytes edaweb/static/images/techdome.jpg | Bin 0 -> 125311 bytes edaweb/static/images/telegrampic.jpg | Bin 0 -> 138371 bytes edaweb/static/images/telegrampic2.jpg | Bin 0 -> 25752 bytes edaweb/static/images/testimonials.PNG | Bin 0 -> 190391 bytes edaweb/static/images/theNVMEVault.png | Bin 0 -> 51977 bytes edaweb/static/images/twitterpic.jpg | Bin 0 -> 14667 bytes edaweb/static/images/vcss-blue.gif | Bin 0 -> 1759 bytes edaweb/static/images/www.gif | Bin 0 -> 1531 bytes edaweb/static/images/x200.jpg | Bin 0 -> 2732895 bytes edaweb/static/images/xeon.jpg | Bin 0 -> 571574 bytes edaweb/static/images/xeon_motherboard.jpg | Bin 0 -> 757343 bytes edaweb/static/index.md | 36 ++ edaweb/static/papers/aai.pdf | Bin 0 -> 311217 bytes edaweb/static/papers/ar2.pdf | Bin 0 -> 289686 bytes edaweb/static/robots.txt | 2 + edaweb/static/style.css | 211 ++++++++++++ edaweb/templates/diary.html.j2 | 26 ++ edaweb/templates/discord.html.j2 | 5 + edaweb/templates/index.html.j2 | 24 ++ edaweb/templates/isocd.html.j2 | 32 ++ edaweb/templates/isocd_confirmation.html.j2 | 16 + edaweb/templates/nhdl.html.j2 | 8 + edaweb/templates/questions.html.j2 | 17 + edaweb/templates/random.html.j2 | 22 ++ edaweb/templates/services.html.j2 | 59 ++++ edaweb/templates/template.html.j2 | 76 +++++ edaweb/templates/thought.html.j2 | 29 ++ edaweb/templates/thoughts.html.j2 | 12 + entrypoint.sh | 2 +- parser.py | 200 ----------- services.py | 360 -------------------- static/images/0don0t4ofuc41-3776935852.jpg | Bin 131290 -> 0 bytes static/images/1544552064683.jpg | Bin 171824 -> 0 bytes static/images/1549844950404.jpg | Bin 112071 -> 0 bytes static/images/1555824429083.png | Bin 170252 -> 0 bytes static/images/1555824491105.png | Bin 177365 -> 0 bytes static/images/1671540582317176.png | Bin 3276156 -> 0 bytes static/images/1urouter.jpg | Bin 183429 -> 0 bytes static/images/20220401_222149.jpg | Bin 38897 -> 0 bytes .../324162a23865a6a7e75761871d29935314cbc2b3.jpg | Bin 531668 -> 0 bytes ...02e26d0181c684bc17b56188bde6e80569d191_full.jpg | Bin 13920 -> 0 bytes static/images/5600x.jpg | Bin 151209 -> 0 bytes static/images/9400t.jpg | Bin 2603012 -> 0 bytes static/images/9400t_cooler.jpg | Bin 4997396 -> 0 bytes static/images/E1NlPc1X0AEkB-s.png | Bin 3029 -> 0 bytes static/images/E3xdm-hWYAEADNx.jpg | Bin 13609 -> 0 bytes static/images/E4WhXAvWYAIFwEa.png | Bin 10560 -> 0 bytes static/images/E4cjVaPXEAU83U0.png | Bin 15418 -> 0 bytes static/images/E7ODIBeX0AAivRV.jpg | Bin 75338 -> 0 bytes static/images/E7ODIZEWUAMQjty.jpg | Bin 94889 -> 0 bytes static/images/E7ODIv0WUAUp-ad.jpg | Bin 88028 -> 0 bytes static/images/E7ODJELX0AAVqna.jpg | Bin 107275 -> 0 bytes static/images/EbmVCYKWkAAwXKW.jpg | Bin 34657 -> 0 bytes static/images/Ffi1ducXEAArXDg.jpg | Bin 18055 -> 0 bytes static/images/GGBDzuSXMAA1Ktk.jpg | Bin 65355 -> 0 bytes static/images/GSxGe_rXQAAgEhj.jpg | Bin 1443057 -> 0 bytes static/images/GTq-GOgWQAErvCp.jpg | Bin 376374 -> 0 bytes static/images/GcyexeCW0AAYssz.jpg | Bin 992976 -> 0 bytes static/images/IMG_-g4wqat.jpg | Bin 82371 -> 0 bytes static/images/IMG_1602.jpg | Bin 24762 -> 0 bytes static/images/IMG_1603.jpg | Bin 26478 -> 0 bytes static/images/IMG_1604.jpg | Bin 35792 -> 0 bytes static/images/IMG_1605.jpg | Bin 33782 -> 0 bytes static/images/IMG_1606.jpg | Bin 34771 -> 0 bytes static/images/IMG_1607.jpg | Bin 39764 -> 0 bytes static/images/IMG_1609.jpg | Bin 48287 -> 0 bytes static/images/IMG_1610.jpg | Bin 41368 -> 0 bytes static/images/IMG_1611.jpg | Bin 24732 -> 0 bytes static/images/IMG_1612.jpg | Bin 26570 -> 0 bytes static/images/IMG_1613.png | Bin 2339298 -> 0 bytes static/images/IMG_1614.png | Bin 317510 -> 0 bytes static/images/IMG_1615.jpg | Bin 27792 -> 0 bytes static/images/IMG_1616.jpg | Bin 43497 -> 0 bytes static/images/IMG_1617.jpg | Bin 11756 -> 0 bytes static/images/IMG_1618.jpg | Bin 21924 -> 0 bytes static/images/IMG_1619.jpg | Bin 10839 -> 0 bytes static/images/IMG_1620.jpg | Bin 25630 -> 0 bytes static/images/IMG_1621.jpg | Bin 246181 -> 0 bytes static/images/IMG_1622.jpg | Bin 163205 -> 0 bytes static/images/IMG_1623.jpg | Bin 65738 -> 0 bytes static/images/IMG_1624.png | Bin 337723 -> 0 bytes static/images/IMG_1625.jpg | Bin 31273 -> 0 bytes static/images/IMG_1626.jpg | Bin 28916 -> 0 bytes static/images/IMG_1627.jpg | Bin 33325 -> 0 bytes static/images/IMG_1628.jpg | Bin 21475 -> 0 bytes static/images/IMG_1629.jpg | Bin 13153 -> 0 bytes static/images/IMG_1630.jpg | Bin 33638 -> 0 bytes static/images/IMG_1632.jpg | Bin 52252 -> 0 bytes static/images/IMG_1633.jpg | Bin 32028 -> 0 bytes static/images/IMG_1636.jpg | Bin 45916 -> 0 bytes static/images/IMG_1637.jpg | Bin 13999 -> 0 bytes static/images/IMG_1638.jpg | Bin 79337 -> 0 bytes static/images/IMG_1639.jpg | Bin 130710 -> 0 bytes static/images/IMG_1640.jpg | Bin 77986 -> 0 bytes static/images/IMG_1641.jpg | Bin 41247 -> 0 bytes static/images/IMG_20210422_212009.jpg | Bin 2976182 -> 0 bytes static/images/IMG_20210824_175000.jpg | Bin 3292970 -> 0 bytes static/images/IMG_20220809_172130442_HDR.jpg | Bin 2715100 -> 0 bytes static/images/IMG_20220811_133224877_HDR.jpg | Bin 3336994 -> 0 bytes static/images/IMG_20220811_133224877_HDR_crop.jpg | Bin 2168764 -> 0 bytes static/images/IMG_20220812_112838125_HDR.jpg | Bin 3440299 -> 0 bytes static/images/IMG_20220823_154457137_HDR.jpg | Bin 3971263 -> 0 bytes static/images/IMG_20221023_163821542.jpg | Bin 1461946 -> 0 bytes static/images/IMG_20230812_132400733_HDR.jpg | Bin 3044563 -> 0 bytes static/images/IMG_20230812_132632784_HDR.jpg | Bin 3452950 -> 0 bytes static/images/PXL_20250314_150055804.jpg | Bin 1835356 -> 0 bytes static/images/Screenshot_20210520-221830.png | Bin 275641 -> 0 bytes static/images/Screenshot_20210527_122432.png | Bin 1683456 -> 0 bytes static/images/Screenshot_20210620-144127.png | Bin 142673 -> 0 bytes static/images/Screenshot_20210620-231652.png | Bin 133513 -> 0 bytes static/images/Screenshot_20210727-072303.png | Bin 138225 -> 0 bytes static/images/Screenshot_20210727-072344.png | Bin 129039 -> 0 bytes static/images/Screenshot_20210727-223004.png | Bin 136574 -> 0 bytes static/images/Screenshot_20210731-181223.png | Bin 359217 -> 0 bytes static/images/Screenshot_20210731-181229.png | Bin 152242 -> 0 bytes static/images/Screenshot_20210811-125853.png | Bin 129411 -> 0 bytes static/images/Screenshot_20210818-203828.png | Bin 112321 -> 0 bytes static/images/Screenshot_20210825-131938.png | Bin 120763 -> 0 bytes static/images/Startech.jpg | Bin 456042 -> 0 bytes static/images/a4-5000.jpg | Bin 6252 -> 0 bytes static/images/aaaaahh.jpg | Bin 52325 -> 0 bytes static/images/anti_nft_b.png | Bin 2311 -> 0 bytes static/images/arenas.jpg | Bin 294229 -> 0 bytes static/images/basil.jpg | Bin 6068 -> 0 bytes static/images/bigshark.png | Bin 2355827 -> 0 bytes static/images/bob.gif | Bin 142993 -> 0 bytes static/images/braindamage.png | Bin 22441 -> 0 bytes static/images/catonlap.jpg | Bin 68382 -> 0 bytes static/images/chuddy.jpg | Bin 78447 -> 0 bytes static/images/cloudfree.png | Bin 3080 -> 0 bytes static/images/embedded_img2.png | Bin 8613 -> 0 bytes static/images/embedded_img3.png | Bin 18291 -> 0 bytes static/images/embedded_img4.png | Bin 16801 -> 0 bytes static/images/embedded_img5.PNG | Bin 11374 -> 0 bytes static/images/face.jpg | Bin 226207 -> 0 bytes static/images/first_server.jpg | Bin 2700813 -> 0 bytes static/images/fstab.png | Bin 88618 -> 0 bytes static/images/graduation.jpg | Bin 290228 -> 0 bytes static/images/greenboi.jpg | Bin 17079 -> 0 bytes static/images/hpkvm_puttyconf.png | Bin 17830 -> 0 bytes static/images/hpkvm_serialconf.png | Bin 13801 -> 0 bytes static/images/i5-1145G7.png | Bin 118559 -> 0 bytes static/images/icons.png | Bin 46132 -> 0 bytes static/images/ioporn.jpg | Bin 51451 -> 0 bytes static/images/its_true_1.jpg | Bin 71857 -> 0 bytes static/images/its_true_2.jpg | Bin 109263 -> 0 bytes static/images/j1800.jpg | Bin 1589479 -> 0 bytes static/images/j5040.jpg | Bin 3220569 -> 0 bytes static/images/j5040_server.jpg | Bin 2767061 -> 0 bytes static/images/kvm_1.png | Bin 60072 -> 0 bytes static/images/kvm_2.png | Bin 150115 -> 0 bytes static/images/lackrack1.jpg | Bin 335971 -> 0 bytes static/images/lackrack2.jpg | Bin 381379 -> 0 bytes static/images/libreboot.jpg | Bin 1910228 -> 0 bytes static/images/liostore.png | Bin 691184 -> 0 bytes static/images/media_E9lTIldWUAEeT63.jpg | Bin 180897 -> 0 bytes static/images/media_FPus_2aXsAUhCu9.jpg | Bin 480286 -> 0 bytes static/images/media_FRlRqYKXoAIw82O.jpg | Bin 55076 -> 0 bytes static/images/media_FeP_m8FXEAAqcJs.jpg | Bin 279374 -> 0 bytes static/images/media_FfcNNZ2WYAAz97v.jpg | Bin 377136 -> 0 bytes static/images/media_FlBsMq2XwAATJX5.jpg | Bin 885129 -> 0 bytes static/images/media_FlBsfDcWQAQhJdP.jpg | Bin 660235 -> 0 bytes static/images/minecraft.png | Bin 27516 -> 0 bytes static/images/new_switch_opened.jpg | Bin 4348235 -> 0 bytes static/images/newdiscord.jpg | Bin 56309 -> 0 bytes static/images/nicfan.jpg | Bin 2593649 -> 0 bytes static/images/notstolenvalour4.png | Bin 1752598 -> 0 bytes static/images/notstolenvalour5.png | Bin 1703482 -> 0 bytes static/images/notstolenvalour8.png | Bin 1706779 -> 0 bytes static/images/oldpic.png | Bin 938082 -> 0 bytes static/images/pfsenseswissvpnportforwards.png | Bin 118254 -> 0 bytes static/images/photo_2022-12-07_14-06-03.jpg | Bin 12097 -> 0 bytes static/images/photo_5857106224099739202_y.jpg | Bin 124721 -> 0 bytes static/images/powerani.gif | Bin 7203 -> 0 bytes ...profile_images_1598652418580963328_ENk7xKDw.jpg | Bin 42497 -> 0 bytes static/images/rack1.jpg | Bin 210052 -> 0 bytes static/images/rack2.jpg | Bin 190057 -> 0 bytes static/images/router.jpg | Bin 694385 -> 0 bytes static/images/russian_isp.png | Bin 52664 -> 0 bytes static/images/russian_isp_abuse.png | Bin 52880 -> 0 bytes static/images/russian_nginx_logs.jpg | Bin 224155 -> 0 bytes static/images/russian_yt.jpg | Bin 130618 -> 0 bytes static/images/s-l1600.jpg | Bin 152914 -> 0 bytes static/images/s-l16001.jpg | Bin 226604 -> 0 bytes static/images/s-l500.jpg | Bin 31862 -> 0 bytes ...le_ede336afca555579dd78f051e4a23feaa838716d.jpg | Bin 185850 -> 0 bytes static/images/selfie.jpg | Bin 73451 -> 0 bytes static/images/server.jpg | Bin 2578909 -> 0 bytes static/images/server2.jpg | Bin 2877532 -> 0 bytes static/images/shark1.jpg | Bin 449065 -> 0 bytes static/images/shark2.jpg | Bin 433903 -> 0 bytes static/images/shark3.jpg | Bin 518122 -> 0 bytes static/images/shark3.png | Bin 2944760 -> 0 bytes static/images/shun-hashimoto-mio-chibana.gif | Bin 1472535 -> 0 bytes static/images/sicp.jpg | Bin 3664911 -> 0 bytes static/images/startech_rack_1.jpg | Bin 3083071 -> 0 bytes static/images/startech_rack_2.jpg | Bin 2093105 -> 0 bytes static/images/stolenvalour.jpg | Bin 234621 -> 0 bytes static/images/sun.gif | Bin 3097 -> 0 bytes static/images/switch.jpg | Bin 90618 -> 0 bytes static/images/switches.jpg | Bin 3169089 -> 0 bytes static/images/t30.jpg | Bin 235413 -> 0 bytes static/images/techdome.jpg | Bin 125311 -> 0 bytes static/images/telegrampic.jpg | Bin 138371 -> 0 bytes static/images/telegrampic2.jpg | Bin 25752 -> 0 bytes static/images/testimonials.PNG | Bin 190391 -> 0 bytes static/images/theNVMEVault.png | Bin 51977 -> 0 bytes static/images/twitterpic.jpg | Bin 14667 -> 0 bytes static/images/vcss-blue.gif | Bin 1759 -> 0 bytes static/images/www.gif | Bin 1531 -> 0 bytes static/images/x200.jpg | Bin 2732895 -> 0 bytes static/images/xeon.jpg | Bin 571574 -> 0 bytes static/images/xeon_motherboard.jpg | Bin 757343 -> 0 bytes static/index.md | 36 -- static/robots.txt | 2 - static/style.css | 211 ------------ templates/diary.html.j2 | 26 -- templates/discord.html.j2 | 5 - templates/index.html.j2 | 24 -- templates/isocd.html.j2 | 32 -- templates/isocd_confirmation.html.j2 | 16 - templates/nhdl.html.j2 | 8 - templates/questions.html.j2 | 17 - templates/random.html.j2 | 22 -- templates/services.html.j2 | 59 ---- templates/template.html.j2 | 76 ----- templates/thought.html.j2 | 29 -- templates/thoughts.html.j2 | 12 - 410 files changed, 1728 insertions(+), 1710 deletions(-) delete mode 100755 app.py delete mode 100644 cache.py delete mode 100644 database.py delete mode 100755 downloader.py create mode 100644 edaweb/app.py create mode 100644 edaweb/cache.py create mode 100644 edaweb/database.py create mode 100644 edaweb/downloader.py create mode 100644 edaweb/parser.py create mode 100644 edaweb/services.py create mode 100644 edaweb/static/images/0don0t4ofuc41-3776935852.jpg create mode 100644 edaweb/static/images/1544552064683.jpg create mode 100644 edaweb/static/images/1549844950404.jpg create mode 100644 edaweb/static/images/1555824429083.png create mode 100644 edaweb/static/images/1555824491105.png create mode 100644 edaweb/static/images/1671540582317176.png create mode 100644 edaweb/static/images/1urouter.jpg create mode 100644 edaweb/static/images/20220401_222149.jpg create mode 100644 edaweb/static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg create mode 100644 edaweb/static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg create mode 100644 edaweb/static/images/5600x.jpg create mode 100644 edaweb/static/images/9400t.jpg create mode 100644 edaweb/static/images/9400t_cooler.jpg create mode 100644 edaweb/static/images/E1NlPc1X0AEkB-s.png create mode 100644 edaweb/static/images/E3xdm-hWYAEADNx.jpg create mode 100644 edaweb/static/images/E4WhXAvWYAIFwEa.png create mode 100644 edaweb/static/images/E4cjVaPXEAU83U0.png create mode 100644 edaweb/static/images/E7ODIBeX0AAivRV.jpg create mode 100644 edaweb/static/images/E7ODIZEWUAMQjty.jpg create mode 100644 edaweb/static/images/E7ODIv0WUAUp-ad.jpg create mode 100644 edaweb/static/images/E7ODJELX0AAVqna.jpg create mode 100644 edaweb/static/images/EbmVCYKWkAAwXKW.jpg create mode 100644 edaweb/static/images/Ffi1ducXEAArXDg.jpg create mode 100644 edaweb/static/images/GGBDzuSXMAA1Ktk.jpg create mode 100644 edaweb/static/images/GSxGe_rXQAAgEhj.jpg create mode 100644 edaweb/static/images/GTq-GOgWQAErvCp.jpg create mode 100644 edaweb/static/images/GcyexeCW0AAYssz.jpg create mode 100644 edaweb/static/images/IMG_-g4wqat.jpg create mode 100644 edaweb/static/images/IMG_1602.jpg create mode 100644 edaweb/static/images/IMG_1603.jpg create mode 100644 edaweb/static/images/IMG_1604.jpg create mode 100644 edaweb/static/images/IMG_1605.jpg create mode 100644 edaweb/static/images/IMG_1606.jpg create mode 100644 edaweb/static/images/IMG_1607.jpg create mode 100644 edaweb/static/images/IMG_1609.jpg create mode 100644 edaweb/static/images/IMG_1610.jpg create mode 100644 edaweb/static/images/IMG_1611.jpg create mode 100644 edaweb/static/images/IMG_1612.jpg create mode 100644 edaweb/static/images/IMG_1613.png create mode 100644 edaweb/static/images/IMG_1614.png create mode 100644 edaweb/static/images/IMG_1615.jpg create mode 100644 edaweb/static/images/IMG_1616.jpg create mode 100644 edaweb/static/images/IMG_1617.jpg create mode 100644 edaweb/static/images/IMG_1618.jpg create mode 100644 edaweb/static/images/IMG_1619.jpg create mode 100644 edaweb/static/images/IMG_1620.jpg create mode 100644 edaweb/static/images/IMG_1621.jpg create mode 100644 edaweb/static/images/IMG_1622.jpg create mode 100644 edaweb/static/images/IMG_1623.jpg create mode 100644 edaweb/static/images/IMG_1624.png create mode 100644 edaweb/static/images/IMG_1625.jpg create mode 100644 edaweb/static/images/IMG_1626.jpg create mode 100644 edaweb/static/images/IMG_1627.jpg create mode 100644 edaweb/static/images/IMG_1628.jpg create mode 100644 edaweb/static/images/IMG_1629.jpg create mode 100644 edaweb/static/images/IMG_1630.jpg create mode 100644 edaweb/static/images/IMG_1632.jpg create mode 100644 edaweb/static/images/IMG_1633.jpg create mode 100644 edaweb/static/images/IMG_1636.jpg create mode 100644 edaweb/static/images/IMG_1637.jpg create mode 100644 edaweb/static/images/IMG_1638.jpg create mode 100644 edaweb/static/images/IMG_1639.jpg create mode 100644 edaweb/static/images/IMG_1640.jpg create mode 100644 edaweb/static/images/IMG_1641.jpg create mode 100644 edaweb/static/images/IMG_20210422_212009.jpg create mode 100644 edaweb/static/images/IMG_20210824_175000.jpg create mode 100644 edaweb/static/images/IMG_20220809_172130442_HDR.jpg create mode 100644 edaweb/static/images/IMG_20220811_133224877_HDR.jpg create mode 100644 edaweb/static/images/IMG_20220811_133224877_HDR_crop.jpg create mode 100644 edaweb/static/images/IMG_20220812_112838125_HDR.jpg create mode 100644 edaweb/static/images/IMG_20220823_154457137_HDR.jpg create mode 100644 edaweb/static/images/IMG_20221023_163821542.jpg create mode 100644 edaweb/static/images/IMG_20230812_132400733_HDR.jpg create mode 100644 edaweb/static/images/IMG_20230812_132632784_HDR.jpg create mode 100644 edaweb/static/images/PXL_20250314_150055804.jpg create mode 100644 edaweb/static/images/Screenshot_20210520-221830.png create mode 100644 edaweb/static/images/Screenshot_20210527_122432.png create mode 100644 edaweb/static/images/Screenshot_20210620-144127.png create mode 100644 edaweb/static/images/Screenshot_20210620-231652.png create mode 100644 edaweb/static/images/Screenshot_20210727-072303.png create mode 100644 edaweb/static/images/Screenshot_20210727-072344.png create mode 100644 edaweb/static/images/Screenshot_20210727-223004.png create mode 100644 edaweb/static/images/Screenshot_20210731-181223.png create mode 100644 edaweb/static/images/Screenshot_20210731-181229.png create mode 100644 edaweb/static/images/Screenshot_20210811-125853.png create mode 100644 edaweb/static/images/Screenshot_20210818-203828.png create mode 100644 edaweb/static/images/Screenshot_20210825-131938.png create mode 100644 edaweb/static/images/Startech.jpg create mode 100644 edaweb/static/images/a4-5000.jpg create mode 100644 edaweb/static/images/aaaaahh.jpg create mode 100644 edaweb/static/images/anti_nft_b.png create mode 100644 edaweb/static/images/arenas.jpg create mode 100644 edaweb/static/images/basil.jpg create mode 100644 edaweb/static/images/bigshark.png create mode 100644 edaweb/static/images/bob.gif create mode 100644 edaweb/static/images/braindamage.png create mode 100644 edaweb/static/images/catonlap.jpg create mode 100644 edaweb/static/images/chuddy.jpg create mode 100644 edaweb/static/images/cloudfree.png create mode 100644 edaweb/static/images/embedded_img2.png create mode 100644 edaweb/static/images/embedded_img3.png create mode 100644 edaweb/static/images/embedded_img4.png create mode 100644 edaweb/static/images/embedded_img5.PNG create mode 100644 edaweb/static/images/face.jpg create mode 100644 edaweb/static/images/first_server.jpg create mode 100644 edaweb/static/images/fstab.png create mode 100644 edaweb/static/images/graduation.jpg create mode 100644 edaweb/static/images/greenboi.jpg create mode 100644 edaweb/static/images/hpkvm_puttyconf.png create mode 100644 edaweb/static/images/hpkvm_serialconf.png create mode 100644 edaweb/static/images/i5-1145G7.png create mode 100644 edaweb/static/images/icons.png create mode 100644 edaweb/static/images/ioporn.jpg create mode 100644 edaweb/static/images/its_true_1.jpg create mode 100644 edaweb/static/images/its_true_2.jpg create mode 100644 edaweb/static/images/j1800.jpg create mode 100644 edaweb/static/images/j5040.jpg create mode 100644 edaweb/static/images/j5040_server.jpg create mode 100644 edaweb/static/images/kvm_1.png create mode 100644 edaweb/static/images/kvm_2.png create mode 100644 edaweb/static/images/lackrack1.jpg create mode 100644 edaweb/static/images/lackrack2.jpg create mode 100644 edaweb/static/images/libreboot.jpg create mode 100644 edaweb/static/images/liostore.png create mode 100644 edaweb/static/images/media_E9lTIldWUAEeT63.jpg create mode 100644 edaweb/static/images/media_FPus_2aXsAUhCu9.jpg create mode 100644 edaweb/static/images/media_FRlRqYKXoAIw82O.jpg create mode 100644 edaweb/static/images/media_FeP_m8FXEAAqcJs.jpg create mode 100644 edaweb/static/images/media_FfcNNZ2WYAAz97v.jpg create mode 100644 edaweb/static/images/media_FlBsMq2XwAATJX5.jpg create mode 100644 edaweb/static/images/media_FlBsfDcWQAQhJdP.jpg create mode 100644 edaweb/static/images/minecraft.png create mode 100644 edaweb/static/images/new_switch_opened.jpg create mode 100644 edaweb/static/images/newdiscord.jpg create mode 100644 edaweb/static/images/nicfan.jpg create mode 100644 edaweb/static/images/notstolenvalour4.png create mode 100644 edaweb/static/images/notstolenvalour5.png create mode 100644 edaweb/static/images/notstolenvalour8.png create mode 100644 edaweb/static/images/oldpic.png create mode 100644 edaweb/static/images/pfsenseswissvpnportforwards.png create mode 100644 edaweb/static/images/photo_2022-12-07_14-06-03.jpg create mode 100644 edaweb/static/images/photo_5857106224099739202_y.jpg create mode 100644 edaweb/static/images/powerani.gif create mode 100644 edaweb/static/images/profile_images_1598652418580963328_ENk7xKDw.jpg create mode 100644 edaweb/static/images/rack1.jpg create mode 100644 edaweb/static/images/rack2.jpg create mode 100644 edaweb/static/images/router.jpg create mode 100644 edaweb/static/images/russian_isp.png create mode 100644 edaweb/static/images/russian_isp_abuse.png create mode 100644 edaweb/static/images/russian_nginx_logs.jpg create mode 100644 edaweb/static/images/russian_yt.jpg create mode 100644 edaweb/static/images/s-l1600.jpg create mode 100644 edaweb/static/images/s-l16001.jpg create mode 100644 edaweb/static/images/s-l500.jpg create mode 100644 edaweb/static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg create mode 100644 edaweb/static/images/selfie.jpg create mode 100644 edaweb/static/images/server.jpg create mode 100644 edaweb/static/images/server2.jpg create mode 100644 edaweb/static/images/shark1.jpg create mode 100644 edaweb/static/images/shark2.jpg create mode 100644 edaweb/static/images/shark3.jpg create mode 100644 edaweb/static/images/shark3.png create mode 100644 edaweb/static/images/shun-hashimoto-mio-chibana.gif create mode 100644 edaweb/static/images/sicp.jpg create mode 100644 edaweb/static/images/startech_rack_1.jpg create mode 100644 edaweb/static/images/startech_rack_2.jpg create mode 100644 edaweb/static/images/stolenvalour.jpg create mode 100644 edaweb/static/images/sun.gif create mode 100644 edaweb/static/images/switch.jpg create mode 100644 edaweb/static/images/switches.jpg create mode 100644 edaweb/static/images/t30.jpg create mode 100644 edaweb/static/images/techdome.jpg create mode 100644 edaweb/static/images/telegrampic.jpg create mode 100644 edaweb/static/images/telegrampic2.jpg create mode 100644 edaweb/static/images/testimonials.PNG create mode 100644 edaweb/static/images/theNVMEVault.png create mode 100644 edaweb/static/images/twitterpic.jpg create mode 100644 edaweb/static/images/vcss-blue.gif create mode 100644 edaweb/static/images/www.gif create mode 100644 edaweb/static/images/x200.jpg create mode 100644 edaweb/static/images/xeon.jpg create mode 100644 edaweb/static/images/xeon_motherboard.jpg create mode 100644 edaweb/static/index.md create mode 100644 edaweb/static/papers/aai.pdf create mode 100644 edaweb/static/papers/ar2.pdf create mode 100644 edaweb/static/robots.txt create mode 100644 edaweb/static/style.css create mode 100644 edaweb/templates/diary.html.j2 create mode 100644 edaweb/templates/discord.html.j2 create mode 100644 edaweb/templates/index.html.j2 create mode 100644 edaweb/templates/isocd.html.j2 create mode 100644 edaweb/templates/isocd_confirmation.html.j2 create mode 100644 edaweb/templates/nhdl.html.j2 create mode 100644 edaweb/templates/questions.html.j2 create mode 100644 edaweb/templates/random.html.j2 create mode 100644 edaweb/templates/services.html.j2 create mode 100644 edaweb/templates/template.html.j2 create mode 100644 edaweb/templates/thought.html.j2 create mode 100644 edaweb/templates/thoughts.html.j2 delete mode 100755 parser.py delete mode 100755 services.py delete mode 100755 static/images/0don0t4ofuc41-3776935852.jpg delete mode 100644 static/images/1544552064683.jpg delete mode 100644 static/images/1549844950404.jpg delete mode 100644 static/images/1555824429083.png delete mode 100644 static/images/1555824491105.png delete mode 100644 static/images/1671540582317176.png delete mode 100755 static/images/1urouter.jpg delete mode 100644 static/images/20220401_222149.jpg delete mode 100644 static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg delete mode 100755 static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg delete mode 100644 static/images/5600x.jpg delete mode 100755 static/images/9400t.jpg delete mode 100755 static/images/9400t_cooler.jpg delete mode 100755 static/images/E1NlPc1X0AEkB-s.png delete mode 100755 static/images/E3xdm-hWYAEADNx.jpg delete mode 100755 static/images/E4WhXAvWYAIFwEa.png delete mode 100755 static/images/E4cjVaPXEAU83U0.png delete mode 100755 static/images/E7ODIBeX0AAivRV.jpg delete mode 100755 static/images/E7ODIZEWUAMQjty.jpg delete mode 100755 static/images/E7ODIv0WUAUp-ad.jpg delete mode 100755 static/images/E7ODJELX0AAVqna.jpg delete mode 100755 static/images/EbmVCYKWkAAwXKW.jpg delete mode 100644 static/images/Ffi1ducXEAArXDg.jpg delete mode 100644 static/images/GGBDzuSXMAA1Ktk.jpg delete mode 100644 static/images/GSxGe_rXQAAgEhj.jpg delete mode 100644 static/images/GTq-GOgWQAErvCp.jpg delete mode 100644 static/images/GcyexeCW0AAYssz.jpg delete mode 100755 static/images/IMG_-g4wqat.jpg delete mode 100644 static/images/IMG_1602.jpg delete mode 100644 static/images/IMG_1603.jpg delete mode 100644 static/images/IMG_1604.jpg delete mode 100644 static/images/IMG_1605.jpg delete mode 100644 static/images/IMG_1606.jpg delete mode 100644 static/images/IMG_1607.jpg delete mode 100644 static/images/IMG_1609.jpg delete mode 100644 static/images/IMG_1610.jpg delete mode 100644 static/images/IMG_1611.jpg delete mode 100644 static/images/IMG_1612.jpg delete mode 100644 static/images/IMG_1613.png delete mode 100644 static/images/IMG_1614.png delete mode 100644 static/images/IMG_1615.jpg delete mode 100644 static/images/IMG_1616.jpg delete mode 100644 static/images/IMG_1617.jpg delete mode 100644 static/images/IMG_1618.jpg delete mode 100644 static/images/IMG_1619.jpg delete mode 100644 static/images/IMG_1620.jpg delete mode 100644 static/images/IMG_1621.jpg delete mode 100644 static/images/IMG_1622.jpg delete mode 100644 static/images/IMG_1623.jpg delete mode 100644 static/images/IMG_1624.png delete mode 100644 static/images/IMG_1625.jpg delete mode 100644 static/images/IMG_1626.jpg delete mode 100644 static/images/IMG_1627.jpg delete mode 100644 static/images/IMG_1628.jpg delete mode 100644 static/images/IMG_1629.jpg delete mode 100644 static/images/IMG_1630.jpg delete mode 100644 static/images/IMG_1632.jpg delete mode 100644 static/images/IMG_1633.jpg delete mode 100644 static/images/IMG_1636.jpg delete mode 100644 static/images/IMG_1637.jpg delete mode 100644 static/images/IMG_1638.jpg delete mode 100644 static/images/IMG_1639.jpg delete mode 100644 static/images/IMG_1640.jpg delete mode 100644 static/images/IMG_1641.jpg delete mode 100755 static/images/IMG_20210422_212009.jpg delete mode 100755 static/images/IMG_20210824_175000.jpg delete mode 100755 static/images/IMG_20220809_172130442_HDR.jpg delete mode 100755 static/images/IMG_20220811_133224877_HDR.jpg delete mode 100755 static/images/IMG_20220811_133224877_HDR_crop.jpg delete mode 100755 static/images/IMG_20220812_112838125_HDR.jpg delete mode 100755 static/images/IMG_20220823_154457137_HDR.jpg delete mode 100755 static/images/IMG_20221023_163821542.jpg delete mode 100755 static/images/IMG_20230812_132400733_HDR.jpg delete mode 100755 static/images/IMG_20230812_132632784_HDR.jpg delete mode 100644 static/images/PXL_20250314_150055804.jpg delete mode 100755 static/images/Screenshot_20210520-221830.png delete mode 100755 static/images/Screenshot_20210527_122432.png delete mode 100755 static/images/Screenshot_20210620-144127.png delete mode 100755 static/images/Screenshot_20210620-231652.png delete mode 100755 static/images/Screenshot_20210727-072303.png delete mode 100755 static/images/Screenshot_20210727-072344.png delete mode 100755 static/images/Screenshot_20210727-223004.png delete mode 100755 static/images/Screenshot_20210731-181223.png delete mode 100755 static/images/Screenshot_20210731-181229.png delete mode 100755 static/images/Screenshot_20210811-125853.png delete mode 100755 static/images/Screenshot_20210818-203828.png delete mode 100755 static/images/Screenshot_20210825-131938.png delete mode 100644 static/images/Startech.jpg delete mode 100755 static/images/a4-5000.jpg delete mode 100755 static/images/aaaaahh.jpg delete mode 100644 static/images/anti_nft_b.png delete mode 100644 static/images/arenas.jpg delete mode 100755 static/images/basil.jpg delete mode 100755 static/images/bigshark.png delete mode 100755 static/images/bob.gif delete mode 100755 static/images/braindamage.png delete mode 100644 static/images/catonlap.jpg delete mode 100644 static/images/chuddy.jpg delete mode 100644 static/images/cloudfree.png delete mode 100755 static/images/embedded_img2.png delete mode 100755 static/images/embedded_img3.png delete mode 100755 static/images/embedded_img4.png delete mode 100755 static/images/embedded_img5.PNG delete mode 100755 static/images/face.jpg delete mode 100755 static/images/first_server.jpg delete mode 100755 static/images/fstab.png delete mode 100644 static/images/graduation.jpg delete mode 100755 static/images/greenboi.jpg delete mode 100755 static/images/hpkvm_puttyconf.png delete mode 100755 static/images/hpkvm_serialconf.png delete mode 100644 static/images/i5-1145G7.png delete mode 100755 static/images/icons.png delete mode 100755 static/images/ioporn.jpg delete mode 100755 static/images/its_true_1.jpg delete mode 100755 static/images/its_true_2.jpg delete mode 100755 static/images/j1800.jpg delete mode 100755 static/images/j5040.jpg delete mode 100755 static/images/j5040_server.jpg delete mode 100755 static/images/kvm_1.png delete mode 100755 static/images/kvm_2.png delete mode 100755 static/images/lackrack1.jpg delete mode 100755 static/images/lackrack2.jpg delete mode 100755 static/images/libreboot.jpg delete mode 100755 static/images/liostore.png delete mode 100755 static/images/media_E9lTIldWUAEeT63.jpg delete mode 100755 static/images/media_FPus_2aXsAUhCu9.jpg delete mode 100755 static/images/media_FRlRqYKXoAIw82O.jpg delete mode 100755 static/images/media_FeP_m8FXEAAqcJs.jpg delete mode 100755 static/images/media_FfcNNZ2WYAAz97v.jpg delete mode 100644 static/images/media_FlBsMq2XwAATJX5.jpg delete mode 100644 static/images/media_FlBsfDcWQAQhJdP.jpg delete mode 100755 static/images/minecraft.png delete mode 100755 static/images/new_switch_opened.jpg delete mode 100755 static/images/newdiscord.jpg delete mode 100755 static/images/nicfan.jpg delete mode 100644 static/images/notstolenvalour4.png delete mode 100644 static/images/notstolenvalour5.png delete mode 100644 static/images/notstolenvalour8.png delete mode 100755 static/images/oldpic.png delete mode 100644 static/images/pfsenseswissvpnportforwards.png delete mode 100755 static/images/photo_2022-12-07_14-06-03.jpg delete mode 100644 static/images/photo_5857106224099739202_y.jpg delete mode 100644 static/images/powerani.gif delete mode 100755 static/images/profile_images_1598652418580963328_ENk7xKDw.jpg delete mode 100755 static/images/rack1.jpg delete mode 100755 static/images/rack2.jpg delete mode 100755 static/images/router.jpg delete mode 100755 static/images/russian_isp.png delete mode 100755 static/images/russian_isp_abuse.png delete mode 100755 static/images/russian_nginx_logs.jpg delete mode 100755 static/images/russian_yt.jpg delete mode 100755 static/images/s-l1600.jpg delete mode 100755 static/images/s-l16001.jpg delete mode 100755 static/images/s-l500.jpg delete mode 100644 static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg delete mode 100755 static/images/selfie.jpg delete mode 100755 static/images/server.jpg delete mode 100755 static/images/server2.jpg delete mode 100755 static/images/shark1.jpg delete mode 100755 static/images/shark2.jpg delete mode 100755 static/images/shark3.jpg delete mode 100755 static/images/shark3.png delete mode 100644 static/images/shun-hashimoto-mio-chibana.gif delete mode 100755 static/images/sicp.jpg delete mode 100755 static/images/startech_rack_1.jpg delete mode 100755 static/images/startech_rack_2.jpg delete mode 100644 static/images/stolenvalour.jpg delete mode 100755 static/images/sun.gif delete mode 100755 static/images/switch.jpg delete mode 100755 static/images/switches.jpg delete mode 100755 static/images/t30.jpg delete mode 100644 static/images/techdome.jpg delete mode 100755 static/images/telegrampic.jpg delete mode 100755 static/images/telegrampic2.jpg delete mode 100755 static/images/testimonials.PNG delete mode 100755 static/images/theNVMEVault.png delete mode 100755 static/images/twitterpic.jpg delete mode 100755 static/images/vcss-blue.gif delete mode 100644 static/images/www.gif delete mode 100755 static/images/x200.jpg delete mode 100755 static/images/xeon.jpg delete mode 100755 static/images/xeon_motherboard.jpg delete mode 100755 static/index.md delete mode 100755 static/robots.txt delete mode 100755 static/style.css delete mode 100755 templates/diary.html.j2 delete mode 100755 templates/discord.html.j2 delete mode 100755 templates/index.html.j2 delete mode 100755 templates/isocd.html.j2 delete mode 100755 templates/isocd_confirmation.html.j2 delete mode 100755 templates/nhdl.html.j2 delete mode 100644 templates/questions.html.j2 delete mode 100755 templates/random.html.j2 delete mode 100755 templates/services.html.j2 delete mode 100755 templates/template.html.j2 delete mode 100755 templates/thought.html.j2 delete mode 100755 templates/thoughts.html.j2 diff --git a/Dockerfile b/Dockerfile index f81f901..67b38ff 100755 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:22.04 +FROM ubuntu:22.10 MAINTAINER Eden Attenborough "eden.attenborough@outlook.com" ENV TZ=Europe/London RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone @@ -8,7 +8,7 @@ COPY . /app WORKDIR /app RUN pip3 install -r requirements.txt -RUN echo "*/30 * * * * root python3 /app/cache.py > /proc/1/fd/1 2>/proc/1/fd/2" > /etc/crontab +RUN echo "*/30 * * * * root python3 /app/edaweb/cache.py > /proc/1/fd/1 2>/proc/1/fd/2" > /etc/crontab ENTRYPOINT ["bash"] CMD ["entrypoint.sh"] diff --git a/app.py b/app.py deleted file mode 100755 index 47bb129..0000000 --- a/app.py +++ /dev/null @@ -1,252 +0,0 @@ -from paste.translogger import TransLogger -from waitress import serve -from PIL import Image -import configparser -import transmission_rpc -import downloader -import datetime -import database -import services -import urllib -import random -import parser -import flask -import sys -import os -import io - -app = flask.Flask(__name__) -CONFIG = configparser.ConfigParser(interpolation = None) -CONFIG.read("edaweb.conf") -shown_images = set() -shown_sidebar_images = set() - -def get_pfp_img(db:database.Database): - global shown_images - dbimg = db.get_pfp_images() - if len(shown_images) == len(dbimg): - shown_images = set() - folder = set(dbimg).difference(shown_images) - choice = random.choice(list(folder)) - shown_images.add(choice) - return choice - -def get_sidebar_img(db:database.Database): - global shown_sidebar_images - dbimg = db.get_sidebar_images() - if len(shown_sidebar_images) == len(dbimg): - shown_sidebar_images = set() - folder = set(dbimg).difference(shown_sidebar_images) - choice = random.choice(list(folder)) - shown_sidebar_images.add(choice) - return choice - -def get_correct_article_headers(db:database.Database, title): - db_headers = list(db.get_header_articles()) - if title in [i[0] for i in db_headers]: - out = [] - for i in db_headers: - if i[0] != title: - out.append(i) - return out + [("index", "/~")] - else: - return db_headers + [("index", "/~")] - -def get_template_items(title, db): - return { - "links": db.get_header_links(), - "image": get_pfp_img(db), - "title": title, - "articles": get_correct_article_headers(db, title) - } - -@app.route("/") -@app.route("/~") -def index(): - with database.Database() as db: - with open(os.path.join("static", "index.md"), "r") as f: - return flask.render_template( - "index.html.j2", - **get_template_items("eden's site :3", db), - days_till_ffs = datetime.datetime(2025, 11, 8) - datetime.datetime.now(), - markdown = parser.parse_text(f.read())[0], - featured_thoughts = db.get_featured_thoughts(), - commits = db.get_cached_commits()[:15], - sidebar_img = get_sidebar_img(db) - ) - -@app.route("/robots.txt") -def robots(): - return flask.send_from_directory("static", "robots.txt") - -@app.route("/services") -def serve_services(): - with database.Database() as db: - return flask.render_template( - "services.html.j2", - **get_template_items("services", db), - docker = services.get_all_docker_containers(), - trans = services.get_torrent_stats(), - pihole = services.get_pihole_stats() - ) - -@app.route("/discord") -def discord(): - with database.Database() as db: - return flask.render_template( - "discord.html.j2", - **get_template_items("discord", db), - discord = CONFIG["discord"]["username"] - ) - -@app.route("/thought") -def get_thought(): - thought_id = flask.request.args.get("id", type=int) - with database.Database() as db: - try: - category_name, title, dt, parsed, headers, redirect = parser.get_thought_from_id(db, thought_id) - # print(headers) - except TypeError: - flask.abort(404) - return - - if redirect is not None: - return flask.redirect(redirect, code = 301) - - return flask.render_template( - "thought.html.j2", - **get_template_items(title, db), - md_html = parsed, - contents_html = headers, - dt = "published: " + str(dt), - category = category_name, - othercategories = db.get_categories_not(category_name), - related = db.get_similar_thoughts(category_name, thought_id) - ) - -@app.route("/thoughts") -def get_thoughts(): - with database.Database() as db: - all_ = db.get_all_thoughts() - tree = {} - for id_, title, dt, category in all_: - if category not in tree.keys(): - tree[category] = [(id_, title, dt)] - else: - tree[category].append((id_, title, str(dt))) - - return flask.render_template( - "thoughts.html.j2", - **get_template_items("thoughts", db), - tree = tree - ) - -@app.route("/img/") -def serve_image(filename): - imdirpath = os.path.join(".", "static", "images") - if filename in os.listdir(imdirpath): - try: - w = int(flask.request.args['w']) - h = int(flask.request.args['h']) - except (KeyError, ValueError): - return flask.send_from_directory(imdirpath, filename) - - img = Image.open(os.path.join(imdirpath, filename)) - img.thumbnail((w, h), Image.LANCZOS) - io_ = io.BytesIO() - img.save(io_, format='JPEG') - return flask.Response(io_.getvalue(), mimetype='image/jpeg') - else: - flask.abort(404) - -@app.route("/nhdl") -def serve_nhdl(): - with database.Database() as db: - try: - nhentai_id = int(flask.request.args["id"]) - with downloader.CompressedImages(nhentai_id) as zippath: - # return app.send_static_file(os.path.split(zippath)[-1]) - return flask.redirect("/zip/%s" % os.path.split(zippath)[-1]) - - except (KeyError, ValueError): - return flask.render_template( - "nhdl.html.j2", - **get_template_items("Hentai Downloader", db) - ) - -@app.route("/isocd") -def serve_iso_form(): - with database.Database() as db: - return flask.render_template( - "isocd.html.j2", - **get_template_items("Get a GNU/Linux install CD", db), - iso_options = db.get_iso_cd_options() - ) - -@app.route("/zip/") -def serve_zip(zipfile): - return flask.send_from_directory(os.path.join(".", "static", "zips"), zipfile) - -@app.route("/nhdlredirect", methods = ["POST"]) -def redirect_nhdl(): - req = dict(flask.request.form) - try: - return flask.redirect("/nhdl?id=%i" % int(req["number_input"])) - except (TypeError, ValueError, KeyError): - flask.abort(400) - -@app.route("/getisocd", methods = ["POST"]) -def get_iso_cd(): - req = dict(flask.request.form) - print(req) - with database.Database() as db: - id_ = db.append_cd_orders(**req) - print(id_) - return flask.render_template( - "isocd_confirmation.html.j2", - **get_template_items("Get a GNU/Linux install CD", db), - email = req["email"], - req = req, - id_ = id_ - ) - -@app.route("/random") -def serve_random(): - try: - tags = flask.request.args['tags'].split(" ") - except KeyError: - flask.abort(400) - - sbi = services.get_random_image(tags) - req = urllib.request.Request(sbi.imurl) - mediaContent = urllib.request.urlopen(req).read() - with open(os.path.join("static", "images", "random.jpg"), "wb") as f: - f.write(mediaContent) - - with database.Database() as db: - return flask.render_template( - "random.html.j2", - **get_template_items("random image", db), - sbi = sbi, - localimg = "/img/random.jpg?seed=%i" % random.randint(0, 9999) - ) - -@app.route("/questions") -def serve_questions(): - with database.Database() as db: - return flask.render_template( - "questions.html.j2", - **get_template_items("questions and answers", db), - qnas_link = CONFIG.get("qnas", "url"), - qnas = db.get_qnas() - ) - -if __name__ == "__main__": - try: - if sys.argv[1] == "--production": - #serve(TransLogger(app), host='127.0.0.1', port = 6969) - serve(TransLogger(app), host='0.0.0.0', port = 6969, threads = 32) - else: - app.run(host = "0.0.0.0", port = 5001, debug = True) - except IndexError: - app.run(host = "0.0.0.0", port = 5001, debug = True) diff --git a/cache.py b/cache.py deleted file mode 100644 index 5b66e43..0000000 --- a/cache.py +++ /dev/null @@ -1,18 +0,0 @@ -import database -import services - -def update_cache(): - print("Updating cache...") - with database.Database() as db: - db.update_commit_cache(services.request_recent_commits(since = db.get_last_commit_time())) - print("Finished adding github commits...") - db.append_qnas(services.scrape_whispa(db.config.get("qnas", "url"), since = db.get_oldest_qna())) - print("Finished parsing Q&As...") - - print("Started getting docker information with SSH...") - print(services.cache_all_docker_containers(services.CONFIG.get("ssh", "docker_key_path"))) - print("Finished caching.") - - -if __name__ == "__main__": - update_cache() \ No newline at end of file diff --git a/database.py b/database.py deleted file mode 100644 index 49de9ef..0000000 --- a/database.py +++ /dev/null @@ -1,248 +0,0 @@ -from urllib.parse import urlparse -from dataclasses import dataclass -from lxml import html -import configparser -import threading -import services -import operator -import datetime -import requests -import twython -import pymysql -import random -import os -import re - -@dataclass -class Database: - safeLogin:bool = True #automatically login with the user in the config file, who is read only - user:str = None #otherwise, login with the given username and passwd - passwd:str = None - - def __enter__(self): - self.config = configparser.ConfigParser(interpolation = None) - self.config.read(os.path.join(os.path.dirname(__file__), "edaweb.conf")) - - if self.safeLogin: - self.__connection = pymysql.connect( - **self.config["mysql"], - charset = "utf8mb4" - ) - else: - self.__connection = pymysql.connect( - user = self.user, - passwd = self.passwd, - host = self.config["mysql"]["host"], - db = self.config["mysql"]["db"], - charset = "utf8mb4" - ) - return self - - def __exit__(self, type, value, traceback): - self.__connection.commit() - self.__connection.close() - - def get_header_links(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT name, link FROM headerLinks ORDER BY name;") - return cursor.fetchall() - - def get_image(self, imageName): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT alt, url FROM images WHERE imageName = %s;", (imageName, )) - return cursor.fetchone() - - def get_pfp_images(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT alt, url FROM images WHERE pfp_img = 1;") - return cursor.fetchall() - - def get_sidebar_images(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT alt, url FROM images WHERE sidebar_image = 1;") - return cursor.fetchall() - - def get_header_articles(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT articleName, link FROM headerArticles;") - return cursor.fetchall() - - def get_all_categories(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT category_name FROM categories;") - return [i[0] for i in cursor.fetchall()] - - def add_category(self, category): - if not category in self.get_all_categories(): - with self.__connection.cursor() as cursor: - cursor.execute("INSERT INTO categories (category_name) VALUES (%s);", (category, )) - - self.__connection.commit() - return True - - return False - - def add_thought(self, category, title, markdown): - with self.__connection.cursor() as cursor: - cursor.execute(""" - INSERT INTO thoughts (category_id, title, markdown_text) - VALUES (( - SELECT category_id FROM categories WHERE category_name = %s - ), %s, %s);""", (category, title, markdown)) - self.__connection.commit() - - def get_thought(self, id_): - with self.__connection.cursor() as cursor: - cursor.execute(""" - SELECT categories.category_name, thoughts.title, thoughts.dt, thoughts.markdown_text, thoughts.redirect - FROM thoughts INNER JOIN categories - ON thoughts.category_id = categories.category_id - WHERE thought_id = %s;""", (id_, )) - return cursor.fetchone() - - def get_similar_thoughts(self, category, id_): - with self.__connection.cursor() as cursor: - cursor.execute(""" - SELECT thought_id, title, dt, category_name FROM thoughts - INNER JOIN categories ON thoughts.category_id = categories.category_id - WHERE category_name = %s AND thought_id != %s;""", - (category, id_)) - return cursor.fetchall() - - def get_featured_thoughts(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT thought_id, title FROM thoughts WHERE featured = 1;") - return cursor.fetchall() - - def update_thought_markdown(self, id_, markdown): - with self.__connection.cursor() as cursor: - cursor.execute("UPDATE thoughts SET markdown_text = %s WHERE thought_id = %s;", (markdown, id_)) - self.__connection.commit() - - def get_categories_not(self, category_name): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT category_name FROM categories WHERE category_name != %s;", (category_name, )) - return [i[0] for i in cursor.fetchall()] - - def get_all_thoughts(self): - with self.__connection.cursor() as cursor: - cursor.execute(""" - SELECT thought_id, title, dt, category_name FROM thoughts - INNER JOIN categories ON thoughts.category_id = categories.category_id; - """) - return cursor.fetchall() - - def get_cached_tweets(self, numToGet = None): - with self.__connection.cursor() as cursor: - sql = "SELECT tweet, tweet_id, account FROM diary WHERE account = %s ORDER BY tweeted_at DESC" - args = (self.config.get("twitter", "main_account"), ) - if numToGet is not None: - sql += " LIMIT %s;" - args = (self.config.get("twitter", "main_account"), numToGet) - else: - sql += ";" - cursor.execute(sql, args) - - return [(i[0], "https://%s/%s/status/%d" % (self.config.get("nitter", "outsideurl"), i[2], i[1])) for i in cursor.fetchall()] - - def get_cached_commits(self, since = None, recurse = True): - with self.__connection.cursor() as cursor: - if since is not None: - cursor.execute("SELECT DISTINCT message, url, commitTime, additions, deletions, total FROM commitCache WHERE commitTime > %s ORDER BY commitTime DESC;", (since, )) - else: - cursor.execute("SELECT DISTINCT message, url, commitTime, additions, deletions, total FROM commitCache ORDER BY commitTime DESC;") - # i think i might have spent too long doing functional programming - return [{ - "repo": urlparse(i[1]).path.split("/")[2], - "github_repo_url": "https://github.com" + "/".join(urlparse(i[1]).path.split("/")[:3]), - "git_repo_url": "https://%s/%s.git/about" % (self.config.get("github", "personal_domain"), urlparse(i[1]).path.split("/")[2]), - "message": i[0], - "github_commit_url": i[1], - "git_commit_url": "https://%s/%s.git/commit/?id=%s" % ( - self.config.get("github", "personal_domain"), - urlparse(i[1]).path.split("/")[2], - urlparse(i[1]).path.split("/")[-1] - ), - "datetime": i[2], - "stats": { - "additions": i[3], - "deletions": i[4], - "total": i[5] - } - } for i in cursor.fetchall()] - - def update_commit_cache(self, requested): - with self.__connection.cursor() as cursor: - for commit in requested: - cursor.execute("SELECT DISTINCT url FROM commitCache;") - urls = [i[0] for i in cursor.fetchall()] - - if commit["url"] not in urls: - cursor.execute(""" - INSERT INTO commitCache (message, url, commitTime, additions, deletions, total) - VALUES (%s, %s, %s, %s, %s, %s)""", - (commit["message"], commit["url"], commit["datetime"], commit["stats"]["additions"], commit["stats"]["deletions"], commit["stats"]["total"]) - ) - self.__connection.commit() - - def get_last_commit_time(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT MAX(commitTime) FROM commitCache;") - return cursor.fetchone()[0] - - def get_my_twitter(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT link FROM headerLinks WHERE name = 'twitter';") - return cursor.fetchone()[0] - - def get_my_diary_twitter(self): - return self.config.get("twitter", "diary_account") - - def get_iso_cd_options(self): - iso_dir = self.config.get("cds", "location") - return [ - i - for i in os.listdir(iso_dir) - if os.path.splitext(i)[-1].lower() in [".iso"] - and os.path.getsize(os.path.join(iso_dir, i)) < self.config.getint("cds", "maxsize") - ] - - def append_cd_orders(self, iso, email, house, street, city, county, postcode, name): - with self.__connection.cursor() as cursor: - cursor.execute(""" - INSERT INTO cd_orders_2 (iso, email, house, street, city, county, postcode, name) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s); - """, (iso, email, house, street, city, county, postcode, name)) - id_ = cursor.lastrowid - self.__connection.commit() - return id_ - - def append_qnas(self, qnas): - with self.__connection.cursor() as cursor: - for qna in qnas: - cursor.execute("SELECT curiouscat_id FROM qnas WHERE curiouscat_id = %s;", (qna["id"], )) - if cursor.fetchone() is None: - - cursor.execute("INSERT INTO `qnas` VALUES (%s, %s, %s, %s, %s, %s);", ( - qna["id"], qna["link"], qna["datetime"], qna["question"], qna["answer"], qna["host"] - )) - print("Appended question with timestamp %s" % qna["datetime"].isoformat()) - - else: - print("Skipped question with timestamp %s" % qna["datetime"].isoformat()) - self.__connection.commit() - - def get_oldest_qna(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT MAX(timestamp) FROM qnas;") - return cursor.fetchone()[0] - - def get_qnas(self): - with self.__connection.cursor() as cursor: - cursor.execute("SELECT * FROM qnas;") - return sorted(cursor.fetchall(), key = operator.itemgetter(2), reverse = True) - - - - - diff --git a/downloader.py b/downloader.py deleted file mode 100755 index 4b2af2f..0000000 --- a/downloader.py +++ /dev/null @@ -1,54 +0,0 @@ -from dataclasses import dataclass -from lxml import html -import requests -import shutil -import urllib -import os - -@dataclass -class CompressedImages: - nhentai_id: int - - def __enter__(self): - self.folderpath = os.path.join("static", str(self.nhentai_id)) - self.zippath = os.path.join("static", "zips", "%i.zip" % self.nhentai_id) - os.mkdir(self.folderpath) - - self.num_downloaded = self.download_images("https://nhentai.net/g/%i" % self.nhentai_id, self.folderpath, "nhentai.net") - - shutil.make_archive(self.zippath[:-4], "zip", self.folderpath) - - return self.zippath - - def __exit__(self, type, value, traceback): - # os.remove(self.zippath) - shutil.rmtree(self.folderpath) - - def download_images(self, url:str, out:str, domain:str) -> int: - tree = html.fromstring(requests.get(url).content) - for i, element in enumerate(tree.xpath("//a[@class='gallerythumb']"), 1): - imurl = self.get_img("https://%s%s" % (domain, element.get("href")), i) - print(imurl) - self.dl_img(imurl, out) - - return i - - def get_img(self, srcurl:str, num:int) -> str: - tree = html.fromstring(requests.get(srcurl).content) - for element in tree.xpath("//img"): - try: - if num == int(os.path.splitext(element.get("src").split("/")[-1])[0]): - return element.get("src") - except ValueError: - pass - - def dl_img(self, imurl, outpath:str): - req = urllib.request.Request(imurl, headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.50.2 (KHTML, like Gecko) Version/5.0.6 Safari/533.22.3'}) - mediaContent = urllib.request.urlopen(req).read() - with open(os.path.join(outpath, imurl.split("/")[-1]), "wb") as f: - f.write(mediaContent) - -if __name__ == "__main__": - with CompressedImages(306013) as zippath: - import subprocess - subprocess.run(["cp", zippath, "/home/eden/Downloads"]) \ No newline at end of file diff --git a/edaweb/app.py b/edaweb/app.py new file mode 100644 index 0000000..6902fe4 --- /dev/null +++ b/edaweb/app.py @@ -0,0 +1,256 @@ +from paste.translogger import TransLogger +from waitress import serve +from PIL import Image +import configparser +import transmission_rpc +import downloader +import datetime +import database +import services +import urllib +import random +import parser +import flask +import sys +import os +import io + +app = flask.Flask(__name__) +CONFIG = configparser.ConfigParser(interpolation = None) +CONFIG.read("edaweb.conf") +shown_images = set() +shown_sidebar_images = set() + +def get_pfp_img(db:database.Database): + global shown_images + dbimg = db.get_pfp_images() + if len(shown_images) == len(dbimg): + shown_images = set() + folder = set(dbimg).difference(shown_images) + choice = random.choice(list(folder)) + shown_images.add(choice) + return choice + +def get_sidebar_img(db:database.Database): + global shown_sidebar_images + dbimg = db.get_sidebar_images() + if len(shown_sidebar_images) == len(dbimg): + shown_sidebar_images = set() + folder = set(dbimg).difference(shown_sidebar_images) + choice = random.choice(list(folder)) + shown_sidebar_images.add(choice) + return choice + +def get_correct_article_headers(db:database.Database, title): + db_headers = list(db.get_header_articles()) + if title in [i[0] for i in db_headers]: + out = [] + for i in db_headers: + if i[0] != title: + out.append(i) + return out + [("index", "/~")] + else: + return db_headers + [("index", "/~")] + +def get_template_items(title, db): + return { + "links": db.get_header_links(), + "image": get_pfp_img(db), + "title": title, + "articles": get_correct_article_headers(db, title) + } + +@app.route("/") +@app.route("/~") +def index(): + with database.Database() as db: + with open(os.path.join(os.path.dirname(__file__), "static", "index.md"), "r") as f: + return flask.render_template( + "index.html.j2", + **get_template_items("eden's site :3", db), + days_till_ffs = datetime.datetime(2025, 11, 8) - datetime.datetime.now(), + markdown = parser.parse_text(f.read())[0], + featured_thoughts = db.get_featured_thoughts(), + commits = services.get_recent_commits(db)[:15], + sidebar_img = get_sidebar_img(db) + ) + +@app.route("/robots.txt") +def robots(): + return flask.send_from_directory("static", "robots.txt") + +@app.route("/services") +def serve_services(): + with database.Database() as db: + return flask.render_template( + "services.html.j2", + **get_template_items("services", db), + docker = services.get_all_docker_containers(), + trans = services.get_torrent_stats(), + pihole = services.get_pihole_stats() + ) + +@app.route("/discord") +def discord(): + with database.Database() as db: + return flask.render_template( + "discord.html.j2", + **get_template_items("discord", db), + discord = CONFIG["discord"]["username"] + ) + +@app.route("/thought") +def get_thought(): + thought_id = flask.request.args.get("id", type=int) + with database.Database() as db: + try: + category_name, title, dt, parsed, headers, redirect = parser.get_thought_from_id(db, thought_id) + # print(headers) + except TypeError: + flask.abort(404) + return + + if redirect is not None: + return flask.redirect(redirect, code = 301) + + return flask.render_template( + "thought.html.j2", + **get_template_items(title, db), + md_html = parsed, + contents_html = headers, + dt = "published: " + str(dt), + category = category_name, + othercategories = db.get_categories_not(category_name), + related = db.get_similar_thoughts(category_name, thought_id) + ) + +@app.route("/thoughts") +def get_thoughts(): + with database.Database() as db: + all_ = db.get_all_thoughts() + tree = {} + for id_, title, dt, category in all_: + if category not in tree.keys(): + tree[category] = [(id_, title, dt)] + else: + tree[category].append((id_, title, str(dt))) + + return flask.render_template( + "thoughts.html.j2", + **get_template_items("thoughts", db), + tree = tree + ) + +@app.route("/img/") +def serve_image(filename): + imdirpath = os.path.join(os.path.dirname(__file__), "static", "images") + if filename in os.listdir(imdirpath): + try: + w = int(flask.request.args['w']) + h = int(flask.request.args['h']) + except (KeyError, ValueError): + return flask.send_from_directory(imdirpath, filename) + + img = Image.open(os.path.join(imdirpath, filename)) + img.thumbnail((w, h), Image.LANCZOS) + io_ = io.BytesIO() + img.save(io_, format='JPEG') + return flask.Response(io_.getvalue(), mimetype='image/jpeg') + else: + flask.abort(404) + +@app.route("/nhdl") +def serve_nhdl(): + with database.Database() as db: + try: + nhentai_id = int(flask.request.args["id"]) + with downloader.CompressedImages(nhentai_id) as zippath: + # return app.send_static_file(os.path.split(zippath)[-1]) + return flask.redirect("/zip/%s" % os.path.split(zippath)[-1]) + + except (KeyError, ValueError): + return flask.render_template( + "nhdl.html.j2", + **get_template_items("Hentai Downloader", db) + ) + +@app.route("/isocd") +def serve_iso_form(): + with database.Database() as db: + return flask.render_template( + "isocd.html.j2", + **get_template_items("Get a GNU/Linux install CD", db), + iso_options = db.get_iso_cd_options() + ) + +@app.route("/zip/") +def serve_zip(zipfile): + return flask.send_from_directory(os.path.join(os.path.dirname(__file__), "static", "zips"), zipfile) + +@app.route("/pdf/") +def serve_pdf(pdfname): + return flask.send_from_directory(os.path.join(os.path.dirname(__file__), "static", "papers"), pdfname) + +@app.route("/nhdlredirect", methods = ["POST"]) +def redirect_nhdl(): + req = dict(flask.request.form) + try: + return flask.redirect("/nhdl?id=%i" % int(req["number_input"])) + except (TypeError, ValueError, KeyError): + flask.abort(400) + +@app.route("/getisocd", methods = ["POST"]) +def get_iso_cd(): + req = dict(flask.request.form) + print(req) + with database.Database() as db: + id_ = db.append_cd_orders(**req) + print(id_) + return flask.render_template( + "isocd_confirmation.html.j2", + **get_template_items("Get a GNU/Linux install CD", db), + email = req["email"], + req = req, + id_ = id_ + ) + +@app.route("/random") +def serve_random(): + try: + tags = flask.request.args['tags'].split(" ") + except KeyError: + flask.abort(400) + + sbi = services.get_random_image(tags) + req = urllib.request.Request(sbi.imurl) + mediaContent = urllib.request.urlopen(req).read() + with open(os.path.join("static", "images", "random.jpg"), "wb") as f: + f.write(mediaContent) + + with database.Database() as db: + return flask.render_template( + "random.html.j2", + **get_template_items("random image", db), + sbi = sbi, + localimg = "/img/random.jpg?seed=%i" % random.randint(0, 9999) + ) + +@app.route("/questions") +def serve_questions(): + with database.Database() as db: + return flask.render_template( + "questions.html.j2", + **get_template_items("questions and answers", db), + qnas_link = CONFIG.get("qnas", "url"), + qnas = db.get_qnas() + ) + +if __name__ == "__main__": + try: + if sys.argv[1] == "--production": + #serve(TransLogger(app), host='127.0.0.1', port = 6969) + serve(TransLogger(app), host='0.0.0.0', port = 6969, threads = 32) + else: + app.run(host = "0.0.0.0", port = 5001, debug = True) + except IndexError: + app.run(host = "0.0.0.0", port = 5001, debug = True) diff --git a/edaweb/cache.py b/edaweb/cache.py new file mode 100644 index 0000000..5b66e43 --- /dev/null +++ b/edaweb/cache.py @@ -0,0 +1,18 @@ +import database +import services + +def update_cache(): + print("Updating cache...") + with database.Database() as db: + db.update_commit_cache(services.request_recent_commits(since = db.get_last_commit_time())) + print("Finished adding github commits...") + db.append_qnas(services.scrape_whispa(db.config.get("qnas", "url"), since = db.get_oldest_qna())) + print("Finished parsing Q&As...") + + print("Started getting docker information with SSH...") + print(services.cache_all_docker_containers(services.CONFIG.get("ssh", "docker_key_path"))) + print("Finished caching.") + + +if __name__ == "__main__": + update_cache() \ No newline at end of file diff --git a/edaweb/database.py b/edaweb/database.py new file mode 100644 index 0000000..dab56e7 --- /dev/null +++ b/edaweb/database.py @@ -0,0 +1,248 @@ +from urllib.parse import urlparse +from dataclasses import dataclass +from lxml import html +import configparser +import threading +import services +import operator +import datetime +import requests +import twython +import pymysql +import random +import os +import re + +@dataclass +class Database: + safeLogin:bool = True #automatically login with the user in the config file, who is read only + user:str = None #otherwise, login with the given username and passwd + passwd:str = None + + def __enter__(self): + self.config = configparser.ConfigParser(interpolation = None) + self.config.read(os.path.join(os.path.dirname(__file__), "edaweb.conf")) + + if self.safeLogin: + self.__connection = pymysql.connect( + **self.config["mysql"], + charset = "utf8mb4" + ) + else: + self.__connection = pymysql.connect( + user = self.user, + passwd = self.passwd, + host = self.config["mysql"]["host"], + db = self.config["mysql"]["db"], + charset = "utf8mb4" + ) + return self + + def __exit__(self, type, value, traceback): + self.__connection.commit() + self.__connection.close() + + def get_header_links(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT name, link FROM headerLinks ORDER BY name;") + return cursor.fetchall() + + def get_image(self, imageName): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT alt, url FROM images WHERE imageName = %s;", (imageName, )) + return cursor.fetchone() + + def get_pfp_images(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT alt, url FROM images WHERE pfp_img = 1;") + return cursor.fetchall() + + def get_sidebar_images(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT alt, url FROM images WHERE sidebar_image = 1;") + return cursor.fetchall() + + def get_header_articles(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT articleName, link FROM headerArticles;") + return cursor.fetchall() + + def get_all_categories(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT category_name FROM categories;") + return [i[0] for i in cursor.fetchall()] + + def add_category(self, category): + if not category in self.get_all_categories(): + with self.__connection.cursor() as cursor: + cursor.execute("INSERT INTO categories (category_name) VALUES (%s);", (category, )) + + self.__connection.commit() + return True + + return False + + def add_thought(self, category, title, markdown): + with self.__connection.cursor() as cursor: + cursor.execute(""" + INSERT INTO thoughts (category_id, title, markdown_text) + VALUES (( + SELECT category_id FROM categories WHERE category_name = %s + ), %s, %s);""", (category, title, markdown)) + self.__connection.commit() + + def get_thought(self, id_): + with self.__connection.cursor() as cursor: + cursor.execute(""" + SELECT categories.category_name, thoughts.title, thoughts.dt, thoughts.markdown_text, thoughts.redirect + FROM thoughts INNER JOIN categories + ON thoughts.category_id = categories.category_id + WHERE thought_id = %s;""", (id_, )) + return cursor.fetchone() + + def get_similar_thoughts(self, category, id_): + with self.__connection.cursor() as cursor: + cursor.execute(""" + SELECT thought_id, title, dt, category_name FROM thoughts + INNER JOIN categories ON thoughts.category_id = categories.category_id + WHERE category_name = %s AND thought_id != %s;""", + (category, id_)) + return cursor.fetchall() + + def get_featured_thoughts(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT thought_id, title FROM thoughts WHERE featured = 1;") + return cursor.fetchall() + + def update_thought_markdown(self, id_, markdown): + with self.__connection.cursor() as cursor: + cursor.execute("UPDATE thoughts SET markdown_text = %s WHERE thought_id = %s;", (markdown, id_)) + self.__connection.commit() + + def get_categories_not(self, category_name): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT category_name FROM categories WHERE category_name != %s;", (category_name, )) + return [i[0] for i in cursor.fetchall()] + + def get_all_thoughts(self): + with self.__connection.cursor() as cursor: + cursor.execute(""" + SELECT thought_id, title, dt, category_name FROM thoughts + INNER JOIN categories ON thoughts.category_id = categories.category_id; + """) + return cursor.fetchall() + + def get_cached_tweets(self, numToGet = None): + with self.__connection.cursor() as cursor: + sql = "SELECT tweet, tweet_id, account FROM diary WHERE account = %s ORDER BY tweeted_at DESC" + args = (self.config.get("twitter", "main_account"), ) + if numToGet is not None: + sql += " LIMIT %s;" + args = (self.config.get("twitter", "main_account"), numToGet) + else: + sql += ";" + cursor.execute(sql, args) + + return [(i[0], "https://%s/%s/status/%d" % (self.config.get("nitter", "outsideurl"), i[2], i[1])) for i in cursor.fetchall()] + + def get_cached_commits(self, since = None, recurse = True): + with self.__connection.cursor() as cursor: + if since is not None: + cursor.execute("SELECT DISTINCT message, url, commitTime, additions, deletions, total FROM commitCache WHERE commitTime > %s ORDER BY commitTime DESC;", (since, )) + else: + cursor.execute("SELECT DISTINCT message, url, commitTime, additions, deletions, total FROM commitCache ORDER BY commitTime DESC;") + # i think i might have spent too long doing functional programming + return [{ + "repo": urlparse(i[1]).path.split("/")[2], + "github_repo_url": "https://github.com" + "/".join(urlparse(i[1]).path.split("/")[:3]), + "git_repo_url": "https://%s/%s.git/about" % (self.config.get("github", "personal_domain"), urlparse(i[1]).path.split("/")[2]), + "message": i[0], + "github_commit_url": i[1], + "git_commit_url": "https://%s/%s.git/commit/?id=%s" % ( + self.config.get("github", "personal_domain"), + urlparse(i[1]).path.split("/")[2], + urlparse(i[1]).path.split("/")[-1] + ), + "datetime": i[2].timestamp(), + "stats": { + "additions": i[3], + "deletions": i[4], + "total": i[5] + } + } for i in cursor.fetchall()] + + def update_commit_cache(self, requested): + with self.__connection.cursor() as cursor: + for commit in requested: + cursor.execute("SELECT DISTINCT url FROM commitCache;") + urls = [i[0] for i in cursor.fetchall()] + + if commit["url"] not in urls: + cursor.execute(""" + INSERT INTO commitCache (message, url, commitTime, additions, deletions, total) + VALUES (%s, %s, %s, %s, %s, %s)""", + (commit["message"], commit["url"], commit["datetime"], commit["stats"]["additions"], commit["stats"]["deletions"], commit["stats"]["total"]) + ) + self.__connection.commit() + + def get_last_commit_time(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT MAX(commitTime) FROM commitCache;") + return cursor.fetchone()[0] + + def get_my_twitter(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT link FROM headerLinks WHERE name = 'twitter';") + return cursor.fetchone()[0] + + def get_my_diary_twitter(self): + return self.config.get("twitter", "diary_account") + + def get_iso_cd_options(self): + iso_dir = self.config.get("cds", "location") + return [ + i + for i in os.listdir(iso_dir) + if os.path.splitext(i)[-1].lower() in [".iso"] + and os.path.getsize(os.path.join(iso_dir, i)) < self.config.getint("cds", "maxsize") + ] + + def append_cd_orders(self, iso, email, house, street, city, county, postcode, name): + with self.__connection.cursor() as cursor: + cursor.execute(""" + INSERT INTO cd_orders_2 (iso, email, house, street, city, county, postcode, name) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s); + """, (iso, email, house, street, city, county, postcode, name)) + id_ = cursor.lastrowid + self.__connection.commit() + return id_ + + def append_qnas(self, qnas): + with self.__connection.cursor() as cursor: + for qna in qnas: + cursor.execute("SELECT curiouscat_id FROM qnas WHERE curiouscat_id = %s;", (qna["id"], )) + if cursor.fetchone() is None: + + cursor.execute("INSERT INTO `qnas` VALUES (%s, %s, %s, %s, %s, %s);", ( + qna["id"], qna["link"], qna["datetime"], qna["question"], qna["answer"], qna["host"] + )) + print("Appended question with timestamp %s" % qna["datetime"].isoformat()) + + else: + print("Skipped question with timestamp %s" % qna["datetime"].isoformat()) + self.__connection.commit() + + def get_oldest_qna(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT MAX(timestamp) FROM qnas;") + return cursor.fetchone()[0] + + def get_qnas(self): + with self.__connection.cursor() as cursor: + cursor.execute("SELECT * FROM qnas;") + return sorted(cursor.fetchall(), key = operator.itemgetter(2), reverse = True) + + + + + diff --git a/edaweb/downloader.py b/edaweb/downloader.py new file mode 100644 index 0000000..4b2af2f --- /dev/null +++ b/edaweb/downloader.py @@ -0,0 +1,54 @@ +from dataclasses import dataclass +from lxml import html +import requests +import shutil +import urllib +import os + +@dataclass +class CompressedImages: + nhentai_id: int + + def __enter__(self): + self.folderpath = os.path.join("static", str(self.nhentai_id)) + self.zippath = os.path.join("static", "zips", "%i.zip" % self.nhentai_id) + os.mkdir(self.folderpath) + + self.num_downloaded = self.download_images("https://nhentai.net/g/%i" % self.nhentai_id, self.folderpath, "nhentai.net") + + shutil.make_archive(self.zippath[:-4], "zip", self.folderpath) + + return self.zippath + + def __exit__(self, type, value, traceback): + # os.remove(self.zippath) + shutil.rmtree(self.folderpath) + + def download_images(self, url:str, out:str, domain:str) -> int: + tree = html.fromstring(requests.get(url).content) + for i, element in enumerate(tree.xpath("//a[@class='gallerythumb']"), 1): + imurl = self.get_img("https://%s%s" % (domain, element.get("href")), i) + print(imurl) + self.dl_img(imurl, out) + + return i + + def get_img(self, srcurl:str, num:int) -> str: + tree = html.fromstring(requests.get(srcurl).content) + for element in tree.xpath("//img"): + try: + if num == int(os.path.splitext(element.get("src").split("/")[-1])[0]): + return element.get("src") + except ValueError: + pass + + def dl_img(self, imurl, outpath:str): + req = urllib.request.Request(imurl, headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.50.2 (KHTML, like Gecko) Version/5.0.6 Safari/533.22.3'}) + mediaContent = urllib.request.urlopen(req).read() + with open(os.path.join(outpath, imurl.split("/")[-1]), "wb") as f: + f.write(mediaContent) + +if __name__ == "__main__": + with CompressedImages(306013) as zippath: + import subprocess + subprocess.run(["cp", zippath, "/home/eden/Downloads"]) \ No newline at end of file diff --git a/edaweb/parser.py b/edaweb/parser.py new file mode 100644 index 0000000..00daf3b --- /dev/null +++ b/edaweb/parser.py @@ -0,0 +1,209 @@ +#!/usr/bin/env python3 + +from urllib.parse import urlparse +from pygments import highlight +from pygments.formatters import HtmlFormatter, ClassNotFound +from pygments.lexers import get_lexer_by_name +import urllib.parse +import webbrowser +import lxml.etree +import lxml.html +import database +import argparse +import getpass +import houdini +import mistune +import jinja2 +import app +import sys +import re +import os + +class EdawebRenderer(mistune.HTMLRenderer): + def blockcode(self, text, lang): + try: + lexer = get_lexer_by_name(lang, stripall=True) + except ClassNotFound: + lexer = None + + if lexer: + formatter = HtmlFormatter() + return highlight(text, lexer, formatter) + # default + return '\n
{}
\n'.format(houdini.escape_html(text.strip())) + + def block_quote(self, content): + content = content[3:-5] # idk why this is required... + out = '\n
' + for line in houdini.escape_html(content.strip()).split("\n"): + out += '\n{}
'.format(line) + return out + '\n
' + + def image(self, link, text, title): + return "%s" % ( + urlparse(link)._replace(query='').geturl(), text, link + ) + + def heading(self, text, level): + hash_ = urllib.parse.quote_plus(text) + return "%s [#]" % ( + level, hash_, text, hash_, level + ) + + # it would appear that the escape=False option does not work with custom renderers, + # so we set it to True and just have these silly function stubs to include them manually + def inline_html(self, html): + return html + + def block_html(self, html): + return html + +def get_thought_from_id(db, id_): + category_name, title, dt, markdown, redirect = db.get_thought(id_) + html, headers = parse_text(markdown) + return category_name, title, dt, html, headers, redirect + +def parse_file(path): + with open(path, "r") as f: + unformatted = f.read() + + return parse_text(unformatted)[0] + +def parse_text(unformatted): + md = mistune.create_markdown( + renderer = EdawebRenderer(), + plugins = ["strikethrough", "table", "url", "task_lists", "def_list"], + # escape = False + ) + html = md(unformatted) + if html == "": + return "", "" + + return html, get_headers(html) + +def get_headers(html): + root = lxml.html.fromstring(html) + + headers = [] + thesmallestlevel = 7 + for node in root.xpath('//h1|//h2|//h3|//h4|//h5//h6'): + level = int(node.tag[-1]) + if level < thesmallestlevel: + thesmallestlevel = level + headers.append(( + # lxml.etree.tostring(node), + # "

%s

" % urllib.parse.unquote_plus(node.attrib["id"]), # possibly insecure? + urllib.parse.unquote_plus(node.attrib["id"]), + level, # -horrible hack + "#%s" % node.attrib["id"]) + ) + + headers = [(i[0], i[1] - thesmallestlevel, i[2]) for i in headers] + # print(headers) + # there is a bug here- + # it must start with the largest header and only go up and down in increments of one + # TODO: fix it! + md_template = jinja2.Template(""" +{% for text, depth, link in contents %} +{{ " " * depth }} - [{{ text }}]({{ link }}) +{% endfor %} + """) + + return mistune.html(md_template.render(contents = headers)) + +def main(): + p = argparse.ArgumentParser() + subparse = p.add_subparsers(help = "sub-command help") + save_parser = subparse.add_parser("save", help = "Add a markdown file to the database") + echo_parser = subparse.add_parser("echo", help = "Print markdown render to stdout") + update_parser = subparse.add_parser("update", help = "Replace a markdown file") + export_parser = subparse.add_parser("export", help = "Export a database markdown file to disk") + list_parser = subparse.add_parser("list", help = "List all the markdowns in the database") + + for s in [save_parser, echo_parser, update_parser]: + s.add_argument( + "-m", "--markdown", + help = "Path to a markdown file", + type = str, + required = True + ) + + for s in [save_parser]: + s.add_argument( + "-t", "--title", + help = "Article title", + type = str, + required = True + ) + s.add_argument( + "-c", "--category", + help = "Article category", + type = str, + required = True + ) + + for s in [save_parser, update_parser, export_parser, list_parser]: + s.add_argument( + "-u", "--username", + help = "Username to use for the database", + type = str, + required = True + ) + + for s in [export_parser, update_parser]: + s.add_argument( + "-i", "--id", + help = "Article's id", + type = int, + required = True + ) + + export_parser.add_argument( + "-o", "--out", + help = "Path to write the markdown file to", + type = str, + required = True + ) + + args = vars(p.parse_args()) + + if "username" in args.keys(): + args["password"] = getpass.getpass("Enter password for %s@%s: " % (args["username"], app.CONFIG["mysql"]["host"])) + + try: + verb = sys.argv[1] + except IndexError: + print("No verb specified... Nothing to do... Exiting...") + exit() + + if verb in ["save", "export", "update", "list"]: + with database.Database( + safeLogin = False, + user = args["username"], + passwd = args["password"] + ) as db: + if verb == "save": + if db.add_category(args["category"]): + print("Added category...") + with open(args["markdown"], "r") as f: + db.add_thought(args["category"], args["title"], f.read()) + print("Added thought...") + + elif verb == "export": + with open(args["out"], "w") as f: + f.writelines(db.get_thought(args["id"])[-2]) + print("Written to %s" % args["out"]) + + elif verb == "update": + with open(args["markdown"], "r") as f: + db.update_thought_markdown(args["id"], f.read()) + + elif verb == "list": + for id_, title, dt, category_name in db.get_all_thoughts(): + print("%d\t%s\t%s\t%s" % (id_, title, dt, category_name)) + + elif verb == "echo": + print(parse_file(args["markdown"])) + +if __name__ == "__main__": + main() diff --git a/edaweb/services.py b/edaweb/services.py new file mode 100644 index 0000000..87af050 --- /dev/null +++ b/edaweb/services.py @@ -0,0 +1,365 @@ +from dataclasses import dataclass +from io import StringIO +from lxml import html, etree +from github import Github +import multiprocessing +import paramiko.client +from APiHole import PiHole +import transmission_rpc +import configparser +import math as maths +import requests +import datetime +import urllib +import docker +import random +import subprocess +import fabric +import pickle +import queue +import json +import time +import os + +theLastId = 0 +CONFIG = configparser.ConfigParser(interpolation = None) +CONFIG.read(os.path.join(os.path.dirname(__file__), "edaweb.conf")) + +def humanbytes(B): + 'Return the given bytes as a human friendly KB, MB, GB, or TB string' + B = float(B) + KB = float(1024) + MB = float(KB ** 2) # 1,048,576 + GB = float(KB ** 3) # 1,073,741,824 + TB = float(KB ** 4) # 1,099,511,627,776 + + if B < KB: + return '{0} {1}'.format(B,'Bytes' if 0 == B > 1 else 'Byte') + elif KB <= B < MB: + return '{0:.2f} KB'.format(B/KB) + elif MB <= B < GB: + return '{0:.2f} MB'.format(B/MB) + elif GB <= B < TB: + return '{0:.2f} GB'.format(B/GB) + elif TB <= B: + return '{0:.2f} TB'.format(B/TB) + +@dataclass +class SafebooruImage: + id_: int + url: str + searchTags: list + tags: list + source: str + imurl: str + + def remove_tag(self, tag): + return list(set(self.searchTags).difference(set([tag]))) + +@dataclass +class DownloadedImage: + imurl: str + + def __enter__(self): + self.filename = os.path.join("static", "images", "random.jpg") + + req = urllib.request.Request(self.imurl, headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.50.2 (KHTML, like Gecko) Version/5.0.6 Safari/533.22.3'}) + mediaContent = urllib.request.urlopen(req).read() + with open(self.filename, "wb") as f: + f.write(mediaContent) + return self.filename + + def __exit__(self, type, value, traceback): + os.remove(self.filename) + +def get_num_pages(tags): + pages_url = "https://safebooru.org/index.php?page=post&s=list&tags=%s" % "+".join(tags) + tree = html.fromstring(requests.get(pages_url).content) + try: + finalpage_element = tree.xpath("/html/body/div[6]/div/div[2]/div[2]/div/a[12]")[0] + except IndexError: + return 1 + else: + return int(int(urllib.parse.parse_qs(finalpage_element.get("href"))["pid"][0]) / (5*8)) + +def get_id_from_url(url): + return int(urllib.parse.parse_qs(url)["id"][0]) + +def get_random_image(tags): + global theLastId + searchPage = random.randint(1, get_num_pages(tags)) * 5 * 8 + url = "https://safebooru.org/index.php?page=post&s=list&tags=%s&pid=%i" % ("+".join(tags), searchPage) + tree = html.fromstring(requests.get(url).content) + + imageElements = [e for e in tree.xpath("/html/body/div[6]/div/div[2]/div[1]")[0].iter(tag = "a")] + try: + element = random.choice(imageElements) + except IndexError: + # raise ConnectionError("Couldn't find any images") + return get_random_image(tags) + + url = "https://safebooru.org/" + element.get("href") + if get_id_from_url(url) == theLastId: + return get_random_image(tags) + theLastId = get_id_from_url(url) + + try: + sbi = SafebooruImage( + id_ = get_id_from_url(url), + url = url, + tags = element.find("img").get("alt").split(), + searchTags = tags, + source = fix_source_url(get_source(url)), + imurl = get_imurl(url) + ) + except (ConnectionError, KeyError) as e: + print("[ERROR]", e) + return get_random_image(tags) + + if link_deleted(sbi.url): + print("Retried since the source was deleted...") + return get_random_image(tags) + + return sbi + +def get_source(url): + tree = html.fromstring(requests.get(url).content) + for element in tree.xpath('//*[@id="stats"]')[0].iter("li"): + if element.text.startswith("Source: h"): + return element.text[8:] + elif element.text.startswith("Source:"): + for child in element.iter(): + if child.get("href") is not None: + return child.get("href") + raise ConnectionError("Couldn't find source image for id %i" % get_id_from_url(url)) + +def fix_source_url(url): + parsed = urllib.parse.urlparse(url) + if parsed.netloc == "www.pixiv.net": + return "https://www.pixiv.net/en/artworks/" + urllib.parse.parse_qs(parsed.query)["illust_id"][0] + elif parsed.netloc in ["bishie.booru.org", "www.secchan.net"]: + return ConnectionError("Couldn't get source") + elif "pximg.net" in parsed.netloc or "pixiv.net" in parsed.netloc: + return "https://www.pixiv.net/en/artworks/" + parsed.path.split("/")[-1][:8] + elif parsed.netloc == "twitter.com": + return url.replace("twitter.com", "nitter.eda.gay") + return url + +def get_imurl(url): + tree = html.fromstring(requests.get(url).content) + return tree.xpath('//*[@id="image"]')[0].get("src") + +def link_deleted(url): + text = requests.get(url).text + return text[text.find("") + 7 : text.find("")] in ["Error | nitter", "イラストコミュニケーションサービス[pixiv]"] + +def request_recent_commits(since = datetime.datetime.now() - datetime.timedelta(days=7)): + g = Github(CONFIG.get("github", "access_code")) + out = [] + for repo in g.get_user().get_repos(): + # print(repo.name, list(repo.get_branches())) + try: + for commit in repo.get_commits(since = since): + out.append({ + "repo": repo.name, + "message": commit.commit.message, + "url": commit.html_url, + "datetime": commit.commit.author.date, + "stats": { + "additions": commit.stats.additions, + "deletions": commit.stats.deletions, + "total": commit.stats.total + } + }) + except Exception as e: + print(repo, e) + + return sorted(out, key = lambda a: a["datetime"], reverse = True) + +def scrape_nitter(username, get_until:int): + new_tweets = [] + nitter_url = CONFIG.get("nitter", "internalurl") + nitter_port = CONFIG.getint("nitter", "internalport") + scrape_new_pages = True + url = "http://%s:%d/%s" % (nitter_url, nitter_port, username) + + while scrape_new_pages: + tree = html.fromstring(requests.get(url).content) + for i, tweetUrlElement in enumerate(tree.xpath('//*[@class="tweet-link"]'), 0): + if i > 0 and tweetUrlElement.get("href").split("/")[1] == username: + id_ = int(urllib.parse.urlparse(tweetUrlElement.get("href")).path.split("/")[-1]) + tweet_link = "http://%s:%d%s" % (nitter_url, nitter_port, tweetUrlElement.get("href")) + + if id_ == get_until: + scrape_new_pages = False + break + + try: + dt, replying_to, text, images = parse_tweet(tweet_link) + new_tweets.append((id_, dt, replying_to, text, username, images)) + print(dt, "'%s'" % text) + except IndexError: + print("Couldn't get any more tweets") + scrape_new_pages = False + break + except ConnectionError: + print("Rate limited, try again later") + return [] + + + try: + cursor = tree.xpath('//*[@class="show-more"]/a')[0].get("href") + except IndexError: + # no more elements + break + url = "http://%s:%d/%s%s" % (nitter_url, nitter_port, username, cursor) + + return new_tweets + +def parse_tweet(tweet_url): + # print(tweet_url) + tree = html.fromstring(requests.get(tweet_url).content) + # with open("2images.html", "r") as f: + # tree = html.fromstring(f.read()) + + rate_limited_elem = tree.xpath("/html/body/div/div/div/span") + if rate_limited_elem != []: + if rate_limited_elem[0].text == "Instance has been rate limited.": + raise ConnectionError("Instance has been rate limited.") + + main_tweet_elem = tree.xpath('//*[@class="main-tweet"]')[0] + + dt_str = main_tweet_elem.xpath('//*[@class="tweet-published"]')[0].text + dt = datetime.datetime.strptime(dt_str.replace("Â", ""), "%b %d, %Y · %I:%M %p UTC") + text = tree.xpath('//*[@class="main-tweet"]/div/div/div[2]')[0].text_content() + if text == "": + text = "[Image only]" + replying_to_elems = tree.xpath('//*[@class="before-tweet thread-line"]/div/a') + if replying_to_elems != []: + replying_to = int(urllib.parse.urlparse(replying_to_elems[-1].get("href")).path.split("/")[-1]) + else: + replying_to = None + + images = [] + images_elems = tree.xpath('//*[@class="main-tweet"]/div/div/div[3]/div/div/a/img') + for image_elem in images_elems: + images.append("https://" + CONFIG.get("nitter", "outsideurl") + urllib.parse.urlparse(image_elem.get("src")).path) + + return dt, replying_to, text, images + +def scrape_whispa(whispa_url, since): + tree = html.fromstring(requests.get(whispa_url).content.decode()) + qnas = [] + # we're not doing proper HTML scraping here really... since the site uses client side rendering + # we rather parse the JS scripts to get the JSON payload of useful information... sadly this looks horrible + for i, script in enumerate(tree.xpath("/html/body/script"), 0): + js = str(script.text) + if "receivedFeedback" in js: + # my god this is horrible... + for j in json.loads(json.loads(js[19:-1])[1][2:])[0][3]["loadedUser"]["receivedFeedback"]: + dt = datetime.datetime.fromisoformat(j["childFeedback"][0]["createdAt"][:-1]) + + qnas.append({ + # "id": int(str(maths.modf(maths.log(int(j["id"], 16)))[0])[2:]), + "id": int(dt.timestamp()), + "link": None, + "datetime": dt, + "question": j["content"], + "answer": j["childFeedback"][0]["content"], + "host": "whispa.sh" + }) + return qnas + +def get_docker_containers(host, ssh_key_path): + result = fabric.Connection( + host = host, + user = "root", + connect_kwargs = { + "key_filename": ssh_key_path, + "look_for_keys": False + } + ).run('docker ps -a -s --format "table {{.Names}};{{.Status}};{{.Image}}"', hide = True) + return [line.split(";") for line in result.stdout.split("\n")[1:-1]] + +def cache_all_docker_containers(ssh_key_path): + containers = {} + containers["containers"] = {} + for host, name in CONFIG["docker_hosts"].items(): + print(host) + containers["containers"][(host, name)] = get_docker_containers(host, ssh_key_path) + + containers["cachetime"] = "Docker information last updated at %s" % str(datetime.datetime.now()) + with open("/tmp/docker-cache.json", "wb") as f: + pickle.dump(containers, f) + +def get_all_docker_containers(): + if not os.path.exists("/tmp/docker-cache.json"): + return {"containers": {}, "cachetime": "No cached docker information"} + + with open("/tmp/docker-cache.json", "rb") as f: + return pickle.load(f) + +def timeout(func): + # cant get this to work with queue.Queue() for some reason? + # this works but Manager() uses an extra thread than Queue() + manager = multiprocessing.Manager() + returnVan = manager.list() + # ti = time.time() + + def runFunc(q, func): + q.append(func()) + + def beginTimeout(): + t = multiprocessing.Process(target = runFunc, args = (returnVan, func)) + t.start() + + t.join(timeout = CONFIG["servicetimeout"].getint("seconds")) + + # print("Request took:", time.time() - ti) + try: + return returnVan[0] + except IndexError: + if t.is_alive(): + t.terminate() + + return beginTimeout + +@timeout +def get_torrent_stats(): + client = transmission_rpc.client.Client( + host = CONFIG.get("transmission", "host") + ) + s = vars(client.session_stats())["fields"] + return { + "Active torrents:": s["activeTorrentCount"], + "Downloaded:": humanbytes(s["cumulative-stats"]["downloadedBytes"]), + "Uploaded:": humanbytes(s["cumulative-stats"]["uploadedBytes"]), + "Active time:": str(datetime.timedelta(seconds = s["cumulative-stats"]["secondsActive"])), + "Files added:": s["cumulative-stats"]["filesAdded"], + "Current upload speed": humanbytes(s["uploadSpeed"]) + "s/S", + "Current download speed:": humanbytes(s["downloadSpeed"]) + "s/S" + } + +@timeout +def get_pihole_stats(): + return PiHole.GetSummary(CONFIG.get("pihole", "url"), CONFIG.get("pihole", "key"), True) + +def get_recent_commits(db, max_per_repo = 3): + cache = db.get_cached_commits() + num_per_repo = {} + out = [] + for commit in cache: + if commit["repo"] not in num_per_repo.keys(): + num_per_repo[commit["repo"]] = 0 + + num_per_repo[commit["repo"]] += 1 + if num_per_repo[commit["repo"]] <= max_per_repo: + out.append(commit) + + return sorted(out, key = lambda a: a["datetime"], reverse = True) + +if __name__ == "__main__": + import database + + with database.Database() as db: + print(json.dumps(get_recent_commits(db), indent=4)) diff --git a/edaweb/static/images/0don0t4ofuc41-3776935852.jpg b/edaweb/static/images/0don0t4ofuc41-3776935852.jpg new file mode 100644 index 0000000..f65e951 Binary files /dev/null and b/edaweb/static/images/0don0t4ofuc41-3776935852.jpg differ diff --git a/edaweb/static/images/1544552064683.jpg b/edaweb/static/images/1544552064683.jpg new file mode 100644 index 0000000..20a6527 Binary files /dev/null and b/edaweb/static/images/1544552064683.jpg differ diff --git a/edaweb/static/images/1549844950404.jpg b/edaweb/static/images/1549844950404.jpg new file mode 100644 index 0000000..5197c11 Binary files /dev/null and b/edaweb/static/images/1549844950404.jpg differ diff --git a/edaweb/static/images/1555824429083.png b/edaweb/static/images/1555824429083.png new file mode 100644 index 0000000..5b2fd0b Binary files /dev/null and b/edaweb/static/images/1555824429083.png differ diff --git a/edaweb/static/images/1555824491105.png b/edaweb/static/images/1555824491105.png new file mode 100644 index 0000000..2e20fca Binary files /dev/null and b/edaweb/static/images/1555824491105.png differ diff --git a/edaweb/static/images/1671540582317176.png b/edaweb/static/images/1671540582317176.png new file mode 100644 index 0000000..dd741d3 Binary files /dev/null and b/edaweb/static/images/1671540582317176.png differ diff --git a/edaweb/static/images/1urouter.jpg b/edaweb/static/images/1urouter.jpg new file mode 100644 index 0000000..b295e59 Binary files /dev/null and b/edaweb/static/images/1urouter.jpg differ diff --git a/edaweb/static/images/20220401_222149.jpg b/edaweb/static/images/20220401_222149.jpg new file mode 100644 index 0000000..d9fecae Binary files /dev/null and b/edaweb/static/images/20220401_222149.jpg differ diff --git a/edaweb/static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg b/edaweb/static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg new file mode 100644 index 0000000..cede48f Binary files /dev/null and b/edaweb/static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg differ diff --git a/edaweb/static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg b/edaweb/static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg new file mode 100644 index 0000000..1f75924 Binary files /dev/null and b/edaweb/static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg differ diff --git a/edaweb/static/images/5600x.jpg b/edaweb/static/images/5600x.jpg new file mode 100644 index 0000000..f3995b2 Binary files /dev/null and b/edaweb/static/images/5600x.jpg differ diff --git a/edaweb/static/images/9400t.jpg b/edaweb/static/images/9400t.jpg new file mode 100644 index 0000000..175e8f1 Binary files /dev/null and b/edaweb/static/images/9400t.jpg differ diff --git a/edaweb/static/images/9400t_cooler.jpg b/edaweb/static/images/9400t_cooler.jpg new file mode 100644 index 0000000..dcfaf27 Binary files /dev/null and b/edaweb/static/images/9400t_cooler.jpg differ diff --git a/edaweb/static/images/E1NlPc1X0AEkB-s.png b/edaweb/static/images/E1NlPc1X0AEkB-s.png new file mode 100644 index 0000000..b0be028 Binary files /dev/null and b/edaweb/static/images/E1NlPc1X0AEkB-s.png differ diff --git a/edaweb/static/images/E3xdm-hWYAEADNx.jpg b/edaweb/static/images/E3xdm-hWYAEADNx.jpg new file mode 100644 index 0000000..d14513d Binary files /dev/null and b/edaweb/static/images/E3xdm-hWYAEADNx.jpg differ diff --git a/edaweb/static/images/E4WhXAvWYAIFwEa.png b/edaweb/static/images/E4WhXAvWYAIFwEa.png new file mode 100644 index 0000000..144eb45 Binary files /dev/null and b/edaweb/static/images/E4WhXAvWYAIFwEa.png differ diff --git a/edaweb/static/images/E4cjVaPXEAU83U0.png b/edaweb/static/images/E4cjVaPXEAU83U0.png new file mode 100644 index 0000000..941a436 Binary files /dev/null and b/edaweb/static/images/E4cjVaPXEAU83U0.png differ diff --git a/edaweb/static/images/E7ODIBeX0AAivRV.jpg b/edaweb/static/images/E7ODIBeX0AAivRV.jpg new file mode 100644 index 0000000..dc52196 Binary files /dev/null and b/edaweb/static/images/E7ODIBeX0AAivRV.jpg differ diff --git a/edaweb/static/images/E7ODIZEWUAMQjty.jpg b/edaweb/static/images/E7ODIZEWUAMQjty.jpg new file mode 100644 index 0000000..2e90eda Binary files /dev/null and b/edaweb/static/images/E7ODIZEWUAMQjty.jpg differ diff --git a/edaweb/static/images/E7ODIv0WUAUp-ad.jpg b/edaweb/static/images/E7ODIv0WUAUp-ad.jpg new file mode 100644 index 0000000..97e704e Binary files /dev/null and b/edaweb/static/images/E7ODIv0WUAUp-ad.jpg differ diff --git a/edaweb/static/images/E7ODJELX0AAVqna.jpg b/edaweb/static/images/E7ODJELX0AAVqna.jpg new file mode 100644 index 0000000..eedfb14 Binary files /dev/null and b/edaweb/static/images/E7ODJELX0AAVqna.jpg differ diff --git a/edaweb/static/images/EbmVCYKWkAAwXKW.jpg b/edaweb/static/images/EbmVCYKWkAAwXKW.jpg new file mode 100644 index 0000000..20b3a19 Binary files /dev/null and b/edaweb/static/images/EbmVCYKWkAAwXKW.jpg differ diff --git a/edaweb/static/images/Ffi1ducXEAArXDg.jpg b/edaweb/static/images/Ffi1ducXEAArXDg.jpg new file mode 100644 index 0000000..5c31cc5 Binary files /dev/null and b/edaweb/static/images/Ffi1ducXEAArXDg.jpg differ diff --git a/edaweb/static/images/GGBDzuSXMAA1Ktk.jpg b/edaweb/static/images/GGBDzuSXMAA1Ktk.jpg new file mode 100644 index 0000000..35e04e1 Binary files /dev/null and b/edaweb/static/images/GGBDzuSXMAA1Ktk.jpg differ diff --git a/edaweb/static/images/GSxGe_rXQAAgEhj.jpg b/edaweb/static/images/GSxGe_rXQAAgEhj.jpg new file mode 100644 index 0000000..0351920 Binary files /dev/null and b/edaweb/static/images/GSxGe_rXQAAgEhj.jpg differ diff --git a/edaweb/static/images/GTq-GOgWQAErvCp.jpg b/edaweb/static/images/GTq-GOgWQAErvCp.jpg new file mode 100644 index 0000000..6a2f7b4 Binary files /dev/null and b/edaweb/static/images/GTq-GOgWQAErvCp.jpg differ diff --git a/edaweb/static/images/GcyexeCW0AAYssz.jpg b/edaweb/static/images/GcyexeCW0AAYssz.jpg new file mode 100644 index 0000000..c0762a8 Binary files /dev/null and b/edaweb/static/images/GcyexeCW0AAYssz.jpg differ diff --git a/edaweb/static/images/IMG_-g4wqat.jpg b/edaweb/static/images/IMG_-g4wqat.jpg new file mode 100644 index 0000000..9f05aaf Binary files /dev/null and b/edaweb/static/images/IMG_-g4wqat.jpg differ diff --git a/edaweb/static/images/IMG_1602.jpg b/edaweb/static/images/IMG_1602.jpg new file mode 100644 index 0000000..d1937fb Binary files /dev/null and b/edaweb/static/images/IMG_1602.jpg differ diff --git a/edaweb/static/images/IMG_1603.jpg b/edaweb/static/images/IMG_1603.jpg new file mode 100644 index 0000000..4d3e8c1 Binary files /dev/null and b/edaweb/static/images/IMG_1603.jpg differ diff --git a/edaweb/static/images/IMG_1604.jpg b/edaweb/static/images/IMG_1604.jpg new file mode 100644 index 0000000..4cc82c3 Binary files /dev/null and b/edaweb/static/images/IMG_1604.jpg differ diff --git a/edaweb/static/images/IMG_1605.jpg b/edaweb/static/images/IMG_1605.jpg new file mode 100644 index 0000000..38d6770 Binary files /dev/null and b/edaweb/static/images/IMG_1605.jpg differ diff --git a/edaweb/static/images/IMG_1606.jpg b/edaweb/static/images/IMG_1606.jpg new file mode 100644 index 0000000..fcbe2a4 Binary files /dev/null and b/edaweb/static/images/IMG_1606.jpg differ diff --git a/edaweb/static/images/IMG_1607.jpg b/edaweb/static/images/IMG_1607.jpg new file mode 100644 index 0000000..825e338 Binary files /dev/null and b/edaweb/static/images/IMG_1607.jpg differ diff --git a/edaweb/static/images/IMG_1609.jpg b/edaweb/static/images/IMG_1609.jpg new file mode 100644 index 0000000..6b7d834 Binary files /dev/null and b/edaweb/static/images/IMG_1609.jpg differ diff --git a/edaweb/static/images/IMG_1610.jpg b/edaweb/static/images/IMG_1610.jpg new file mode 100644 index 0000000..d201596 Binary files /dev/null and b/edaweb/static/images/IMG_1610.jpg differ diff --git a/edaweb/static/images/IMG_1611.jpg b/edaweb/static/images/IMG_1611.jpg new file mode 100644 index 0000000..9eb1af5 Binary files /dev/null and b/edaweb/static/images/IMG_1611.jpg differ diff --git a/edaweb/static/images/IMG_1612.jpg b/edaweb/static/images/IMG_1612.jpg new file mode 100644 index 0000000..f176c17 Binary files /dev/null and b/edaweb/static/images/IMG_1612.jpg differ diff --git a/edaweb/static/images/IMG_1613.png b/edaweb/static/images/IMG_1613.png new file mode 100644 index 0000000..63b743a Binary files /dev/null and b/edaweb/static/images/IMG_1613.png differ diff --git a/edaweb/static/images/IMG_1614.png b/edaweb/static/images/IMG_1614.png new file mode 100644 index 0000000..349afb7 Binary files /dev/null and b/edaweb/static/images/IMG_1614.png differ diff --git a/edaweb/static/images/IMG_1615.jpg b/edaweb/static/images/IMG_1615.jpg new file mode 100644 index 0000000..da42a2b Binary files /dev/null and b/edaweb/static/images/IMG_1615.jpg differ diff --git a/edaweb/static/images/IMG_1616.jpg b/edaweb/static/images/IMG_1616.jpg new file mode 100644 index 0000000..6f83c38 Binary files /dev/null and b/edaweb/static/images/IMG_1616.jpg differ diff --git a/edaweb/static/images/IMG_1617.jpg b/edaweb/static/images/IMG_1617.jpg new file mode 100644 index 0000000..7528c7d Binary files /dev/null and b/edaweb/static/images/IMG_1617.jpg differ diff --git a/edaweb/static/images/IMG_1618.jpg b/edaweb/static/images/IMG_1618.jpg new file mode 100644 index 0000000..9b82ea1 Binary files /dev/null and b/edaweb/static/images/IMG_1618.jpg differ diff --git a/edaweb/static/images/IMG_1619.jpg b/edaweb/static/images/IMG_1619.jpg new file mode 100644 index 0000000..ccae28a Binary files /dev/null and b/edaweb/static/images/IMG_1619.jpg differ diff --git a/edaweb/static/images/IMG_1620.jpg b/edaweb/static/images/IMG_1620.jpg new file mode 100644 index 0000000..54e92d6 Binary files /dev/null and b/edaweb/static/images/IMG_1620.jpg differ diff --git a/edaweb/static/images/IMG_1621.jpg b/edaweb/static/images/IMG_1621.jpg new file mode 100644 index 0000000..5aebae0 Binary files /dev/null and b/edaweb/static/images/IMG_1621.jpg differ diff --git a/edaweb/static/images/IMG_1622.jpg b/edaweb/static/images/IMG_1622.jpg new file mode 100644 index 0000000..56cc9c3 Binary files /dev/null and b/edaweb/static/images/IMG_1622.jpg differ diff --git a/edaweb/static/images/IMG_1623.jpg b/edaweb/static/images/IMG_1623.jpg new file mode 100644 index 0000000..43d0107 Binary files /dev/null and b/edaweb/static/images/IMG_1623.jpg differ diff --git a/edaweb/static/images/IMG_1624.png b/edaweb/static/images/IMG_1624.png new file mode 100644 index 0000000..4fd690f Binary files /dev/null and b/edaweb/static/images/IMG_1624.png differ diff --git a/edaweb/static/images/IMG_1625.jpg b/edaweb/static/images/IMG_1625.jpg new file mode 100644 index 0000000..496a7fa Binary files /dev/null and b/edaweb/static/images/IMG_1625.jpg differ diff --git a/edaweb/static/images/IMG_1626.jpg b/edaweb/static/images/IMG_1626.jpg new file mode 100644 index 0000000..90060fb Binary files /dev/null and b/edaweb/static/images/IMG_1626.jpg differ diff --git a/edaweb/static/images/IMG_1627.jpg b/edaweb/static/images/IMG_1627.jpg new file mode 100644 index 0000000..90c4f49 Binary files /dev/null and b/edaweb/static/images/IMG_1627.jpg differ diff --git a/edaweb/static/images/IMG_1628.jpg b/edaweb/static/images/IMG_1628.jpg new file mode 100644 index 0000000..f2cc8c6 Binary files /dev/null and b/edaweb/static/images/IMG_1628.jpg differ diff --git a/edaweb/static/images/IMG_1629.jpg b/edaweb/static/images/IMG_1629.jpg new file mode 100644 index 0000000..b19b03e Binary files /dev/null and b/edaweb/static/images/IMG_1629.jpg differ diff --git a/edaweb/static/images/IMG_1630.jpg b/edaweb/static/images/IMG_1630.jpg new file mode 100644 index 0000000..ddef77b Binary files /dev/null and b/edaweb/static/images/IMG_1630.jpg differ diff --git a/edaweb/static/images/IMG_1632.jpg b/edaweb/static/images/IMG_1632.jpg new file mode 100644 index 0000000..070615a Binary files /dev/null and b/edaweb/static/images/IMG_1632.jpg differ diff --git a/edaweb/static/images/IMG_1633.jpg b/edaweb/static/images/IMG_1633.jpg new file mode 100644 index 0000000..6fa7ae8 Binary files /dev/null and b/edaweb/static/images/IMG_1633.jpg differ diff --git a/edaweb/static/images/IMG_1636.jpg b/edaweb/static/images/IMG_1636.jpg new file mode 100644 index 0000000..a3de5ad Binary files /dev/null and b/edaweb/static/images/IMG_1636.jpg differ diff --git a/edaweb/static/images/IMG_1637.jpg b/edaweb/static/images/IMG_1637.jpg new file mode 100644 index 0000000..8e6b489 Binary files /dev/null and b/edaweb/static/images/IMG_1637.jpg differ diff --git a/edaweb/static/images/IMG_1638.jpg b/edaweb/static/images/IMG_1638.jpg new file mode 100644 index 0000000..b9ca9f3 Binary files /dev/null and b/edaweb/static/images/IMG_1638.jpg differ diff --git a/edaweb/static/images/IMG_1639.jpg b/edaweb/static/images/IMG_1639.jpg new file mode 100644 index 0000000..5695e58 Binary files /dev/null and b/edaweb/static/images/IMG_1639.jpg differ diff --git a/edaweb/static/images/IMG_1640.jpg b/edaweb/static/images/IMG_1640.jpg new file mode 100644 index 0000000..df3eaea Binary files /dev/null and b/edaweb/static/images/IMG_1640.jpg differ diff --git a/edaweb/static/images/IMG_1641.jpg b/edaweb/static/images/IMG_1641.jpg new file mode 100644 index 0000000..ce2eddb Binary files /dev/null and b/edaweb/static/images/IMG_1641.jpg differ diff --git a/edaweb/static/images/IMG_20210422_212009.jpg b/edaweb/static/images/IMG_20210422_212009.jpg new file mode 100644 index 0000000..a8337c4 Binary files /dev/null and b/edaweb/static/images/IMG_20210422_212009.jpg differ diff --git a/edaweb/static/images/IMG_20210824_175000.jpg b/edaweb/static/images/IMG_20210824_175000.jpg new file mode 100644 index 0000000..216c617 Binary files /dev/null and b/edaweb/static/images/IMG_20210824_175000.jpg differ diff --git a/edaweb/static/images/IMG_20220809_172130442_HDR.jpg b/edaweb/static/images/IMG_20220809_172130442_HDR.jpg new file mode 100644 index 0000000..e1987f8 Binary files /dev/null and b/edaweb/static/images/IMG_20220809_172130442_HDR.jpg differ diff --git a/edaweb/static/images/IMG_20220811_133224877_HDR.jpg b/edaweb/static/images/IMG_20220811_133224877_HDR.jpg new file mode 100644 index 0000000..eb05b1b Binary files /dev/null and b/edaweb/static/images/IMG_20220811_133224877_HDR.jpg differ diff --git a/edaweb/static/images/IMG_20220811_133224877_HDR_crop.jpg b/edaweb/static/images/IMG_20220811_133224877_HDR_crop.jpg new file mode 100644 index 0000000..7bc63ba Binary files /dev/null and b/edaweb/static/images/IMG_20220811_133224877_HDR_crop.jpg differ diff --git a/edaweb/static/images/IMG_20220812_112838125_HDR.jpg b/edaweb/static/images/IMG_20220812_112838125_HDR.jpg new file mode 100644 index 0000000..6e56a49 Binary files /dev/null and b/edaweb/static/images/IMG_20220812_112838125_HDR.jpg differ diff --git a/edaweb/static/images/IMG_20220823_154457137_HDR.jpg b/edaweb/static/images/IMG_20220823_154457137_HDR.jpg new file mode 100644 index 0000000..b46f0fe Binary files /dev/null and b/edaweb/static/images/IMG_20220823_154457137_HDR.jpg differ diff --git a/edaweb/static/images/IMG_20221023_163821542.jpg b/edaweb/static/images/IMG_20221023_163821542.jpg new file mode 100644 index 0000000..f2284df Binary files /dev/null and b/edaweb/static/images/IMG_20221023_163821542.jpg differ diff --git a/edaweb/static/images/IMG_20230812_132400733_HDR.jpg b/edaweb/static/images/IMG_20230812_132400733_HDR.jpg new file mode 100644 index 0000000..9f46bdc Binary files /dev/null and b/edaweb/static/images/IMG_20230812_132400733_HDR.jpg differ diff --git a/edaweb/static/images/IMG_20230812_132632784_HDR.jpg b/edaweb/static/images/IMG_20230812_132632784_HDR.jpg new file mode 100644 index 0000000..82060d1 Binary files /dev/null and b/edaweb/static/images/IMG_20230812_132632784_HDR.jpg differ diff --git a/edaweb/static/images/PXL_20250314_150055804.jpg b/edaweb/static/images/PXL_20250314_150055804.jpg new file mode 100644 index 0000000..b660e18 Binary files /dev/null and b/edaweb/static/images/PXL_20250314_150055804.jpg differ diff --git a/edaweb/static/images/Screenshot_20210520-221830.png b/edaweb/static/images/Screenshot_20210520-221830.png new file mode 100644 index 0000000..33afee7 Binary files /dev/null and b/edaweb/static/images/Screenshot_20210520-221830.png differ diff --git a/edaweb/static/images/Screenshot_20210527_122432.png b/edaweb/static/images/Screenshot_20210527_122432.png new file mode 100644 index 0000000..33432ff Binary files /dev/null and b/edaweb/static/images/Screenshot_20210527_122432.png differ diff --git a/edaweb/static/images/Screenshot_20210620-144127.png b/edaweb/static/images/Screenshot_20210620-144127.png new file mode 100644 index 0000000..dd9b43a Binary files /dev/null and b/edaweb/static/images/Screenshot_20210620-144127.png differ diff --git a/edaweb/static/images/Screenshot_20210620-231652.png b/edaweb/static/images/Screenshot_20210620-231652.png new file mode 100644 index 0000000..5e2532d Binary files /dev/null and b/edaweb/static/images/Screenshot_20210620-231652.png differ diff --git a/edaweb/static/images/Screenshot_20210727-072303.png b/edaweb/static/images/Screenshot_20210727-072303.png new file mode 100644 index 0000000..7c03644 Binary files /dev/null and b/edaweb/static/images/Screenshot_20210727-072303.png differ diff --git a/edaweb/static/images/Screenshot_20210727-072344.png b/edaweb/static/images/Screenshot_20210727-072344.png new file mode 100644 index 0000000..248644a Binary files /dev/null and b/edaweb/static/images/Screenshot_20210727-072344.png differ diff --git a/edaweb/static/images/Screenshot_20210727-223004.png b/edaweb/static/images/Screenshot_20210727-223004.png new file mode 100644 index 0000000..dbe0630 Binary files /dev/null and b/edaweb/static/images/Screenshot_20210727-223004.png differ diff --git a/edaweb/static/images/Screenshot_20210731-181223.png b/edaweb/static/images/Screenshot_20210731-181223.png new file mode 100644 index 0000000..b1547be Binary files /dev/null and b/edaweb/static/images/Screenshot_20210731-181223.png differ diff --git a/edaweb/static/images/Screenshot_20210731-181229.png b/edaweb/static/images/Screenshot_20210731-181229.png new file mode 100644 index 0000000..363c17b Binary files /dev/null and b/edaweb/static/images/Screenshot_20210731-181229.png differ diff --git a/edaweb/static/images/Screenshot_20210811-125853.png b/edaweb/static/images/Screenshot_20210811-125853.png new file mode 100644 index 0000000..7d45240 Binary files /dev/null and b/edaweb/static/images/Screenshot_20210811-125853.png differ diff --git a/edaweb/static/images/Screenshot_20210818-203828.png b/edaweb/static/images/Screenshot_20210818-203828.png new file mode 100644 index 0000000..8026a0c Binary files /dev/null and b/edaweb/static/images/Screenshot_20210818-203828.png differ diff --git a/edaweb/static/images/Screenshot_20210825-131938.png b/edaweb/static/images/Screenshot_20210825-131938.png new file mode 100644 index 0000000..4b16443 Binary files /dev/null and b/edaweb/static/images/Screenshot_20210825-131938.png differ diff --git a/edaweb/static/images/Startech.jpg b/edaweb/static/images/Startech.jpg new file mode 100644 index 0000000..ba7f02f Binary files /dev/null and b/edaweb/static/images/Startech.jpg differ diff --git a/edaweb/static/images/a4-5000.jpg b/edaweb/static/images/a4-5000.jpg new file mode 100644 index 0000000..f26fd66 Binary files /dev/null and b/edaweb/static/images/a4-5000.jpg differ diff --git a/edaweb/static/images/aaaaahh.jpg b/edaweb/static/images/aaaaahh.jpg new file mode 100644 index 0000000..8dac9d4 Binary files /dev/null and b/edaweb/static/images/aaaaahh.jpg differ diff --git a/edaweb/static/images/anti_nft_b.png b/edaweb/static/images/anti_nft_b.png new file mode 100644 index 0000000..61dfb99 Binary files /dev/null and b/edaweb/static/images/anti_nft_b.png differ diff --git a/edaweb/static/images/arenas.jpg b/edaweb/static/images/arenas.jpg new file mode 100644 index 0000000..2b2cac6 Binary files /dev/null and b/edaweb/static/images/arenas.jpg differ diff --git a/edaweb/static/images/basil.jpg b/edaweb/static/images/basil.jpg new file mode 100644 index 0000000..c63ba48 Binary files /dev/null and b/edaweb/static/images/basil.jpg differ diff --git a/edaweb/static/images/bigshark.png b/edaweb/static/images/bigshark.png new file mode 100644 index 0000000..a499fb1 Binary files /dev/null and b/edaweb/static/images/bigshark.png differ diff --git a/edaweb/static/images/bob.gif b/edaweb/static/images/bob.gif new file mode 100644 index 0000000..90b6dd5 Binary files /dev/null and b/edaweb/static/images/bob.gif differ diff --git a/edaweb/static/images/braindamage.png b/edaweb/static/images/braindamage.png new file mode 100644 index 0000000..c26e75f Binary files /dev/null and b/edaweb/static/images/braindamage.png differ diff --git a/edaweb/static/images/catonlap.jpg b/edaweb/static/images/catonlap.jpg new file mode 100644 index 0000000..37e526b Binary files /dev/null and b/edaweb/static/images/catonlap.jpg differ diff --git a/edaweb/static/images/chuddy.jpg b/edaweb/static/images/chuddy.jpg new file mode 100644 index 0000000..7d732f7 Binary files /dev/null and b/edaweb/static/images/chuddy.jpg differ diff --git a/edaweb/static/images/cloudfree.png b/edaweb/static/images/cloudfree.png new file mode 100644 index 0000000..71c6ff2 Binary files /dev/null and b/edaweb/static/images/cloudfree.png differ diff --git a/edaweb/static/images/embedded_img2.png b/edaweb/static/images/embedded_img2.png new file mode 100644 index 0000000..3eeea56 Binary files /dev/null and b/edaweb/static/images/embedded_img2.png differ diff --git a/edaweb/static/images/embedded_img3.png b/edaweb/static/images/embedded_img3.png new file mode 100644 index 0000000..2a55742 Binary files /dev/null and b/edaweb/static/images/embedded_img3.png differ diff --git a/edaweb/static/images/embedded_img4.png b/edaweb/static/images/embedded_img4.png new file mode 100644 index 0000000..5e6ec6d Binary files /dev/null and b/edaweb/static/images/embedded_img4.png differ diff --git a/edaweb/static/images/embedded_img5.PNG b/edaweb/static/images/embedded_img5.PNG new file mode 100644 index 0000000..c96d284 Binary files /dev/null and b/edaweb/static/images/embedded_img5.PNG differ diff --git a/edaweb/static/images/face.jpg b/edaweb/static/images/face.jpg new file mode 100644 index 0000000..b123e53 Binary files /dev/null and b/edaweb/static/images/face.jpg differ diff --git a/edaweb/static/images/first_server.jpg b/edaweb/static/images/first_server.jpg new file mode 100644 index 0000000..8f537d7 Binary files /dev/null and b/edaweb/static/images/first_server.jpg differ diff --git a/edaweb/static/images/fstab.png b/edaweb/static/images/fstab.png new file mode 100644 index 0000000..6acaa83 Binary files /dev/null and b/edaweb/static/images/fstab.png differ diff --git a/edaweb/static/images/graduation.jpg b/edaweb/static/images/graduation.jpg new file mode 100644 index 0000000..89bafd7 Binary files /dev/null and b/edaweb/static/images/graduation.jpg differ diff --git a/edaweb/static/images/greenboi.jpg b/edaweb/static/images/greenboi.jpg new file mode 100644 index 0000000..7761c8a Binary files /dev/null and b/edaweb/static/images/greenboi.jpg differ diff --git a/edaweb/static/images/hpkvm_puttyconf.png b/edaweb/static/images/hpkvm_puttyconf.png new file mode 100644 index 0000000..5e9852f Binary files /dev/null and b/edaweb/static/images/hpkvm_puttyconf.png differ diff --git a/edaweb/static/images/hpkvm_serialconf.png b/edaweb/static/images/hpkvm_serialconf.png new file mode 100644 index 0000000..76122c1 Binary files /dev/null and b/edaweb/static/images/hpkvm_serialconf.png differ diff --git a/edaweb/static/images/i5-1145G7.png b/edaweb/static/images/i5-1145G7.png new file mode 100644 index 0000000..96b6fa3 Binary files /dev/null and b/edaweb/static/images/i5-1145G7.png differ diff --git a/edaweb/static/images/icons.png b/edaweb/static/images/icons.png new file mode 100644 index 0000000..4f19e72 Binary files /dev/null and b/edaweb/static/images/icons.png differ diff --git a/edaweb/static/images/ioporn.jpg b/edaweb/static/images/ioporn.jpg new file mode 100644 index 0000000..6608d31 Binary files /dev/null and b/edaweb/static/images/ioporn.jpg differ diff --git a/edaweb/static/images/its_true_1.jpg b/edaweb/static/images/its_true_1.jpg new file mode 100644 index 0000000..3dddfb3 Binary files /dev/null and b/edaweb/static/images/its_true_1.jpg differ diff --git a/edaweb/static/images/its_true_2.jpg b/edaweb/static/images/its_true_2.jpg new file mode 100644 index 0000000..b532a21 Binary files /dev/null and b/edaweb/static/images/its_true_2.jpg differ diff --git a/edaweb/static/images/j1800.jpg b/edaweb/static/images/j1800.jpg new file mode 100644 index 0000000..05db3a6 Binary files /dev/null and b/edaweb/static/images/j1800.jpg differ diff --git a/edaweb/static/images/j5040.jpg b/edaweb/static/images/j5040.jpg new file mode 100644 index 0000000..1a24299 Binary files /dev/null and b/edaweb/static/images/j5040.jpg differ diff --git a/edaweb/static/images/j5040_server.jpg b/edaweb/static/images/j5040_server.jpg new file mode 100644 index 0000000..9e2f3aa Binary files /dev/null and b/edaweb/static/images/j5040_server.jpg differ diff --git a/edaweb/static/images/kvm_1.png b/edaweb/static/images/kvm_1.png new file mode 100644 index 0000000..fa05b15 Binary files /dev/null and b/edaweb/static/images/kvm_1.png differ diff --git a/edaweb/static/images/kvm_2.png b/edaweb/static/images/kvm_2.png new file mode 100644 index 0000000..6fca0f8 Binary files /dev/null and b/edaweb/static/images/kvm_2.png differ diff --git a/edaweb/static/images/lackrack1.jpg b/edaweb/static/images/lackrack1.jpg new file mode 100644 index 0000000..31c4f9d Binary files /dev/null and b/edaweb/static/images/lackrack1.jpg differ diff --git a/edaweb/static/images/lackrack2.jpg b/edaweb/static/images/lackrack2.jpg new file mode 100644 index 0000000..9fda7d8 Binary files /dev/null and b/edaweb/static/images/lackrack2.jpg differ diff --git a/edaweb/static/images/libreboot.jpg b/edaweb/static/images/libreboot.jpg new file mode 100644 index 0000000..0bac72e Binary files /dev/null and b/edaweb/static/images/libreboot.jpg differ diff --git a/edaweb/static/images/liostore.png b/edaweb/static/images/liostore.png new file mode 100644 index 0000000..43003ee Binary files /dev/null and b/edaweb/static/images/liostore.png differ diff --git a/edaweb/static/images/media_E9lTIldWUAEeT63.jpg b/edaweb/static/images/media_E9lTIldWUAEeT63.jpg new file mode 100644 index 0000000..b30195a Binary files /dev/null and b/edaweb/static/images/media_E9lTIldWUAEeT63.jpg differ diff --git a/edaweb/static/images/media_FPus_2aXsAUhCu9.jpg b/edaweb/static/images/media_FPus_2aXsAUhCu9.jpg new file mode 100644 index 0000000..398fadd Binary files /dev/null and b/edaweb/static/images/media_FPus_2aXsAUhCu9.jpg differ diff --git a/edaweb/static/images/media_FRlRqYKXoAIw82O.jpg b/edaweb/static/images/media_FRlRqYKXoAIw82O.jpg new file mode 100644 index 0000000..b45a62b Binary files /dev/null and b/edaweb/static/images/media_FRlRqYKXoAIw82O.jpg differ diff --git a/edaweb/static/images/media_FeP_m8FXEAAqcJs.jpg b/edaweb/static/images/media_FeP_m8FXEAAqcJs.jpg new file mode 100644 index 0000000..f3afe10 Binary files /dev/null and b/edaweb/static/images/media_FeP_m8FXEAAqcJs.jpg differ diff --git a/edaweb/static/images/media_FfcNNZ2WYAAz97v.jpg b/edaweb/static/images/media_FfcNNZ2WYAAz97v.jpg new file mode 100644 index 0000000..8ae39ad Binary files /dev/null and b/edaweb/static/images/media_FfcNNZ2WYAAz97v.jpg differ diff --git a/edaweb/static/images/media_FlBsMq2XwAATJX5.jpg b/edaweb/static/images/media_FlBsMq2XwAATJX5.jpg new file mode 100644 index 0000000..7ba3ef1 Binary files /dev/null and b/edaweb/static/images/media_FlBsMq2XwAATJX5.jpg differ diff --git a/edaweb/static/images/media_FlBsfDcWQAQhJdP.jpg b/edaweb/static/images/media_FlBsfDcWQAQhJdP.jpg new file mode 100644 index 0000000..601dfbe Binary files /dev/null and b/edaweb/static/images/media_FlBsfDcWQAQhJdP.jpg differ diff --git a/edaweb/static/images/minecraft.png b/edaweb/static/images/minecraft.png new file mode 100644 index 0000000..19210d2 Binary files /dev/null and b/edaweb/static/images/minecraft.png differ diff --git a/edaweb/static/images/new_switch_opened.jpg b/edaweb/static/images/new_switch_opened.jpg new file mode 100644 index 0000000..df797ed Binary files /dev/null and b/edaweb/static/images/new_switch_opened.jpg differ diff --git a/edaweb/static/images/newdiscord.jpg b/edaweb/static/images/newdiscord.jpg new file mode 100644 index 0000000..d446602 Binary files /dev/null and b/edaweb/static/images/newdiscord.jpg differ diff --git a/edaweb/static/images/nicfan.jpg b/edaweb/static/images/nicfan.jpg new file mode 100644 index 0000000..6c2415e Binary files /dev/null and b/edaweb/static/images/nicfan.jpg differ diff --git a/edaweb/static/images/notstolenvalour4.png b/edaweb/static/images/notstolenvalour4.png new file mode 100644 index 0000000..f9e82e2 Binary files /dev/null and b/edaweb/static/images/notstolenvalour4.png differ diff --git a/edaweb/static/images/notstolenvalour5.png b/edaweb/static/images/notstolenvalour5.png new file mode 100644 index 0000000..87c09da Binary files /dev/null and b/edaweb/static/images/notstolenvalour5.png differ diff --git a/edaweb/static/images/notstolenvalour8.png b/edaweb/static/images/notstolenvalour8.png new file mode 100644 index 0000000..dcddf27 Binary files /dev/null and b/edaweb/static/images/notstolenvalour8.png differ diff --git a/edaweb/static/images/oldpic.png b/edaweb/static/images/oldpic.png new file mode 100644 index 0000000..20314e4 Binary files /dev/null and b/edaweb/static/images/oldpic.png differ diff --git a/edaweb/static/images/pfsenseswissvpnportforwards.png b/edaweb/static/images/pfsenseswissvpnportforwards.png new file mode 100644 index 0000000..34c05dc Binary files /dev/null and b/edaweb/static/images/pfsenseswissvpnportforwards.png differ diff --git a/edaweb/static/images/photo_2022-12-07_14-06-03.jpg b/edaweb/static/images/photo_2022-12-07_14-06-03.jpg new file mode 100644 index 0000000..224b748 Binary files /dev/null and b/edaweb/static/images/photo_2022-12-07_14-06-03.jpg differ diff --git a/edaweb/static/images/photo_5857106224099739202_y.jpg b/edaweb/static/images/photo_5857106224099739202_y.jpg new file mode 100644 index 0000000..c0a5820 Binary files /dev/null and b/edaweb/static/images/photo_5857106224099739202_y.jpg differ diff --git a/edaweb/static/images/powerani.gif b/edaweb/static/images/powerani.gif new file mode 100644 index 0000000..1eb1a18 Binary files /dev/null and b/edaweb/static/images/powerani.gif differ diff --git a/edaweb/static/images/profile_images_1598652418580963328_ENk7xKDw.jpg b/edaweb/static/images/profile_images_1598652418580963328_ENk7xKDw.jpg new file mode 100644 index 0000000..775d4e9 Binary files /dev/null and b/edaweb/static/images/profile_images_1598652418580963328_ENk7xKDw.jpg differ diff --git a/edaweb/static/images/rack1.jpg b/edaweb/static/images/rack1.jpg new file mode 100644 index 0000000..b5049e9 Binary files /dev/null and b/edaweb/static/images/rack1.jpg differ diff --git a/edaweb/static/images/rack2.jpg b/edaweb/static/images/rack2.jpg new file mode 100644 index 0000000..1c9bc11 Binary files /dev/null and b/edaweb/static/images/rack2.jpg differ diff --git a/edaweb/static/images/router.jpg b/edaweb/static/images/router.jpg new file mode 100644 index 0000000..587f0e0 Binary files /dev/null and b/edaweb/static/images/router.jpg differ diff --git a/edaweb/static/images/russian_isp.png b/edaweb/static/images/russian_isp.png new file mode 100644 index 0000000..5b529c0 Binary files /dev/null and b/edaweb/static/images/russian_isp.png differ diff --git a/edaweb/static/images/russian_isp_abuse.png b/edaweb/static/images/russian_isp_abuse.png new file mode 100644 index 0000000..96da244 Binary files /dev/null and b/edaweb/static/images/russian_isp_abuse.png differ diff --git a/edaweb/static/images/russian_nginx_logs.jpg b/edaweb/static/images/russian_nginx_logs.jpg new file mode 100644 index 0000000..3fe22d3 Binary files /dev/null and b/edaweb/static/images/russian_nginx_logs.jpg differ diff --git a/edaweb/static/images/russian_yt.jpg b/edaweb/static/images/russian_yt.jpg new file mode 100644 index 0000000..16f3767 Binary files /dev/null and b/edaweb/static/images/russian_yt.jpg differ diff --git a/edaweb/static/images/s-l1600.jpg b/edaweb/static/images/s-l1600.jpg new file mode 100644 index 0000000..34a82cf Binary files /dev/null and b/edaweb/static/images/s-l1600.jpg differ diff --git a/edaweb/static/images/s-l16001.jpg b/edaweb/static/images/s-l16001.jpg new file mode 100644 index 0000000..0c34348 Binary files /dev/null and b/edaweb/static/images/s-l16001.jpg differ diff --git a/edaweb/static/images/s-l500.jpg b/edaweb/static/images/s-l500.jpg new file mode 100644 index 0000000..92307ff Binary files /dev/null and b/edaweb/static/images/s-l500.jpg differ diff --git a/edaweb/static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg b/edaweb/static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg new file mode 100644 index 0000000..b146bc4 Binary files /dev/null and b/edaweb/static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg differ diff --git a/edaweb/static/images/selfie.jpg b/edaweb/static/images/selfie.jpg new file mode 100644 index 0000000..17730e8 Binary files /dev/null and b/edaweb/static/images/selfie.jpg differ diff --git a/edaweb/static/images/server.jpg b/edaweb/static/images/server.jpg new file mode 100644 index 0000000..50bc1d7 Binary files /dev/null and b/edaweb/static/images/server.jpg differ diff --git a/edaweb/static/images/server2.jpg b/edaweb/static/images/server2.jpg new file mode 100644 index 0000000..dda70b1 Binary files /dev/null and b/edaweb/static/images/server2.jpg differ diff --git a/edaweb/static/images/shark1.jpg b/edaweb/static/images/shark1.jpg new file mode 100644 index 0000000..394846c Binary files /dev/null and b/edaweb/static/images/shark1.jpg differ diff --git a/edaweb/static/images/shark2.jpg b/edaweb/static/images/shark2.jpg new file mode 100644 index 0000000..2c432cd Binary files /dev/null and b/edaweb/static/images/shark2.jpg differ diff --git a/edaweb/static/images/shark3.jpg b/edaweb/static/images/shark3.jpg new file mode 100644 index 0000000..5343254 Binary files /dev/null and b/edaweb/static/images/shark3.jpg differ diff --git a/edaweb/static/images/shark3.png b/edaweb/static/images/shark3.png new file mode 100644 index 0000000..22e8ff9 Binary files /dev/null and b/edaweb/static/images/shark3.png differ diff --git a/edaweb/static/images/shun-hashimoto-mio-chibana.gif b/edaweb/static/images/shun-hashimoto-mio-chibana.gif new file mode 100644 index 0000000..869793f Binary files /dev/null and b/edaweb/static/images/shun-hashimoto-mio-chibana.gif differ diff --git a/edaweb/static/images/sicp.jpg b/edaweb/static/images/sicp.jpg new file mode 100644 index 0000000..575a456 Binary files /dev/null and b/edaweb/static/images/sicp.jpg differ diff --git a/edaweb/static/images/startech_rack_1.jpg b/edaweb/static/images/startech_rack_1.jpg new file mode 100644 index 0000000..1f66734 Binary files /dev/null and b/edaweb/static/images/startech_rack_1.jpg differ diff --git a/edaweb/static/images/startech_rack_2.jpg b/edaweb/static/images/startech_rack_2.jpg new file mode 100644 index 0000000..47f9aac Binary files /dev/null and b/edaweb/static/images/startech_rack_2.jpg differ diff --git a/edaweb/static/images/stolenvalour.jpg b/edaweb/static/images/stolenvalour.jpg new file mode 100644 index 0000000..d666623 Binary files /dev/null and b/edaweb/static/images/stolenvalour.jpg differ diff --git a/edaweb/static/images/sun.gif b/edaweb/static/images/sun.gif new file mode 100644 index 0000000..674e32a Binary files /dev/null and b/edaweb/static/images/sun.gif differ diff --git a/edaweb/static/images/switch.jpg b/edaweb/static/images/switch.jpg new file mode 100644 index 0000000..64ab20c Binary files /dev/null and b/edaweb/static/images/switch.jpg differ diff --git a/edaweb/static/images/switches.jpg b/edaweb/static/images/switches.jpg new file mode 100644 index 0000000..8b56651 Binary files /dev/null and b/edaweb/static/images/switches.jpg differ diff --git a/edaweb/static/images/t30.jpg b/edaweb/static/images/t30.jpg new file mode 100644 index 0000000..949d14b Binary files /dev/null and b/edaweb/static/images/t30.jpg differ diff --git a/edaweb/static/images/techdome.jpg b/edaweb/static/images/techdome.jpg new file mode 100644 index 0000000..74fe69c Binary files /dev/null and b/edaweb/static/images/techdome.jpg differ diff --git a/edaweb/static/images/telegrampic.jpg b/edaweb/static/images/telegrampic.jpg new file mode 100644 index 0000000..ddadb8b Binary files /dev/null and b/edaweb/static/images/telegrampic.jpg differ diff --git a/edaweb/static/images/telegrampic2.jpg b/edaweb/static/images/telegrampic2.jpg new file mode 100644 index 0000000..8b306ff Binary files /dev/null and b/edaweb/static/images/telegrampic2.jpg differ diff --git a/edaweb/static/images/testimonials.PNG b/edaweb/static/images/testimonials.PNG new file mode 100644 index 0000000..8584cdd Binary files /dev/null and b/edaweb/static/images/testimonials.PNG differ diff --git a/edaweb/static/images/theNVMEVault.png b/edaweb/static/images/theNVMEVault.png new file mode 100644 index 0000000..2cf31d7 Binary files /dev/null and b/edaweb/static/images/theNVMEVault.png differ diff --git a/edaweb/static/images/twitterpic.jpg b/edaweb/static/images/twitterpic.jpg new file mode 100644 index 0000000..57f16b4 Binary files /dev/null and b/edaweb/static/images/twitterpic.jpg differ diff --git a/edaweb/static/images/vcss-blue.gif b/edaweb/static/images/vcss-blue.gif new file mode 100644 index 0000000..c373b2a Binary files /dev/null and b/edaweb/static/images/vcss-blue.gif differ diff --git a/edaweb/static/images/www.gif b/edaweb/static/images/www.gif new file mode 100644 index 0000000..48fbd13 Binary files /dev/null and b/edaweb/static/images/www.gif differ diff --git a/edaweb/static/images/x200.jpg b/edaweb/static/images/x200.jpg new file mode 100644 index 0000000..d7e48eb Binary files /dev/null and b/edaweb/static/images/x200.jpg differ diff --git a/edaweb/static/images/xeon.jpg b/edaweb/static/images/xeon.jpg new file mode 100644 index 0000000..4b1eef9 Binary files /dev/null and b/edaweb/static/images/xeon.jpg differ diff --git a/edaweb/static/images/xeon_motherboard.jpg b/edaweb/static/images/xeon_motherboard.jpg new file mode 100644 index 0000000..a17819f Binary files /dev/null and b/edaweb/static/images/xeon_motherboard.jpg differ diff --git a/edaweb/static/index.md b/edaweb/static/index.md new file mode 100644 index 0000000..a676d59 --- /dev/null +++ b/edaweb/static/index.md @@ -0,0 +1,36 @@ +site now also avaliable under the domain [boymoder.blog](https://boymoder.blog)! + +![yaoi](/img/shun-hashimoto-mio-chibana.gif) + +## haiiiiiii +my name is eden and im a 23yo (boymoder/[fujoshi](https://www.urbandictionary.com/define.php?term=fujoshi)) computer science/robotics PhD student. i made my own website to encourage others to do so too. +i'll post my thoughts on here sometimes, and use this site to link to other stuff i host [more about me](/thought?id=2). + +[click here for a random image of lio fotia](/random?tags=lio_fotia) + +[click here for a random KawoShin image](/random?tags=nagisa_kaworu+ikari_shinji+yaoi) + +## FOSS alternative services + +- [nextcloud - dropbox (+ much more!) alternative](https://nc.eda.gay) +- [git server - github alternative](https://git.eda.gay/) +- [jellyfin - web player for ~~legally downloaded~~ TV and films](https://jellyfin.eda.gay) - RIP emby! + +[see the services im running right now](/services) (takes a couple seconds to load) + +these sites are hosted on my [homelab system](https://wiki.eda.gay) + +![startech 8u rack cropped](/img/GcyexeCW0AAYssz.jpg?w=300&h=5000) +![startech 12u rack cropped](/img/Startech.jpg?h=250&w=5000) + +## nice websites +- [wiby.me](http://wiby.me/) - search engine for old style websites with limited javascript (my site used to be on here but it got blacklisted for some reason?) +- [dysmorph.nekoweb.org](https://dysmorph.nekoweb.org/) - a site that is very based because it looks similar +- [boymoder.network](https://boymoder.network/) - website for boymoder awareness +- [4chan.org/lgbt/](https://boards.4channel.org/lgbt/) - but dont blame me if u catch brainworms +- [https://www.math.uni-bielefeld.de/~sillke/Twister/fun/elevator-fun90.html](https://www.math.uni-bielefeld.de/~sillke/Twister/fun/elevator-fun90.html) any website with a URL like this is gonna be good +- [boymoder.moe](https://nyaomidev.github.io/boymoder.moe/) +- [boymoders.com](https://boymoders.com) +- [john.citrons.xyz](https://john.citrons.xyz/) - for the nice 'ads' featured at the bottom of my page + + diff --git a/edaweb/static/papers/aai.pdf b/edaweb/static/papers/aai.pdf new file mode 100644 index 0000000..af2223b Binary files /dev/null and b/edaweb/static/papers/aai.pdf differ diff --git a/edaweb/static/papers/ar2.pdf b/edaweb/static/papers/ar2.pdf new file mode 100644 index 0000000..2b1693f Binary files /dev/null and b/edaweb/static/papers/ar2.pdf differ diff --git a/edaweb/static/robots.txt b/edaweb/static/robots.txt new file mode 100644 index 0000000..c2aab7e --- /dev/null +++ b/edaweb/static/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Disallow: / \ No newline at end of file diff --git a/edaweb/static/style.css b/edaweb/static/style.css new file mode 100644 index 0000000..6069ebf --- /dev/null +++ b/edaweb/static/style.css @@ -0,0 +1,211 @@ +html { + background-color: black; + font-family: 'Open Sans', sans-serif; + font-size: small; +} + +body { + /* background: linear-gradient(red,orange,yellow,green,blue,indigo,violet); */ + margin-left: 0px; + margin-right: 0px; + margin-bottom: 0px; + position: relative; + background: black; +} + +#wrapper { + background-color: #f1f3f3; + max-width: 974px; + min-width: 850px; + margin: auto; + margin-top: -10px; +} + +header { + background-color: #f1f3f3; +} + + +#headerflex { + display: flex; +} + +#headers { + flex-grow: 1; +} + +header nav { + flex-grow: 1; + display: inline; +} + +#externallinks { + background-color: black; + text-align: center; +} + +#externallinks nav ul li a { + color: #f1f3f3; + font-size: smaller; +} + +header div { + padding-left: 20px; + /* padding-bottom: 10px; */ +} + +nav ul { + margin: 0; + padding: 0; +} + +nav li { + display: inline-block; + list-style-type: none; +} + +nav a { + text-decoration: none; + display: block; + padding: 5px 6px 5px 6px; + color: black; +} + +#TheTitle { + text-decoration: none; + color: black; +} + +#TheTitle h1 { + padding-left: 6px; +} + +#articles { + text-align: left; + background-color: white; +} + +article section table { + font-family: monospace; +} + +article section table td { + text-align: right; +} + +#randomImage img { + max-width: 65%; +} + +#content img { + max-width: 65%; +} + +aside { + width: 30%; + padding-left: 15px; + margin-left: 15px; + float: right; +} + +#contents { + font-size: xx-small; +} + +#contents ul { + padding-left: 12px; + line-height: 3px; + } + +#contents ul li { + list-style: none; +} + +#tags { + font-size: xx-small; +} + +#sidebarImage { + transform: translateX(10px); +} + +.header_linker { + font-size: x-small; +} + +#diaryentry { + list-style-type: none; +} + +#diaryentry ul { + list-style-type: none; + display: inline-block; +} + +#diaryentry ul li img { + max-height: 150px; + margin-top: 10px; +} + +.qnaheader { + font-weight: bold; +} + +blockquote span { + color: #789922; +} + +blockquote span::before { + content: ">"; +} + +.running { + background-color: green; +} + +.notRunning { + background-color: red; +} + +header img { + max-height: 110px; +} + +form #number_input { + width: 50px; + margin-left: 10px; +} + +form #url_input { + margin-left: 10px; +} + +body div div { + padding-left: 10px; + padding-right: 10px; +} + +footer { + padding: 300px 10px 5px 20px; + margin-bottom: 300px; + font-size: xx-small; + align-content: center; +} + +#footer_banners { + display: flex; + align-items: center; + +} + +@media (max-width: 1023px) { + body { + margin: 0; + padding: 0; + } + + #wrapper { + min-width: 100%; + margin-top: 0; + } +} diff --git a/edaweb/templates/diary.html.j2 b/edaweb/templates/diary.html.j2 new file mode 100644 index 0000000..f6604f7 --- /dev/null +++ b/edaweb/templates/diary.html.j2 @@ -0,0 +1,26 @@ +{% extends "template.html.j2" %} +{% block content %} +

this page might not be up-to-date if my diary account is search banned

+

if in doubt check my diary account
check if i'm currently search banned

+
+ {% for dt, entries in diary.items() %} +
{{ dt }}
+
+
    + {% for entry in entries %} + {% if entry["images"] != [] %} +
      + {% for img in entry["images"] %} +
    • + {% endfor %} +
    + {% endif %} +
  1. +

    {{ entry["text"] }}

    +
  2. + {% endfor %} +
+
+ {% endfor %} +
+{% endblock %} diff --git a/edaweb/templates/discord.html.j2 b/edaweb/templates/discord.html.j2 new file mode 100644 index 0000000..597fb4b --- /dev/null +++ b/edaweb/templates/discord.html.j2 @@ -0,0 +1,5 @@ +{% extends "template.html.j2" %} +{% block content %} +

You can contact me on discord (telegram preferred):

+

{{discord}}

+ {% endblock %} \ No newline at end of file diff --git a/edaweb/templates/index.html.j2 b/edaweb/templates/index.html.j2 new file mode 100644 index 0000000..d6c08d8 --- /dev/null +++ b/edaweb/templates/index.html.j2 @@ -0,0 +1,24 @@ +{% extends "template.html.j2" %} +{% block content %} + + {{markdown|safe}} +
+

recent git commits:

+ +
+{% endblock %} diff --git a/edaweb/templates/isocd.html.j2 b/edaweb/templates/isocd.html.j2 new file mode 100644 index 0000000..3c532c0 --- /dev/null +++ b/edaweb/templates/isocd.html.j2 @@ -0,0 +1,32 @@ +{% extends "template.html.j2" %} +{% block content %} +

As discussed here, I will post a GNU/Linux install CD to you for free (provided you live in the United Kingdom). Just fill out the form below:

+
+ +

+ +

+

Sadly there is an upper limit on ISOs of 700Mb coz thats what u can fit on a cd ;_; so big isos arent listed


+ +

+ +

+ +

+ +

+ +

+ +

+ +
+

I make no promises how long this will actually take, but you might get a special present too uwu

+

btw if u abuse this service i'll just ignore u

+

Testimonials

+ +{% endblock %} \ No newline at end of file diff --git a/edaweb/templates/isocd_confirmation.html.j2 b/edaweb/templates/isocd_confirmation.html.j2 new file mode 100644 index 0000000..81045a8 --- /dev/null +++ b/edaweb/templates/isocd_confirmation.html.j2 @@ -0,0 +1,16 @@ +{% extends "template.html.j2" %} +{% block content %} +

Your order has been placed. Expect a confirmation email to {{ email }} when I can be bothered to sort it out.

+
+

Your order/reference id is {{ id_ }}

+
+

The details were as follows:

+ + {% for k, v in req.items() %} + + + + + {% endfor %} +
{{ k.upper() }}{{ v }}
+{% endblock %} \ No newline at end of file diff --git a/edaweb/templates/nhdl.html.j2 b/edaweb/templates/nhdl.html.j2 new file mode 100644 index 0000000..5ab62c2 --- /dev/null +++ b/edaweb/templates/nhdl.html.j2 @@ -0,0 +1,8 @@ +{% extends "template.html.j2" %} +{% block content %} +
+ +

+ +
+{% endblock %} \ No newline at end of file diff --git a/edaweb/templates/questions.html.j2 b/edaweb/templates/questions.html.j2 new file mode 100644 index 0000000..eb58380 --- /dev/null +++ b/edaweb/templates/questions.html.j2 @@ -0,0 +1,17 @@ +{% extends "template.html.j2" %} +{% block content %} +

ask a question!

+
+ {% for id_, link, dt, question, answer, host in qnas %} + {% if host == "curiouscat" %} +
{{ dt.isoformat() }} - {{ host }}
+ {% else %} +
{{ dt.isoformat() }} - {{ host }}
+ {% endif %} +
+

{{ question }}

+

{{ answer }}

+ + {% endfor %} +
+{% endblock %} diff --git a/edaweb/templates/random.html.j2 b/edaweb/templates/random.html.j2 new file mode 100644 index 0000000..76b433b --- /dev/null +++ b/edaweb/templates/random.html.j2 @@ -0,0 +1,22 @@ +{% extends "template.html.j2" %} +{% block content %} + +
+ +

generate another

+

artist link

+
+{% endblock %} \ No newline at end of file diff --git a/edaweb/templates/services.html.j2 b/edaweb/templates/services.html.j2 new file mode 100644 index 0000000..9f42c7f --- /dev/null +++ b/edaweb/templates/services.html.j2 @@ -0,0 +1,59 @@ +{% extends "template.html.j2" %} +{% block content %} +
+
+

docker

+
    + {% for host, containers in docker["containers"].items() %} +

    {{ "%s - %s" % (host[0], host[1]) }}

    + + {% for name, status, image in containers %} + + + {% if "Up" in status %} + + {% else %} + + {% endif %} + + + {% endfor %} +
    {{ name }}{{ status }}{{ status }}{{ image }}
    + {% endfor %} +
+

{{ docker["cachetime"] }}

+
+ +
+

transmission

+ {% if trans == None %} +

Couldn't access the transmission API. Is docker container running?

+ {% else %} + + {% for k, v in trans.items() %} + + + + + {% endfor %} +
{{ k }}{{ v }}
+ {% endif %} +
+ +
+

pihole

+ {% if pihole == None %} +

Couldn't access the pihole API. Is docker container running?

+ {% else %} + + {% for k, v in pihole.items() %} + + + + + {% endfor %} +
{{ k }}{{ v }}
+ {% endif %} +
+
+{% endblock %} \ No newline at end of file diff --git a/edaweb/templates/template.html.j2 b/edaweb/templates/template.html.j2 new file mode 100644 index 0000000..86618bc --- /dev/null +++ b/edaweb/templates/template.html.j2 @@ -0,0 +1,76 @@ + + + + + + + eda.gay :: {{title}} + + + + + + + +
+
+ +
+
+

{{title}}

+ +
+ + {{image[0]}} + +
+
+
+ {% block content %} + {% endblock %} +
+ +
+ + diff --git a/edaweb/templates/thought.html.j2 b/edaweb/templates/thought.html.j2 new file mode 100644 index 0000000..2a5b519 --- /dev/null +++ b/edaweb/templates/thought.html.j2 @@ -0,0 +1,29 @@ +{% extends "template.html.j2" %} +{% block content %} + + {{ md_html|safe }} +{% endblock %} \ No newline at end of file diff --git a/edaweb/templates/thoughts.html.j2 b/edaweb/templates/thoughts.html.j2 new file mode 100644 index 0000000..bf06f57 --- /dev/null +++ b/edaweb/templates/thoughts.html.j2 @@ -0,0 +1,12 @@ +{% extends "template.html.j2" %} +{% block content %} + {% for category_name, thoughts in tree.items() %} +

{{category_name}}

+
+ {% for id_, title, dt in thoughts %} +
{{title}}
+
{{dt}}
+ {% endfor %} +
+ {% endfor %} +{% endblock %} \ No newline at end of file diff --git a/entrypoint.sh b/entrypoint.sh index ecd86dc..335ad66 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,3 +1,3 @@ printenv | grep -v "no_proxy" >> /etc/environment tmux new-session -d -s "cron" 'cron -f || bash && bash'; -python3 /app/app.py --production \ No newline at end of file +python3 /app/edaweb/app.py --production \ No newline at end of file diff --git a/parser.py b/parser.py deleted file mode 100755 index a851846..0000000 --- a/parser.py +++ /dev/null @@ -1,200 +0,0 @@ -#!/usr/bin/env python3 - -from urllib.parse import urlparse -from pygments import highlight -from pygments.formatters import HtmlFormatter, ClassNotFound -from pygments.lexers import get_lexer_by_name -import urllib.parse -import webbrowser -import lxml.etree -import lxml.html -import database -import argparse -import getpass -import houdini -import mistune -import jinja2 -import app -import sys -import re -import os - -class EdawebRenderer(mistune.HTMLRenderer): - def blockcode(self, text, lang): - try: - lexer = get_lexer_by_name(lang, stripall=True) - except ClassNotFound: - lexer = None - - if lexer: - formatter = HtmlFormatter() - return highlight(text, lexer, formatter) - # default - return '\n
{}
\n'.format(houdini.escape_html(text.strip())) - - def block_quote(self, content): - content = content[3:-5] # idk why this is required... - out = '\n
' - for line in houdini.escape_html(content.strip()).split("\n"): - out += '\n{}
'.format(line) - return out + '\n
' - - def image(self, link, text, title): - return "%s" % ( - urlparse(link)._replace(query='').geturl(), text, link - ) - - def heading(self, text, level): - hash_ = urllib.parse.quote_plus(text) - return "%s [#]" % ( - level, hash_, text, hash_, level - ) - -def get_thought_from_id(db, id_): - category_name, title, dt, markdown, redirect = db.get_thought(id_) - html, headers = parse_text(markdown) - return category_name, title, dt, html, headers, redirect - -def parse_file(path): - with open(path, "r") as f: - unformatted = f.read() - - return parse_text(unformatted)[0] - -def parse_text(unformatted): - md = mistune.create_markdown( - renderer = EdawebRenderer(), - plugins = ["strikethrough", "table", "url", "task_lists", "def_list"] - ) - html = md(unformatted) - if html == "": - return "", "" - - return html, get_headers(html) - -def get_headers(html): - root = lxml.html.fromstring(html) - - headers = [] - thesmallestlevel = 7 - for node in root.xpath('//h1|//h2|//h3|//h4|//h5//h6'): - level = int(node.tag[-1]) - if level < thesmallestlevel: - thesmallestlevel = level - headers.append(( - # lxml.etree.tostring(node), - # "

%s

" % urllib.parse.unquote_plus(node.attrib["id"]), # possibly insecure? - urllib.parse.unquote_plus(node.attrib["id"]), - level, # -horrible hack - "#%s" % node.attrib["id"]) - ) - - headers = [(i[0], i[1] - thesmallestlevel, i[2]) for i in headers] - # print(headers) - # there is a bug here- - # it must start with the largest header and only go up and down in increments of one - # TODO: fix it! - md_template = jinja2.Template(""" -{% for text, depth, link in contents %} -{{ " " * depth }} - [{{ text }}]({{ link }}) -{% endfor %} - """) - - return mistune.html(md_template.render(contents = headers)) - -def main(): - p = argparse.ArgumentParser() - subparse = p.add_subparsers(help = "sub-command help") - save_parser = subparse.add_parser("save", help = "Add a markdown file to the database") - echo_parser = subparse.add_parser("echo", help = "Print markdown render to stdout") - update_parser = subparse.add_parser("update", help = "Replace a markdown file") - export_parser = subparse.add_parser("export", help = "Export a database markdown file to disk") - list_parser = subparse.add_parser("list", help = "List all the markdowns in the database") - - for s in [save_parser, echo_parser, update_parser]: - s.add_argument( - "-m", "--markdown", - help = "Path to a markdown file", - type = str, - required = True - ) - - for s in [save_parser]: - s.add_argument( - "-t", "--title", - help = "Article title", - type = str, - required = True - ) - s.add_argument( - "-c", "--category", - help = "Article category", - type = str, - required = True - ) - - for s in [save_parser, update_parser, export_parser, list_parser]: - s.add_argument( - "-u", "--username", - help = "Username to use for the database", - type = str, - required = True - ) - - for s in [export_parser, update_parser]: - s.add_argument( - "-i", "--id", - help = "Article's id", - type = int, - required = True - ) - - export_parser.add_argument( - "-o", "--out", - help = "Path to write the markdown file to", - type = str, - required = True - ) - - args = vars(p.parse_args()) - - if "username" in args.keys(): - args["password"] = getpass.getpass("Enter password for %s@%s: " % (args["username"], app.CONFIG["mysql"]["host"])) - - try: - verb = sys.argv[1] - except IndexError: - print("No verb specified... Nothing to do... Exiting...") - exit() - - if verb in ["save", "export", "update", "list"]: - with database.Database( - safeLogin = False, - user = args["username"], - passwd = args["password"] - ) as db: - if verb == "save": - if db.add_category(args["category"]): - print("Added category...") - with open(args["markdown"], "r") as f: - db.add_thought(args["category"], args["title"], f.read()) - print("Added thought...") - - elif verb == "export": - with open(args["out"], "w") as f: - f.writelines(db.get_thought(args["id"])[-2]) - print("Written to %s" % args["out"]) - - elif verb == "update": - with open(args["markdown"], "r") as f: - db.update_thought_markdown(args["id"], f.read()) - - elif verb == "list": - for id_, title, dt, category_name in db.get_all_thoughts(): - print("%d\t%s\t%s\t%s" % (id_, title, dt, category_name)) - - elif verb == "echo": - print(parse_file(args["markdown"])) - -if __name__ == "__main__": - main() diff --git a/services.py b/services.py deleted file mode 100755 index 5d25271..0000000 --- a/services.py +++ /dev/null @@ -1,360 +0,0 @@ -from dataclasses import dataclass -from io import StringIO -from lxml import html, etree -from github import Github -import multiprocessing -import paramiko.client -from APiHole import PiHole -import transmission_rpc -import configparser -import math as maths -import requests -import datetime -import urllib -import docker -import random -import subprocess -import fabric -import pickle -import queue -import json -import time -import os - -theLastId = 0 -CONFIG = configparser.ConfigParser(interpolation = None) -CONFIG.read(os.path.join(os.path.dirname(__file__), "edaweb.conf")) - -def humanbytes(B): - 'Return the given bytes as a human friendly KB, MB, GB, or TB string' - B = float(B) - KB = float(1024) - MB = float(KB ** 2) # 1,048,576 - GB = float(KB ** 3) # 1,073,741,824 - TB = float(KB ** 4) # 1,099,511,627,776 - - if B < KB: - return '{0} {1}'.format(B,'Bytes' if 0 == B > 1 else 'Byte') - elif KB <= B < MB: - return '{0:.2f} KB'.format(B/KB) - elif MB <= B < GB: - return '{0:.2f} MB'.format(B/MB) - elif GB <= B < TB: - return '{0:.2f} GB'.format(B/GB) - elif TB <= B: - return '{0:.2f} TB'.format(B/TB) - -@dataclass -class SafebooruImage: - id_: int - url: str - searchTags: list - tags: list - source: str - imurl: str - - def remove_tag(self, tag): - return list(set(self.searchTags).difference(set([tag]))) - -@dataclass -class DownloadedImage: - imurl: str - - def __enter__(self): - self.filename = os.path.join("static", "images", "random.jpg") - - req = urllib.request.Request(self.imurl, headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_5_8) AppleWebKit/534.50.2 (KHTML, like Gecko) Version/5.0.6 Safari/533.22.3'}) - mediaContent = urllib.request.urlopen(req).read() - with open(self.filename, "wb") as f: - f.write(mediaContent) - return self.filename - - def __exit__(self, type, value, traceback): - os.remove(self.filename) - -def get_num_pages(tags): - pages_url = "https://safebooru.org/index.php?page=post&s=list&tags=%s" % "+".join(tags) - tree = html.fromstring(requests.get(pages_url).content) - try: - finalpage_element = tree.xpath("/html/body/div[6]/div/div[2]/div[2]/div/a[12]")[0] - except IndexError: - return 1 - else: - return int(int(urllib.parse.parse_qs(finalpage_element.get("href"))["pid"][0]) / (5*8)) - -def get_id_from_url(url): - return int(urllib.parse.parse_qs(url)["id"][0]) - -def get_random_image(tags): - global theLastId - searchPage = random.randint(1, get_num_pages(tags)) * 5 * 8 - url = "https://safebooru.org/index.php?page=post&s=list&tags=%s&pid=%i" % ("+".join(tags), searchPage) - tree = html.fromstring(requests.get(url).content) - - imageElements = [e for e in tree.xpath("/html/body/div[6]/div/div[2]/div[1]")[0].iter(tag = "a")] - try: - element = random.choice(imageElements) - except IndexError: - # raise ConnectionError("Couldn't find any images") - return get_random_image(tags) - - url = "https://safebooru.org/" + element.get("href") - if get_id_from_url(url) == theLastId: - return get_random_image(tags) - theLastId = get_id_from_url(url) - - try: - sbi = SafebooruImage( - id_ = get_id_from_url(url), - url = url, - tags = element.find("img").get("alt").split(), - searchTags = tags, - source = fix_source_url(get_source(url)), - imurl = get_imurl(url) - ) - except (ConnectionError, KeyError) as e: - print("[ERROR]", e) - return get_random_image(tags) - - if link_deleted(sbi.url): - print("Retried since the source was deleted...") - return get_random_image(tags) - - return sbi - -def get_source(url): - tree = html.fromstring(requests.get(url).content) - for element in tree.xpath('//*[@id="stats"]')[0].iter("li"): - if element.text.startswith("Source: h"): - return element.text[8:] - elif element.text.startswith("Source:"): - for child in element.iter(): - if child.get("href") is not None: - return child.get("href") - raise ConnectionError("Couldn't find source image for id %i" % get_id_from_url(url)) - -def fix_source_url(url): - parsed = urllib.parse.urlparse(url) - if parsed.netloc == "www.pixiv.net": - return "https://www.pixiv.net/en/artworks/" + urllib.parse.parse_qs(parsed.query)["illust_id"][0] - elif parsed.netloc in ["bishie.booru.org", "www.secchan.net"]: - return ConnectionError("Couldn't get source") - elif "pximg.net" in parsed.netloc or "pixiv.net" in parsed.netloc: - return "https://www.pixiv.net/en/artworks/" + parsed.path.split("/")[-1][:8] - elif parsed.netloc == "twitter.com": - return url.replace("twitter.com", "nitter.eda.gay") - return url - -def get_imurl(url): - tree = html.fromstring(requests.get(url).content) - return tree.xpath('//*[@id="image"]')[0].get("src") - -def link_deleted(url): - text = requests.get(url).text - return text[text.find("") + 7 : text.find("")] in ["Error | nitter", "イラストコミュニケーションサービス[pixiv]"] - -def request_recent_commits(since = datetime.datetime.now() - datetime.timedelta(days=7)): - g = Github(CONFIG.get("github", "access_code")) - out = [] - for repo in g.get_user().get_repos(): - # print(repo.name, list(repo.get_branches())) - try: - for commit in repo.get_commits(since = since): - out.append({ - "repo": repo.name, - "message": commit.commit.message, - "url": commit.html_url, - "datetime": commit.commit.author.date, - "stats": { - "additions": commit.stats.additions, - "deletions": commit.stats.deletions, - "total": commit.stats.total - } - }) - except Exception as e: - print(repo, e) - - return sorted(out, key = lambda a: a["datetime"], reverse = True) - -def scrape_nitter(username, get_until:int): - new_tweets = [] - nitter_url = CONFIG.get("nitter", "internalurl") - nitter_port = CONFIG.getint("nitter", "internalport") - scrape_new_pages = True - url = "http://%s:%d/%s" % (nitter_url, nitter_port, username) - - while scrape_new_pages: - tree = html.fromstring(requests.get(url).content) - for i, tweetUrlElement in enumerate(tree.xpath('//*[@class="tweet-link"]'), 0): - if i > 0 and tweetUrlElement.get("href").split("/")[1] == username: - id_ = int(urllib.parse.urlparse(tweetUrlElement.get("href")).path.split("/")[-1]) - tweet_link = "http://%s:%d%s" % (nitter_url, nitter_port, tweetUrlElement.get("href")) - - if id_ == get_until: - scrape_new_pages = False - break - - try: - dt, replying_to, text, images = parse_tweet(tweet_link) - new_tweets.append((id_, dt, replying_to, text, username, images)) - print(dt, "'%s'" % text) - except IndexError: - print("Couldn't get any more tweets") - scrape_new_pages = False - break - except ConnectionError: - print("Rate limited, try again later") - return [] - - - try: - cursor = tree.xpath('//*[@class="show-more"]/a')[0].get("href") - except IndexError: - # no more elements - break - url = "http://%s:%d/%s%s" % (nitter_url, nitter_port, username, cursor) - - return new_tweets - -def parse_tweet(tweet_url): - # print(tweet_url) - tree = html.fromstring(requests.get(tweet_url).content) - # with open("2images.html", "r") as f: - # tree = html.fromstring(f.read()) - - rate_limited_elem = tree.xpath("/html/body/div/div/div/span") - if rate_limited_elem != []: - if rate_limited_elem[0].text == "Instance has been rate limited.": - raise ConnectionError("Instance has been rate limited.") - - main_tweet_elem = tree.xpath('//*[@class="main-tweet"]')[0] - - dt_str = main_tweet_elem.xpath('//*[@class="tweet-published"]')[0].text - dt = datetime.datetime.strptime(dt_str.replace("Â", ""), "%b %d, %Y · %I:%M %p UTC") - text = tree.xpath('//*[@class="main-tweet"]/div/div/div[2]')[0].text_content() - if text == "": - text = "[Image only]" - replying_to_elems = tree.xpath('//*[@class="before-tweet thread-line"]/div/a') - if replying_to_elems != []: - replying_to = int(urllib.parse.urlparse(replying_to_elems[-1].get("href")).path.split("/")[-1]) - else: - replying_to = None - - images = [] - images_elems = tree.xpath('//*[@class="main-tweet"]/div/div/div[3]/div/div/a/img') - for image_elem in images_elems: - images.append("https://" + CONFIG.get("nitter", "outsideurl") + urllib.parse.urlparse(image_elem.get("src")).path) - - return dt, replying_to, text, images - -def scrape_whispa(whispa_url, since): - tree = html.fromstring(requests.get(whispa_url).content.decode()) - qnas = [] - # we're not doing proper HTML scraping here really... since the site uses client side rendering - # we rather parse the JS scripts to get the JSON payload of useful information... sadly this looks horrible - for i, script in enumerate(tree.xpath("/html/body/script"), 0): - js = str(script.text) - if "receivedFeedback" in js: - # my god this is horrible... - for j in json.loads(json.loads(js[19:-1])[1][2:])[0][3]["loadedUser"]["receivedFeedback"]: - dt = datetime.datetime.fromisoformat(j["childFeedback"][0]["createdAt"][:-1]) - - qnas.append({ - # "id": int(str(maths.modf(maths.log(int(j["id"], 16)))[0])[2:]), - "id": int(dt.timestamp()), - "link": None, - "datetime": dt, - "question": j["content"], - "answer": j["childFeedback"][0]["content"], - "host": "whispa.sh" - }) - return qnas - -def get_docker_containers(host, ssh_key_path): - result = fabric.Connection( - host = host, - user = "root", - connect_kwargs = { - "key_filename": ssh_key_path, - "look_for_keys": False - } - ).run('docker ps -a -s --format "table {{.Names}};{{.Status}};{{.Image}}"', hide = True) - return [line.split(";") for line in result.stdout.split("\n")[1:-1]] - -def cache_all_docker_containers(ssh_key_path): - containers = {} - containers["containers"] = {} - for host, name in CONFIG["docker_hosts"].items(): - print(host) - containers["containers"][(host, name)] = get_docker_containers(host, ssh_key_path) - - containers["cachetime"] = "Docker information last updated at %s" % str(datetime.datetime.now()) - with open("/tmp/docker-cache.json", "wb") as f: - pickle.dump(containers, f) - -def get_all_docker_containers(): - if not os.path.exists("/tmp/docker-cache.json"): - return {"containers": {}, "cachetime": "No cached docker information"} - - with open("/tmp/docker-cache.json", "rb") as f: - return pickle.load(f) - -def timeout(func): - # cant get this to work with queue.Queue() for some reason? - # this works but Manager() uses an extra thread than Queue() - manager = multiprocessing.Manager() - returnVan = manager.list() - # ti = time.time() - - def runFunc(q, func): - q.append(func()) - - def beginTimeout(): - t = multiprocessing.Process(target = runFunc, args = (returnVan, func)) - t.start() - - t.join(timeout = CONFIG["servicetimeout"].getint("seconds")) - - # print("Request took:", time.time() - ti) - try: - return returnVan[0] - except IndexError: - if t.is_alive(): - t.terminate() - - return beginTimeout - -@timeout -def get_torrent_stats(): - client = transmission_rpc.client.Client( - host = CONFIG.get("transmission", "host") - ) - s = vars(client.session_stats())["fields"] - return { - "Active torrents:": s["activeTorrentCount"], - "Downloaded:": humanbytes(s["cumulative-stats"]["downloadedBytes"]), - "Uploaded:": humanbytes(s["cumulative-stats"]["uploadedBytes"]), - "Active time:": str(datetime.timedelta(seconds = s["cumulative-stats"]["secondsActive"])), - "Files added:": s["cumulative-stats"]["filesAdded"], - "Current upload speed": humanbytes(s["uploadSpeed"]) + "s/S", - "Current download speed:": humanbytes(s["downloadSpeed"]) + "s/S" - } - -@timeout -def get_pihole_stats(): - return PiHole.GetSummary(CONFIG.get("pihole", "url"), CONFIG.get("pihole", "key"), True) - -if __name__ == "__main__": - # print(get_trans_stats()) - - #print(scrape_nitter(CONFIG.get("twitter", "diary_account"), 1697430888617840909)) - # print(scrape_nitter("estrogenizedboy", 1698107440489734640)) - - # print(parse_tweet("https://nitter.net/HONMISGENDERER/status/1694231618443981161#m")) - - # print(request_recent_commits(since = datetime.datetime.now() - datetime.timedelta(days=30))) - - # print(scrape_whispa(CONFIG.get("qnas", "url"), datetime.datetime.fromtimestamp(0.0))) - print(cache_all_docker_containers(os.path.join(os.path.dirname(__file__), "edaweb-docker.pem"))) - - # print(get_torrent_stats()) diff --git a/static/images/0don0t4ofuc41-3776935852.jpg b/static/images/0don0t4ofuc41-3776935852.jpg deleted file mode 100755 index f65e951..0000000 Binary files a/static/images/0don0t4ofuc41-3776935852.jpg and /dev/null differ diff --git a/static/images/1544552064683.jpg b/static/images/1544552064683.jpg deleted file mode 100644 index 20a6527..0000000 Binary files a/static/images/1544552064683.jpg and /dev/null differ diff --git a/static/images/1549844950404.jpg b/static/images/1549844950404.jpg deleted file mode 100644 index 5197c11..0000000 Binary files a/static/images/1549844950404.jpg and /dev/null differ diff --git a/static/images/1555824429083.png b/static/images/1555824429083.png deleted file mode 100644 index 5b2fd0b..0000000 Binary files a/static/images/1555824429083.png and /dev/null differ diff --git a/static/images/1555824491105.png b/static/images/1555824491105.png deleted file mode 100644 index 2e20fca..0000000 Binary files a/static/images/1555824491105.png and /dev/null differ diff --git a/static/images/1671540582317176.png b/static/images/1671540582317176.png deleted file mode 100644 index dd741d3..0000000 Binary files a/static/images/1671540582317176.png and /dev/null differ diff --git a/static/images/1urouter.jpg b/static/images/1urouter.jpg deleted file mode 100755 index b295e59..0000000 Binary files a/static/images/1urouter.jpg and /dev/null differ diff --git a/static/images/20220401_222149.jpg b/static/images/20220401_222149.jpg deleted file mode 100644 index d9fecae..0000000 Binary files a/static/images/20220401_222149.jpg and /dev/null differ diff --git a/static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg b/static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg deleted file mode 100644 index cede48f..0000000 Binary files a/static/images/324162a23865a6a7e75761871d29935314cbc2b3.jpg and /dev/null differ diff --git a/static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg b/static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg deleted file mode 100755 index 1f75924..0000000 Binary files a/static/images/3502e26d0181c684bc17b56188bde6e80569d191_full.jpg and /dev/null differ diff --git a/static/images/5600x.jpg b/static/images/5600x.jpg deleted file mode 100644 index f3995b2..0000000 Binary files a/static/images/5600x.jpg and /dev/null differ diff --git a/static/images/9400t.jpg b/static/images/9400t.jpg deleted file mode 100755 index 175e8f1..0000000 Binary files a/static/images/9400t.jpg and /dev/null differ diff --git a/static/images/9400t_cooler.jpg b/static/images/9400t_cooler.jpg deleted file mode 100755 index dcfaf27..0000000 Binary files a/static/images/9400t_cooler.jpg and /dev/null differ diff --git a/static/images/E1NlPc1X0AEkB-s.png b/static/images/E1NlPc1X0AEkB-s.png deleted file mode 100755 index b0be028..0000000 Binary files a/static/images/E1NlPc1X0AEkB-s.png and /dev/null differ diff --git a/static/images/E3xdm-hWYAEADNx.jpg b/static/images/E3xdm-hWYAEADNx.jpg deleted file mode 100755 index d14513d..0000000 Binary files a/static/images/E3xdm-hWYAEADNx.jpg and /dev/null differ diff --git a/static/images/E4WhXAvWYAIFwEa.png b/static/images/E4WhXAvWYAIFwEa.png deleted file mode 100755 index 144eb45..0000000 Binary files a/static/images/E4WhXAvWYAIFwEa.png and /dev/null differ diff --git a/static/images/E4cjVaPXEAU83U0.png b/static/images/E4cjVaPXEAU83U0.png deleted file mode 100755 index 941a436..0000000 Binary files a/static/images/E4cjVaPXEAU83U0.png and /dev/null differ diff --git a/static/images/E7ODIBeX0AAivRV.jpg b/static/images/E7ODIBeX0AAivRV.jpg deleted file mode 100755 index dc52196..0000000 Binary files a/static/images/E7ODIBeX0AAivRV.jpg and /dev/null differ diff --git a/static/images/E7ODIZEWUAMQjty.jpg b/static/images/E7ODIZEWUAMQjty.jpg deleted file mode 100755 index 2e90eda..0000000 Binary files a/static/images/E7ODIZEWUAMQjty.jpg and /dev/null differ diff --git a/static/images/E7ODIv0WUAUp-ad.jpg b/static/images/E7ODIv0WUAUp-ad.jpg deleted file mode 100755 index 97e704e..0000000 Binary files a/static/images/E7ODIv0WUAUp-ad.jpg and /dev/null differ diff --git a/static/images/E7ODJELX0AAVqna.jpg b/static/images/E7ODJELX0AAVqna.jpg deleted file mode 100755 index eedfb14..0000000 Binary files a/static/images/E7ODJELX0AAVqna.jpg and /dev/null differ diff --git a/static/images/EbmVCYKWkAAwXKW.jpg b/static/images/EbmVCYKWkAAwXKW.jpg deleted file mode 100755 index 20b3a19..0000000 Binary files a/static/images/EbmVCYKWkAAwXKW.jpg and /dev/null differ diff --git a/static/images/Ffi1ducXEAArXDg.jpg b/static/images/Ffi1ducXEAArXDg.jpg deleted file mode 100644 index 5c31cc5..0000000 Binary files a/static/images/Ffi1ducXEAArXDg.jpg and /dev/null differ diff --git a/static/images/GGBDzuSXMAA1Ktk.jpg b/static/images/GGBDzuSXMAA1Ktk.jpg deleted file mode 100644 index 35e04e1..0000000 Binary files a/static/images/GGBDzuSXMAA1Ktk.jpg and /dev/null differ diff --git a/static/images/GSxGe_rXQAAgEhj.jpg b/static/images/GSxGe_rXQAAgEhj.jpg deleted file mode 100644 index 0351920..0000000 Binary files a/static/images/GSxGe_rXQAAgEhj.jpg and /dev/null differ diff --git a/static/images/GTq-GOgWQAErvCp.jpg b/static/images/GTq-GOgWQAErvCp.jpg deleted file mode 100644 index 6a2f7b4..0000000 Binary files a/static/images/GTq-GOgWQAErvCp.jpg and /dev/null differ diff --git a/static/images/GcyexeCW0AAYssz.jpg b/static/images/GcyexeCW0AAYssz.jpg deleted file mode 100644 index c0762a8..0000000 Binary files a/static/images/GcyexeCW0AAYssz.jpg and /dev/null differ diff --git a/static/images/IMG_-g4wqat.jpg b/static/images/IMG_-g4wqat.jpg deleted file mode 100755 index 9f05aaf..0000000 Binary files a/static/images/IMG_-g4wqat.jpg and /dev/null differ diff --git a/static/images/IMG_1602.jpg b/static/images/IMG_1602.jpg deleted file mode 100644 index d1937fb..0000000 Binary files a/static/images/IMG_1602.jpg and /dev/null differ diff --git a/static/images/IMG_1603.jpg b/static/images/IMG_1603.jpg deleted file mode 100644 index 4d3e8c1..0000000 Binary files a/static/images/IMG_1603.jpg and /dev/null differ diff --git a/static/images/IMG_1604.jpg b/static/images/IMG_1604.jpg deleted file mode 100644 index 4cc82c3..0000000 Binary files a/static/images/IMG_1604.jpg and /dev/null differ diff --git a/static/images/IMG_1605.jpg b/static/images/IMG_1605.jpg deleted file mode 100644 index 38d6770..0000000 Binary files a/static/images/IMG_1605.jpg and /dev/null differ diff --git a/static/images/IMG_1606.jpg b/static/images/IMG_1606.jpg deleted file mode 100644 index fcbe2a4..0000000 Binary files a/static/images/IMG_1606.jpg and /dev/null differ diff --git a/static/images/IMG_1607.jpg b/static/images/IMG_1607.jpg deleted file mode 100644 index 825e338..0000000 Binary files a/static/images/IMG_1607.jpg and /dev/null differ diff --git a/static/images/IMG_1609.jpg b/static/images/IMG_1609.jpg deleted file mode 100644 index 6b7d834..0000000 Binary files a/static/images/IMG_1609.jpg and /dev/null differ diff --git a/static/images/IMG_1610.jpg b/static/images/IMG_1610.jpg deleted file mode 100644 index d201596..0000000 Binary files a/static/images/IMG_1610.jpg and /dev/null differ diff --git a/static/images/IMG_1611.jpg b/static/images/IMG_1611.jpg deleted file mode 100644 index 9eb1af5..0000000 Binary files a/static/images/IMG_1611.jpg and /dev/null differ diff --git a/static/images/IMG_1612.jpg b/static/images/IMG_1612.jpg deleted file mode 100644 index f176c17..0000000 Binary files a/static/images/IMG_1612.jpg and /dev/null differ diff --git a/static/images/IMG_1613.png b/static/images/IMG_1613.png deleted file mode 100644 index 63b743a..0000000 Binary files a/static/images/IMG_1613.png and /dev/null differ diff --git a/static/images/IMG_1614.png b/static/images/IMG_1614.png deleted file mode 100644 index 349afb7..0000000 Binary files a/static/images/IMG_1614.png and /dev/null differ diff --git a/static/images/IMG_1615.jpg b/static/images/IMG_1615.jpg deleted file mode 100644 index da42a2b..0000000 Binary files a/static/images/IMG_1615.jpg and /dev/null differ diff --git a/static/images/IMG_1616.jpg b/static/images/IMG_1616.jpg deleted file mode 100644 index 6f83c38..0000000 Binary files a/static/images/IMG_1616.jpg and /dev/null differ diff --git a/static/images/IMG_1617.jpg b/static/images/IMG_1617.jpg deleted file mode 100644 index 7528c7d..0000000 Binary files a/static/images/IMG_1617.jpg and /dev/null differ diff --git a/static/images/IMG_1618.jpg b/static/images/IMG_1618.jpg deleted file mode 100644 index 9b82ea1..0000000 Binary files a/static/images/IMG_1618.jpg and /dev/null differ diff --git a/static/images/IMG_1619.jpg b/static/images/IMG_1619.jpg deleted file mode 100644 index ccae28a..0000000 Binary files a/static/images/IMG_1619.jpg and /dev/null differ diff --git a/static/images/IMG_1620.jpg b/static/images/IMG_1620.jpg deleted file mode 100644 index 54e92d6..0000000 Binary files a/static/images/IMG_1620.jpg and /dev/null differ diff --git a/static/images/IMG_1621.jpg b/static/images/IMG_1621.jpg deleted file mode 100644 index 5aebae0..0000000 Binary files a/static/images/IMG_1621.jpg and /dev/null differ diff --git a/static/images/IMG_1622.jpg b/static/images/IMG_1622.jpg deleted file mode 100644 index 56cc9c3..0000000 Binary files a/static/images/IMG_1622.jpg and /dev/null differ diff --git a/static/images/IMG_1623.jpg b/static/images/IMG_1623.jpg deleted file mode 100644 index 43d0107..0000000 Binary files a/static/images/IMG_1623.jpg and /dev/null differ diff --git a/static/images/IMG_1624.png b/static/images/IMG_1624.png deleted file mode 100644 index 4fd690f..0000000 Binary files a/static/images/IMG_1624.png and /dev/null differ diff --git a/static/images/IMG_1625.jpg b/static/images/IMG_1625.jpg deleted file mode 100644 index 496a7fa..0000000 Binary files a/static/images/IMG_1625.jpg and /dev/null differ diff --git a/static/images/IMG_1626.jpg b/static/images/IMG_1626.jpg deleted file mode 100644 index 90060fb..0000000 Binary files a/static/images/IMG_1626.jpg and /dev/null differ diff --git a/static/images/IMG_1627.jpg b/static/images/IMG_1627.jpg deleted file mode 100644 index 90c4f49..0000000 Binary files a/static/images/IMG_1627.jpg and /dev/null differ diff --git a/static/images/IMG_1628.jpg b/static/images/IMG_1628.jpg deleted file mode 100644 index f2cc8c6..0000000 Binary files a/static/images/IMG_1628.jpg and /dev/null differ diff --git a/static/images/IMG_1629.jpg b/static/images/IMG_1629.jpg deleted file mode 100644 index b19b03e..0000000 Binary files a/static/images/IMG_1629.jpg and /dev/null differ diff --git a/static/images/IMG_1630.jpg b/static/images/IMG_1630.jpg deleted file mode 100644 index ddef77b..0000000 Binary files a/static/images/IMG_1630.jpg and /dev/null differ diff --git a/static/images/IMG_1632.jpg b/static/images/IMG_1632.jpg deleted file mode 100644 index 070615a..0000000 Binary files a/static/images/IMG_1632.jpg and /dev/null differ diff --git a/static/images/IMG_1633.jpg b/static/images/IMG_1633.jpg deleted file mode 100644 index 6fa7ae8..0000000 Binary files a/static/images/IMG_1633.jpg and /dev/null differ diff --git a/static/images/IMG_1636.jpg b/static/images/IMG_1636.jpg deleted file mode 100644 index a3de5ad..0000000 Binary files a/static/images/IMG_1636.jpg and /dev/null differ diff --git a/static/images/IMG_1637.jpg b/static/images/IMG_1637.jpg deleted file mode 100644 index 8e6b489..0000000 Binary files a/static/images/IMG_1637.jpg and /dev/null differ diff --git a/static/images/IMG_1638.jpg b/static/images/IMG_1638.jpg deleted file mode 100644 index b9ca9f3..0000000 Binary files a/static/images/IMG_1638.jpg and /dev/null differ diff --git a/static/images/IMG_1639.jpg b/static/images/IMG_1639.jpg deleted file mode 100644 index 5695e58..0000000 Binary files a/static/images/IMG_1639.jpg and /dev/null differ diff --git a/static/images/IMG_1640.jpg b/static/images/IMG_1640.jpg deleted file mode 100644 index df3eaea..0000000 Binary files a/static/images/IMG_1640.jpg and /dev/null differ diff --git a/static/images/IMG_1641.jpg b/static/images/IMG_1641.jpg deleted file mode 100644 index ce2eddb..0000000 Binary files a/static/images/IMG_1641.jpg and /dev/null differ diff --git a/static/images/IMG_20210422_212009.jpg b/static/images/IMG_20210422_212009.jpg deleted file mode 100755 index a8337c4..0000000 Binary files a/static/images/IMG_20210422_212009.jpg and /dev/null differ diff --git a/static/images/IMG_20210824_175000.jpg b/static/images/IMG_20210824_175000.jpg deleted file mode 100755 index 216c617..0000000 Binary files a/static/images/IMG_20210824_175000.jpg and /dev/null differ diff --git a/static/images/IMG_20220809_172130442_HDR.jpg b/static/images/IMG_20220809_172130442_HDR.jpg deleted file mode 100755 index e1987f8..0000000 Binary files a/static/images/IMG_20220809_172130442_HDR.jpg and /dev/null differ diff --git a/static/images/IMG_20220811_133224877_HDR.jpg b/static/images/IMG_20220811_133224877_HDR.jpg deleted file mode 100755 index eb05b1b..0000000 Binary files a/static/images/IMG_20220811_133224877_HDR.jpg and /dev/null differ diff --git a/static/images/IMG_20220811_133224877_HDR_crop.jpg b/static/images/IMG_20220811_133224877_HDR_crop.jpg deleted file mode 100755 index 7bc63ba..0000000 Binary files a/static/images/IMG_20220811_133224877_HDR_crop.jpg and /dev/null differ diff --git a/static/images/IMG_20220812_112838125_HDR.jpg b/static/images/IMG_20220812_112838125_HDR.jpg deleted file mode 100755 index 6e56a49..0000000 Binary files a/static/images/IMG_20220812_112838125_HDR.jpg and /dev/null differ diff --git a/static/images/IMG_20220823_154457137_HDR.jpg b/static/images/IMG_20220823_154457137_HDR.jpg deleted file mode 100755 index b46f0fe..0000000 Binary files a/static/images/IMG_20220823_154457137_HDR.jpg and /dev/null differ diff --git a/static/images/IMG_20221023_163821542.jpg b/static/images/IMG_20221023_163821542.jpg deleted file mode 100755 index f2284df..0000000 Binary files a/static/images/IMG_20221023_163821542.jpg and /dev/null differ diff --git a/static/images/IMG_20230812_132400733_HDR.jpg b/static/images/IMG_20230812_132400733_HDR.jpg deleted file mode 100755 index 9f46bdc..0000000 Binary files a/static/images/IMG_20230812_132400733_HDR.jpg and /dev/null differ diff --git a/static/images/IMG_20230812_132632784_HDR.jpg b/static/images/IMG_20230812_132632784_HDR.jpg deleted file mode 100755 index 82060d1..0000000 Binary files a/static/images/IMG_20230812_132632784_HDR.jpg and /dev/null differ diff --git a/static/images/PXL_20250314_150055804.jpg b/static/images/PXL_20250314_150055804.jpg deleted file mode 100644 index b660e18..0000000 Binary files a/static/images/PXL_20250314_150055804.jpg and /dev/null differ diff --git a/static/images/Screenshot_20210520-221830.png b/static/images/Screenshot_20210520-221830.png deleted file mode 100755 index 33afee7..0000000 Binary files a/static/images/Screenshot_20210520-221830.png and /dev/null differ diff --git a/static/images/Screenshot_20210527_122432.png b/static/images/Screenshot_20210527_122432.png deleted file mode 100755 index 33432ff..0000000 Binary files a/static/images/Screenshot_20210527_122432.png and /dev/null differ diff --git a/static/images/Screenshot_20210620-144127.png b/static/images/Screenshot_20210620-144127.png deleted file mode 100755 index dd9b43a..0000000 Binary files a/static/images/Screenshot_20210620-144127.png and /dev/null differ diff --git a/static/images/Screenshot_20210620-231652.png b/static/images/Screenshot_20210620-231652.png deleted file mode 100755 index 5e2532d..0000000 Binary files a/static/images/Screenshot_20210620-231652.png and /dev/null differ diff --git a/static/images/Screenshot_20210727-072303.png b/static/images/Screenshot_20210727-072303.png deleted file mode 100755 index 7c03644..0000000 Binary files a/static/images/Screenshot_20210727-072303.png and /dev/null differ diff --git a/static/images/Screenshot_20210727-072344.png b/static/images/Screenshot_20210727-072344.png deleted file mode 100755 index 248644a..0000000 Binary files a/static/images/Screenshot_20210727-072344.png and /dev/null differ diff --git a/static/images/Screenshot_20210727-223004.png b/static/images/Screenshot_20210727-223004.png deleted file mode 100755 index dbe0630..0000000 Binary files a/static/images/Screenshot_20210727-223004.png and /dev/null differ diff --git a/static/images/Screenshot_20210731-181223.png b/static/images/Screenshot_20210731-181223.png deleted file mode 100755 index b1547be..0000000 Binary files a/static/images/Screenshot_20210731-181223.png and /dev/null differ diff --git a/static/images/Screenshot_20210731-181229.png b/static/images/Screenshot_20210731-181229.png deleted file mode 100755 index 363c17b..0000000 Binary files a/static/images/Screenshot_20210731-181229.png and /dev/null differ diff --git a/static/images/Screenshot_20210811-125853.png b/static/images/Screenshot_20210811-125853.png deleted file mode 100755 index 7d45240..0000000 Binary files a/static/images/Screenshot_20210811-125853.png and /dev/null differ diff --git a/static/images/Screenshot_20210818-203828.png b/static/images/Screenshot_20210818-203828.png deleted file mode 100755 index 8026a0c..0000000 Binary files a/static/images/Screenshot_20210818-203828.png and /dev/null differ diff --git a/static/images/Screenshot_20210825-131938.png b/static/images/Screenshot_20210825-131938.png deleted file mode 100755 index 4b16443..0000000 Binary files a/static/images/Screenshot_20210825-131938.png and /dev/null differ diff --git a/static/images/Startech.jpg b/static/images/Startech.jpg deleted file mode 100644 index ba7f02f..0000000 Binary files a/static/images/Startech.jpg and /dev/null differ diff --git a/static/images/a4-5000.jpg b/static/images/a4-5000.jpg deleted file mode 100755 index f26fd66..0000000 Binary files a/static/images/a4-5000.jpg and /dev/null differ diff --git a/static/images/aaaaahh.jpg b/static/images/aaaaahh.jpg deleted file mode 100755 index 8dac9d4..0000000 Binary files a/static/images/aaaaahh.jpg and /dev/null differ diff --git a/static/images/anti_nft_b.png b/static/images/anti_nft_b.png deleted file mode 100644 index 61dfb99..0000000 Binary files a/static/images/anti_nft_b.png and /dev/null differ diff --git a/static/images/arenas.jpg b/static/images/arenas.jpg deleted file mode 100644 index 2b2cac6..0000000 Binary files a/static/images/arenas.jpg and /dev/null differ diff --git a/static/images/basil.jpg b/static/images/basil.jpg deleted file mode 100755 index c63ba48..0000000 Binary files a/static/images/basil.jpg and /dev/null differ diff --git a/static/images/bigshark.png b/static/images/bigshark.png deleted file mode 100755 index a499fb1..0000000 Binary files a/static/images/bigshark.png and /dev/null differ diff --git a/static/images/bob.gif b/static/images/bob.gif deleted file mode 100755 index 90b6dd5..0000000 Binary files a/static/images/bob.gif and /dev/null differ diff --git a/static/images/braindamage.png b/static/images/braindamage.png deleted file mode 100755 index c26e75f..0000000 Binary files a/static/images/braindamage.png and /dev/null differ diff --git a/static/images/catonlap.jpg b/static/images/catonlap.jpg deleted file mode 100644 index 37e526b..0000000 Binary files a/static/images/catonlap.jpg and /dev/null differ diff --git a/static/images/chuddy.jpg b/static/images/chuddy.jpg deleted file mode 100644 index 7d732f7..0000000 Binary files a/static/images/chuddy.jpg and /dev/null differ diff --git a/static/images/cloudfree.png b/static/images/cloudfree.png deleted file mode 100644 index 71c6ff2..0000000 Binary files a/static/images/cloudfree.png and /dev/null differ diff --git a/static/images/embedded_img2.png b/static/images/embedded_img2.png deleted file mode 100755 index 3eeea56..0000000 Binary files a/static/images/embedded_img2.png and /dev/null differ diff --git a/static/images/embedded_img3.png b/static/images/embedded_img3.png deleted file mode 100755 index 2a55742..0000000 Binary files a/static/images/embedded_img3.png and /dev/null differ diff --git a/static/images/embedded_img4.png b/static/images/embedded_img4.png deleted file mode 100755 index 5e6ec6d..0000000 Binary files a/static/images/embedded_img4.png and /dev/null differ diff --git a/static/images/embedded_img5.PNG b/static/images/embedded_img5.PNG deleted file mode 100755 index c96d284..0000000 Binary files a/static/images/embedded_img5.PNG and /dev/null differ diff --git a/static/images/face.jpg b/static/images/face.jpg deleted file mode 100755 index b123e53..0000000 Binary files a/static/images/face.jpg and /dev/null differ diff --git a/static/images/first_server.jpg b/static/images/first_server.jpg deleted file mode 100755 index 8f537d7..0000000 Binary files a/static/images/first_server.jpg and /dev/null differ diff --git a/static/images/fstab.png b/static/images/fstab.png deleted file mode 100755 index 6acaa83..0000000 Binary files a/static/images/fstab.png and /dev/null differ diff --git a/static/images/graduation.jpg b/static/images/graduation.jpg deleted file mode 100644 index 89bafd7..0000000 Binary files a/static/images/graduation.jpg and /dev/null differ diff --git a/static/images/greenboi.jpg b/static/images/greenboi.jpg deleted file mode 100755 index 7761c8a..0000000 Binary files a/static/images/greenboi.jpg and /dev/null differ diff --git a/static/images/hpkvm_puttyconf.png b/static/images/hpkvm_puttyconf.png deleted file mode 100755 index 5e9852f..0000000 Binary files a/static/images/hpkvm_puttyconf.png and /dev/null differ diff --git a/static/images/hpkvm_serialconf.png b/static/images/hpkvm_serialconf.png deleted file mode 100755 index 76122c1..0000000 Binary files a/static/images/hpkvm_serialconf.png and /dev/null differ diff --git a/static/images/i5-1145G7.png b/static/images/i5-1145G7.png deleted file mode 100644 index 96b6fa3..0000000 Binary files a/static/images/i5-1145G7.png and /dev/null differ diff --git a/static/images/icons.png b/static/images/icons.png deleted file mode 100755 index 4f19e72..0000000 Binary files a/static/images/icons.png and /dev/null differ diff --git a/static/images/ioporn.jpg b/static/images/ioporn.jpg deleted file mode 100755 index 6608d31..0000000 Binary files a/static/images/ioporn.jpg and /dev/null differ diff --git a/static/images/its_true_1.jpg b/static/images/its_true_1.jpg deleted file mode 100755 index 3dddfb3..0000000 Binary files a/static/images/its_true_1.jpg and /dev/null differ diff --git a/static/images/its_true_2.jpg b/static/images/its_true_2.jpg deleted file mode 100755 index b532a21..0000000 Binary files a/static/images/its_true_2.jpg and /dev/null differ diff --git a/static/images/j1800.jpg b/static/images/j1800.jpg deleted file mode 100755 index 05db3a6..0000000 Binary files a/static/images/j1800.jpg and /dev/null differ diff --git a/static/images/j5040.jpg b/static/images/j5040.jpg deleted file mode 100755 index 1a24299..0000000 Binary files a/static/images/j5040.jpg and /dev/null differ diff --git a/static/images/j5040_server.jpg b/static/images/j5040_server.jpg deleted file mode 100755 index 9e2f3aa..0000000 Binary files a/static/images/j5040_server.jpg and /dev/null differ diff --git a/static/images/kvm_1.png b/static/images/kvm_1.png deleted file mode 100755 index fa05b15..0000000 Binary files a/static/images/kvm_1.png and /dev/null differ diff --git a/static/images/kvm_2.png b/static/images/kvm_2.png deleted file mode 100755 index 6fca0f8..0000000 Binary files a/static/images/kvm_2.png and /dev/null differ diff --git a/static/images/lackrack1.jpg b/static/images/lackrack1.jpg deleted file mode 100755 index 31c4f9d..0000000 Binary files a/static/images/lackrack1.jpg and /dev/null differ diff --git a/static/images/lackrack2.jpg b/static/images/lackrack2.jpg deleted file mode 100755 index 9fda7d8..0000000 Binary files a/static/images/lackrack2.jpg and /dev/null differ diff --git a/static/images/libreboot.jpg b/static/images/libreboot.jpg deleted file mode 100755 index 0bac72e..0000000 Binary files a/static/images/libreboot.jpg and /dev/null differ diff --git a/static/images/liostore.png b/static/images/liostore.png deleted file mode 100755 index 43003ee..0000000 Binary files a/static/images/liostore.png and /dev/null differ diff --git a/static/images/media_E9lTIldWUAEeT63.jpg b/static/images/media_E9lTIldWUAEeT63.jpg deleted file mode 100755 index b30195a..0000000 Binary files a/static/images/media_E9lTIldWUAEeT63.jpg and /dev/null differ diff --git a/static/images/media_FPus_2aXsAUhCu9.jpg b/static/images/media_FPus_2aXsAUhCu9.jpg deleted file mode 100755 index 398fadd..0000000 Binary files a/static/images/media_FPus_2aXsAUhCu9.jpg and /dev/null differ diff --git a/static/images/media_FRlRqYKXoAIw82O.jpg b/static/images/media_FRlRqYKXoAIw82O.jpg deleted file mode 100755 index b45a62b..0000000 Binary files a/static/images/media_FRlRqYKXoAIw82O.jpg and /dev/null differ diff --git a/static/images/media_FeP_m8FXEAAqcJs.jpg b/static/images/media_FeP_m8FXEAAqcJs.jpg deleted file mode 100755 index f3afe10..0000000 Binary files a/static/images/media_FeP_m8FXEAAqcJs.jpg and /dev/null differ diff --git a/static/images/media_FfcNNZ2WYAAz97v.jpg b/static/images/media_FfcNNZ2WYAAz97v.jpg deleted file mode 100755 index 8ae39ad..0000000 Binary files a/static/images/media_FfcNNZ2WYAAz97v.jpg and /dev/null differ diff --git a/static/images/media_FlBsMq2XwAATJX5.jpg b/static/images/media_FlBsMq2XwAATJX5.jpg deleted file mode 100644 index 7ba3ef1..0000000 Binary files a/static/images/media_FlBsMq2XwAATJX5.jpg and /dev/null differ diff --git a/static/images/media_FlBsfDcWQAQhJdP.jpg b/static/images/media_FlBsfDcWQAQhJdP.jpg deleted file mode 100644 index 601dfbe..0000000 Binary files a/static/images/media_FlBsfDcWQAQhJdP.jpg and /dev/null differ diff --git a/static/images/minecraft.png b/static/images/minecraft.png deleted file mode 100755 index 19210d2..0000000 Binary files a/static/images/minecraft.png and /dev/null differ diff --git a/static/images/new_switch_opened.jpg b/static/images/new_switch_opened.jpg deleted file mode 100755 index df797ed..0000000 Binary files a/static/images/new_switch_opened.jpg and /dev/null differ diff --git a/static/images/newdiscord.jpg b/static/images/newdiscord.jpg deleted file mode 100755 index d446602..0000000 Binary files a/static/images/newdiscord.jpg and /dev/null differ diff --git a/static/images/nicfan.jpg b/static/images/nicfan.jpg deleted file mode 100755 index 6c2415e..0000000 Binary files a/static/images/nicfan.jpg and /dev/null differ diff --git a/static/images/notstolenvalour4.png b/static/images/notstolenvalour4.png deleted file mode 100644 index f9e82e2..0000000 Binary files a/static/images/notstolenvalour4.png and /dev/null differ diff --git a/static/images/notstolenvalour5.png b/static/images/notstolenvalour5.png deleted file mode 100644 index 87c09da..0000000 Binary files a/static/images/notstolenvalour5.png and /dev/null differ diff --git a/static/images/notstolenvalour8.png b/static/images/notstolenvalour8.png deleted file mode 100644 index dcddf27..0000000 Binary files a/static/images/notstolenvalour8.png and /dev/null differ diff --git a/static/images/oldpic.png b/static/images/oldpic.png deleted file mode 100755 index 20314e4..0000000 Binary files a/static/images/oldpic.png and /dev/null differ diff --git a/static/images/pfsenseswissvpnportforwards.png b/static/images/pfsenseswissvpnportforwards.png deleted file mode 100644 index 34c05dc..0000000 Binary files a/static/images/pfsenseswissvpnportforwards.png and /dev/null differ diff --git a/static/images/photo_2022-12-07_14-06-03.jpg b/static/images/photo_2022-12-07_14-06-03.jpg deleted file mode 100755 index 224b748..0000000 Binary files a/static/images/photo_2022-12-07_14-06-03.jpg and /dev/null differ diff --git a/static/images/photo_5857106224099739202_y.jpg b/static/images/photo_5857106224099739202_y.jpg deleted file mode 100644 index c0a5820..0000000 Binary files a/static/images/photo_5857106224099739202_y.jpg and /dev/null differ diff --git a/static/images/powerani.gif b/static/images/powerani.gif deleted file mode 100644 index 1eb1a18..0000000 Binary files a/static/images/powerani.gif and /dev/null differ diff --git a/static/images/profile_images_1598652418580963328_ENk7xKDw.jpg b/static/images/profile_images_1598652418580963328_ENk7xKDw.jpg deleted file mode 100755 index 775d4e9..0000000 Binary files a/static/images/profile_images_1598652418580963328_ENk7xKDw.jpg and /dev/null differ diff --git a/static/images/rack1.jpg b/static/images/rack1.jpg deleted file mode 100755 index b5049e9..0000000 Binary files a/static/images/rack1.jpg and /dev/null differ diff --git a/static/images/rack2.jpg b/static/images/rack2.jpg deleted file mode 100755 index 1c9bc11..0000000 Binary files a/static/images/rack2.jpg and /dev/null differ diff --git a/static/images/router.jpg b/static/images/router.jpg deleted file mode 100755 index 587f0e0..0000000 Binary files a/static/images/router.jpg and /dev/null differ diff --git a/static/images/russian_isp.png b/static/images/russian_isp.png deleted file mode 100755 index 5b529c0..0000000 Binary files a/static/images/russian_isp.png and /dev/null differ diff --git a/static/images/russian_isp_abuse.png b/static/images/russian_isp_abuse.png deleted file mode 100755 index 96da244..0000000 Binary files a/static/images/russian_isp_abuse.png and /dev/null differ diff --git a/static/images/russian_nginx_logs.jpg b/static/images/russian_nginx_logs.jpg deleted file mode 100755 index 3fe22d3..0000000 Binary files a/static/images/russian_nginx_logs.jpg and /dev/null differ diff --git a/static/images/russian_yt.jpg b/static/images/russian_yt.jpg deleted file mode 100755 index 16f3767..0000000 Binary files a/static/images/russian_yt.jpg and /dev/null differ diff --git a/static/images/s-l1600.jpg b/static/images/s-l1600.jpg deleted file mode 100755 index 34a82cf..0000000 Binary files a/static/images/s-l1600.jpg and /dev/null differ diff --git a/static/images/s-l16001.jpg b/static/images/s-l16001.jpg deleted file mode 100755 index 0c34348..0000000 Binary files a/static/images/s-l16001.jpg and /dev/null differ diff --git a/static/images/s-l500.jpg b/static/images/s-l500.jpg deleted file mode 100755 index 92307ff..0000000 Binary files a/static/images/s-l500.jpg and /dev/null differ diff --git a/static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg b/static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg deleted file mode 100644 index b146bc4..0000000 Binary files a/static/images/sample_ede336afca555579dd78f051e4a23feaa838716d.jpg and /dev/null differ diff --git a/static/images/selfie.jpg b/static/images/selfie.jpg deleted file mode 100755 index 17730e8..0000000 Binary files a/static/images/selfie.jpg and /dev/null differ diff --git a/static/images/server.jpg b/static/images/server.jpg deleted file mode 100755 index 50bc1d7..0000000 Binary files a/static/images/server.jpg and /dev/null differ diff --git a/static/images/server2.jpg b/static/images/server2.jpg deleted file mode 100755 index dda70b1..0000000 Binary files a/static/images/server2.jpg and /dev/null differ diff --git a/static/images/shark1.jpg b/static/images/shark1.jpg deleted file mode 100755 index 394846c..0000000 Binary files a/static/images/shark1.jpg and /dev/null differ diff --git a/static/images/shark2.jpg b/static/images/shark2.jpg deleted file mode 100755 index 2c432cd..0000000 Binary files a/static/images/shark2.jpg and /dev/null differ diff --git a/static/images/shark3.jpg b/static/images/shark3.jpg deleted file mode 100755 index 5343254..0000000 Binary files a/static/images/shark3.jpg and /dev/null differ diff --git a/static/images/shark3.png b/static/images/shark3.png deleted file mode 100755 index 22e8ff9..0000000 Binary files a/static/images/shark3.png and /dev/null differ diff --git a/static/images/shun-hashimoto-mio-chibana.gif b/static/images/shun-hashimoto-mio-chibana.gif deleted file mode 100644 index 869793f..0000000 Binary files a/static/images/shun-hashimoto-mio-chibana.gif and /dev/null differ diff --git a/static/images/sicp.jpg b/static/images/sicp.jpg deleted file mode 100755 index 575a456..0000000 Binary files a/static/images/sicp.jpg and /dev/null differ diff --git a/static/images/startech_rack_1.jpg b/static/images/startech_rack_1.jpg deleted file mode 100755 index 1f66734..0000000 Binary files a/static/images/startech_rack_1.jpg and /dev/null differ diff --git a/static/images/startech_rack_2.jpg b/static/images/startech_rack_2.jpg deleted file mode 100755 index 47f9aac..0000000 Binary files a/static/images/startech_rack_2.jpg and /dev/null differ diff --git a/static/images/stolenvalour.jpg b/static/images/stolenvalour.jpg deleted file mode 100644 index d666623..0000000 Binary files a/static/images/stolenvalour.jpg and /dev/null differ diff --git a/static/images/sun.gif b/static/images/sun.gif deleted file mode 100755 index 674e32a..0000000 Binary files a/static/images/sun.gif and /dev/null differ diff --git a/static/images/switch.jpg b/static/images/switch.jpg deleted file mode 100755 index 64ab20c..0000000 Binary files a/static/images/switch.jpg and /dev/null differ diff --git a/static/images/switches.jpg b/static/images/switches.jpg deleted file mode 100755 index 8b56651..0000000 Binary files a/static/images/switches.jpg and /dev/null differ diff --git a/static/images/t30.jpg b/static/images/t30.jpg deleted file mode 100755 index 949d14b..0000000 Binary files a/static/images/t30.jpg and /dev/null differ diff --git a/static/images/techdome.jpg b/static/images/techdome.jpg deleted file mode 100644 index 74fe69c..0000000 Binary files a/static/images/techdome.jpg and /dev/null differ diff --git a/static/images/telegrampic.jpg b/static/images/telegrampic.jpg deleted file mode 100755 index ddadb8b..0000000 Binary files a/static/images/telegrampic.jpg and /dev/null differ diff --git a/static/images/telegrampic2.jpg b/static/images/telegrampic2.jpg deleted file mode 100755 index 8b306ff..0000000 Binary files a/static/images/telegrampic2.jpg and /dev/null differ diff --git a/static/images/testimonials.PNG b/static/images/testimonials.PNG deleted file mode 100755 index 8584cdd..0000000 Binary files a/static/images/testimonials.PNG and /dev/null differ diff --git a/static/images/theNVMEVault.png b/static/images/theNVMEVault.png deleted file mode 100755 index 2cf31d7..0000000 Binary files a/static/images/theNVMEVault.png and /dev/null differ diff --git a/static/images/twitterpic.jpg b/static/images/twitterpic.jpg deleted file mode 100755 index 57f16b4..0000000 Binary files a/static/images/twitterpic.jpg and /dev/null differ diff --git a/static/images/vcss-blue.gif b/static/images/vcss-blue.gif deleted file mode 100755 index c373b2a..0000000 Binary files a/static/images/vcss-blue.gif and /dev/null differ diff --git a/static/images/www.gif b/static/images/www.gif deleted file mode 100644 index 48fbd13..0000000 Binary files a/static/images/www.gif and /dev/null differ diff --git a/static/images/x200.jpg b/static/images/x200.jpg deleted file mode 100755 index d7e48eb..0000000 Binary files a/static/images/x200.jpg and /dev/null differ diff --git a/static/images/xeon.jpg b/static/images/xeon.jpg deleted file mode 100755 index 4b1eef9..0000000 Binary files a/static/images/xeon.jpg and /dev/null differ diff --git a/static/images/xeon_motherboard.jpg b/static/images/xeon_motherboard.jpg deleted file mode 100755 index a17819f..0000000 Binary files a/static/images/xeon_motherboard.jpg and /dev/null differ diff --git a/static/index.md b/static/index.md deleted file mode 100755 index a676d59..0000000 --- a/static/index.md +++ /dev/null @@ -1,36 +0,0 @@ -site now also avaliable under the domain [boymoder.blog](https://boymoder.blog)! - -![yaoi](/img/shun-hashimoto-mio-chibana.gif) - -## haiiiiiii -my name is eden and im a 23yo (boymoder/[fujoshi](https://www.urbandictionary.com/define.php?term=fujoshi)) computer science/robotics PhD student. i made my own website to encourage others to do so too. -i'll post my thoughts on here sometimes, and use this site to link to other stuff i host [more about me](/thought?id=2). - -[click here for a random image of lio fotia](/random?tags=lio_fotia) - -[click here for a random KawoShin image](/random?tags=nagisa_kaworu+ikari_shinji+yaoi) - -## FOSS alternative services - -- [nextcloud - dropbox (+ much more!) alternative](https://nc.eda.gay) -- [git server - github alternative](https://git.eda.gay/) -- [jellyfin - web player for ~~legally downloaded~~ TV and films](https://jellyfin.eda.gay) - RIP emby! - -[see the services im running right now](/services) (takes a couple seconds to load) - -these sites are hosted on my [homelab system](https://wiki.eda.gay) - -![startech 8u rack cropped](/img/GcyexeCW0AAYssz.jpg?w=300&h=5000) -![startech 12u rack cropped](/img/Startech.jpg?h=250&w=5000) - -## nice websites -- [wiby.me](http://wiby.me/) - search engine for old style websites with limited javascript (my site used to be on here but it got blacklisted for some reason?) -- [dysmorph.nekoweb.org](https://dysmorph.nekoweb.org/) - a site that is very based because it looks similar -- [boymoder.network](https://boymoder.network/) - website for boymoder awareness -- [4chan.org/lgbt/](https://boards.4channel.org/lgbt/) - but dont blame me if u catch brainworms -- [https://www.math.uni-bielefeld.de/~sillke/Twister/fun/elevator-fun90.html](https://www.math.uni-bielefeld.de/~sillke/Twister/fun/elevator-fun90.html) any website with a URL like this is gonna be good -- [boymoder.moe](https://nyaomidev.github.io/boymoder.moe/) -- [boymoders.com](https://boymoders.com) -- [john.citrons.xyz](https://john.citrons.xyz/) - for the nice 'ads' featured at the bottom of my page - - diff --git a/static/robots.txt b/static/robots.txt deleted file mode 100755 index c2aab7e..0000000 --- a/static/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: / \ No newline at end of file diff --git a/static/style.css b/static/style.css deleted file mode 100755 index 6069ebf..0000000 --- a/static/style.css +++ /dev/null @@ -1,211 +0,0 @@ -html { - background-color: black; - font-family: 'Open Sans', sans-serif; - font-size: small; -} - -body { - /* background: linear-gradient(red,orange,yellow,green,blue,indigo,violet); */ - margin-left: 0px; - margin-right: 0px; - margin-bottom: 0px; - position: relative; - background: black; -} - -#wrapper { - background-color: #f1f3f3; - max-width: 974px; - min-width: 850px; - margin: auto; - margin-top: -10px; -} - -header { - background-color: #f1f3f3; -} - - -#headerflex { - display: flex; -} - -#headers { - flex-grow: 1; -} - -header nav { - flex-grow: 1; - display: inline; -} - -#externallinks { - background-color: black; - text-align: center; -} - -#externallinks nav ul li a { - color: #f1f3f3; - font-size: smaller; -} - -header div { - padding-left: 20px; - /* padding-bottom: 10px; */ -} - -nav ul { - margin: 0; - padding: 0; -} - -nav li { - display: inline-block; - list-style-type: none; -} - -nav a { - text-decoration: none; - display: block; - padding: 5px 6px 5px 6px; - color: black; -} - -#TheTitle { - text-decoration: none; - color: black; -} - -#TheTitle h1 { - padding-left: 6px; -} - -#articles { - text-align: left; - background-color: white; -} - -article section table { - font-family: monospace; -} - -article section table td { - text-align: right; -} - -#randomImage img { - max-width: 65%; -} - -#content img { - max-width: 65%; -} - -aside { - width: 30%; - padding-left: 15px; - margin-left: 15px; - float: right; -} - -#contents { - font-size: xx-small; -} - -#contents ul { - padding-left: 12px; - line-height: 3px; - } - -#contents ul li { - list-style: none; -} - -#tags { - font-size: xx-small; -} - -#sidebarImage { - transform: translateX(10px); -} - -.header_linker { - font-size: x-small; -} - -#diaryentry { - list-style-type: none; -} - -#diaryentry ul { - list-style-type: none; - display: inline-block; -} - -#diaryentry ul li img { - max-height: 150px; - margin-top: 10px; -} - -.qnaheader { - font-weight: bold; -} - -blockquote span { - color: #789922; -} - -blockquote span::before { - content: ">"; -} - -.running { - background-color: green; -} - -.notRunning { - background-color: red; -} - -header img { - max-height: 110px; -} - -form #number_input { - width: 50px; - margin-left: 10px; -} - -form #url_input { - margin-left: 10px; -} - -body div div { - padding-left: 10px; - padding-right: 10px; -} - -footer { - padding: 300px 10px 5px 20px; - margin-bottom: 300px; - font-size: xx-small; - align-content: center; -} - -#footer_banners { - display: flex; - align-items: center; - -} - -@media (max-width: 1023px) { - body { - margin: 0; - padding: 0; - } - - #wrapper { - min-width: 100%; - margin-top: 0; - } -} diff --git a/templates/diary.html.j2 b/templates/diary.html.j2 deleted file mode 100755 index f6604f7..0000000 --- a/templates/diary.html.j2 +++ /dev/null @@ -1,26 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} -

this page might not be up-to-date if my diary account is search banned

-

if in doubt check my diary account
check if i'm currently search banned

-
- {% for dt, entries in diary.items() %} -
{{ dt }}
-
-
    - {% for entry in entries %} - {% if entry["images"] != [] %} -
      - {% for img in entry["images"] %} -
    • - {% endfor %} -
    - {% endif %} -
  1. -

    {{ entry["text"] }}

    -
  2. - {% endfor %} -
-
- {% endfor %} -
-{% endblock %} diff --git a/templates/discord.html.j2 b/templates/discord.html.j2 deleted file mode 100755 index 597fb4b..0000000 --- a/templates/discord.html.j2 +++ /dev/null @@ -1,5 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} -

You can contact me on discord (telegram preferred):

-

{{discord}}

- {% endblock %} \ No newline at end of file diff --git a/templates/index.html.j2 b/templates/index.html.j2 deleted file mode 100755 index d6c08d8..0000000 --- a/templates/index.html.j2 +++ /dev/null @@ -1,24 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} - - {{markdown|safe}} -
-

recent git commits:

- -
-{% endblock %} diff --git a/templates/isocd.html.j2 b/templates/isocd.html.j2 deleted file mode 100755 index 3c532c0..0000000 --- a/templates/isocd.html.j2 +++ /dev/null @@ -1,32 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} -

As discussed here, I will post a GNU/Linux install CD to you for free (provided you live in the United Kingdom). Just fill out the form below:

-
- -

- -

-

Sadly there is an upper limit on ISOs of 700Mb coz thats what u can fit on a cd ;_; so big isos arent listed


- -

- -

- -

- -

- -

- -

- -
-

I make no promises how long this will actually take, but you might get a special present too uwu

-

btw if u abuse this service i'll just ignore u

-

Testimonials

- -{% endblock %} \ No newline at end of file diff --git a/templates/isocd_confirmation.html.j2 b/templates/isocd_confirmation.html.j2 deleted file mode 100755 index 81045a8..0000000 --- a/templates/isocd_confirmation.html.j2 +++ /dev/null @@ -1,16 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} -

Your order has been placed. Expect a confirmation email to {{ email }} when I can be bothered to sort it out.

-
-

Your order/reference id is {{ id_ }}

-
-

The details were as follows:

- - {% for k, v in req.items() %} - - - - - {% endfor %} -
{{ k.upper() }}{{ v }}
-{% endblock %} \ No newline at end of file diff --git a/templates/nhdl.html.j2 b/templates/nhdl.html.j2 deleted file mode 100755 index 5ab62c2..0000000 --- a/templates/nhdl.html.j2 +++ /dev/null @@ -1,8 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} -
- -

- -
-{% endblock %} \ No newline at end of file diff --git a/templates/questions.html.j2 b/templates/questions.html.j2 deleted file mode 100644 index eb58380..0000000 --- a/templates/questions.html.j2 +++ /dev/null @@ -1,17 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} -

ask a question!

-
- {% for id_, link, dt, question, answer, host in qnas %} - {% if host == "curiouscat" %} -
{{ dt.isoformat() }} - {{ host }}
- {% else %} -
{{ dt.isoformat() }} - {{ host }}
- {% endif %} -
-

{{ question }}

-

{{ answer }}

- - {% endfor %} -
-{% endblock %} diff --git a/templates/random.html.j2 b/templates/random.html.j2 deleted file mode 100755 index 76b433b..0000000 --- a/templates/random.html.j2 +++ /dev/null @@ -1,22 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} - -
- -

generate another

-

artist link

-
-{% endblock %} \ No newline at end of file diff --git a/templates/services.html.j2 b/templates/services.html.j2 deleted file mode 100755 index 9f42c7f..0000000 --- a/templates/services.html.j2 +++ /dev/null @@ -1,59 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} -
-
-

docker

-
    - {% for host, containers in docker["containers"].items() %} -

    {{ "%s - %s" % (host[0], host[1]) }}

    - - {% for name, status, image in containers %} - - - {% if "Up" in status %} - - {% else %} - - {% endif %} - - - {% endfor %} -
    {{ name }}{{ status }}{{ status }}{{ image }}
    - {% endfor %} -
-

{{ docker["cachetime"] }}

-
- -
-

transmission

- {% if trans == None %} -

Couldn't access the transmission API. Is docker container running?

- {% else %} - - {% for k, v in trans.items() %} - - - - - {% endfor %} -
{{ k }}{{ v }}
- {% endif %} -
- -
-

pihole

- {% if pihole == None %} -

Couldn't access the pihole API. Is docker container running?

- {% else %} - - {% for k, v in pihole.items() %} - - - - - {% endfor %} -
{{ k }}{{ v }}
- {% endif %} -
-
-{% endblock %} \ No newline at end of file diff --git a/templates/template.html.j2 b/templates/template.html.j2 deleted file mode 100755 index 86618bc..0000000 --- a/templates/template.html.j2 +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - eda.gay :: {{title}} - - - - - - - -
-
- -
-
-

{{title}}

- -
- - {{image[0]}} - -
-
-
- {% block content %} - {% endblock %} -
- -
- - diff --git a/templates/thought.html.j2 b/templates/thought.html.j2 deleted file mode 100755 index 2a5b519..0000000 --- a/templates/thought.html.j2 +++ /dev/null @@ -1,29 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} - - {{ md_html|safe }} -{% endblock %} \ No newline at end of file diff --git a/templates/thoughts.html.j2 b/templates/thoughts.html.j2 deleted file mode 100755 index bf06f57..0000000 --- a/templates/thoughts.html.j2 +++ /dev/null @@ -1,12 +0,0 @@ -{% extends "template.html.j2" %} -{% block content %} - {% for category_name, thoughts in tree.items() %} -

{{category_name}}

-
- {% for id_, title, dt in thoughts %} -
{{title}}
-
{{dt}}
- {% endfor %} -
- {% endfor %} -{% endblock %} \ No newline at end of file -- cgit v1.2.3