Updated script for fully local IPS mirror for faster DC and AI experimenting

Updated script for fully local IPS mirror of selected packages for faster OpenSolaris 200906 DC or AI install Prototyping.

This is updated IPS packages subset mirror script with support of OpenSoalris 200906 names with "/" like "system/ldoms/ldomsmanager" and also strip out most foreign arch data (For example SPARC on x86). I use this script to make a fast repeatable installations of already installed packages set of reduced OpenSolaris 200906. I create a fully local IPS repository on local virtual disk and I am installing from localhost, this fully eliminate any dependence on network reliability. I strip our opposite arch to save disk space, you can comment out this code, if you have enough disk space and you want to get 1:1 repo clone of selected packages. Provided script bellow is sample code and is valid only in context of current 200906 repository.

Good news is then in context of DEV (OpenSolaris 200906) we will not need this script any more, I will show it later.

See also OpenSolaris 200811 post: Home No-Network needed OpenSolaris Live-CD IPS REPO full mirror, about the origin of script and more info.

This script is sample of fully local (local disk, localhost net) one arch only repo clone.

cat repo-self.sh
#!/bin/sh

AUTHORITY=http://pkg.opensolaris.org:80/release

TARGET=/localrepos/ips/self

ISA_INFO=`/sbin/uname -p`

echo "INFO: We are on platform: $ISA_INFO"

# This is how I start the ips repository daemon after updating the mirror:
#
# Ideally create a separe zpool for repo
#
# 1. Create a dedicated zfs based system
# echo -y | format
# Searching for disks...done
#   0. c3t0d0 system
#   1. c3t1d0 instance data
#   2. c3t2d0 
#
# zpool create localrepos c3t2d0
# zfs create localrepos/ips
# zfs create localrepos/ips/self
#
# 2. Get repo clone from pre-prepared list
#
# rm -f /tmp/repo-self.log
# repo-self.sh ./OSOL0906-JeOS-pkgsfmris.lst 2>&1 | tee /tmp/repo-self.log
#
# 3. After clone is done, run this pkg.depmod comand to start repo:
#
# screen -L -d -m /usr/lib/pkg.depotd --rebuild -d /localrepos/ips/self -p 10000
#
# ifconfig -a to find global IP so you can check if repository FREEZE of selected packages is created correctly. 
#

# fail() { rm -rf ${TDIR}; exit 1; }

if [ ! -d ${TARGET} ]; then
    mkdir -p ${TARGET} 2>/dev/null
fi

TDIR=`mktemp -d`

if [ ! -d $1 ]; then
    echo "Passed file wilh pkg list of full FMRIs" $1
    cat $1 | grep -v "\^#" |sed s%\\pkg:/%%|sort -u >${TDIR}/packages.lst
else
    echo "Geting installed package list from local pkg database ..."
    pkg list -v | awk '{print $1}'|sed s%\\pkg:/%%|sort -u | sed -e 's/\\//%2f/g' >${TDIR}/packages.lst
fi

DIRS="catalog trans updatelog"
for d in $DIRS; do [ -d $d ] && rm -rf $d; done

FILES="search.dir search.pag"
for f in $FILES; do [ -f $f ] && rm -f $f; done

# I add there escaping for / as %2F for names like 'system/ldoms/ldomanager' packages

cat <${TDIR}/packages-download.sh
x() {
PKG_NAME=\\`echo \\$1|sed s/@.\*//\\| sed s/\\//%2F/g`
PKG_VERS=\\`echo \\$1|sed s/.\*@//|sed s/,/%2C/|sed s/:/%3A/\\`
[ -d ${TARGET}/pkg/\\$PKG_NAME ] || mkdir -p ${TARGET}/pkg/\\$PKG_NAME
echo Downloading \\$1
wget ${AUTHORITY}/manifest/0/\\$1 -O ${TDIR}/package && mv ${TDIR}/package ${TARGET}/pkg/\\$PKG_NAME/\\$PKG_VERS
}

EOF
cat ${TDIR}/packages.lst |sed s/\\\^/x\\ / >>${TDIR}/packages-download.sh
sh ${TDIR}/packages-download.sh

echo Generating list of files referenced by the packages...
# For now we exclude binaly files for oposite achitecture i386 and SPARC to save space
# Other stuff like Scripts or License have neglible size and they don't need to be ecluded
#
#

if [ $ISA_INFO = "sparc" ] ; then
 for i in `ls ${TARGET}/pkg`; do
    cat ${TARGET}/pkg/$i/\*
 done | grep -v "elfarch=i386"| egrep "\^(file|license)\\ "|awk '{ print $2 }'|sort -u >${TDIR}/files-to-download.lst
else
 for i in `ls ${TARGET}/pkg`; do
    cat ${TARGET}/pkg/$i/\*
 done | grep -v "elfarch=sparc"| egrep "\^(file|license)\\ "|awk '{ print $2 }'|sort -u >${TDIR}/files-to-download.lst
fi

mkdir ${TDIR}/files.d
split -l 100 -a 8 ${TDIR}/files-to-download.lst ${TDIR}/files.d/files-

# I'm using bash because of the "echo -n" bit

cat <${TDIR}/files-download.sh

for list in \\`ls ${TDIR}/files.d\\`; do
    POST_TMP=\\`cat ${TDIR}/files.d/\\${list}|nl -s\\=|sed s/\\\^\\ \*/File-Name-/\\`
    POST=\\`for i in \\$POST_TMP; do echo -n \\&\\$i; done\\`
    echo Downloading...
    wget  --post-data="\\$POST" ${AUTHORITY}/filelist/0 -O ${TDIR}/files.d/\\${list}.tar || fail
    echo Extracting...
    mkdir ${TDIR}/files.d/\\${list}.d
    (cd ${TDIR}/files.d/\\${list}.d; tar xf ${TDIR}/files.d/\\${list}.tar)
    for file in \\`ls ${TDIR}/files.d/\\${list}.d\\`; do
        FILE_DIRL1=\\`echo \\$file|cut -c -2\\`
        FILE_DIRL2=\\`echo \\$file|cut -c 3-|cut -c -6\\`
        mkdir -p ${TARGET}/file/\\${FILE_DIRL1}/\\${FILE_DIRL2} 2>/dev/null && mv \\
            ${TDIR}/files.d/\\${list}.d/\\$file ${TARGET}/file/\\${FILE_DIRL1}/\\${FILE_DIRL2} || exit 1
    done
    rmdir ${TDIR}/files.d/\\${list}.d
    rm ${TDIR}/files.d/\\${list}.tar
    rm ${TDIR}/files.d/\\${list}
done
EOF

bash ${TDIR}/files-download.sh

#rm -rf ${TDIR}
exit 0
Comments:

Post a Comment:
  • HTML Syntax: NOT allowed
About

Hands-on experience with Virtualization

Search

Categories
Archives
« April 2014
SunMonTueWedThuFriSat
  
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
   
       
Today