RPM Packaging Environment for an Arbitrary User

2015.05.09

Recently I had to roll my own package on CentOS 7. It's been a while since I've done this and so I had to dig around online to remember how to set up an environment for packaging. So this time around I'll jot down some notes.

First thing's first, to build as an arbitrary user we'll need to set up a space for RPMs to be packaged in. Start by defining the location with this via the RPM Macro _topdir:

[mcvady@centos7 ~]$ cat ~/.rpmmacros
%_topdir /home/mcvady/working/rpm

Once set this value should be picked up immediately. Test the value from shell like so:

[mcvady@centos7 ~]$ rpm --eval '%_topdir'
/home/mcvady/working/rpm

Now create the RPM top-level directory:

[mcvady@centos7 ~]$ mkdir -p `rpm --eval '%_topdir'` # create RPM output directory

Here's a helper script I drop in ~/bin/ to flesh out the structure of the RPM packaging top-level directory (Note that ~/bin/ is automatically sourced in the default ~/.bash_profile):

#!/bin/bash

set -e

RM_BIN="/usr/bin/rm"
RPM_BIN="/usr/bin/rpm"
MKDIR_BIN="/usr/bin/mkdir"

rpmtopdir=`$RPM_BIN --eval '%_topdir'`

pushd $rpmtopdir 2>&1 > /dev/null

$RM_BIN -rf BUILD/*
$RM_BIN -rf BUILDROOT/*
$RM_BIN -rf RPMS/*
$RM_BIN -rf SOURCES/*
$RM_BIN -rf SPECS/*
$RM_BIN -rf SRPMS/*

$MKDIR_BIN -p BUILD/*
$MKDIR_BIN -p BUILDROOT/*
$MKDIR_BIN -p RPMS/x86_64/*
$MKDIR_BIN -p SOURCES/*
$MKDIR_BIN -p SPECS/*
$MKDIR_BIN -p SRPMS/*

popd 2>&1 > /dev/null

And now to test that packaging works by packaging a project:

[mcvady@centos7 ~]$ cd working/
[mcvady@centos7 working]$ git clone http://git.bunkergate.org/chunker
Cloning into 'chunker'...
[mcvady@centos7 working]$ cd chunker/
[mcvady@centos7 chunker]$ ./package.sh 0.9.1
srcdir /home/mcvady/working/rpm/SOURCES
~/working/chunker ~/working/chunker
rm -f chunker test-overflow test-cleanMarkerKeepLast test-handshake ./src/stats.o ./src/connection.o
-rw-rw-r-- mcvady/mcvady  3654 2015-05-13 15:59 chunker.spec
-rw-rw-r-- mcvady/mcvady   474 2015-05-13 15:59 INSTALL
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 lib/
-rw-rw-r-- mcvady/mcvady  6551 2015-05-13 15:59 lib/dictionary.h
-rw-rw-r-- mcvady/mcvady 39097 2015-05-13 15:59 lib/iniparser-3.1.tar.gz
-rw-rw-r-- mcvady/mcvady 11574 2015-05-13 15:59 lib/iniparser.h
-rw-rw-r-- mcvady/mcvady 17594 2015-05-13 15:59 lib/libiniparser.a
-rwxrwxr-x mcvady/mcvady 18867 2015-05-13 15:59 lib/libiniparser.so.0
-rw-rw-r-- mcvady/mcvady  2221 2015-05-13 15:59 makefile
-rwxrwxr-x mcvady/mcvady  1035 2015-05-13 15:59 package.sh
-rw-rw-r-- mcvady/mcvady   236 2015-05-13 15:59 README
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 src/
-rwxrwxr-x mcvady/mcvady  3718 2015-05-13 15:59 src/chunker-init
-rw-rw-r-- mcvady/mcvady 22744 2015-05-13 15:59 src/chunker.c
-rw-rw-r-- mcvady/mcvady  1066 2015-05-13 15:59 src/chunker.conf
-rw-rw-r-- mcvady/mcvady  2409 2015-05-13 15:59 src/chunker.h
-rwxrwxr-x mcvady/mcvady  2628 2015-05-13 15:59 src/chunker2s3.sh
-rw-rw-r-- mcvady/mcvady    98 2015-05-13 15:59 src/chunker_health-cron
-rwxrwxr-x mcvady/mcvady   969 2015-05-13 15:59 src/chunker_health.sh
-rw-rw-r-- mcvady/mcvady 12154 2015-05-13 15:59 src/connection.c
-rw-rw-r-- mcvady/mcvady  1325 2015-05-13 15:59 src/connection.h
-rw-rw-r-- mcvady/mcvady  5014 2015-05-13 15:59 src/stats.c
-rw-rw-r-- mcvady/mcvady   382 2015-05-13 15:59 src/stats.h
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 test/
-rw-rw-r-- mcvady/mcvady  2978 2015-05-13 15:59 test/test-cleanMarkerKeepLast.c
-rw-rw-r-- mcvady/mcvady  3159 2015-05-13 15:59 test/test-handshake.c
-rw-rw-r-- mcvady/mcvady  1923 2015-05-13 15:59 test/test-overflow.c
-rw-rw-r-- mcvady/mcvady   464 2015-05-13 15:59 TODO
~/working/chunker
SPEC [/home/mcvady/working/rpm/SPECS/chunker_0.9.1.spec]
~/working/rpm/SPECS ~/working/chunker
Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.FV0fiB
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ cd /home/mcvady/working/rpm/BUILD
+ rm -rf chunker-0.9.1
+ /usr/bin/mkdir -p chunker-0.9.1
+ cd chunker-0.9.1
+ /usr/bin/gzip -dc /home/mcvady/working/rpm/SOURCES/chunker-0.9.1.tgz
+ /usr/bin/tar -xvvf -
-rw-rw-r-- mcvady/mcvady  3654 2015-05-13 15:59 chunker.spec
-rw-rw-r-- mcvady/mcvady   474 2015-05-13 15:59 INSTALL
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 lib/
-rw-rw-r-- mcvady/mcvady  6551 2015-05-13 15:59 lib/dictionary.h
-rw-rw-r-- mcvady/mcvady 39097 2015-05-13 15:59 lib/iniparser-3.1.tar.gz
-rw-rw-r-- mcvady/mcvady 11574 2015-05-13 15:59 lib/iniparser.h
-rw-rw-r-- mcvady/mcvady 17594 2015-05-13 15:59 lib/libiniparser.a
-rwxrwxr-x mcvady/mcvady 18867 2015-05-13 15:59 lib/libiniparser.so.0
-rw-rw-r-- mcvady/mcvady  2221 2015-05-13 15:59 makefile
-rwxrwxr-x mcvady/mcvady  1035 2015-05-13 15:59 package.sh
-rw-rw-r-- mcvady/mcvady   236 2015-05-13 15:59 README
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 src/
-rwxrwxr-x mcvady/mcvady  3718 2015-05-13 15:59 src/chunker-init
-rw-rw-r-- mcvady/mcvady 22744 2015-05-13 15:59 src/chunker.c
-rw-rw-r-- mcvady/mcvady  1066 2015-05-13 15:59 src/chunker.conf
-rw-rw-r-- mcvady/mcvady  2409 2015-05-13 15:59 src/chunker.h
-rwxrwxr-x mcvady/mcvady  2628 2015-05-13 15:59 src/chunker2s3.sh
-rw-rw-r-- mcvady/mcvady    98 2015-05-13 15:59 src/chunker_health-cron
-rwxrwxr-x mcvady/mcvady   969 2015-05-13 15:59 src/chunker_health.sh
-rw-rw-r-- mcvady/mcvady 12154 2015-05-13 15:59 src/connection.c
-rw-rw-r-- mcvady/mcvady  1325 2015-05-13 15:59 src/connection.h
-rw-rw-r-- mcvady/mcvady  5014 2015-05-13 15:59 src/stats.c
-rw-rw-r-- mcvady/mcvady   382 2015-05-13 15:59 src/stats.h
drwxrwxr-x mcvady/mcvady     0 2015-05-13 15:59 test/
-rw-rw-r-- mcvady/mcvady  2978 2015-05-13 15:59 test/test-cleanMarkerKeepLast.c
-rw-rw-r-- mcvady/mcvady  3159 2015-05-13 15:59 test/test-handshake.c
-rw-rw-r-- mcvady/mcvady  1923 2015-05-13 15:59 test/test-overflow.c
-rw-rw-r-- mcvady/mcvady   464 2015-05-13 15:59 TODO
+ STATUS=0
+ '[' 0 -ne 0 ']'
+ /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w .
+ exit 0
Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.MTVkPK
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ cd chunker-0.9.1
+ make chunker
gcc -std=gnu99 -O2 -Wall -c ./src/connection.c -o ./src/connection.o
gcc -std=gnu99 -O2 -Wall -c ./src/stats.c -o ./src/stats.o
gcc -std=gnu99 -O2 -Wall ./src/chunker.c ./src/connection.o ./src/stats.o -o chunker -I./lib -L./lib -liniparser
+ exit 0
Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.BluP5U
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ '[' /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 '!=' / ']'
+ rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
++ dirname /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ mkdir -p /home/mcvady/working/rpm/BUILDROOT
+ mkdir /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ cd chunker-0.9.1
+ rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ make PFX=/home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64 install
gcc -std=gnu99 -O2 -Wall -c ./src/connection.c -o ./src/connection.o
gcc -std=gnu99 -O2 -Wall -c ./src/stats.c -o ./src/stats.o
gcc -std=gnu99 -O2 -Wall ./src/chunker.c ./src/connection.o ./src/stats.o -o chunker -I./lib -L./lib -liniparser
install -m 775 chunker /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/bin
install -m 755 ./src/chunker-init /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/etc/init.d/chunker
install -m 644 ./src/chunker.conf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/etc
install -m 755 ./src/chunker2s3.sh /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts
install -m 755 ./src/chunker_health.sh /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts
install -m 644 ./src/chunker_health-cron /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/scripts
+ /usr/lib/rpm/find-debuginfo.sh --strict-build-id -m --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 /home/mcvady/working/rpm/BUILD/chunker-0.9.1
extracting debug info from /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64/opt/tsdb/bin/chunker
dwz: Too few files for multifile optimization
/usr/lib/rpm/sepdebugcrcfix: Updated 0 CRC32s, 1 CRC32s did match.
+ /usr/lib/rpm/check-buildroot
+ /usr/lib/rpm/redhat/brp-compress
+ /usr/lib/rpm/redhat/brp-strip-static-archive /usr/bin/strip
+ /usr/lib/rpm/brp-python-bytecompile /usr/bin/python 1
+ /usr/lib/rpm/redhat/brp-python-hardlink
+ /usr/lib/rpm/redhat/brp-java-repack-jars
Processing files: chunker-0.9.1-1.el7.centos.x86_64
Provides: chunker = 0.9.1-1.el7.centos chunker(x86-64) = 0.9.1-1.el7.centos config(chunker) = 0.9.1-1.el7.centos
Requires(interp): /bin/sh /bin/sh /bin/sh /bin/sh
Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1
Requires(pre): /bin/sh
Requires(post): /bin/sh
Requires(preun): /bin/sh
Requires(postun): /bin/sh
Requires: /bin/bash /bin/sh libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.9)(64bit) rtld(GNU_HASH)
Processing files: chunker-debuginfo-0.9.1-1.el7.centos.x86_64
Provides: chunker-debuginfo = 0.9.1-1.el7.centos chunker-debuginfo(x86-64) = 0.9.1-1.el7.centos
Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
Checking for unpackaged file(s): /usr/lib/rpm/check-files /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
Wrote: /home/mcvady/working/rpm/SRPMS/chunker-0.9.1-1.el7.centos.src.rpm
Wrote: /home/mcvady/working/rpm/RPMS/x86_64/chunker-0.9.1-1.el7.centos.x86_64.rpm
Wrote: /home/mcvady/working/rpm/RPMS/x86_64/chunker-debuginfo-0.9.1-1.el7.centos.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.vSpeIF
+ umask 022
+ cd /home/mcvady/working/rpm/BUILD
+ cd chunker-0.9.1
+ rm -rf /home/mcvady/working/rpm/BUILDROOT/chunker-0.9.1-1.el7.centos.x86_64
+ exit 0
~/working/chunker
[mcvady@centos7 chunker]$ ls -Ahl chunker-0.9.1-1.el7.centos.x86_64.rpm 
-rw-rw-r--. 1 mcvady mcvady 21K May 13 16:00 chunker-0.9.1-1.el7.centos.x86_64.rpm

やった!



SSH Tunneling for Fun and Profit

2015.04.06

First, to test, set up temporary Python HTTP server on the remote host:

[user@remotehost ~]$ mkdir tmp && cd tmp
[user@remotehost tmp]$ echo "HELLO WORLD" > index.html
[user@remotehost tmp]$ python -m http.server 8080 # python3
Serving HTTP on 0.0.0.0 port 8080 ...
[user@remotehost tmp]$ python -m SimpleHTTPServer 8080 # python2
Serving HTTP on 0.0.0.0 port 8080 ...

Then on the localhost use ssh to set up a tunnel. Here port 8081 on the local machine will tunnel through to 8080 on the remote host:

user@localhost ~ $ ssh -p 443 -f user@remotehost.com -L 8081:127.0.0.1:8080 -N
user@remotehost.com's password:

Test the tunnel with telnet on local machine.

user@localhost ~ $ telnet 127.0.0.1 8081
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET /

HELLO WORLD
Connection closed by foreign host.


Flask Development on a Raspberry Pi

2015.03.20

Currently the flog project requires lxml as a dependency. I had some issues pulling this in.

~ $ cd py_toy/
~/py_toy $ cat dependencies.txt
lxml
~/py_toy $ virtualenv -p `which python3` venv
Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in venv/bin/python3
Also creating executable in venv/bin/python
Installing setuptools, pip...done.
~/py_toy $ . venv/bin/activate
(venv)~/py_toy $ time pip install -r dependencies.txt
[ output truncated ]
    creating build/temp.linux-armv6l-3.4/src/lxml

    gcc -pthread -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=armv6 -mfloat-abi=hard -mfpu=vfp -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-3ikmlcvh/lxml/src/lxml/includes -I/usr/include/python3.4m -c src/lxml/lxml.etree.c -o build/temp.linux-armv6l-3.4/src/lxml/lxml.etree.o -w

    gcc: internal compiler error: Killed (program cc1)

    Please submit a full bug report,

    with preprocessed source if appropriate.

    See <https://github.com/archlinuxarm/PKGBUILDs/issues> for instructions.

    /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'bugtrack_url'

      warnings.warn(msg)

    error: command 'gcc' failed with exit status 4

    ----------------------------------------
    Command "/root/py_toy/venv/bin/python3 -c "import setuptools, tokenize;__file__='/tmp/pip-build-3ikmlcvh/lxml/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-ytt52_hh-record/install-record.txt --single-version-externally-managed --compile --install-headers /root/py_toy/venv/include/site/python3.4" failed with error code 1 in /tmp/pip-build-3ikmlcvh/lxml

real    27m18.069s
user    26m55.390s
sys     0m11.620s
(venv)~/py_toy $

I was exhausting all 512 MB of memory. As a workaround, I temporarily employed a 512 MB swapfile on the SD card.

(venv)~/py_toy $ sudo dd if=/dev/zero of=/swapfile bs=1M count=512
512+0 records in
512+0 records out
536870912 bytes (537 MB) copied, 132.228 s, 4.1 MB/s
(venv)~/py_toy $ sudo mkswap /swapfile
Setting up swapspace version 1, size = 524284 KiB
no label, UUID=c45c43c4-00dd-463b-a5ca-30ddeb0b102e
(venv)~/py_toy $ sudo chmod 600 /swapfile
(venv)~/py_toy $ sudo swapon /swapfile
(venv)~/py_toy $ time pip install -r dependencies.txt 
Collecting lxml (from -r dependencies.txt (line 1))
  Using cached lxml-3.4.2.tar.gz
    Building lxml version 3.4.2.
    Building without Cython.
    Using build configuration of libxslt 1.1.28
    Building against libxml2/libxslt in the following directory: /usr/lib
    /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'bugtrack_url'
      warnings.warn(msg)
Installing collected packages: lxml
  Running setup.py install for lxml
    Building lxml version 3.4.2.
    Building without Cython.
    Using build configuration of libxslt 1.1.28
    Building against libxml2/libxslt in the following directory: /usr/lib
    building 'lxml.etree' extension
    gcc -pthread -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=armv6 -mfloat-abi=hard -mfpu=vfp -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-8m8hfu47/lxml/src/lxml/includes -I/usr/include/python3.4m -c src/lxml/lxml.etree.c -o build/temp.linux-armv6l-3.4/src/lxml/lxml.etree.o -w
    gcc -pthread -shared -Wl,-O1,--sort-common,--as-needed,-z,relro build/temp.linux-armv6l-3.4/src/lxml/lxml.etree.o -L/usr/lib -L/usr/lib -lxslt -lexslt -lxml2 -lz -lm -lpython3.4m -o build/lib.linux-armv6l-3.4/lxml/etree.cpython-34m.so
    building 'lxml.objectify' extension
    gcc -pthread -Wno-unused-result -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -march=armv6 -mfloat-abi=hard -mfpu=vfp -O2 -pipe -fstack-protector --param=ssp-buffer-size=4 -fPIC -I/usr/include/libxml2 -I/tmp/pip-build-8m8hfu47/lxml/src/lxml/includes -I/usr/include/python3.4m -c src/lxml/lxml.objectify.c -o build/temp.linux-armv6l-3.4/src/lxml/lxml.objectify.o -w
    gcc -pthread -shared -Wl,-O1,--sort-common,--as-needed,-z,relro build/temp.linux-armv6l-3.4/src/lxml/lxml.objectify.o -L/usr/lib -L/usr/lib -lxslt -lexslt -lxml2 -lz -lm -lpython3.4m -o build/lib.linux-armv6l-3.4/lxml/objectify.cpython-34m.so
    /usr/lib/python3.4/distutils/dist.py:260: UserWarning: Unknown distribution option: 'bugtrack_url'
      warnings.warn(msg)
Successfully installed lxml-3.4.2

real    33m46.351s
user    32m43.210s
sys 0m16.700s
(venv)~/py_toy $

Success!



Sideloading Nexus Devices with the Android SDK

2014.11.13

Android 5.0 "Lollipop" was released yesterday and I wanted to check it out on my Nexus 7 2013 WiFi tablet without having to wait for the update to be pushed. I've done this several times with various Nexus devices now, but so infrequently that I always have to look up how to do it. So this time I'm taking some notes. It should be noted that most of this information is just scraped from the flash-all.{bat,sh} included in the factory image.

First off, Nexus factory images are listed here. Start off by pulling the proper one down, verifying the integrity, and then extracting the tarball:

~ $ mkdir tmp && cd tmp && wget -q https://dl.google.com/dl/android/aosp/razor-lrx21p-factory-ba55c6ab.tgz
~/tmp $ md5sum razor-lrx21p-factory-ba55c6ab.tgz 
fd868b03bd00074dd7f70e31ad73b25a  razor-lrx21p-factory-ba55c6ab.tgz
~/tmp $ tar xf razor-lrx21p-factory-ba55c6ab.tgz 
~/tmp $ ls razor-lrx21p
bootloader-flo-flo-04.04.img  flash-all.bat  flash-all.sh  flash-base.sh  image-razor-lrx21p.zip

To start the bootloader will need to be unlocked. This will wipe the data on the device, but once unlocked this is no longer an issue when flashing in the future. Sideloading the image requires the Android SDK platform tools.

First thing's first: get into the bootloader. Begin by plugging the tablet into the PC and verifying that it's connected.

~/android-studio/sdk/platform-tools $ ./adb devices -l
List of devices attached 
0a16e983               device usb:1-1.2 product:razor model:Nexus_7 device:flo

Now reboot into the bootloader:

~/android-studio/sdk/platform-tools $ ./adb reboot bootloader

Once in the bootloader make sure the device is connected/detected:

~/android-studio/sdk/platform-tools $ sudo ./fastboot devices -l
0a16e983               fastboot usb:1-1.2

If the bootloader is not already unlocked this will need to be done first (note: this wipes the device, so be sure to back things up beforehand). Unlock the bootloader with the following command (follow the prompts on the device; it'll warn about wiping the device clean):

~/android-studio/sdk/platform-tools $ sudo ./fastboot oem unlock
...
(bootloader) Unlocking bootloader...
(bootloader) erasing userdata...
(bootloader) erasing userdata done
(bootloader) erasing cache...
(bootloader) erasing cache done
(bootloader) Unlocking bootloader done!
OKAY [ 65.559s]
finished. total time: 65.559s

Now flash the bootloader image downloaded earlier:

~/android-studio/sdk/platform-tools $ sudo ./fastboot  flash bootloader ~/tmp/razor-lrx21p/bootloader-flo-flo-04.04.img 
sending 'bootloader' (3911 KB)...
OKAY [  0.192s]
writing 'bootloader'...
OKAY [  1.936s]
finished. total time: 2.128s

And reboot into the bootloader again:

~/android-studio/sdk/platform-tools $ sudo ./fastboot reboot-bootloader
rebooting into bootloader...
OKAY [  0.006s]
finished. total time: 0.006s

Next flash the zip image:

~/android-studio/sdk/platform-tools $ sudo ./fastboot -w update ~/tmp/razor-lrx21p/image-razor-lrx21p.zip 
archive does not contain 'boot.sig'
archive does not contain 'recovery.sig'
archive does not contain 'system.sig'
--------------------------------------------
Bootloader Version...: FLO-04.04
Baseband Version.....: none
Serial Number........: 0a16e983
--------------------------------------------
checking product...
OKAY [  0.003s]
checking version-bootloader...
OKAY [  0.004s]
sending 'boot' (7154 KB)...
OKAY [  0.347s]
writing 'boot'...
OKAY [  0.420s]
sending 'recovery' (7740 KB)...
OKAY [  0.369s]
writing 'recovery'...
OKAY [  0.297s]
erasing 'system'...
OKAY [  1.510s]
sending 'system' (799121 KB)...
OKAY [ 37.893s]
writing 'system'...
OKAY [ 35.392s]
erasing 'userdata'...
OKAY [ 23.679s]
formatting 'userdata' partition...
Creating filesystem with parameters:
    Size: 28856791040
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 32768
    Label: 
    Blocks: 7045115
    Block groups: 215
    Reserved block group size: 1024
Created filesystem with 11/1761280 inodes and 154578/7045115 blocks
sending 'userdata' (139085 KB)...
writing 'userdata'...
OKAY [ 13.485s]
erasing 'cache'...
OKAY [  0.406s]
formatting 'cache' partition...
Creating filesystem with parameters:
    Size: 587202560
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 7168
    Inode size: 256
    Journal blocks: 2240
    Label: 
    Blocks: 143360
    Block groups: 5
    Reserved block group size: 39
Created filesystem with 11/35840 inodes and 4616/143360 blocks
sending 'cache' (10984 KB)...
writing 'cache'...
OKAY [  1.033s]
rebooting...

finished. total time: 114.857s

And now it's finished. If the bootloader was already locked previously, then you can remove the -w flag in the last command to avoid wiping the device (note: I've not tried this yet).



Debugging CGI / CGit

2014.08.26
cgi | cgit

I've been using CGit as a git web front-end for a bit now and just recently started looking into customizing the root header. Assuming I'd have to hack the code to do so, I decided to pull down the source and build it.

~ $ git clone http://git.zx2c4.com/cgit/
~ $ cd cgit/
~/cgit $ make get-git && make

After perusing cgit.c and ui-shared.c I was pleasantly surprised to find I wouldn't have to hack anything; it seems that just about everything I wanted to change was configurable via the cgit config file (default: /etc/cgitrc). For example for changing the root title and description, just set root-title and root-desc:

~ $ grep 'root' /etc/cgitrc
root-title=bunkergate.org
root-desc=git repository browser

This worked fine, but what about changing the logo? Just overwriting the logo.png in the resources directory should work, but I want to use an animated gif. The file extension then would be technically incorrect, the worst kind of incorrect. Fortunately, it too looks like this could be set with logo in cgitrc as well. But this didn't seem to work. What's going on?

To run cgit from the CLI, simply do the following. HTML output is printed to stdout and errors are printed to stderr. This will generate the root index content.

~/cgit $ CGIT_CONFIG="./cgitrc" ./cgit 1>stdout.html 2>stderr.log

As an example, to see the content generated for a specific repo, do the following:

~/cgit $ CGIT_CONFIG="./cgitrc" QUERY_STRING="url=bunkergate" ./cgit 1>stdout.html 2>stderr.log
~/cgit $ CGIT_CONFIG="./cgitrc" QUERY_STRING="url=bunkergate/tree/index.html" ./cgit 1>stdout.html 2>stderr.log

It's worth noting that this is probably a basic template for debugging any CGI.

Setting logo in the configuration file didn't seem to have the desired effect. How can we see what's going on? Simple, run it in GDB:

~/cgit $ CGIT_CONFIG="./cgitrc" QUERY_STRING="url=bunkergate/tree/index.html" gdb ./cgit

So what was happening? Well after setting a watchpoint on ctx.cfg.logo I noticed something peculiar. The variable was getting set to the value I expected, but then later it was getting set yet again to the undesired value. Turns out that the problem was that I had set logo twice in the configuration file. Ugh.


>>>

HTML5 | CSS3