6a9178e101cfe2a66faac44480cb496651fea07d
[bitmask_bundler.git] / tuf-stuff.sh
1 #!/bin/bash
2
3 # Needed files:
4 #   Bitmask-linux32-0.7.0.tar.bz2  # fresh bundled bundle
5 #   Bitmask-linux64-0.7.0.tar.bz2  # fresh bundled bundle
6 #   tuf_private_key.pem            # private key
7 #   tuf-stuff.sh                   # this script
8
9 # Output:
10 #   workdir/ <-- temporary folder: virtualenv, bundle, repo.tar.gz, key
11 #   output/  <-- here you'll find the resulting compressed repo/bundle
12
13
14 # Expected directory structure for the repo after the script finishes:
15 # $ tree workdir/repo/
16 # repo
17 # ├── metadata.staged
18 # │   ├── root.json
19 # │   ├── snapshot.json
20 # │   ├── snapshot.json.gz
21 # │   ├── targets.json
22 # │   ├── targets.json.gz
23 # │   └── timestamp.json
24 # └── targets
25 #     ... Bitmask bundle files ...
26
27 set -e  # Exit immediately if a command exits with a non-zero status.
28
29 # Set some colors variables
30 esc=`echo -en "\033"`
31 cc_red="${esc}[31m"
32 cc_green="${esc}[32m"
33 cc_yellow="${esc}[33m"
34 cc_normal="${esc}[39m"
35
36 show_help() {
37 cat << EOF
38 Usage: ${0##*/} [-h] [-s] [-a (32|64)] -v VERSION
39 Do stuff for version VERSION and arch ARCH.
40
41     -h          display this help and exit.
42     -a ARCH     do the tuf stuff for that ARCH, 32 or 64 bits. The default is '64'.
43     -s          run the setup process, create virtualenv and install dependencies.
44     -v VERSION  version to work with. This is a mandatory argument.
45 EOF
46 }
47
48 get_args() {
49     # from: http://mywiki.wooledge.org/BashFAQ/035#getopts
50     local OPTIND
51
52     ARCH="64"
53
54     while getopts "hsv:a:" opt; do
55         case "$opt" in
56             h)
57                 show_help
58                 exit 0
59                 ;;
60             v)  VERSION=$OPTARG
61                 ;;
62             s)  SETUP='YES'
63                 ;;
64             a)  ARCH=$OPTARG
65                 ;;
66             '?')
67                 show_help >&2
68                 exit 1
69                 ;;
70         esac
71     done
72     shift "$((OPTIND-1))" # Shift off the options and optional --.
73
74     if [[ -z $VERSION ]]; then
75         echo 'Missing -v flag'
76         show_help
77         exit 1
78     fi
79 }
80
81 # ----------------------------------------
82
83 do_init(){
84     # Initialize the needed variables and create the work directory.
85
86     BASE=`pwd`
87     WORKDIR=$BASE/workdir
88     VENVDIR=$WORKDIR/tuf.venv
89
90     BITMASK="Bitmask-linux$ARCH-$VERSION"
91     KEY="$BASE/tuf_private_key.pem"
92     RELEASE=$BASE/../bitmask_client/pkg/tuf/release.py
93
94     # Initialize path
95     mkdir -p $WORKDIR
96 }
97
98 do_setup() {
99     # Create a clean virtualenv and install the needed dependencies.
100     echo "${cc_yellow}-> Setting up virtualenv and installing dependencies...${cc_normal}"
101     cd $WORKDIR
102
103     # remove existing virtualenv
104     [[ -d $VENVDIR ]] && rm -fr $VENVDIR
105
106     virtualenv $VENVDIR
107     source $VENVDIR/bin/activate
108     pip install tuf[tools] pycrypto
109 }
110
111 do_tuf_stuff() {
112     cd $WORKDIR
113     cp $BASE/$BITMASK.tar.bz2 .
114
115     rm -fr repo/
116     mkdir repo && cd repo/
117
118     if [[ $ARCH == "64" ]]; then
119         TUF_ARCH='linux-x86_64'
120     else
121         TUF_ARCH='linux-i386'
122     fi
123
124     # Download old repo metadata
125     echo "${cc_yellow}-> Downloading metadata files from the old bundle...${cc_normal}"
126     wget --quiet --recursive --no-host-directories --cut-dirs=2 --no-parent --reject "index.html*" https://dl.bitmask.net/tuf/$TUF_ARCH/metadata/
127     mv metadata metadata.staged
128
129     echo "${cc_yellow}-> Uncompressing bundle and moving to its place...${cc_normal}"
130     tar xjf $BASE/$BITMASK.tar.bz2  # fresh bundled bundle
131     rm -fr $BITMASK/repo/  # We must not add that folder to the tuf repo.
132     rm -fr targets
133     mv $BITMASK targets
134
135     echo "${cc_yellow}-> Doing release magic...${cc_normal}"
136     $RELEASE $WORKDIR/repo $KEY
137
138     echo "${cc_yellow}-> Creating output file...${cc_normal}"
139     cd $WORKDIR
140     mkdir -p output
141     rm -f output/$BITMASK-tuf.tar.bz2
142     tar cjf output/$BITMASK-tuf.tar.bz2 repo/
143 }
144
145
146 get_args $@
147
148 do_init
149
150 if [[ -n $SETUP ]]; then
151     do_setup
152 else
153     if [[ ! -f $VENVDIR/bin/activate ]]; then
154         echo "${cc_red}Error:${cc_normal} missing virtualenv, you need to use the -s switch."
155         exit 1
156     fi
157     source $VENVDIR/bin/activate
158 fi
159
160 do_tuf_stuff
161
162 echo "${cc_green}TUF release complete.${cc_normal}"
163 echo "You can find the resulting file in:"
164 echo "$WORKDIR/output/$BITMASK-tuf.tar.bz2"