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