Coming Up for Air

Yum Pseudo-Transactions

Wednesday, September 19, 2012 |

If you follow me on Twitter, you may have seen that I’ve been looking for a good media player. This long, painful process involved installing project Foo, along with its 87 dependencies, only to see that I didn’t like it, then running into the same thing with Bar and Baz. Now I have a ton of packages installed that I don’t need, which will irritate me as I think of all the wasted disk space. This morning, I decided to give Cinnamon a try. After seeing its long list of dependencies, I decided to tackle that problem and (the sadly named) tx_yum was born.

Before I get to the script, I’ll admit that when it comes to maintaining the RPM database, my skills are sorely lacking. Beyond installing and uninstalling, I can’t do much. :) This script, then, may not be optimal, but it was a fun, quick effort, so lay off! :P That said,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash

APP_NAME=`basename $0`
TXN_DIR="$HOME/.$APP_NAME"

function usage() {
    echo "The arguments to use are:"
    echo "  -l : List all transactions"
    echo "  -r <title> : Rollback transaction <title>"
    echo "  -t <title> : Set a title for this transaction (default is first package name)"
    exit 1;
}

function list_txns() {
    ls $TXN_DIR | sed -e 's/\.txn$//'
    exit 0
}

while getopts hilr:t:y opt
do
    case "$opt" in
        h) usage ;;
        l) list_txns ;;
        t) TITLE=$OPTARG ;;
        r) ROLLBACK=true ; TITLE=$OPTARG ;;
        *) usage ;;
    esac
done

if [ "$TITLE" == "" ] ; then
    TITLE=$1
else
    shift 2
fi

TXN_FILE="$TXN_DIR/$TITLE.txn"

if [ "$ROLLBACK" == "" ] ; then
    echo "Preparing transaction for $TITLE"

    sudo yum install -y $* 2>&1 | tee /tmp/tx_yum.log

    if [ $? == 0 ] ; then
        mkdir -p $TXN_DIR
        cat /tmp/tx_yum.log | grep "Installing :" | cut -f 5 -d " " > "$TXN_FILE"
    else
        echo "Installation failed. No transaction recorded"
        exit -1
    fi

    rm /tmp/tx_yum.log
else
    if [ ! -e $TXN_FILE ] ; then
        echo "Transaction not found"
        exit -1
    else
        echo "Rolling back transaction $TITLE"
        cat "$TXN_FILE" | xargs sudo yum remove -y
        rm "$TXN_FILE"
    fi
fi

This script takes a parameters. With -t, the user can specify the name of the "transaction" that will be recorded. If this option is not specified, the name of the first package is used. Transactions can be "rolled back" using -r, which takes the name of the transacation to roll back, and transactions can be listed with -l.

For example:

1
2
3
4
5
6
7
8
$ tx_yum cinnamon
<lots of deleted output>
$ tx_yum -l
cinnamon
$ tx_yum -r cinnamon
Rolling back transaction cinnamon
$ tx_yum -l
$

That’s all there is to it. While I’m sure there are flaws and inefficiencies, it seems to work pretty well. If you have an improvement, feel free to hit the comments below. Either way, I hope you find it as helpful as I have so far. Now to find those orphaned RPMs…​ :)

Search

    Quotes

    Sample quote

    Quote source

    About

    My name is Jason Lee. I am a software developer living in the middle of Oklahoma. I’ve been a professional developer since 1997, using a variety of languages, including Java, Javascript, PHP, Python, Delphi, and even a bit of C#. I currently work for Red Hat on the WildFly/EAP team, where, among other things, I maintain integrations for some MicroProfile specs, OpenTelemetry, Micrometer, Jakarta Faces, and Bean Validation. (Full resume here. LinkedIn profile)

    I am the president of the Oklahoma City JUG, and an occasional speaker at the JUG and a variety of technical conferences.

    On the personal side, I’m active in my church, and enjoy bass guitar, running, fishing, and a variety of martial arts. I’m also married to a beautiful woman, and have two boys, who, thankfully, look like their mother.

    My Links

    Publications