<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Scotticles</title>
    <description>The latest articles on DEV Community by Scotticles (@scotticles).</description>
    <link>https://dev.to/scotticles</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F536353%2Fafea76e3-d984-4445-b844-cf9a629b563f.png</url>
      <title>DEV Community: Scotticles</title>
      <link>https://dev.to/scotticles</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/scotticles"/>
    <language>en</language>
    <item>
      <title>Jenkins for running scripts!</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Mon, 09 Jan 2023 19:09:37 +0000</pubDate>
      <link>https://dev.to/scotticles/jenkins-for-running-scripts-kg1</link>
      <guid>https://dev.to/scotticles/jenkins-for-running-scripts-kg1</guid>
      <description>&lt;p&gt;I have over 30 scripts that are used to pull data and push data between different services. Its critical to know when they fail. Sure you could do this with cron but then I looked around and saw that Jenkins could run scripts and have a console output log, and email me on fails.&lt;/p&gt;

&lt;p&gt;After you have set up jenkins and set up the email settings.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a freestyle project

&lt;ol&gt;
&lt;li&gt;Build Triggers -&amp;gt; set your time so it runs whenever you want.&lt;/li&gt;
&lt;li&gt;Build Steps -&amp;gt; Add Build Step -&amp;gt; Execute Shell
&lt;code&gt;perl &amp;lt;my/path/to/script.pl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Post Build -&amp;gt; Email Notification and make sure Send Email for every unstable build is checked.&lt;/li&gt;
&lt;/ol&gt;


&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This will get your scripts running and have email alerts on failed scripts. Its super helpful and its nice to have a decent web ui to automate and organize all these jobs I have to run.&lt;/p&gt;




&lt;p&gt;If anyone has a better system / suggestion please let me know, I like what I have but I have been looking for something not so heavy on Java.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>scripting</category>
      <category>jenkins</category>
      <category>perl</category>
    </item>
    <item>
      <title>Jumphost - Pull Switch Configs with Perl</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Fri, 09 Dec 2022 21:20:17 +0000</pubDate>
      <link>https://dev.to/scotticles/jumphost-pull-switch-configs-with-perl-5b7c</link>
      <guid>https://dev.to/scotticles/jumphost-pull-switch-configs-with-perl-5b7c</guid>
      <description>&lt;p&gt;I have a few jumphosts that let I use to ssh into and then access network switches. I used to use rancid and have like 6 rancid instanes...no more. I wrote my own switch backup script. I wont go into the details of my script BUT i thought this ssh trick was worth a look with Perl.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/pod/Net::OpenSSH" rel="noopener noreferrer"&gt;Net::OpenSSH&lt;/a&gt; &amp;lt;--Awesome&lt;/p&gt;

&lt;p&gt;This snippet of code does a ping check using a Jump Host. This is fairly easy to do using just ssh without Perl. But if I wanted to use Expect, I need Net::OpenSSH instance to pass into it. &lt;/p&gt;

&lt;p&gt;The Modules I use for Expect are: &lt;br&gt;
&lt;a href="https://metacpan.org/pod/Mnet::Expect::Cli" rel="noopener noreferrer"&gt;Mnet::Expect::Cli&lt;/a&gt;&lt;br&gt;
&lt;a href="https://metacpan.org/pod/Mnet::Expect::Cli::Ios" rel="noopener noreferrer"&gt;Mnet::Expect::Cli::Ios&lt;/a&gt;&lt;br&gt;
I actually wrap these in a &lt;a href="https://metacpan.org/pod/MCE::Loop" rel="noopener noreferrer"&gt;MCE::Loop&lt;/a&gt; to do 10 or so switches at a time. MCE::Loop is always my go to for my loops that need to be sped up. Im pulling 30 switches in under a minute.&lt;/p&gt;

&lt;p&gt;I am going to break up this snippet and explain whats going on.&lt;/p&gt;

&lt;p&gt;Identify your two ips.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Net::&lt;/span&gt;&lt;span class="nv"&gt;OpenSSH&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Modern::&lt;/span&gt;&lt;span class="nv"&gt;Perl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;192.168.1.2&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt; &lt;span class="c1"&gt;#switch ip&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$proxy_ip&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;10.90.3.2&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt; &lt;span class="c1"&gt;#jump host ip&lt;/span&gt;

&lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="nf"&gt;pingCheck&lt;/span&gt; &lt;span class="p"&gt;( $ip, $proxy_ip) {&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example uses a ssh key pair, you can change key_path for password and put the ssh password in.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;%opts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$proxy_ip&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myuser&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;key_path&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/home/myuser/.ssh/id_rsa&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$ssh_proxy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Net::&lt;/span&gt;&lt;span class="nv"&gt;OpenSSH&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;%opts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nv"&gt;$ssh_proxy&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;error&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;die&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Couldn't establish SSH connection: &lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$ssh_proxy&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now I run a ping command on the jump host.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;    &lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;@ping&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$ssh_proxy&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;capture&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;ping -c 1 &lt;/span&gt;&lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;foreach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;@ping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;m/^1\spackets transmitted/&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="vg"&gt;$_&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;m/\s0\% packet loss/&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;elsif&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;$_&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;m/^1\spackets transmitted/&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;pingCheck&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YES&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If i needed to access the $ip using a different port instead of ping, lets say it was telnet.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ssh_proxy&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;system&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s"&gt;ssh_opts&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;['&lt;/span&gt;&lt;span class="s1"&gt;-O&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;forward&lt;/span&gt;&lt;span class="p"&gt;','&lt;/span&gt;&lt;span class="s1"&gt;-L127.0.0.1:8000:&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;$ip&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;:23&lt;/span&gt;&lt;span class="p"&gt;']});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I can then do &lt;code&gt;telnet localhost 8000&lt;/code&gt; and it will connect to the $ip.&lt;/p&gt;

&lt;p&gt;This might be confusing for some, its technical and geared for network engineers that can do programming. If you are interested in how i pull switches, you can ask and i'll hint at how to put something together.&lt;/p&gt;

</description>
      <category>api</category>
    </item>
    <item>
      <title>Snipe-IT + Perl</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Mon, 05 Dec 2022 16:57:41 +0000</pubDate>
      <link>https://dev.to/scotticles/snipeit-perl-47mi</link>
      <guid>https://dev.to/scotticles/snipeit-perl-47mi</guid>
      <description>&lt;p&gt;I have a new module that is a work in progress, added to as needed. It's on github so you can add more api calls to it and submit a pull request to me. Its co-developed by me and my co-worker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://metacpan.org/pod/WWW::SnipeIT"&gt;https://metacpan.org/pod/WWW::SnipeIT&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  What is &lt;a href="https://snipeitapp.com/"&gt;Snipe-IT&lt;/a&gt;?
&lt;/h3&gt;

&lt;p&gt;Snipe-IT is an open source asset management, to enable IT departments to track who has which laptop, when it was purchased, which software licenses and accessories are available, and so on. It can be self-hosted making it a great option for system administrators.&lt;/p&gt;

&lt;h3&gt;
  
  
  Purpose
&lt;/h3&gt;

&lt;p&gt;We needed a way to interact with Snipe-IT from Perl for a Koha Plugin he is making.&lt;/p&gt;

&lt;p&gt;At first, I set it up to use Moo for the object class but then with Perl Devs working towards Corinna with Object::Pad, I moved it to Object::Pad, the migration was super easy, but I am not using a ton of its features.&lt;/p&gt;

&lt;h3&gt;
  
  
  How to use
&lt;/h3&gt;

&lt;p&gt;Firstly, you need a access token and the url to the Snipe-IT instance, if its https that would be preferred. This example its http.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;WWW::&lt;/span&gt;&lt;span class="nv"&gt;SnipeIT&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$snipeIT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;SnipeIT&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="s"&gt;endpoint&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://&amp;lt;mysnipeip&amp;gt;/api/v1/&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="s"&gt;accessToken&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mylongapikey&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is a basic example of pulling information on a asset tag.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://snipe-it.readme.io/reference/api-overview"&gt;https://snipe-it.readme.io/reference/api-overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When creating this i tried to follow their structure with $snipe-&amp;gt;{''} to make it easy to follow their guide.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$snipe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$snipeIT&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;snipe&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHardwareIDByAssetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="nv"&gt;$result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And more examples on how to use it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$updateBody&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{"name":"Fruit Computer","notes":"Apple Computer"}&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$searchBody&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;{"name":"name","element":"text","field_values":"3Com"}&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$assetTag&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$hardwareID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;321&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Scott&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fieldName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;"";&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$fieldValue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3Com&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$assetName&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;3Com&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$searchString&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ChromeBook&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$categoryID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$serialNumber&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;abc1234&lt;/span&gt;&lt;span class="p"&gt;";&lt;/span&gt;

&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHardwareIDByAssetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$assetTag&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHardwareByAssetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$assetTag&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getAssetTagByHardwareID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hardwareID&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;updateAssetByHardwareID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hardwareID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$updateBody&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;updateAssetByAssetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$assetTag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$updateBody&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHardwareByCustomField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$fieldName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHardwareBySerialNumber&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$serialNumber&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;


&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHistoryByHardwareID&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$hardwareID&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHistoryByAssetTag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$assetTag&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;searchHardware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$searchString&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nb"&gt;warn&lt;/span&gt; &lt;span class="nv"&gt;Dumper&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$snipe&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;{'&lt;/span&gt;&lt;span class="s1"&gt;hardware&lt;/span&gt;&lt;span class="p"&gt;'}&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;getHardwareByCategory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$categoryID&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Its not fully featured but its a good start.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>snipeit</category>
    </item>
    <item>
      <title>BookstackApp css fixes</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Fri, 29 Apr 2022 20:25:41 +0000</pubDate>
      <link>https://dev.to/scotticles/bookstackapp-css-fixes-2b76</link>
      <guid>https://dev.to/scotticles/bookstackapp-css-fixes-2b76</guid>
      <description>&lt;p&gt;Frustrated with their dark theme, and dark reader wasnt doing it. I moved over some of my dokuwiki theme i was using over and moved some other settings around like the opacity hovers were annoying me, the banner on top was annoying, the small content area was annoying with the two side bars way out there (large screen), this seems tweaks those things. Enjoy.&lt;/p&gt;

&lt;p&gt;`&lt;br&gt;
&amp;lt;br&amp;gt;
html.dark-mode {&amp;lt;br&amp;gt;
    background: #000 !important;&amp;lt;br&amp;gt;
    color: #eee;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
html.dark-mode body {&amp;lt;br&amp;gt;
    color: #eee;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
html.dark-mode .card {&amp;lt;br&amp;gt;
    border: 1px solid #444;&amp;lt;br&amp;gt;
    box-shadow: 0 0 0.5em #ddd;&amp;lt;br&amp;gt;
    border-radius: 2px;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
html.dark-mode header {&amp;lt;br&amp;gt;
    filter: none !important;&amp;lt;br&amp;gt;
    background-color: #000 !important;&amp;lt;br&amp;gt;
    border-bottom: 1px solid #f90;&amp;lt;br&amp;gt;
}&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;html.dark-mode h1,&amp;lt;br&amp;gt;
html.dark-mode h2,&amp;lt;br&amp;gt;
html.dark-mode h3,&amp;lt;br&amp;gt;
html.dark-mode h4,&amp;lt;br&amp;gt;
html.dark-mode h5,&amp;lt;br&amp;gt;
html.dark-mode h6 {&amp;lt;br&amp;gt;
    color: #eee;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
.breadcrumbs {&amp;lt;br&amp;gt;
    opacity: 1;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
&lt;a class="mentioned-user" href="https://dev.to/media"&gt;@media&lt;/a&gt; screen and (min-width: 1000px) html.dark-mode .tri-layout-left-contents&amp;amp;gt;&amp;lt;em&amp;gt;, html.dark-mode .tri-layout-right-contents&amp;amp;gt;&amp;lt;/em&amp;gt; {&amp;lt;br&amp;gt;
    opacity: 1;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
html.dark-mode .tri-layout-left-contents &amp;amp;gt; *,&amp;lt;br&amp;gt;
html.dark-mode .tri-layout-right-contents &amp;amp;gt; * {&amp;lt;br&amp;gt;
    opacity: 1;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
.cm-s-darcula.CodeMirror {&amp;lt;br&amp;gt;
    background: #000;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
.table &amp;amp;gt; table &amp;amp;gt; tbody {&amp;lt;br&amp;gt;
    background-color: #000;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
.page-content {&amp;lt;br&amp;gt;
    max-width: 100%;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
.tri-layout-middle-contents {&amp;lt;br&amp;gt;
    max-width: 100%;&amp;lt;br&amp;gt;
}&amp;lt;br&amp;gt;
.tri-layout-container {&amp;lt;br&amp;gt;
    max-width: 80%;&amp;lt;br&amp;gt;
    margin: 0 auto;&amp;lt;br&amp;gt;
}&amp;lt;/p&amp;gt;

&amp;lt;p&amp;gt;`&lt;/p&gt;

</description>
      <category>bookstackapp</category>
    </item>
    <item>
      <title>Zabbix Proxy and Low Disk Space</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Fri, 29 Apr 2022 15:44:17 +0000</pubDate>
      <link>https://dev.to/scotticles/zabbix-proxy-and-low-disk-space-1ne5</link>
      <guid>https://dev.to/scotticles/zabbix-proxy-and-low-disk-space-1ne5</guid>
      <description>&lt;p&gt;I recently had one of my proxy servers run at 99% disk space. The proxy server is using mysql and because its proxy its pulling metrics -&amp;gt; the metrics get sucked off from the main server and then those records on the proxy get removed. My mysql had binary logs turned on... so the .bin files found in &lt;code&gt;/var/lib/mysql&lt;/code&gt; was filling up all the space, so I edited the &lt;code&gt;/etc/mysql/mysql.conf.d/mysqld.conf&lt;/code&gt; file to remove bin logging, it is not needed for this database and then purged the old bin files.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;PURGE BINARY LOGS BEFORE '2022-04-29 00:00:00';&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I am now only using 22% of my disk space. Which is mostly the OS. :D&lt;/p&gt;

</description>
      <category>zabbix</category>
    </item>
    <item>
      <title>Organizing Mojolicious Routes</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Fri, 08 Apr 2022 16:07:20 +0000</pubDate>
      <link>https://dev.to/scotticles/organizing-mojolicious-routes-2pic</link>
      <guid>https://dev.to/scotticles/organizing-mojolicious-routes-2pic</guid>
      <description>&lt;p&gt;&lt;a href="https://mojolicious.org/"&gt;Mojolicious&lt;/a&gt; is an awesome web framework and I have been developing an app in it for 2 years now. &lt;/p&gt;

&lt;p&gt;The basic structure is (taken off the docs - &lt;a href="https://docs.mojolicious.org/Mojolicious/Guides/Growing"&gt;Growing&lt;/a&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myapp                      # Application directory
|- script                  # Script directory
|  +- my_app               # Application script
|- lib                     # Library directory
|  |- MyApp.pm             # Application class
|  +- MyApp                # Application namespace
|     +- Controller        # Controller namespace
|        +- Example.pm     # Controller class
|- my_app.yml              # Configuration file
|- t                       # Test directory
|  +- basic.t              # Random test
|- log                     # Log directory
|  +- development.log      # Development mode log file
|- public                  # Static file directory (served automatically)
|  +- index.html           # Static HTML file
+- templates               # Template directory
   |- layouts              # Template directory for layouts
   |  +- default.html.ep   # Layout template
   +- example              # Template directory for "Example" controller
      +- welcome.html.ep   # Template for "welcome" action
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the MyApp.pm is the core file that defines routes, app settings and plugins. As I was growing my app, that pm file became very large (200+ lines) with routes and I needed to do something. I remember reading from the devs that its best to use plugins for routes when your project becomes big.&lt;/p&gt;

&lt;p&gt;I made a folder and a file under lib called Route &amp;gt; user.pm&lt;/p&gt;

&lt;p&gt;I generally follow this pattern so if my url is /user/lookup&lt;br&gt;
i'll have a route file called Route/user.pm that will handle all my /user routes.&lt;/p&gt;

&lt;p&gt;Here is what the plugin looks like&lt;/p&gt;

&lt;p&gt;under lib/MyApp/route/user.pm&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package MyApp::Route::User;
use Mojo::Base 'Mojolicious::Plugin', -signatures;

sub register ($self, $app, $r) {
  $r-&amp;gt;get('/user/lookup')-&amp;gt;to('user#lookup');
}

1;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to add it into the MyApp.pm under lib.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my $r = $self-&amp;gt;routes; #this should be somewhere already in the pm file.
$self-&amp;gt;plugin('MyApp::Route::User', $r);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This removes tons of lines in the MyApp.pm and makes it easy to find the routes when needed to be worked on.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>mojolicious</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Fixing EFI on linux</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Wed, 27 Jan 2021 20:14:41 +0000</pubDate>
      <link>https://dev.to/scotticles/fixing-efi-on-linux-878</link>
      <guid>https://dev.to/scotticles/fixing-efi-on-linux-878</guid>
      <description>&lt;p&gt;I use kde neon and dual boot into windows every now and then, well my laptop receives firmware updates and I decided to get those updated on windows. I haven't had good luck on the linux fwupdate... Well it hosed my efi, windows boot still worked but my linux side was no longer booting. Thanks windows updates for forcing me to do them.&lt;/p&gt;

&lt;p&gt;I scoured the internet for a solution. I tried boot-repair, no go. I downloaded KDE Neon live iso, put it on a usb and then finally found a solution.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://askubuntu.com/questions/778117/installation-fails-on-grub-read-only-efi-partition"&gt;source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I mounted the necessary folders and then chrooted into the mnt. I noticed my /boot was readonly..thats odd., unmounted it and ran&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo dosfsck -t -a -w /dev/sda1&lt;/code&gt; &amp;lt;--change /dev/sdx to your /boot partition disk&lt;/p&gt;

&lt;p&gt;Then do this:&lt;/p&gt;

&lt;p&gt;/dev/sda8 in this example is the / partition&lt;br&gt;
/dev/sda1 in this example is the efi partition&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo mount /dev/sda8 /mnt
sudo mount /dev/sda1 /mnt/boot/efi
for i in /dev /dev/pts /proc /sys /run; do sudo mount -B $i /mnt$i; done
sudo chroot /mnt
grub-install /dev/sda
update-grub  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This might help someone, it's definitely a bookmark for me.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>dynamic dns and ufw</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Wed, 16 Dec 2020 22:21:53 +0000</pubDate>
      <link>https://dev.to/scotticles/dynamic-dns-and-ufw-41jo</link>
      <guid>https://dev.to/scotticles/dynamic-dns-and-ufw-41jo</guid>
      <description>&lt;p&gt;Github Gist Link: &lt;a href="https://gist.github.com/scotticles/143d67588924841deec873c26354044e"&gt;Gist&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Own a vps? I scored over black friday and now have a ton of them for some projects. I ended up setting up wireguard on all of them and linking them all together. I have a raspberry pi in my home for my private container registry and hooked it up to the wireguard network.&lt;/p&gt;

&lt;p&gt;I did not want to open up my wireguard port and any ssh port to the public.&lt;/p&gt;

&lt;p&gt;I found a similar script like this on a google search, had to modify it for ufw to work and to do wireguard and ssh. My home router does a dynamic dns update and keeps that updated. If your router cannot do that, you can setup a pi or a script to run off your computer so when it boots up it will try to keep it up to date. &lt;/p&gt;

&lt;p&gt;UFW cannot accept a dns name, unfortunately. This script will require the &lt;code&gt;host&lt;/code&gt; command, if your vps does not have that command, it is usually in bind-utils on ubuntu or dns-utils. Add in your hostname and ssh port, wireguard port. Run it manually first to verify it works and then cron it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x mydnsscript.sh
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./mydnsscript.sh
&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see your home network ip allowed for ssh and wireguard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is the script:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/bash&lt;/span&gt;

&lt;span class="c"&gt;#SET THE FOLLOWING&lt;/span&gt;

&lt;span class="nv"&gt;HOSTNAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;mydyndns.com
&lt;span class="nv"&gt;SSH_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;22
&lt;span class="nv"&gt;WIREGUARD_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5246

&lt;span class="c"&gt;#IF IT DOES NOT WORK, AT LEAST ON UBUNTU INSTALL, bind-utils to get the host command&lt;/span&gt;

&lt;span class="c"&gt;#Create a cron /15 * * * * root bash /path/to/dynamicdnsupdater.sh&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="nv"&gt;$EUID&lt;/span&gt; &lt;span class="nt"&gt;-ne&lt;/span&gt; 0 &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
   &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"This script must be run as root"&lt;/span&gt;
   &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi
&lt;/span&gt;&lt;span class="nv"&gt;new_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;host &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n1&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-f4&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nv"&gt;old_ip&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;/usr/sbin/ufw status | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-n1&lt;/span&gt; | &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-f3&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;' '&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$new_ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$old_ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo &lt;/span&gt;IP address has not changed
&lt;span class="k"&gt;else
    if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$old_ip&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
        /usr/sbin/ufw delete allow from &lt;span class="nv"&gt;$old_ip&lt;/span&gt; to any port &lt;span class="nv"&gt;$SSH_PORT&lt;/span&gt;
        /user/sbin/ufw delete allow from &lt;span class="nv"&gt;$old_ip&lt;/span&gt; to any port &lt;span class="nv"&gt;$WIREGUARD_PORT&lt;/span&gt;
    &lt;span class="k"&gt;fi&lt;/span&gt;
    /usr/sbin/ufw allow from &lt;span class="nv"&gt;$new_ip&lt;/span&gt; to any port &lt;span class="nv"&gt;$SSH_PORT&lt;/span&gt; comment &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;
    /usr/sbin/ufw allow from &lt;span class="nv"&gt;$new_ip&lt;/span&gt; to any port &lt;span class="nv"&gt;$WIREGUARD_PORT&lt;/span&gt; comment &lt;span class="nv"&gt;$HOSTNAME&lt;/span&gt;
    &lt;span class="nb"&gt;echo &lt;/span&gt;UFW have been updated
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I use this so now my home network can reach my vps network via wireguard or ip and I can vpn into my home network to jump. Very cool!&lt;/p&gt;

</description>
      <category>vps</category>
      <category>ufw</category>
      <category>ddns</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Perl tips I wish I knew as a beginner</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Wed, 09 Dec 2020 23:10:35 +0000</pubDate>
      <link>https://dev.to/scotticles/perl-tips-i-wish-i-knew-as-a-beginner-26eh</link>
      <guid>https://dev.to/scotticles/perl-tips-i-wish-i-knew-as-a-beginner-26eh</guid>
      <description>&lt;p&gt;I think the hard part with Perl and other languages, is setting up your environment. As you do more Perl you realize there are better ways to do things that aren't straight forward when you first began the journey.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; I use Linux and this will be on a Linux environment, BUT with WSL on windows and with homebrew on mac.&lt;/p&gt;

&lt;h1&gt;
  
  
  System Perl and User Perl
&lt;/h1&gt;

&lt;p&gt;On Linux, we have a system Perl. It's great to have but we don't want to mess with it. Lets keep the system Perl for the system. We want a user environment and you really must do this, its way better. We have two tools we can pick from that make it easy to get started.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tokuhirom/plenv"&gt;Plenv&lt;/a&gt; and &lt;a href="https://perlbrew.pl/"&gt;Perlbrew&lt;/a&gt;. &lt;em&gt;I started on Perlbrew and moved over to Plenv.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Plenv allows you to make it so each project you work on has a .plenv file and you can specify the Perl version you want.&lt;/p&gt;

&lt;p&gt;Look at the two links, pick one and set it up, pick a perl version and install it. Verify it works with &lt;code&gt;perl -v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You want to install cpanminus.&lt;br&gt;
&lt;code&gt;plenv install-cpanm&lt;/code&gt; &amp;lt;--plenv&lt;br&gt;
&lt;code&gt;cpan App-cpanminus&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You are now off system Perl and on your user Perl, its awesome. Cpanminus is installed and you can now install Perl modules for your project.&lt;/p&gt;
&lt;h1&gt;
  
  
  The &lt;a href="https://metacpan.org/pod/distribution/Module-CPANfile/lib/cpanfile.pod"&gt;cpanfile&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;In your project you want to make a cpanfile. Cpanfiles contain a list of Perl modules.&lt;/p&gt;

&lt;p&gt;As your project grows, add in the modules to the cpanfile. When you need to distribute it, you can use the below command to install the dependencies. Makes life easier for everyone.&lt;br&gt;
&lt;code&gt;cpanm --installdeps .&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  &lt;a href="https://metacpan.org/pod/Carton"&gt;Carton&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;"Perl module dependency manager (aka Bundler for Perl)"&lt;br&gt;
Carton is awesome, with plenv its even more awesome.&lt;/p&gt;

&lt;p&gt;This is stolen from metacpan pod:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# On your development environment&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;cat&lt;/span&gt; &lt;span class="nv"&gt;cpanfile&lt;/span&gt;
&lt;span class="nv"&gt;requires&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Plack&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.9980&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;
&lt;span class="nv"&gt;requires&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Starman&lt;/span&gt;&lt;span class="p"&gt;',&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;0.2000&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;carton&lt;/span&gt; &lt;span class="nv"&gt;install&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;add&lt;/span&gt; &lt;span class="nv"&gt;cpanfile&lt;/span&gt; &lt;span class="nv"&gt;cpanfile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;snapshot&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;git&lt;/span&gt; &lt;span class="nv"&gt;commit&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="sr"&gt;m "add Plack and Starman"&lt;/span&gt;

&lt;span class="c1"&gt;# Other developer's machine, or on a deployment box&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;carton&lt;/span&gt; &lt;span class="nv"&gt;install&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;carton&lt;/span&gt; &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;starman&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;p&lt;/span&gt; &lt;span class="mi"&gt;8080&lt;/span&gt; &lt;span class="nv"&gt;myapp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;psgi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;a href="https://code.visualstudio.com/"&gt;VSCode&lt;/a&gt;
&lt;/h1&gt;

&lt;p&gt;Before vscode came out, I was living in PHPStorm with a Perl plugin, it worked but it was only okay. Code is awesome with all its plugins, once you get code up, browse the perl plugins. One you will want to have is perltidy and you'll need a &lt;code&gt;.perltidyrc&lt;/code&gt; in your project, you can find examples on the web, but here is Mojolicoius &lt;a href="https://github.com/mojolicious/mojo/blob/master/.perltidyrc"&gt;perltidyrc&lt;/a&gt;. I use that one.&lt;/p&gt;

&lt;p&gt;This should get you started with Perl.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Perl is dead simple with CBC Block Encryption</title>
      <dc:creator>Scotticles</dc:creator>
      <pubDate>Tue, 08 Dec 2020 22:25:38 +0000</pubDate>
      <link>https://dev.to/scotticles/perl-is-dead-simple-with-cbc-block-encryption-3bld</link>
      <guid>https://dev.to/scotticles/perl-is-dead-simple-with-cbc-block-encryption-3bld</guid>
      <description>&lt;h1&gt;
  
  
  INTRO
&lt;/h1&gt;

&lt;p&gt;I hope this blog post will help someone with &lt;a href="https://metacpan.org/pod/CryptX"&gt;CryptX&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My disclaimer:&lt;/strong&gt; I am not an expert in cryptography. &lt;/p&gt;

&lt;p&gt;I first started using &lt;a href="https://metacpan.org/pod/Crypt::CBC"&gt;Crypt::CBC&lt;/a&gt; but I liked how CryptX had more modules, better maintained and it was faster. I moved my system over to CryptX. In Crypt, the CBC piece was done more for you, where &lt;a href="https://metacpan.org/pod/Crypt::Mode::CBC"&gt;Crypt::Mode::CBC&lt;/a&gt; requires a little more from the developer to configure it.&lt;/p&gt;

&lt;h1&gt;
  
  
  WHY?
&lt;/h1&gt;

&lt;p&gt;I am designing a system and needed a way to take files uploaded by users and encrypt them before storing them until needed. S3 has it built it, I know but I didn't want to rely on that. I decided to use CBC block as my encryption method. I also had to encrypt text and store them in the database, I can use the same encryption methods for both tasks. If you plan on storing in a database, remember these are bytes and needs to be a blob type.&lt;/p&gt;

&lt;h1&gt;
  
  
  HOW?
&lt;/h1&gt;

&lt;p&gt;Here is the Crypt::Mode::CBC snippet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Crypt::Mode::&lt;/span&gt;&lt;span class="nv"&gt;CBC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Crypt::Mode::&lt;/span&gt;&lt;span class="nv"&gt;CBC&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;

&lt;span class="c1"&gt;#(en|de)crypt at once&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$ciphertext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$m&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plaintext&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$iv&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://metacpan.org/pod/Crypt::Mode::CBC"&gt;Crypt::Mode::CBC&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It uses AES, requires a $key and a $iv. AES is one of the many Ciphers to use. The padding by default is PKCS5 padding.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/security/vulnerabilities-cbc-mode"&gt;vulnerabilities-cbc-mode - Extra Reading&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What the heck is the IV?
&lt;/h2&gt;

&lt;p&gt;The IV is 'initialization vector'. To make each message unique, an initialization vector must be used in the first block. &lt;a href="https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Cipher_block_chaining_(CBC)"&gt;IV Resource&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I generate a IV for each encrypted object and store it in the database for when decryption is needed.&lt;br&gt;
&lt;a href="http://www.ciphersbyritter.com/NEWS6/CBCIV.HTM"&gt;IV Resource&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is a full example.&lt;br&gt;
I use Mojo::File for file manipulation, it makes things easy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Just to note, rand() is not cryptographically secure. Please see the doc for picking the right module, if you need a secure implementation. In this example I am using Math::Random::Secure that replaced the native rand()&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://perldoc.perl.org/functions/rand"&gt;https://perldoc.perl.org/functions/rand&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requires Modules:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crypt::Mode::CBC&lt;/li&gt;
&lt;li&gt;Mojo::File&lt;/li&gt;
&lt;li&gt;Modern::Perl&lt;/li&gt;
&lt;li&gt;Crypt::Digest::SHA512_256&lt;/li&gt;
&lt;li&gt;Math::Random::Secure
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Crypt::Mode::&lt;/span&gt;&lt;span class="nv"&gt;CBC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Mojo::&lt;/span&gt;&lt;span class="nv"&gt;File&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Modern::&lt;/span&gt;&lt;span class="nv"&gt;Perl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;warnings&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nv"&gt;strict&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Crypt::Digest::&lt;/span&gt;&lt;span class="nv"&gt;SHA512_256&lt;/span&gt; &lt;span class="sx"&gt;qw( sha512_256_hex )&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Math::Random::&lt;/span&gt;&lt;span class="nv"&gt;Secure&lt;/span&gt; &lt;span class="sx"&gt;qw(rand)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nv"&gt;sha512_256_hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$iv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="nv"&gt;sha512_256_hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="c1"&gt;# Lets print out the IV and KEY for fun.&lt;/span&gt;
&lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$iv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$cbc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Crypt::Mode::&lt;/span&gt;&lt;span class="nv"&gt;CBC&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;AES&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;

&lt;span class="c1"&gt;# Encrypt&lt;/span&gt;
&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$file&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Mojo::&lt;/span&gt;&lt;span class="nv"&gt;File&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;plainfile.txt&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$ciphertext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$cbc&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;slurp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;H*&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;H*&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$iv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$encFile&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Mojo::&lt;/span&gt;&lt;span class="nv"&gt;File&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;plainfile.txt.crypted&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;$encFile&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;spurt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$ciphertext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;# Move the old file&lt;/span&gt;
&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;move_to&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;plainfile.txt.backup&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;('&lt;/span&gt;&lt;span class="s1"&gt;plainfile.txt&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;

&lt;span class="c1"&gt;# Decrypt&lt;/span&gt;

&lt;span class="k"&gt;my&lt;/span&gt; &lt;span class="nv"&gt;$plaintext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$cbc&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$encFile&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;slurp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;H*&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nv"&gt;$key&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;pack&lt;/span&gt;&lt;span class="p"&gt;("&lt;/span&gt;&lt;span class="s2"&gt;H*&lt;/span&gt;&lt;span class="p"&gt;",&lt;/span&gt; &lt;span class="nb"&gt;substr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$iv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt;

&lt;span class="nv"&gt;$file&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;spurt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$plaintext&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;# this should print out the data and if you cat the file plainfile.txt, it should print out the data.&lt;/span&gt;
&lt;span class="nv"&gt;say&lt;/span&gt; &lt;span class="nv"&gt;$plaintext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run this, you will have a few files to look at.&lt;/p&gt;

</description>
      <category>perl</category>
      <category>encryption</category>
      <category>cbc</category>
      <category>cryptx</category>
    </item>
  </channel>
</rss>
