Home Linux AdministrationHow To Install And Manage Software From Source Using GNU Stow In Linux

How To Install And Manage Software From Source Using GNU Stow In Linux

Simplify Your Workflow: Manage Source-Built Software with GNU Stow (Linux)

By sk
Published: Updated: 2635 views 13 mins read

When you install software from source, it often ends up in various directories across your system (like /usr/local/bin, /usr/local/lib, etc.).

Over time, managing these files can become a hassle, especially if you want to remove or update a package. GNU Stow addresses this problem by organizing software installations in a clean and maintainable way.

In this detailed tutorial, we will discuss what GNU Stow is and how to use GNU Stow to install and manage software from source in an efficient and organised way in Linux.

What is GNU Stow?

GNU Stow is a symlink farm manager that helps manage the installation of software packages in Linux and Unix-like systems. It uses symbolic links to simplify the management of software installed from source code.

The primary purpose of GNU Stow is to help organize files and directories in a way that allows for easy management and maintenance.

It works by creating symbolic links in a parent directory to the files and directories in the installed packages.

This approach allows multiple packages to coexist in the same directory without interfering with each other, as each package's files are kept separate and are linked into place as needed.

GNU Stow is particularly popular among users who prefer to manage their own software installations and configurations, as it provides a clean and efficient way to keep everything organized.

It is also commonly used in conjunction with version control systems to manage configuration files and other resources that need to be shared across different machines or environments.

GNU Stow is a free, open-source tool, and part of the GNU project.

How GNU Stow Works

Stow assumes each software package is stored in its own directory. For example, you might have /usr/local/stow/package1 and /usr/local/stow/package2.

When you "stow" a package, Stow creates symbolic links from the package directory to the appropriate locations in your filesystem. For example, it might link /usr/local/stow/package1/bin/program to /usr/local/bin/program.

To install a package, you navigate to the directory containing the stow-managed directories and run stow package1. This creates the necessary symbolic links. To uninstall, you run stow -D package1, which removes the links.

GNU Stow Features

Key features of GNU Stow include:

  1. Symbolic Links: Stow creates symbolic links to the files and directories of each package, pointing to their actual locations. This ensures that the files appear to be in the correct place without actually being there, which helps avoid conflicts between different packages.
  2. Package Management: It is useful for managing software that is installed in user-specific or system-wide directories, especially when dealing with configuration files or scripts that need to be in specific locations.
  3. Easy Upgrades and Removals: Upgrading or removing a package managed by Stow is straightforward, as it involves simply updating or deleting the package's directory. Stow automatically updates or removes the corresponding symbolic links.
  4. Flexible Configuration: Users can configure Stow to suit their needs, including specifying the target directory for the links and handling different types of files.

Advantages

Using GNU Stow in your workflow brings the following three major advantages:

1. Simplifies Package Management:

You can easily install, update, and remove software packages. You can even install multiple versions of same package from source.

2. Avoids Conflicts:

Since each package is in its own directory, there’s less chance of file conflicts.

3. Reproducibility:

Makes it easier to reproduce and document the software environment.

Use Case

GNU Stow is useful for developers who compile and install software from source regularly. It’s also handy for managing dotfiles (configuration files), as it can maintain a consistent setup across different systems.

General Usage

To install a package:

cd /usr/local/stow
stow package1

To uninstall a package:

cd /usr/local/stow
stow -D package1

By using GNU Stow, you can keep your system organized and reduce the complexity of managing software installations.

Install Software from Source using GNU Stow

For the demonstration purpose, we will see how to install the latest version of curl using GNU Stow on a Linux system.

1. Update Your System:

Ensure your system package database is up-to-date.

sudo apt update   # For Debian/Ubuntu-based systems
sudo yum update   # For CentOS/RHEL systems
sudo dnf update   # For Fedora systems
sudo pacman -Syu  # For Arch Linux systems

2. Install Required Development Tools:

Install the necessary development tools if they are not already installed.

sudo apt install build-essential   # Debian/Ubuntu
sudo yum groupinstall "Development Tools"   # CentOS/RHEL
sudo dnf groupinstall "Development Tools"   # Fedora
sudo pacman -S base-devel   # Arch Linux

You will also need to install the OpenSSL development libraries if you want to compile curl with the OpenSSL backend. For example on Debian-based systems, you can install OpenSSL development libraries using command:

sudo apt install libssl-dev

If you want to compile curl with the GnuTLS backend, install the following on a Debian-based systems:

sudo apt install libgnutls28-dev libgnutls30

3. Install GNU Stow:

Ensure GNU Stow is installed.

sudo pacman -S stow     # Arch Linux
sudo apt install stow   # Debian/Ubuntu
sudo yum install stow   # Older CentOS/RHEL
sudo dnf install stow   # Latest Fedora/RHEL/AlmaLinux/Rocky Linux

4. Download and Extract curl Source Code:

Download the latest Curl source code from its official releases page and extract it.

wget https://github.com/curl/curl/releases/download/curl-8_8_0/curl-8.8.0.tar.gz
tar xvf curl-8.8.0.tar.gz

5. Configure the Build with the Prefix:

Cd into the extracted directory:

cd curl-8.8.0

Configure the Build with the TLS backend and installation directory to be managed by GNU Stow.

./configure --with-ssl --prefix=/usr/local/stow/curl-8.8.0

If you want to configure Curl with GnuTLS, use this command instead:

./configure --with-gnutls --prefix=/usr/local/stow/curl-8.8.0

6. Compile the Software:

make

7. Install the Software:

sudo make install

8. Use GNU Stow to Manage the Installation:

Change to the stow directory and use stow to manage the installation.

cd /usr/local/stow
sudo stow curl-8.8.0

9. Verify the Installation:

Verify that Curl is correctly installed and accessible.

curl --version

Sample Output:

curl 8.8.0 (x86_64-pc-linux-gnu) libcurl/8.8.0 OpenSSL/1.1.1w zlib/1.2.11
Release-Date: 2024-05-22
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile libz NTLM SSL threadsafe TLS-SRP UnixSockets
Check Curl Version
Check Curl Version

By following these steps, you will have installed the latest version of curl using GNU Stow, ensuring a clean and organized installation.

Update Software from Older Version

To update from an earlier version of Curl (e.g., 8.7.1) to the latest version (e.g., 8.8.0) using GNU Stow, you can follow these steps:

1. Uninstall the Old Version:

First, you need to uninstall the old version of Curl. Since you installed it using GNU Stow, you can simply unstow it.

cd /usr/local/stow
sudo stow -D curl-8.7.1

And then, go back to your home directory:

cd

2. Download and Extract the Latest Curl Source Code:

Download the latest version of Curl and extract it.

wget https://github.com/curl/curl/releases/download/curl-8_8_0/curl-8.8.0.tar.gz
tar -xzf curl-8.8.0.tar.gz
cd curl-8.8.0

3. Configure and Build the Latest Curl:

Configure the build environment and compile the latest version of Curl.

./configure --with-ssl --prefix=/usr/local/stow/curl-8.8.0
[or]
./configure --with-gnutls --prefix=/usr/local/stow/curl-8.8.0
make
sudo make install

4. Use GNU Stow to Manage the New Installation:

cd /usr/local/stow
sudo stow curl-8.8.0

5. Verify the Update:

Verify that the latest version of Curl is correctly installed and accessible.

curl --version

6. Remove the Older Version (Optional):

While GNU Stow will unlink the old version, it won't remove the old directory. To fully remove the old version of Curl after installing the new one:

sudo rm -rf /usr/local/stow/curl-8.7.1

This process ensures that you can easily manage and update multiple versions of Curl using GNU Stow, making it convenient to switch between different versions if needed.

Advanced Usage of GNU Stow

GNU Stow offers several advanced options and features that can enhance its utility and flexibility. Here are some of them:

1. Relocatable Packages:

Stow allows you to create packages that can be relocated without changing their contents. This means the same package can be stowed in different places without modifying the files.

You can use the --dir and --target options to specify the source directory of the packages and the target directory where the symlinks should be created.

Example:

stow --dir=/path/to/packages --target=/usr/local package_name

2. Simulating Stow Operations:

Before making actual changes, you can simulate stow operations to see what would happen. This helps avoid mistakes.

We can use the -n or --no option to perform a dry run.

Example:

stow -n package_name

3. Verbose Output:

Get detailed information about what stow is doing. This can be useful for debugging or understanding the actions being performed.

Use the -v or --verbose option to view detailed information.

Example:

stow -v package_name

4. Ignoring Files and Directories:

You can tell Stow to ignore certain files or directories within the package.

Create a .stow-local-ignore file in the package directory listing the files or directories to ignore.

Example:

Create a .stow-local-ignore file with the following content:

.git
README.md

5. Restow and Destow:

Restow: This operation first unstows the package and then stows it again. It’s useful for refreshing symlinks after making changes to the package contents.

Usage:

stow -R package_name

Destow: This operation removes the symlinks created by stow.

Usage:

stow -D package_name

6. Adopting Pre-existing Files:

Stow can adopt files that already exist in the target directory. This is useful for bringing existing files under stow’s management without having to move them manually.

Use the --adopt option.

Example:

stow --adopt package_name

7. Conflict Handling:

Stow can detect and handle conflicts between packages.

Use the --override option to forcefully overwrite existing files.

Example:

stow --override package_name

8. Custom Stow Directories:

You can specify custom directories for stowing packages, which allows for more flexibility in organizing your software.

Use the --dir option to specify the source directory and --target to specify the target directory.

Example:

stow --dir=/custom/source --target=/custom/target package_name

For a complete list of options, you can refer to the stow man page:

man stow

Example: Using Multiple Options

Here’s an example that combines several advanced options:

stow --dir=/path/to/packages --target=/usr/local --verbose --no --adopt --override package_name

Here's a breakdown of each option:

  • --dir: Specifies the source directory of the package.
  • --target: Specifies the target directory for the symlinks.
  • --verbose: Provides detailed output of the operation.
  • --no: Performs a dry run to simulate the operation.
  • --adopt: Adopts pre-existing files in the target directory.
  • --override: Forcefully overwrites existing files.

GNU Stow Cheat Sheet

1. Stow a package:

stow package_name

Creates symlinks for package_name in the parent directory.

2. Unstow a package:

stow -D package_name

Removes symlinks for package_name.

3. Restow a package:

stow -R package_name

Unstows and then re-stows package_name.

4. Specify source directory:

stow --dir=/path/to/packages package_name

Sets the source directory where packages are located.

5. Specify target directory:

stow --target=/path/to/target package_name

Sets the target directory where symlinks should be created.

6. Simulate the operation (dry run):

stow -n package_name

Performs a dry run without making any changes.

7. Verbose output:

stow -v package_name

Provides detailed output of the operation.

8. Adopt pre-existing files:

stow --adopt package_name

Adopts existing files in the target directory.

9. Force override conflicts:

stow --override package_name

Overwrites existing files in the target directory.

10. Ignore specific files or directories:

Create a .stow-local-ignore file in the package directory with the files or directories to ignore.

Example .stow-local-ignore content:

.git
README.md

11. Stow a package from a custom directory to a custom target:

stow --dir=/path/to/packages --target=/path/to/target package_name

12. Unstow a package and remove its directory:

stow -D package_name
sudo rm -rf /usr/local/stow/package_name

13. Restow a package with verbose output:

stow -Rv package_name

14. Adopt existing files into Stow management:

stow --adopt package_name

15. Dry run to check what would happen:

stow -n package_name

Summary of Options

  • -D / --delete: Unstows a package by removing its symlinks.
  • -R / --restow: Unstows and re-stows a package.
  • -n / --no: Dry run (simulate the operation).
  • -v / --verbose: Verbose output.
  • --dir: Specify the source directory.
  • --target: Specify the target directory.
  • --adopt: Adopt pre-existing files.
  • --override: Force overwrite of existing files.

Example Workflow

1. Stow a new package:

cd /usr/local/stow
sudo stow package_name

2. Unstow an old package and remove its directory:

sudo stow -D old_package_name
sudo rm -rf /usr/local/stow/old_package_name

3. Restow a package after making changes:

cd /usr/local/stow
sudo stow -R package_name

4. Adopt existing files in the target directory:

cd /usr/local/stow
sudo stow --adopt package_name

5. Simulate stowing a package to check for errors:

cd /usr/local/stow
stow -n package_name

Frequently Asked Questions

Q: What is GNU Stow?

A: GNU Stow is a handy tool for Linux that helps you manage software you compile from source code. Instead of directly installing the software in system directories like /usr/local, Stow keeps things organized by:

  • Storing the software in its own directory: This prevents conflicts with other programs and keeps your system clean.
  • Creating symbolic links: These links act like shortcuts, pointing to the actual program files in their separate directories. From your perspective, the software appears installed normally, but Stow manages the links behind the scenes.

Q: How do I install GNU Stow?

A: GNU Stow can typically be installed via your distribution's package manager. For example, on Debian-based systems, you can install it using:

sudo apt-get install stow

On Red Hat-based systems, you can use:

sudo dnf install stow

Q: How do I use GNU Stow to manage packages?

A: To use GNU Stow, you first need to install your software into a directory structure that Stow can manage. For example, if you have a package in /usr/local/stow/mypackage, you can make it appear in /usr/local by running:

cd /usr/local/stow
sudo stow mypackage

Q: How can I manage multiple versions of the same software with GNU Stow?

A: You can install each version of the software into its own directory under the Stow directory (e.g., /usr/local/stow/mypackage-1.0 and /usr/local/stow/mypackage-2.0). To switch between versions, simply unstow the current version and stow the desired version:

cd /usr/local/stow
sudo stow -D mypackage-1.0  # Unstow version 1.0
sudo stow mypackage-2.0     # Stow version 2.0

Q: What happens if there are conflicts or overlaps between packages?

A: GNU Stow will warn you if there are conflicts or overlaps between the packages you are trying to stow. You can resolve these conflicts by manually adjusting the directory structure or by using the --adopt option to let Stow take ownership of the conflicting files.

Q: How do I uninstall a package managed by GNU Stow?

A: To uninstall a package, you simply need to unstow it:

cd /usr/local/stow
sudo stow -D mypackage

This will remove the symlinks created by Stow, effectively "uninstalling" the package.

Q: Can I use a different directory for Stow?

A: Yes, you can specify a different directory for Stow using the -d option. For example, if you want to use /opt/stow as your Stow directory, you can run:

sudo stow -d /opt/stow mypackage

Q: Are there any advanced options or features in GNU Stow?

A: Yes, GNU Stow has several advanced options, including:

  • --ignore=PATTERN: Ignore files matching a specific pattern.
  • --defer=PATTERN: Defer handling of files matching a specific pattern.
  • --adopt: Adopt existing files into the Stow package.
  • --no-folding: Disable directory folding.

Q: What should I do if GNU Stow is not working as expected?

A: If you encounter issues, you can check the following:

  • Ensure that the directories you are managing with Stow are correctly structured.
  • Verify that there are no permission issues by running Stow with elevated privileges (sudo).
  • Review the output of Stow for any warnings or errors.
  • Consult the stow man page or the GNU Stow documentation for additional guidance.

Key Takeaways

GNU Stow is a useful tool for managing software installations and configurations.

  • GNU Stow is a free and open source Symlink farm manager.
  • It's primarily used to manage the installation of software packages, keeping them organized in separate directories.
  • Stow creates symlinks from a central directory (usually /usr/local/stow) to the appropriate locations in the system directory tree.
  • It's particularly helpful for managing dotfiles and keeping track of custom software installations.
  • Stow allows for easy package management, installation, and removal without mixing files from different packages.

Conclusion

GNU Stow provides a user-friendly solution for managing software you compile yourself in Linux. It eliminates the hassle of scattered files and simplifies the update and removal process.

By creating symbolic links, Stow keeps your system organized and allows you to switch between different software versions effortlessly. Stow is quite useful for developers and testers who often install software from source in Linux.

If you're looking for a way to streamline your workflow with source-built programs, GNU Stow is a valuable tool to add to your Linux toolkit.

Resources:


Suggested Read:


Featured Image by GrumpyBeere from Pixabay.

You May Also Like

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Home Bootable USBNow You Can Write ISO Images To USB Disks Directly Using Pv Command In Linux

Now You Can Write ISO Images To USB Disks Directly Using Pv Command In Linux

Flash ISOs to USB Directly with Latest pv (No More dd Needed!)

By sk
Published: Updated: 2.1K views 9 mins read

Say Goodbye to the dd command! The latest Pv (Pipe Viewer) utility can now write ISOs directly to USB disks!! This guide will show you how to use the pv command instead of dd for image writing in Linux.

Using pv command-line utility provides a real-time progress bar, an estimated transfer time (ETA), and greater transparency during the process.

Introduction

Many of us are familiar with using the dd command to write installer images to storage devices. The dd command is the old-school method for creating bootable USB drives in Linux.

The dd command is quite powerful. It simply reads from one file and writes to another. The typical command to write images to a device looks like this:

sudo dd if=installer.img of=/dev/sda2 bs=1M status=progress

Of course, some other tools like pv (Pipe Viewer) and cat could perform the same task. The primary reason dd is commonly used for this purpose is that it can be run with root privileges, whereas redirecting the output of cat or pv typically requires running the shell with root access. The command sudo dd ... is more concise than sudo sh -c 'cat ...', isn't?

Limitations of dd

While the dd command works just fine for creating images, it has some limitations:

  • The progress information provided by dd does not display the progress as a percentage or calculate an estimated time of arrival (ETA). It only shows the number of bytes written.
  • The default block size of dd is not optimized for modern systems, which is why the bs= parameter is often included.
  • It's easy to forget to include status=progress, and having to specify it each time can be cumbersome.

What is pv Command?

Pv stands for Pipe Viewer, which is a command-line tool that allows users to monitor the progress of data through a pipeline.

It can be inserted into any ordinary pipeline between two processes to give a visual indication of how quickly data is passing through, how long it has taken, and an estimate of how long it will take to complete.

Here are some key features of pv:

  • Progress Indication: pv displays a progress bar, percentage completion, elapsed time, and estimated time remaining.
  • ETA Calculation: It calculates and updates the estimated time of arrival (ETA) for the completion of the data transfer.
  • Buffering: pv can handle buffering, which is useful when dealing with slow devices or network transfers.
  • Control and Statistics: It provides control over the data flow and can output statistics about the transfer.
  • Flexibility: pv can be used in various scenarios, such as copying files, compressing data, or any other situation where data is piped from one process to another.

The pv command is particularly useful when you need to monitor the progress of operations that might otherwise be invisible, such as when using the dd command to write an image to a disk or when piping data through multiple commands without direct feedback on the transfer rate or progress.

Why Use pv for Writing Files to Block Devices?

The pv utility offers a few advantages over dd:

  • pv displays a real-time progress bar and an ETA, providing more detailed information than just bytes written.
  • pv automatically determines the optimal buffer sizes, eliminating the need for manual adjustments.
  • pv is more concise, as there is no need to specify status=progress or bs=....

The Latest pv Command Can Flash ISOs to USB Directly

The recent version of pv (1.8.10) include a new --output (-o) option. This feature allows pv to write directly to a file or device, similar to dd.

The --output option in pv version 1.8.10 allows you to redirect the output of the pipe viewer to a file instead of displaying it on the standard output (usually the terminal).

This change can be particularly useful in scenarios where you want to monitor the progress of data transfer while simultaneously saving the output to a file, rather than just displaying it on the terminal.

Now let us go ahead and install the latest pv utility. The latest pv is not yet available in the default repositories of popular Linux operating systems. So we need to install it from source.

To install any software from source, you must install the development tools and GNU Stow. While Stow is optional, I highly recommend you to install it in order to efficiently manage software installed from source.

Install Development Tools

If you haven't install Development tools yet, it is mandatory to install them first. We have documented the steps to install Development tools on various Linux distributions in the link given below:

Install GNU Stow

You can install a software from source without Stow. But I prefer to use GNU Stow to install software from source for efficiently managing them.

Here’s how you can install GNU Stow on various operating systems:

On Ubuntu/Debian

1. Update Package List:

sudo apt update

2. Install Stow:

sudo apt install stow

On Fedora/RHEL/AlmaLinux/Rocky Linux

1. Enable EPEL Repository:

sudo dnf install epel-release

2. Install Stow:

sudo dnf install stow

On older RHEL versions, use yum instead of `dnf'.

Install Latest pv from Source in Linux

After installing the necessary development tools and GNu Stow, you can install the GNU Stow in your Linux system as shown below:

1. Download the latest pv utility from its official releases page:

wget https://codeberg.org/a-j-wood/pv/releases/download/v1.8.10/pv-1.8.10.tar.gz

2. Go to the directory where you downloaded the pv tar file and extract it using command:

tar xvf pv-1.8.10.tar.gz

This will extract the contents of the tar file in a directory called pv-1.8.10 in your current directory.

3. Cd into the extracted directory:

cd pv-1.8.10

4. Configure the Build:

./configure --prefix=/usr/local/stow/pv-1.8.10

This command is used to configure the build process of the software with a specified installation prefix. In this case, it sets the installation directory to /usr/local/stow/pv-1.8.10.

5. Compile the Software:

make

6. Install the pv Software:

sudo make install

7. Use GNU Stow to Manage the Installation:

After installing the software in the specified directory, you can use GNU Stow to create symbolic links from the standard system directories (like /usr/local/bin, /usr/local/lib, etc.) to the files in /usr/local/stow/pv-1.8.10.

To do so, go to the /usr/local/stow directory:

cd /usr/local/stow

And run the following command to create the necessary symlinks:

sudo stow pv-1.8.10

This keeps your system directories clean and makes it easy to manage multiple versions of software.

Now check pv command is available using command:

pv --version

You will see an output like below:

pv 1.8.10
Copyright 2024 Andrew Wood
License: GPLv3+ <https://www.gnu.org/licenses/gpl-3.0.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Project web site: <https://www.ivarch.com/programs/pv.shtml>

Congratulations! We have successfully installed the latest 'pv' version 1.8.10.

How to Use pv for Image Writing

Once you installed pv version 1.8.10 in your system, you can use the following command to write an image:

sudo pv installer.iso -Yo /path/to/block/device

Here's the breakdown of the above command:

  • sudo: Run the command with root privileges.
  • pv: The Pipe Viewer utility.
  • installer.iso: The input file (your installer image).
  • -Y: Sync after every write, preventing hangs at 100% while flushing buffers.
  • -o or --output: Use the new output option to write directly to a file or device.
  • /path/to/block/device: The target device (e.g., /dev/sda).

For example, the following output shows that the KDE Neon ISO is being written to an external USB drive /dev/sda:

$ sudo pv neon-user-20240620-0718.iso -Yo /dev/sda

Sample Output:

$ sudo pv neon-user-20240620-0718.iso -Yo /dev/sda
152MiB 0:00:19 [8.25MiB/s] [>                                    ] 5% ETA 0:05:20
Write Images to USB Disks using Pv Command
Write Images to USB Disks using Pv Command

As you see in the output above, Pv shows the data transfer speed, progress bar and ETA.

You can now use the newly created USB bootable drive to install Linux on your system.

The latest Pv utility is not only for writing ISOs, but can also be used for writing files to locations that require elevated permissions.

Using pv with sudo for Privileged Locations

One of the significant advantages of the new --output option is its compatibility with sudo. This allows for a more straightforward approach when writing to locations that require elevated permissions, such as block devices.

Previous Workarounds:

Before the --output option, users had to resort to one of the following methods:

1. Using tee with sudo:

pv file | sudo tee /path/to/output >/dev/null

2. Using sudo with a shell command:

sudo sh -c 'pv file > /path/to/output'

3. Starting a root shell and then running pv.

New Simplified Approach:

With the --output option, you can now simply use:

sudo pv file -o /path/to/output

This method combines the progress monitoring capabilities of pv with the ability to write to privileged locations, all in a single, easy-to-use command.

Conclusion

I am not saying that pv is superior to dd. The dd utility is excellent. However, the latest version of pv includes a feature for writing ISO images to USB drives, which I found useful.

Using pv offers a more user-friendly image writing experience with better progress tracking and optimized performance.

The addition of the --output option further simplifies the process, especially when dealing with privileged write locations.

As distributions update to include the latest version of pv, this method will become increasingly accessible and beneficial to users.

Resources:


Suggested Read:


You May Also Like

Leave a Comment

* By using this form you agree with the storage and handling of your data by this website.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

This website uses cookies to improve your experience. By using this site, we will assume that you're OK with it. Accept Read More