Add bitmask 0.9.0alpha2 spec file
[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] [-r FILE] [-s] [-a (32|64)] -v VERSION -k KEY_FILE -R (S|U)
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     -k KEY_FILE  use this key file to sign the release
44     -r FILE      use particular repo/ file to do the tuf stuff. FILE must be a .tar.gz file.
45     -s           run the setup process, create virtualenv and install dependencies.
46     -v VERSION   version to work with. This is a mandatory argument.
47     -R REPO      use the (S)table or (U)nstable TUF web repo.
48 EOF
49 }
50
51 get_args() {
52     # from: http://mywiki.wooledge.org/BashFAQ/035#getopts
53     local OPTIND
54
55     ARCH="64"
56     SETUP="NO"
57
58     while getopts "hr:sv:a:k:R:" opt; do
59         case "$opt" in
60             h)
61                 show_help
62                 exit 0
63                 ;;
64             v)  VERSION=$OPTARG
65                 ;;
66             r)  REPO=`realpath $OPTARG`
67                 ;;
68             s)  SETUP='YES'
69                 ;;
70             k)  KEY_FILE=`realpath $OPTARG`
71                 ;;
72             a)  ARCH=$OPTARG
73                 ;;
74             R)  WEB_REPO=$OPTARG
75                 ;;
76             '?')
77                 show_help >&2
78                 exit 1
79                 ;;
80         esac
81     done
82     shift "$((OPTIND-1))" # Shift off the options and optional --.
83
84     if [[ -z $VERSION ]]; then
85         echo 'Error: missing -v flag'
86         show_help
87         exit 1
88     fi
89     if [[ -z $KEY_FILE ]]; then
90         echo 'Error: missing -k flag'
91         show_help
92         exit 1
93     fi
94     if [[ -z $WEB_REPO ]]; then
95         echo 'Error: missing -R flag'
96         show_help
97         exit 1
98     else
99         if [[ $WEB_REPO != 'S' && $WEB_REPO != 'U' ]]; then
100             echo 'Error: invalid parameter for the -R flag'
101             show_help
102             exit 2
103         fi
104     fi
105
106     echo "---------- settings ----------"
107     echo "Arch: $ARCH"
108     echo "Key: $KEY_FILE"
109     echo "Repo: $REPO"
110     echo "Setup: $SETUP"
111     echo "Version: $VERSION"
112     echo "Web repo: $WEB_REPO"
113     echo "--------------------"
114     read -p "Press <Enter> to continue, <Ctrl>+C to exit. "
115 }
116
117 # ----------------------------------------
118
119 do_init(){
120     # Initialize the needed variables and create the work directory.
121
122     BASE=`pwd`
123     WORKDIR=$BASE/workdir
124     VENVDIR=$WORKDIR/tuf.venv
125
126     BITMASK="Bitmask-linux$ARCH-$VERSION"
127     RELEASE=$BASE/release.py
128
129     if [[ ! -f $RELEASE ]]; then
130         echo "ERROR: you need to copy the release.py file into this directory."
131     fi
132
133     if [[ ! -f $KEY_FILE ]]; then
134         echo "ERROR: the specified key file does not exist."
135     fi
136
137     # Initialize path
138     mkdir -p $WORKDIR
139 }
140
141 do_setup() {
142     # Create a clean virtualenv and install the needed dependencies.
143     echo "${cc_yellow}-> Setting up virtualenv and installing dependencies...${cc_normal}"
144     cd $WORKDIR
145
146     # remove existing virtualenv
147     [[ -d $VENVDIR ]] && rm -fr $VENVDIR
148
149     virtualenv $VENVDIR
150     source $VENVDIR/bin/activate
151     pip install tuf[tools] pycrypto
152 }
153
154 do_tuf_stuff() {
155     cd $WORKDIR
156     cp $BASE/$BITMASK.tar.bz2 .
157
158     rm -fr repo/
159     mkdir repo && cd repo/
160
161     if [[ $ARCH == "64" ]]; then
162         TUF_ARCH='linux-x86_64'
163     else
164         TUF_ARCH='linux-i386'
165     fi
166
167     if [[ $WEB_REPO == 'S' ]]; then
168         TUF_URL=https://dl.bitmask.net/tuf/$TUF_ARCH/metadata/
169     else
170         TUF_URL=https://dl.bitmask.net/tuf-unstable/$TUF_ARCH/metadata/
171     fi
172
173     if [[ -z $REPO ]]; then
174         # Download old repo metadata
175         echo "${cc_yellow}-> Downloading metadata files from the old bundle...${cc_normal}"
176         wget --quiet --recursive --no-host-directories --cut-dirs=2 --no-parent --reject "index.html*" $TUF_URL
177         mv metadata metadata.staged
178     else
179         echo "${cc_yellow}-> Extracting metadata files from the repo file...${cc_normal}"
180         # we need that specific folder without the repo/ parent path
181         tar xzf $REPO repo/metadata.staged/ --strip-components=1
182     fi
183
184     echo "${cc_yellow}-> Uncompressing bundle and moving to its place...${cc_normal}"
185     tar xjf $BASE/$BITMASK.tar.bz2  # fresh bundled bundle
186     rm -fr $BITMASK/repo/  # We must not add that folder to the tuf repo.
187     rm -fr targets
188     mv $BITMASK targets
189
190     echo "${cc_yellow}-> Doing release magic...${cc_normal}"
191     $RELEASE $WORKDIR/repo $KEY_FILE
192
193     echo "${cc_yellow}-> Creating output file...${cc_normal}"
194     cd $WORKDIR
195     mkdir -p output
196     rm -f output/$BITMASK-tuf.tar.bz2
197     tar cjf output/$BITMASK-tuf.tar.bz2 repo/
198 }
199
200
201 get_args $@
202
203 do_init
204
205 if [[ $SETUP == 'YES' ]]; then
206     do_setup
207 else
208     if [[ ! -f $VENVDIR/bin/activate ]]; then
209         echo "${cc_red}Error:${cc_normal} missing virtualenv, you need to use the -s switch."
210         exit 1
211     fi
212     source $VENVDIR/bin/activate
213 fi
214
215 do_tuf_stuff
216
217 echo "${cc_green}TUF release complete.${cc_normal}"
218 echo "You can find the resulting file in:"
219 echo "$WORKDIR/output/$BITMASK-tuf.tar.bz2"