DEV Community

lbonanomi
lbonanomi

Posted on

4

Package Your Tools

RPMs in $HOME! Amaze friends! Confound enemies! Install the binary versions YOU want! All this and more with native tools and no root!

Enough hype yet? This is a simple and maybe-ugly way to get RPMs that install into your $HOME directory to simplify management of hosted shells and tight VMs/containers where management infrastructure would be too much overhead. You won't need root to install these RPMs, but will need a RHEL/Centos host to build them on; Circle CI's free tier is great for this.

I feel like I misled DeChamp in a comment thread talking about the socket options for fuser, so I'll use this article as a roundabout apology and employ fuser as an example.

Building RPMs for $HOME

  1. Install rpm-build on the builder VM to do the heavy lifting:
    sudo yum install rpm-build -y;

  2. Install the FPM gem on the builder VM to handle the RPM building :
    git clone https://github.com/jordansissel/fpm.git;
    cd fpm && gem install --no-ri --no-rdoc fpm;

  3. Create an install tree for your script on the builder VM. This file system tree will be reflected on the target host that the RPM is installed-on:
    mkdir -p $HOME/var/tmp/bin

  4. Add the scripts, libraries, configs and whatever else to $HOME/var/tmp/bin:
    cp $HOME/psmisc/src/fuser $HOME/var/tmp/bin

  5. Add a helper script called var/tmp/bin/fuser-after.sh to relocate installed files:
    [[ -d $HOME/bin ]] || mkdir $HOME/bin;
    [[ -d $HOME/bin ]] && mv /var/tmp/bin/fuser $HOME/bin;

Please give these scripts distinctive names, RPM won't want to install over an existing script.

  1. Build an RPM from the contents of $HOME/var: cd && fpm -s dir -t rpm -n fuser --after-install 'var/tmp/bin/fuser-after.sh' var

Installing RPMs for $HOME

Now don't let your enthusiasm fizzle when rpm -i comes back with "error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Permission denied)"! If root doesn't want to share its tree house we'll build our own!

mkdir $HOME/rpmdb
find /var/lib/rpm -type f |xargs file| awk '/Berkeley/ {print $1}' | tr -d ':' | while read src 
do 
    db_dump $src | db_load $HOME/rpmdb/$(basename $src); 
done;
rpm --dbpath $HOME/rpmdb --rebuilddb;

Now we can install our RPMs like so:

rpm --dbpath $HOME/rpmdb -i fuser-1.0-1.x86_64.rpm

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

Image of Docusign

Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more