summaryrefslogtreecommitdiff
path: root/build_medkit.sh
blob: acef1c497798b50571d06c088bb6a2c73053fd61 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
#!/bin/sh
# TODO add support for additional files
set -e
## Define variables with their default values ##
BRANCH=
MODEL=
L10N=en,cs
LISTS=
VERSION=

## Parse arguments ##
while [ $# -gt 0 ]; do
	case "$1" in
		-h|--help)
			echo "This script generates Turris medkit using packages lists and updater-ng."
			echo "Usage: $0 [OPTION].. MODEL [BRANCH]"
			echo
			echo "Model:"
			echo "  Model is Turris device model. Only supported ones at the moment"
			echo "  are 'turris' for Turris 1.x and 'omnia' for Turris Omnia."
			echo "Branch:"
			echo "  This optionally specifies source branch for packages."
			echo "  If no branch is specified then deploy is used (branch"
			echo "  identified only just by model, no branch name appended)."
			echo "Options:"
			echo "  --help, -h"
			echo "    Print this text and exit."
			echo "  --localization, -l LOCALIZATION,.."
			echo "    After this argument a list of language codes to be added to"
			echo "    medkit should be specified. Language codes should be"
			echo "    separated by comma. In default en,cs is used."
			echo "  --lists, -p PKGLIST,.."
			echo "    What lists should be added to medkit. In default no"
			echo "    additional lists will be added. Multiple lists can be"
			echo "    specified by separating them by commas."
			echo "  --version VERSION"
			echo "    This option allows you to specify exact Turris OS version."
			echo "    If you do so then archive will be used for generating medkit"
			echo "    (this means that using latest version won't work with this"
			echo "    option)."
			exit 0
			;;
		--localization|-l)
			shift
			L10N="$1"
			;;
		--lists|-p)
			shift
			LISTS="$1"
			;;
		--version)
			shift
			VERSION="$1"
			echo "Version option is not yet implemented."
			exit 1
			;;
		*)
			if [ -z "$MODEL" ]; then
				MODEL="$1"
			elif [ -z "$BRANCH" ]; then
				if [ "$1" == "deploy" ]; then
					BRANCH=
				else
					BRANCH="-$1"
				fi
			else
				echo "Unknown option: $1" >&2
				exit 1
			fi
			;;
	esac
	shift
done

[ -n "$MODEL" ] || {
	echo "You have to specify Turris router model." >&2
	exit 1
}


## Build needed tools ##
# Git puller helper function (git_pull output_path source_url)
git_pull() {
	if [ ! -d $1 ]; then
		git clone $2 $1
		(
		cd $1
		git submodule update --init --recursive
		)
	else
		(
		cd $1
		git fetch
		if ! git diff --quiet HEAD origin/HEAD; then
			git clean -Xdf
			git reset --hard origin/master
			git submodule update --init --recursive
		fi
		)
	fi
}
# Wget puller helper function (wget_pull output_file source_url)
wget_pull() {
	if [ ! -e $1 ] || [ $(expr $(date -u +%s) - $(stat -c %Z $1)) -gt 86400 ]; then
		wget $2 -O $1
	fi
}

# Usign
git_pull .usign git://git.openwrt.org/project/usign.git
(
cd .usign
cmake .
make
)

# Updater-ng
git_pull .updater https://gitlab.labs.nic.cz/turris/updater.git
make -C .updater NO_DOC=1 LUA_COMPILE:=no

# Get public parts of signing keys
for K in release standby test; do
	wget_pull .$K.pub https://gitlab.labs.nic.cz/turris/turris-os-packages/raw/test/cznic/cznic-repo-keys/files/$K.pub
done

## Export some variables that are used by pkgupdate lua script
export L10N
export LISTS
export ROOT="$(readlink -f "root-$MODEL$BRANCH")"


## Dump updater-ng entry script ##
export UPDATER_CONFIG=".updater-$MODEL$BRANCH.lua"
cat > "$UPDATER_CONFIG" <<EOF
-- Load requested localizations
l10n = {}
for lang in os.getenv('L10N'):gmatch('[^,]+') do
	table.insert(l10n, lang)
end
Export('l10n')

-- This is helper function for including localization packages.
-- (This is copy of standard entry function that can be found in pkgupdate entry.lua)
function for_l10n(fragment)
	for _, lang in pairs(l10n or {}) do
		Install(fragment .. lang, {ignore = {'missing'}})
	end
end
Export('for_l10n')

local script_options = {
	security = 'Remote',
	ca = system_cas,
	crl = no_crl,
	pubkey = {
		'file://$PWD/.release.pub',
		'file://$PWD/.standby.pub',
		'file://$PWD/.test.pub'
	}
}
base_url = 'https://repo.turris.cz/$MODEL$BRANCH/lists/'

-- Aways include base script
Script('base',  base_url .. 'base.lua', script_options)

-- Now include any additional lists
local userlists_file = io.open('userlists', 'r')
for list in os.getenv('LISTS'):gmatch('[^,]+') do
	Script('userlist-' .. list,  base_url .. list, script_options)
end
EOF

# Create /tmp/sysinfo files
# TODO we should use some internal option of updater it self
mkdir -p /tmp/sysinfo
if [ "$MODEL" = "omnia" ]; then
	echo "Turris Omnia" > /tmp/sysinfo/model
else # Else Turris 1.x (yes this is wrong but it's just temporally)
	echo "Turris" > /tmp/sysinfo/model
fi
# We are only using board_name anyway atm.
echo "rtunknown" > /tmp/sysinfo/board_name



## Generate root ##
fakeroot -- sh -s <<EOF
set -e

mkdir -p "$ROOT"
## Create base filesystem for updater
ln -sf tmp "$ROOT/var"
# Create lock required by updater
mkdir -p "$ROOT/tmp/lock"
# Create opkg status file and info file
mkdir -p "$ROOT/usr/lib/opkg/info"
touch "$ROOT/usr/lib/opkg/status"
# And updater directory
mkdir -p "$ROOT/usr/share/updater"

## Run updater it self
.updater/bin/pkgupdate --out-of-root --usign=.usign/usign -R "$ROOT" \
	--batch "file://$UPDATER_CONFIG"

## Tar root in current directory
(
cd "$ROOT"
# Do cleanups first
rm -f var/lock/opkg.lock
rm -f usr/share/updater/flags
rm -rf usr/share/updater/unpacked
rm -rf var/opkg-collided
# Now create archive
tar -czf "../medkit-$MODEL$BRANCH.tar.gz" .
)
EOF

## Cleanup ##
rm -rf "$ROOT"
rm -f "$UPDATER_CONF"