Search code examples
beagleboneblackangstrom-linuxopkg

Package synchronization with opkg


We're using the BeagleBone Black running Angstrom Linux and the opkg package manager to power some of our systems. We need to ensure that we have consistent and reliable access to specific versions of opkg packages. I've set up an in-house opkg repository. Is there any way to sync packages between repositories ? e.g. I'd like to copy specific packages from public / not always accessible repositories to our internal repository, both for speed and reliable access.


Solution

  • After some fooling around with various packages, etc, I found a way of cloning (parts of) a repository using an Ubuntu system. Here's the steps I took:

    # Install apache
    sudo apt-get install apache2
    
    # Install git
    sudo apt-get install git
    
    # Download the opkg-utils from the Yocto Project
    git clone http://git.yoctoproject.org/git/opkg-utils
    
    # Build the opkg-utils
    cd opkg-utils && make; cd -
    
    # Move them to a common directory
    mv opkg-utils /usr/local/share\
    
    # Add them to my path
    echo "PATH=\"\$PATH:/usr/local/share/opkg-utils\"" >> /etc/environment
    
    # Update my environment
    source /etc/environment
    
    # Create the structure of my repository
    mkdir -p /var/www/repositories/opkg/beaglebone
    
    # Create an index for the packages
    opkg-make-index -l Packages.filelist -p Packages /var/www/repositories/opkg/beaglebone
    cd /var/www/repositories/opkg/beaglebone
    gzip -c Packages > Packages.gz
    

    On my client BeagleBone Blacks, to setup access to this repository:

    echo "src/gz reponame http://myserver/repositories/opkg/beaglebone" > /etc/opkg/rms-feed.conf
    chmod 666 /etc/opkg/reponame-feed.conf
    opkg update
    

    On my developer machines, any time I need to backup a package:

    #!/bin/bash
    
    ###############################################################################
    #
    # bbb_clone_package_to_internal_repo.sh
    #
    # Description:
    # Clones an ipkg / opkg package to the internal repository server so that it can be deployed 
    # to BeagleBone Black clients on demand. This is so that we can have backups in
    # the event that a public server becomes temporarily or permanently 
    # inaccessible.
    #
    # Pre-conditions:
    # 1) The given package file must exist at the path specified. 
    #
    # Post-conditions:
    # 1) The given package file will be sent to the internal repository server.
    # 2) The opkg repository indexes will all be updated 
    #
    # Parameters:
    # -p <file path.opk> : The package to be cloned
    #
    ###############################################################################
    
    PACKAGE_FILE_PATH=""
    SERVER="myserver"
    
    ERR_INVALID_PACKAGE_FILE_NAME=1
    ERR_PACKAGE_FILE_NOT_ACCESSIBLE=2
    ERR_FAILED_TO_COPY_PACKAGE_TO_SERVER=3
    ERR_FAILED_TO_DEPLOY_PACKAGE_ON_SERVER=4
    
    usage()
    {
    cat << EOF
    usage: $0 [options]
    
    This script copies a remote ipkg/opkg file to the $SERVER server for subsequent
    deployment to BeagleBone Black boards.
    
    OPTIONS:
        -p <file path.[io]pk>   The package file to be deployed
    
        -h,?                    Show this message
    
    EOF
    }
    
    while getopts “p:h?” OPTION
    do
        case $OPTION in
        p)
            PACKAGE_FILE_PATH="$OPTARG"
            ;;
        h)
            usage
            exit
            ;;
        ?)
            usage
            exit
            ;;
        esac
    done
    
    if [[ -z "$PACKAGE_FILE_PATH" || ! ( "$PACKAGE_FILE_PATH" =~ \.[io]pk$ ) ]]; then
        echo "The package file must not be blank and must have an .ipk or .opk suffix"
        exit $ERR_INVALID_PACKAGE_FILE_NAME
    fi
    
    # Retrieve the package
    wget -q "$PACKAGE_FILE_PATH"
    RESULT="$?"
    if [[ $RESULT -ne 0 ]]; then
        echo "Failed to retrieve file $PACKAGE_FILE_PATH with result $RESULT"
        exit $ERR_PACKAGE_FILE_NOT_ACCESSIBLE
    fi 
    
    # Deploy the package to myserver 
    
    PACKAGE_FILE_NAME="$(basename $PACKAGE_FILE_PATH)"
    REPOSITORY_ROOT="/var/www/repositories/opkg/beaglebone"
    scp "$PACKAGE_FILE_NAME" root@$SERVER:$REPOSITORY_ROOT
    RESULT="$?"
    if [[ $RESULT -ne 0 ]]; then
    
        echo "Failed to copy file $PACKAGE_FILE_NAME to server with result $RESULT"
        exit $ERR_FAILED_TO_COPY_PACKAGE_TO_SERVER
    fi 
    
    ssh root@$SERVER "chmod 644 $REPOSITORY_ROOT/$PACKAGE_FILE_NAME; opkg-make-index -l $REPOSITORY_ROOT/Packages.filelist -p $REPOSITORY_ROOT/Packages -r $REPOSITORY_ROOT/Packages $REPOSITORY_ROOT && gzip -c $REPOSITORY_ROOT/Packages > $REPOSITORY_ROOT/Packages.gz"
    RESULT="$?"
    if [[ $RESULT -ne 0 ]]; then
    
        echo "Failed to deploy file $PACKAGE_FILE_NAME in repository with result $RESULT"
        exit $ERR_FAILED_TO_DEPLOY_PACKAGE_ON_SERVER
    fi 
    
    exit 0