initial code repo
[stor4nfv.git] / src / ceph / src / script / sepia_bt.sh
diff --git a/src/ceph/src/script/sepia_bt.sh b/src/ceph/src/script/sepia_bt.sh
new file mode 100755 (executable)
index 0000000..62786f2
--- /dev/null
@@ -0,0 +1,182 @@
+#!/bin/bash
+
+function die() {
+    echo $@ >&2
+    exit 1
+}
+
+function usage() {
+    echo "bt: $0 -c core_path [-d distro] [-C directory] [-v]"
+    exit 1
+}
+
+function log() {
+    if [ -n "$verbose" ]; then
+        echo $*
+    fi
+}
+
+function get_machine() {
+    local core_path=$1
+    local machine=${core_path%/coredump/*}
+    echo $(basename $machine)
+}
+
+function get_t_dir() {
+    local core_path=$1
+    echo ${core_path%/remote/*}
+}
+
+while getopts  "c:C:d:v" opt
+do
+    case $opt in
+        c) core_path=$OPTARG;;
+        C) wd=$OPTARG;;
+        d) codename=$OPTARG;;
+        v) verbose=1;;
+        *) usage;;
+    esac
+done
+
+if [ -z $core_path ]; then
+    usage
+fi
+
+sha1=$(strings $core_path | gawk 'BEGIN{ FS = "=" } /^CEPH_REF/{print $2}')
+if [ -z $sha1 ]; then
+    teuthology_log=$(get_t_dir $core_path)/teuthology.log
+    sha1=$(grep -m1 -A1 "Running command: sudo ceph --version" ${teuthology_log} | tail -n1 | grep -oP "ceph version [^ ]+ \(\K[^\) ]+")
+fi
+
+if [ -z $distro ]; then
+    machine=$(get_machine $core_path)
+    teuthology_log=$(get_t_dir $core_path)/teuthology.log
+    if [ ! -r ${teuthology_log} ]; then
+        die "missing distro, and unable to read it from ${teuthology_log}"
+    fi
+    ld=$(grep -m1 -A1 "${machine}:Running.*linux_distribution" ${teuthology_log} | tail -n1 | grep -oP "\(\K[^\)]+")
+    distro=$(echo $ld | gawk -F ", " '{print $1}' | sed s/\'//g)
+    distro=$(echo $distro | tr '[:upper:]' '[:lower:]')
+    distro_ver=$(echo $ld | gawk -F ", " '{print $2}' | sed s/\'//g)
+    codename=$(echo $ld | gawk -F ", " '{print $3}' | sed s/\'//g)
+    if [ "$distro" == "centos linux" ]; then
+        # there is chance that it's actually something different,
+        # but we take it as centos7 anyway.
+        distro=centos
+        distro_ver=7
+    fi
+else
+    case $codename in
+        xenial)
+            distro=ubuntu
+            distro_ver=16.04
+            ;;
+        trusty)
+            distro=ubuntu
+            distro_ver=14.04
+            ;;
+        centos7)
+            distro=centos
+            distro_ver=7
+        ;;
+        *)
+            die "unknown distro: $distro"
+            ;;
+    esac
+fi
+
+# try to figure out a name for working directory
+if [ -z $wd ]; then
+    run=${core_path%/remote/*}
+    job_id=${run#/a/}
+    if [ $job_id != $core_path ]; then
+        # use the run/job for the working dir
+        wd=$job_id
+    fi
+fi
+
+if [ -z $wd ]; then
+   wd=$(basename $core_path)
+   wd=${wd%.*}
+   echo "unable to figure out the working directory, using ${wd}"
+fi
+
+log "creating ${wd}"
+mkdir -p $wd
+cd $wd
+
+prog=$(file $core_path | grep -oP "from '\K[^']+" | cut -d' ' -f1)
+case $prog in
+    ceph_test_*)
+        pkgs="ceph-test librados2"
+        ;;
+    ceph-osd|ceph-mon)
+        pkgs=$prog
+        ;;
+    */python*)
+        prog=$(basename $prog)
+        pkgs=librados2
+        ;;
+    rados)
+        pkgs="ceph-common librados2 libradosstriper1"
+        ;;
+    *)
+        die "unknown prog: $prog"
+        ;;
+esac
+
+flavor=default
+arch=x86_64
+
+release=$(strings $core_path | grep -m1  -oP '/build/ceph-\K[^/]+')
+if [ -z $release ]; then
+    teuthology_log=$(get_t_dir $core_path)/teuthology.log
+    release=$(grep -m1 -A1 "Running command: sudo ceph --version" ${teuthology_log} | tail -n1 | grep -oP "ceph version \K[^ ]+")
+fi
+
+case $distro in
+    ubuntu)
+        pkg_path=pool/main/c/ceph/%s_%s-1${codename}_amd64.deb
+        for p in $pkgs; do
+            t="$t $p $p-dbg"
+        done
+        pkgs="$t"
+        ;;
+    centos)
+        pkg_path=${arch}/%s-%s.el7.x86_64.rpm
+        # 11.0.2-1022-g5b25cd3 => 11.0.2-1022.g5b25cd3
+        release=$(echo $release | sed s/-/./2)
+        pkgs="$pkgs ceph-debuginfo"
+        ;;
+    *)
+        die "unknown distro: $distro"
+        ;;
+esac
+
+query_url="https://shaman.ceph.com/api/search?status=ready&project=ceph&flavor=${flavor}&distros=${distro}%2F${distro_ver}%2F${arch}&sha1=${sha1}"
+repo_url=`curl -L -s "${query_url}" | jq -r '.[0] | .url'`
+pkg_url=${repo_url}/${pkg_path}
+log "repo url is ${repo_url}"
+
+for pkg in ${pkgs}; do
+    url=`printf $pkg_url $pkg $release`
+    log "downloading ${url}"
+    curl -O -L -C - --silent --fail --insecure $url
+    fname=`basename $url`
+    case $fname in
+        *.deb)
+            ar p `basename $fname` data.tar.xz | tar xJv;;
+        *.rpm)
+            rpm2cpio < $fname | cpio -id;;
+        *)
+    esac
+done
+
+cat > preclude.gdb <<EOF
+set sysroot .
+set debug-file-directory ./usr/lib/debug
+set solib-search-path ./usr/lib64
+file ./usr/bin/$prog
+core $core_path
+EOF
+gdb -x preclude.gdb