<?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>Forem: Alberto Gonzalez Escalante</title>
    <description>The latest articles on Forem by Alberto Gonzalez Escalante (@agonza05).</description>
    <link>https://forem.com/agonza05</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%2F3190345%2F66fa85fa-dd7a-4317-87bf-de1753aef9e6.jpeg</url>
      <title>Forem: Alberto Gonzalez Escalante</title>
      <link>https://forem.com/agonza05</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/agonza05"/>
    <language>en</language>
    <item>
      <title>Load secrets automatically with 1password and direnv</title>
      <dc:creator>Alberto Gonzalez Escalante</dc:creator>
      <pubDate>Fri, 24 Oct 2025 07:50:25 +0000</pubDate>
      <link>https://forem.com/agonza05/load-secrets-automatically-with-1password-and-direnv-pn0</link>
      <guid>https://forem.com/agonza05/load-secrets-automatically-with-1password-and-direnv-pn0</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Load automatically secrets stored in 1password as environment variables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Global config
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;## File: ~/.config/direnv/direnv.toml
&lt;/span&gt;
&lt;span class="nn"&gt;[global]&lt;/span&gt;
&lt;span class="py"&gt;load_dotenv&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;true&lt;/span&gt;

&lt;span class="nn"&gt;[whitelist]&lt;/span&gt;
&lt;span class="py"&gt;prefix&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;[ "~/workspace" ]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Root working directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;## File: ~/workspace/.envrc
&lt;/span&gt;
&lt;span class="c"&gt;# Inject 1password secrets into environment
&lt;/span&gt;&lt;span class="err"&gt;use_sourceop()&lt;/span&gt; &lt;span class="err"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;if&lt;/span&gt; &lt;span class="err"&gt;printenv&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;grep&lt;/span&gt; &lt;span class="err"&gt;-q&lt;/span&gt; &lt;span class="err"&gt;"op://"&lt;/span&gt;&lt;span class="c"&gt;; then
&lt;/span&gt;    &lt;span class="err"&gt;source&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;(printenv&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;grep&lt;/span&gt; &lt;span class="err"&gt;"op://"&lt;/span&gt; &lt;span class="err"&gt;|&lt;/span&gt; &lt;span class="err"&gt;op&lt;/span&gt; &lt;span class="err"&gt;inject)&lt;/span&gt;
  &lt;span class="err"&gt;fi&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Project directory
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;## File: ~/workspace/python/project/.envrc
&lt;/span&gt;
&lt;span class="err"&gt;dotenv_if_exists&lt;/span&gt;
&lt;span class="err"&gt;source_up_if_exists&lt;/span&gt;
&lt;span class="err"&gt;use&lt;/span&gt; &lt;span class="err"&gt;sourceop&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;## File: ~/workspace/python/project/.env
&lt;/span&gt;
&lt;span class="py"&gt;PROJECT_VAR&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;lt;EXAMPLE&amp;gt;&lt;/span&gt;
&lt;span class="py"&gt;PROJECT_SECRET&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"op://Private/Python Project Secret/password"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;In the global configuration file, we enable loading environment variables from &lt;code&gt;.env&lt;/code&gt; files by default.&lt;br&gt;
In the root working directory, we create a script for loading secrets from 1password.&lt;br&gt;
In the project directory, we load &lt;code&gt;.env&lt;/code&gt; files, add config from the root working directory and finally run the script for loading secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://direnv.net/" rel="noopener noreferrer"&gt;direnv&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://1password.com/" rel="noopener noreferrer"&gt;1password&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>userhacks</category>
      <category>dotfiles</category>
      <category>direnv</category>
      <category>1password</category>
    </item>
    <item>
      <title>Create systemd unit timers</title>
      <dc:creator>Alberto Gonzalez Escalante</dc:creator>
      <pubDate>Wed, 22 Oct 2025 10:06:00 +0000</pubDate>
      <link>https://forem.com/agonza05/create-systemd-unit-timers-3ble</link>
      <guid>https://forem.com/agonza05/create-systemd-unit-timers-3ble</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Run a script every day at midnight using systemd.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Systemd service file
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;## File: /etc/systemd/system/run-script.service
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Run a script every day at midnight&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="py"&gt;EnvironmentFile&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/path/to/environment&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/path/to/script.sh&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Systemd timer file
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;## File: /etc/systemd/system/run-script.timer
&lt;/span&gt;&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Run a script every day at midnight&lt;/span&gt;

&lt;span class="nn"&gt;[Timer]&lt;/span&gt;
&lt;span class="py"&gt;OnCalendar&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;*-*-* 00:00:00&lt;/span&gt;
&lt;span class="py"&gt;Unit&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;run-script.service&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;timers.target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Reload and start the timer
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;run-script.timer
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;run-script.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;The systemd unit timers are a powerful feature that allows you to schedule tasks to run at specific times or intervals. They are similar to cron jobs but offer more flexibility and control. You can take advantage of systemd's built-in capabilities like logging and monitoring, environment variables, and more.&lt;/p&gt;

</description>
      <category>sysadmin</category>
      <category>systemd</category>
      <category>linux</category>
    </item>
    <item>
      <title>Generate passwords from CLI</title>
      <dc:creator>Alberto Gonzalez Escalante</dc:creator>
      <pubDate>Tue, 21 Oct 2025 09:26:35 +0000</pubDate>
      <link>https://forem.com/agonza05/generate-passwords-from-cli-276d</link>
      <guid>https://forem.com/agonza05/generate-passwords-from-cli-276d</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;Simple and easy method for generating random passwords from the command line.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Use the command below:&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="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C &amp;lt;/dev/urandom &lt;span class="nb"&gt;tr&lt;/span&gt; &lt;span class="nt"&gt;-cd&lt;/span&gt; &lt;span class="s1"&gt;'[:alnum:]'&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; 32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;This command generates a random string, remove non-alphanumeric characters and print the first 32 characters.&lt;/p&gt;

&lt;p&gt;Adjust the length of the password by changing the number after &lt;code&gt;-c&lt;/code&gt; in &lt;code&gt;head -c 32&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Add symbols by replacing the character class with &lt;code&gt;[:graph:]&lt;/code&gt; as in &lt;code&gt;tr -cd '[:graph:]'&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>userhacks</category>
      <category>passwordgenerator</category>
      <category>cli</category>
    </item>
    <item>
      <title>DNS query without nslookup command</title>
      <dc:creator>Alberto Gonzalez Escalante</dc:creator>
      <pubDate>Mon, 20 Oct 2025 06:58:18 +0000</pubDate>
      <link>https://forem.com/agonza05/dns-query-without-nslookup-command-10ln</link>
      <guid>https://forem.com/agonza05/dns-query-without-nslookup-command-10ln</guid>
      <description>&lt;h2&gt;
  
  
  Problem
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;nslookup&lt;/code&gt; command is not available on the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution
&lt;/h2&gt;

&lt;p&gt;Use the command &lt;code&gt;getent hosts&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;getent hosts agonza.net
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Explanation
&lt;/h2&gt;

&lt;p&gt;Most of the time, the &lt;code&gt;getent&lt;/code&gt; command is available.&lt;/p&gt;

&lt;p&gt;Other options include using &lt;code&gt;dig&lt;/code&gt; or &lt;code&gt;host&lt;/code&gt;, however, if the &lt;code&gt;nslookup&lt;/code&gt; utility is not available, these commands are usually not installed either.&lt;/p&gt;

</description>
      <category>sysadmin</category>
      <category>dns</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
