Jump to content

Welcome to CodeNameJessica

Welcome to CodeNameJessica!

💻 Where tech meets community.

Hello, Guest! 👋
You're just a few clicks away from joining an exclusive space for tech enthusiasts, problem-solvers, and lifelong learners like you.

🔐 Why Join?
By becoming a member of CodeNameJessica, you’ll get access to:
In-depth discussions on Linux, Security, Server Administration, Programming, and more
Exclusive resources, tools, and scripts for IT professionals
A supportive community of like-minded individuals to share ideas, solve problems, and learn together
Project showcases, guides, and tutorials from our members
Personalized profiles and direct messaging to collaborate with other techies

🌐 Sign Up Now and Unlock Full Access!
As a guest, you're seeing just a glimpse of what we offer. Don't miss out on the complete experience! Create a free account today and start exploring everything CodeNameJessica has to offer.

Blogs

Featured Entries

Our community blogs

  1. Linux News

    A blog by Blogger in CodeName Blogs
    • 54 Entries
    • 0 Comments
    • 1959 Views
    By: Edwin
    Wed, 30 Apr 2025 13:08:34 +0000


    how to uninstall wsl blog

    A lot of people want Linux but do not want to go either remove Windows or take up the overwhelming task of dual booting. For those people, WSL (Windows Subsystem for Linux) came as a blessing. WSL lets you run Linux on your Windows device without the overhead of a Virtual Machine (VM). But in some cases where you want to fix a problem or simply do not want WSL anymore, you may have to uninstall WSL from your Windows system.

    Here is step-by-step guide to remove WSL from your Windows system, remove any Linux distribution, delete all related files, and clear up some disk space. Ready? Get. Set. Learn!

    What is WSL

    You probably knew by now that we will always start with the basics i.e., what WSL does. Think of WSL as a compatibility layer for running Linux binaries on Microsoft Windows systems. It comes in two versions:

    • WSL 1: Uses a translation layer between Linux and Windows.
    • WSL 2: Uses a real Linux kernel in a lightweight VM.

    All around the world, WSL is a favourite among developers, system administrators, and students for running Linux tools like bash, ssh, grep, awk, and even Docker. But if you have moved to a proper Linux system or just want to do a clean reinstall, here are the instructions to remove WSL completely without any errors.

    Step 1: How to Uninstall Linux Distributions

    The first step to uninstall WSL completely is to remove all installed Linux distributions.

    Check Installed Distros

    To check for the installed Linux distributions, open PowerShell or Command Prompt and run the command:

    wsl --list --all

    After executing this command, you will see a list of installed distros, such as:

    • Ubuntu
    • Debian
    • Kali
    • Alpine

    How to Uninstall a Linux Distro

    To uninstall a distro like Ubuntu, follow these instructions:

    1. Press Windows key + I to open Settings window.
    2. Go to Apps, then click Installed Apps (or Apps & Features).
    3. Search for your distro and click Uninstall.

    Repeat for all distros you no longer need. If you plan to uninstall WSL completely, we recommend removing all distros.

    if you prefer PowerShell, run these commands

    wsl --unregister <DistroName>

    For example, if you want to remove Ubuntu, execute the command:

    wsl --unregister Ubuntu

    This removes the Linux distro and all its associated files.

    Step 2: Uninstall WSL Components

    Once we have removed the unwanted distros, let us uninstall the WSL platform itself.

    1. Open Control Panel and navigate to Programs and then click Turn Windows features on or off.
    2. Uncheck these boxes:
      1. Windows Subsystem for Linux
      2. Virtual Machine Platform (used by WSL 2)
      3. Windows Hypervisor Platform (optional)
    3. Click OK and restart your system.

    Step 3: Remove WSL Files and Cache

    Even after uninstalling WSL and Linux distributions, some data might remain. Here are the instructions to delete WSL’s cached files and reclaim disk space.

    To delete the WSL Folder, open File Explorer and go to:

    %USERPROFILE%\AppData\Local\Packages

    Look for folders like:

    • CanonicalGroupLimited…Ubuntu
    • Debian…
    • KaliLinux…

    Delete any folders related to WSL distros you removed.

    Step 4: Remove WSL CLI Tool (Optional)

    If you installed WSL using the Microsoft Store (i.e., “wsl.exe” package), you can also uninstall it directly from the Installed Apps section:

    1. Go to Settings, and then to Apps and then open Installed Apps.
    2. Search for Windows Subsystem for Linux.
    3. Click Uninstall.

    Step 5: Clean Up with Disk Cleanup Tool

    Finally, use the built-in Disk Cleanup utility to clear any temporary files.

    1. Press “Windows key + S and search for Disk Cleanup.
    2. Choose your system drive (usually drive C:).
    3. Select options like:
      1. Temporary files
      2. System created Windows error reporting
      3. Delivery optimization files
    4. Click OK to clean up.

    Bonus Section: How to Reinstall WSL (Optional)

    If you are removing WSL due to issues or conflicts, you can always do a fresh reinstall.

    Here is how you can install latest version of WSL via PowerShell

    wsl --install

    This installs WSL 2 by default, along with Ubuntu.

    Wrapping Up

    Uninstalling WSL may sound tricky, but by following these steps, you can completely remove Linux distributions, WSL components, and unwanted files from your system. Whether you are making space for something new or just doing some digital spring cleaning, this guide ensures that WSL is uninstalled safely and cleanly.

    If you ever want to come back to the Linux world, WSL can be reinstalled with a single command, which we have covered as a precaution. Let us know if you face any errors. Happy learning!

    The post Uninstall WSL: Step-by-Step Simple Guide appeared first on Unixmen.

    Recent Entries

  2. Programmer's Corner

    A blog by Blogger in CodeName Blogs
    • 170 Entries
    • 0 Comments
    • 2207 Views
    Blogger
    by: Daniel Schwarz
    Tue, 27 May 2025 13:02:32 +0000


    The reading-flow and reading-order proposed CSS properties are designed to specify the source order of HTML elements in the DOM tree, or in simpler terms, how accessibility tools deduce the order of elements. You’d use them to make the focus order of focusable elements match the visual order, as outlined in the Web Content Accessibility Guidelines (WCAG 2.2).

    To get a better idea, let’s just dive in!

    (Oh, and make sure that you’re using Chrome 137 or higher.)

    reading-flow

    reading-flow determines the source order of HTML elements in a flex, grid, or block layout. Again, this is basically to help accessibility tools provide the correct focus order to users.

    The default value is normal (so, reading-flow: normal). Other valid values include:

    • flex-visual
    • flex-flow
    • grid-rows
    • grid-columns
    • grid-order
    • source-order

    Let’s start with the flex-visual value. Imagine a flex row with five links. Assuming that the reading direction is left-to-right (by the way, you can change the reading direction with the direction CSS property), that’d look something like this:

    Now, if we apply flex-direction: row-reverse, the links are displayed 5-4-3-2-1. The problem though is that the focus order still starts from 1 (tab through them!), which is visually wrong for somebody that reads left-to-right.

    But if we also apply reading-flow: flex-visual, the focus order also becomes 5-4-3-2-1, matching the visual order (which is an accessibility requirement!):

    <div>
      <a>1</a>
      <a>2</a>
      <a>3</a>
      <a>4</a>
      <a>5</a>
    </div>
    div {
      display: flex;
      flex-direction: row-reverse;
      reading-flow: flex-visual;
    }

    To apply the default flex behavior, reading-flow: flex-flow is what you’re looking for. This is very akin to reading-flow: normal, except that the container remains a reading flow container, which is needed for reading-order (we’ll dive into this in a bit).

    For now, let’s take a look at the grid-y values. In the grid below, the grid items are all jumbled up, and so the focus order is all over the place.

    We can fix this in two ways. One way is that reading-flow: grid-rows will, as you’d expect, establish a row-by-row focus order:

    <div>
      <a>1</a>
      <a>2</a>
      <a>3</a>
      <a>4</a>
      <a>5</a>
      <a>6</a>
      <a>7</a>
      <a>8</a>
      <a>9</a>
      <a>10</a>
      <a>11</a>
      <a>12</a>
    </div>
    div {
      display: grid;
      grid-template-columns: repeat(4, 1fr);
      grid-auto-rows: 100px;
      reading-flow: grid-rows;
      
      a:nth-child(2) {
        grid-row: 2 / 4;
        grid-column: 3;
      }
    
      a:nth-child(5) {
        grid-row: 1 / 3;
        grid-column: 1 / 3;
      }
    }

    Or, reading-flow: grid-columns will establish a column-by-column focus order:

    reading-flow: grid-order will give us the default grid behavior (i.e., the jumbled up version). This is also very akin to reading-flow: normal (except that, again, the container remains a reading flow container, which is needed for reading-order).

    There’s also reading-flow: source-order, which is for flex, grid, and block containers. It basically turns containers into reading flow containers, enabling us to use reading-order. To be frank, unless I’m missing something, this appears to make the flex-flow and grid-order values redundant?

    reading-order

    reading-order sort of does the same thing as reading-flow. The difference is that reading-order is for specific flex or grid items, or even elements in a simple block container. It works the same way as the order property, although I suppose we could also compare it to tabindex.

    Note: To use reading-order, the container must have the reading-flow property set to anything other than normal.

    I’ll demonstrate both reading-order and order at the same time. In the example below, we have another flex container where each flex item has the order property set to a different random number, making the order of the flex items random. Now, we’ve already established that we can use reading-flow to determine focus order regardless of visual order, but in the example below we’re using reading-order instead (in the exact same way as order):

    div {
      display: flex;
      reading-flow: source-order; /* Anything but normal */
    
      /* Features at the end because of the higher values */
      a:nth-child(1) {
        /* Visual order */
        order: 567;
        /* Focus order */
        reading-order: 567;
      }
    
      a:nth-child(2) {
        order: 456;
        reading-order: 456;
      }
    
      a:nth-child(3) {
        order: 345;
        reading-order: 345;
      }
    
      a:nth-child(4) {
        order: 234;
        reading-order: 234;
      }
    
      /* Features at the beginning because of the lower values */
      a:nth-child(5) {
        order: -123;
        reading-order: -123;
      }
    }

    Yes, those are some rather odd numbers. I’ve done this to illustrate how the numbers don’t represent the position (e.g., order: 3 or reading-order: 3 doesn’t make it third in the order). Instead, elements with lower numbers are more towards the beginning of the order and elements with higher numbers are more towards the end. The default value is 0. Elements with the same value will be ordered by source order.

    In practical terms? Consider the following example:

    div {
      display: flex;
      reading-flow: source-order;
    
      a:nth-child(1) {
        order: 1;
        reading-order: 1;
      }
    
      a:nth-child(5) {
        order: -1;
        reading-order: -1;
      }
    }

    Of the five flex items, the first one is the one with order: -1 because it has the lowest order value. The last one is the one with order: 1 because it has the highest order value. The ones with no declaration default to having order: 0 and are thus ordered in source order, but otherwise fit in-between the order: -1 and order: 1 flex items. And it’s the same concept for reading-order, which in the example above mirrors order.

    However, when reversing the direction of flex items, keep in mind that order and reading-order work a little differently. For example, reading-order: -1 would, as expected, and pull a flex item to the beginning of the focus order. Meanwhile, order: -1 would pull it to the end of the visual order because the visual order is reversed (so we’d need to use order: 1 instead, even if that doesn’t seem right!):

    div {
      display: flex;
      flex-direction: row-reverse;
      reading-flow: source-order;
    
      a:nth-child(5) {
        /* Because of row-reverse, this actually makes it first */
        order: 1;
        /* However, this behavior doesn’t apply to reading-order */
        reading-order: -1;
      }
    }

    reading-order overrides reading-flow. If we, for example, apply reading-flow: flex-visual, reading-flow: grid-rows, or reading-flow: grid-columns (basically, any declaration that does in fact change the reading flow), reading-order overrides it. We could say that reading-order is applied after reading-flow.

    What if I don’t want to use flexbox or grid layout?

    Well, that obviously rules out all of the flex-y and grid-y reading-flow values; however, you can still set reading-flow: source-order on a block element and then manipulate the focus order with reading-order (as we did above).

    How does this relate to the tabindex HTML attribute?

    They’re not equivalent. Negative tabindex values make targets unfocusable and values other than 0 and -1 aren’t recommended, whereas a reading-order declaration can use any number as it’s only contextual to the reading flow container that contains it.

    For the sake of being complete though, I did test reading-order and tabindex together and reading-order appeared to override tabindex.

    Going forward, I’d only use tabindex (specifically, tabindex="-1") to prevent certain targets from being focusable (the disabled attribute will be more appropriate for some targets though), and then reading-order for everything else.

    Closing thoughts

    Being able to define reading order is useful, or at least it means that the order property can finally be used as intended. Up until now (or rather when all web browsers support reading-flow and reading-order, because they only work in Chrome 137+ at the moment), order hasn’t been useful because we haven’t been able to make the focus order match the visual order.


    What We Know (So Far) About CSS Reading Order originally published on CSS-Tricks, which is part of the DigitalOcean family. You should get the newsletter.

    Recent Entries

  3. F.O.S.S

    A blog by Blogger in CodeName Blogs
    • 90 Entries
    • 0 Comments
    • 3827 Views
    by: Abhishek Prakash
    Thu, 29 May 2025 04:29:31 GMT


    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    Important thing first. Ubuntu 20.04 LTS version will be reaching its end of life on 31st May. It was released in April 2020 and had a standard support of five years.

    Please check your Ubuntu version and if you are using 20.04, you can:

    • Do a fresh installation of Ubuntu 24.04 LTS to get the latest packages.
    • Upgrade to Ubuntu 22.04 LTS from your existing 20.04 installation, keeping your files intact.
    • Opt for Ubuntu Pro, which will ensure you get essential security patches until 2030 but no new software.
    Ubuntu 20.04 LTS is Reaching End of Life — Here are Your Options
    Upgrade or sign-up for extended support before it is too late!
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    Time to plan your update.

    💬 Let's see what else you get in this edition

    • A new Linux kernel release.
    • File permission in Linux.
    • GNU Taler payment system being approved for Swiss use.
    • And other Linux news, tips, and, of course, memes!
    • This edition of FOSS Weekly is supported by PikaPods.

    ❇️ PikaPods: Enjoy Self-hosting Hassle-free

    PikaPods allows you to quickly deploy your favorite open source software. All future updates are handled automatically by PikaPods while you enjoy using the software. PikaPods also share revenue with the original developers of the software.

    You get a $5 free credit to try it out and see if you can rely on PikaPods.

    PikaPods - Instant Open Source App Hosting
    Run the finest Open Source web apps from $1.20/month, fully managed, no tracking, no ads, full privacy. Self-hosting was never this convenient.
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    📰 Linux and Open Source News

    Rhino Linux's new UBXI KDE Desktop doesn't disappoint.

    Hands-On with Rhino Linux’s New UBXI KDE 6 Desktop
    Rhino Linux’s first UBXI port is here!
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    🧠 What We’re Thinking About

    Carmen from Mission Libre has started a petition to get Qualcomm to release fully-free drivers for their in-production chipsets. If the petition is signed by 5,000 people, a hardcopy of the petition and signatures will be mailed to Qualcomm's head office. We can get 5,000 signatures, can't we?

    Home | Tell Qualcomm: Publish Free Drivers for Modern Wi-Fi Chipsets!
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    🧮 Linux Tips, Tutorials and More

    Looking for some note taking apps suggestion? We have an extensive list.

    Top 16 Best Note Taking Apps For Linux [2025]
    Plenty of amazing note-taking apps for Linux. Here’s what we recommend you to check out.
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    Why should you opt for It's FOSS Plus membership:

    ✅ Ad-free reading experience
    ✅ Badges in the comment section and forum
    ✅ Supporting creation of educational Linux materials

    Join It's FOSS Plus

    👷 Homelab and Maker's Corner

    While it is a proprietary piece of hardware, Flexbar can be a nice addition to your Linux setup.

    Miss Apple’s Touch Bar? Flexbar Brings This Experience to Linux
    While Apple has discontinued the Touch Bar, Linux users can now enjoy the same experience with Flexbar.
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    Also, learn a thing or two about MCP servers, the latest buzzword in the (AI) tech world.

    ✨ Apps Highlight

    If you ever wanted to run an operating system inside your browser, then Puter is the solution for you. It is open source and can be self-hosted as well.

    Puter is a Complete, Fully Functional OS that Runs in Your Web Browser
    Run an operating system straight from your browser.
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    An It's FOSS reader created an FFmpeg AAC Audio Encoder Plugin for DaVinci Resolve. This will help you get effortless AAC audio encoding on Linux if you use DaVinci Resolve video editor.

    📽️ Videos I am Creating for You

    I tried Microsoft's new terminal editor on Linux! I hate to admit it but I liked what I saw here. This is an excellent approach. I wonder why Linux didn't have something like this before. See it in action 👇

    🧩 Quiz Time

    Can you identify all the GitHub alternatives in this puzzle?

    GitHub Alternatives: Puzzle
    Solve this puzzle by figuring out the alternatives to GitHub!
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    💡 Quick Handy Tip

    In Xfce, you can use the panel item "Directory Menu" to get quick access to files from anywhere. This is like the Places extension in GNOME, but better.

    In the configuration menu for it, provide the file extension in the following format *.txt;*.jsonc as shown in the screenshot above to access the files quickly. Clicking on those files opens it in the default app.

    🤣 Meme of the Week

    The ricing never stops! 👨‍💻

    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    🗓️ Tech Trivia

    On May 27, 1959, MIT retired the Whirlwind computer, a groundbreaking machine famous for pioneering real-time computing and magnetic core memory.

    🧑‍🤝‍🧑 FOSSverse Corner

    ProFOSSer Sheila is having an issue with MX Linux, can you help?

    MX Linux / XFCE missing desktop background image!
    I am at a loss as to how to fix a new issue on MX-Linux Xfce that started about 30 min ago. I was working on things and my windows are always only expanded far enough right so that I can still see my Conky (top-right on desktop). I clicked outside the window on Conky and it disappeared. So did the background image. Later, switching workspaces, I found the same was true on all of them and when I right clicked on the desktop, no context menu. I went in to the desktop settings and tried to apply a…
    FOSS Weekly #25.22: Microsoft's Vim Alternative, Kernel 6.15, UBXI Desktop, End of Ubuntu 20.04 and More

    ❤️ With love

    Share it with your Linux-using friends and encourage them to subscribe (hint: it's here).

    Share the articles in Linux Subreddits and community forums.

    Follow us on Google News and stay updated in your News feed.

    Opt for It's FOSS Plus membership and support us 🙏

    Enjoy FOSS 😄

    Recent Entries

  4. Jessica Brown

    • 47 Entries
    • 0 Comments
    • 6153 Views

    SaltStack (SALT): A Comprehensive Overview

    SaltStack, commonly referred to as SALT, is a powerful open-source infrastructure management platform designed for scalability. Leveraging event-driven workflows, SALT provides an adaptable solution for automating configuration management, remote execution, and orchestration across diverse infrastructures.

    This document offers an in-depth guide to SALT for both technical teams and business stakeholders, demystifying its features and applications.

    What is SALT?

    SALT is a versatile tool that serves multiple purposes in infrastructure management:

    • Configuration Management Tool (like Ansible, Puppet, Chef): Automates the setup and maintenance of servers and applications.

    • Remote Execution Engine (similar to Fabric or SSH): Executes commands on systems remotely, whether targeting a single node or thousands.

    • State Enforcement System: Ensures systems maintain desired configurations over time.

    • Event-Driven Automation Platform: Detects system changes and triggers actions in real-time.

    Key Technologies:

    • YAML: Used for defining states and configurations in a human-readable format.

    • Jinja: Enables dynamic templating for YAML files.

    • Python: Provides extensibility through custom modules and scripts.

    Supported Architectures

    SALT accommodates various architectures to suit organizational needs:

    • Master/Minion: A centralized control model where a Salt Master manages Salt Minions to send commands and execute tasks.

    • Masterless: A decentralized approach using salt-ssh to execute tasks locally without requiring a master node.

    Core Components of SALT

    Component

    Description

    Salt Master

    Central control node that manages minions, sends commands, and orchestrates infrastructure tasks.

    Salt Minion

    Agent installed on managed nodes that executes commands from the master.

    Salt States

    Declarative YAML configuration files that define desired system states (e.g., package installations).

    Grains

    Static metadata about a system (e.g., OS version, IP address), useful for targeting specific nodes.

    Pillars

    Secure, per-minion data storage for secrets and configuration details.

    Runners

    Python modules executed on the master to perform complex orchestration tasks.

    Reactors

    Event listeners that trigger actions in response to system events.

    Beacons

    Minion-side watchers that emit events based on system changes (e.g., file changes or CPU spikes).

    Key Features of SALT

    Feature

    Description

    Agent or Agentless

    SALT can operate in agent (minion-based) or agentless (masterless) mode.

    Scalability

    Capable of managing tens of thousands of nodes efficiently.

    Event-Driven

    Reacts to real-time system changes via beacons and reactors, enabling automation at scale.

    Python Extensibility

    Developers can extend modules or create custom ones using Python.

    Secure

    Employs ZeroMQ for communication and AES encryption for data security.

    Role-Based Config

    Dynamically applies configurations based on server roles using grains metadata.

    Granular Targeting

    Targets systems using name, grains, regex, or compound filters for precise management.

    Common Use Cases

    SALT is widely used across industries for tasks like:

    • Provisioning new systems and applying base configurations.

    • Enforcing security policies and managing firewall rules.

    • Installing and enabling software packages (e.g., HTTPD, Nginx).

    • Scheduling and automating patching across multiple environments.

    • Monitoring logs and system states with automatic remediation for issues.

    • Managing VM and container lifecycles (e.g., Docker, LXC).

    Real-World Examples

    1. Remote Command Execution:

      • salt '*' test.ping (Pings all connected systems).

      • salt 'web*' cmd.run 'systemctl restart nginx' (Restarts Nginx service on all web servers).

    2. State File Example (YAML):

      nginx:
        pkg.installed: []
        service.running:
          - enable: True
          - require:
            - pkg: nginx
      

    Comparing SALT to Other Tools

    Feature

    Salt

    Ansible

    Puppet

    Chef

    Language

    YAML + Python

    YAML + Jinja

    Puppet DSL

    Ruby DSL

    Agent Required

    Optional

    No

    Yes

    Yes

    Push/Pull

    Both

    Push

    Pull

    Pull

    Speed

    Very Fast

    Medium

    Medium

    Medium

    Scalability

    High

    Medium-High

    Medium

    Medium

    Event-Driven

    Yes

    No

    No

    Limited

    Security Considerations

    SALT ensures secure communication and authentication:

    • Authentication: Uses public/private key pairs to authenticate minions.

    • Encryption: Communicates via ZeroMQ encrypted with AES.

    • Access Control: Defines granular controls using Access Control Lists (ACLs) in the Salt Master configuration.

    Additional Information

    For organizations seeking enhanced usability, SaltStack Config offers a graphical interface to streamline workflow management. Additionally, SALT's integration with VMware Tanzu provides advanced automation for enterprise systems.

    Installation Example

    On a master node (e.g., RedHat):

    sudo yum install salt-master
    

    On minion nodes:

    sudo yum install salt-minion
    

    Configure /etc/salt/minion with:

    master: your-master-hostname
    

    Then start the minion:

    sudo systemctl enable --now salt-minion
    

    Accept the minion on the master:

    sudo salt-key -L         # list all keys
    sudo salt-key -A         # accept all pending minion keys
    

    Where to Go Next

    • Salt Project Docs

    • Git-based states with gitfs

    • Masterless setups for container deployments

    • Custom modules in Python

    • Event-driven orchestration with beacons + reactors

    Large 600+ Server Patching in 3 Regions with 3 different Environments Example

    Let give an example of have 3 different environments DEV (Development), PREP (Preproduction), and PROD (Production), now let's dig a little deeper and say we have 3 different regions EUS (East US), WUS (West US), and EUR (European) and we would like these patches to be applied on changing dates, such as DEV will be patched on 3 days after the second Tuesday, PREP will be patched on 5 days after the second Tuesday, and PROD will be 5 days after the 3rd Tuesday. The final clause to this mass configuration is, we would like the patches to be applied on the Client Local Time.

    In many configurations such as AUM, or JetPatch, you would need several different Maintenace Schedules or plans to create this setup. With SALT, the configuration lies inside the minion, so configuration is much more defined, and simple to manage.

    Use Case Recap

    You want to patch three environment groups based on local time and specific schedules:

    Environment

    Schedule Rule

    Timezone

    Dev

    3rd day after 2nd Tuesday of the month

    Local

    PREP

    5th day after 2nd Tuesday of the month

    Local

    Prod

    5th day after 3rd Tuesday of the month

    Local

    Each server knows its environment via Salt grains, and the local timezone via OS or timedatectl.

    Step-by-Step Plan

    1. Set Custom Grains for Environment & Region

    2. Create a Python script (run daily) that:

      • Checks if today matches the schedule per group

      • If yes, uses Salt to target minions with the correct grain and run patching

    3. Schedule this script via cron or Salt scheduler

    4. Use Salt States to define patching

    Step 1: Define Custom Grains

    On each minion, configure /etc/salt/minion.d/env_grains.conf:

    grains:
      environment: dev   # or prep, prod
      region: us-east    # or us-west, eu-central, etc.
    

    Then restart the minion:

    sudo systemctl restart salt-minion
    

    Verify:

    salt '*' grains.items
    

    Step 2: Salt State for Patching

    Create patching/init.sls:

    update-packages:
      pkg.uptodate:
        - refresh: True
        - retry:
            attempts: 3
            interval: 15
    
    reboot-if-needed:
      module.run:
        - name: system.reboot
        - onlyif: 'test -f /var/run/reboot-required'
    

    Step 3: Python Script to Orchestrate Patching

    Let’s build run_patching.py. It:

    • Figures out the correct date for patching

    • Uses salt CLI to run patching for each group

    • Handles each group in its region and timezone

    #!/usr/bin/env python3
    import subprocess
    import datetime
    import pytz
    from dateutil.relativedelta import relativedelta, TU
    
    # Define your environments and their rules
    envs = {
        "dev": {"offset": 3, "week": 2},
        "prep": {"offset": 5, "week": 2},
        "prod": {"offset": 5, "week": 3}
    }
    
    # Map environments to regions (optional)
    regions = {
        "dev": ["us-east", "us-west"],
        "prep": ["us-east", "eu-central"],
        "prod": ["us-east", "us-west", "eu-central"]
    }
    
    # Timezones per region
    region_tz = {
        "us-east": "America/New_York",
        "us-west": "America/Los_Angeles",
        "eu-central": "Europe/Berlin"
    }
    
    def calculate_patch_date(year, month, week, offset):
        second_tuesday = datetime.date(year, month, 1) + relativedelta(weekday=TU(week))
        return second_tuesday + datetime.timedelta(days=offset)
    
    def is_today_patch_day(env, region):
        now = datetime.datetime.now(pytz.timezone(region_tz[region]))
        target_day = calculate_patch_date(now.year, now.month, envs[env]["week"], envs[env]["offset"])
        return now.date() == target_day and now.hour >= desired_hour
    
    def run_salt_target(environment, region):
        target = f"environment:{environment} and region:{region}"
        print(f"Patching {target}...")
        subprocess.run([
            "salt", "-C", target, "state.apply", "patching"
        ])
    
    def main():
        for env in envs:
            for region in regions[env]:
                if is_today_patch_day(env, region):
                    run_salt_target(env, region)
    
    if __name__ == "__main__":
        main()
    

    Make it executable:

    chmod +x /srv/scripts/run_patching.py
    

    Test it:

    ./run_patching.py
    

    Step 4: Schedule via Cron (on Master)

    Edit crontab:

    crontab -e
    

    Add daily job:

    # Run daily at 6 AM UTC
    0 6 * * * /srv/scripts/run_patching.py >> /var/log/salt/patching.log 2>&1
    

    This assumes the local time logic is handled in the script using each region’s timezone.

    Security & Safety Tips

    • Test patching states on a few dev nodes first (salt -G 'environment:dev' -l debug state.apply patching)

    • Add Slack/email notifications (Salt Reactor or Python smtplib)

    • Consider dry-run support with test=True (in pkg.uptodate)

    • Use salt-run jobs.list_jobs to track job execution

    Optional Enhancements

    • Use Salt Beacons + Reactors to monitor and patch in real-time

    • Integrate with JetPatch or Ansible for hybrid control

    • Add patch deferral logic for critical services

    • Write to a central patching log DB with job status per host

    Overall Architecture

    Minions:

    • Monitor the date/time via beacons

    • On patch day (based on local logic), send a custom event to the master

    Master:

    • Reacts to that event via a reactor

    • Targets the sending minion and applies the patching state

    Step-by-Step: Salt Beacon + Reactor Model

    1. Define a Beacon on Each Minion

    File: /etc/salt/minion.d/patchday_beacon.conf

    beacons:
      patchday:
        interval: 3600  # check every hour
    

    This refers to a custom beacon we will define.

    2. Create the Custom Beacon (on all minions)

    File: /srv/salt/_beacons/patchday.py

    import datetime
    from dateutil.relativedelta import relativedelta, TU
    import pytz
    
    __virtualname__ = 'patchday'
    
    def beacon(config):
        ret = []
    
        grains = __grains__
        env = grains.get('environment', 'unknown')
        region = grains.get('region', 'unknown')
    
        # Define rules
        rules = {
            "dev": {"offset": 3, "week": 2},
            "prep": {"offset": 5, "week": 2},
            "prod": {"offset": 5, "week": 3}
        }
    
        region_tz = {
            "us-east": "America/New_York",
            "us-west": "America/Los_Angeles",
            "eu-central": "Europe/Berlin"
        }
    
        if env not in rules or region not in region_tz:
            return ret  # invalid or missing config
    
        tz = pytz.timezone(region_tz[region])
        now = datetime.datetime.now(tz)
        rule = rules[env]
    
        patch_day = (datetime.date(now.year, now.month, 1)
                     + relativedelta(weekday=TU(rule["week"]))
                     + datetime.timedelta(days=rule["offset"]))
    
        if now.date() == patch_day:
            ret.append({
                "tag": "patch/ready",
                "env": env,
                "region": region,
                "datetime": now.isoformat()
            })
    
        return ret
    

    3. Sync Custom Beacon to Minions

    On the master:

    salt '*' saltutil.sync_beacons
    

    Enable it:

    salt '*' beacons.add patchday '{"interval": 3600}'
    

    4. Define Reactor on the Master

    File: /etc/salt/master.d/reactor.conf

    reactor:
      - 'patch/ready':
        - /srv/reactor/start_patch.sls
    

    5. Create Reactor SLS File

    File: /srv/reactor/start_patch.sls

    {% set minion_id = data['id'] %}
    
    run_patching:
      local.state.apply:
        - tgt: {{ minion_id }}
        - arg:
          - patching
    

    This reacts to patch/ready event and applies the patching state to the calling minion.

    6. Testing the Full Flow

    1. Restart the minion: systemctl restart salt-minion

    2. Confirm the beacon is registered: salt '*' beacons.list

    3. Trigger a manual test (simulate patch day by modifying date logic)

    4. Watch events on master:

    salt-run state.event pretty=True
    
    1. Confirm patching applied:

    salt '*' saltutil.running
    

    7. Example: patching/init.sls

    Already shared, but here it is again for completeness:

    update-packages:
      pkg.uptodate:
        - refresh: True
        - retry:
            attempts: 3
            interval: 15
    
    reboot-if-needed:
      module.run:
        - name: system.reboot
        - onlyif: 'test -f /var/run/reboot-required'
    

    Benefits of This Model

    • Real-time and event-driven – no need for polling or external scripts

    • Timezone-aware, thanks to local beacon logic

    • Self-healing – minions signal readiness independently

    • Audit trail – each event is logged in Salt’s event bus

    • Extensible – you can easily add Slack/email alerts via additional reactors

    Goal

    1. Track patching event completions per minion

    2. Store patch event metadata: who patched, when, result, OS, IP, environment, region, etc.

    3. Generate readable reports in:

      • CSV/Excel

      • HTML dashboard

      • JSON for API or SIEM ingestion

    Step 1: Customize Reactor to Log Completion

    Let’s log each successful patch into a central log file or database (like SQLite or MariaDB).

    Update Reactor: /srv/reactor/start_patch.sls

    Add a returner to store job status.

    {% set minion_id = data['id'] %}
    
    run_patching:
      local.state.apply:
        - tgt: {{ minion_id }}
        - arg:
          - patching
        - kwarg:
            returner: local_json  # You can also use 'mysql', 'elasticsearch', etc.
    

    Configure Returner (e.g., local_json)

    In /etc/salt/master:

    returner_dirs:
      - /srv/salt/returners
    
    ext_returners:
      local_json:
        file: /var/log/salt/patch_report.json
    

    Or use a MySQL returner:

    mysql.host: 'localhost'
    mysql.user: 'salt'
    mysql.pass: 'yourpassword'
    mysql.db: 'salt'
    mysql.port: 3306
    

    Enable returners:

    salt-run saltutil.sync_returners
    

    Step 2: Normalize Patch Data (Optional Post-Processor)

    If using JSON log, create a post-processing script to build reports:

    process_patch_log.py

    import json
    import csv
    from datetime import datetime
    
    def load_events(log_file):
        with open(log_file, 'r') as f:
            return [json.loads(line) for line in f if line.strip()]
    
    def export_csv(events, out_file):
        with open(out_file, 'w', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=[
                'minion', 'date', 'environment', 'region', 'result'
            ])
            writer.writeheader()
            for e in events:
                writer.writerow({
                    'minion': e['id'],
                    'date': datetime.fromtimestamp(e['_stamp']).isoformat(),
                    'environment': e['return'].get('grains', {}).get('environment', 'unknown'),
                    'region': e['return'].get('grains', {}).get('region', 'unknown'),
                    'result': 'success' if e['success'] else 'failure'
                })
    
    events = load_events('/var/log/salt/patch_report.json')
    export_csv(events, '/srv/reports/patching_report.csv')
    

    Step 3: Build a Simple Web Dashboard

    If you want to display reports via a browser:

    🛠 Tools:

    • Flask or FastAPI

    • Bootstrap or Chart.js

    • Reads JSON/CSV and renders:

    Example Chart Dashboard Features:

    • Last patch date per server

    • 📍 Patching success rate per region/env

    • 🔴 Highlight failed patching

    • 📆 Monthly compliance timeline

    Would you like a working example of that Flask dashboard? I can include the full codebase if so.

    Step 4: Send Reports via Email (Optional)

    🐍 Python: send_report_email.py

    import smtplib
    from email.message import EmailMessage
    
    msg = EmailMessage()
    msg["Subject"] = "Monthly Patch Report"
    msg["From"] = "patchbot@example.com"
    msg["To"] = "it-lead@example.com"
    msg.set_content("Attached is the patch compliance report.")
    
    with open("/srv/reports/patching_report.csv", "rb") as f:
        msg.add_attachment(f.read(), maintype="text", subtype="csv", filename="patching_report.csv")
    
    with smtplib.SMTP("localhost") as s:
        s.send_message(msg)
    

    Schedule that weekly or monthly with cron.

    Flask Dashboard (Patch Reporting)

    app.py

    from flask import Flask, render_template
    import csv
    from collections import defaultdict
    
    app = Flask(__name__)
    
    @app.route('/')
    def index():
        results = []
        success_count = defaultdict(int)
        fail_count = defaultdict(int)
    
        with open('/srv/reports/patching_report.csv', 'r') as f:
            reader = csv.DictReader(f)
            for row in reader:
                results.append(row)
                key = f"{row['environment']} - {row['region']}"
                if row['result'] == 'success':
                    success_count[key] += 1
                else:
                    fail_count[key] += 1
    
        summary = [
            {"group": k, "success": success_count[k], "fail": fail_count[k]}
            for k in sorted(set(success_count) | set(fail_count))
        ]
    
        return render_template('dashboard.html', results=results, summary=summary)
    
    if __name__ == '__main__':
        app.run(debug=True, host='0.0.0.0', port=5000)
    

    templates/dashboard.html

    <!DOCTYPE html>
    <html>
    <head>
      <title>Patch Compliance Dashboard</title>
      <style>
        body { font-family: Arial; padding: 20px; }
        table { border-collapse: collapse; width: 100%; margin-bottom: 30px; }
        th, td { border: 1px solid #ccc; padding: 8px; text-align: left; }
        th { background-color: #f4f4f4; }
        .fail { background-color: #fdd; }
        .success { background-color: #dfd; }
      </style>
    </head>
    <body>
      <h1>Patch Compliance Dashboard</h1>
    
      <h2>Summary</h2>
      <table>
        <tr><th>Group</th><th>Success</th><th>Failure</th></tr>
        {% for row in summary %}
        <tr>
          <td>{{ row.group }}</td>
          <td>{{ row.success }}</td>
          <td>{{ row.fail }}</td>
        </tr>
        {% endfor %}
      </table>
    
      <h2>Detailed Results</h2>
      <table>
        <tr><th>Minion</th><th>Date</th><th>Environment</th><th>Region</th><th>Result</th></tr>
        {% for row in results %}
        <tr class="{{ row.result }}">
          <td>{{ row.minion }}</td>
          <td>{{ row.date }}</td>
          <td>{{ row.environment }}</td>
          <td>{{ row.region }}</td>
          <td>{{ row.result }}</td>
        </tr>
        {% endfor %}
      </table>
    </body>
    </html>
    

    How to Use

    pip install flask
    python app.py
    

    Then visit http://localhost:5000 or your server’s IP at port 5000.

    Optional: SIEM/Event Forwarding

    If you use Elasticsearch, Splunk, or Mezmo:

    • Use a returner like es_return, splunk_return, or send via custom script using REST API.

    • Normalize fields: hostname, env, os, patch time, result

    • Filter dashboards by compliance groupings

    TL;DR: Reporting Components Checklist

    Component

    Purpose

    Tool

    JSON/DB logging

    Track patch status

    Returners

    Post-processing script

    Normalize data for business

    Python

    CSV/Excel export

    Shareable report format

    Python csv module

    HTML dashboard

    Visualize trends/compliance

    Flask, Chart.js, Bootstrap

    Email automation

    Notify stakeholders

    smtplib, cron

    SIEM/Splunk integration

    Enterprise log ingestion

    REST API or native returners

    Recent Entries

  5. Linux Tips

    A blog by Blogger in CodeName Blogs
    • 73 Entries
    • 0 Comments
    • 1959 Views
    Blogger
    by: Adnan Shabbir
    Wed, 28 May 2025 05:55:55 +0000


    Ubuntu 25.04, codenamed Plucky Puffin, released in April 2025, is an interim release supported for 9 months (until Jan 2026). Ubuntu 25.04 is equipped with experimental features that will be tested until the next LTS, 26.04, and if declared stable, these features will be carried forward and may be part of Ubuntu 26.04, the next Ubuntu LTS in line.

    In today’s guide, I’ll give you a brief overview of Ubuntu 25.04, what it looks like, and what other features are included in the development and testing.

    Outline:

    What’s New in Ubuntu 25.04 Codenamed Plucky Puffin?

    With every interim release (just like Ubuntu 25.04), there comes a list of new features to be tested and some improvements to existing functionalities. This time we are focusing on Ubuntu 25.04, some major as well as minor updates will be provided:

    GNOME 48

    Ubuntu 24.04 is based on GNOME 46, whereas at the moment of writing this post, Ubuntu 25.04 is being experimented with GNOME 48. As of now, GNOME 48 is more modern and graphics-friendly, which is always, i.e., the latest version is supposed to overcome the deficiency of the previous GNOME version and improve over time.

    Kernel 6.14

    The kernel is the central nervous system of Linux, i.e., a bridge between the hardware and the software. Ubuntu 25.04 comes with a Kernel 6.14 (Upstream), i.e., developed and maintained by Linus Torvalds and the Linux kernel maintainers.

    The first official release of Ubuntu 24.04 contained the Kernel 6.8. However, Ubuntu 24.04.2 is now updated to the Linux Kernel 6.11.

    Security Center

    Although Ubuntu is an open-source OS and is more secure than other OSs. However, to align with this top-tech era, Ubuntu might be seeking some additional application support. These applications require some permissions that a user has to give for smooth functionality. To deal with such permissions, Ubuntu has released a Security Center in this release, so that users may turn on or off the permissions.

    Here’s the initial interface of the Security Center, where you can see that the feature is experimental at the moment.

    If you enable it, the strictly confined apps request permissions. The app permissions can be checked in the settings, i.e., “Settings > Apps

    Updated apt Installation Interface

    An interactive UI for the apt-based installations and uninstallations:

    Uninstalling:

    Well-Being

    This is about the well-being of the Ubuntu lovers. The users can enable it and set the following features:

    • Screen Time: Set the average screen time usage.
    • Eyesight Reminder: A reminder to look away from the screen.
    • Movement Reminder: A reminder to move around.

    Document Viewer (PDF Viewer)

    Ubuntu 25.04 is now equipped with a built-in Document Viewer for various types of files. You can open a variety of files on this viewer, i.e., PDF, comic books, DjVU, and TIFF documents. Here’s the document viewer:

    HDR Display – High Dynamic Range

    High Dynamic Range (HDR) is a state-of-the-art technology to provide better display with advanced coloring sense of the HDR technology. This is one of the significant additions in this update list. If you have an HDR monitor, now, you can attach it to your Ubuntu 25.04 to experience HDR displays.

    Head over to “Settings > Display > HDR” to manage it.

    Other Notable Updates in Ubuntu 25.04

    Color to Color Management:

    The Color section in the “Settings” has been replaced with Color Management in the Settings.

    Timezone in Events:

    Ubuntu 25.04 provides timezone support while creating events in the calendar. Here’s how you can locate it in the Calendar app of Ubuntu 25.04:

    JPEG XL Image Support:

    JPEG XL is an image type (an enhanced JPEG), and now it is supported by Ubuntu and providing a better experience for the users.

    Notification Grouping:

    Ubuntu 25.04 has now offered a notification grouping inside the notifications, making it easier for users to navigate through multiple notifications.

    Yaru Theme:

    The icon and theme experience is better than the previous releases. The icons are now more dynamic and are well integrated with the accent color support.

    Updated Network Manager:

    Ubuntu 25.04 has an updated Network Manager 1.52, whereas Ubuntu 24.04.2 (released parallel to Ubuntu 25.04) has 1.46. The significant change is that Network Manager 1.52 is more aligned towards IPv6 as compared to the 1.46 version.

    Chrony (Network Time Protocol):

    Ubuntu 25.04 has adopted Chrony as its Network Time Protocol client (SUSE and RHEL inspired), which synchronizes the system time as per the NTP servers, i.e., a GPS receiver.

    Until now, Ubuntu has been using “systemd-timesync” as its Network Time Protocol client, which is also known as SNTP (Simple Network Time Protocol). The SNTP synchronizes the system clock with the remote server and has less accuracy when compared with Chrony (Full NTP).

    • What is NTP? The purpose of the NTP is to synchronize the clocks of the systems over a network to ensure the security, performance, event coordination, and logging. NTP ensures the time sync is as accurate as possible, i.e., in milliseconds / submilliseconds.

    Developer Tools and Libraries:

    Since Ubuntu is well-liked in the developer community, the Ubuntu contributors continuously work on providing updated tools. Ubuntu 25.04 is equipped with updated tools, i.e., Python, GCC, Rust, and Go.

    Similarly, a few of the developers associated libraries are also upgraded, i.e., glibc, binutils, and OpenSSL.

    Gaming Support (NVIDIA Dynamic Boost):

    The NVIDIA dynamic boost enables the gamer to manage the power between the CPU and GPU. This is now enabled by default in Ubuntu 25.04.

    System Monitor’s Interface:

    Ubuntu’s system monitor shows information about the processes, resources, and file systems. In Ubuntu 25.04, there is a slight change in the interface of the Ubuntu System Monitor. For instance, the info inside the processes tab is restricted to, i.e., ID, CPU, Memory, Disk Write, and Disk Read. Here’s the interface where you can see this.

    However, in older versions, the Processes tab has some additional info for each process:

    That’s all from the notable features of Ubuntu 25.04.

    Would you like to upgrade your Ubuntu to Ubuntu 25.04?

    How to Upgrade to Ubuntu 25.04 Plucky Puffin

    If you are using any other release of Ubuntu (Ubuntu 25.10 or Ubuntu 24.04), you can easily upgrade to Ubuntu 25.04. Let’s go through the steps to upgrade:

    Important Note: If you are using a Ubuntu LTS release other than Ubuntu 24.04, then you have to first upgrade to Ubuntu 24.04:

    Once upgraded to Ubuntu 24.04, you are now ready to follow the steps below and upgrade to Ubuntu 24.10.

    Step 1: Upgrade Your Ubuntu to Ubuntu 24.10

    Since it is an interim release, you must have the previous release installed to get Ubuntu 25.04. Here’s how you can upgrade to Ubuntu 24.10:

    • Update and upgrade the system repositories:
    sudo apt update && sudo apt upgrade

    Note: It is recommended to use “sudo apt autoremove” after update/upgrade, to clean up the system from any useless dependencies/packages that are not required.

    • If you are using Ubuntu 24.04 LTS, then you have to enable the non-LTS release upgrade. For that, open the release-upgrader file in an editor:
    sudo nano /etc/update-manager/release-upgrades

    Now, change the “Prompt” parameter’s value from “lts” to “normal”, as can be seen below:

    • Start the upgrade using the do-release-upgrade command:
    sudo do-release-upgrade

    Here you go:

    Press “y” to proceed with the installation:

    While upgrading, you will be prompted several times asking for acceptance of the changes being processed:

    Step 2: Upgrade to Ubuntu 25.04

    Once you are in Ubuntu 24.10, use the do-release command again to upgrade to Ubuntu 25.04:

    sudo do-release-upgrade

    Note: If you get any prompt like “please install all updates available for your release”, then use the command “sudo apt dist-upgrade” and reboot to fix it.

    Here’s the Ubuntu 25.04:

    That’s all from this guide.

    Conclusion

    Ubuntu 25.04, codenamed “Plucky Puffin”, is an interim Ubuntu release supported for 9 months. Ubuntu 25.04, released in April 2025, features the updated GNOME (48), updated Kernel (6.14), an improved apt version (3.0), and a security center. Other features include the HDR display, enhanced color management, timezone support in events, etc.

    This post briefly lists the notable features of Ubuntu 25.04 and also explains the process to upgrade to Ubuntu 25.04.

    FAQS

    How Long Will Ubuntu 25.04 be Supported?

    Ubuntu 25.04 will be supported until January 2026. Since Ubuntu 25.04 is an interim release and an Ubuntu interim release is supported for 9 months after its release.

    Is Ubuntu 25.04 LTS?

    No, Ubuntu 25.04 is an interim release, not an LTS. The current latest LTS is Ubuntu 24.04 codenamed Noble Numba, and the next in line LTS is Ubuntu 26.04.

    How to Upgrade to Ubuntu 25.04?

    First, upgrade to Ubuntu 24.04, then to 24.10, and from there, you can upgrade to Ubuntu 25.10.

    Recent Entries

  6. Opinion Blogs

    • 0 Entries
    • 0 Comments
    • 151 Views

    No blog entries yet

Important Information

Terms of Use Privacy Policy Guidelines We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.