<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.ampr.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=W6JMK</id>
	<title>44Net Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.ampr.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=W6JMK"/>
	<link rel="alternate" type="text/html" href="https://wiki.ampr.org/wiki/Special:Contributions/W6JMK"/>
	<updated>2026-04-20T11:54:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Portal_intro&amp;diff=1420</id>
		<title>Portal intro</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Portal_intro&amp;diff=1420"/>
		<updated>2024-10-24T19:13:26Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: link to the API page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=DRAFT - In Progress=&lt;br /&gt;
&lt;br /&gt;
= ARDC Portal 2.0 Technical Documentation =&lt;br /&gt;
&lt;br /&gt;
By Rebecca Key KO4KVG&lt;br /&gt;
&lt;br /&gt;
Version: 4 (October 22, 2024)&lt;br /&gt;
&lt;br /&gt;
== Accessing the Portal ==&lt;br /&gt;
&lt;br /&gt;
Go to [https://portal.ampr.org/home https://portal.ampr.org], where you should see the following UI: &lt;br /&gt;
&lt;br /&gt;
[[File:Portal-homepage-login-v4.png|750px]]&lt;br /&gt;
&lt;br /&gt;
== Registration ==&lt;br /&gt;
&lt;br /&gt;
# Click on the &#039;Register&#039; button at the top right of the UI (see &#039;Accessing the Portal&#039;, step 1) or on the &#039;Register&#039; button in the &#039;LOGIN&#039; dialog box. This will take you to the following screen:&amp;lt;br&amp;gt;[[File:Registration-step-1-of-3-v4.png|750px]]&lt;br /&gt;
# Complete the field for &#039;What should we call you?:&#039; and click &#039;Continue&#039;.&lt;br /&gt;
# In the dialog box titled &#039;Registration (Step 2/3)&#039;, you will be introduced to help icons (&#039;?&#039;) that will provide you useful information throughout the Portal. Click &#039;Close&#039; to exit the dialog box.&amp;lt;br&amp;gt;[[File:Registration-step-2-of-3-popup-box-v4.png|740px]]&amp;lt;br&amp;gt;From there, you enter your Given name, Family name, email address, a username (used to login) and a password, then click &#039;Continue&#039;.&amp;lt;br&amp;gt;[[File:Registration-step-2-of-3-v4.png|750px]]&lt;br /&gt;
# You should then arrive at a dialog box titled &#039;Registration (Step 3/3)&#039; that displays the End User License Agreement (EULA). Read through the EULA, and if you agree to the terms and conditions, tick both &#039;I AM 18 YEARS OF AGE OR OLDER&#039;, and &#039;I accept and agree to the terms of this End User License Agreement&#039;, and then click &#039;I Accept&#039;. Note that if you are under the age of 18, and/or if you do not agree with the Terms of Use, then you will not be able to use the Portal.&amp;lt;br&amp;gt;[[File:Registration-step-3-of-3-v4.png|750px]]&lt;br /&gt;
## Note: When you log back in on a later date, you might get a notice about the addition and/or updates to the EULA. For example, if you see a dialog box titled &#039;The EULA has been updated&#039;, verify that you are 18 or older, and if you would like to continue using the Portal, accept the updated EULA. &lt;br /&gt;
# Upon accepting the Terms of Use, you should get a message (see below) informing you that the system is sending you an email verification with further instructions. Follow the instructions in this email.&amp;lt;br&amp;gt;[[File:Verify-email-v4.png|750px]]&lt;br /&gt;
# Once you complete the instructions in the email, you should get a page that looks like the one below, which will have an alert entitled &#039;You successfully verified your email&#039;. Fill in the information in the &#039;LOGIN&#039; dialog box and click &#039;Login&#039;.&amp;lt;br&amp;gt;[[File:email-verified-v3.png|750px]]&lt;br /&gt;
# From there, you will be prompted to click &#039;Continue Registration&#039;.&amp;lt;br&amp;gt;[[File:Continue-registration-v4.png|750px]]&lt;br /&gt;
# Once you click &#039;Continue Registration&#039;, you will be brought to a page where you will be asked to complete registration.&amp;lt;br&amp;gt;[[File:Complete-registration-form-v4.png|750px]]&lt;br /&gt;
# Confirm that the required information is correct; add any optional information you prefer to share; read and agree to the &#039;Terms and Conditions&#039;, and click the &#039;Continue&#039; button. You should then see a page that shows &#039;Registration Complete&#039;, which includes a note to verify your call sign as the next step.&amp;lt;br&amp;gt;[[File:Registration-complete-v4.png|750px]]&lt;br /&gt;
# To add and verify your call sign, go to the &#039;Account&#039; dropdown menu and select &#039;Call signs&#039;. You should see the &#039;Your call signs&#039; dialog box.&amp;lt;br&amp;gt;[[File:Your-call-signs-v4.png|750px]]&amp;lt;br&amp;gt;Click &#039;Add a call sign&#039;, where you will see a form to add your call sign. Enter your call sign in the input field and click &#039;Add&#039;.&amp;lt;br&amp;gt;[[File:Add-a-call-sign-v4.png|750px]]&amp;lt;br&amp;gt;You should then see a message stating &#039;The new call sign was successfully added&#039;.&amp;lt;br&amp;gt;[[File:Call-sign-successfully-added-v4.png|750px]]&amp;lt;br&amp;gt;Clicking the &#039;Make Primary&#039; button will make a desired call sign the primary call sign on the account, and you can delete a call sign from your account by simply clicking the &#039;Delete&#039; button.&lt;br /&gt;
## If you did not add your maidenhead to your profile, you will get a message at the top of the page stating: &amp;lt;br&amp;gt;[[File:Add-maidenhead-error-prompt-v4.png]]&amp;lt;br&amp;gt;above the &#039;Update your profile&#039; form.&amp;lt;br&amp;gt;[[File:Update-your-profile-maidenhead-v4.png|750px]]&amp;lt;br&amp;gt;Add your maidenhead, confirm your password, and click &#039;Save&#039;.&lt;br /&gt;
## You will then see the following message above the &#039;Update your profile&#039; form:&amp;lt;br&amp;gt;[[File:profile-updated-ok-message-v4.png|500px]]&lt;br /&gt;
## Go back to Step 10, where you&#039;ll be prompted to add your call sign.&amp;lt;br&amp;gt;&lt;br /&gt;
# On the &#039;Your call signs&#039; UI, click &#039;Verify&#039;. This will take you to a screen that details the process of verification.&amp;lt;br&amp;gt;[[File:Verify-call-sign-prompt-2-v4.png|750px]]&lt;br /&gt;
# Click on the green &#039;Verify&#039; button: you should see an alert saying &#039;Your request to verify your callsign [$call sign] has been submitted&#039;, which will create a ticket for the Portal admins to verify your call sign.&amp;lt;br&amp;gt;[[File:Callsign-is-verified-v4.png|750px]]&amp;lt;br&amp;gt;You can check the ticket by going to the &#039;Tickets&#039; dropdown menu, selecting &#039;View my tickets&#039;, where you see it listed. To see the details of the ticket, click &#039;View&#039;.&amp;lt;br&amp;gt;[[File:View-ticket-request-details-v4.png|500px]]&lt;br /&gt;
## Note that once your call sign has been verified, you will no longer see the ticket in the list. Alternatively, you can confirm that your call sign has been verified by going to &#039;Account&#039; &amp;gt; &#039;Call signs&#039;, and the status of your call sign verification will be displayed in the &#039;Your call signs&#039; dialog box. Once your call sign has been verified, you will be able to request address space.&amp;lt;br&amp;gt;[[File:Verified-call-sign-v4.png|750px]]&lt;br /&gt;
&lt;br /&gt;
== Requesting Address Space (Beginner Friendly Steps) ==&lt;br /&gt;
&lt;br /&gt;
This series of steps is aimed at users who are either new to requesting 44Net address space, need a refresher, or would like to streamline the process. Otherwise, you can also request address space via the Network list in the &#039;Requesting Address Space (via Network List)&#039; and &#039;Requesting Address Space for BGP Use (via Network List)&#039; sections below. &lt;br /&gt;
&lt;br /&gt;
# Under the &#039;Networks&#039; menu, select &#039;Request addresses&#039;. Note that you can also request address space on the Dashboard by clicking &#039;Request address space&#039;.&amp;lt;br&amp;gt;[[File:request-address-space-dashboard-v4.png|750px]]&lt;br /&gt;
# You should see a dialog box entitled &#039;Request Address Space&#039;. Select your address type (should be IPv4, as IPv6 is not currently available), use case, and click &#039;Continue&#039;. Please see the below instructions for your particular use case.&amp;lt;br&amp;gt;[[File:Request-address-space-form-v3.png|750px]]&lt;br /&gt;
&lt;br /&gt;
=== Use Case: IPIP Tunnel Mesh, Radio, Globally Unique Space, or General Address Assignment ===&lt;br /&gt;
&lt;br /&gt;
# If you selected IPIP tunnel mesh, radio, globally unique space, or general address assignment as your use case, you will see a dialog box entitled &#039;Request IP Assignment&#039;. Fill out the &#039;Request IP Assignment&#039; dialog box with the required information; agree to the EULA; and click &#039;Continue&#039;.&amp;lt;br&amp;gt;[[File:Request-ip-assignment-v4.png|750px]]&lt;br /&gt;
# You will then see the following note thanking you for requesting address space from ARDC, which includes detailed information about next steps.&amp;lt;br&amp;gt;[[File:Ty-for-requesting-address-space-v4.png|750px]]&lt;br /&gt;
# Once your address space has been assigned, you can proceed to step 6 under &#039;Requesting Address Space (via Network List)&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Use Case: BGP Direct Announce ===&lt;br /&gt;
&lt;br /&gt;
#If you selected &#039;BGP Direct Announce&#039; as your use case, you will see a dialog box entitled &#039;Request IP Assignment&#039;. Fill out the &#039;Request IP Assignment&#039; dialog box with the required information, agree to the EULA, and click &#039;Continue&#039;.&amp;lt;br&amp;gt;[[File:Request-ip-assignment-for-bgp-v4.png|750px]]&lt;br /&gt;
# Proceed to step 3 under &#039;Requesting Address Space for BGP Use (via Network List)&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Other Use Cases ===&lt;br /&gt;
&lt;br /&gt;
Selecting any of the below use cases will give you a dialog box that provides more details about the network:&lt;br /&gt;
* AREDN &lt;br /&gt;
* HAMNET &lt;br /&gt;
* HamWAN&lt;br /&gt;
&lt;br /&gt;
== Requesting Address Space (via Network List) ==&lt;br /&gt;
&lt;br /&gt;
# Under the &#039;Networks&#039; menu, select &#039;All IPv4 Networks&#039;. &lt;br /&gt;
# In the &#039;List IPv4 Networks&#039; dialog box, click the + sign to expand a line, or use the &#039;Expand All&#039; button.&amp;lt;br&amp;gt;[[File:List-ipv4-networks-v4.png|500px]]&lt;br /&gt;
# Scroll to look for the address space you are looking for (e.g., 44.63.0.0/16 - IPIP Mesh Assignments) and click on the green clipboard icon to the right of the assignment to request an assignment.&amp;lt;br&amp;gt;[[File:Request-network-assignment-v4.png|750px]]&lt;br /&gt;
# Fill out the &#039;Request IP Assignment&#039; dialog box with the required information, and click &#039;Continue&#039;.&amp;lt;br&amp;gt;[[File:Request-ip-assignment-v4-via-network-list.png|750px]]&amp;lt;br&amp;gt;You will see the dialog box titled &#039;Thank you for requesting address space from ARDC&#039; (see step 2 under &#039;Use Case: IPIP Tunnel Mesh, Radio, Globally Unique Space, or General Address Assignment&#039;), which includes detailed information about next steps.&lt;br /&gt;
# To confirm that your address space has been successfully requested, you can go to &#039;Tickets&#039; &amp;gt; &#039;View my tickets&#039; to see if the request is in your ticket list.&amp;lt;br&amp;gt;Note that you may be asked to provide more information to the Ticket Handler about your request before your address space is assigned.&amp;lt;br&amp;gt;[[File:Confirm-address-request-in-tickets-v4.png|750px]]&amp;lt;br&amp;gt;[[File:Justification-for-address-space-v4.png|750px]]&lt;br /&gt;
# Once your space has been assigned (and the associated ticket has been closed), you can view your IPv4 networks by going to &#039;Networks&#039; &amp;gt; &#039;my IPv4 networks&#039;, where your network detail(s) will be provided.&amp;lt;br&amp;gt;[[File:Network-detail-of-requested-address-space-v4.png|750px]]&lt;br /&gt;
&lt;br /&gt;
== Adding DNS Records to a Subdomain ==&lt;br /&gt;
&lt;br /&gt;
# On the &#039;DNS&#039; dropdown menu, select &#039;My subdomains&#039; and then click &#039;Request a subdomain&#039; in the &#039;My subdomains&#039; dialog box.&amp;lt;br&amp;gt;[[File:my-subdomain-dialog-box.png|750px]]&lt;br /&gt;
# Choose your domain, determine a name for your subdomain (i.e., most likely your call sign), click &#039;Create request&#039;, and you should see a note&amp;lt;br&amp;gt;[[File:Create-new-subdomain-request-v4.png|750px]]&amp;lt;br&amp;gt;saying &#039;Subdomain $[call sign].ampr.org has been assigned to you&#039;.&amp;lt;br&amp;gt;[[File:Subdomain-has-been-assigned-to-you-v4.png|750px]]&amp;lt;br&amp;gt;Please be aware that if your call sign has not been verified or if you are requesting a domain other than $[call sign].ampr.org, a ticket will be opened for an administrator to review your request(s).&amp;lt;br&amp;gt;You can verify that your subdomain has been created by going to &#039;DNS&#039; &amp;gt; &#039;My subdomains&#039;, and your subdomain should appear in the &#039;My subdomains&#039; dialog box.&amp;lt;br&amp;gt;[[File:Subdomain-creation-verification-v4.png|750px]]&lt;br /&gt;
# Once your subdomain has been created, you can add DNS records by going to &#039;DNS&#039; &amp;gt; &#039;My subdomains&#039;, and click the icon under &#039;Actions&#039; in the &#039;Subdomains&#039; dialog box (see step 2 above). &lt;br /&gt;
# In the &#039;Resource records for $subdomain.ampr.org&#039;, click &#039;Add a resource record&#039;.&amp;lt;br&amp;gt;[[File:add-resource-record.png|750px]]&lt;br /&gt;
# In the &#039;Create resource record for $subdomain.ampr.org&#039;, select the record type, and click &#039;Next&#039; (see below).&amp;lt;br&amp;gt;[[File:create-resource-record-step-1.png|750px]]&lt;br /&gt;
# Add the details relevant to the record type and ensure that Active is checked, click &#039;Create&#039;,&amp;lt;br&amp;gt;[[File:Create-resource-record-step-2-v4.png|750px]]&amp;lt;br&amp;gt;and you should get an alert that says &#039;Subdomain Record created successfully&#039;.&amp;lt;br&amp;gt;[[File:Subdomain-record-created-successfully-v4.png|750px]]&lt;br /&gt;
# You can verify that your record has been created by going to &#039;DNS&#039; &amp;gt; &#039;My records&#039; and look for the record that is associated with your subdomain.&amp;lt;br&amp;gt;[[File:record-associated-with-subdomain.png|750px]]&lt;br /&gt;
&lt;br /&gt;
== Creating a Gateway ==&lt;br /&gt;
&lt;br /&gt;
# Go to &#039;Networks&#039; &amp;gt; &#039;My gateways&#039; and click &#039;Create a Gateway&#039; in the &#039;My Gateways&#039; dialog box.&amp;lt;br&amp;gt;[[File:my-gateways.png|750px]]&lt;br /&gt;
# In the &#039;Create new Gateway&#039; dialog box, fill out all required fields (Hostname can be left blank), click &#039;Add&#039;, and you should get an alert saying &#039;Gateway created successfully.&#039;&amp;lt;br&amp;gt;[[File:create-new-gateway.png|750px]]&amp;lt;br&amp;gt;[[File:Gateway-created-successfully-v4.png|750px]]&lt;br /&gt;
# To add a subnet to your gateway, click the edit button under &#039;Actions&#039; (see step 2 above). You will be taken to an &#039;Update Gateway&#039; dialog box, which includes information about your gateway. Click &#039;Add New Network&#039;.&amp;lt;br&amp;gt;[[File:Update-gateway-v4.png|750px]]&lt;br /&gt;
# You will then see an &#039;Add New Network&#039; dialog box (see below). Select a network from your list of networks; leave &#039;Find Network&#039; field blank; and then click &#039;Add&#039;. You should see an alert titled &#039;Network Successfully Linked to this Gateway&#039; (see below). You can verify that your network has been added by clicking &#039;View My Gateways&#039; and seeing said gateway under &#039;My Gateways&#039; (see below).&amp;lt;br&amp;gt;[[File:add-new-network-v3.png|750px]]&amp;lt;br&amp;gt;[[File:Network-successfully-linked-to-gateway-v4.png|750px]]&amp;lt;br&amp;gt;[[File:verify-my-gateways-v3.2.png|750px]]&lt;br /&gt;
# If you would like to add someone else&#039;s network using their unique code, click &#039;Add New Network&#039;, which will take you to the &#039;Add New Network&#039; dialog box. Fill out the required information, and click &#039;Find&#039;. You should have a 44Net address displaying in the &#039;Network found&#039; field. Click &#039;Add&#039;, and you should see an alert titled &#039;Network Successfully Linked to this Gateway&#039; (see step 4 above).&amp;lt;br&amp;gt;[[File:Add-network-to-gateway-v4.png|750px]]&lt;br /&gt;
# You can add or remove linked networks by clicking the &#039;Add New Network&#039; or &#039;Unlink&#039; button, respectively (see steps 3 and 4 above).&lt;br /&gt;
&lt;br /&gt;
== Requesting Address Space for BGP Use (via Network List) ==&lt;br /&gt;
&lt;br /&gt;
# From the &#039;Networks&#039; dropdown menu, go to &#039;All IPv4 networks&#039;, and request a BGP assignment (e.g., 44.31.0.0/16 - BGP Assignments) by clicking on the &#039;Request Assignment&#039; icon to the right of the listed assignment (green clipboard).&amp;lt;br&amp;gt;[[File:Request-bgp-assignment-v4.png|500px]]&lt;br /&gt;
# On the &#039;Request IP Assignment&#039; dialog box, fill out the mandatory fields, agree to the EULA, and click &#039;Continue&#039;.&amp;lt;br&amp;gt;[[File:Request-ip-assignment-for-bgp-v4.png|750px]]&lt;br /&gt;
# You should see a &#039;BGP Information&#039; dialog box on the UI. Fill out the mandatory information, click &#039;Submit Request&#039;,&amp;lt;br&amp;gt;[[File:Bgp-information-v4.png|750px]]&amp;lt;br&amp;gt;and you should now see &#039;Thank you for requesting address space from ARDC&#039; (see Step 2 under &#039;Use Case: IPIP Tunnel Mesh, Radio, Globally Unique Space, or General Address Assignment&#039;). Note that the justification must be at least 100 characters.&lt;br /&gt;
# You can confirm the address has been successfully requested by going to &#039;Tickets&#039; &amp;gt; &#039;View my tickets&#039;, and your request should be visible in the &#039;List your tickets&#039; dialog box. Once the ticket has been closed, you should see the allocation listed in your IPv4 networks. &amp;lt;br&amp;gt;[[File:all-ipv4-allocations-by-user.png|500px]]&amp;lt;br&amp;gt;Clicking &#039;Edit&#039; will bring you to the &#039;Update Network&#039; dialog box, where you can make appropriate updates, download the EULA, download the Letter of Authorization (LOA), etc (see below).&amp;lt;br&amp;gt;[[File:update-network-v3.2.png|750px]]&lt;br /&gt;
&lt;br /&gt;
== v2.0 Features ==&lt;br /&gt;
&lt;br /&gt;
=== Dashboard ===&lt;br /&gt;
&lt;br /&gt;
After logging in, you should see your Dashboard. If your email has been verified, you should see an &#039;Account&#039; menu and a &#039;Tickets&#039; menu at the top right-hand side of the UI. If you have been granted additional privileges, you will see additional menus for those related privileges. The Dashboard will also display information boxes, such as your latest login, IP, and timestamp, or outstanding notifications you need to be aware of. &lt;br /&gt;
&lt;br /&gt;
[[File:Dashboard-v4.png|750px]]&lt;br /&gt;
&lt;br /&gt;
=== Help ===&lt;br /&gt;
&lt;br /&gt;
The &#039;Help&#039; dropdown menu provides the following options: &lt;br /&gt;
*&#039;&#039;&#039;View EULA&#039;&#039;&#039;: displays a copy of the Portal&#039;s End User License Agreement (EULA)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2FA&#039;&#039;&#039;: defines 2FA and provides details on multiple 2FA options to choose from to add to your account &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LoT&#039;&#039;&#039;: provides an overview of Level of Trust (LoT), how it works, and how to increase your LoT &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CIDR&#039;&#039;&#039;: provides an overview of Classless Inter-Domain Routing (CIDR) &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Limits&#039;&#039;&#039;: provides an explanation of your specific limits on Portal activities, which are directly related to your current LoT &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Member pages&#039;&#039;&#039;: These are pages generated by other members &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Subdomains&#039;&#039;&#039;: provides an overview of subdomains and DNS and steps needed to request subdomains &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Passwords&#039;&#039;&#039;: provides password requirements and recommendations for how to create a strong password for your Portal account &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Glossary&#039;&#039;&#039;: includes definitions for terminology relevant to using the Portal &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Community&#039;&#039;&#039;: includes links to ARDC&#039;s Groups.io group, along with links to relevant subgroups&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Lookup callsign&#039;&#039;&#039;: allows you to look up call signs of other users on the Portal&lt;br /&gt;
&lt;br /&gt;
=== Maps ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Distance&#039;&#039;&#039;: allows you to perform distance and bearing calculations&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maidenhead&#039;&#039;&#039;: allows you to generate a map from a Maidenhead locator&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Conversions&#039;&#039;&#039;: allows you to convert from DMS to lat/long and back&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;World map&#039;&#039;&#039;: a map that displays the approximate location for all members&lt;br /&gt;
&lt;br /&gt;
=== Account ===&lt;br /&gt;
&lt;br /&gt;
The &#039;Account&#039; dropdown menu provides the following options: &lt;br /&gt;
* &#039;&#039;&#039;Profile&#039;&#039;&#039;: allows you to view and update your personal data &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Call signs&#039;&#039;&#039;: allows you to add/remove/verify your call sign(s) &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;LoT entries&#039;&#039;&#039;: lists your Level of Trust (LoT) entires&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Verify address&#039;&#039;&#039;: allows you to go through the address verification process, which is needed if you are requesting BGP announced address space&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Organisations&#039;&#039;&#039;: allows you to create organizations and view information of the organizations you are affiliated with &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Notifications&#039;&#039;&#039;: displays a list of user notifications &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Notification types&#039;&#039;&#039;: displays all notification types/options &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;View all notifications&#039;&#039;&#039;: displays all your active notifications &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Logs&#039;&#039;&#039;: displays all your log entries &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;My public page&#039;&#039;&#039;: displays any public pages you have added and provides the ability to add more &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Delete my account&#039;&#039;&#039;: allows a user to delete their account &lt;br /&gt;
&lt;br /&gt;
==== Profile ====&lt;br /&gt;
&lt;br /&gt;
A user&#039;s profile is always available, whether or not a their email address has been verified. Through the profile, a user has access to the following: &lt;br /&gt;
* Personal Information (PII) a user chooses to share with ARDC &lt;br /&gt;
&lt;br /&gt;
* The ability for a user to update their account &lt;br /&gt;
&lt;br /&gt;
* The ability for a user to enable 2FA on their account &lt;br /&gt;
&lt;br /&gt;
Changes made to the profile will require the current password to be entered at the bottom of the page and clicking &#039;Save&#039; for changes take effect. &lt;br /&gt;
&lt;br /&gt;
==== Call signs ====&lt;br /&gt;
&lt;br /&gt;
Here, the user is presented with a list of all call signs they have entered. A user can add up to a maximum of five call signs (can be adjusted on a per user basis), with only one call sign being the primary. Clubs and organization can add up to 10 of their own call signs by default. Call signs must be verified before they can be used. All verified call signs must be unique within the system. &lt;br /&gt;
&lt;br /&gt;
==== Level of Trust (LoT) &amp;amp; LoT Entries ====&lt;br /&gt;
&lt;br /&gt;
The Portal uses various methods to verify users and thus gain &#039;trust&#039;, which is referred to as the &#039;Level of Trust&#039; (LoT). LoT is used to increase confidence that a user is who they say they are and record that there is a skill set and knowledge that is needed to assign responsibilities to said user in the Portal. &lt;br /&gt;
&lt;br /&gt;
As various tasks are accomplished, such as verification of email and/or call signs, points will be assigned to a users&#039; account. The more points a user has, the higher the LoT. You can learn more about LoT by going to either &#039;Help&#039; &amp;gt; &#039;LoT&#039; or &#039;Account&#039; &amp;gt; &#039;LoT info&#039; on the navigation menu. &lt;br /&gt;
&lt;br /&gt;
The LoT List is a read-only list for LoT entries of a user. You can find this list by going to &#039;Account&#039; &amp;gt; &#039;LoT list&#039;. A user will have at least one entry that shows that their email address was verified. Below are a few examples of what accesses are granted based on a user&#039;s LoT. &lt;br /&gt;
&lt;br /&gt;
* Email is not verified&lt;br /&gt;
** User can login, access their own profile, delete their account&lt;br /&gt;
* Call sign is not verified&lt;br /&gt;
** User cannot access DNS records or request address space &lt;br /&gt;
&lt;br /&gt;
==== Notifications ====&lt;br /&gt;
&lt;br /&gt;
The system informs users of various events via notifications.&amp;lt;br&amp;gt;[[File:Notification-types-v4.png|750px]]&lt;br /&gt;
&lt;br /&gt;
Mandatory Notifications: &lt;br /&gt;
* Contact Member &lt;br /&gt;
* Password Reset &lt;br /&gt;
* Ticket Reminder &lt;br /&gt;
* LoT Expiry &lt;br /&gt;
* LoT Added &lt;br /&gt;
* Account Expiry &lt;br /&gt;
* LOA Expiry&lt;br /&gt;
&lt;br /&gt;
Optional Notifications: &lt;br /&gt;
* Login &lt;br /&gt;
* Profile Update &lt;br /&gt;
* Ticket Assigned &lt;br /&gt;
* ...and many more &lt;br /&gt;
&lt;br /&gt;
Clicking on &#039;Methods&#039; (under the &#039;Actions&#039; column, see above) will allow the user to choose a preferred method of notification:&amp;lt;br&amp;gt;[[File:notification-methods.png|750px]]&lt;br /&gt;
&lt;br /&gt;
* Email &lt;br /&gt;
* SMS &lt;br /&gt;
* many more coming soon, e.g. Zulip, Signal, Telegram... &lt;br /&gt;
&lt;br /&gt;
=== Tickets ===&lt;br /&gt;
&lt;br /&gt;
Tickets track tasks, along with their associated progress, within the Portal. Items managed by tickets include, but are not limited to: &lt;br /&gt;
* Call sign verification &lt;br /&gt;
* Request(s) for resources (e.g., address space) &lt;br /&gt;
&lt;br /&gt;
The &#039;Tickets&#039; dropdown menu will allow the user to view all of their tickets, create a new support ticket, and serves as a reference to check the status of any user requests. &lt;br /&gt;
&lt;br /&gt;
Ticket types that are not &#039;Support&#039; are available within the system and are accessible to a user in a specific circumstance. &lt;br /&gt;
&lt;br /&gt;
=== Domain Name System (DNS) Records ===&lt;br /&gt;
&lt;br /&gt;
ARDC manages the ampr.org domain for its own use and supports Portal user needs.&lt;br /&gt;
&lt;br /&gt;
Once a user&#039;s call sign is verified, they should see the DNS dropdown menu with submenu options &#039;Domains&#039;, &#039;My subdomains&#039;, and &#039;My records&#039;. &lt;br /&gt;
&lt;br /&gt;
[[File:dns-menu.png|750px]]&lt;br /&gt;
&lt;br /&gt;
=== Networks ===&lt;br /&gt;
&lt;br /&gt;
Once a user&#039;s call sign is verified, they should see the &#039;Networks&#039; dropdown menu with submenu options &#039;Request addresses&#039;, &#039;All IPv4 networks&#039;, &#039;All IPv6 networks&#039;, &#039;All gateways&#039;, &#039;My IPv4 networks&#039;, &#039;My IPv6 networks&#039;, &#039;My gateways&#039;. &lt;br /&gt;
&lt;br /&gt;
=== Contact ===&lt;br /&gt;
&lt;br /&gt;
Clicking &#039;Contact&#039; takes you to the &#039;CONTACT US&#039; form, where you can reach out to Portal admins with inquiries, reporting issues, etc. &lt;br /&gt;
&lt;br /&gt;
[[File:contact-us-v3.png|750px]]&lt;br /&gt;
&lt;br /&gt;
=== API ===&lt;br /&gt;
&lt;br /&gt;
An [[API]] enables programs to access data maintained in the portal.&lt;br /&gt;
&lt;br /&gt;
== Helpful Resources ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Subnet calculator&#039;&#039;&#039;: [https://www.calculator.net/ip-subnet-calculator.html https://www.calculator.net/ip-subnet-calculator.html]&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1355</id>
		<title>Encap.txt/get-encap</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1355"/>
		<updated>2024-10-19T14:59:00Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here&#039;s a bash script to get a complete [[encap.txt]] file from the portal.&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 ./get-encap &amp;lt; api-token.txt &amp;gt; encap.txt || echo error $?&lt;br /&gt;
&lt;br /&gt;
The script maintains a cache, so it downloads the information only when it has changed.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
# Output the current AMPRNet routing information, like this:&lt;br /&gt;
# # Fetched &amp;lt;when&amp;gt; version &amp;lt;number&amp;gt; from &amp;lt;source&amp;gt;&lt;br /&gt;
# route addprivate 44.0.1.0/32 encap 169.228.84.34&lt;br /&gt;
# route addprivate 44.102.240.16/28 encap 45.145.74.247&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
cache=&amp;quot;${1:-routes.json}&amp;quot; # a file that stores previous information&lt;br /&gt;
token=`cat -` # an API token&lt;br /&gt;
# To obtain a token, register with http://portal.ampr.org/ , log in,&lt;br /&gt;
# browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
# Be sure to keep the token private. This script won&#039;t reveal it.&lt;br /&gt;
&lt;br /&gt;
API=&amp;quot;https://portal.ampr.org/api/v2&amp;quot;&lt;br /&gt;
# The API returns JSON, something like:&lt;br /&gt;
# {&lt;br /&gt;
#   &amp;quot;count&amp;quot;: 836,&lt;br /&gt;
#   &amp;quot;serial&amp;quot;: &amp;quot;136.269&amp;quot;,&lt;br /&gt;
#   &amp;quot;encap&amp;quot;: [&lt;br /&gt;
#     {&lt;br /&gt;
#       &amp;quot;gatewayIP&amp;quot;: &amp;quot;118.82.153.200&amp;quot;,&lt;br /&gt;
#       &amp;quot;encapType&amp;quot;: &amp;quot;IPIP&amp;quot;,&lt;br /&gt;
#       &amp;quot;network&amp;quot;: &amp;quot;44.147.0.210&amp;quot;,&lt;br /&gt;
#       &amp;quot;cidr&amp;quot;: 25,&lt;br /&gt;
#       ...&lt;br /&gt;
#     },&lt;br /&gt;
#     ...&lt;br /&gt;
#   ]&lt;br /&gt;
# }&lt;br /&gt;
# ... but without insignificant white space.&lt;br /&gt;
# We trust that any change will also change the serial value.&lt;br /&gt;
&lt;br /&gt;
allZero () {&lt;br /&gt;
    for status in &amp;quot;$@&amp;quot;; do&lt;br /&gt;
        [ &amp;quot;$status&amp;quot; != 0 ] &amp;amp;&amp;amp; return &amp;quot;$status&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
    return 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
curlOptions=&amp;quot;-s&lt;br /&gt;
-S&lt;br /&gt;
-f&lt;br /&gt;
-H \&amp;quot;Authorization: Bearer $token\&amp;quot;&lt;br /&gt;
-H \&amp;quot;Accept: application/json\&amp;quot;&lt;br /&gt;
&amp;quot;&lt;br /&gt;
if  [[ -e &amp;quot;$cache&amp;quot; &amp;amp;&amp;amp; ! -f &amp;quot;$cache&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;gt;&amp;amp;2 `basename &amp;quot;$0&amp;quot;`&amp;quot;: $cache isn&#039;t a regular file.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
elif [ -r &amp;quot;$cache&amp;quot; ]; then&lt;br /&gt;
    oldVersion=`jq -e &amp;quot;.serial&amp;quot; &amp;quot;$cache&amp;quot;` || oldVersion=&amp;quot;cache error $?&amp;quot;&lt;br /&gt;
    [ &amp;quot;$oldVersion&amp;quot; == &amp;quot;null&amp;quot; ] &amp;amp;&amp;amp; oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl --config - &amp;quot;$API&amp;quot;/encap/serial | jq -e &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || newVersion=&amp;quot;API error $?&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=&amp;quot;TBD&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
# echo &amp;quot;# oldVersion=$oldVersion newVersion=$newVersion&amp;quot;&lt;br /&gt;
if [ &amp;quot;$newVersion&amp;quot; != &amp;quot;$oldVersion&amp;quot; ]; then&lt;br /&gt;
    # Fetch new data from the API and store it in $cache:&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl --config - &amp;quot;$API&amp;quot;/encap/routes | tee &amp;quot;$cache&amp;quot; | jq -e &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || exit $?&lt;br /&gt;
fi&lt;br /&gt;
# Convert $cache to the output format:&lt;br /&gt;
echo &amp;quot;# Fetched&amp;quot; `date -r &amp;quot;$cache&amp;quot;` version &amp;quot;$newVersion&amp;quot; from &amp;quot;$API&amp;quot; || exit $?&lt;br /&gt;
jq -e -r &#039;.encap[] | select(.encapType == &amp;quot;IPIP&amp;quot;) | &amp;quot;route addprivate \(.network)/\(.cidr) encap \(.gatewayIP)&amp;quot;&#039;\&lt;br /&gt;
   &amp;quot;$cache&amp;quot; | sort&lt;br /&gt;
# Sorting the output makes it easier to compare different versions.&lt;br /&gt;
allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1329</id>
		<title>Encap.txt/get-encap</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1329"/>
		<updated>2024-10-15T19:42:57Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: handle errors from jq&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here&#039;s a bash script to get a complete [[encap.txt]] file from the portal.&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 .\get-encap &amp;lt; api-token.txt &amp;gt; encap.txt || echo error $?&lt;br /&gt;
&lt;br /&gt;
The script maintains a cache, so it downloads the information only when it has changed.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;#!/bin/bash&lt;br /&gt;
# Output the current AMPRNet routing information, like this:&lt;br /&gt;
# # Fetched &amp;lt;when&amp;gt; version &amp;lt;number&amp;gt; from &amp;lt;source&amp;gt;&lt;br /&gt;
# route addprivate 44.0.1.0/32 encap 169.228.84.34&lt;br /&gt;
# route addprivate 44.102.240.16/28 encap 45.145.74.247&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
cache=&amp;quot;${1:-routes.json}&amp;quot; # a file that stores previous information&lt;br /&gt;
token=`cat -` # an API token&lt;br /&gt;
# To obtain a token, register with http://portal.ampr.org/ , log in,&lt;br /&gt;
# browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
# Be sure to keep the token private. This script won&#039;t reveal it.&lt;br /&gt;
&lt;br /&gt;
API=&amp;quot;https://portal.ampr.org/api/v2&amp;quot;&lt;br /&gt;
# The API returns JSON, something like:&lt;br /&gt;
# {&lt;br /&gt;
#   &amp;quot;count&amp;quot;: 836,&lt;br /&gt;
#   &amp;quot;serial&amp;quot;: &amp;quot;136.269&amp;quot;,&lt;br /&gt;
#   &amp;quot;encap&amp;quot;: [&lt;br /&gt;
#     {&lt;br /&gt;
#       &amp;quot;gatewayIP&amp;quot;: &amp;quot;118.82.153.200&amp;quot;,&lt;br /&gt;
#       &amp;quot;encapType&amp;quot;: &amp;quot;IPIP&amp;quot;,&lt;br /&gt;
#       &amp;quot;network&amp;quot;: &amp;quot;44.147.0.210&amp;quot;,&lt;br /&gt;
#       &amp;quot;cidr&amp;quot;: 25,&lt;br /&gt;
#       ...&lt;br /&gt;
#     },&lt;br /&gt;
#     ...&lt;br /&gt;
#   ]&lt;br /&gt;
# }&lt;br /&gt;
# ... but without any insignificant white space.&lt;br /&gt;
# We trust that any change will also change the serial value.&lt;br /&gt;
&lt;br /&gt;
allZero () {&lt;br /&gt;
    for status in &amp;quot;$@&amp;quot;; do&lt;br /&gt;
        [ &amp;quot;$status&amp;quot; != 0 ] &amp;amp;&amp;amp; return &amp;quot;$status&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
    return 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
curlOptions=&amp;quot;-s&lt;br /&gt;
-S&lt;br /&gt;
-f&lt;br /&gt;
-H \&amp;quot;Authorization: Bearer $token\&amp;quot;&lt;br /&gt;
-H \&amp;quot;Accept: application/json\&amp;quot;&lt;br /&gt;
&amp;quot;&lt;br /&gt;
if  [[ -e &amp;quot;$cache&amp;quot; &amp;amp;&amp;amp; ! -f &amp;quot;$cache&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;gt;&amp;amp;2 `basename &amp;quot;$0&amp;quot;`&amp;quot;: $cache isn&#039;t a regular file.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
elif [ -r &amp;quot;$cache&amp;quot; ]; then&lt;br /&gt;
    oldVersion=`jq -e &amp;quot;.serial&amp;quot; &amp;quot;$cache&amp;quot;` || oldVersion=&amp;quot;cache error $?&amp;quot;&lt;br /&gt;
    [ &amp;quot;$oldVersion&amp;quot; == &amp;quot;null&amp;quot; ] &amp;amp;&amp;amp; oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl --config - &amp;quot;$API&amp;quot;/encap/serial | jq -e &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || newVersion=&amp;quot;API error $?&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=&amp;quot;TBD&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
# echo &amp;quot;# oldVersion=$oldVersion newVersion=$newVersion&amp;quot;&lt;br /&gt;
if [ &amp;quot;$newVersion&amp;quot; != &amp;quot;$oldVersion&amp;quot; ]; then&lt;br /&gt;
    # Fetch new data from the API and store it in $cache:&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl --config - &amp;quot;$API&amp;quot;/encap/routes | tee &amp;quot;$cache&amp;quot; | jq -e &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || exit $?&lt;br /&gt;
fi&lt;br /&gt;
# Convert $cache to the output format:&lt;br /&gt;
echo &amp;quot;# Fetched&amp;quot; `date -r &amp;quot;$cache&amp;quot;` version &amp;quot;$newVersion&amp;quot; from &amp;quot;$API&amp;quot; || exit $?&lt;br /&gt;
jq -e -r &#039;.encap[] | select(.encapType == &amp;quot;IPIP&amp;quot;) | &amp;quot;route addprivate \(.network)/\(.cidr) encap \(.gatewayIP)&amp;quot;&#039;\&lt;br /&gt;
   &amp;quot;$cache&amp;quot; | sort&lt;br /&gt;
# Sorting the output makes it easier to compare different versions.&lt;br /&gt;
allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1328</id>
		<title>Encap.txt/get-encap</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1328"/>
		<updated>2024-10-15T19:14:09Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: Handle errors returned from the portal API&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here&#039;s a bash script to get a complete [[encap.txt]] file from the portal.&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 .\get-encap &amp;lt; api-token.txt &amp;gt; encap.txt || echo error $?&lt;br /&gt;
&lt;br /&gt;
The script maintains a cache, so it downloads the information only when it has changed.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Output the current AMPRNet routing information, like this:&lt;br /&gt;
# # Fetched &amp;lt;when&amp;gt; version &amp;lt;number&amp;gt; from &amp;lt;source&amp;gt;&lt;br /&gt;
# route addprivate 44.0.1.0/32 encap 169.228.84.34&lt;br /&gt;
# route addprivate 44.102.240.16/28 encap 45.145.74.247&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
cache=&amp;quot;${1:-routes.json}&amp;quot; # a file that stores previous information&lt;br /&gt;
token=`cat -` # an API token&lt;br /&gt;
# To obtain a token, register with http://portal.ampr.org/ , log in,&lt;br /&gt;
# browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
# Be sure to keep the token private. This script won&#039;t reveal it.&lt;br /&gt;
&lt;br /&gt;
API=&amp;quot;https://portal.ampr.org/api/v2&amp;quot;&lt;br /&gt;
# The API returns JSON, something like:&lt;br /&gt;
# {&lt;br /&gt;
#   &amp;quot;count&amp;quot;: 836,&lt;br /&gt;
#   &amp;quot;serial&amp;quot;: &amp;quot;136.269&amp;quot;,&lt;br /&gt;
#   &amp;quot;encap&amp;quot;: [&lt;br /&gt;
#     {&lt;br /&gt;
#       &amp;quot;gatewayIP&amp;quot;: &amp;quot;118.82.153.200&amp;quot;,&lt;br /&gt;
#       &amp;quot;encapType&amp;quot;: &amp;quot;IPIP&amp;quot;,&lt;br /&gt;
#       &amp;quot;network&amp;quot;: &amp;quot;44.147.0.210&amp;quot;,&lt;br /&gt;
#       &amp;quot;cidr&amp;quot;: 25,&lt;br /&gt;
#       ...&lt;br /&gt;
#     },&lt;br /&gt;
#     ...&lt;br /&gt;
#   ]&lt;br /&gt;
# }&lt;br /&gt;
# ... but without any insignificant white space.&lt;br /&gt;
# We trust that any change will also change the serial value.&lt;br /&gt;
&lt;br /&gt;
allZero () {&lt;br /&gt;
    for status in &amp;quot;$@&amp;quot;; do&lt;br /&gt;
        [ &amp;quot;$status&amp;quot; != 0 ] &amp;amp;&amp;amp; return &amp;quot;$status&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
    return 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
curlOptions=&amp;quot;-s&lt;br /&gt;
-S&lt;br /&gt;
-f&lt;br /&gt;
-H \&amp;quot;Authorization: Bearer $token\&amp;quot;&lt;br /&gt;
-H \&amp;quot;Accept: application/json\&amp;quot;&lt;br /&gt;
&amp;quot;&lt;br /&gt;
if  [[ -e &amp;quot;$cache&amp;quot; &amp;amp;&amp;amp; ! -f &amp;quot;$cache&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;gt;&amp;amp;2 `basename &amp;quot;$0&amp;quot;`&amp;quot;: $cache isn&#039;t a regular file.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
elif [ -r &amp;quot;$cache&amp;quot; ]; then&lt;br /&gt;
    oldVersion=`jq &amp;quot;.serial&amp;quot; &amp;quot;$cache&amp;quot;` || oldVersion=&amp;quot;cache error $?&amp;quot;&lt;br /&gt;
    [ &amp;quot;$oldVersion&amp;quot; == &amp;quot;null&amp;quot; ] &amp;amp;&amp;amp; oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl --config - &amp;quot;$API&amp;quot;/encap/serial | jq &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || newVersion=&amp;quot;API error $?&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=&amp;quot;TBD&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
# echo &amp;quot;# oldVersion=$oldVersion newVersion=$newVersion&amp;quot;&lt;br /&gt;
if [ &amp;quot;$newVersion&amp;quot; != &amp;quot;$oldVersion&amp;quot; ]; then&lt;br /&gt;
    # Fetch new data from the API and store it in $cache:&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl --config - &amp;quot;$API&amp;quot;/encap/routes | tee &amp;quot;$cache&amp;quot; | jq &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || exit $?&lt;br /&gt;
fi&lt;br /&gt;
# Convert $cache to the output format:&lt;br /&gt;
echo &amp;quot;# Fetched&amp;quot; `date -r &amp;quot;$cache&amp;quot;` version &amp;quot;$newVersion&amp;quot; from &amp;quot;$API&amp;quot; || exit $?&lt;br /&gt;
jq -r &#039;.encap[] | select(.encapType == &amp;quot;IPIP&amp;quot;) | &amp;quot;route addprivate \(.network)/\(.cidr) encap \(.gatewayIP)&amp;quot;&#039;\&lt;br /&gt;
   &amp;quot;$cache&amp;quot; | sort&lt;br /&gt;
# Sorting the output makes it easier to compare different versions.&lt;br /&gt;
allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=API&amp;diff=1327</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=API&amp;diff=1327"/>
		<updated>2024-10-15T18:50:13Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: document error handling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
The AMPRNet [[Portal]] has an associated API that allows the data and functionality of the [[Portal]] to be accessed programatically.&lt;br /&gt;
&lt;br /&gt;
=== Version 1 ===&lt;br /&gt;
&lt;br /&gt;
Version 1 of the API uses a RESTful design, accessible only via SSL (https://) to increase security.&lt;br /&gt;
&lt;br /&gt;
All requests to the API require the client to authenticate by using Basic HTTP authentication, &lt;br /&gt;
so you will need a username and password in order to access any part of the API, &lt;br /&gt;
this can be obtained by registering for an account on the [[Portal]].&lt;br /&gt;
&lt;br /&gt;
Once you have an account, you can create your API Key (password) from the &amp;quot;Profile&#039; menu link, in the &amp;quot;Security&amp;quot; section.&lt;br /&gt;
The API username is the same username you used to login to the [[Portal]] via your web browser.&lt;br /&gt;
&lt;br /&gt;
=== Version 2 ===&lt;br /&gt;
&lt;br /&gt;
Version 2 of the API also uses a RESTful design. Requests and responses are exchanged via HTTPS.&lt;br /&gt;
Access is controlled using [https://datatracker.ietf.org/doc/html/rfc6750 Bearer authorization].&lt;br /&gt;
So, each request must include an HTTP header like this:&lt;br /&gt;
&lt;br /&gt;
 Authorization: Bearer &amp;lt;API Token&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To obtain an API token, register with the [[Portal]], log in,&lt;br /&gt;
browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some responses are in [https://www.json.org JSON] format. Requests should include a header:&lt;br /&gt;
&lt;br /&gt;
 Accept: application/json&lt;br /&gt;
&lt;br /&gt;
To get complete current routing information in JSON,&lt;br /&gt;
request &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/routes&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
For example, a Unix command like this will output complete current routing information:&lt;br /&gt;
&lt;br /&gt;
 curl -s -H &amp;quot;Authorization: Bearer $APItoken&amp;quot; -H &amp;quot;Accept: application/json&amp;quot; &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/routes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response includes a serial number, which changes when any route is updated.&lt;br /&gt;
To get the current serial number (but not the routes) in JSON,&lt;br /&gt;
request &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/serial&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
If something goes wrong, the HTTP response may include&lt;br /&gt;
an HTTP status code other than 200&lt;br /&gt;
and/or an error message in the body.&lt;br /&gt;
For example, a request with an invalid API token will elicit a response including:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;HTTP/1.1 401 Unauthorized&lt;br /&gt;
Content-Type: application/json&lt;br /&gt;
&lt;br /&gt;
{&amp;quot;message&amp;quot;:&amp;quot;Unauthenticated.&amp;quot;}&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Encap.txt&amp;diff=1318</id>
		<title>Encap.txt</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Encap.txt&amp;diff=1318"/>
		<updated>2024-10-15T18:27:09Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: add links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An encap.txt file lists [[Gateway|AMPRNet gateways]], in a format like this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# This is a comment&lt;br /&gt;
route addprivate 44.10.0.100/32 encap 136.115.52.224&lt;br /&gt;
route addprivate 44.100.129.0/24 encap 176.140.10.22&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Originally formatted for JNOS systems, it is often parsed with a &amp;quot;[[munge script]]&amp;quot; to update Linux system routing tables.&lt;br /&gt;
&lt;br /&gt;
== Portal ==&lt;br /&gt;
&lt;br /&gt;
To get an encap.txt file that lists all current gateways,&lt;br /&gt;
request all routes from the [[API|Portal API]] and convert the response from JSON to text.&lt;br /&gt;
For example (using [[API]] version 2):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -s -H &amp;quot;Authorization: Bearer $APItoken&amp;quot; -H &amp;quot;Accept: application/json&amp;quot; https://portal.ampr.org/api/v2/encap/routes | jq -r &#039;.encap[] | select(.encapType == &amp;quot;IPIP&amp;quot;) | &amp;quot;route addprivate \(.network)/\(.cidr) encap \(.gatewayIP)&amp;quot;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A more complete example is in [[Encap.txt/get-encap]].&lt;br /&gt;
&lt;br /&gt;
If something goes wrong, the result won&#039;t be a complete list.&lt;br /&gt;
Before using it to update routing tables, it&#039;s worth checking whether it has the right syntax and it&#039;s reasonably long.&lt;br /&gt;
An empty list or a list that&#039;s much shorter than a previous version is probably erroneous.&lt;br /&gt;
&lt;br /&gt;
== HTTP ==&lt;br /&gt;
&lt;br /&gt;
Previously, a complete encap.txt file was available from the portal as a web page.&lt;br /&gt;
This is no longer supported.&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=API&amp;diff=1315</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=API&amp;diff=1315"/>
		<updated>2024-10-15T18:10:50Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: link to json.org&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
The AMPRNet [[Portal]] has an associated API that allows the data and functionality of the [[Portal]] to be accessed programatically.&lt;br /&gt;
&lt;br /&gt;
=== Version 1 ===&lt;br /&gt;
&lt;br /&gt;
Version 1 of the API uses a RESTful design, accessible only via SSL (https://) to increase security.&lt;br /&gt;
&lt;br /&gt;
All requests to the API require the client to authenticate by using Basic HTTP authentication, &lt;br /&gt;
so you will need a username and password in order to access any part of the API, &lt;br /&gt;
this can be obtained by registering for an account on the [[Portal]].&lt;br /&gt;
&lt;br /&gt;
Once you have an account, you can create your API Key (password) from the &amp;quot;Profile&#039; menu link, in the &amp;quot;Security&amp;quot; section.&lt;br /&gt;
The API username is the same username you used to login to the [[Portal]] via your web browser.&lt;br /&gt;
&lt;br /&gt;
=== Version 2 ===&lt;br /&gt;
&lt;br /&gt;
Version 2 of the API also uses a RESTful design. Requests and responses are exchanged via HTTPS.&lt;br /&gt;
Access is controlled using [https://datatracker.ietf.org/doc/html/rfc6750 Bearer authorization].&lt;br /&gt;
So, each request must include an HTTP header like this:&lt;br /&gt;
&lt;br /&gt;
 Authorization: Bearer &amp;lt;API Token&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To obtain an API token, register with the [[Portal]], log in,&lt;br /&gt;
browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some responses are in [https://www.json.org JSON] format. Requests should include a header:&lt;br /&gt;
&lt;br /&gt;
 Accept: application/json&lt;br /&gt;
&lt;br /&gt;
To get complete current routing information in JSON,&lt;br /&gt;
request &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/routes&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
For example, a Unix command like this will output complete current routing information:&lt;br /&gt;
&lt;br /&gt;
 curl -s -H &amp;quot;Authorization: Bearer $APItoken&amp;quot; -H &amp;quot;Accept: application/json&amp;quot; &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/routes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response includes a serial number, which changes when any route is updated.&lt;br /&gt;
To get the current serial number (but not the routes) in JSON,&lt;br /&gt;
request &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/serial&amp;lt;/nowiki&amp;gt;.&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Services&amp;diff=1310</id>
		<title>Services</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Services&amp;diff=1310"/>
		<updated>2024-10-15T04:31:29Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: AMPR no longer publishes an encap.txt file.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Maintainer !! Service Name!! URL/IP !! Service Type !! Description !! Other Information&lt;br /&gt;
|-&lt;br /&gt;
| AMPR ||[[Portal]] ||  https://portal.ampr.org || HTTPS || Used to request allocations, manage user profile information, [[Gateway]] entries and ampr.org DNS entries|| NONE&lt;br /&gt;
|-&lt;br /&gt;
| AMPR ||Website ||  https://www.ampr.org || HTTPS || AMPRNet Main Page|| NONE&lt;br /&gt;
|-&lt;br /&gt;
| AMPR ||Wiki ||  https://wiki.ampr.org || HTTPS || This Wiki|| NONE&lt;br /&gt;
|-&lt;br /&gt;
| AMPR ||44Net discussion group ||  https://ardc.groups.io/g/44net || HTTPS || AMPR discussion group|| NONE&lt;br /&gt;
|-&lt;br /&gt;
| AMPR ||ARDC announcements ||  https://ardc.groups.io/g/main || HTTPS || ARDC announcements|| NONE&lt;br /&gt;
|-&lt;br /&gt;
| AMPR ||AMPRNet Gateway [[Amprgw|(AMPRGW)]] || amprgw.ucsd.edu/169.228.34.84 || IP and IPENCAP [[Tunnel]]|| Routes traffic between the public internet and AMPRNet hosts connected via the IPIP mesh and originates [[RIP]] packets || Gateways use IP Protocol 4 (IPENCAP) to receive traffic via AMPRGW. Allocation must be registered in the [[Portal]] with a ampr.org DNS entry, and gateways must run an AMPRNet routing protocol (i.e. [[RIP]]44 or [[munge script]])&lt;br /&gt;
|-&lt;br /&gt;
| AMPR ||[[RIP]]44 || provided via [https://en.wikipedia.org/wiki/Broadcasting_%28networking%29 broadcast] from 44.0.0.1 to all [[gateway]]s registered in the [[portal]] || Routing Information (modified RIPv2 protocol) || distributed by main AMPRNet Router to multicast address 224.0.0.9|| 1.) an enabled IPENCAP tunnel, and 2.) [[ampr-ripd]] or [[rip44d]] must be running and properly configured on your registered gateway&lt;br /&gt;
|-&lt;br /&gt;
| Various Operators||[[Ampr.org]] DNS and Reverse DNS (44.in-addr.arpa) ||&lt;br /&gt;
ns.ardc.net&amp;lt;br /&amp;gt;&lt;br /&gt;
a.gw4.uk&amp;lt;br /&amp;gt;&lt;br /&gt;
ns2.us.ardc.net&amp;lt;br /&amp;gt;&lt;br /&gt;
ns1.de.ardc.net&amp;lt;br /&amp;gt;&lt;br /&gt;
(These hosts are authoritative for AMPR.ORG and most of the &#039;[0-191].44.in-addr.arpa&#039; reverse zones.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
44.0.0.0/9 thru 44.128.0.0/10 hosts may use dns-mdc.ampr.org (44.60.44.3) as a recursive DNS server. It also has a copy of HAMWAN.ORG&amp;lt;br /&amp;gt;&lt;br /&gt;
srv.kz2x.ampr.org (44.44.48.29) is a recursive resolver available to 44.0.0.0/9 and 44.128.0.0/10&amp;lt;br /&amp;gt;&lt;br /&gt;
|| DNS || name resolution services||&lt;br /&gt;
|-&lt;br /&gt;
| Various Operators||Network Tools||&lt;br /&gt;
http://whatismyip.ampr.org&amp;lt;br /&amp;gt;&lt;br /&gt;
http://yo2loj.ampr.org/nettools.php&amp;lt;br /&amp;gt;&lt;br /&gt;
http://kb3vwg-010.ampr.org/tools&amp;lt;br /&amp;gt;&lt;br /&gt;
http://speedtest.ampr.org&amp;lt;br /&amp;gt;&lt;br /&gt;
http://lg.vk7sh.asmpr.org&amp;lt;br /&amp;gt;&lt;br /&gt;
 || HTTP|| source IP checker, speed test, Ping, Traceroute, etc.||&lt;br /&gt;
&#039;&#039;&#039;kb3vwg-010.ampr.org&#039;&#039;&#039; only available from hosts with an AMPRNet IP address&amp;lt;br /&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;lg.vk7sh.asmpr.org&#039;&#039;&#039; only available from hosts with an AMPRNet IP address&lt;br /&gt;
|-&lt;br /&gt;
| Various Operators ||Network Time Protocol || ntp.vk2hff.ampr.org (Stratum 1, AU)&amp;lt;br /&amp;gt;time.kz2x.ampr.org (Stratum 1, US)&amp;lt;br /&amp;gt;kb3vwg-001.ampr.org (Stratum 2, US)&amp;lt;br /&amp;gt;gw-44-137.pi9noz.ampr.org (Stratum 2)|| NTP|| Stratum 2 Network Time Server - References US, Canadian and Mexican|| &#039;&#039;&#039;kb3vwg-001.ampr.org&#039;&#039;&#039; only available from hosts with an AMPRNet IP address&amp;lt;br /&amp;gt;&#039;&#039;&#039;time.kz2x.ampr.org&#039;&#039;&#039; only available from hosts with an AMPRNet IP address&lt;br /&gt;
|-&lt;br /&gt;
| N1URO  ||AMPRNet/RF faxing || http://wiki.ampr.org/wiki/axMail-FAX || Facsimile || Online IP based Facsimile service. You have the ability to send emergency communications from packet via Fax. || [http://axmail.sourceforge.net axMail-FAX] Sofware is here.&lt;br /&gt;
|-&lt;br /&gt;
| [http://allstarlink.org AllStar Link] || AllStar || http://allstarlink.org || Linking of repeaters || AllStar Link core network services are provided via redundant datacenters using 44net IP space.  || [https://wiki.allstarlink.org/wiki/Main_Page ASL wiki]&lt;br /&gt;
|-&lt;br /&gt;
| N2NOV and G1FEF || Hub_NA and Hub_EU for WWconvers Chat System || 44.68.41.2:3600&amp;lt;br /&amp;gt;convers.g1fef.co.uk:3600 || Telnet || Only connections from other 44Net addresses allowed using port 3600. Stations like JNOS with a built-in local chat server can link to it.&amp;lt;br /&amp;gt; Individuals without a local chat portal can use an IRC client to a public IP address that must be arranged with the owner. || None&lt;br /&gt;
|-&lt;br /&gt;
| N2NOV || AMPRNet NE US Regional Portal || http://n2nov.ampr.org/hamgate.html || HTTP || AMPRNet NE US Regional Portal || None&lt;br /&gt;
|-&lt;br /&gt;
| [https://flscg.org/ FSG]|| HamWAN Remote || https://flscg.org/2022/04/hamwan-remote/ || VPN/BGP || We provide a VPN based remote site connection to [https://flscg.org/hamwan/ HamWAN Tampa] and can announce your IP space.  Performance of over 1gbit/s is possible and we provide an local connection point for amateurs in the South Eastern United States. || https://wiki.w9cr.net/index.php/HamWAN_Remote_Site &lt;br /&gt;
|-&lt;br /&gt;
| [https://hamwan.org HamWAN]||HamWAN Open Peering||https://hamwan.org/Labs/Open%20Peering%20Policy.html||BGP/IPSec(AH)||We provide IPsec VPN w/ BGP peering + Internet announcing.||&lt;br /&gt;
|-}&lt;br /&gt;
&lt;br /&gt;
Services previously available on AMPRNet but no longer actively supported can be viewed on the [[Services/Historic|Historic Services]] page.&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Setting_up_a_gateway_on_Linux&amp;diff=1309</id>
		<title>Setting up a gateway on Linux</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Setting_up_a_gateway_on_Linux&amp;diff=1309"/>
		<updated>2024-10-15T04:25:32Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are a few different ways to run an AMPRnet gateway on a Linux system. Each has some benefits, so you&#039;ll need to pick your favourite.&lt;br /&gt;
&lt;br /&gt;
Before configuring the Linux gateway you&#039;ll need to:&lt;br /&gt;
# Using the [[Portal]], request an IP address (or addresses) by clicking on &amp;quot;Request address space&amp;quot; then selecting &amp;quot;IPIP Tunnel Mesh&amp;quot; as the Use Case.&lt;br /&gt;
# You will need to have a public static IP address for your gateway. &lt;br /&gt;
# Using the [[Portal]], create an entry for your gateway.&lt;br /&gt;
# Get some of your AMPRNet IP addresses registered in the [[ampr.org]] DNS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Flavours of Linux gateways =&lt;br /&gt;
&lt;br /&gt;
== Native Linux kernel AX.25 and IPIP tunneling ==&lt;br /&gt;
&lt;br /&gt;
Linux contains the necessary building blocks for a gateway without much added software. Radio interfaces are configured much like any other network interfaces such as Ethernet, they&#039;re just given amateur radio callsigns in addition to an IP address (callsign will act the role of the Ethernet MAC address). If you&#039;re familiar with Linux configuration but have not heard of NOS, or if you wish to go with minimal amount of moving parts, this would probably be your choice.&lt;br /&gt;
&lt;br /&gt;
Setting up a native Linux gateway consists of two main steps:&lt;br /&gt;
&lt;br /&gt;
=== Step 1: Setting up tunnel routing to the rest of the AMPRnet===&lt;br /&gt;
Configuring your Linux system to learn about other AMPRNet [[gateway| gateways]] can be done two ways:&lt;br /&gt;
&lt;br /&gt;
# Automatically learn about other gateways via modified RIPv2 advertisements. Two popular programs to do this are:&lt;br /&gt;
## Using [[ampr-ripd]], a C based routing daemon&lt;br /&gt;
## Using [[rip44d]], a PERL based routing daemon&lt;br /&gt;
# Downloading an [[encap.txt]] file and setting up routes using a [[munge script]] is the traditional method&lt;br /&gt;
&lt;br /&gt;
====Example Gateway Configuration Instructions====&lt;br /&gt;
* [[Ubuntu Linux Gateway Example]]&lt;br /&gt;
* [http://www.qsl.net/k/kb9mwr//wapr/tcpip/ampr-ripd.html Two Interface Debian Linux Amprnet Gateway Example]&lt;br /&gt;
* [https://k7ilo.blogspot.com/p/server-setup.html K7ILO&#039;S Two Interface Debian 11 AmprNet Gateway Build in layman&#039;s terms]&lt;br /&gt;
&lt;br /&gt;
=== Step 2: Setting up radio interfaces in Linux===&lt;br /&gt;
&lt;br /&gt;
* [http://www.tldp.org/HOWTO/AX25-HOWTO/ Linux AX.25 set-up]&lt;br /&gt;
* 802.11 WiFi on amateur frequencies (2.4 or 5 GHz) is a new popular way to set up fast links.&lt;br /&gt;
&lt;br /&gt;
== Running JNOS (or other NOS) on top of Linux ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re already familiar with running NOS on top of DOS or Linux, or wish to keep the AMPRnet IP packet routing away from the host Linux system, it might make sense to run JNOS as an application on top of Linux.&lt;br /&gt;
&lt;br /&gt;
The downside is that it&#039;ll have a slightly higher overhead (consumed memory and CPU), and you&#039;ll have two IP routers running on top of each other instead of just one, which is seen as slightly complicated by some.&lt;br /&gt;
&lt;br /&gt;
The upside is that you&#039;ll also get the JNOS BBS-type features, and some other traditional services without installing additional software on top.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=See also=&lt;br /&gt;
&lt;br /&gt;
* [[Ubuntu Linux Gateway Example]]&lt;br /&gt;
* [[startampr]]&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=RIP&amp;diff=1308</id>
		<title>RIP</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=RIP&amp;diff=1308"/>
		<updated>2024-10-15T04:22:55Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information about other AMPRNet [[gateway| gateways]] can now be received dynamically via modified [http://en.wikipedia.org/wiki/Routing_Information_Protocol#RIP_version_2 RIPv2] advertisements.&lt;br /&gt;
Routes can also be downloaded as an [[Encap.txt|encap.txt]] file.&lt;br /&gt;
&lt;br /&gt;
= What&#039;s the difference? =&lt;br /&gt;
&lt;br /&gt;
There is a big difference from RIPv2 in how the packets are processed.&lt;br /&gt;
&lt;br /&gt;
The regular RIPv2 sets a route to a specific subnet via the sender and &lt;br /&gt;
interface where the RIP broadcast was received on. The gateway &lt;br /&gt;
information is used only as an optimization element, in case a route &lt;br /&gt;
with to that gateway already exists so that the one with the lower &lt;br /&gt;
metric gets chosen.&lt;br /&gt;
&lt;br /&gt;
In our case, we use the RIP announcements to transport the subnet AND &lt;br /&gt;
gateway information.&lt;br /&gt;
&lt;br /&gt;
= Detailed description =&lt;br /&gt;
&lt;br /&gt;
So, assuming a point to multipoint interface, if there is let&#039;s say an &lt;br /&gt;
announcement 44.128.0.0/24 via 1.2.3.4 coming from 44.0.0.1 on the ipip0 &lt;br /&gt;
interface, regular RIPv2 would translate this to:&lt;br /&gt;
&lt;br /&gt;
44.128.0.0/24 via 44.0.0.1 if ipip0&lt;br /&gt;
&lt;br /&gt;
while ampr rip would translate this to:&lt;br /&gt;
&lt;br /&gt;
44.128.0.0/24 via 1.2.3.4 if ipip0&lt;br /&gt;
&lt;br /&gt;
In the first case, traffic to 44.128.0.0/24 is sent directly to the &lt;br /&gt;
gateway (the RIP sender), while in the second case it is encapsulated to &lt;br /&gt;
1.2.3.4.&lt;br /&gt;
&lt;br /&gt;
On a mikrotik router it even goes a step further:&lt;br /&gt;
it creates a ipip tunnel interface, ampr-1.2.3.4 to 1.2.3.4 and creates &lt;br /&gt;
a route&lt;br /&gt;
&lt;br /&gt;
44.128.0.0/24 via ampr-1.2.3.4&lt;br /&gt;
&lt;br /&gt;
This is the processing in the usual case, for 44 subnets having a 44net &lt;br /&gt;
gateway we assume that the gateway is published by BGP and is directly &lt;br /&gt;
reachable, so for a announcement like 44.128.0.0/24 via 44.128.0.1 there &lt;br /&gt;
are 2 route set:&lt;br /&gt;
&lt;br /&gt;
44.128.0.1 via default-gw  (which is autodetected), and&lt;br /&gt;
44.128.0.0/24 via 44.128.0.1 if ipip0 to do the encapsulation&lt;br /&gt;
&lt;br /&gt;
So, while the information structure in both cases conforms to the RIPv2 &lt;br /&gt;
specifications, its usage is completely different.&lt;br /&gt;
&lt;br /&gt;
= RIP44 Daemons =&lt;br /&gt;
&lt;br /&gt;
Two programs are available for GNU/Linux to utilize these updates:&lt;br /&gt;
&lt;br /&gt;
* [[ampr-ripd]], a C based routing daemon&lt;br /&gt;
* [[rip44d]], a PERL based routing daemon&lt;br /&gt;
&lt;br /&gt;
A program is also available for [https://www.openbsd.org/ OpenBSD]:&lt;br /&gt;
&lt;br /&gt;
* [https://github.com/dancrossnyc/44ripd 44ripd]&lt;br /&gt;
&lt;br /&gt;
= Availability/Compatibility =&lt;br /&gt;
&lt;br /&gt;
The RIP44 daemons have been tested and known to work on the following operating systems:&lt;br /&gt;
&lt;br /&gt;
* BSD&lt;br /&gt;
* OpenWRT/LEDE&lt;br /&gt;
* Raspbian&lt;br /&gt;
* Slackware Linux&lt;br /&gt;
* Ubuntu/Debian Linux&lt;br /&gt;
* Vyatta/VyOS&lt;br /&gt;
&lt;br /&gt;
= Non-RIP44 Workarounds =&lt;br /&gt;
&lt;br /&gt;
The devices below do not possess a known, end-user method to install additional software (i.e. ampr-ripd). Operators have developed scripts to parse inbound routing packets to make them compatible for usage on AMPRNet:&lt;br /&gt;
&lt;br /&gt;
* Cisco IOS (a separate machine must run the script) : look here http://wiki.ampr.org/wiki/Setting_up_a_gateway_on_Cisco_Routers  at the &amp;quot;Making the route commands automatically&amp;quot; section&lt;br /&gt;
* JunOS&lt;br /&gt;
* MikroTik : look here  http://www.yo2loj.ro/hamprojects/ at the &amp;quot;Mikrotik RIPv2 AMPR Gateway Setup Script 3.0&amp;quot;&lt;br /&gt;
* Ubiquiti OS&lt;br /&gt;
&lt;br /&gt;
= See Also =&lt;br /&gt;
&lt;br /&gt;
* [[startampr]] - a script that loads the routing daemon on boot on Linux server-type devices&lt;br /&gt;
* Instructions for [[setting up a gateway on Linux|setting up a tunnel gateway on Linux]]&lt;br /&gt;
* Instructions for [[setting up a gateway on OpenWRT|setting up a gateway on OpenWRT]]&lt;br /&gt;
* Instructions for [[setting up a gateway on OpenBSD|setting up a gateway on OpenBSD]]&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Gateway&amp;diff=1307</id>
		<title>Gateway</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Gateway&amp;diff=1307"/>
		<updated>2024-10-15T04:16:22Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Much of the AMPRNet address space is interconnected via [[gateway|gateways]] that implement IPENCAP ([http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml IP Protocol Number 4]) encapsulated [[tunnel|tunnels]]. These tunnels provide endpoints for the AMPRNet address space allocated to a particular region or end user, effectively forming a mesh network of interconnected tunnels between AMPR subnets.&lt;br /&gt;
The [[portal]] maintains a database of all the gateways, their public IP addresses, and the subnets they serve.&lt;br /&gt;
This routing information is distributed via modified [[RIP]] advertisements.&lt;br /&gt;
A complete list of gateways can be downloaded from the [[API|portal API]].&lt;br /&gt;
&lt;br /&gt;
In order to keep this database up to date, everyone that operates a gateway must register on the [[portal]] and have their gateway(s) assigned to their account and associated with their allocation(s).&lt;br /&gt;
&lt;br /&gt;
In addition to the gateways operated by users who connect via IPENCAP tunnels, traffic exchanged between the ARMPNet mesh and the public Internet is routed via the [[Amprgw]] – please see the [[Amprgw]] page for important details on passing traffic between the public Internet and the IPENCAP tunnel mesh.&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Setting up a gateway on Cisco Routers|set up a  Cisco Router gateway]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Setting up a gateway on Linux|set up a Linux gateway]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[setting up a gateway on MikroTik Routers|set up a gateway on MikroTik Routers]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Setting up a gateway on OpenBSD|set up an OpenBSD gateway]]&lt;br /&gt;
&lt;br /&gt;
Learn how to [[Setting up a gateway on OpenWRT|set up an OpenWRT gateway]]&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Encap.txt&amp;diff=1306</id>
		<title>Encap.txt</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Encap.txt&amp;diff=1306"/>
		<updated>2024-10-15T03:08:57Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: Recommend validating a response from the API.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An encap.txt file lists AMPRNet [[gateway| gateways]], in a format like this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# This is a comment&lt;br /&gt;
route addprivate 44.10.0.100/32 encap 136.115.52.224&lt;br /&gt;
route addprivate 44.100.129.0/24 encap 176.140.10.22&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Originally formatted for JNOS systems, it is often parsed with a &amp;quot;[[munge script]]&amp;quot; to update Linux system routing tables.&lt;br /&gt;
&lt;br /&gt;
== Portal ==&lt;br /&gt;
&lt;br /&gt;
To get an encap.txt file that lists all current gateways,&lt;br /&gt;
request all routes from the [[API]] and convert the response from JSON to text.&lt;br /&gt;
For example (using API version 2):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -s -H &amp;quot;Authorization: Bearer $APItoken&amp;quot; -H &amp;quot;Accept: application/json&amp;quot; https://portal.ampr.org/api/v2/encap/routes | jq -r &#039;.encap[] | select(.encapType == &amp;quot;IPIP&amp;quot;) | &amp;quot;route addprivate \(.network)/\(.cidr) encap \(.gatewayIP)&amp;quot;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A more complete example is in [[encap.txt/get-encap]].&lt;br /&gt;
&lt;br /&gt;
If something goes wrong, the result won&#039;t be a complete list.&lt;br /&gt;
Before using it to update routing tables, it&#039;s worth checking whether it has the right syntax and it&#039;s reasonably long.&lt;br /&gt;
An empty list or a list that&#039;s much shorter than a previous version is probably erroneous.&lt;br /&gt;
&lt;br /&gt;
== HTTP ==&lt;br /&gt;
&lt;br /&gt;
Previously, a complete encap.txt file was available from the portal as a web page.&lt;br /&gt;
This is no longer supported.&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1305</id>
		<title>Encap.txt/get-encap</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Encap.txt/get-encap&amp;diff=1305"/>
		<updated>2024-10-15T02:53:36Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: Created page with &amp;quot;Here&amp;#039;s a bash script to get a complete encap.txt file from the portal. For example:   .\get-encap &amp;lt; api-token.txt &amp;gt; encap.txt || echo error $?  The script maintains a cache, so it downloads the information only when it has changed.   &amp;lt;nowiki&amp;gt; #!/bin/bash # Output the current AMPRNet routing information, like this: # # Fetched &amp;lt;when&amp;gt; version &amp;lt;number&amp;gt; from &amp;lt;source&amp;gt; # route addprivate 44.0.1.0/32 encap 169.228.84.34 # route addprivate 44.102.240.16/28 encap 45.145.74.24...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here&#039;s a bash script to get a complete [[encap.txt]] file from the portal.&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 .\get-encap &amp;lt; api-token.txt &amp;gt; encap.txt || echo error $?&lt;br /&gt;
&lt;br /&gt;
The script maintains a cache, so it downloads the information only when it has changed.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
# Output the current AMPRNet routing information, like this:&lt;br /&gt;
# # Fetched &amp;lt;when&amp;gt; version &amp;lt;number&amp;gt; from &amp;lt;source&amp;gt;&lt;br /&gt;
# route addprivate 44.0.1.0/32 encap 169.228.84.34&lt;br /&gt;
# route addprivate 44.102.240.16/28 encap 45.145.74.247&lt;br /&gt;
# ...&lt;br /&gt;
&lt;br /&gt;
cache=&amp;quot;${1:-routes.json}&amp;quot; # a file that stores previous information&lt;br /&gt;
token=`cat -` # an API token&lt;br /&gt;
# To obtain a token, register with http://portal.ampr.org/ , log in,&lt;br /&gt;
# browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
# Be sure to keep the token private. This script won&#039;t reveal it.&lt;br /&gt;
&lt;br /&gt;
API=&amp;quot;https://portal.ampr.org/api/v2&amp;quot;&lt;br /&gt;
# The API returns JSON, something like:&lt;br /&gt;
# {&lt;br /&gt;
#   &amp;quot;count&amp;quot;: 836,&lt;br /&gt;
#   &amp;quot;serial&amp;quot;: &amp;quot;136.269&amp;quot;,&lt;br /&gt;
#   &amp;quot;encap&amp;quot;: [&lt;br /&gt;
#     {&lt;br /&gt;
#       &amp;quot;gatewayIP&amp;quot;: &amp;quot;118.82.153.200&amp;quot;,&lt;br /&gt;
#       &amp;quot;encapType&amp;quot;: &amp;quot;IPIP&amp;quot;,&lt;br /&gt;
#       &amp;quot;network&amp;quot;: &amp;quot;44.147.0.210&amp;quot;,&lt;br /&gt;
#       &amp;quot;cidr&amp;quot;: 25,&lt;br /&gt;
#       ...&lt;br /&gt;
#     },&lt;br /&gt;
#     ...&lt;br /&gt;
#   ]&lt;br /&gt;
# }&lt;br /&gt;
# ... but without any insignificant white space.&lt;br /&gt;
# We trust that any change will also change the serial value.&lt;br /&gt;
&lt;br /&gt;
allZero () {&lt;br /&gt;
    for status in &amp;quot;$@&amp;quot;; do&lt;br /&gt;
        [ &amp;quot;$status&amp;quot; != 0 ] &amp;amp;&amp;amp; return &amp;quot;$status&amp;quot;&lt;br /&gt;
    done&lt;br /&gt;
    return 0&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
curlOptions=&amp;quot;-H \&amp;quot;Authorization: Bearer $token\&amp;quot;&lt;br /&gt;
-H \&amp;quot;Accept: application/json\&amp;quot;&lt;br /&gt;
&amp;quot;&lt;br /&gt;
if  [[ -e &amp;quot;$cache&amp;quot; &amp;amp;&amp;amp; ! -f &amp;quot;$cache&amp;quot; ]]; then&lt;br /&gt;
    echo &amp;gt;&amp;amp;2 `basename &amp;quot;$0&amp;quot;`&amp;quot;: $cache isn&#039;t a regular file.&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
elif [ -r &amp;quot;$cache&amp;quot; ]; then&lt;br /&gt;
    oldVersion=`jq &amp;quot;.serial&amp;quot; &amp;quot;$cache&amp;quot;` || oldVersion=&amp;quot;cache error $?&amp;quot;&lt;br /&gt;
    [ &amp;quot;$oldVersion&amp;quot; == &amp;quot;null&amp;quot; ] &amp;amp;&amp;amp; oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl -s --config - &amp;quot;$API&amp;quot;/encap/serial | jq &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || newVersion=&amp;quot;API error $?&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    oldVersion=&amp;quot;N/A&amp;quot; # != $newVersion&lt;br /&gt;
    newVersion=&amp;quot;TBD&amp;quot;&lt;br /&gt;
fi&lt;br /&gt;
# echo &amp;quot;# oldVersion=$oldVersion newVersion=$newVersion&amp;quot;&lt;br /&gt;
if [ &amp;quot;$newVersion&amp;quot; != &amp;quot;$oldVersion&amp;quot; ]; then&lt;br /&gt;
    # Fetch new data from the API and store it in $cache:&lt;br /&gt;
    newVersion=$(&lt;br /&gt;
        echo &amp;quot;$curlOptions&amp;quot; | curl -s --config - &amp;quot;$API&amp;quot;/encap/routes | tee &amp;quot;$cache&amp;quot; | jq &amp;quot;.serial&amp;quot;&lt;br /&gt;
        allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
    ) || exit $?&lt;br /&gt;
fi&lt;br /&gt;
# Convert $cache to the output format:&lt;br /&gt;
echo &amp;quot;# Fetched&amp;quot; `date -r &amp;quot;$cache&amp;quot;` version &amp;quot;$newVersion&amp;quot; from &amp;quot;$API&amp;quot; || exit $?&lt;br /&gt;
jq -r &#039;.encap[] | select(.encapType == &amp;quot;IPIP&amp;quot;) | &amp;quot;route addprivate \(.network)/\(.cidr) encap \(.gatewayIP)&amp;quot;&#039;\&lt;br /&gt;
   &amp;quot;$cache&amp;quot; | sort&lt;br /&gt;
# Sorting the output makes it easier to compare different versions.&lt;br /&gt;
allZero &amp;quot;${PIPESTATUS[@]}&amp;quot; || exit $?&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=Encap.txt&amp;diff=1304</id>
		<title>Encap.txt</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=Encap.txt&amp;diff=1304"/>
		<updated>2024-10-15T01:38:47Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: Use the API to get all routes. The portal doesn&amp;#039;t provide an encap.txt file via HTTP.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An encap.txt file lists AMPRNet [[gateway| gateways]], in a format like this:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# This is a comment&lt;br /&gt;
route addprivate 44.10.0.100/32 encap 136.115.52.224&lt;br /&gt;
route addprivate 44.100.129.0/24 encap 176.140.10.22&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Originally formatted for JNOS systems, it is often parsed with a &amp;quot;[[munge script]]&amp;quot; to update Linux system routing tables.&lt;br /&gt;
&lt;br /&gt;
== Portal ==&lt;br /&gt;
&lt;br /&gt;
To get an encap.txt file that lists all current gateways,&lt;br /&gt;
request all routes from the [[API]] and convert the response from JSON to text.&lt;br /&gt;
For example (using API version 2):&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;curl -s -H &amp;quot;Authorization: Bearer $APItoken&amp;quot; -H &amp;quot;Accept: application/json&amp;quot; https://portal.ampr.org/api/v2/encap/routes | jq -r &#039;.encap[] | select(.encapType == &amp;quot;IPIP&amp;quot;) | &amp;quot;route addprivate \(.network)/\(.cidr) encap \(.gatewayIP)&amp;quot;&#039;&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== HTTP ==&lt;br /&gt;
&lt;br /&gt;
Previously, a complete encap.txt file was available from the portal as a web page.&lt;br /&gt;
This is no longer supported.&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=API&amp;diff=1303</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=API&amp;diff=1303"/>
		<updated>2024-10-15T01:12:13Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: Don&amp;#039;t show API URLs as links.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
The AMPRNet [[Portal]] has an associated API that allows the data and functionality of the [[Portal]] to be accessed programatically.&lt;br /&gt;
&lt;br /&gt;
=== Version 1 ===&lt;br /&gt;
&lt;br /&gt;
Version 1 of the API uses a RESTful design, accessible only via SSL (https://) to increase security.&lt;br /&gt;
&lt;br /&gt;
All requests to the API require the client to authenticate by using Basic HTTP authentication, &lt;br /&gt;
so you will need a username and password in order to access any part of the API, &lt;br /&gt;
this can be obtained by registering for an account on the [[Portal]].&lt;br /&gt;
&lt;br /&gt;
Once you have an account, you can create your API Key (password) from the &amp;quot;Profile&#039; menu link, in the &amp;quot;Security&amp;quot; section.&lt;br /&gt;
The API username is the same username you used to login to the [[Portal]] via your web browser.&lt;br /&gt;
&lt;br /&gt;
=== Version 2 ===&lt;br /&gt;
&lt;br /&gt;
Version 2 of the API also uses a RESTful design. Requests and responses are exchanged via HTTPS.&lt;br /&gt;
Access is controlled using [https://datatracker.ietf.org/doc/html/rfc6750 Bearer authorization].&lt;br /&gt;
So, each request must include an HTTP header like this:&lt;br /&gt;
&lt;br /&gt;
 Authorization: Bearer &amp;lt;API Token&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To obtain an API token, register with the [[Portal]], log in,&lt;br /&gt;
browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some responses are in JSON format. Requests should include a header:&lt;br /&gt;
&lt;br /&gt;
 Accept: application/json&lt;br /&gt;
&lt;br /&gt;
To get complete current routing information in JSON,&lt;br /&gt;
request &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/routes&amp;lt;/nowiki&amp;gt;.&lt;br /&gt;
For example, a Unix command like this will output complete current routing information:&lt;br /&gt;
&lt;br /&gt;
 curl -s -H &amp;quot;Authorization: Bearer $APItoken&amp;quot; -H &amp;quot;Accept: application/json&amp;quot; &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/routes&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The response includes a serial number, which changes when any route is updated.&lt;br /&gt;
To get the current serial number (but not the routes) in JSON,&lt;br /&gt;
request &amp;lt;nowiki&amp;gt;https://portal.ampr.org/api/v2/encap/serial&amp;lt;/nowiki&amp;gt;.&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
	<entry>
		<id>https://wiki.ampr.org/w/index.php?title=API&amp;diff=1302</id>
		<title>API</title>
		<link rel="alternate" type="text/html" href="https://wiki.ampr.org/w/index.php?title=API&amp;diff=1302"/>
		<updated>2024-10-15T00:51:37Z</updated>

		<summary type="html">&lt;p&gt;W6JMK: Document the API version 2. I can&amp;#039;t find any documentation of API version 1, nor any API documentation in https://portal.ampr.org .&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
The AMPRNet [[Portal]] has an associated API that allows the data and functionality of the [[Portal]] to be accessed programatically.&lt;br /&gt;
&lt;br /&gt;
=== Version 1 ===&lt;br /&gt;
&lt;br /&gt;
Version 1 of the API uses a RESTful design, accessible only via SSL (https://) to increase security.&lt;br /&gt;
&lt;br /&gt;
All requests to the API require the client to authenticate by using Basic HTTP authentication, &lt;br /&gt;
so you will need a username and password in order to access any part of the API, &lt;br /&gt;
this can be obtained by registering for an account on the [[Portal]].&lt;br /&gt;
&lt;br /&gt;
Once you have an account, you can create your API Key (password) from the &amp;quot;Profile&#039; menu link, in the &amp;quot;Security&amp;quot; section.&lt;br /&gt;
The API username is the same username you used to login to the [[Portal]] via your web browser.&lt;br /&gt;
&lt;br /&gt;
=== Version 2 ===&lt;br /&gt;
&lt;br /&gt;
Version 2 of the API also uses a RESTful design. Requests and responses are exchanged via HTTPS.&lt;br /&gt;
Access is controlled using [https://datatracker.ietf.org/doc/html/rfc6750 Bearer authorization].&lt;br /&gt;
So, each request must include an HTTP header like this:&lt;br /&gt;
&lt;br /&gt;
 Authorization: Bearer &amp;lt;API Token&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To obtain an API token, register with the [[Portal]], log in,&lt;br /&gt;
browse your profile and copy the value of &amp;quot;API Token&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Some responses are in JSON format. Requests should include a header:&lt;br /&gt;
&lt;br /&gt;
 Accept: application/json&lt;br /&gt;
&lt;br /&gt;
To get complete current routing information in JSON,&lt;br /&gt;
request https://portal.ampr.org/api/v2/encap/routes .&lt;br /&gt;
The response contains a serial number, which changes when any route is updated.&lt;br /&gt;
To get the current serial number (but not the routes) in JSON,&lt;br /&gt;
request https://portal.ampr.org/api/v2/encap/serial .&lt;br /&gt;
&lt;br /&gt;
For example, a Unix command like this will output complete current routing information:&lt;br /&gt;
&lt;br /&gt;
 curl -s -H &amp;quot;Authorization: Bearer $APItoken&amp;quot; -H &amp;quot;Accept: application/json&amp;quot; https://portal.ampr.org/api/v2/encap/routes&lt;/div&gt;</summary>
		<author><name>W6JMK</name></author>
	</entry>
</feed>