<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://wiki.ledhed.net/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.ledhed.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ledhed</id>
		<title>LedHed's Wiki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.ledhed.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ledhed"/>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Special:Contributions/Ledhed"/>
		<updated>2026-05-12T17:35:14Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.23.2</generator>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=ADCS_HTTP_CDP</id>
		<title>ADCS HTTP CDP</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=ADCS_HTTP_CDP"/>
				<updated>2025-09-25T04:00:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
CRL Distribution Point (CDP) must be published in a certificate to that the client can verify whether a certificate has been revoked. By default Active Directory Certificate Services (ADCS) publishes these in LDAP and adds them to the CDP/AIA settings of the certificate template. This is less than ideal because not all devices on the network have access to query LDAP (at least they shouldn't if you have your LDAP to require authentication). The solution to this is to publish CDP/AIA information on a web/http server that all devices on the network can access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quick -n- Dirty ==&lt;br /&gt;
* Create DNS entries (pki.yourdomain.tld or crl.yourdomain.tld, etc...)&lt;br /&gt;
* Install IIS (not on the server hosting ADCS)&lt;br /&gt;
* Create a directory named (CRL, CDP, PKI, etc...)&lt;br /&gt;
* Share that directory (hide it with a trailing $, PKI$), granting the 'CertPublishers' AD group read/write access (this should grant the ADCS Root CA access to publish the CRL file)&lt;br /&gt;
* Create virtual directory pointing to the directory you just created (PKI)&lt;br /&gt;
* Add the following entries to the Certificate Template's CDP settings under the Extensions tab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 file:\\pki.yourdomain.tld\CDP$\&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
 http://pki.yourdomain.tld/&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* The file:// entry will cause the CA to publish the CRL to this path any time a new CRL is generated&lt;br /&gt;
* The http:// entry will tell the client where to find the CRL via the http protocol&lt;br /&gt;
* Add the following entry to the Certificate Template's AIA settings under the Extensions tab&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 http://pki.yourdomain.tld/&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://security.stackexchange.com/questions/206243/how-to-automate-publication-of-crl-and-crt-files-to-cdp-and-aia-location &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.youtube.com/watch?v=U9gDL4GsJxs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Windows]]&lt;br /&gt;
[[Category:Active Directory]]&lt;br /&gt;
[[Category:PKI]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=ADCS_HTTP_CDP</id>
		<title>ADCS HTTP CDP</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=ADCS_HTTP_CDP"/>
				<updated>2025-09-25T03:57:42Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
CRL Distribution Point (CDP) must be published in a certificate to that the client can verify whether a certificate has been revoked. By default Active Directory Certificate Services (ADCS) publishes these in LDAP and adds them to the CDP/AIA settings of the certificate template. This is less than ideal because not all devices on the network have access to query LDAP (at least they shouldn't if you have your LDAP to require authentication). The solution to this is to publish CDP/AIA information on a web/http server that all devices on the network can access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quick -n- Dirty ==&lt;br /&gt;
* Create DNS entries (pki.yourdomain.tld or crl.yourdomain.tld, etc...)&lt;br /&gt;
* Install IIS (not on the server hosting ADCS)&lt;br /&gt;
* Create a directory named (CRL, CDP, PKI, etc...)&lt;br /&gt;
* Share that directory (hide it with a trailing $, PKI$), granting the 'CertPublishers' AD group read/write access (this should grant the ADCS Root CA access to publish the CRL file)&lt;br /&gt;
* Create virtual directory pointing to the directory you just created (PKI)&lt;br /&gt;
* Add the following entries to the Certificate Template's CDP settings under the Extensions tab&lt;br /&gt;
 file:\\pki.yourdomain.tld\CDP$\&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
 http://pki.yourdomain.tld/&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
* The file:// entry will cause the CA to publish the CRL to this path any time a new CRL is generated&lt;br /&gt;
* The http:// entry will tell the client where to find the CRL via the http protocol&lt;br /&gt;
* Add the following entry to the Certificate Template's AIA settings under the Extensions tab&lt;br /&gt;
 http://pki.yourdomain.tld/&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://security.stackexchange.com/questions/206243/how-to-automate-publication-of-crl-and-crt-files-to-cdp-and-aia-location &amp;lt;br&amp;gt;&lt;br /&gt;
https://www.youtube.com/watch?v=U9gDL4GsJxs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Windows]]&lt;br /&gt;
[[Category:Active Directory]]&lt;br /&gt;
[[Category:PKI]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=ADCS_HTTP_CDP</id>
		<title>ADCS HTTP CDP</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=ADCS_HTTP_CDP"/>
				<updated>2025-09-25T03:57:17Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == CRL Distribution Point (CDP) must be published in a certificate to that the client can verify whether a certificate has been revoked. By default Active Director...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
CRL Distribution Point (CDP) must be published in a certificate to that the client can verify whether a certificate has been revoked. By default Active Directory Certificate Services (ADCS) publishes these in LDAP and adds them to the CDP/AIA settings of the certificate template. This is less than ideal because not all devices on the network have access to query LDAP (at least they shouldn't if you have your LDAP to require authentication). The solution to this is to publish CDP/AIA information on a web/http server that all devices on the network can access.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quick -n- Dirty ==&lt;br /&gt;
* Create DNS entries (pki.yourdomain.tld or crl.yourdomain.tld, etc...)&lt;br /&gt;
* Install IIS (not on the server hosting ADCS)&lt;br /&gt;
* Create a directory named (CRL, CDP, PKI, etc...)&lt;br /&gt;
* Share that directory (hide it with a trailing $, PKI$), granting the 'CertPublishers' AD group read/write access (this should grant the ADCS Root CA access to publish the CRL file)&lt;br /&gt;
* Create virtual directory pointing to the directory you just created (PKI)&lt;br /&gt;
* Add the following entries to the Certificate Template's CDP settings under the Extensions tab&lt;br /&gt;
 file:\\pki.yourdomain.tld\CDP$\&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
 http://pki.yourdomain.tld/&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
* The file:// entry will cause the CA to publish the CRL to this path any time a new CRL is generated&lt;br /&gt;
* The http:// entry will tell the client where to find the CRL via the http protocol&lt;br /&gt;
* Add the following entry to the Certificate Template's AIA settings under the Extensions tab&lt;br /&gt;
 http://pki.yourdomain.tld/&amp;lt;CaName&amp;gt;&amp;lt;CRLNameSuffix&amp;gt;.crl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://security.stackexchange.com/questions/206243/how-to-automate-publication-of-crl-and-crt-files-to-cdp-and-aia-location&lt;br /&gt;
https://www.youtube.com/watch?v=U9gDL4GsJxs&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Windows]]&lt;br /&gt;
[[Category:Active Directory]]&lt;br /&gt;
[[Category:PKI]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Category:PKI</id>
		<title>Category:PKI</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Category:PKI"/>
				<updated>2025-09-25T03:39:50Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot; Category:Tech_Notes &amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[ Category:Tech_Notes ]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Linux_Commands</id>
		<title>Linux Commands</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Linux_Commands"/>
				<updated>2025-01-07T11:26:17Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Linux Commands that I rarely use and often forget.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Print Working Directory (pwd) ==&lt;br /&gt;
&lt;br /&gt;
pwd = (Print Working Directory) Displays the current directory you're in.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Network Map (nmap) ==&lt;br /&gt;
&lt;br /&gt;
nmap = (Network Map) Utility that displays open network ports.&amp;lt;br&amp;gt;&lt;br /&gt;
''Basic usage: nmap 192.168.0.1 ''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== String Filter (grep) ==&lt;br /&gt;
&lt;br /&gt;
grep = Hard to explain, Filtering utility.&amp;lt;br&amp;gt;&lt;br /&gt;
''Basic usage: grep 'FilterString' filename&amp;lt;br&amp;gt;&lt;br /&gt;
''Usefull grep options:''&lt;br /&gt;
 -i 'FilterString'   =   case insensitive&lt;br /&gt;
 -b #                =   Display # number of lines BEFORE a match&lt;br /&gt;
 -a #                =   Display # number of lines AFTER a match&lt;br /&gt;
 -v                  =   Invert Match or Exclusion&lt;br /&gt;
 'FilterString1\|FilterString2\|FilterString3'  =  Multiple Filters&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Remove Comments from files'''&lt;br /&gt;
 grep -v '#' FileName1 &amp;gt; FileName2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Remove Whitespace from files'''&lt;br /&gt;
 grep -v &amp;quot;^$&amp;quot; FileName1 &amp;gt; FileName2&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
'''Remove Comments and Whitespace'''&lt;br /&gt;
 grep -v '#\|^$' FileName &amp;gt; FileName2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== List File/Directory Size ==&lt;br /&gt;
du = List the size of a file or Directory&amp;lt;br&amp;gt;&lt;br /&gt;
''Basic usage: du -hs &amp;lt;file or dir&amp;gt;''&amp;lt;br&amp;gt;&lt;br /&gt;
''Usefull du options:''&lt;br /&gt;
 -h                  = human readable&lt;br /&gt;
 -s                  = summarize (Display only total for each arguement)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== File Comptession (tar) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''Basic usage''&lt;br /&gt;
&lt;br /&gt;
''to create a tar archive:''&lt;br /&gt;
 tar -pcvzf filename.tgz directory1/ directory2/&lt;br /&gt;
&lt;br /&gt;
''to extract an archive''&lt;br /&gt;
 tar -xvzf filename.tgz -C destination_directory/&lt;br /&gt;
&lt;br /&gt;
''Usefull tar options:''&lt;br /&gt;
 -x                  = extract&lt;br /&gt;
 -c                  = create&lt;br /&gt;
 -v                  = verbose (displays whats being archived or extracted on screen)&lt;br /&gt;
 -j                  = use BZip format (.tar.bz2)&lt;br /&gt;
 -z                  = use GZip format (.tar.gz or .tgz)&lt;br /&gt;
 -p                  = Preserve file permissions&lt;br /&gt;
 -f                  = File&lt;br /&gt;
 -M                  = Multi-Volume&lt;br /&gt;
 -L                  = Tape Length (or --tape-length=) accepts values in Kb.  Size = value x 1024&lt;br /&gt;
&lt;br /&gt;
'''Span Multiple Files Example'''&lt;br /&gt;
This will create multiple files 100MB in size (100 x 1024 = 102400)&lt;br /&gt;
 tar -c -M -L=102400 --file=filename.part1.tar largefile.to.split.iso&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
When the first part is complete you will be presented a prompt like this:&lt;br /&gt;
 Prepare Volume #2 for 'filename.part1.tar' and hit return:&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To tell Tar that we want to continue with a new file we enter this:&lt;br /&gt;
 n filename.part2.tar&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
Now you will be presented this prompt:&lt;br /&gt;
 Prepare Volume #2 for 'filename.part2.tar' and hit return:&lt;br /&gt;
Notice the filename was accepted ''filename.part2.tar'.  Now just press ''return''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
To Extract spanned tar files do this:&lt;br /&gt;
 tar -x -M --file=filename.part1.tar largefile.that.was.split.iso&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
You will be prompted with this:&lt;br /&gt;
 Prepare volume #2 for filename.part1.tar and hit return: n filename.part2.tar&lt;br /&gt;
Prepare volume #2 for filename.part2.tar and hit return:&lt;br /&gt;
Now Press Retuen.&lt;br /&gt;
Thats it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Symbolic Links (symlinks) ==&lt;br /&gt;
 ln -s path/to/target linkname&lt;br /&gt;
or if the linkname is going to be the same as the source filename then&lt;br /&gt;
 ln -s path/to/target&lt;br /&gt;
This would create a symlink named target that would point to path/to/target ( target -&amp;gt; path/to/target )&amp;lt;br&amp;gt;&lt;br /&gt;
Note: This also works for directories.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Find ==&lt;br /&gt;
Find all conf files on your system&lt;br /&gt;
 find / -iname &amp;quot;*.conf&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Find files who haven't been modified in 1 year&lt;br /&gt;
 find / -type f -mtime +356 -print0&lt;br /&gt;
&lt;br /&gt;
-mtime = modified time&lt;br /&gt;
-print0 = needed to display files containing white space&lt;br /&gt;
-type f = files (not directories)&lt;br /&gt;
&lt;br /&gt;
Find old files who haven't been modified in the past 2 years and display their total disk usage&lt;br /&gt;
 find / -type f -mtime 730 -print0 | du --files0-from=- -hc | tail -n1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Turn off Linux Case Sensitivity ==&lt;br /&gt;
 shopt -u nocasematch&lt;br /&gt;
&lt;br /&gt;
 shopt -s nocasematch&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== List Files/Directories by access time (atime) ==&lt;br /&gt;
 ls -l --time=atime&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create Disk Image ==&lt;br /&gt;
Create an image from a USB drive (at /dev/sdb)&lt;br /&gt;
 dd if=/dev/sdb of=~/disk.img bs=512&lt;br /&gt;
&lt;br /&gt;
Create a compressed image from a USB drive (truncating unused space on the USB)&lt;br /&gt;
 dd if=/dev/sdb | gzip &amp;gt; ~/disk.img.gz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
More to come...&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=MacOS_Create_Bootable_USB</id>
		<title>MacOS Create Bootable USB</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=MacOS_Create_Bootable_USB"/>
				<updated>2025-01-07T09:06:16Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == This article will provide steps on how to create a bootable USB stick for bare metal installations of MacOS.   == Download OS == === Browser/App Store === From...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
This article will provide steps on how to create a bootable USB stick for bare metal installations of MacOS.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Download OS ==&lt;br /&gt;
=== Browser/App Store ===&lt;br /&gt;
From a Mac, open Safari and browse to&lt;br /&gt;
 https://support.apple.com/en-us/102662#appstore&lt;br /&gt;
Click the link for the OS version supported by your hardware.&lt;br /&gt;
This will likely open the App Store, click [Get] and you'll be presented with an option to download (or possibly upgrade).&lt;br /&gt;
&lt;br /&gt;
=== Terminal ===&lt;br /&gt;
Open a terminal and navigate to your Downloads folder.&lt;br /&gt;
Show available installers for your hardware:&lt;br /&gt;
 softwareupdate --list-full-installer&lt;br /&gt;
You'll see a list of installers, make note of the version number you'd like to download.&lt;br /&gt;
 Finding available software&lt;br /&gt;
 Software Update found the following full installers:&lt;br /&gt;
 * Title: macOS Monterey, Version: 12.7.4, Size: 12117810KiB, Build: 21H1123&lt;br /&gt;
 * Title: macOS Big Sur, Version: 11.7.10, Size: 12125478KiB, Build: 20G1427&lt;br /&gt;
 * Title: macOS Catalina, Version: 10.15.7, Size: 8055650KiB, Build: 19H15&lt;br /&gt;
&lt;br /&gt;
Grab the version number and run this command:&lt;br /&gt;
 softwareupdate --fetch-full-installer --full-installer-version 12.7.4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create Media ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Command Line Tools ==&lt;br /&gt;
 softwareupdate --list-full-installer&lt;br /&gt;
&lt;br /&gt;
 softwareupdate --fetch-full-installer&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://geekschalk.com/how-to-download-macos-installers-for-new-old-versions/&lt;br /&gt;
&lt;br /&gt;
https://support.apple.com/en-us/102662&lt;br /&gt;
&lt;br /&gt;
https://support.apple.com/en-us/101578&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MacOS]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Category:MacOS</id>
		<title>Category:MacOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Category:MacOS"/>
				<updated>2025-01-07T08:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://apple.com&lt;br /&gt;
&lt;br /&gt;
[[Category:Apple]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Windows_Service_Permissions</id>
		<title>Windows Service Permissions</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Windows_Service_Permissions"/>
				<updated>2024-04-04T07:13:41Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Sometimes you need to grant a non-administrative user or group access to manage the state of a Windows service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== DISCLAIMER ==&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;&lt;br /&gt;
This article uses some advanced administration steps. Any mistakes could put your service or system in an inoperable state. &amp;lt;br&amp;gt;&lt;br /&gt;
Sanity check the steps below, I tend to paraphrase so use your best judgment. If you're unsure of what this article is doing, DON'T DO IT!&amp;lt;br&amp;gt;&lt;br /&gt;
'' '''I AM NOT RESPONSIBLE FOR ANY DAMAGE YOU MAY CAUSE BY FOLLOWING THIS ARTICLE!''' ''&lt;br /&gt;
&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Security Templates Snap-In ==&lt;br /&gt;
* Open MMC.exe as administrator&lt;br /&gt;
* Add Snap-In 'Security Templates'&lt;br /&gt;
* Right click -&amp;gt; 'New Template'&lt;br /&gt;
* Expand the tree and click 'System Services'&lt;br /&gt;
&lt;br /&gt;
Find the service(s) you want to modify permissions on edit. Check [X] Define this policy in the template. Then click the 'Edit Security' button. Add permissions to your liking, click ok when finished.&lt;br /&gt;
Right click the Template and click 'Save'&lt;br /&gt;
&lt;br /&gt;
'''''CAUTION: Make sure your permissions at minimum have one account that has 'Full Control', otherwise you'll make it difficult to regain access to the service.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Security Configuration and Analysis Snap-In ==&lt;br /&gt;
While in the elevated MMC.&lt;br /&gt;
* Add Snap-In 'Security Configuration and Analysis'&lt;br /&gt;
* Right click -&amp;gt; 'Open Database'&lt;br /&gt;
* In the file dialog, navigate to the path you'd like to save your new security database, enter a name in the 'File name:' field and click 'Open'&lt;br /&gt;
* You should be prompted to select a Security Template to associate to the new DB, select the .inf file from the previous step.&lt;br /&gt;
* Right click -&amp;gt; 'Analyze Computer Now...'&lt;br /&gt;
* Expand the tree and click 'System Services', you should see a list of services with a red circle in the icon, this indicates deviations form the security template.&lt;br /&gt;
* Right click -&amp;gt; 'Configure Computer Now...'&lt;br /&gt;
At this point your service permissions should be set. Have the non-admin user test out their new access. If there are any errors, check the Security Configuration logs (probably saved in a log folder in the parent folder of where you saved the Template)&lt;br /&gt;
&lt;br /&gt;
'''''NOTE: When I checked the 'System Services' I got an error saying something to the effect that it couldn't read the template. Fortunately, I did this on a test server so I ignored the error and the service permissions applied just fine. It also pays to have a current backup/snapshot.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Suggestions ==&lt;br /&gt;
* I highly advise using a group for permissions, especially in this scenario. It may be that you only need to grant one user access to restart a service, but if you have to add another (say because the previous user got hit by a bus), you just need to add the new user to the group rather than jump through all the MMC/Security Template nonsense all over again. Spend the extra 30 seconds and do your future self a huge favor.&lt;br /&gt;
* Managing permissions on Windows Services are a major pain. I don't know why MS didn't add a security tab to the Services MMC. That said, you should absolutely take a backup/snapshot of the system before making changes to services. If you lock yourself out of a service, reverting a snapshot is way faster than trying to figure out how to re-apply default permissions to a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://www.scriptinghouse.com/2017/04/set-windows-service-permission-to-non-administrator-accounts.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:Windows]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Windows_Service_Permissions</id>
		<title>Windows Service Permissions</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Windows_Service_Permissions"/>
				<updated>2024-04-04T07:06:31Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == Sometimes you need to grant a non-administrative user or group access to manage the state of a Windows service.   == Disclaimer == The following article are my...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Sometimes you need to grant a non-administrative user or group access to manage the state of a Windows service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Disclaimer ==&lt;br /&gt;
The following article are my personal notes, if you choose to follow this article you do so at your own risk. I take no responsibility for the outcomes from following these steps!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Security Templates Snap-In ==&lt;br /&gt;
* Open MMC.exe as administrator&lt;br /&gt;
* Add Snap-In 'Security Templates'&lt;br /&gt;
* Right click -&amp;gt; 'New Template'&lt;br /&gt;
* Expand the tree and click 'System Services'&lt;br /&gt;
&lt;br /&gt;
Find the service(s) you want to modify permissions on edit. Check [X] Define this policy in the template. Then click the 'Edit Security' button. Add permissions to your liking, click ok when finished.&lt;br /&gt;
Right click the Template and click 'Save'&lt;br /&gt;
&lt;br /&gt;
'''''CAUTION: Make sure your permissions at minimum have one account that has 'Full Control', otherwise you'll make it difficult to regain access to the service.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Security Configuration and Analysis Snap-In ==&lt;br /&gt;
While in the elevated MMC.&lt;br /&gt;
* Add Snap-In 'Security Configuration and Analysis'&lt;br /&gt;
* Right click -&amp;gt; 'Open Database'&lt;br /&gt;
* In the file dialog, navigate to the path you'd like to save your new security database, enter a name in the 'File name:' field and click 'Open'&lt;br /&gt;
* You should be prompted to select a Security Template to associate to the new DB, select the .inf file from the previous step.&lt;br /&gt;
* Right click -&amp;gt; 'Analyze Computer Now...'&lt;br /&gt;
* Expand the tree and click 'System Services', you should see a list of services with a red circle in the icon, this indicates deviations form the security template.&lt;br /&gt;
* Right click -&amp;gt; 'Configure Computer Now...'&lt;br /&gt;
At this point your service permissions should be set. Have the non-admin user test out their new access. If there are any errors, check the Security Configuration logs (probably saved in a log folder in the parent folder of where you saved the Template)&lt;br /&gt;
&lt;br /&gt;
'''''NOTE: When I checked the 'System Services' I got an error saying something to the effect that it couldn't read the template. Fortunately, I did this on a test server so I ignored the error and the service permissions applied just fine. It also pays to have a current backup/snapshot.'''''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Suggestions ==&lt;br /&gt;
* I highly advise using a group for permissions, especially in this scenario. It may be that you only need to grant one user access to restart a service, but if you have to add another (say because the previous user got hit by a bus), you just need to add the new user to the group rather than jump through all the MMC/Security Template nonsense all over again. Spend the extra 30 seconds and do your future self a huge favor.&lt;br /&gt;
* Managing permissions on Windows Services are a major pain. I don't know why MS didn't add a security tab to the Services MMC. That said, you should absolutely take a backup/snapshot of the system before making changes to services. If you lock yourself out of a service, reverting a snapshot is way faster than trying to figure out how to re-apply default permissions to a service.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://www.scriptinghouse.com/2017/04/set-windows-service-permission-to-non-administrator-accounts.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:Windows]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Timedatectl</id>
		<title>Timedatectl</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Timedatectl"/>
				<updated>2023-12-14T07:52:35Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
I always forget how to check NTP sync status on systems that use systemd.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== timedatectl ==&lt;br /&gt;
=== Status ===&lt;br /&gt;
 timedatectl&lt;br /&gt;
&lt;br /&gt;
=== Show last synced server ===&lt;br /&gt;
 timedatectl timesync-status&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://man7.org/linux/man-pages/man1/timedatectl.1.html&lt;br /&gt;
https://www.server-world.info/en/note?os=Ubuntu_22.04&amp;amp;p=ntp&amp;amp;f=3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Raspberry_Pi_NUT_Server</id>
		<title>Raspberry Pi NUT Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Raspberry_Pi_NUT_Server"/>
				<updated>2023-10-19T10:50:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: /* Example upsd.users */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
NUT is an OpenSource tool that can monitor an extensive list of UPS devices. Often times UPS manufactures charge an extremely high cost for their network monitoring / SNMP cards.  NUT running on a Raspberry Pi or other inexpensive SBC can be a cost effective way to monitor an UPS and performed network wide graceful shutdown in the event of a power failure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Raspberry Pi or other SBC running a Debian based distro&lt;br /&gt;
* NUT Compatible UPS (see: [https://networkupstools.org/stable-hcl.html NUT-HCL])&lt;br /&gt;
* USB (or Serial to USB) connection to the Raspberry Pi&lt;br /&gt;
* Network Connectivity (Wired or Wireless depending on RPi Model).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Update the software package list ===&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt upgrade&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Install NUT ===&lt;br /&gt;
 sudo apt install nut&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server Configuration ==&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
NUT is broken into two services: nut-server and nut-monitor.  The configuration files for these services are located here:&lt;br /&gt;
 /etc/nut/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ups.conf ===&lt;br /&gt;
This is the configuration file for the UPS hardware. Here is where you specify the Driver, Make, and Model of the UPS.&lt;br /&gt;
&lt;br /&gt;
==== Obtaining the VendorID and ProductID ====&lt;br /&gt;
You will need this information before editing ups.conf.&lt;br /&gt;
 lsusb&lt;br /&gt;
 &lt;br /&gt;
 Bus 001 Device 004: ID 0764:0601 Cyber Power System, Inc. PR1500LCDRT2U UPS&lt;br /&gt;
In this case the '''ID''' field is '''0764:0601''' and this translates to '''&amp;lt;VendorID&amp;gt;:&amp;lt;ProductID&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
==== Example ups.conf ====&lt;br /&gt;
 [ups1]&lt;br /&gt;
         driver = usbhid-ups&lt;br /&gt;
         port = auto&lt;br /&gt;
         vendor = &amp;quot;CyberPowerPC PR1500LCDRT2U&amp;quot;&lt;br /&gt;
         vendorid = 0764&lt;br /&gt;
         productid = 0601&lt;br /&gt;
         pollinterval = 1&lt;br /&gt;
         bus = &amp;quot;001&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== upsd.conf ===&lt;br /&gt;
This file tells the UPS service what IP &amp;amp; Port to listen on.&lt;br /&gt;
==== Example upsd.conf ====&lt;br /&gt;
 LISTEN 127.0.0.1 3493       # Listen on localhost&lt;br /&gt;
 LISTEN 192.168.69.69 3493   # Listen on the LAN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== upsd.users ===&lt;br /&gt;
This file contains the list of users that can access NUT services.&lt;br /&gt;
&lt;br /&gt;
==== Security ====&lt;br /&gt;
Its important to note that this file contains '''clear text passwords!''' So you should take steps to restrict read access to this file. For example, set it to only be readable by the root user.&lt;br /&gt;
 chown root.root /etc/nut/upsd.users&lt;br /&gt;
 chmod 600 /etc/nut/upsd.users&lt;br /&gt;
&lt;br /&gt;
==== Example upsd.users ====&lt;br /&gt;
 [upsmon_master]&lt;br /&gt;
         password  = &amp;lt;MASTER_PASSWORD_HERE&amp;gt;&lt;br /&gt;
         actions = SET&lt;br /&gt;
         instcmds = ALL&lt;br /&gt;
         upsmon master&lt;br /&gt;
 [upsmon_remote]&lt;br /&gt;
        password  = &amp;lt;SLAVE_PASSWORD_HERE&amp;gt;&lt;br /&gt;
        upsmon slave&lt;br /&gt;
&lt;br /&gt;
=== upsmon.conf ===&lt;br /&gt;
This file tells the nut-monitor which users can access the monitoring service. It essentially maps the user you created in the previous step to an Access Control List which tells the monitoring service which users can connect from which hosts on your network.&lt;br /&gt;
&lt;br /&gt;
==== Security ====&lt;br /&gt;
Its important to note that this file contains '''clear text passwords!''' So you should take steps to restrict read access to this file. For example, set it to only be readable by the root user.&lt;br /&gt;
 chown root.root /etc/nut/upsmon.conf&lt;br /&gt;
 chmod 600 /etc/nut/upsmon.conf&lt;br /&gt;
&lt;br /&gt;
==== Example upsmon.conf ====&lt;br /&gt;
 MONITOR ups1@localhost 1 upsmon_master &amp;lt;MASTER_PASSWORD_HERE&amp;gt; master&lt;br /&gt;
'''Note: You'll likely have more than one line if you have remote clients connecting to this NUT server (which is really the whole point).'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== nut.conf ===&lt;br /&gt;
This file defines the type of role this installation of NUT will be performing.&lt;br /&gt;
==== Example nut.conf ====&lt;br /&gt;
 MODE=netserver&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Client Configuration ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
[NUT Client for ESXi]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.networkshinobi.com/raspberry-pi-as-ups-server-via-the-nut/&lt;br /&gt;
&lt;br /&gt;
https://haefelfinger.org/posts/2019/2019-11-20-using-network-ups-tools-and-mosquitto-part1/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:NUT]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Raspberry_Pi_NUT_Server</id>
		<title>Raspberry Pi NUT Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Raspberry_Pi_NUT_Server"/>
				<updated>2023-10-19T10:49:53Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: /* Example ups.conf */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
NUT is an OpenSource tool that can monitor an extensive list of UPS devices. Often times UPS manufactures charge an extremely high cost for their network monitoring / SNMP cards.  NUT running on a Raspberry Pi or other inexpensive SBC can be a cost effective way to monitor an UPS and performed network wide graceful shutdown in the event of a power failure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Raspberry Pi or other SBC running a Debian based distro&lt;br /&gt;
* NUT Compatible UPS (see: [https://networkupstools.org/stable-hcl.html NUT-HCL])&lt;br /&gt;
* USB (or Serial to USB) connection to the Raspberry Pi&lt;br /&gt;
* Network Connectivity (Wired or Wireless depending on RPi Model).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
=== Update the software package list ===&lt;br /&gt;
 sudo apt update&lt;br /&gt;
 sudo apt upgrade&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Install NUT ===&lt;br /&gt;
 sudo apt install nut&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Server Configuration ==&lt;br /&gt;
=== Configuration Files ===&lt;br /&gt;
NUT is broken into two services: nut-server and nut-monitor.  The configuration files for these services are located here:&lt;br /&gt;
 /etc/nut/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== ups.conf ===&lt;br /&gt;
This is the configuration file for the UPS hardware. Here is where you specify the Driver, Make, and Model of the UPS.&lt;br /&gt;
&lt;br /&gt;
==== Obtaining the VendorID and ProductID ====&lt;br /&gt;
You will need this information before editing ups.conf.&lt;br /&gt;
 lsusb&lt;br /&gt;
 &lt;br /&gt;
 Bus 001 Device 004: ID 0764:0601 Cyber Power System, Inc. PR1500LCDRT2U UPS&lt;br /&gt;
In this case the '''ID''' field is '''0764:0601''' and this translates to '''&amp;lt;VendorID&amp;gt;:&amp;lt;ProductID&amp;gt;'''.&lt;br /&gt;
&lt;br /&gt;
==== Example ups.conf ====&lt;br /&gt;
 [ups1]&lt;br /&gt;
         driver = usbhid-ups&lt;br /&gt;
         port = auto&lt;br /&gt;
         vendor = &amp;quot;CyberPowerPC PR1500LCDRT2U&amp;quot;&lt;br /&gt;
         vendorid = 0764&lt;br /&gt;
         productid = 0601&lt;br /&gt;
         pollinterval = 1&lt;br /&gt;
         bus = &amp;quot;001&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== upsd.conf ===&lt;br /&gt;
This file tells the UPS service what IP &amp;amp; Port to listen on.&lt;br /&gt;
==== Example upsd.conf ====&lt;br /&gt;
 LISTEN 127.0.0.1 3493       # Listen on localhost&lt;br /&gt;
 LISTEN 192.168.69.69 3493   # Listen on the LAN&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== upsd.users ===&lt;br /&gt;
This file contains the list of users that can access NUT services.&lt;br /&gt;
&lt;br /&gt;
==== Security ====&lt;br /&gt;
Its important to note that this file contains '''clear text passwords!''' So you should take steps to restrict read access to this file. For example, set it to only be readable by the root user.&lt;br /&gt;
 chown root.root /etc/nut/upsd.users&lt;br /&gt;
 chmod 600 /etc/nut/upsd.users&lt;br /&gt;
&lt;br /&gt;
==== Example upsd.users ====&lt;br /&gt;
 [upsmon_master]&lt;br /&gt;
         password  = &amp;lt;MASTER_PASSWORD_HERE&amp;gt;&lt;br /&gt;
         actions = SET&lt;br /&gt;
         instcmds = ALL&lt;br /&gt;
         upsmon master&lt;br /&gt;
[upsmon_remote]&lt;br /&gt;
        password  = &amp;lt;SLAVE_PASSWORD_HERE&amp;gt;&lt;br /&gt;
        upsmon slave&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== upsmon.conf ===&lt;br /&gt;
This file tells the nut-monitor which users can access the monitoring service. It essentially maps the user you created in the previous step to an Access Control List which tells the monitoring service which users can connect from which hosts on your network.&lt;br /&gt;
&lt;br /&gt;
==== Security ====&lt;br /&gt;
Its important to note that this file contains '''clear text passwords!''' So you should take steps to restrict read access to this file. For example, set it to only be readable by the root user.&lt;br /&gt;
 chown root.root /etc/nut/upsmon.conf&lt;br /&gt;
 chmod 600 /etc/nut/upsmon.conf&lt;br /&gt;
&lt;br /&gt;
==== Example upsmon.conf ====&lt;br /&gt;
 MONITOR ups1@localhost 1 upsmon_master &amp;lt;MASTER_PASSWORD_HERE&amp;gt; master&lt;br /&gt;
'''Note: You'll likely have more than one line if you have remote clients connecting to this NUT server (which is really the whole point).'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== nut.conf ===&lt;br /&gt;
This file defines the type of role this installation of NUT will be performing.&lt;br /&gt;
==== Example nut.conf ====&lt;br /&gt;
 MODE=netserver&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Client Configuration ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
[NUT Client for ESXi]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.networkshinobi.com/raspberry-pi-as-ups-server-via-the-nut/&lt;br /&gt;
&lt;br /&gt;
https://haefelfinger.org/posts/2019/2019-11-20-using-network-ups-tools-and-mosquitto-part1/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:NUT]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Kerberos_and_CNAMEs</id>
		<title>Kerberos and CNAMEs</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Kerberos_and_CNAMEs"/>
				<updated>2023-06-30T04:59:46Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
By default Kerberos authentication will fail when accessing a server using a DNS Alias / CNAME.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Solution ==&lt;br /&gt;
Create an alias for the host in Active Directory using the 'netdom' command:&lt;br /&gt;
 netdom computername &amp;lt;FQDN&amp;gt; /Add:&amp;lt;ALIAS&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&amp;lt;br&amp;gt;&lt;br /&gt;
Server's FQDN = FileServer-01.domain.tld &amp;lt;br&amp;gt;&lt;br /&gt;
CNAME/Alias = FS1.domain.tld&amp;lt;br&amp;gt;&lt;br /&gt;
 netdom computername FileServer-01.domain.tld /Add:FS1.domain.tld&lt;br /&gt;
&lt;br /&gt;
The netdom command registers a SPN for the server using the provided alias.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://serverfault.com/questions/481289/will-kerberos-work-with-cnames-if-i-have-the-spn-created-for-the-a-record-as-wel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Active Directory]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Kerberos_and_CNAMEs</id>
		<title>Kerberos and CNAMEs</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Kerberos_and_CNAMEs"/>
				<updated>2023-06-30T04:57:58Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == By default Kerberos authentication will fail when accessing a server using a DNS Alias / CNAME.   == Solution == Create an alias for the host in Active Director...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
By default Kerberos authentication will fail when accessing a server using a DNS Alias / CNAME.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Solution ==&lt;br /&gt;
Create an alias for the host in Active Directory using the 'netdom' command:&lt;br /&gt;
 netdom computername &amp;lt;FQDN&amp;gt; /Add:&amp;lt;ALIAS&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&amp;lt;br&amp;gt;&lt;br /&gt;
Server's FQDN = FileServer-01.domain.tld &amp;lt;br&amp;gt;&lt;br /&gt;
CNAME/Alias = FS1.domain.tld&amp;lt;br&amp;gt;&lt;br /&gt;
 netdom computername FileServer-01.domain.tld /Add:FS1.domain.tld&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://serverfault.com/questions/481289/will-kerberos-work-with-cnames-if-i-have-the-spn-created-for-the-a-record-as-wel&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Active Directory]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Ecowitt_GW1000</id>
		<title>Ecowitt GW1000</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Ecowitt_GW1000"/>
				<updated>2023-04-10T08:57:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The Ecowitt GW1000 is a weather gateway capable of receiving data from weather instruments via Radio Frequency and then rebroadcasts that data via IP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WSView App ==&lt;br /&gt;
In order to configure the GW1000 you need to install the WSView app on a mobile device. Then put your mobile device on the same WiFi network as the GW1000.&lt;br /&gt;
&lt;br /&gt;
=== Ecowitt Protocol ===&lt;br /&gt;
In the WSView app click 'More' in the upper right and click 'Weather Services' then next your way to 'Customized'. Enable the custom weather service, set the protocol to 'Ecowitt' and enter your server's IP &amp;amp; Port information. Save.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WeeWX Integration ==&lt;br /&gt;
# Install WeeWX&lt;br /&gt;
# Install the [https://github.com/matthewwall/weewx-interceptor weewx-interceptor driver]&lt;br /&gt;
# Configure WeeWX to use the 'Interceptor Driver'&lt;br /&gt;
# Edit '''/etc/weewx/weewx.conf''' and add the following:&lt;br /&gt;
 [Interceptor]&lt;br /&gt;
     driver = user.interceptor&lt;br /&gt;
     device_type = ecowitt-client&lt;br /&gt;
     address = 10.11.12.13&lt;br /&gt;
     port = 8080&lt;br /&gt;
''Note: Enter your own IP and Port'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Local API ==&lt;br /&gt;
You can grab live weather data in JSON format directly from the GW1000 through this URL:&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;GW1000-IP-ADDRESS&amp;gt;/get_livedata_info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is a table to translate the byte balues to sensor type&lt;br /&gt;
    # command_byte : (type, device, data_length)&lt;br /&gt;
    0x01: ('temperature', 'indoor', 2)&lt;br /&gt;
    0x02: ('temperature', 'outdoor', 2)&lt;br /&gt;
    0x03: ('ignore', 'dewpoint', 2)&lt;br /&gt;
    0x04: ('ignore', 'windchill', 2)&lt;br /&gt;
    0x05: ('ignore', 'heatindex', 2)&lt;br /&gt;
    0x06: ('humidity', 'indoor', 1)&lt;br /&gt;
    0x07: ('humidity', 'outdoor', 1)&lt;br /&gt;
    0x08: ('pressure_absolute', 'indoor', 2)&lt;br /&gt;
    0x09: ('pressure_relative', 'indoor', 2)&lt;br /&gt;
    0x0a: ('ignore', 'winddir', 2)&lt;br /&gt;
    0x0b: ('ignore', 'windspeed', 2)&lt;br /&gt;
    0x0c: ('ignore', 'gustspeed', 2)&lt;br /&gt;
    0x0d: ('ignore', 't_rainevent', 2)&lt;br /&gt;
    0x0e: ('ignore', 't_rainrate', 2)&lt;br /&gt;
    0x0f: ('ignore', 't_raingain', 2)&lt;br /&gt;
    0x10: ('ignore', 't_rainday', 2)&lt;br /&gt;
    0x11: ('ignore', 't_rainweek', 2)&lt;br /&gt;
    0x12: ('ignore', 't_rainmonth', 4)&lt;br /&gt;
    0x13: ('ignore', 't_rainyear', 4)&lt;br /&gt;
    0x14: ('ignore', 't_raintotals', 4)&lt;br /&gt;
    0x15: ('ignore', 'light', 4)&lt;br /&gt;
    0x16: ('ignore', 'uv', 2)&lt;br /&gt;
    0x17: ('ignore', 'uvi', 1)&lt;br /&gt;
    0x18: ('ignore', 'datetime', 6)&lt;br /&gt;
    0x19: ('ignore', 'daymaxwind', 2)&lt;br /&gt;
    0x1a: ('temperature', 'channel_1', 2)&lt;br /&gt;
    0x1b: ('temperature', 'channel_2', 2)&lt;br /&gt;
    0x1c: ('temperature', 'channel_3', 2)&lt;br /&gt;
    0x1d: ('temperature', 'channel_4', 2)&lt;br /&gt;
    0x1e: ('temperature', 'channel_5', 2)&lt;br /&gt;
    0x1f: ('temperature', 'channel_6', 2)&lt;br /&gt;
    0x20: ('temperature', 'channel_7', 2)&lt;br /&gt;
    0x21: ('temperature', 'channel_8', 2)&lt;br /&gt;
    0x22: ('humidity', 'channel_1', 1)&lt;br /&gt;
    0x23: ('humidity', 'channel_2', 1)&lt;br /&gt;
    0x24: ('humidity', 'channel_3', 1)&lt;br /&gt;
    0x25: ('humidity', 'channel_4', 1)&lt;br /&gt;
    0x26: ('humidity', 'channel_5', 1)&lt;br /&gt;
    0x27: ('humidity', 'channel_6', 1)&lt;br /&gt;
    0x28: ('humidity', 'channel_7', 1)&lt;br /&gt;
    0x29: ('humidity', 'channel_8', 1)&lt;br /&gt;
    0x2a: ('ignore', 'pm251', 2)&lt;br /&gt;
    0x2b: ('ignore', 'soiltemp1', 2)&lt;br /&gt;
    0x2c: ('moisture', 'soil_1', 1)&lt;br /&gt;
    0x2d: ('ignore', 'soiltemp2', 2)&lt;br /&gt;
    0x2e: ('moisture', 'soil_2', 1)&lt;br /&gt;
    0x2f: ('ignore', 'soiltemp3', 2)&lt;br /&gt;
    0x30: ('moisture', 'soil_3', 1)&lt;br /&gt;
    0x31: ('ignore', 'soiltemp4', 2)&lt;br /&gt;
    0x32: ('moisture', 'soil_4', 1)&lt;br /&gt;
    0x33: ('ignore', 'soiltemp5', 2)&lt;br /&gt;
    0x34: ('moisture', 'soil_5', 1)&lt;br /&gt;
    0x35: ('ignore', 'soiltemp6', 2)&lt;br /&gt;
    0x36: ('moisture', 'soil_6', 1)&lt;br /&gt;
    0x37: ('ignore', 'soiltemp7', 2)&lt;br /&gt;
    0x38: ('moisture', 'soil_7', 1)&lt;br /&gt;
    0x39: ('ignore', 'soiltemp8', 2)&lt;br /&gt;
    0x3a: ('moisture', 'soil_8', 1)&lt;br /&gt;
    0x3b: ('ignore', 'soiltemp9', 2)&lt;br /&gt;
    0x3c: ('moisture', 'soil_9', 1)&lt;br /&gt;
    0x3d: ('ignore', 'soiltemp10', 2)&lt;br /&gt;
    0x3e: ('moisture', 'soil_10', 1)&lt;br /&gt;
    0x3f: ('ignore', 'soiltemp11', 2)&lt;br /&gt;
    0x40: ('moisture', 'soil_11', 1)&lt;br /&gt;
    0x41: ('ignore', 'soiltemp12', 2)&lt;br /&gt;
    0x42: ('moisture', 'soil_12', 1)&lt;br /&gt;
    0x43: ('ignore', 'soiltemp13', 2)&lt;br /&gt;
    0x44: ('moisture', 'soil_13', 1)&lt;br /&gt;
    0x45: ('ignore', 'soiltemp14', 2)&lt;br /&gt;
    0x46: ('moisture', 'soil_14', 1)&lt;br /&gt;
    0x47: ('ignore', 'soiltemp15', 2)&lt;br /&gt;
    0x48: ('moisture', 'soil_15', 1)&lt;br /&gt;
    0x49: ('ignore', 'soiltemp16', 2)&lt;br /&gt;
    0x4a: ('moisture', 'soil_16', 1)&lt;br /&gt;
    0x4c: ('ignore', 'lowbatt', 16)&lt;br /&gt;
    0x4d: ('ignore', 'pm251_24h_avg', 2)&lt;br /&gt;
    0x4e: ('ignore', 'pm252_24h_avg', 2)&lt;br /&gt;
    0x4f: ('ignore', 'pm253_24h_avg', 2)&lt;br /&gt;
    0x50: ('ignore', 'pm254_24h_avg', 2)&lt;br /&gt;
    0x51: ('ignore', 'pm252', 2)&lt;br /&gt;
    0x52: ('ignore', 'pm253', 2)&lt;br /&gt;
    0x53: ('ignore', 'pm254', 2)&lt;br /&gt;
    0x58: ('ignore', 'leak1', 1)&lt;br /&gt;
    0x59: ('ignore', 'leak2', 1)&lt;br /&gt;
    0x5a: ('ignore', 'leak3', 1)&lt;br /&gt;
    0x5b: ('ignore', 'leak4', 1)&lt;br /&gt;
    0x60: ('ignore', 'lightningdist', 1)&lt;br /&gt;
    0x61: ('ignore', 'lightningdettime', 4)&lt;br /&gt;
    0x62: ('ignore', 'lightningcount', 4)&lt;br /&gt;
    0x63: ('ignore', 'temp9', 3)&lt;br /&gt;
    0x64: ('ignore', 'temp10', 3)&lt;br /&gt;
    0x65: ('ignore', 'temp11', 3)&lt;br /&gt;
    0x66: ('ignore', 'temp12', 3)&lt;br /&gt;
    0x67: ('ignore', 'temp13', 3)&lt;br /&gt;
    0x68: ('ignore', 'temp14', 3)&lt;br /&gt;
    0x69: ('ignore', 'temp15', 3)&lt;br /&gt;
    0x6a: ('ignore', 'temp16', 3)&lt;br /&gt;
    0x70: ('ignore', 'wh45_data', 16)&lt;br /&gt;
    0x72: ('ignore', 'leafwet1', 1)&lt;br /&gt;
    0x73: ('ignore', 'leafwet2', 1)&lt;br /&gt;
    0x74: ('ignore', 'leafwet3', 1)&lt;br /&gt;
    0x75: ('ignore', 'leafwet4', 1)&lt;br /&gt;
    0x76: ('ignore', 'leafwet5', 1)&lt;br /&gt;
    0x77: ('ignore', 'leafwet6', 1)&lt;br /&gt;
    0x78: ('ignore', 'leafwet7', 1)&lt;br /&gt;
    0x79: ('ignore', 'leafwet8', 1)&lt;br /&gt;
&lt;br /&gt;
''Note: you might need a firmware update for this URL to become available.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Ecowitt Relay ==&lt;br /&gt;
In the off chance that you want to relay the Ecowitt data to multiple endpoints check out the FOSHKplugin&lt;br /&gt;
 https://loxwiki.atlassian.net/wiki/spaces/LOXBERRY/pages/1252524456/FOSHKplugin+-+generic+version#Installation&lt;br /&gt;
It claims to be able to rebroadcast the Ecowitt data to multiple endpoints, meaning you could have it relay the data to WeeWx, Home Assistant, and maybe a smart sprinkler.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://github.com/matthewwall/weewx-interceptor&lt;br /&gt;
&lt;br /&gt;
http://www.ecowitt.com/wifi_weather/80.html&lt;br /&gt;
&lt;br /&gt;
http://weewx.com&lt;br /&gt;
&lt;br /&gt;
https://blog.meteodrenthe.nl/2023/02/03/how-to-use-the-ecowitt-gateway-gw1000-gw1100-local-api/&lt;br /&gt;
&lt;br /&gt;
https://github.com/bmrzycki/gw1000-http/blob/main/gw1000-http&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:WeeWX]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Ecowitt_GW1000</id>
		<title>Ecowitt GW1000</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Ecowitt_GW1000"/>
				<updated>2023-04-06T08:29:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The Ecowitt GW1000 is a weather gateway capable of receiving data from weather instruments via Radio Frequency and then rebroadcasts that data via IP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WSView App ==&lt;br /&gt;
In order to configure the GW1000 you need to install the WSView app on a mobile device. Then put your mobile device on the same WiFi network as the GW1000.&lt;br /&gt;
&lt;br /&gt;
=== Ecowitt Protocol ===&lt;br /&gt;
In the WSView app click 'More' in the upper right and click 'Weather Services' then next your way to 'Customized'. Enable the custom weather service, set the protocol to 'Ecowitt' and enter your server's IP &amp;amp; Port information. Save.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WeeWX Integration ==&lt;br /&gt;
# Install WeeWX&lt;br /&gt;
# Install the [https://github.com/matthewwall/weewx-interceptor weewx-interceptor driver]&lt;br /&gt;
# Configure WeeWX to use the 'Interceptor Driver'&lt;br /&gt;
# Edit '''/etc/weewx/weewx.conf''' and add the following:&lt;br /&gt;
 [Interceptor]&lt;br /&gt;
     driver = user.interceptor&lt;br /&gt;
     device_type = ecowitt-client&lt;br /&gt;
     address = 10.11.12.13&lt;br /&gt;
     port = 8080&lt;br /&gt;
''Note: Enter your own IP and Port'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Local API ==&lt;br /&gt;
You can grab live weather data in JSON format directly from the GW1000 through this URL:&amp;lt;br&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;http://&amp;lt;GW1000-IP-ADDRESS&amp;gt;/get_livedata_info&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is a table to translate the byte balues to sensor type&lt;br /&gt;
    # command_byte : (type, device, data_length)&lt;br /&gt;
    0x01: ('temperature', 'indoor', 2)&lt;br /&gt;
    0x02: ('temperature', 'outdoor', 2)&lt;br /&gt;
    0x03: ('ignore', 'dewpoint', 2)&lt;br /&gt;
    0x04: ('ignore', 'windchill', 2)&lt;br /&gt;
    0x05: ('ignore', 'heatindex', 2)&lt;br /&gt;
    0x06: ('humidity', 'indoor', 1)&lt;br /&gt;
    0x07: ('humidity', 'outdoor', 1)&lt;br /&gt;
    0x08: ('pressure_absolute', 'indoor', 2)&lt;br /&gt;
    0x09: ('pressure_relative', 'indoor', 2)&lt;br /&gt;
    0x0a: ('ignore', 'winddir', 2)&lt;br /&gt;
    0x0b: ('ignore', 'windspeed', 2)&lt;br /&gt;
    0x0c: ('ignore', 'gustspeed', 2)&lt;br /&gt;
    0x0d: ('ignore', 't_rainevent', 2)&lt;br /&gt;
    0x0e: ('ignore', 't_rainrate', 2)&lt;br /&gt;
    0x0f: ('ignore', 't_raingain', 2)&lt;br /&gt;
    0x10: ('ignore', 't_rainday', 2)&lt;br /&gt;
    0x11: ('ignore', 't_rainweek', 2)&lt;br /&gt;
    0x12: ('ignore', 't_rainmonth', 4)&lt;br /&gt;
    0x13: ('ignore', 't_rainyear', 4)&lt;br /&gt;
    0x14: ('ignore', 't_raintotals', 4)&lt;br /&gt;
    0x15: ('ignore', 'light', 4)&lt;br /&gt;
    0x16: ('ignore', 'uv', 2)&lt;br /&gt;
    0x17: ('ignore', 'uvi', 1)&lt;br /&gt;
    0x18: ('ignore', 'datetime', 6)&lt;br /&gt;
    0x19: ('ignore', 'daymaxwind', 2)&lt;br /&gt;
    0x1a: ('temperature', 'channel_1', 2)&lt;br /&gt;
    0x1b: ('temperature', 'channel_2', 2)&lt;br /&gt;
    0x1c: ('temperature', 'channel_3', 2)&lt;br /&gt;
    0x1d: ('temperature', 'channel_4', 2)&lt;br /&gt;
    0x1e: ('temperature', 'channel_5', 2)&lt;br /&gt;
    0x1f: ('temperature', 'channel_6', 2)&lt;br /&gt;
    0x20: ('temperature', 'channel_7', 2)&lt;br /&gt;
    0x21: ('temperature', 'channel_8', 2)&lt;br /&gt;
    0x22: ('humidity', 'channel_1', 1)&lt;br /&gt;
    0x23: ('humidity', 'channel_2', 1)&lt;br /&gt;
    0x24: ('humidity', 'channel_3', 1)&lt;br /&gt;
    0x25: ('humidity', 'channel_4', 1)&lt;br /&gt;
    0x26: ('humidity', 'channel_5', 1)&lt;br /&gt;
    0x27: ('humidity', 'channel_6', 1)&lt;br /&gt;
    0x28: ('humidity', 'channel_7', 1)&lt;br /&gt;
    0x29: ('humidity', 'channel_8', 1)&lt;br /&gt;
    0x2a: ('ignore', 'pm251', 2)&lt;br /&gt;
    0x2b: ('ignore', 'soiltemp1', 2)&lt;br /&gt;
    0x2c: ('moisture', 'soil_1', 1)&lt;br /&gt;
    0x2d: ('ignore', 'soiltemp2', 2)&lt;br /&gt;
    0x2e: ('moisture', 'soil_2', 1)&lt;br /&gt;
    0x2f: ('ignore', 'soiltemp3', 2)&lt;br /&gt;
    0x30: ('moisture', 'soil_3', 1)&lt;br /&gt;
    0x31: ('ignore', 'soiltemp4', 2)&lt;br /&gt;
    0x32: ('moisture', 'soil_4', 1)&lt;br /&gt;
    0x33: ('ignore', 'soiltemp5', 2)&lt;br /&gt;
    0x34: ('moisture', 'soil_5', 1)&lt;br /&gt;
    0x35: ('ignore', 'soiltemp6', 2)&lt;br /&gt;
    0x36: ('moisture', 'soil_6', 1)&lt;br /&gt;
    0x37: ('ignore', 'soiltemp7', 2)&lt;br /&gt;
    0x38: ('moisture', 'soil_7', 1)&lt;br /&gt;
    0x39: ('ignore', 'soiltemp8', 2)&lt;br /&gt;
    0x3a: ('moisture', 'soil_8', 1)&lt;br /&gt;
    0x3b: ('ignore', 'soiltemp9', 2)&lt;br /&gt;
    0x3c: ('moisture', 'soil_9', 1)&lt;br /&gt;
    0x3d: ('ignore', 'soiltemp10', 2)&lt;br /&gt;
    0x3e: ('moisture', 'soil_10', 1)&lt;br /&gt;
    0x3f: ('ignore', 'soiltemp11', 2)&lt;br /&gt;
    0x40: ('moisture', 'soil_11', 1)&lt;br /&gt;
    0x41: ('ignore', 'soiltemp12', 2)&lt;br /&gt;
    0x42: ('moisture', 'soil_12', 1)&lt;br /&gt;
    0x43: ('ignore', 'soiltemp13', 2)&lt;br /&gt;
    0x44: ('moisture', 'soil_13', 1)&lt;br /&gt;
    0x45: ('ignore', 'soiltemp14', 2)&lt;br /&gt;
    0x46: ('moisture', 'soil_14', 1)&lt;br /&gt;
    0x47: ('ignore', 'soiltemp15', 2)&lt;br /&gt;
    0x48: ('moisture', 'soil_15', 1)&lt;br /&gt;
    0x49: ('ignore', 'soiltemp16', 2)&lt;br /&gt;
    0x4a: ('moisture', 'soil_16', 1)&lt;br /&gt;
    0x4c: ('ignore', 'lowbatt', 16)&lt;br /&gt;
    0x4d: ('ignore', 'pm251_24h_avg', 2)&lt;br /&gt;
    0x4e: ('ignore', 'pm252_24h_avg', 2)&lt;br /&gt;
    0x4f: ('ignore', 'pm253_24h_avg', 2)&lt;br /&gt;
    0x50: ('ignore', 'pm254_24h_avg', 2)&lt;br /&gt;
    0x51: ('ignore', 'pm252', 2)&lt;br /&gt;
    0x52: ('ignore', 'pm253', 2)&lt;br /&gt;
    0x53: ('ignore', 'pm254', 2)&lt;br /&gt;
    0x58: ('ignore', 'leak1', 1)&lt;br /&gt;
    0x59: ('ignore', 'leak2', 1)&lt;br /&gt;
    0x5a: ('ignore', 'leak3', 1)&lt;br /&gt;
    0x5b: ('ignore', 'leak4', 1)&lt;br /&gt;
    0x60: ('ignore', 'lightningdist', 1)&lt;br /&gt;
    0x61: ('ignore', 'lightningdettime', 4)&lt;br /&gt;
    0x62: ('ignore', 'lightningcount', 4)&lt;br /&gt;
    0x63: ('ignore', 'temp9', 3)&lt;br /&gt;
    0x64: ('ignore', 'temp10', 3)&lt;br /&gt;
    0x65: ('ignore', 'temp11', 3)&lt;br /&gt;
    0x66: ('ignore', 'temp12', 3)&lt;br /&gt;
    0x67: ('ignore', 'temp13', 3)&lt;br /&gt;
    0x68: ('ignore', 'temp14', 3)&lt;br /&gt;
    0x69: ('ignore', 'temp15', 3)&lt;br /&gt;
    0x6a: ('ignore', 'temp16', 3)&lt;br /&gt;
    0x70: ('ignore', 'wh45_data', 16)&lt;br /&gt;
    0x72: ('ignore', 'leafwet1', 1)&lt;br /&gt;
    0x73: ('ignore', 'leafwet2', 1)&lt;br /&gt;
    0x74: ('ignore', 'leafwet3', 1)&lt;br /&gt;
    0x75: ('ignore', 'leafwet4', 1)&lt;br /&gt;
    0x76: ('ignore', 'leafwet5', 1)&lt;br /&gt;
    0x77: ('ignore', 'leafwet6', 1)&lt;br /&gt;
    0x78: ('ignore', 'leafwet7', 1)&lt;br /&gt;
    0x79: ('ignore', 'leafwet8', 1)&lt;br /&gt;
&lt;br /&gt;
''Note: you might need a firmware update for this URL to become available.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://github.com/matthewwall/weewx-interceptor&lt;br /&gt;
&lt;br /&gt;
http://www.ecowitt.com/wifi_weather/80.html&lt;br /&gt;
&lt;br /&gt;
http://weewx.com&lt;br /&gt;
&lt;br /&gt;
https://blog.meteodrenthe.nl/2023/02/03/how-to-use-the-ecowitt-gateway-gw1000-gw1100-local-api/&lt;br /&gt;
&lt;br /&gt;
https://github.com/bmrzycki/gw1000-http/blob/main/gw1000-http&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:WeeWX]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Ecowitt_GW1000</id>
		<title>Ecowitt GW1000</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Ecowitt_GW1000"/>
				<updated>2023-04-06T08:27:21Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The Ecowitt GW1000 is a weather gateway capable of receiving data from weather instruments via Radio Frequency and then rebroadcasts that data via IP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WSView App ==&lt;br /&gt;
In order to configure the GW1000 you need to install the WSView app on a mobile device. Then put your mobile device on the same WiFi network as the GW1000.&lt;br /&gt;
&lt;br /&gt;
=== Ecowitt Protocol ===&lt;br /&gt;
In the WSView app click 'More' in the upper right and click 'Weather Services' then next your way to 'Customized'. Enable the custom weather service, set the protocol to 'Ecowitt' and enter your server's IP &amp;amp; Port information. Save.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WeeWX Integration ==&lt;br /&gt;
# Install WeeWX&lt;br /&gt;
# Install the [https://github.com/matthewwall/weewx-interceptor weewx-interceptor driver]&lt;br /&gt;
# Configure WeeWX to use the 'Interceptor Driver'&lt;br /&gt;
# Edit '''/etc/weewx/weewx.conf''' and add the following:&lt;br /&gt;
 [Interceptor]&lt;br /&gt;
     driver = user.interceptor&lt;br /&gt;
     device_type = ecowitt-client&lt;br /&gt;
     address = 10.11.12.13&lt;br /&gt;
     port = 8080&lt;br /&gt;
''Note: Enter your own IP and Port'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Local API ==&lt;br /&gt;
You can grab live weather data in JSON format directly from the GW1000 through this URL:&amp;lt;br&amp;gt;&lt;br /&gt;
http://&amp;lt;GW1000-IP-ADDRESS&amp;gt;/get_livedata_info&lt;br /&gt;
&lt;br /&gt;
Here is a table to translate the byte balues to sensor type&lt;br /&gt;
    # command_byte : (type, device, data_length)&lt;br /&gt;
    0x01: ('temperature', 'indoor', 2)&lt;br /&gt;
    0x02: ('temperature', 'outdoor', 2)&lt;br /&gt;
    0x03: ('ignore', 'dewpoint', 2)&lt;br /&gt;
    0x04: ('ignore', 'windchill', 2)&lt;br /&gt;
    0x05: ('ignore', 'heatindex', 2)&lt;br /&gt;
    0x06: ('humidity', 'indoor', 1)&lt;br /&gt;
    0x07: ('humidity', 'outdoor', 1)&lt;br /&gt;
    0x08: ('pressure_absolute', 'indoor', 2)&lt;br /&gt;
    0x09: ('pressure_relative', 'indoor', 2)&lt;br /&gt;
    0x0a: ('ignore', 'winddir', 2)&lt;br /&gt;
    0x0b: ('ignore', 'windspeed', 2)&lt;br /&gt;
    0x0c: ('ignore', 'gustspeed', 2)&lt;br /&gt;
    0x0d: ('ignore', 't_rainevent', 2)&lt;br /&gt;
    0x0e: ('ignore', 't_rainrate', 2)&lt;br /&gt;
    0x0f: ('ignore', 't_raingain', 2)&lt;br /&gt;
    0x10: ('ignore', 't_rainday', 2)&lt;br /&gt;
    0x11: ('ignore', 't_rainweek', 2)&lt;br /&gt;
    0x12: ('ignore', 't_rainmonth', 4)&lt;br /&gt;
    0x13: ('ignore', 't_rainyear', 4)&lt;br /&gt;
    0x14: ('ignore', 't_raintotals', 4)&lt;br /&gt;
    0x15: ('ignore', 'light', 4)&lt;br /&gt;
    0x16: ('ignore', 'uv', 2)&lt;br /&gt;
    0x17: ('ignore', 'uvi', 1)&lt;br /&gt;
    0x18: ('ignore', 'datetime', 6)&lt;br /&gt;
    0x19: ('ignore', 'daymaxwind', 2)&lt;br /&gt;
    0x1a: ('temperature', 'channel_1', 2)&lt;br /&gt;
    0x1b: ('temperature', 'channel_2', 2)&lt;br /&gt;
    0x1c: ('temperature', 'channel_3', 2)&lt;br /&gt;
    0x1d: ('temperature', 'channel_4', 2)&lt;br /&gt;
    0x1e: ('temperature', 'channel_5', 2)&lt;br /&gt;
    0x1f: ('temperature', 'channel_6', 2)&lt;br /&gt;
    0x20: ('temperature', 'channel_7', 2)&lt;br /&gt;
    0x21: ('temperature', 'channel_8', 2)&lt;br /&gt;
    0x22: ('humidity', 'channel_1', 1)&lt;br /&gt;
    0x23: ('humidity', 'channel_2', 1)&lt;br /&gt;
    0x24: ('humidity', 'channel_3', 1)&lt;br /&gt;
    0x25: ('humidity', 'channel_4', 1)&lt;br /&gt;
    0x26: ('humidity', 'channel_5', 1)&lt;br /&gt;
    0x27: ('humidity', 'channel_6', 1)&lt;br /&gt;
    0x28: ('humidity', 'channel_7', 1)&lt;br /&gt;
    0x29: ('humidity', 'channel_8', 1)&lt;br /&gt;
    0x2a: ('ignore', 'pm251', 2)&lt;br /&gt;
    0x2b: ('ignore', 'soiltemp1', 2)&lt;br /&gt;
    0x2c: ('moisture', 'soil_1', 1)&lt;br /&gt;
    0x2d: ('ignore', 'soiltemp2', 2)&lt;br /&gt;
    0x2e: ('moisture', 'soil_2', 1)&lt;br /&gt;
    0x2f: ('ignore', 'soiltemp3', 2)&lt;br /&gt;
    0x30: ('moisture', 'soil_3', 1)&lt;br /&gt;
    0x31: ('ignore', 'soiltemp4', 2)&lt;br /&gt;
    0x32: ('moisture', 'soil_4', 1)&lt;br /&gt;
    0x33: ('ignore', 'soiltemp5', 2)&lt;br /&gt;
    0x34: ('moisture', 'soil_5', 1)&lt;br /&gt;
    0x35: ('ignore', 'soiltemp6', 2)&lt;br /&gt;
    0x36: ('moisture', 'soil_6', 1)&lt;br /&gt;
    0x37: ('ignore', 'soiltemp7', 2)&lt;br /&gt;
    0x38: ('moisture', 'soil_7', 1)&lt;br /&gt;
    0x39: ('ignore', 'soiltemp8', 2)&lt;br /&gt;
    0x3a: ('moisture', 'soil_8', 1)&lt;br /&gt;
    0x3b: ('ignore', 'soiltemp9', 2)&lt;br /&gt;
    0x3c: ('moisture', 'soil_9', 1)&lt;br /&gt;
    0x3d: ('ignore', 'soiltemp10', 2)&lt;br /&gt;
    0x3e: ('moisture', 'soil_10', 1)&lt;br /&gt;
    0x3f: ('ignore', 'soiltemp11', 2)&lt;br /&gt;
    0x40: ('moisture', 'soil_11', 1)&lt;br /&gt;
    0x41: ('ignore', 'soiltemp12', 2)&lt;br /&gt;
    0x42: ('moisture', 'soil_12', 1)&lt;br /&gt;
    0x43: ('ignore', 'soiltemp13', 2)&lt;br /&gt;
    0x44: ('moisture', 'soil_13', 1)&lt;br /&gt;
    0x45: ('ignore', 'soiltemp14', 2)&lt;br /&gt;
    0x46: ('moisture', 'soil_14', 1)&lt;br /&gt;
    0x47: ('ignore', 'soiltemp15', 2)&lt;br /&gt;
    0x48: ('moisture', 'soil_15', 1)&lt;br /&gt;
    0x49: ('ignore', 'soiltemp16', 2)&lt;br /&gt;
    0x4a: ('moisture', 'soil_16', 1)&lt;br /&gt;
    0x4c: ('ignore', 'lowbatt', 16)&lt;br /&gt;
    0x4d: ('ignore', 'pm251_24h_avg', 2)&lt;br /&gt;
    0x4e: ('ignore', 'pm252_24h_avg', 2)&lt;br /&gt;
    0x4f: ('ignore', 'pm253_24h_avg', 2)&lt;br /&gt;
    0x50: ('ignore', 'pm254_24h_avg', 2)&lt;br /&gt;
    0x51: ('ignore', 'pm252', 2)&lt;br /&gt;
    0x52: ('ignore', 'pm253', 2)&lt;br /&gt;
    0x53: ('ignore', 'pm254', 2)&lt;br /&gt;
    0x58: ('ignore', 'leak1', 1)&lt;br /&gt;
    0x59: ('ignore', 'leak2', 1)&lt;br /&gt;
    0x5a: ('ignore', 'leak3', 1)&lt;br /&gt;
    0x5b: ('ignore', 'leak4', 1)&lt;br /&gt;
    0x60: ('ignore', 'lightningdist', 1)&lt;br /&gt;
    0x61: ('ignore', 'lightningdettime', 4)&lt;br /&gt;
    0x62: ('ignore', 'lightningcount', 4)&lt;br /&gt;
    0x63: ('ignore', 'temp9', 3)&lt;br /&gt;
    0x64: ('ignore', 'temp10', 3)&lt;br /&gt;
    0x65: ('ignore', 'temp11', 3)&lt;br /&gt;
    0x66: ('ignore', 'temp12', 3)&lt;br /&gt;
    0x67: ('ignore', 'temp13', 3)&lt;br /&gt;
    0x68: ('ignore', 'temp14', 3)&lt;br /&gt;
    0x69: ('ignore', 'temp15', 3)&lt;br /&gt;
    0x6a: ('ignore', 'temp16', 3)&lt;br /&gt;
    0x70: ('ignore', 'wh45_data', 16)&lt;br /&gt;
    0x72: ('ignore', 'leafwet1', 1)&lt;br /&gt;
    0x73: ('ignore', 'leafwet2', 1)&lt;br /&gt;
    0x74: ('ignore', 'leafwet3', 1)&lt;br /&gt;
    0x75: ('ignore', 'leafwet4', 1)&lt;br /&gt;
    0x76: ('ignore', 'leafwet5', 1)&lt;br /&gt;
    0x77: ('ignore', 'leafwet6', 1)&lt;br /&gt;
    0x78: ('ignore', 'leafwet7', 1)&lt;br /&gt;
    0x79: ('ignore', 'leafwet8', 1)&lt;br /&gt;
&lt;br /&gt;
''Note: you might need a firmware update for this URL to become available.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://github.com/matthewwall/weewx-interceptor&lt;br /&gt;
&lt;br /&gt;
http://www.ecowitt.com/wifi_weather/80.html&lt;br /&gt;
&lt;br /&gt;
http://weewx.com&lt;br /&gt;
&lt;br /&gt;
https://blog.meteodrenthe.nl/2023/02/03/how-to-use-the-ecowitt-gateway-gw1000-gw1100-local-api/&lt;br /&gt;
&lt;br /&gt;
https://github.com/bmrzycki/gw1000-http/blob/main/gw1000-http&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:WeeWX]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Ecowitt_GW1000</id>
		<title>Ecowitt GW1000</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Ecowitt_GW1000"/>
				<updated>2023-04-06T08:27:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
The Ecowitt GW1000 is a weather gateway capable of receiving data from weather instruments via Radio Frequency and then rebroadcasts that data via IP.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WSView App ==&lt;br /&gt;
In order to configure the GW1000 you need to install the WSView app on a mobile device. Then put your mobile device on the same WiFi network as the GW1000.&lt;br /&gt;
&lt;br /&gt;
=== Ecowitt Protocol ===&lt;br /&gt;
In the WSView app click 'More' in the upper right and click 'Weather Services' then next your way to 'Customized'. Enable the custom weather service, set the protocol to 'Ecowitt' and enter your server's IP &amp;amp; Port information. Save.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WeeWX Integration ==&lt;br /&gt;
# Install WeeWX&lt;br /&gt;
# Install the [https://github.com/matthewwall/weewx-interceptor weewx-interceptor driver]&lt;br /&gt;
# Configure WeeWX to use the 'Interceptor Driver'&lt;br /&gt;
# Edit '''/etc/weewx/weewx.conf''' and add the following:&lt;br /&gt;
 [Interceptor]&lt;br /&gt;
     driver = user.interceptor&lt;br /&gt;
     device_type = ecowitt-client&lt;br /&gt;
     address = 10.11.12.13&lt;br /&gt;
     port = 8080&lt;br /&gt;
''Note: Enter your own IP and Port'' &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Local API ==&lt;br /&gt;
You can grab live weather data in JSON format directly from the GW1000 through this URL:&lt;br /&gt;
http://&amp;lt;GW1000-IP-ADDRESS&amp;gt;/get_livedata_info&lt;br /&gt;
&lt;br /&gt;
Here is a table to translate the byte balues to sensor type&lt;br /&gt;
    # command_byte : (type, device, data_length)&lt;br /&gt;
    0x01: ('temperature', 'indoor', 2)&lt;br /&gt;
    0x02: ('temperature', 'outdoor', 2)&lt;br /&gt;
    0x03: ('ignore', 'dewpoint', 2)&lt;br /&gt;
    0x04: ('ignore', 'windchill', 2)&lt;br /&gt;
    0x05: ('ignore', 'heatindex', 2)&lt;br /&gt;
    0x06: ('humidity', 'indoor', 1)&lt;br /&gt;
    0x07: ('humidity', 'outdoor', 1)&lt;br /&gt;
    0x08: ('pressure_absolute', 'indoor', 2)&lt;br /&gt;
    0x09: ('pressure_relative', 'indoor', 2)&lt;br /&gt;
    0x0a: ('ignore', 'winddir', 2)&lt;br /&gt;
    0x0b: ('ignore', 'windspeed', 2)&lt;br /&gt;
    0x0c: ('ignore', 'gustspeed', 2)&lt;br /&gt;
    0x0d: ('ignore', 't_rainevent', 2)&lt;br /&gt;
    0x0e: ('ignore', 't_rainrate', 2)&lt;br /&gt;
    0x0f: ('ignore', 't_raingain', 2)&lt;br /&gt;
    0x10: ('ignore', 't_rainday', 2)&lt;br /&gt;
    0x11: ('ignore', 't_rainweek', 2)&lt;br /&gt;
    0x12: ('ignore', 't_rainmonth', 4)&lt;br /&gt;
    0x13: ('ignore', 't_rainyear', 4)&lt;br /&gt;
    0x14: ('ignore', 't_raintotals', 4)&lt;br /&gt;
    0x15: ('ignore', 'light', 4)&lt;br /&gt;
    0x16: ('ignore', 'uv', 2)&lt;br /&gt;
    0x17: ('ignore', 'uvi', 1)&lt;br /&gt;
    0x18: ('ignore', 'datetime', 6)&lt;br /&gt;
    0x19: ('ignore', 'daymaxwind', 2)&lt;br /&gt;
    0x1a: ('temperature', 'channel_1', 2)&lt;br /&gt;
    0x1b: ('temperature', 'channel_2', 2)&lt;br /&gt;
    0x1c: ('temperature', 'channel_3', 2)&lt;br /&gt;
    0x1d: ('temperature', 'channel_4', 2)&lt;br /&gt;
    0x1e: ('temperature', 'channel_5', 2)&lt;br /&gt;
    0x1f: ('temperature', 'channel_6', 2)&lt;br /&gt;
    0x20: ('temperature', 'channel_7', 2)&lt;br /&gt;
    0x21: ('temperature', 'channel_8', 2)&lt;br /&gt;
    0x22: ('humidity', 'channel_1', 1)&lt;br /&gt;
    0x23: ('humidity', 'channel_2', 1)&lt;br /&gt;
    0x24: ('humidity', 'channel_3', 1)&lt;br /&gt;
    0x25: ('humidity', 'channel_4', 1)&lt;br /&gt;
    0x26: ('humidity', 'channel_5', 1)&lt;br /&gt;
    0x27: ('humidity', 'channel_6', 1)&lt;br /&gt;
    0x28: ('humidity', 'channel_7', 1)&lt;br /&gt;
    0x29: ('humidity', 'channel_8', 1)&lt;br /&gt;
    0x2a: ('ignore', 'pm251', 2)&lt;br /&gt;
    0x2b: ('ignore', 'soiltemp1', 2)&lt;br /&gt;
    0x2c: ('moisture', 'soil_1', 1)&lt;br /&gt;
    0x2d: ('ignore', 'soiltemp2', 2)&lt;br /&gt;
    0x2e: ('moisture', 'soil_2', 1)&lt;br /&gt;
    0x2f: ('ignore', 'soiltemp3', 2)&lt;br /&gt;
    0x30: ('moisture', 'soil_3', 1)&lt;br /&gt;
    0x31: ('ignore', 'soiltemp4', 2)&lt;br /&gt;
    0x32: ('moisture', 'soil_4', 1)&lt;br /&gt;
    0x33: ('ignore', 'soiltemp5', 2)&lt;br /&gt;
    0x34: ('moisture', 'soil_5', 1)&lt;br /&gt;
    0x35: ('ignore', 'soiltemp6', 2)&lt;br /&gt;
    0x36: ('moisture', 'soil_6', 1)&lt;br /&gt;
    0x37: ('ignore', 'soiltemp7', 2)&lt;br /&gt;
    0x38: ('moisture', 'soil_7', 1)&lt;br /&gt;
    0x39: ('ignore', 'soiltemp8', 2)&lt;br /&gt;
    0x3a: ('moisture', 'soil_8', 1)&lt;br /&gt;
    0x3b: ('ignore', 'soiltemp9', 2)&lt;br /&gt;
    0x3c: ('moisture', 'soil_9', 1)&lt;br /&gt;
    0x3d: ('ignore', 'soiltemp10', 2)&lt;br /&gt;
    0x3e: ('moisture', 'soil_10', 1)&lt;br /&gt;
    0x3f: ('ignore', 'soiltemp11', 2)&lt;br /&gt;
    0x40: ('moisture', 'soil_11', 1)&lt;br /&gt;
    0x41: ('ignore', 'soiltemp12', 2)&lt;br /&gt;
    0x42: ('moisture', 'soil_12', 1)&lt;br /&gt;
    0x43: ('ignore', 'soiltemp13', 2)&lt;br /&gt;
    0x44: ('moisture', 'soil_13', 1)&lt;br /&gt;
    0x45: ('ignore', 'soiltemp14', 2)&lt;br /&gt;
    0x46: ('moisture', 'soil_14', 1)&lt;br /&gt;
    0x47: ('ignore', 'soiltemp15', 2)&lt;br /&gt;
    0x48: ('moisture', 'soil_15', 1)&lt;br /&gt;
    0x49: ('ignore', 'soiltemp16', 2)&lt;br /&gt;
    0x4a: ('moisture', 'soil_16', 1)&lt;br /&gt;
    0x4c: ('ignore', 'lowbatt', 16)&lt;br /&gt;
    0x4d: ('ignore', 'pm251_24h_avg', 2)&lt;br /&gt;
    0x4e: ('ignore', 'pm252_24h_avg', 2)&lt;br /&gt;
    0x4f: ('ignore', 'pm253_24h_avg', 2)&lt;br /&gt;
    0x50: ('ignore', 'pm254_24h_avg', 2)&lt;br /&gt;
    0x51: ('ignore', 'pm252', 2)&lt;br /&gt;
    0x52: ('ignore', 'pm253', 2)&lt;br /&gt;
    0x53: ('ignore', 'pm254', 2)&lt;br /&gt;
    0x58: ('ignore', 'leak1', 1)&lt;br /&gt;
    0x59: ('ignore', 'leak2', 1)&lt;br /&gt;
    0x5a: ('ignore', 'leak3', 1)&lt;br /&gt;
    0x5b: ('ignore', 'leak4', 1)&lt;br /&gt;
    0x60: ('ignore', 'lightningdist', 1)&lt;br /&gt;
    0x61: ('ignore', 'lightningdettime', 4)&lt;br /&gt;
    0x62: ('ignore', 'lightningcount', 4)&lt;br /&gt;
    0x63: ('ignore', 'temp9', 3)&lt;br /&gt;
    0x64: ('ignore', 'temp10', 3)&lt;br /&gt;
    0x65: ('ignore', 'temp11', 3)&lt;br /&gt;
    0x66: ('ignore', 'temp12', 3)&lt;br /&gt;
    0x67: ('ignore', 'temp13', 3)&lt;br /&gt;
    0x68: ('ignore', 'temp14', 3)&lt;br /&gt;
    0x69: ('ignore', 'temp15', 3)&lt;br /&gt;
    0x6a: ('ignore', 'temp16', 3)&lt;br /&gt;
    0x70: ('ignore', 'wh45_data', 16)&lt;br /&gt;
    0x72: ('ignore', 'leafwet1', 1)&lt;br /&gt;
    0x73: ('ignore', 'leafwet2', 1)&lt;br /&gt;
    0x74: ('ignore', 'leafwet3', 1)&lt;br /&gt;
    0x75: ('ignore', 'leafwet4', 1)&lt;br /&gt;
    0x76: ('ignore', 'leafwet5', 1)&lt;br /&gt;
    0x77: ('ignore', 'leafwet6', 1)&lt;br /&gt;
    0x78: ('ignore', 'leafwet7', 1)&lt;br /&gt;
    0x79: ('ignore', 'leafwet8', 1)&lt;br /&gt;
&lt;br /&gt;
''Note: you might need a firmware update for this URL to become available.''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://github.com/matthewwall/weewx-interceptor&lt;br /&gt;
&lt;br /&gt;
http://www.ecowitt.com/wifi_weather/80.html&lt;br /&gt;
&lt;br /&gt;
http://weewx.com&lt;br /&gt;
&lt;br /&gt;
https://blog.meteodrenthe.nl/2023/02/03/how-to-use-the-ecowitt-gateway-gw1000-gw1100-local-api/&lt;br /&gt;
&lt;br /&gt;
https://github.com/bmrzycki/gw1000-http/blob/main/gw1000-http&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:WeeWX]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Ubuntu_Resize_Disk</id>
		<title>Ubuntu Resize Disk</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Ubuntu_Resize_Disk"/>
				<updated>2023-02-14T09:11:11Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == Sometimes you have to resize a VMs disk. This is a fairly trivial process, open the VMs settings, increase the disks size. Go to guest and resize the partition...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Sometimes you have to resize a VMs disk. This is a fairly trivial process, open the VMs settings, increase the disks size. Go to guest and resize the partition and filesystem, done!&amp;lt;br&amp;gt;&lt;br /&gt;
What happens if your VM doesn't see the increase in disk size?&lt;br /&gt;
&lt;br /&gt;
== Ubuntu (and probably other flavors of Linux) ==&lt;br /&gt;
As root run the following command to initiate a rescan of the disk.&lt;br /&gt;
 echo 1 &amp;gt;/sys/class/block/sdb/device/rescan&lt;br /&gt;
&lt;br /&gt;
You can verify the size changes by running:&lt;br /&gt;
 fdisk -l /dev/sdb&lt;br /&gt;
&lt;br /&gt;
You can also grow the partition by running:&lt;br /&gt;
 growpart /dev/sdb 1&lt;br /&gt;
This will grow the first partition to fill the disk&lt;br /&gt;
&lt;br /&gt;
You can also resize the filesystem by running:&lt;br /&gt;
 resize2fs /dev/sdb1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://kerneltalks.com/disk-management/how-to-rescan-disk-in-linux-after-extending-vmware-disk/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[category:Ubuntu]][[category:Linux]][[category:ESXi]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=MySQL_Command_Reference</id>
		<title>MySQL Command Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=MySQL_Command_Reference"/>
				<updated>2023-02-07T03:21:12Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Combine 2 fields into one result ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, fieldname2) FROM table&lt;br /&gt;
Example:&lt;br /&gt;
 SELECT CONCAT(u.first, ' ', u.last) AS name FROM usr_table u&lt;br /&gt;
&lt;br /&gt;
  ID |    first |      last |&lt;br /&gt;
 -----------------------------&lt;br /&gt;
   1 |    Led   |      Hed  |&lt;br /&gt;
   2 |    Jimmy |      Page |&lt;br /&gt;
&lt;br /&gt;
Results:&lt;br /&gt;
  Name&lt;br /&gt;
 -----------          &lt;br /&gt;
 Led Hed&lt;br /&gt;
 Jimmy Page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add fixed String to a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, 'fixed string') FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Do not return Duplicates ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DISTINCT fieldname FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Return the 'Sum' of all fields selected ==&lt;br /&gt;
&lt;br /&gt;
 SELECT SUM(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Round to 2 decimal places ==&lt;br /&gt;
&lt;br /&gt;
 SELECT ROUND(fieldname, 2) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects only the field with the highest numerical value ==&lt;br /&gt;
&lt;br /&gt;
 SELECT MAX(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects the leftmost 4 characters in a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT LEFT(fieldname, 4) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Select date and format result in MM/DD/YYYY ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DATE_FORMAT(fieldname, '%c/%d/%Y') from table&lt;br /&gt;
&lt;br /&gt;
 %a 	Abbreviated weekday name (Sun..Sat)&lt;br /&gt;
 %b 	Abbreviated month name (Jan..Dec)&lt;br /&gt;
 %c 	Month, numeric (0..12)&lt;br /&gt;
 %D 	Day of the month with English suffix (0th, 1st, 2nd, 3rd, â¦)&lt;br /&gt;
 %d 	Day of the month, numeric (00..31)&lt;br /&gt;
 %e 	Day of the month, numeric (0..31)&lt;br /&gt;
 %f 	Microseconds (000000..999999)&lt;br /&gt;
 %H 	Hour (00..23)&lt;br /&gt;
 %h 	Hour (01..12)&lt;br /&gt;
 %I 	Hour (01..12)&lt;br /&gt;
 %i 	Minutes, numeric (00..59)&lt;br /&gt;
 %j 	Day of year (001..366)&lt;br /&gt;
 %k 	Hour (0..23)&lt;br /&gt;
 %l 	Hour (1..12)&lt;br /&gt;
 %M 	Month name (January..December)&lt;br /&gt;
 %m 	Month, numeric (00..12)&lt;br /&gt;
 %p 	AM or PM&lt;br /&gt;
 %r 	Time, 12-hour (hh:mm:ss followed by AM or PM)&lt;br /&gt;
 %S 	Seconds (00..59)&lt;br /&gt;
 %s 	Seconds (00..59)&lt;br /&gt;
 %T 	Time, 24-hour (hh:mm:ss)&lt;br /&gt;
 %U 	Week (00..53), where Sunday is the first day of the week&lt;br /&gt;
 %u 	Week (00..53), where Monday is the first day of the week&lt;br /&gt;
 %V 	Week (01..53), where Sunday is the first day of the week; used with %X&lt;br /&gt;
 %v 	Week (01..53), where Monday is the first day of the week; used with %x&lt;br /&gt;
 %W 	Weekday name (Sunday..Saturday)&lt;br /&gt;
 %w 	Day of the week (0=Sunday..6=Saturday)&lt;br /&gt;
 %X 	Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V&lt;br /&gt;
 %x 	Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v&lt;br /&gt;
 %Y 	Year, numeric, four digits&lt;br /&gt;
 %y 	Year, numeric (two digits)&lt;br /&gt;
 %% 	A literal â%â character&lt;br /&gt;
 %x 	x, for any âxâ not listed above&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Join fields from different tables ==&lt;br /&gt;
&lt;br /&gt;
 SELECT a.fieldname1 b.fieldname2 FROM tableA a LEFT JOIN tableB b ON a.fieldname1 = b.fieldname1&lt;br /&gt;
''To join these fields the values of a.fieldname1 and b.fieldname1 must be equal''&amp;lt;br&amp;gt;&lt;br /&gt;
''Example:  SELECT j.JobName b.Amount FROM job j JOIN invoice i ON j.JobID = i.JobID WHERE j.JobID = '00123'''&amp;lt;br&amp;gt;&lt;br /&gt;
''The '''job''' table and '''invoice''' table were joined by the value of their '''JobID''' fields''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b.Amount''' was Selected from the invoice table where invoice.JobID = '00123' and '''j.JobName''' was Selected from the job table where job.JobID = '00123' ''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Change Column order within a table ==&lt;br /&gt;
&lt;br /&gt;
Reference: http://dev.mysql.com/doc/refman/5.0/en/change-column-order.html&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext AFTER ColumnNameToPutAfter&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext BEFORE ColumnNameToPutBefore&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext FIRST&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allow access from remote host ==&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL ON &amp;lt;DatabaseName&amp;gt;.* TO &amp;lt;User&amp;gt;@&amp;quot;&amp;lt;IP Address or Hostname&amp;gt;&amp;quot; IDENTIFIED BY &amp;quot;&amp;lt;Password&amp;gt;&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
Example:&lt;br /&gt;
 GRANT ALL ON *.* TO root@&amp;quot;10.0.0.25&amp;quot; IDENTIFIED BY &amp;quot;SomePassword&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
''This grants 'ALL' privileges for every database (*.*) to the user 'root' when connecting from IP Address 10.0.0.25 and the password given is 'SomePassword' ''&amp;lt;br&amp;gt;&lt;br /&gt;
''NOTE: Granting 'ALL' privileges to all (*.*) databases can be a security risk.  In real world scenarios, only grant the privileges that are necessary and only to the user/hosts that need them.''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show a Triggers ==&lt;br /&gt;
 SHOW TRIGGERS;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delete a Trigger ==&lt;br /&gt;
 DROP TRIGGER &amp;lt;Trigger_Name&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show Database Size ==&lt;br /&gt;
 SELECT table_schema AS &amp;quot;Database&amp;quot;, &lt;br /&gt;
 ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size (MB)&amp;quot; &lt;br /&gt;
 FROM information_schema.TABLES &lt;br /&gt;
 GROUP BY table_schema;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show Table Size ==&lt;br /&gt;
 SELECT table_schema as &amp;quot;Database&amp;quot;, table_name AS &amp;quot;Table&amp;quot;, &lt;br /&gt;
 ROUND(((data_length + index_length) / 1024 / 1024), 2) &amp;quot;Size in MB&amp;quot; &lt;br /&gt;
 FROM information_schema.TABLES &lt;br /&gt;
 ORDER BY (data_length + index_length) DESC;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MySQL]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=MySQL_Command_Reference</id>
		<title>MySQL Command Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=MySQL_Command_Reference"/>
				<updated>2023-02-07T03:20:48Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: /* Show Table Size */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Combine 2 fields into one result ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, fieldname2) FROM table&lt;br /&gt;
Example:&lt;br /&gt;
 SELECT CONCAT(u.first, ' ', u.last) AS name FROM usr_table u&lt;br /&gt;
&lt;br /&gt;
  ID |    first |      last |&lt;br /&gt;
 -----------------------------&lt;br /&gt;
   1 |    Led   |      Hed  |&lt;br /&gt;
   2 |    Jimmy |      Page |&lt;br /&gt;
&lt;br /&gt;
Results:&lt;br /&gt;
  Name&lt;br /&gt;
 -----------          &lt;br /&gt;
 Led Hed&lt;br /&gt;
 Jimmy Page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add fixed String to a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, 'fixed string') FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Do not return Duplicates ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DISTINCT fieldname FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Return the 'Sum' of all fields selected ==&lt;br /&gt;
&lt;br /&gt;
 SELECT SUM(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Round to 2 decimal places ==&lt;br /&gt;
&lt;br /&gt;
 SELECT ROUND(fieldname, 2) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects only the field with the highest numerical value ==&lt;br /&gt;
&lt;br /&gt;
 SELECT MAX(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects the leftmost 4 characters in a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT LEFT(fieldname, 4) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Select date and format result in MM/DD/YYYY ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DATE_FORMAT(fieldname, '%c/%d/%Y') from table&lt;br /&gt;
&lt;br /&gt;
 %a 	Abbreviated weekday name (Sun..Sat)&lt;br /&gt;
 %b 	Abbreviated month name (Jan..Dec)&lt;br /&gt;
 %c 	Month, numeric (0..12)&lt;br /&gt;
 %D 	Day of the month with English suffix (0th, 1st, 2nd, 3rd, â¦)&lt;br /&gt;
 %d 	Day of the month, numeric (00..31)&lt;br /&gt;
 %e 	Day of the month, numeric (0..31)&lt;br /&gt;
 %f 	Microseconds (000000..999999)&lt;br /&gt;
 %H 	Hour (00..23)&lt;br /&gt;
 %h 	Hour (01..12)&lt;br /&gt;
 %I 	Hour (01..12)&lt;br /&gt;
 %i 	Minutes, numeric (00..59)&lt;br /&gt;
 %j 	Day of year (001..366)&lt;br /&gt;
 %k 	Hour (0..23)&lt;br /&gt;
 %l 	Hour (1..12)&lt;br /&gt;
 %M 	Month name (January..December)&lt;br /&gt;
 %m 	Month, numeric (00..12)&lt;br /&gt;
 %p 	AM or PM&lt;br /&gt;
 %r 	Time, 12-hour (hh:mm:ss followed by AM or PM)&lt;br /&gt;
 %S 	Seconds (00..59)&lt;br /&gt;
 %s 	Seconds (00..59)&lt;br /&gt;
 %T 	Time, 24-hour (hh:mm:ss)&lt;br /&gt;
 %U 	Week (00..53), where Sunday is the first day of the week&lt;br /&gt;
 %u 	Week (00..53), where Monday is the first day of the week&lt;br /&gt;
 %V 	Week (01..53), where Sunday is the first day of the week; used with %X&lt;br /&gt;
 %v 	Week (01..53), where Monday is the first day of the week; used with %x&lt;br /&gt;
 %W 	Weekday name (Sunday..Saturday)&lt;br /&gt;
 %w 	Day of the week (0=Sunday..6=Saturday)&lt;br /&gt;
 %X 	Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V&lt;br /&gt;
 %x 	Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v&lt;br /&gt;
 %Y 	Year, numeric, four digits&lt;br /&gt;
 %y 	Year, numeric (two digits)&lt;br /&gt;
 %% 	A literal â%â character&lt;br /&gt;
 %x 	x, for any âxâ not listed above&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Join fields from different tables ==&lt;br /&gt;
&lt;br /&gt;
 SELECT a.fieldname1 b.fieldname2 FROM tableA a LEFT JOIN tableB b ON a.fieldname1 = b.fieldname1&lt;br /&gt;
''To join these fields the values of a.fieldname1 and b.fieldname1 must be equal''&amp;lt;br&amp;gt;&lt;br /&gt;
''Example:  SELECT j.JobName b.Amount FROM job j JOIN invoice i ON j.JobID = i.JobID WHERE j.JobID = '00123'''&amp;lt;br&amp;gt;&lt;br /&gt;
''The '''job''' table and '''invoice''' table were joined by the value of their '''JobID''' fields''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b.Amount''' was Selected from the invoice table where invoice.JobID = '00123' and '''j.JobName''' was Selected from the job table where job.JobID = '00123' ''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Change Column order within a table ==&lt;br /&gt;
&lt;br /&gt;
Reference: http://dev.mysql.com/doc/refman/5.0/en/change-column-order.html&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext AFTER ColumnNameToPutAfter&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext BEFORE ColumnNameToPutBefore&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext FIRST&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allow access from remote host ==&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL ON &amp;lt;DatabaseName&amp;gt;.* TO &amp;lt;User&amp;gt;@&amp;quot;&amp;lt;IP Address or Hostname&amp;gt;&amp;quot; IDENTIFIED BY &amp;quot;&amp;lt;Password&amp;gt;&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
Example:&lt;br /&gt;
 GRANT ALL ON *.* TO root@&amp;quot;10.0.0.25&amp;quot; IDENTIFIED BY &amp;quot;SomePassword&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
''This grants 'ALL' privileges for every database (*.*) to the user 'root' when connecting from IP Address 10.0.0.25 and the password given is 'SomePassword' ''&amp;lt;br&amp;gt;&lt;br /&gt;
''NOTE: Granting 'ALL' privileges to all (*.*) databases can be a security risk.  In real world scenarios, only grant the privileges that are necessary and only to the user/hosts that need them.''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show a Triggers ==&lt;br /&gt;
 SHOW TRIGGERS;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delete a Trigger ==&lt;br /&gt;
 DROP TRIGGER &amp;lt;Trigger_Name&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show Database Size ==&lt;br /&gt;
 SELECT table_schema AS &amp;quot;Database&amp;quot;, &lt;br /&gt;
 ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size (MB)&amp;quot; &lt;br /&gt;
 FROM information_schema.TABLES &lt;br /&gt;
 GROUP BY table_schema;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show Table Size ==&lt;br /&gt;
 SELECT table_schema as &amp;quot;Database&amp;quot;, table_name AS &amp;quot;Table&amp;quot;, &lt;br /&gt;
 ROUND(((data_length + index_length) / 1024 / 1024), 2) &amp;quot;Size in MB&amp;quot; &lt;br /&gt;
 FROM information_schema.TABLES &lt;br /&gt;
 ORDER BY (data_length + index_length) DESC;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MySQL]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=MySQL_Command_Reference</id>
		<title>MySQL Command Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=MySQL_Command_Reference"/>
				<updated>2023-02-07T03:20:24Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Combine 2 fields into one result ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, fieldname2) FROM table&lt;br /&gt;
Example:&lt;br /&gt;
 SELECT CONCAT(u.first, ' ', u.last) AS name FROM usr_table u&lt;br /&gt;
&lt;br /&gt;
  ID |    first |      last |&lt;br /&gt;
 -----------------------------&lt;br /&gt;
   1 |    Led   |      Hed  |&lt;br /&gt;
   2 |    Jimmy |      Page |&lt;br /&gt;
&lt;br /&gt;
Results:&lt;br /&gt;
  Name&lt;br /&gt;
 -----------          &lt;br /&gt;
 Led Hed&lt;br /&gt;
 Jimmy Page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add fixed String to a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, 'fixed string') FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Do not return Duplicates ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DISTINCT fieldname FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Return the 'Sum' of all fields selected ==&lt;br /&gt;
&lt;br /&gt;
 SELECT SUM(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Round to 2 decimal places ==&lt;br /&gt;
&lt;br /&gt;
 SELECT ROUND(fieldname, 2) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects only the field with the highest numerical value ==&lt;br /&gt;
&lt;br /&gt;
 SELECT MAX(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects the leftmost 4 characters in a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT LEFT(fieldname, 4) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Select date and format result in MM/DD/YYYY ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DATE_FORMAT(fieldname, '%c/%d/%Y') from table&lt;br /&gt;
&lt;br /&gt;
 %a 	Abbreviated weekday name (Sun..Sat)&lt;br /&gt;
 %b 	Abbreviated month name (Jan..Dec)&lt;br /&gt;
 %c 	Month, numeric (0..12)&lt;br /&gt;
 %D 	Day of the month with English suffix (0th, 1st, 2nd, 3rd, â¦)&lt;br /&gt;
 %d 	Day of the month, numeric (00..31)&lt;br /&gt;
 %e 	Day of the month, numeric (0..31)&lt;br /&gt;
 %f 	Microseconds (000000..999999)&lt;br /&gt;
 %H 	Hour (00..23)&lt;br /&gt;
 %h 	Hour (01..12)&lt;br /&gt;
 %I 	Hour (01..12)&lt;br /&gt;
 %i 	Minutes, numeric (00..59)&lt;br /&gt;
 %j 	Day of year (001..366)&lt;br /&gt;
 %k 	Hour (0..23)&lt;br /&gt;
 %l 	Hour (1..12)&lt;br /&gt;
 %M 	Month name (January..December)&lt;br /&gt;
 %m 	Month, numeric (00..12)&lt;br /&gt;
 %p 	AM or PM&lt;br /&gt;
 %r 	Time, 12-hour (hh:mm:ss followed by AM or PM)&lt;br /&gt;
 %S 	Seconds (00..59)&lt;br /&gt;
 %s 	Seconds (00..59)&lt;br /&gt;
 %T 	Time, 24-hour (hh:mm:ss)&lt;br /&gt;
 %U 	Week (00..53), where Sunday is the first day of the week&lt;br /&gt;
 %u 	Week (00..53), where Monday is the first day of the week&lt;br /&gt;
 %V 	Week (01..53), where Sunday is the first day of the week; used with %X&lt;br /&gt;
 %v 	Week (01..53), where Monday is the first day of the week; used with %x&lt;br /&gt;
 %W 	Weekday name (Sunday..Saturday)&lt;br /&gt;
 %w 	Day of the week (0=Sunday..6=Saturday)&lt;br /&gt;
 %X 	Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V&lt;br /&gt;
 %x 	Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v&lt;br /&gt;
 %Y 	Year, numeric, four digits&lt;br /&gt;
 %y 	Year, numeric (two digits)&lt;br /&gt;
 %% 	A literal â%â character&lt;br /&gt;
 %x 	x, for any âxâ not listed above&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Join fields from different tables ==&lt;br /&gt;
&lt;br /&gt;
 SELECT a.fieldname1 b.fieldname2 FROM tableA a LEFT JOIN tableB b ON a.fieldname1 = b.fieldname1&lt;br /&gt;
''To join these fields the values of a.fieldname1 and b.fieldname1 must be equal''&amp;lt;br&amp;gt;&lt;br /&gt;
''Example:  SELECT j.JobName b.Amount FROM job j JOIN invoice i ON j.JobID = i.JobID WHERE j.JobID = '00123'''&amp;lt;br&amp;gt;&lt;br /&gt;
''The '''job''' table and '''invoice''' table were joined by the value of their '''JobID''' fields''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b.Amount''' was Selected from the invoice table where invoice.JobID = '00123' and '''j.JobName''' was Selected from the job table where job.JobID = '00123' ''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Change Column order within a table ==&lt;br /&gt;
&lt;br /&gt;
Reference: http://dev.mysql.com/doc/refman/5.0/en/change-column-order.html&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext AFTER ColumnNameToPutAfter&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext BEFORE ColumnNameToPutBefore&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext FIRST&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allow access from remote host ==&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL ON &amp;lt;DatabaseName&amp;gt;.* TO &amp;lt;User&amp;gt;@&amp;quot;&amp;lt;IP Address or Hostname&amp;gt;&amp;quot; IDENTIFIED BY &amp;quot;&amp;lt;Password&amp;gt;&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
Example:&lt;br /&gt;
 GRANT ALL ON *.* TO root@&amp;quot;10.0.0.25&amp;quot; IDENTIFIED BY &amp;quot;SomePassword&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
''This grants 'ALL' privileges for every database (*.*) to the user 'root' when connecting from IP Address 10.0.0.25 and the password given is 'SomePassword' ''&amp;lt;br&amp;gt;&lt;br /&gt;
''NOTE: Granting 'ALL' privileges to all (*.*) databases can be a security risk.  In real world scenarios, only grant the privileges that are necessary and only to the user/hosts that need them.''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show a Triggers ==&lt;br /&gt;
 SHOW TRIGGERS;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delete a Trigger ==&lt;br /&gt;
 DROP TRIGGER &amp;lt;Trigger_Name&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show Database Size ==&lt;br /&gt;
 SELECT table_schema AS &amp;quot;Database&amp;quot;, &lt;br /&gt;
 ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size (MB)&amp;quot; &lt;br /&gt;
 FROM information_schema.TABLES &lt;br /&gt;
 GROUP BY table_schema;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show Table Size ==&lt;br /&gt;
 SELECT &lt;br /&gt;
 table_schema as &amp;quot;Database&amp;quot;, &lt;br /&gt;
 table_name AS &amp;quot;Table&amp;quot;, &lt;br /&gt;
 ROUND(((data_length + index_length) / 1024 / 1024), 2) &amp;quot;Size in MB&amp;quot; &lt;br /&gt;
 FROM information_schema.TABLES &lt;br /&gt;
 ORDER BY (data_length + index_length) DESC;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MySQL]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=MySQL_Command_Reference</id>
		<title>MySQL Command Reference</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=MySQL_Command_Reference"/>
				<updated>2023-02-07T03:13:28Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Combine 2 fields into one result ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, fieldname2) FROM table&lt;br /&gt;
Example:&lt;br /&gt;
 SELECT CONCAT(u.first, ' ', u.last) AS name FROM usr_table u&lt;br /&gt;
&lt;br /&gt;
  ID |    first |      last |&lt;br /&gt;
 -----------------------------&lt;br /&gt;
   1 |    Led   |      Hed  |&lt;br /&gt;
   2 |    Jimmy |      Page |&lt;br /&gt;
&lt;br /&gt;
Results:&lt;br /&gt;
  Name&lt;br /&gt;
 -----------          &lt;br /&gt;
 Led Hed&lt;br /&gt;
 Jimmy Page&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Add fixed String to a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT CONCAT(fieldname1, 'fixed string') FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Do not return Duplicates ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DISTINCT fieldname FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Return the 'Sum' of all fields selected ==&lt;br /&gt;
&lt;br /&gt;
 SELECT SUM(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Round to 2 decimal places ==&lt;br /&gt;
&lt;br /&gt;
 SELECT ROUND(fieldname, 2) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects only the field with the highest numerical value ==&lt;br /&gt;
&lt;br /&gt;
 SELECT MAX(fieldname) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Selects the leftmost 4 characters in a field ==&lt;br /&gt;
&lt;br /&gt;
 SELECT LEFT(fieldname, 4) FROM table&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Select date and format result in MM/DD/YYYY ==&lt;br /&gt;
&lt;br /&gt;
 SELECT DATE_FORMAT(fieldname, '%c/%d/%Y') from table&lt;br /&gt;
&lt;br /&gt;
 %a 	Abbreviated weekday name (Sun..Sat)&lt;br /&gt;
 %b 	Abbreviated month name (Jan..Dec)&lt;br /&gt;
 %c 	Month, numeric (0..12)&lt;br /&gt;
 %D 	Day of the month with English suffix (0th, 1st, 2nd, 3rd, â¦)&lt;br /&gt;
 %d 	Day of the month, numeric (00..31)&lt;br /&gt;
 %e 	Day of the month, numeric (0..31)&lt;br /&gt;
 %f 	Microseconds (000000..999999)&lt;br /&gt;
 %H 	Hour (00..23)&lt;br /&gt;
 %h 	Hour (01..12)&lt;br /&gt;
 %I 	Hour (01..12)&lt;br /&gt;
 %i 	Minutes, numeric (00..59)&lt;br /&gt;
 %j 	Day of year (001..366)&lt;br /&gt;
 %k 	Hour (0..23)&lt;br /&gt;
 %l 	Hour (1..12)&lt;br /&gt;
 %M 	Month name (January..December)&lt;br /&gt;
 %m 	Month, numeric (00..12)&lt;br /&gt;
 %p 	AM or PM&lt;br /&gt;
 %r 	Time, 12-hour (hh:mm:ss followed by AM or PM)&lt;br /&gt;
 %S 	Seconds (00..59)&lt;br /&gt;
 %s 	Seconds (00..59)&lt;br /&gt;
 %T 	Time, 24-hour (hh:mm:ss)&lt;br /&gt;
 %U 	Week (00..53), where Sunday is the first day of the week&lt;br /&gt;
 %u 	Week (00..53), where Monday is the first day of the week&lt;br /&gt;
 %V 	Week (01..53), where Sunday is the first day of the week; used with %X&lt;br /&gt;
 %v 	Week (01..53), where Monday is the first day of the week; used with %x&lt;br /&gt;
 %W 	Weekday name (Sunday..Saturday)&lt;br /&gt;
 %w 	Day of the week (0=Sunday..6=Saturday)&lt;br /&gt;
 %X 	Year for the week where Sunday is the first day of the week, numeric, four digits; used with %V&lt;br /&gt;
 %x 	Year for the week, where Monday is the first day of the week, numeric, four digits; used with %v&lt;br /&gt;
 %Y 	Year, numeric, four digits&lt;br /&gt;
 %y 	Year, numeric (two digits)&lt;br /&gt;
 %% 	A literal â%â character&lt;br /&gt;
 %x 	x, for any âxâ not listed above&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Join fields from different tables ==&lt;br /&gt;
&lt;br /&gt;
 SELECT a.fieldname1 b.fieldname2 FROM tableA a LEFT JOIN tableB b ON a.fieldname1 = b.fieldname1&lt;br /&gt;
''To join these fields the values of a.fieldname1 and b.fieldname1 must be equal''&amp;lt;br&amp;gt;&lt;br /&gt;
''Example:  SELECT j.JobName b.Amount FROM job j JOIN invoice i ON j.JobID = i.JobID WHERE j.JobID = '00123'''&amp;lt;br&amp;gt;&lt;br /&gt;
''The '''job''' table and '''invoice''' table were joined by the value of their '''JobID''' fields''&amp;lt;br&amp;gt;&lt;br /&gt;
'''''b.Amount''' was Selected from the invoice table where invoice.JobID = '00123' and '''j.JobName''' was Selected from the job table where job.JobID = '00123' ''&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Change Column order within a table ==&lt;br /&gt;
&lt;br /&gt;
Reference: http://dev.mysql.com/doc/refman/5.0/en/change-column-order.html&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext AFTER ColumnNameToPutAfter&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext BEFORE ColumnNameToPutBefore&lt;br /&gt;
 ALTER TABLE TableName MODIFY COLUMN ColumnNameToMove longtext FIRST&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Allow access from remote host ==&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL ON &amp;lt;DatabaseName&amp;gt;.* TO &amp;lt;User&amp;gt;@&amp;quot;&amp;lt;IP Address or Hostname&amp;gt;&amp;quot; IDENTIFIED BY &amp;quot;&amp;lt;Password&amp;gt;&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
Example:&lt;br /&gt;
 GRANT ALL ON *.* TO root@&amp;quot;10.0.0.25&amp;quot; IDENTIFIED BY &amp;quot;SomePassword&amp;quot;;&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
''This grants 'ALL' privileges for every database (*.*) to the user 'root' when connecting from IP Address 10.0.0.25 and the password given is 'SomePassword' ''&amp;lt;br&amp;gt;&lt;br /&gt;
''NOTE: Granting 'ALL' privileges to all (*.*) databases can be a security risk.  In real world scenarios, only grant the privileges that are necessary and only to the user/hosts that need them.''&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show a Triggers ==&lt;br /&gt;
 SHOW TRIGGERS;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Delete a Trigger ==&lt;br /&gt;
 DROP TRIGGER &amp;lt;Trigger_Name&amp;gt;;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Show Database Size ==&lt;br /&gt;
 SELECT table_schema AS &amp;quot;Database&amp;quot;, &lt;br /&gt;
 ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS &amp;quot;Size (MB)&amp;quot; &lt;br /&gt;
 FROM information_schema.TABLES &lt;br /&gt;
 GROUP BY table_schema;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:MySQL]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Ubuntu_22.04_Autoinstall</id>
		<title>Ubuntu 22.04 Autoinstall</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Ubuntu_22.04_Autoinstall"/>
				<updated>2022-08-24T15:01:53Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == This article will explain how to create a custom USB Boot disk for automatic installation of Ubuntu 22.04 including an answer file.   == Quick-n-Dirty == === In...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
This article will explain how to create a custom USB Boot disk for automatic installation of Ubuntu 22.04 including an answer file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Quick-n-Dirty ==&lt;br /&gt;
=== Installation Media ===&lt;br /&gt;
Partition USB stick into 2 pieces&amp;lt;br&amp;gt;&lt;br /&gt;
Partition 1 = 16M, EFI, Format FAT32&amp;lt;br&amp;gt;&lt;br /&gt;
Partition 2 = 4G, MS Dos, Format FAT32&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Mount Partition 2''' (make sure to use the right device, you can check with lsblk)&lt;br /&gt;
 mount /dev/sdb2 /mnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Extract ISO to Partition 2'''&lt;br /&gt;
 7z -y x ubuntu-22.04.1-live-server-amd64.iso -o/mnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Edit /mnt/boot/grub/grub.cfg'''&lt;br /&gt;
Add these lines after the end of the first 'menuentry'&lt;br /&gt;
 menuentry &amp;quot;Auto Install Ubuntu Server&amp;quot; {&lt;br /&gt;
         set gfxpayload=keep&lt;br /&gt;
         linux   /casper/vmlinuz autoinstall quiet  ---&lt;br /&gt;
         initrd  /casper/initrd&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Update /mnt/md5sum.txt'''&lt;br /&gt;
 cd /mnt&lt;br /&gt;
 md5sum ./boot/grub/grub.cfg &amp;gt;&amp;gt; /mnt/md5sum.txt&lt;br /&gt;
Remember to delete the old grub.cfg line.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Create an efi directory under /mnt/boot/''':&lt;br /&gt;
 mkdir /mnt/boot/efi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Mount Partition 1'''&lt;br /&gt;
 mount /dev/sdb1 /mnt/boot/efi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Install grub on Partition 2''' (this assumes the system is x64 UEFI):&lt;br /&gt;
 grub-install --boot-directory=/mnt/boot /dev/sdb2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Unmount Partition 1, then Partition 2'''&lt;br /&gt;
 umount /mnt/boot/efi&lt;br /&gt;
 umount /mnt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Answer File Media ===&lt;br /&gt;
'''Generate a user-data file''', this is most easily done by copying one from a manual installation. This file can be found at:&lt;br /&gt;
 /var/log/install/autoinstall-user-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Generate a meta-data file''', this file is typically empty.&lt;br /&gt;
 touch meta-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Create the answer-file.iso'''&lt;br /&gt;
 cloud-localds ./answer_file.iso user-data meta-data&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''Burn answer-file.iso to a USB stick.'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''' Unmount the Answer File USB stick'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Boot it! ===&lt;br /&gt;
Insert the newly created Installation USB stick and invoke your system's boot menu (F11 perhaps).&lt;br /&gt;
* Highlight Partition 2&lt;br /&gt;
* Insert the Answer File Media&lt;br /&gt;
* Press [Enter]&lt;br /&gt;
The system should install unattended including the network settings, user credentials, and packages you selected when generating the user-data file on the manual installation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://ubuntu.com/server/docs/install/autoinstall&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://cloudinit.readthedocs.io/en/latest/topics/datasources/nocloud.html&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://github.com/covertsh/ubuntu-autoinstall-generator/blob/main/ubuntu-autoinstall-generator.sh#L249&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://linuxconfig.org/ubuntu-autoinstall-example&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
https://gist.github.com/jamiekurtz/26c46b3e594f8cdd453a&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Ubuntu]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Regex_Examples</id>
		<title>Regex Examples</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Regex_Examples"/>
				<updated>2022-07-14T11:21:30Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == Here are some common examples of Regex used for form validation.  == Phone Numbers ==   == Email Addresses ==   == IP Address Validation == === IPv4 Address ===...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Here are some common examples of Regex used for form validation.&lt;br /&gt;
&lt;br /&gt;
== Phone Numbers ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Email Addresses ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP Address Validation ==&lt;br /&gt;
=== IPv4 Address ===&lt;br /&gt;
 ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== IPv4 Subnet in CIDR Notation ===&lt;br /&gt;
 ^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)($|/([0-9]|[12][0-9]|3[0-2]))$&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://www.regextester.com/&lt;br /&gt;
&lt;br /&gt;
https://www.regextutorial.org/regex-for-ip-address-match.php&lt;br /&gt;
&lt;br /&gt;
https://stackoverflow.com/questions/12141206/ipaddress-or-cidr-block-matching-regex&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Regular_Expression]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Category:Regular_Expression</id>
		<title>Category:Regular Expression</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Category:Regular_Expression"/>
				<updated>2022-07-14T11:20:52Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Regular Expression ==   Category:Tech_Notes&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Regular Expression ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Tech_Notes]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Serial_Console</id>
		<title>Serial Console</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Serial_Console"/>
				<updated>2022-06-08T15:01:49Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Serial Console HowTo&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Sometimes it is handy to be able to redirect a TTY Console to a serial port.&lt;br /&gt;
One such example might be that your server is headless (No VGA, Keyboard, or Monitor)&lt;br /&gt;
The info on this page will help you enable console access via a serial port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
To redirect a Linux Console to a serial port edit /etc/inittab and add this line at the end of the '# Run gettys in standard runlevels' section.&lt;br /&gt;
&lt;br /&gt;
 S0:2345:respawn /usr/sbin/agetty -h ttyS0 38400 vt100&lt;br /&gt;
&lt;br /&gt;
When done issue this command to make the changes take effect:&lt;br /&gt;
&lt;br /&gt;
 init q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
TTY-ID:RUN-LEVELS:respawn COMMAND -SWITCHES PORT TERMINAL-EMULATION&lt;br /&gt;
(For greater detail on inittab or agetty see the [[Serial_Console#References|References Section]] below)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Notes ==&lt;br /&gt;
1) In this HowTo I used 'agetty' but there are other getty packages such as 'getty', 'mgetty', and 'mingetty' use whichever is the default on your distribution. If you use one of the other getty packages keep in mind that the syntax will most likely be different.&amp;lt;br&amp;gt;&lt;br /&gt;
2) ttyS0 = COM1, ttyS1 = COM2 etc...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modern Distros using Systemd==&lt;br /&gt;
If you're on a distro that uses systemd, here is another method (in this case Ubuntu 22.04):&lt;br /&gt;
&lt;br /&gt;
 cat &amp;lt;&amp;lt;EOF &amp;gt; /lib/systemd/system/ttyS0.service&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Serial Console Service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/sbin/getty -L 115200 ttyS0 vt102&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Then reload, enable, and start the service&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl enable ttyS0&lt;br /&gt;
 systemctl start ttyS0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://www.vanemery.com/Linux/Serial/serial-console.html Linux Serial Console HowTo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.linuxjournal.com/article/2040 Linux Journal - Serial as a Console]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/5inittab.man.html inittab Man Pages]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/8agetty.man.html agetty Man Pages]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[https://ubuntuforums.org/showthread.php?t=2343595 Serial Console connection on Ubuntu 16.04 or higher]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Serial_Console</id>
		<title>Serial Console</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Serial_Console"/>
				<updated>2022-06-08T15:01:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Serial Console HowTo&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Sometimes it is handy to be able to redirect a TTY Console to a serial port.&lt;br /&gt;
One such example might be that your server is headless (No VGA, Keyboard, or Monitor)&lt;br /&gt;
The info on this page will help you enable console access via a serial port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
To redirect a Linux Console to a serial port edit /etc/inittab and add this line at the end of the '# Run gettys in standard runlevels' section.&lt;br /&gt;
&lt;br /&gt;
 S0:2345:respawn /usr/sbin/agetty -h ttyS0 38400 vt100&lt;br /&gt;
&lt;br /&gt;
When done issue this command to make the changes take effect:&lt;br /&gt;
&lt;br /&gt;
 init q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
TTY-ID:RUN-LEVELS:respawn COMMAND -SWITCHES PORT TERMINAL-EMULATION&lt;br /&gt;
(For greater detail on inittab or agetty see the [[Serial_Console#References|References Section]] below)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Notes ==&lt;br /&gt;
1) In this HowTo I used 'agetty' but there are other getty packages such as 'getty', 'mgetty', and 'mingetty' use whichever is the default on your distribution. If you use one of the other getty packages keep in mind that the syntax will most likely be different.&amp;lt;br&amp;gt;&lt;br /&gt;
2) ttyS0 = COM1, ttyS1 = COM2 etc...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modern Distros using Systemd==&lt;br /&gt;
If you're on an distro that uses systemd, here is another method (in this case Ubuntu 22.04):&lt;br /&gt;
&lt;br /&gt;
 cat &amp;lt;&amp;lt;EOF &amp;gt; /lib/systemd/system/ttyS0.service&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Serial Console Service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/sbin/getty -L 115200 ttyS0 vt102&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Then reload, enable, and start the service&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl enable ttyS0&lt;br /&gt;
 systemctl start ttyS0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://www.vanemery.com/Linux/Serial/serial-console.html Linux Serial Console HowTo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.linuxjournal.com/article/2040 Linux Journal - Serial as a Console]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/5inittab.man.html inittab Man Pages]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/8agetty.man.html agetty Man Pages]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[https://ubuntuforums.org/showthread.php?t=2343595 Serial Console connection on Ubuntu 16.04 or higher]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Serial_Console</id>
		<title>Serial Console</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Serial_Console"/>
				<updated>2022-06-08T15:01:06Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Serial Console HowTo&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Sometimes it is handy to be able to redirect a TTY Console to a serial port.&lt;br /&gt;
One such example might be that your server is headless (No VGA, Keyboard, or Monitor)&lt;br /&gt;
The info on this page will help you enable console access via a serial port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
To redirect a Linux Console to a serial port edit /etc/inittab and add this line at the end of the '# Run gettys in standard runlevels' section.&lt;br /&gt;
&lt;br /&gt;
 S0:2345:respawn /usr/sbin/agetty -h ttyS0 38400 vt100&lt;br /&gt;
&lt;br /&gt;
When done issue this command to make the changes take effect:&lt;br /&gt;
&lt;br /&gt;
 init q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
TTY-ID:RUN-LEVELS:respawn COMMAND -SWITCHES PORT TERMINAL-EMULATION&lt;br /&gt;
(For greater detail on inittab or agetty see the [[Serial_Console#References|References Section]] below)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Notes ==&lt;br /&gt;
1) In this HowTo I used 'agetty' but there are other getty packages such as 'getty', 'mgetty', and 'mingetty' use whichever is the default on your distribution. If you use one of the other getty packages keep in mind that the syntax will most likely be different.&amp;lt;br&amp;gt;&lt;br /&gt;
2) ttyS0 = COM1, ttyS1 = COM2 etc...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modern Distros using Systemd==&lt;br /&gt;
If you're on an distro that uses systemd, here is another method (in this case Ubuntu 22.04):&lt;br /&gt;
&lt;br /&gt;
 cat &amp;lt;&amp;lt;EOF &amp;gt; /lib/systemd/system/ttyS0.service&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Serial Console Service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/sbin/getty -L 115200 ttyS0 vt102&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Then reload, enable, and start the service&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl enable ttyS0&lt;br /&gt;
 systemctl start ttyS0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://www.vanemery.com/Linux/Serial/serial-console.html Linux Serial Console HowTo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.linuxjournal.com/article/2040 Linux Journal - Serial as a Console]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/5inittab.man.html inittab Man Pages]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/8agetty.man.html agetty Man Pages]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[https://ubuntuforums.org/showthread.php?t=2343595 Serial Console connection on Ubuntu 16.04 or higher]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Serial_Console</id>
		<title>Serial Console</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Serial_Console"/>
				<updated>2022-06-08T15:00:17Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Serial Console HowTo&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
Sometimes it is handy to be able to redirect a TTY Console to a serial port.&lt;br /&gt;
One such example might be that your server is headless (No VGA, Keyboard, or Monitor)&lt;br /&gt;
The info on this page will help you enable console access via a serial port.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
&lt;br /&gt;
To redirect a Linux Console to a serial port edit /etc/inittab and add this line at the end of the '# Run gettys in standard runlevels' section.&lt;br /&gt;
&lt;br /&gt;
 S0:2345:respawn /usr/sbin/agetty -h ttyS0 38400 vt100&lt;br /&gt;
&lt;br /&gt;
When done issue this command to make the changes take effect:&lt;br /&gt;
&lt;br /&gt;
 init q&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Explanation ==&lt;br /&gt;
TTY-ID:RUN-LEVELS:respawn COMMAND -SWITCHES PORT TERMINAL-EMULATION&lt;br /&gt;
(For greater detail on inittab or agetty see the [[Serial_Console#References|References Section]] below)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== General Notes ==&lt;br /&gt;
1) In this HowTo I used 'agetty' but there are other getty packages such as 'getty', 'mgetty', and 'mingetty' use whichever is the default on your distribution. If you use one of the other getty packages keep in mind that the syntax will most likely be different.&amp;lt;br&amp;gt;&lt;br /&gt;
2) ttyS0 = COM1, ttyS1 = COM2 etc...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Modern Distros using Systemd==&lt;br /&gt;
If you're on an distro that uses systemd, here is another method (in this case Ubuntu 22.04):&lt;br /&gt;
&lt;br /&gt;
 cat &amp;lt;&amp;lt;EOF &amp;gt; /lib/systemd/system/ttyS0.service&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Serial Console Service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 ExecStart=/sbin/getty -L 115200 ttyS0 vt102&lt;br /&gt;
 Restart=always&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Then reload, enable, and start the service&lt;br /&gt;
 systemctl daemon-reload&lt;br /&gt;
 systemctl enable ttyS0&lt;br /&gt;
 systemctl start ttyS0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
[http://www.vanemery.com/Linux/Serial/serial-console.html Linux Serial Console HowTo]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.linuxjournal.com/article/2040 Linux Journal - Serial as a Console]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/5inittab.man.html inittab Man Pages]&amp;lt;br&amp;gt;&lt;br /&gt;
[http://www.netadmintools.com/html/8agetty.man.html agetty Man Pages]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[https://ubuntuforums.org/showthread.php?t=2343595]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Linux_Random_MAC</id>
		<title>Linux Random MAC</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Linux_Random_MAC"/>
				<updated>2022-06-01T10:47:29Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Current versions of Linux distros are obtaining DHCP leases with Randomized MAC addresses which I find aggravating when trying to track down a host by MAC. It also blows up a DHCP reservation if you re-install an OS on the same Hardware/VM.&lt;br /&gt;
&lt;br /&gt;
== Solution 1 ==&lt;br /&gt;
 echo &amp;quot;      dhcp-identifier: mac&amp;quot; &amp;gt;&amp;gt;/etc/netplan/xxx.yaml&lt;br /&gt;
 netplan apply&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Solution 2 (old) ==&lt;br /&gt;
 echo &amp;quot;send dhcp-client-identifier = hardware;&amp;quot; &amp;gt;&amp;gt;/etc/dhcp/dhclient.conf&lt;br /&gt;
 rm /var/lib/dhcp/*&lt;br /&gt;
 systemctl restart networking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://superuser.com/questions/1338510/wrong-ip-address-from-dhcp-client-on-ubuntu-18-04&lt;br /&gt;
&lt;br /&gt;
https://superuser.com/questions/1553094/force-to-use-mac-address-as-dhcp-client-id-on-debian-buster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]][[Category:Ubuntu]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=OpenBSD_Shell_Tweaks</id>
		<title>OpenBSD Shell Tweaks</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=OpenBSD_Shell_Tweaks"/>
				<updated>2022-01-24T11:01:24Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;'''INCOMPLETE'''    == Overview == A buddy of mine who is a FreeBSD fanatic got me using it and I fell in love with it's command line, specifically the command history complet...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''INCOMPLETE'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
A buddy of mine who is a FreeBSD fanatic got me using it and I fell in love with it's command line, specifically the command history completion. OpenBSD's default root shell is ksh and while it does tab completion and command history, it doesn't do command history completion. I also really like a colored command line interface for quickly identifying folders, links, and executables (ya this is a Linux carryover). This article will show how to add color and add command history completion to the Korn shell.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prompt ==&lt;br /&gt;
Add this to your .profile file:&lt;br /&gt;
 PS1='$USER:$PWD# '&lt;br /&gt;
 export PS1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== COLORLS ==&lt;br /&gt;
 pkg_add -r colorls&lt;br /&gt;
Add this to your .profile file:&lt;br /&gt;
 LSCOLORS=gxfxhxhxcxhxhxBxBxhxhx&lt;br /&gt;
 export LSCOLORS&lt;br /&gt;
 alias ls='colorls -G'&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://geoff.greer.fm/lscolors/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenBSD]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=OpenBSD_Aliases</id>
		<title>OpenBSD Aliases</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=OpenBSD_Aliases"/>
				<updated>2022-01-23T12:42:51Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
I started using OpenBSD and found that some of the command aliases I'm used to using in other distributions weren't there. Naturally I went looking for ~/.kshrc but was surprised to find it wasn't there. There was .cshrc but edits to that file weren't working (probably because the default shell in OpenBSD is ksh).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to add Aliases ==&lt;br /&gt;
Edit ~/.profile and add:&lt;br /&gt;
 export ENV=$HOME/.kshrc&lt;br /&gt;
&lt;br /&gt;
Now create ~/.kshrc&lt;br /&gt;
 alias     ll=&amp;quot;ls -lsah&amp;quot;&lt;br /&gt;
 alias     service=rcctl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://unix.stackexchange.com/questions/476065/openbsd-how-does-one-set-an-alias&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenBSD]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=OpenBSD_Disk_Setup</id>
		<title>OpenBSD Disk Setup</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=OpenBSD_Disk_Setup"/>
				<updated>2022-01-23T12:40:47Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == How to customize the partition sized during OpenBSD installation to give /var more space.   == Edit Auto Configured Disk Layout == At install time you can choos...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
How to customize the partition sized during OpenBSD installation to give /var more space.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Edit Auto Configured Disk Layout ==&lt;br /&gt;
At install time you can choose (A) for auto-layout. This creates a lot more partitions than other distributions. Often times it gives more space to /home than I'd like especially if the installation is going to be a server. &amp;lt;/br&amp;gt;&lt;br /&gt;
Fortunately you can (E) edit the auto-layout. When you press (E) you get dropped to a fdisk like command prompt. &amp;lt;/br&amp;gt;&lt;br /&gt;
Here are some helpful commands&amp;quot;&lt;br /&gt;
 ?     Help&lt;br /&gt;
 a     Add partition&lt;br /&gt;
 d     Delete partition&lt;br /&gt;
 p     Print partition table&lt;br /&gt;
 z     Delete all partitions&lt;br /&gt;
&lt;br /&gt;
The default partition layout looks like this:&lt;br /&gt;
 a: /&lt;br /&gt;
 b: swap&lt;br /&gt;
 c: reserved/unused&lt;br /&gt;
 d: /tmp&lt;br /&gt;
 e: /var&lt;br /&gt;
 f: /usr&lt;br /&gt;
 g: /usr/X11R6&lt;br /&gt;
 h: /usr/local&lt;br /&gt;
 i: /usr/src&lt;br /&gt;
 j: /usr/obj&lt;br /&gt;
 k: /home&lt;br /&gt;
&lt;br /&gt;
On servers that won't host many users I prefer to make /var the last partition so I can have it use 100% of the remaining space. You can do this by specifying '''100&amp;amp;''' for the partition size.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://dev.to/nabbisen/openbsd-manual-partitioning-at-installation-4cif&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenBSD]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=OpenBSD_Aliases</id>
		<title>OpenBSD Aliases</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=OpenBSD_Aliases"/>
				<updated>2022-01-23T11:56:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == I started using OpenBSD and found that some of the command aliases I'm used to using in other distributions weren't there. Naturally I went looking for ~/.kshrc...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
I started using OpenBSD and found that some of the command aliases I'm used to using in other distributions weren't there. Naturally I went looking for ~/.kshrc but was surprised to find it wasn't there. There was .cshrc but edits to that file weren't working (probably because the default shell in OpenBSD is ksh).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to add Aliases ==&lt;br /&gt;
Edit ~/.profile and add:&lt;br /&gt;
 export ENV=$HOME/.kshrc&lt;br /&gt;
&lt;br /&gt;
Now create ~/.kshrc&lt;br /&gt;
  alias     ll=&amp;quot;ls -lsah&amp;quot;&lt;br /&gt;
  alias     service=rcctl&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://unix.stackexchange.com/questions/476065/openbsd-how-does-one-set-an-alias&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:OpenBSD]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Category:OpenBSD</id>
		<title>Category:OpenBSD</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Category:OpenBSD"/>
				<updated>2022-01-23T11:50:14Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;https://www.openbsd.org/  Category:Tech_Notes&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://www.openbsd.org/&lt;br /&gt;
&lt;br /&gt;
[[Category:Tech_Notes]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Linux_Random_MAC</id>
		<title>Linux Random MAC</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Linux_Random_MAC"/>
				<updated>2021-12-06T11:00:27Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == Current versions of Linux distros are obtaining DHCP leases with Randomized MAC addresses which I find aggravating when trying to track down a host by MAC. It a...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Current versions of Linux distros are obtaining DHCP leases with Randomized MAC addresses which I find aggravating when trying to track down a host by MAC. It also blows up a DHCP reservation if you re-install an OS on the same Hardware/VM.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Solution ==&lt;br /&gt;
 echo &amp;quot;send dhcp-client-identifier = hardware;&amp;quot; &amp;gt;&amp;gt;/etc/dhcp/dhclient.conf&lt;br /&gt;
 rm /var/lib/dhcp/*&lt;br /&gt;
 systemctl restart networking&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://superuser.com/questions/1553094/force-to-use-mac-address-as-dhcp-client-id-on-debian-buster&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]][[Category:Ubuntu]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Timedatectl</id>
		<title>Timedatectl</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Timedatectl"/>
				<updated>2021-11-09T05:06:49Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == I always forget how to check NTP sync status on systems that use systemd.   == timedatectl == === Status ===  timedatectl  === Show last synced server ===  time...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
I always forget how to check NTP sync status on systems that use systemd.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== timedatectl ==&lt;br /&gt;
=== Status ===&lt;br /&gt;
 timedatectl&lt;br /&gt;
&lt;br /&gt;
=== Show last synced server ===&lt;br /&gt;
 timedatectl timesync-status&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://man7.org/linux/man-pages/man1/timedatectl.1.html&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Home_Assistant_Updates</id>
		<title>Home Assistant Updates</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Home_Assistant_Updates"/>
				<updated>2021-11-04T03:37:59Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == Home Assistant updates are released on the first Wednesday of every month.  You can update form the WebUI or from the CLI.   == WebUI == There is an 'Updater' e...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Home Assistant updates are released on the first Wednesday of every month.  You can update form the WebUI or from the CLI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WebUI ==&lt;br /&gt;
There is an 'Updater' entity that will let you know if an update is available.&lt;br /&gt;
Go to the Supervisor and there should be a card indicating the current version, and the latest version.&lt;br /&gt;
Click 'Upgrade', Ideally create a backup/snapshot and download it to a safe place prior to performing the upgrade.&lt;br /&gt;
You can download from the WebUI, or by accessing the 'backup/' directory (if you have SAMBA setup).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CLI ==&lt;br /&gt;
Updating to a specific version&lt;br /&gt;
 ha core update --version 2021.10.7&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
https://community.home-assistant.io/t/2021-11-icon-picker-device-links-and-entity-categories/352836/51&lt;br /&gt;
&lt;br /&gt;
Latest Release Notes&lt;br /&gt;
https://www.home-assistant.io/latest-release-notes/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Home Assistant]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Tasmota_Command_Line_Options</id>
		<title>Tasmota Command Line Options</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Tasmota_Command_Line_Options"/>
				<updated>2021-09-15T05:09:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Some useful command line options for devices running Tasmota firmware&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Console ==&lt;br /&gt;
Open the device's webpage, and click the 'Console' button. At the console enter your commands. Commands are automatically saved and should survive a reboot.&lt;br /&gt;
&lt;br /&gt;
== MQTT ==&lt;br /&gt;
https://github.com/arendst/Tasmota/wiki/Commands#mqtt&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Update Interval ===&lt;br /&gt;
To set the update interval / frequency at which the devices sends MQTT messages:&lt;br /&gt;
 TelePeriod 30&lt;br /&gt;
''0 = disable telemetry messages''&amp;lt;br&amp;gt;&lt;br /&gt;
''1 = reset telemetry period to firmware default (TELE_PERIOD)''&amp;lt;br&amp;gt;&lt;br /&gt;
''10..3600 = set telemetry period in seconds (default = 300)''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Temperature Calibration ==&lt;br /&gt;
 TempOffset 1.3&lt;br /&gt;
[https://tasmota.github.io/docs/Commands/#tempoffset TempOffset]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Humidity Calibration ==&lt;br /&gt;
 HumOffset 1.7&lt;br /&gt;
[https://tasmota.github.io/docs/Commands/#humidoffset HumOffset]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
 status 8&lt;br /&gt;
This is a handy way to debug an unknown device. Set as many GPIO pins to SwitchX and then run this command, then press+hold a button on the device and run status 8 again to see which one changed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== NTP / Time Server ==&lt;br /&gt;
 NtpServer1 &amp;lt;IP_Address&amp;gt;&lt;br /&gt;
 NtpServer2 &amp;lt;IP_Address&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== List existing NTP settings ===&lt;br /&gt;
 NtpServer &amp;lt;ENTER&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== SetOptions ==&lt;br /&gt;
https://github.com/arendst/Tasmota/wiki/commands#setoption-overview&lt;br /&gt;
&lt;br /&gt;
=== Temperature Units ===&lt;br /&gt;
To set temperature units to Fahrenheit:&lt;br /&gt;
 SetOption8 1&lt;br /&gt;
&lt;br /&gt;
=== Color Values ===&lt;br /&gt;
To set color units to R,G,B,W (0-255):&lt;br /&gt;
 SetOption17 1&lt;br /&gt;
Enables color status in decimals&lt;br /&gt;
&lt;br /&gt;
To set color red:&lt;br /&gt;
 color 255,0,0,0&lt;br /&gt;
To set color green:&lt;br /&gt;
 color 0,255,0,0&lt;br /&gt;
To set color blue:&lt;br /&gt;
 color 0,0,255,0&lt;br /&gt;
To set color white:&lt;br /&gt;
 color 0,0,0,255&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== AutoDiscovery ===&lt;br /&gt;
SetOption19 enables/disables MQTT Auto-Discovery&lt;br /&gt;
 SetOption19 0&lt;br /&gt;
This disables MQTT auto-discovery, but also enables auto-discovery in Home Assistant when using the Tasmota Integration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== WiFi Manager ==&lt;br /&gt;
If you have a device that is physically difficult to get to, or difficult to flash (bulbs), you may want to enable the WiFi Manager. This will cause the device to switch to AP mode when it can't find a wireless network to connect to. When in AP mode, you can connect to it from another wireless device like a laptop or smart phone and change the network config.&lt;br /&gt;
 WifiConfig 2&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== I2C Scan ==&lt;br /&gt;
This command causes Tasmota to scan the I2C bus and display found device ID's.&lt;br /&gt;
 i2cscan&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://github.com/arendst/Tasmota/wiki/commands &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Tasmota]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Bitwarden</id>
		<title>Bitwarden</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Bitwarden"/>
				<updated>2021-06-16T11:06:00Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
How to install Bitwarden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Install ===&lt;br /&gt;
&lt;br /&gt;
As Root:&lt;br /&gt;
Install Prerequisites&lt;br /&gt;
 apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common&lt;br /&gt;
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br /&gt;
 add-apt-repository &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&amp;quot;&lt;br /&gt;
 apt update&lt;br /&gt;
 apt install docker-ce docker-ce-cli containerd.io docker-compose&lt;br /&gt;
&lt;br /&gt;
Create the Bitwarden Service Account&lt;br /&gt;
 useradd -s /bin/bash -m -d /home/bitwarden bitwarden&lt;br /&gt;
 usermod -aG docker bitwarden&lt;br /&gt;
 passwd bitwarden (USE A REALLY LONG COMPLEX PASSWORD AND FORGET IT!) You'll never actually login as this user, instead login as a user with root privileges and: su bitwarden&lt;br /&gt;
 mkdir /opt/bitwarden&lt;br /&gt;
 chmod 700 /opt/bitwarden&lt;br /&gt;
 chown bitwarden.bitwarden /opt/bitwarden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bitwarden User:&lt;br /&gt;
 cd /opt/bitwarden&lt;br /&gt;
 wget -O bitwarden.sh https://go.btwrdn.co/bw-sh&lt;br /&gt;
 chmod +x bitwarden.sh&lt;br /&gt;
 ./bitwarden.sh install&lt;br /&gt;
&lt;br /&gt;
Copy ca.crt, certificate.crt, and private.key to:&lt;br /&gt;
 /home/bitwarden/bwdata/ssl/&amp;lt;FQDN&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
Start Bitwarden&lt;br /&gt;
 ~/bitwarden.sh start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Automatic Startup ===&lt;br /&gt;
Create /lib/systemd/system/bitwarden.service&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Bitwarden&lt;br /&gt;
 Requires=docker.service&lt;br /&gt;
 After=docker.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=oneshot&lt;br /&gt;
 User=bitwarden&lt;br /&gt;
 Group=bitwarden&lt;br /&gt;
 ExecStart=/opt/bitwarden/bitwarden.sh start&lt;br /&gt;
 ExecStop=/opt/bitwarden/bitwarden.sh stop&lt;br /&gt;
 RemainAfterExit=true&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
Enable the Bitwarden service&lt;br /&gt;
 systemctl enable bitwarden&lt;br /&gt;
&lt;br /&gt;
Start the service&lt;br /&gt;
 systemctl start bitwarden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://bitwarden.com/help/article/install-on-premise/#install-docker-and-docker-compose&lt;br /&gt;
&lt;br /&gt;
https://bitwarden.com/help/article/hosting-faqs/#q-how-do-i-add-bitwarden-to-system-boot&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Bitwarden</id>
		<title>Bitwarden</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Bitwarden"/>
				<updated>2021-06-16T11:05:08Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == How to install Bitwarden   === Install ===  As Root: Install Prerequisites  apt-get install apt-transport-https ca-certificates curl gnupg-agent software-proper...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
How to install Bitwarden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Install ===&lt;br /&gt;
&lt;br /&gt;
As Root:&lt;br /&gt;
Install Prerequisites&lt;br /&gt;
 apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common&lt;br /&gt;
 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -&lt;br /&gt;
 add-apt-repository &amp;quot;deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable&amp;quot;&lt;br /&gt;
 apt update&lt;br /&gt;
 apt install docker-ce docker-ce-cli containerd.io docker-compose&lt;br /&gt;
&lt;br /&gt;
Create the Bitwarden Service Account&lt;br /&gt;
 useradd -s /bin/bash -m -d /home/bitwarden bitwarden&lt;br /&gt;
 usermod -aG docker bitwarden&lt;br /&gt;
 passwd bitwarden (USE A REALLY LONG COMPLEX PASSWORD AND FORGET IT!) You'll never actually login as this user, instead login as a user with root privileges and: su bitwarden&lt;br /&gt;
 mkdir /opt/bitwarden&lt;br /&gt;
 chmod 700 /opt/bitwarden&lt;br /&gt;
 chown bitwarden.bitwarden /opt/bitwarden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Bitwarden User:&lt;br /&gt;
 cd /opt/bitwarden&lt;br /&gt;
 wget -O bitwarden.sh https://go.btwrdn.co/bw-sh&lt;br /&gt;
 chmod +x bitwarden.sh&lt;br /&gt;
 ./bitwarden.sh install&lt;br /&gt;
&lt;br /&gt;
Copy ca.crt, certificate.crt, and private.key to:&lt;br /&gt;
 /home/bitwarden/bwdata/ssl/&amp;lt;FQDN&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
Start Bitwarden&lt;br /&gt;
 ~/bitwarden.sh start&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Automatic Startup ===&lt;br /&gt;
Create /lib/systemd/system/bitwarden.service&lt;br /&gt;
 [Unit]&lt;br /&gt;
 Description=Bitwarden&lt;br /&gt;
 Requires=docker.service&lt;br /&gt;
 After=docker.service&lt;br /&gt;
 &lt;br /&gt;
 [Service]&lt;br /&gt;
 Type=oneshot&lt;br /&gt;
 User=bitwarden&lt;br /&gt;
 Group=bitwarden&lt;br /&gt;
 ExecStart=/opt/bitwarden/bitwarden.sh start&lt;br /&gt;
 ExecStop=/opt/bitwarden/bitwarden.sh stop&lt;br /&gt;
 RemainAfterExit=true&lt;br /&gt;
 &lt;br /&gt;
 [Install]&lt;br /&gt;
 WantedBy=multi-user.target&lt;br /&gt;
&lt;br /&gt;
Enable the Bitwarden service&lt;br /&gt;
 systemctl enable bitwarden&lt;br /&gt;
&lt;br /&gt;
Start the service&lt;br /&gt;
 systemctl start bitwarden&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://bitwarden.com/help/article/hosting-faqs/#q-how-do-i-add-bitwarden-to-system-boot&lt;br /&gt;
&lt;br /&gt;
[[Category:Linux]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Ubuntu_fd0_error</id>
		<title>Ubuntu fd0 error</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Ubuntu_fd0_error"/>
				<updated>2021-06-16T04:56:26Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == If you install Ubuntu as an ESXi VM and remove the Floppy virtual hardware Ubuntu will boot slower and throw this error:  blk_update_request: I/O error, dev fd0...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
If you install Ubuntu as an ESXi VM and remove the Floppy virtual hardware Ubuntu will boot slower and throw this error:&lt;br /&gt;
 blk_update_request: I/O error, dev fd0, sector 0 op 0x0:(READ) flags 0x0 phys_seg 1 prio class 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to Fix ==&lt;br /&gt;
Login to your Ubuntu VM and run the following:&lt;br /&gt;
 sudo rmmod floppy&lt;br /&gt;
 echo &amp;quot;blacklist floppy&amp;quot; | sudo tee /etc/modprobe.d/blacklist-floppy.conf&lt;br /&gt;
 sudo dpkg-reconfigure initramfs-tools&lt;br /&gt;
Reboot. &lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://askubuntu.com/questions/719058/blk-update-request-i-o-error-dev-fd0-sector-0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Ubuntu]][[Category:ESXi]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot</id>
		<title>Raspberry Pi Change IP without Reboot</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot"/>
				<updated>2021-06-15T08:45:12Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Sometimes you want to change your Raspberry Pi's IP without having to reboot, here's how!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP ADDR ==&lt;br /&gt;
So in newer versions of Raspbian and RaspberryPi OS (Jessie and above) when you make changes to:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
The changes don't take effect upon service restart.&lt;br /&gt;
 sudo service dhcpcd restart&lt;br /&gt;
&lt;br /&gt;
Here's what you need to do: &amp;lt;br&amp;gt;&lt;br /&gt;
Edit:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
Run:&lt;br /&gt;
 sudo service dhcpcd stop&lt;br /&gt;
 sudo ip addr flush dev eth0&lt;br /&gt;
 sudo service dhcpcd start&lt;br /&gt;
&lt;br /&gt;
DONE!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://raspberrypi.stackexchange.com/questions/76655/change-static-ip-without-rebooting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Raspberry_Pi]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot</id>
		<title>Raspberry Pi Change IP without Reboot</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot"/>
				<updated>2021-06-15T08:42:12Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Sometimes you want to change your Raspberry Pi's IP without having to reboot, here's how!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP ADDR ==&lt;br /&gt;
So in newer versions of Raspbian and RaspberryPi OS (Jessie and above) when you make changes to:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
The changes don't take effect upon service restart.&lt;br /&gt;
 sudo service dhcpcd restart&lt;br /&gt;
&lt;br /&gt;
Here's what you need to do: &amp;lt;br&amp;gt;&lt;br /&gt;
Edit:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
Run:&lt;br /&gt;
 sudo ip addr flush dev eth0&lt;br /&gt;
 sudo service dhcpcd restart&lt;br /&gt;
&lt;br /&gt;
DONE!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://raspberrypi.stackexchange.com/questions/76655/change-static-ip-without-rebooting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Raspberry_Pi]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot</id>
		<title>Raspberry Pi Change IP without Reboot</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot"/>
				<updated>2021-06-15T08:41:58Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Sometimes you want to change your Raspberry Pi's IP without having to reboot, here's how!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP ADDR ==&lt;br /&gt;
So in newer versions of Raspbian and RaspberryPi OS (Jessie and above) when you make changes to:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
The changes don't take effect upon service restart.&lt;br /&gt;
 sudo service dhcpcd restart&lt;br /&gt;
&lt;br /&gt;
Here's what you need to do:&lt;br /&gt;
Edit:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
Run:&lt;br /&gt;
 sudo ip addr flush dev eth0&lt;br /&gt;
 sudo service dhcpcd restart&lt;br /&gt;
&lt;br /&gt;
DONE!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://raspberrypi.stackexchange.com/questions/76655/change-static-ip-without-rebooting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Raspberry_Pi]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot</id>
		<title>Raspberry Pi Change IP without Reboot</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Raspberry_Pi_Change_IP_without_Reboot"/>
				<updated>2021-06-15T08:41:33Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: Created page with &amp;quot;== Overview == Sometimes you want to change your Raspberry Pi's IP without having to reboot, here's how!   == IP ADDR == So in newer versions of Raspbian and RaspberryPi OS (J...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Sometimes you want to change your Raspberry Pi's IP without having to reboot, here's how!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IP ADDR ==&lt;br /&gt;
So in newer versions of Raspbian and RaspberryPi OS (Jessie and above) when you make changes to:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
The changes don't take effect upon service restart.&lt;br /&gt;
 sudo service dhcpcd restart&lt;br /&gt;
&lt;br /&gt;
Here's what you need to do:&lt;br /&gt;
Edit:&lt;br /&gt;
 /etc/dhcpcd.conf&lt;br /&gt;
Run:&lt;br /&gt;
 sudo ip addr flush dev eth0&lt;br /&gt;
Then:&lt;br /&gt;
 sudo service dhcpcd restart&lt;br /&gt;
&lt;br /&gt;
DONE!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://raspberrypi.stackexchange.com/questions/76655/change-static-ip-without-rebooting&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Raspberry_Pi]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Changing_the_NTP_Server_in_HassOS</id>
		<title>Changing the NTP Server in HassOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Changing_the_NTP_Server_in_HassOS"/>
				<updated>2021-06-01T07:30:38Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: /* Background Info */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
Its common practice to create an Isolated VLAN for Home Automation gear and IoT devices. Doing so will make your environment inherently more secure, but it also presents challenges. In my case my Home Assistant server wasn't keeping accurate time. This article will briefly demonstrate how to change the NTP server Home Assistant connects to for time syncronizations.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Background Info ==&lt;br /&gt;
HassOS runs on an Overlay File System, which means that edits to files from the command line won't survive a reboot (assuming you can even make changes, often times you'll get an error stating that its a Read-Only File System). So how do you make changes? &amp;lt;br&amp;gt;&lt;br /&gt;
First: Read [https://github.com/home-assistant/operating-system/blob/dev/Documentation/configuration.md]&lt;br /&gt;
I had done this, but had challenges getting the USB stick to passthrough to my HassOS VM on Boot. So I went the alternative route by creating a '''CONFIG''' folder in the boot partition, BUT WHERE IS THE BOOT PARTITION!!!&lt;br /&gt;
Open the console of your HassOS and login as ''root''. Then at the command line type: ''logon''&lt;br /&gt;
 ha &amp;gt; login&lt;br /&gt;
 # mkdir -p /mnt/boot/CONFIG&lt;br /&gt;
 # echo -e &amp;quot;[Time]\nNTP=10.20.30.40\nFallbackNTP=10.20.30.41&amp;quot; &amp;gt; /mnt/boot/CONFIG/timesyncd.conf&lt;br /&gt;
''Replace '''10.20.30.40''' and '''10.20.30.41''' with your desired NTP servers.'' &amp;lt;br&amp;gt;&lt;br /&gt;
Alternatively you can:&lt;br /&gt;
 # vi /mnt/boot/CONFIG/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
 [Time]&lt;br /&gt;
 NTP=10.20.30.40&lt;br /&gt;
 FallbackNTP=10.20.30.41&lt;br /&gt;
&lt;br /&gt;
Once /mnt/boot/CONFIG/timesyncd.conf has been created you can reboot the Host&lt;br /&gt;
 # reboot&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
You can confirm the changes by logging in again and running:&lt;br /&gt;
 # cat /etc/systemd/timesyncd.conf&lt;br /&gt;
It should reflect the changes you made above.&amp;lt;br&amp;gt;&lt;br /&gt;
I also noticed that the /mnt/boot/CONFIG folder is removed after reboot. This is normal, and your changes should persist future reboots.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://github.com/home-assistant/operating-system/blob/dev/Documentation/configuration.md&lt;br /&gt;
&lt;br /&gt;
https://github.com/home-assistant/supervisor/issues/957#issuecomment-528948200&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Home Assistant]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Dynamic_Firewall_Aliases_in_OPNSense</id>
		<title>Dynamic Firewall Aliases in OPNSense</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Dynamic_Firewall_Aliases_in_OPNSense"/>
				<updated>2021-05-29T08:39:34Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
In an ideal world you would create firewall rules that target specific source IP addresses. Unfortunately many cloud services utilize multiple large ranges of IPs that change. Which make Static Aliases a pain to manage.  This article will show you how to create Dynamic IP Aliases in OPNSense.&lt;br /&gt;
&lt;br /&gt;
== Aliases ==&lt;br /&gt;
Aliases are very power. In addition to being able to assign friendly names to IPs, Networks, MAC Address, URLs, Domains, etc. You can also nest Aliases, and then reference the alias in your Firewall Rules. Here we will focus on 'URL Tables' which allow you to create an Alias of IPs and/or networks from a URL at a given interval. Making the Alias dynamic, and resilient to changes.&lt;br /&gt;
&lt;br /&gt;
=== URL Tables ===&lt;br /&gt;
Firewall -&amp;gt; Aliases &amp;lt;br&amp;gt;&lt;br /&gt;
Create (+ Icon) &amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Enabled            || [X]&lt;br /&gt;
|-&lt;br /&gt;
| Name               || CloudFlare_IPv4&lt;br /&gt;
|-&lt;br /&gt;
| Type               || Host(s)&lt;br /&gt;
|-&lt;br /&gt;
| Content            || https://www.cloudflare.com/ips-v4&lt;br /&gt;
|-&lt;br /&gt;
| Statistics               || [   ]&lt;br /&gt;
|-&lt;br /&gt;
| Description               || CloudFlare IPv4 Address List&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Enabled            || [X]&lt;br /&gt;
|-&lt;br /&gt;
| Name               || CloudFlare_IPv6&lt;br /&gt;
|-&lt;br /&gt;
| Type               || Host(s)&lt;br /&gt;
|-&lt;br /&gt;
| Content            || https://www.cloudflare.com/ips-v6&lt;br /&gt;
|-&lt;br /&gt;
| Statistics               || [   ]&lt;br /&gt;
|-&lt;br /&gt;
| Description               || CloudFlare IPv6 Address List&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Enabled            || [X]&lt;br /&gt;
|-&lt;br /&gt;
| Name               || CloudFlare_IPs&lt;br /&gt;
|-&lt;br /&gt;
| Type               || Network(s)&lt;br /&gt;
|-&lt;br /&gt;
| Content            || CloudFlare_IPv4 CloudFlare_IPv6&lt;br /&gt;
|-&lt;br /&gt;
| Statistics               || [   ]&lt;br /&gt;
|-&lt;br /&gt;
| Description               || CloudFlare IP Ranges&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The last Alias is a nested Network Alias that uses both URL Tables. Now you can reference 'CloudFlare_IPs' in your source or destination rules.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
Make sure the URL Table you reference is from a source you trust.  If the URL is DNS hijacked or content modified by the attacker, they could substitute their own IP address into your firewall rules. Its highly advised to use a URL that uses HTTPS so you can verify the identity of the server and make Man-in-the-Middle attacks more difficult.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://docs.opnsense.org/manual/how-tos/edrop.html&lt;br /&gt;
&lt;br /&gt;
https://www.cloudflare.com/ips/&lt;br /&gt;
&lt;br /&gt;
[[Category:OPNSense]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	<entry>
		<id>//wiki.ledhed.net/index.php?title=Dynamic_Firewall_Aliases_in_OPNSense</id>
		<title>Dynamic Firewall Aliases in OPNSense</title>
		<link rel="alternate" type="text/html" href="https://wiki.ledhed.net/index.php?title=Dynamic_Firewall_Aliases_in_OPNSense"/>
				<updated>2021-05-29T08:30:25Z</updated>
		
		<summary type="html">&lt;p&gt;Ledhed: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
In an ideal world you would create firewall rules that target specific source IP addresses. Unfortunately many cloud services utilize multiple large ranges of IPs that change. Which make Static Aliases a pain to manage.  This article will show you how to create Dynamic IP Aliases in OPNSense.&lt;br /&gt;
&lt;br /&gt;
== Aliases ==&lt;br /&gt;
Aliases are very power. In addition to being able to assign friendly names to IPs, Networks, MAC Address, URLs, Domains, etc. You can also nest Aliases, and then reference the alias in your Firewall Rules. Here we will focus on 'URL Tables' which allow you to create an Alias of IPs and/or networks from a URL at a given interval. Making the Alias dynamic, and resilient to changes.&lt;br /&gt;
&lt;br /&gt;
=== URL Tables ===&lt;br /&gt;
Firewall -&amp;gt; Aliases&lt;br /&gt;
Create (+ Icon)&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Enabled            || [X]&lt;br /&gt;
|-&lt;br /&gt;
| Name               || CloudFlare_IPv4&lt;br /&gt;
|-&lt;br /&gt;
| Type               || Host(s)&lt;br /&gt;
|-&lt;br /&gt;
| Content            || https://www.cloudflare.com/ips-v4&lt;br /&gt;
|-&lt;br /&gt;
| Statistics               || [   ]&lt;br /&gt;
|-&lt;br /&gt;
| Description               || CloudFlare IPv4 Address List&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Enabled            || [X]&lt;br /&gt;
|-&lt;br /&gt;
| Name               || CloudFlare_IPv6&lt;br /&gt;
|-&lt;br /&gt;
| Type               || Host(s)&lt;br /&gt;
|-&lt;br /&gt;
| Content            || https://www.cloudflare.com/ips-v6&lt;br /&gt;
|-&lt;br /&gt;
| Statistics               || [   ]&lt;br /&gt;
|-&lt;br /&gt;
| Description               || CloudFlare IPv6 Address List&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Enabled            || [X]&lt;br /&gt;
|-&lt;br /&gt;
| Name               || CloudFlare_IPs&lt;br /&gt;
|-&lt;br /&gt;
| Type               || Network(s)&lt;br /&gt;
|-&lt;br /&gt;
| Content            || CloudFlare_IPv4 CloudFlare_IPv6&lt;br /&gt;
|-&lt;br /&gt;
| Statistics               || [   ]&lt;br /&gt;
|-&lt;br /&gt;
| Description               || CloudFlare IP Ranges&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The last Alias is a nested Network Alias that uses both URL Tables. Now you can reference 'CloudFlare_IPs' in your source or destination rules.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
Make sure the URL Table you reference is from a source you trust.  If the URL is DNS hijacked or content modified by the attacker, they could substitute their own IP address into your firewall rules. Its highly advised to use a URL that uses HTTPS so you can verify the identity of the server and make Man-in-the-Middle attacks more difficult.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
https://docs.opnsense.org/manual/how-tos/edrop.html&lt;br /&gt;
&lt;br /&gt;
https://www.cloudflare.com/ips/&lt;br /&gt;
&lt;br /&gt;
[[Category:OPNSense]]&lt;/div&gt;</summary>
		<author><name>Ledhed</name></author>	</entry>

	</feed>