This repository was archived by the owner on Feb 4, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 103
/
Copy pathandrodeb
executable file
·294 lines (238 loc) · 9.48 KB
/
androdeb
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
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#!/bin/bash -e
#
# (c) Joel Fernandes <[email protected]>
VERSION=v0.99c
spath="$(dirname "$(readlink -f "$0")")"
# spath=$( cd "$(dirname "$0")" ; pwd -P )
curdir=$( pwd -P )
source $spath/utils/android
source $spath/utils/banners
# Set default vars
DISTRO=buster; ARCH=arm64
ADB="adb"
# Default packages
DEFAULT_PACKAGES+="bash
ca-certificates"
EXTRA_FILES="none"
config_full_build() {
for f in $(ls $spath/packages); do source $spath/packages/$f; done;
}
# Parse command line parameters
if [ $# -lt 1 ]; then usage; fi; POSITIONAL=()
while [[ $# -gt 0 ]]; do key="$1";
# If its shell mode, any future args become shell's args
if [ "x$ASHELL" == "x1" ]; then
if [ -z "$SHELL_ARGS" ]; then
SHELL_ARGS=$key
else
SHELL_ARGS="$SHELL_ARGS $key"
fi
shift || true; continue
fi
case $key in
prepare) PREPARE=1; shift || true; ;;
shell) ASHELL=1; shift || true; ;;
remove) REMOVE=1; shift || true; ;;
git-pull) GIT_PULL=1; shift || true; ;;
pull) PULL=1; shift || true; break ;;
push) PUSH=1; shift || true; break ;;
--arch) ARCH=$2; shift || true; shift || true; ;;
--archive) TARF=$2; shift || true; shift || true; ;;
--tracers) source $spath/packages/tracers; shift || true; ;;
--compilers) source $spath/packages/compilers; shift || true; ;;
--editors) source $spath/packages/editors; shift || true; ;;
--scheduler) source $spath/packages/scheduler; shift || true; ;;
--fullbuild) config_full_build; shift || true; ;;
--download) DOWNLOAD=1; shift || true; ;;
--bcc) source $spath/packages/bcc; shift || true; ;;
--kernelsrc) KERNELSRC="$2"; shift || true; shift || true; ;;
--skip-install) SKIP_INSTALL=1; shift || true; ;;
--kernel-headers-targz) KERNELHDRS=$2; shift || true; shift || true; ;;
--tempdir) TDIR="$2"; shift || true; shift || true; ;;
--buildtar) TARDIR="$2"; shift || true; shift || true; ;;
--device|-s) ADB="$ADB -s $2"; shift || true; shift || true; ;;
--build-image) BUILD_IMAGE=$2; shift || true; shift || true; ;;
--debug) set -x; shift || true; ;;
*) echo "Unknown option ($1)"; usage; ;;
esac
done
if [ ! -z "$GIT_PULL" ]; then
echo "Updating androdeb by git pull"
cd $spath
git pull
echo "Done."
exit 0
fi
if [ ! -z "$PULL" ]; then
if [ $1 == "-a" ]; then
PRESERVE="-a"
echo "Preserving filestamps and mode"
shift || true
fi
file_count=`count_sources $@`
i=0
while [ $i -lt $file_count ]; do
files["$i"]=/data/androdeb/debian/$1
shift || true
i=$((i + 1))
done
$ADB pull $PRESERVE "${files[@]}" "$@"
exit 0
fi
if [ ! -z "$PUSH" ]; then
file_count=`count_sources $@`
i=0
while [ $i -lt $file_count ]; do
files["$i"]=$1
shift || true
i=$((i + 1))
done
dest=/data/androdeb/debian/$1
$ADB push $sync "${files[@]}" $dest
exit 0
fi
if [ -z "$ASHELL" ] && [ -z "$REMOVE" ] && [ -z "$PACKAGES" ]; then
echo "No packages specified, so I'm going to build/install all packages (--fullbuild)"
config_full_build
fi
if [[ ! -z ${TARDIR+x} ]] && [[ ! -d $TARDIR ]]; then die 7 "Tar dir specified doesn't exist"; fi
if [ -z "$BUILD_IMAGE" ]; then
do_adb_root "$ADB" || die 3 "adb root failed, make sure:
- If multiple devices connected, provide --device <serialno> (or -s <serialno>)
- Try to run \"adb root\" manually and see if it works. Typically this needs a userdebug build.
Note: adb can be typically obtained using the android-tools-adb or the adb
packages on your distro, or by installing the Android SDK."
fi
if [ ! -z "$REMOVE" ]; then
die_if_no_androdeb "Nothing to remove."
$ADB shell /data/androdeb/device-umount-all || true;
$ADB shell rm -rf /data/androdeb; exit 0; fi
##########################################################
# SHELL
##########################################################
if [ ! -z ${ASHELL+x} ]; then
set +e; $ADB shell ls /data/androdeb/debian/.bashrc > /dev/null 2>&1
if [ $? -ne 0 ]; then
die 2 "Device doesn't have an androdeb environment, run \"./androdeb prepare\" first";
fi; set -e
if [ ! -z ${SHELL_ARGS+x} ]; then
# Explanation of quotes:
# Outer quote is so that androdeb's bash passes the SHELL_ARGS as a single
# argument to $ADB shell. Inner quotes is so that run-command can receive all
# the args even though they may be separated by spaces. \m/
$ADB shell -t /data/androdeb/run-command "\"$SHELL_ARGS\""
else
$ADB shell -t /data/androdeb/run
fi
exit 0
fi
##########################################################
# PREPARE
##########################################################
function do_cleanup() {
rm -rf $TDIR/*; if [ $MKTEMP -eq 1 ]; then rm -rf $TDIR; fi
}
function push_unpack_headers() {
die_if_no_androdeb "Couldn't update headers."
$ADB shell rm -rf /data/androdeb/debian/kernel-headers/
$ADB shell mkdir /data/androdeb/debian/kernel-headers/
$ADB push $TDIR_ABS/kh.tgz /data/androdeb/
echo "Storing kernel headers into androdeb /kernel-headers/"
$ADB shell tar -xvf /data/androdeb/kh.tgz -C /data/androdeb/debian/kernel-headers/ > /dev/null
$ADB shell rm /data/androdeb/kh.tgz
}
function push_unpack_tarred_headers() {
die_if_no_androdeb "Couldn't update headers."
$ADB shell rm -rf /data/androdeb/debian/kernel-headers/
$ADB shell mkdir /data/androdeb/debian/kernel-headers/
$ADB push $1 /data/androdeb/
echo "Storing kernel headers into androdeb root directory"
$ADB shell tar -xvf /data/androdeb/$(basename $1) -C /data/androdeb/debian/ > /dev/null
$ADB shell rm /data/androdeb/$(basename $1)
}
function all_done_banner() {
echo "All done! Run \"androdeb shell\" to enter environment"
}
# Prepare is the last command checked
if [ -z "$PREPARE" ]; then usage; fi
if [ ! -z "$TARF" ] && [ ! -f $TARF ] && [ -z "$DOWNLOAD" ]; then die 5 "archive provided doesn't exist"; fi
if [ ! -z "$KERNELSRC" ] && [ ! -d $KERNELSRC ]; then die 6 "Kernel source directory provided doesn't exist"; fi
if [ ! -z "$KERNELHDRS" ] && [ ! -f $KERNELHDRS ]; then die 7 "Kernel headers tar.gz doesn't exist"; fi
print_prepare_banner
# Where do we want to store temporary files
MKTEMP=0; if [[ -z ${TDIR+x} ]] || [[ ! -d "${TDIR}" ]]; then
TDIR=`mktemp -d`; MKTEMP=1; fi
rm -rf $TDIR/*
TDIR_ABS=$( cd "$TDIR" ; pwd -P )
if [ ! -z "$DOWNLOAD" ]; then
echo "Downloading Androdeb from the web..."; echo ""
# Github dropped tar gz support! ##?#??#! Now we've to zip everything.
curl -L https://github.com/joelagnel/androdeb/releases/download/$VERSION/androdeb-fs.tgz.zip --output $TDIR_ABS/androdeb-fs.tgz.zip;
unzip -e $TDIR_ABS/androdeb-fs.tgz.zip -d $TDIR_ABS/
TARF=$TDIR_ABS/androdeb-fs.tgz; fi
OUT_TMP=$TDIR/debian; rm -rf $OUT_TMP; mkdir -p $OUT_TMP
# Unpack the supplied kernel headers tar.gz directly into androdeb root
if [ ! -z "$KERNELHDRS" ]; then
echo "Building updating kernel headers from supplied tar.gz ($KERNELHDRS)"
# Is header tar gz update the only thing left to do?
if [[ ! -z "$SKIP_INSTALL" ]]; then
echo "Skipping install"
push_unpack_tarred_headers $KERNELHDRS; do_cleanup; all_done_banner; exit 0; fi
tar -xvf $KERNELHDRS -C $OUT_TMP/ > /dev/null
fi
# Package kernel headers
if [ ! -z "$KERNELSRC" ]; then
echo "Building and updating kernel headers from kernel source dir ($KERNELSRC)"
$spath/bcc/build-kheaders-targz.sh ${KERNELSRC} $TDIR_ABS/kh.tgz > /dev/null
# Is header update the only thing left to do?
if [[ ! -z "$SKIP_INSTALL" ]]; then
echo "Skipping install"
push_unpack_headers; do_cleanup; all_done_banner; exit 0; fi
mkdir $OUT_TMP/kernel-headers
tar -xvf $TDIR_ABS/kh.tgz -C $OUT_TMP/kernel-headers/ > /dev/null
fi
# Build FS from existing tar, very simple.
if [ ! -z "$TARF" ]; then
echo "Using archive at $TARF for filesystem preparation"
$ADB shell mkdir -p /data/androdeb/
$ADB push $TARF /data/androdeb/deb.tar.gz
$ADB push $spath/addons/* /data/androdeb/
$ADB shell /data/androdeb/device-unpack
if [ ! -z "$KERNELHDRS" ]; then push_unpack_tarred_headers $KERNELHDRS; fi
if [ ! -z "$KERNELSRC" ]; then push_unpack_headers; fi
do_cleanup; all_done_banner; exit 0
fi
PACKAGES+="$DEFAULT_PACKAGES"
echo "Using temporary directory: $TDIR"
if [[ $EUID -ne 0 ]]; then echo "The next stage runs as sudo, please enter password if asked."; fi
SKIP_COMPRESS=0; if [ ! -z "$BUILD_IMAGE" ]; then SKIP_COMPRESS=1; fi
ex_files=$(mktemp); echo $EXTRA_FILES > $ex_files
sudo $spath/buildstrap $ARCH $DISTRO $TDIR $OUT_TMP \
"$(make_csv "$PACKAGES")"\
$ex_files $INSTALL_BCC $SKIP_COMPRESS
rm $ex_files
# If we only wanted to prepare a rootfs and don't have
# a device connected, then just echo that and skip cleanup
if [ ! -z "$BUILD_IMAGE" ]; then
echo "For --build-image, only the image is built"
echo "Note that BCC will not be built on the image, you've to do it yourself"
sudo $spath/buildimage $OUT_TMP $(dirname $BUILD_IMAGE)/$(basename $BUILD_IMAGE)
sudo chmod a+rw $(dirname $BUILD_IMAGE)/$(basename $BUILD_IMAGE)
do_cleanup; echo "Your .img has been built! Enjoy!"; exit 0
fi
# Push tar to device and start unpack
$ADB shell mkdir -p /data/androdeb/
$ADB push $TDIR/deb.tar.gz /data/androdeb/
$ADB push $spath/addons/* /data/androdeb/
$ADB shell /data/androdeb/device-unpack
# Build BCC and install bcc on device if needed
if [[ ! -z ${INSTALL_BCC+x} ]]; then
$ADB shell /data/androdeb/run-command /bcc-master/build-bcc.sh; fi
do_cleanup
# Extract a tar of the built, compiled and installed androdeb env
if [[ ! -z ${TARDIR+x} ]]; then
echo "Creating and pulling tarball of androdeb env from device"
$ADB shell /data/androdeb/build-debian-tar
$ADB pull /data/androdeb/androdeb-fs.tgz $TARDIR/
$ADB shell rm /data/androdeb/androdeb-fs.tgz; fi
all_done_banner