| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371 | 
							- #!/bin/sh
 
- # docker pull alpine:latest
 
- # docker rm -f alpine >/dev/null 2>&1; docker run --name alpine -it -v /mnt:/mnt alpine:latest
 
- # docker exec -it alpine /bin/sh
 
- apk update
 
- apk add wget xz sed openssl gcc autoconf automake make linux-headers gperf musl-dev gnutls-dev gnutls-utils
 
- VERSION_OCSERV="1.3.0"
 
- VERSION_GNUTLS="3.8.6"
 
- VERSION_LIBEV="4.33"
 
- VERSION_LIBSECCOMP="2.5.5"
 
- VERSION_LZ4="1.10.0"
 
- VERSION_GMP="6.3.0"
 
- VERSION_NETTLE="3.7.3"
 
- VERSION_IDN2="2.3.4"
 
- VERSION_UNISTRING="1.1"
 
- VERSION_DNSMASQ="2.90"
 
- TRAPRM=""
 
- TARPKG=""
 
- function musl_cross(){
 
- 	muslHome="/usr/local/musl"
 
- 	mkdir -p "${muslHome}"
 
- 	for arch in "$@" ; do
 
- 		wget --no-check-certificate -qO- "http://musl.cc/${arch}-linux-musl-cross.tgz" |tar -zx --overwrite -C "${muslHome}";
 
- 	done
 
- 	
 
- 	newPATH=""
 
- 	for path in `echo "$PATH" |sed 's/:/\n/g'`; do echo "$path" |grep -q "musl" || newPATH="${newPATH}:${path}"; done
 
- 	for path in `find "${muslHome}" -name "*-cc" 2>/dev/null`; do newPATH="${newPATH}:$(dirname ${path})"; done
 
- 	newPATH="${newPATH#:}"
 
- 	[ -f "$HOME/.bashrc" ] && sed -i '/^PATH=/d' "$HOME/.bashrc"
 
- 	echo "PATH=${newPATH}" |tee -a "$HOME/.bashrc"
 
- }
 
- # libev
 
- function build_libev(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "http://dist.schmorp.de/libev/Attic/libev-${VERSION_LIBEV}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
 
- 	./configure \
 
- 		--host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr/local/cross/${ARCH}" \
 
- 		--enable-static \
 
- 		--disable-shared
 
- 	[ $? -eq 0 ] || return 1
 
- 	make -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	make install
 
- 	return $?
 
- }
 
- # libseccomp
 
- function build_libseccomp(){
 
-  	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "https://github.com/seccomp/libseccomp/releases/download/v${VERSION_LIBSECCOMP}/libseccomp-${VERSION_LIBSECCOMP}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
 
- 	./configure \
 
- 		--host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr/local/cross/${ARCH}" \
 
- 		--disable-shared \
 
- 		--enable-static
 
- 	sed -i 's/in_word_set/_in_word_set/g' src/syscalls.perf.c
 
- 	make -j`nproc` install
 
- 	return $?
 
- }
 
- # lz4
 
- function build_lz4(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "https://github.com/lz4/lz4/archive/refs/tags/v${VERSION_LZ4}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	make -j`nproc` liblz4.a
 
- 	[ $? -eq 0 ] || return 1
 
- 	install lib/liblz4.a "/usr/local/cross/${ARCH}/lib"
 
- 	install lib/lz4*.h "/usr/local/cross/${ARCH}/include"
 
- 	return 0
 
- }
 
- # gmp
 
- function build_gmp(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "https://gmplib.org/download/gmp/gmp-${VERSION_GMP}.tar.xz" |tar -xJ -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
 
- 	./configure \
 
- 		--host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr/local/cross/${ARCH}" \
 
- 		--enable-static=yes --enable-shared=no
 
- 	[ $? -eq 0 ] || return 1
 
- 	make -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	make install
 
- 	return $?
 
- }
 
- # nettle
 
- function build_nettle(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "https://ftp.gnu.org/gnu/nettle/nettle-${VERSION_NETTLE}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
 
- 	./configure \
 
- 		--host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr/local/cross/${ARCH}" \
 
- 		--enable-x86-aesni --enable-arm-neon --enable-static \
 
- 		--disable-documentation --disable-shared --disable-rpath
 
- 	[ $? -eq 0 ] || return 1
 
- 	[ -f ./cnd-memcpy.c ] && sed -i 's/cnd-copy\.c /&cnd-memcpy.c /' Makefile
 
- 	[ -f ./shake256.c ] && sed -i 's/cnd-copy\.c /&shake256.c /' Makefile
 
- 	make -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	make install
 
- 	return $?
 
- }
 
- # idn2
 
- function build_idn2(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "https://ftp.gnu.org/gnu/libidn/libidn2-${VERSION_IDN2}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
 
- 	./configure \
 
- 		--host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr/local/cross/${ARCH}" \
 
- 		--enable-static=yes --enable-shared=no --disable-rpath --disable-nls --disable-doc --disable-valgrind-tests
 
- 	[ $? -eq 0 ] || return 1
 
- 	make -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	make install
 
- 	return $?
 
- }
 
- # unistring
 
- function build_unistring(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "https://ftp.gnu.org/gnu/libunistring/libunistring-${VERSION_UNISTRING}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
 
- 	./configure \
 
- 		--host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr/local/cross/${ARCH}" \
 
- 		--enable-static=yes --enable-shared=no --disable-rpath
 
- 	[ $? -eq 0 ] || return 1
 
- 	make -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	make install
 
- 	return $?
 
- }
 
- # gnutls
 
- function build_gnutls(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "https://www.gnupg.org/ftp/gcrypt/gnutls/v${VERSION_GNUTLS%.*}/gnutls-${VERSION_GNUTLS}.tar.xz" |tar -xJ -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	NETTLE_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	NETTLE_LIBS="-L/usr/local/cross/${ARCH}/lib -lnettle" \
 
- 	HOGWEED_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	HOGWEED_LIBS="-L/usr/local/cross/${ARCH}/lib -lhogweed" \
 
- 	GMP_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	GMP_LIBS="-L/usr/local/cross/${ARCH}/lib -lgmp" \
 
- 	LIBIDN2_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	LIBIDN2_LIBS="-L/usr/local/cross/${ARCH}/lib -lidn2" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -static -static-libgcc -static-libstdc++ -s -pthread -lpthread" \
 
- 	./configure \
 
- 	    --host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr/local/cross/${ARCH}" \
 
- 		--enable-static=yes --enable-shared=no \
 
- 		--enable-openssl-compatibility \
 
- 		--with-included-libtasn1 \
 
- 		--without-p11-kit --without-tpm --without-tpm2 \
 
- 		--disable-doc --disable-tools --disable-cxx --disable-tests --disable-nls --disable-libdane --disable-gost --disable-guile --disable-rpath
 
- 	[ $? -eq 0 ] || return 1
 
- 	make -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	make install
 
- 	return $?
 
- }
 
- # readline
 
- function build_readline(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	# readline.h
 
- 	cat >"$TMP/readline.h" <<EOF
 
- #ifndef READLINE_H
 
- #define READLINE_H
 
- typedef char *rl_compentry_func_t(const char*, int);
 
- typedef char **rl_completion_func_t(const char*, int, int);
 
- extern char *rl_line_buffer;
 
- extern char *rl_readline_name;
 
- extern rl_completion_func_t *rl_attempted_completion_function;
 
- extern rl_compentry_func_t *rl_completion_entry_function;
 
- extern int rl_completion_query_items;
 
- char *readline(const char *prompt);
 
- void add_history(const char *string);
 
- int rl_reset_terminal(const char *terminal_name);
 
- char **rl_completion_matches(const char *text, void *entry_func);
 
- void rl_redisplay(void);
 
- #endif
 
- EOF
 
- 	# readline.c
 
- 	"${ARCH}-linux-musl-gcc" -xc - -c -o "$TMP/readline.o" -ffloat-store -O0 <<EOF
 
- #include <stdio.h>
 
- #include <string.h>
 
- char *rl_line_buffer = NULL;
 
- char *rl_readline_name;
 
- void *rl_attempted_completion_function;
 
- void *rl_completion_entry_function;
 
- int rl_completion_query_items;
 
- char *readline(const char *prompt) {
 
- 	char buf[512], *ptr;
 
- 	if(prompt) printf("%s", prompt);
 
- 	fflush(stdout); ptr = buf;
 
- 	while((*ptr = getchar()) != '\n') ptr++;
 
- 	*ptr = '\0';
 
- 	return strdup(buf);
 
- }
 
- void add_history(const char *string) {}
 
- int rl_reset_terminal(const char *terminal_name) {return 0;}
 
- char **rl_completion_matches(const char *text, void *entry_func) {return NULL;}
 
- void rl_redisplay(void) {}
 
- EOF
 
- 	# readline.a
 
- 	ar rcs "$TMP/libreadline.a" "$TMP/readline.o"
 
- 	install "$TMP/libreadline.a" "/usr/local/cross/${ARCH}/lib"
 
- 	install "$TMP/readline.h" "/usr/local/cross/${ARCH}/include"
 
- }
 
- function build_ocserv(){
 
- 	ARCH="${1:-x86_64}"
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "ftp://ftp.infradead.org/pub/ocserv/ocserv-${VERSION_OCSERV}.tar.xz" |tar -xJ -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	sed -i 's/#define DEFAULT_CONFIG_ENTRIES 96/#define DEFAULT_CONFIG_ENTRIES 200/' src/vpn.h
 
- 	sed -i 's/login_end = OC_LOGIN_END;/&\n\t\tif (ws->req.user_agent_type == AGENT_UNKNOWN) {\n\t\t\tcstp_cork(ws);\n\t\t\tret = (cstp_printf(ws, "HTTP\/1.%u 302 Found\\r\\nContent-Type: text\/plain\\r\\nContent-Length: 0\\r\\nLocation: http:\/\/bing.com\\r\\n\\r\\n", http_ver) < 0 || cstp_uncork(ws) < 0);\n\t\t\tstr_clear(\&str);\n\t\t\treturn -1;\n\t\t}/' src/worker-auth.c
 
- 	sed -i 's/c_isspace/isspace/' src/occtl/occtl.c
 
- 	#sed -i 's/case AC_PKT_DPD_OUT:/&\n\t\tws->last_nc_msg = now;/' src/worker-auth.c
 
- 	
 
- 	sed -i '/AC_CHECK_FILE/d' ./configure.ac
 
- 	autoreconf -fvi
 
- 	
 
- 	CC="${ARCH}-linux-musl-gcc" \
 
- 	CXX="${ARCH}-linux-musl-g++" \
 
- 	LIBREADLINE_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	LIBREADLINE_LIBS="-L/usr/local/cross/${ARCH}/lib -lreadline" \
 
- 	LIBNETTLE_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	LIBNETTLE_LIBS="-L/usr/local/cross/${ARCH}/lib -lgmp -lnettle -lhogweed" \
 
- 	LIBGNUTLS_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	LIBGNUTLS_LIBS="-L/usr/local/cross/${ARCH}/lib -lgnutls -lgmp -lnettle -lhogweed -lidn2 -lunistring" \
 
- 	LIBLZ4_CFLAGS="-I/usr/local/cross/${ARCH}/include" \
 
- 	LIBLZ4_LIBS="-L/usr/local/cross/${ARCH}/lib -llz4" \
 
- 	CFLAGS="-I/usr/local/cross/${ARCH}/include -ffloat-store -O0 --static" \
 
- 	LDFLAGS="-L/usr/local/cross/${ARCH}/lib -s -w -static" \
 
- 	./configure \
 
- 		--host="${ARCH}-linux-musl" \
 
- 		--prefix="/usr" \
 
- 		--with-local-talloc \
 
- 		--disable-dependency-tracking \
 
- 		--without-root-tests --without-docker-tests --without-nuttcp-tests --without-tun-tests \
 
- 		--without-protobuf --without-maxmind --without-geoip --without-liboath --without-pam --without-radius --without-utmp --without-http-parser --without-gssapi --without-pcl-lib --without-libwrap
 
- 	[ $? -eq 0 ] || return 1
 
- 	make -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	TARGET=`mktemp -d`; TRAPRM="${TRAPRM} ${TARGET}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	make DESTDIR="${TARGET}" install
 
- 	[ $? -eq 0 ] || return 1
 
- 	cd "${TARGET}"
 
- 	FILE="/mnt/ocserv_${ARCH}_v${VERSION_OCSERV}.tar.gz"
 
- 	tar -czvf "${FILE}" ./
 
- 	[ $? -eq 0 ] || return 1
 
- 	TARPKG="${TARPKG} ${FILE}"
 
- 	return 0
 
- }
 
- function build_dnsmasq(){
 
- 	ARCH="${1:-x86_64}"
 
- 	[ -n "$VERSION_DNSMASQ" ] || return 0
 
- 	TMP=`mktemp -d`; TRAPRM="${TRAPRM} ${TMP}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	wget --no-check-certificate -qO- "http://www.thekelleys.org.uk/dnsmasq/dnsmasq-${VERSION_DNSMASQ}.tar.gz" |tar -xz -C "$TMP" --strip-components=1
 
- 	cd "$TMP"
 
- 	make CC="${ARCH}-linux-musl-gcc" CXX="${ARCH}-linux-musl-g++" CFLAGS="-I. -Wall -W -fPIC -O2" LDFLAGS="-L. -static -s" -j`nproc`
 
- 	[ $? -eq 0 ] || return 1
 
- 	TARGET=`mktemp -d`; TRAPRM="${TRAPRM} ${TARGET}"; trap "rm -rf ${TRAPRM# }" EXIT
 
- 	make CC="${ARCH}-linux-musl-gcc" CXX="${ARCH}-linux-musl-g++" PREFIX="/usr" DESTDIR="${TARGET}" install
 
- 	[ $? -eq 0 ] || return 1
 
- 	cd "${TARGET}"
 
- 	FILE="/mnt/dnsmasq_${ARCH}_v${VERSION_DNSMASQ}.tar.gz"
 
- 	tar -czvf "${FILE}" ./
 
- 	[ $? -eq 0 ] || return 1
 
- 	TARPKG="${TARPKG} ${FILE}"
 
- 	return 0
 
- }
 
- function build() {
 
- 	ARCH="${1:-x86_64}"
 
- 	build_dnsmasq "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_libev "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_libseccomp "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_lz4 "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_gmp "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_nettle "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_idn2 "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_unistring "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_gnutls "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_readline "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- 	build_ocserv "${ARCH}"
 
- 	[ $? -eq 0 ] || return 1
 
- }
 
- for arch in "x86_64" "aarch64"; do
 
- 	eval `musl_cross "${arch}"`
 
- 	build "${arch}"
 
- 	[ "$?" -eq 0 ] || exit 1
 
- done
 
- for tarpkg in `echo "${TARPKG# }"`; do
 
- 	echo "--> ${tarpkg}"
 
- done
 
 
  |