aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contact.html9
-rw-r--r--cv.html21
-rw-r--r--images/icons/asterisk.pngbin0 -> 4870 bytes
-rw-r--r--images/icons/discord.pngbin0 -> 191058 bytes
-rw-r--r--images/icons/dmr.pngbin0 -> 200595 bytes
-rw-r--r--images/icons/dokuwiki.pngbin0 -> 29440 bytes
-rw-r--r--images/icons/kanboard.pngbin0 -> 3794 bytes
-rw-r--r--images/icons/openssl.pngbin0 -> 13880 bytes
-rw-r--r--images/icons/other.pngbin0 -> 7318 bytes
-rw-r--r--images/icons/youtube.pngbin0 -> 113953 bytes
-rw-r--r--index.html112
-rw-r--r--php/pager.php61
-rw-r--r--php/pgp.php64
-rw-r--r--projects/arfminesweeper/index.html139
-rw-r--r--projects/telephony/index.html180
15 files changed, 541 insertions, 45 deletions
diff --git a/contact.html b/contact.html
index 6fcfe4e..209a953 100644
--- a/contact.html
+++ b/contact.html
@@ -14,11 +14,14 @@
<hr>
<main>
<h2 class="center">Contact</h2>
- <p>Where to contact ARFNET's head system administrator</p>
+ <h3>Where to contact ARFNET's head system administrator</h3>
<ul>
<li>e-mail: arf20@arf20.com, webmaster@arf20.com, dmca@arf20.com, arfnet@proton.me, aruizfernandez05@gmail.com
- <a href="/arf20.ecc.asc">PGP</a></li>
- <li>Phone: +34 637 63 21 36</li>
+ <a href="/arf20.ecc.asc">PGP</a> <a href="/php/pgp.php">Verify &amp; encrypt</a></li>
+ <li>Mobile phone: +34 637 63 21 36</li>
+ <li>Office operator: +34 868 92 55 54 (press 1 for IVR, press 2 for V.34 BBS)</li>
+ <li>Brandmeister DMR: 2149160 (EA5JGX)</li>
+ <li><a href="/php/pager.php">Page me</a> (DAPNET): ea5jgx@ea-all or 710534@148.625MHz</li>
<li><a href="https://github.com/arf20">GitHub</a></li>
<li><a href="https://www.linkedin.com/in/%C3%A1ngel-ruiz-fernandez-562470229/">LinkedIn</a></li>
<li>Discord: arf20</li>
diff --git a/cv.html b/cv.html
index 83f8538..21da82e 100644
--- a/cv.html
+++ b/cv.html
@@ -48,8 +48,8 @@
<blockquote>
<h3><a href="https://um.es">Universidad de Murcia</a></h3>
<blockquote>
+ <b>2024-now:</b> Internal Student at [UMU FIUM] DIIC (with ANTS group): P4lang development with Edgecore switches at Gaia (GÉANT P4Lab) and 5G experimentation with Open5GS/srsRAN and Amarisoft Callbox
</blockquote>
- <li><b>2024-now:</b> Internal Student at [UMU FIUM] DIIC (with ANTS group): P4lang development with Edgecore switches at Gaia (GÉANT P4Lab) and 5G experimentation with Open5GS/srsRAN and Amarisoft Callbox</li>
<h3><a href="https://www.murcialanparty.com/">Murcia LAN Party</a></h3>
<blockquote>
<b>2023, 2024:</b> Volunteer, network and streaming
@@ -58,10 +58,16 @@
<h2>Education</h2>
<blockquote>
+ <h3><a href="https://www.upc.edu">Universidad Politecnica de Barcelona</a></h3>
+ <blockquote>
+ <p><a href="https://www.fib.upc.edu/ca/estudis/graus/grau-en-enginyeria-informatica">
+ <b>2025-now: </b>Computer Science degree (SICUE)
+ </a></p>
+ </blockquote>
<h3><a href="https://um.es">Universidad de Murcia</a></h3>
<blockquote>
<p><a href="https://www.um.es/web/informatica/">
- <b>2023-now: </b>Computer Science degree
+ <b>2023-2025: </b>Computer Science degree
</a></p>
</blockquote>
<h3>IES Ramon Arcas Meca (Lorca)</h3>
@@ -76,9 +82,14 @@
<h2>Certifications and licenses</h2>
<ul>
- <li><b>Jan 2024: </b>Hurricane Electric IPv6 Certification</li>
+ <li><b>Aug 2025: </b>RIPE NCC IPv6 Certification<br>
+ <div data-iframe-width="150" data-iframe-height="270" data-share-badge-id="67df9682-9cc4-4198-8c90-6a9d6a2d9c37" data-share-badge-host="https://www.credly.com"></div><script type="text/javascript" async src="https://cdn.credly.com/assets/utilities/embed.js"></script>
+ </li>
+ <li><b>Jan 2024: </b>Hurricane Electric IPv6 Certification<br>
+ <img src="https://ipv6.he.net/certification/create_badge.php?pass_name=arf20&amp;badge=2" style="border: 0; width: 250px; height: 194px" alt="IPv6 Certification Badge for arf20"></img>
+ </li>
<li><b>2022: </b>CEPT Radioamateur Licence (EA5JGX)</li>
- </ul>
+ </ul>
<h2>Memberships</h2>
<ul>
@@ -88,7 +99,7 @@
<h2>Awards</h2>
<ul>
- <li><b>May 2024: </b>Galileo Mastermind by ESA challenge at HackUPC 2024 for GalileoHack</li>
+ <li><b>May 2024: </b>Galileo Mastermind by ESA challenge at HackUPC 2024 for <a href="https://devpost.com/software/galileohack">GalileoHack</a></li>
</ul>
<h2>Languages</h2>
diff --git a/images/icons/asterisk.png b/images/icons/asterisk.png
new file mode 100644
index 0000000..5560779
--- /dev/null
+++ b/images/icons/asterisk.png
Binary files differ
diff --git a/images/icons/discord.png b/images/icons/discord.png
new file mode 100644
index 0000000..d001ed9
--- /dev/null
+++ b/images/icons/discord.png
Binary files differ
diff --git a/images/icons/dmr.png b/images/icons/dmr.png
new file mode 100644
index 0000000..064c84f
--- /dev/null
+++ b/images/icons/dmr.png
Binary files differ
diff --git a/images/icons/dokuwiki.png b/images/icons/dokuwiki.png
new file mode 100644
index 0000000..571c719
--- /dev/null
+++ b/images/icons/dokuwiki.png
Binary files differ
diff --git a/images/icons/kanboard.png b/images/icons/kanboard.png
new file mode 100644
index 0000000..8a6cc88
--- /dev/null
+++ b/images/icons/kanboard.png
Binary files differ
diff --git a/images/icons/openssl.png b/images/icons/openssl.png
new file mode 100644
index 0000000..f19b610
--- /dev/null
+++ b/images/icons/openssl.png
Binary files differ
diff --git a/images/icons/other.png b/images/icons/other.png
new file mode 100644
index 0000000..fadba3e
--- /dev/null
+++ b/images/icons/other.png
Binary files differ
diff --git a/images/icons/youtube.png b/images/icons/youtube.png
new file mode 100644
index 0000000..ebb2046
--- /dev/null
+++ b/images/icons/youtube.png
Binary files differ
diff --git a/index.html b/index.html
index 339dc41..7b6161a 100644
--- a/index.html
+++ b/index.html
@@ -28,15 +28,20 @@
flex: 50%;
}
- .fst {
+ .l1 {
font-size: 150%;
}
- .sec {
+ .l2 {
margin-left: 20px;
font-size: 150%;
}
+ .l3 {
+ margin-left: 40px;
+ font-size: 125%;
+ }
+
.imgcont {
width: 34px;
height: 34px;
@@ -53,102 +58,135 @@
</header>
<hr>
<nav class="navbar">
- <a class="navlink" href="/design.html">Design Philosophy</a>
- <a class="navlink" href="https://www.youtube.com/watch?v=lbsce1DniQA&list=PLhWQL9gpbCPb8JNtOFo760GUD4ekXiR-9">Youtube</a>
- <a class="navlink" href="http://cgit.arf20.com/">Git</a>
- <a class="navlink" href="https://github.com/ARF20NET">GitHub</a>
- <a class="navlink" href="/contact.html">Contact</a>
- <a class="navlink" href="http://lists.arf20.com">Mailing list</a>
- <a class="navlink" href="http://grafana.arf20.com/public-dashboards/074973f696bd4d56afcddb08a3114041">Grafana</a>
- <a class="navlink" href="https://discord.gg/jy6AjN9ACP">Discord</a>
- <a class="navlink" href="/donate.html">Donations and Accounting</a><br>
</nav>
- <marquee scrollamount="15">Now fully legal!!!</marquee>
+ <marquee scrollamount="15">I'm clankist</marquee>
<hr>
<main class="content">
<div class="row">
- <span class="fst">Meta</span><br>
- <div class="sec">
+ <span class="l1">Meta</span><br>
+ <div class="l2">
<div class="item imgcont"><img src="/images/about-me/me2.jpg"></div>
<a href="/about-me.html">About me</a><br>
</div>
- <div class="sec">
+ <a class="l3" href="/contact.html">Contact</a><br>
+ <div class="l2">
<div class="item imgcont"><img src="arfnet_logo.png"></div>
<a href="/about/">About ARFNET</a>
<a href="/explanation.txt">Lore</a>
</div>
- <span class="fst">Showcase</span><br>
- <a class="sec" href="/projects/">Projects</a><br>
- <div class="sec">
+ <a class="l3" href="/design.html">Design Philosophy</a><br>
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/youtube.png"></div>
+ <a href="https://www.youtube.com/watch?v=lbsce1DniQA&list=PLhWQL9gpbCPb8JNtOFo760GUD4ekXiR-9">Youtube</a><br>
+ </div>
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/discord.png"></div>
+ <a href="https://discord.gg/jy6AjN9ACP">Discord</a><br>
+ </div>
+ <a class="l2" href="http://grafana.arf20.com/public-dashboards/074973f696bd4d56afcddb08a3114041">Analytics</a><br>
+ <a class="l2" href="/donate.html">Donations and Accounting</a><br><br>
+
+ <span class="l1">Showcase</span><br>
+ <a class="l2" href="/projects/">Projects</a><br>
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/siril.png"></div>
<a href="/astro/">Astrophotography section</a><br>
</div>
- <a class="sec" href="https://blog.arf20.com">Blog</a><br>
- <span class="fst">Friends</span><br>
- <a class="sec" href="/webring.html">Webring</a><br>
+ <a class="l2" href="https://blog.arf20.com">Blog</a><br>
+ <span class="l1">Friends</span><br>
+ <a class="l2" href="/webring.html">Webring</a><br>
</div>
<div class="row">
- <div class="fst">
+ <div class="l1">
<a href="/services.html">Services</a> <a href="https://dash.arf20.com">Order now!</a>
</div>
- <div class="sec">
+ <div class="l2">
+ <div class="item imgcont"><img src="arfnet_logo.png"></div>
+ <a href="https://ftp.arf20.com/">Public File Server</a>
+ </div>
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/other.png"></div>
+ <a href="https://dark.arf20.com/">The Other File Server</a>
+ </div>
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/pepe.png"></div>
<a href="https://memes.arf20.com/">Memes</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/matrix.png"></div>
<a href="/chat.html">Chat</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/minecraft.png"></div>
<a href="/game.html">Game</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/squirrelmail.png"></div>
<a href="https://webmail.arf20.com">Webmail</a><br>
</div>
- <div class="sec">
+ <a class="l3" href="http://lists.arf20.com">Mailing lists archive</a><br>
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/nextcloud.png"></div>
<a href="https://nextcloud.arf20.com">Nextcloud</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/jellyfin.png"></div>
<a href="https://jellyfin.arf20.com">Jellyfin</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/cgit.png"></div>
<a href="http://cgit.arf20.com">Cgit</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/phpbb.png"></div>
<a href="http://forum.arf20.com">Forum</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/usenet.jpg"></div>
<a href="/usenet.html">USENET</a>
<a href="http://news.arf20.com/">Web newsreader</a><br>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/grafana.png"></div>
<a href="https://grafana.arf20.com">Grafana</a>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/debian.png"></div>
<a href="http://deb.arf20.com">Debian repo</a>
</div>
- <div class="sec">
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/openssl.png"></div>
+ <a href="https://pki.arf20.com">Certificate Authority</a>
+ </div>
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/mpd.png"></div>
- <a href="http://radio.arf20.com">Radio</a><br>
+ <a href="http://radio.arf20.com">Internet Radio</a><br>
</div>
- <div class="sec">
+ <div class="l2">
<div class="item imgcont"><img src="/images/icons/tux.png"></div>
<a href="http://os.arf20.com">Operating System Collection</a><br>
</div>
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/asterisk.png"></div>
+ <a href="/telco.html">VoIP Exchange</a><br>
+ </div>
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/dmr.png"></div>
+ <a href="http://raip.arf20.com">RaIP Net</a><br>
+ </div>
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/kanboard.png"></div>
+ <a href="http://kanboard.arf20.com">Kanboard</a><br>
+ </div>
+ <div class="l2">
+ <div class="item imgcont"><img src="/images/icons/dokuwiki.png"></div>
+ <a href="http://wiki.arf20.com">Wiki</a><br>
+ </div>
</div>
</main>
<hr>
<footer>
- <span>Last update 08-02-2025. Estabished 2019. Contact: <a target="_blank" href="mailto:arf20@arf20.com">arf20@arf20.com</a> <a href="/arf20.ecc.asc">PGP</a> Murcia, Spain.</span><br>
+ <span>Last update 08-02-2025. Established 2019. Contact: <a target="_blank" href="mailto:arf20@arf20.com">arf20@arf20.com</a> <a href="/arf20.ecc.asc">PGP</a> Murcia, Spain.</span><br>
<span>Everything here is by default published under the <a href="/LICENSE">GPLv3</a></span>
<span>Copyright &copy; 2025 ARFNET</span><br>
<img src="gifs/bestvw.gif">
diff --git a/php/pager.php b/php/pager.php
new file mode 100644
index 0000000..43b792c
--- /dev/null
+++ b/php/pager.php
@@ -0,0 +1,61 @@
+<?php
+
+$auth = "ea5jgx:KjNHWkLpy3XaJv2N7WIZ";//"callsign:password";
+$url = "http://www.hampager.de:8080/calls";
+
+if (isset($_GET["msg"])) {
+ $data = [
+ 'text' => $_GET["msg"],
+ 'callSignNames' => array( 'ea5jgx' ),
+ 'transmitterGroupNames' => array( 'ea-all' ),
+ 'emergency' => 'false'
+ ];
+
+ $options = [
+ 'http' => [
+ 'method' => 'POST',
+ 'header' => "Content-type: application/json\r\n".
+ "Authorization: Basic ".base64_encode("$auth")."\r\n",
+ 'content' => json_encode($data),
+ ],
+ ];
+
+ $context = stream_context_create($options);
+
+ $response = file_get_contents($url, false, $context);
+}
+
+?>
+
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" type="text/css" href="https://arf20.com/style.css">
+ <title>ARFNET</title>
+ </head>
+
+ <body>
+ <header><a href="/">
+ <img src="http://arf20.com/arfnet_logo.png" width="64"><span class="title"><strong>ARFNET</strong></span>
+ </a></header>
+ <hr>
+ <main>
+ <h2 class="center">Pager service</h2>
+ <form action="/php/pager.php" method="GET">
+ <h3>Page arf20!</h3>
+ <input type="text" name="msg">
+ <input type="submit" value="Page"><br>
+<?php
+if (isset($response)) {
+ if ($response === false)
+ echo "<span>Error</span>";
+ else
+ echo "<pre>$response</pre>";
+}
+?>
+ </form>
+ </main>
+ </body>
+</html>
diff --git a/php/pgp.php b/php/pgp.php
new file mode 100644
index 0000000..cd7c255
--- /dev/null
+++ b/php/pgp.php
@@ -0,0 +1,64 @@
+<?php
+
+$result = null;
+
+if (isset($_GET["op"])) {
+ if (!file_exists('/tmp/gpg')) {
+ mkdir('/tmp/gpg', 0700, true);
+ $result = shell_exec("gpg --homedir /tmp/gpg --import --trust-model always ../arf20.ecc.asc 2>&1");
+ echo "<pre>$result</pre>";
+ $result = shell_exec("echo \"071FD0F02A0292F08EE1A121EB74F0C93E429F8E:5\n6DDA5B0BF8F154C4C0542B92DEBF11CAEEFA5962:5\" | gpg --homedir /tmp/gpg --import-ownertrust 2>&1");
+ echo "<pre>$result</pre>";
+
+ }
+ $data = $_GET["data"];
+ if ($_GET["op"] == "Verify") {
+ if (preg_match("[^a-zA-Z0-9+/=- ]+", $data) == 1)
+ die("invalid message");
+ $result = shell_exec("echo \"".$data."\" | gpg --homedir /tmp/gpg --no-tty --trust-model always --verify 2>&1");
+ } else if ($_GET["op"] == "Encrypt") {
+ if (preg_match("[\"\''\\]+", $data) == 1)
+ die("invalid character(s)");
+
+ $result = shell_exec("echo \"".$data."\" | gpg --homedir /tmp/gpg --no-tty --always-trust --encrypt --armor -r 071FD0F02A0292F08EE1A121EB74F0C93E429F8E 2>&1");
+ }
+}
+
+?>
+
+
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" type="text/css" href="https://arf20.com/style.css">
+ <title>ARFNET</title>
+ </head>
+
+ <body>
+ <header><a href="/">
+ <img src="http://arf20.com/arfnet_logo.png" width="64"><span class="title"><strong>ARFNET</strong></span>
+ </a></header>
+ <hr>
+ <main>
+ <h2 class="center">OpenPGP</h2>
+ <form action="/php/pgp.php" method="GET">
+ <h3>Verify something arf20 said, or encrypt something for arf20</h3>
+ <textarea name="data" rows="25" cols="80"><?php echo $_GET["data"]; ?></textarea><br>
+ <input type="submit" name="op" value="Verify"><input type="submit" name="op" value="Encrypt"><br>
+
+ </form>
+<?php
+if (isset($result)) {
+ if ($result === null) {
+ echo "Null";
+ } else if ($result === false) {
+ echo "False";
+ } else {
+ echo "<textarea readonly rows=\"25\" cols=\"80\">\n$result\n</textarea>";
+ }
+}
+?>
+ </main>
+ </body>
+</html>
diff --git a/projects/arfminesweeper/index.html b/projects/arfminesweeper/index.html
new file mode 100644
index 0000000..0ff9e5a
--- /dev/null
+++ b/projects/arfminesweeper/index.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" type="text/css" href="/style.css">
+ <title>ARFNET</title>
+ <style>
+ .sect {
+ margin-left: 20px;
+ }
+
+ .pics {
+ display: inline-block;
+ }
+ </style>
+ </head>
+
+ <body>
+ <header><a href="/">
+ <img src="/arfnet_logo.png" width="64"><span class="title"><strong>ARFNET</strong></span>
+ </a></header>
+ <hr>
+ <h2><a href="../index.html">Projects</a></h2>
+
+ <h2>arfminesweeper</h2>
+
+ <p>
+ The premise of this project is very simple: do the same thing in as
+ many ways as possible. That happens to be a minesweeper game, and
+ the ways to display the game in a computer. So I separated the game
+ logic backend, and made a number of frontends. Here follows an
+ account of each, broken up by categories.
+ </p>
+
+ <h3>Plataform independent text based</h3>
+ <blockquote>
+ <h4>console</h4>
+ <h4>VT100</h4>
+ <h4>ANSI color</h4>
+ <h4>ncurses</h4>
+ </blockquote>
+
+ <h3>Framebuffer based<h3>
+ <blockquote>
+ <h4>fbdev</h4>
+ <h4>DRM fb</h4>
+ </blockquote>
+
+ <h3>Display protocol libraries<h3>
+ <blockquote>
+ <h4>Xlib</h4>
+ <h4>Xcb</h4>
+ <h4>Wayland</h4>
+ <h4>Display PostScript</h4>
+ </blockquote>
+
+ <h3>Graphical User Interface Toolkits</h3>
+ <blockquote>
+ <h4>XForms</h4>
+ <h4>FLTK</h4>
+ <h4>Motif</h4>
+ <h4>XView</h4>
+ <h4>Athena</h4>
+ <h4>Xaw3d</h4>
+ <h4>XToolkit</h4>
+ <h4>Tcl/Tk</h4>
+ <h4>ImGui/GLFW</h4>
+ <h4>Gtk3</h4>
+ <h4>Gtk4</h4>
+ <h4>Qt5</h4>
+ <h4>Qt6</h4>
+ <h4>wxWidgets</h4>
+ </blockquote>
+
+ <h3>Graphical rendering APIs</h3>
+ <blockquote>
+ <h4>OpenGL 1.2 FFP/FreeGLUT</h4>
+ <h4>OpenGL 3.3/GLFW+GLAD</h4>
+ <h4>GLX</h4>
+ <h4>GLIDE</h4>
+ <h4>Vulkan/GLFW</h4>
+ <h4>Metal</h4>
+ </blockquote>
+
+ <h3>Graphical libraries</h3>
+ <blockquote>
+ <h4>raylib</h4>
+ <h4>SDL2</h4>
+ <h4>SDL1.2</h4>
+ </blockquote>
+
+ <h3>Windows<h3>
+ <blockquote>
+ <h4>comctl API</h4>
+ <h4>GDI</h4>
+ <h4>Direct2D</h4>
+ <h4>WinForms</h4>
+ <h4>WPF</h4>
+ <h4>UWP</h4>
+ <h4>WinUI 3</h4>
+ <h4>MAUI</h4>
+ </blockquote>
+
+ <h3>Java</h3>
+ <blockquote>
+ <h4>AWT</h4>
+ <h4>Swing</h4>
+ </blockquote>
+
+ <h3>Web application</h3>
+ <blockquote>
+ <h4>HTTP with REST<h4>
+ </blockquote>
+
+ <h3>Non-userspace</h3>
+ </blockquote>
+ <h4>Linux kernel module</h4>
+ <h4>BIOS kernel</h4>
+ <blockquote>
+ <h4>VGA text mode console</h4>
+ <h4>VGA text mode</h4>
+ <h4>VGA text mode graphic characters</h4>
+ <h4>VGA graphic mode</h4>
+ <h4>VESA graphic mode</h4>
+ </blockquote>
+ <h4>UEFI application</h4>
+ <blockquote>
+ <h4>UEFI console</h4>
+ </blockquote>
+ <blockquote>
+
+ <div class="pics">
+ <img src=".jpg" width=49%>
+ <img src="vcr.jpg" width=49%>
+ </div>
+
+ </body>
+</html>
+
diff --git a/projects/telephony/index.html b/projects/telephony/index.html
new file mode 100644
index 0000000..e0f576f
--- /dev/null
+++ b/projects/telephony/index.html
@@ -0,0 +1,180 @@
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" type="text/css" href="/style.css">
+ <title>ARFNET</title>
+ <style>
+ .sect {
+ margin-left: 20px;
+ }
+
+ .pics {
+ display: inline-block;
+ }
+ </style>
+ </head>
+
+ <body>
+ <header><a href="/">
+ <img src="/arfnet_logo.png" width="64"><span class="title"><strong>ARFNET</strong></span>
+ </a></header>
+ <hr>
+ <h2><a href="../index.html">Projects</a></h2>
+ <h2>telephony</h2>
+
+
+ <h3>Intro</h3>
+
+ <p>
+ We've all had landlines at home, but what first got me interested in telephony,
+ was a laptop with an internal modem which I got to play with, and a InfoVia Plus information card
+ with my cousin, which in my failing memory I think is whom I owe my love for retrocomputing and by extension
+ everything technologically dated, although my tasted may shift towards professional and enterprise hardware.
+ </p>
+
+ <h3>Dial-Up backstory</h3>
+
+ <p>
+ The InfoVía Plus thing is rather interesting. As far as I know its a dial-up service created by Telefónica in 1999
+ for the price of the phone call, which it was still a monopoly of Telefonica. Of course, I wasn't alive to
+ see it in its time but rather, much much later in the mid 2010s, by which time the service was still very much
+ in service, although I'd imagine with few users given that the DSL, VDSL and mostly ADSL broadband services and later
+ HFC of other, emerging ISPs took much of the clientele of Telefónica itself. I'd use a Fujitso Siemens laptop from
+ my father with an internal modem, and using Windows XP dial my town's node and connect with if I remember correctly
+ something like infovia@123 via PPP, and get 33.8 or 48kbps sometimes of internet connectivity. With which you could
+ navigate good ol' sites like sdf.org, frogsearch, stoff.pl? And of course ARFNET. At the time of writing, I made a
+ small survey and I could only find one node still running and answering, the Toledo one.
+ </p>
+
+ <h3>Meta and first steps</h3>
+ <p>
+ Consider this document not a writeup, but something like an evolving tale, which starts with the online
+ finding and holy installation of sacred Asterisk Open Source PBX and telephony toolkit; followed by the interpretation
+ of the holy configuration scriptures, and sacred online documentation. As you may expect, my 17-year-old
+ ass got bored of not getting that nonsense to work pretty quick with the ancient, arcane chan_sip module of what is now
+ Debian oldstable's package.
+ </p>
+
+ <p>
+ Thankfully, the story didn't end there. Thanks to the inspiration of SDF and its people, I pressed on
+ but in reality it took several attempts, fixations, frustrations and abandonment over the course of
+ several years until today, when I can finally say I did it. I here described how I did it do the silly things
+ a telephone system does.
+ </p>
+
+ <p>
+ After finding how useless the chan_sip module is I decided to just build a modern version of Asterisk from source (20 at the time)
+ I followed many tutorials that used the wizard configuration but I never got that to work either. So I asked for help
+ at some friend's nerdy telephony (among other things) discord and set up the chan_pjsip module, which actually did work, with
+ softphone clients (MicroSIP on windows). I didn't go much further than that, and left it like that.
+ </p>
+
+ <p>
+ Later I went looking for real hardware to use with my newly setup PBX, like ATAs and IP phones,
+ but I didn't have any purchasing power at the time, until someday at school I was given two Cisco 3911 IP phones from school,
+ from my legend, Rosendo, the guy himself. However, I immediately discovered Cisco and its shenanigans.
+ A time of despair.
+ </p>
+
+ <h3>ATAs</h3>
+
+ <p>
+ Another time, at a local morrocan flea market, I found a god damm Linksys PAP2T ATA somehow??? You never know what you find
+ in those places. Old vidicon cameras? Rotary phones? Yamaha keyboards? A bit of a time machine these markets are,
+ from I guess the fleeing old rich population of the south, since the increasing collapse of the economy and
+ opportunities, too bad! Their time is over. With the newly acquired ATA for a whoopping 3€, I figured out
+ from the manual that it had a password, and I had to reset it with a god forsaken code from an old forum,
+ dialing with a god knows brand 2000s cheap small gondola-style phone I got from a friend. I then proceeded to set it
+ up at home with its ancient webfig, and it pretty much just worked. I was able to make calls and all.
+ </p>
+
+ <p>
+ I then got another ATA bought from another friend, a Grandstream HT702, hoping that it would
+ work with rotary phones (haven't tested that yet, but the webfig makes no mention to pulse dialing)
+ and I set it up at my student place, to register remotely over the internet (since I had no router
+ capable of doing site-to-site tunneling (asaide from that damm Mikrotik that I could
+ never get to work)) and for the first time, I could make a real phone-to-phone call, over the internet
+ using the PBX, to a remote place (my parent's) so it finally could have purpose. Note: for the
+ purposes of the story, I am telling it in a rather linear fashion trying to make it make sense
+ but in reality some of these events are very mixed and intertwined with much more failure than success.
+ </p>
+
+ <h3>IP phones</h3>
+
+ <p>
+ At a different unspecified time, rather parallel, I got another, Cisco IP phone, a 7941, from a friend
+ and got told this one COULD work with Asterisk if I flashed it with its SIP firmware (Asterisk does not ship with SCCP or skippy support).
+ So anyway, I bricked it in the process. And it stayed so until recently where I had the brilliant idea of
+ flashing its original firmware back, and that got it unbricked. The brick mode was rather silly,
+ because it would stay in flashing mode whenever it booted, try to download firmware, fail and reboot again.
+ The reason I got back to the original SCCP firmware is that I got told about the existance of the out of tree chan_sccp asterisk module, which is actually really really good.
+ </p>
+
+
+ <h4>SEPfiles</h4>
+ <p>
+ Cisco IP phones automatically get their IP addresses via DHCP, and from it take a TFTP server,
+ from which they try to download among other things, a file named SEP<MAC>.cnf.xml, <MAC> being
+ the phone's MAC address in uppercase hex without separators. This is the so called sepfile and
+ it describes the phone's configuration, including but not limited to its time server, Cisco UCM server,
+ timezones, directory URLs, and stuff. I was able to find a sepfile for the 7941 but not for the 3911 phones.
+ Which launched me on a very long detour that took around 51 years.
+ </p>
+
+ <h4>Cisco 7941</h4>
+ <p>
+ So, having burnt the SCCP firmware back again, I installed chan_sccp from source to the asterisk and tested the module.
+ And with a SEP file for the 7941 I got off the internet, I modified it and pointed the phone to the Asterisk running chan_sccp masking as
+ CUCM, and allll the SCCP features just work out of the box! I'd even dare to say that the experience is better than chan_pjsip. Awesome
+ </p>
+
+ <h4>Cisco Unified Communications Manager</h4>
+ <p>
+ For the purposes of making the 3911s work, I got a CUCM ISO from the internet and spent too much
+ time trying to virtualise it in KVM, first installing it on VMWare and then moving it over to KVM trying to
+ virtualise the devices it expects. After getting it to boot, I proceeded to set up all the required objects
+ and configuration to add a phone device, the 3911.
+ </p>
+
+ <h4>Cisco 3911</h4>
+ <p>
+ When I confirmed that the 3911 indeed registers with CUCM, I used a tftp client to fetch its SEP file
+ and modified it to my needs to point it to asterisk, having added the corresponding endpoint, aor, auth and stuff.
+ And to my surprise, ancient Cisco SIP works with Asterisk. Damm. No fancy features though.
+ </p>
+
+ <h3>Trunks</h3>
+
+ <p>
+ The original inspiration in the project was to have a PBX with an SDF SIP trunk. I think I did get it to work a while ago, but
+ in the meantime of trying stuff I guess it broke, but I recently fixed it! Copying another working configuration from a posterior trunk.
+ </p>
+
+ <p>
+ After having the ATAs working roughly as they are now, someone told me about TandmX, and it was simple enough to join,
+ being an IAX2 trunk, very simple and stable, and met a whole lot of people in their discord.
+ </p>
+
+ <p>
+ A bunch of years after hiring AvanzaFibra and being told by someone somewhere that I could ask for the SIP credentials for my fixed
+ phone line that comes off the router (lines lying about being VoIP) which my ISP formally does not offer VoIP lines; I insisted over the phone and raised
+ a ticket 3 times until eventually I could talk to an actual tech that knew what the hell I was talking about. He had to generate new creds for my line (the ISP's CPE ATA would stop working (thats fine))
+ and he would have it sent to my email, so they did. It registered correctly but after a minute the trunk would stop working, originating or terminating calls for some reason. The reason was keepalive I think.
+ So I made Asterisk do keepalives (SIP OPTIONS) every 58 seconds). Then applied the same config to the SDF trunk apparently. Now I have PSTN calls!!!
+ </p>
+
+ <div class="pics">
+ <img src="cam.jpg" width=49%>
+ <img src="vcr.jpg" width=49%>
+ </div>
+
+
+ <div class="pics">
+ <img src="in1.jpg" width=32%>
+ <img src="in2.jpg" width=32%>
+ <img src="bat.jpg" width=32%>
+ </div>
+ </body>
+</html>
+