mirror of
https://github.com/clearlinux/swupd-server.git
synced 2026-10-04 07:58:32 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c8ae097ed0 | ||
|
|
076a76fc4e | ||
|
|
63fb5fb61b | ||
|
|
7758a6bb77 | ||
|
|
36c4e6324f | ||
|
|
c4f61cb023 | ||
|
|
379d5189fc | ||
|
|
6eca4601b0 | ||
|
|
4940d0cf83 | ||
|
|
04d2af2f64 | ||
|
|
1f98322737 | ||
|
|
ddca171dad | ||
|
|
62c31f0088 | ||
|
|
54874bd4e1 | ||
|
|
9fe3ad2241 | ||
|
|
be83996e48 | ||
|
|
7f3b760430 | ||
|
|
74f4afa655 | ||
|
|
ea02b67a93 | ||
|
|
8af939c817 | ||
|
|
4128fbbb9b | ||
|
|
0d08824801 | ||
|
|
8f98e0f570 | ||
|
|
76e5af734b | ||
|
|
b7192ee686 | ||
|
|
b0e0b7f77d | ||
|
|
746b9a56a8 | ||
|
|
adfc1067ff | ||
|
|
122f674e74 | ||
|
|
9d4df7e035 | ||
|
|
4df4bf14c3 | ||
|
|
6affbd1ecb | ||
|
|
77a0bcd9f9 | ||
|
|
bf19e48917 | ||
|
|
d45304c8b7 | ||
|
|
2b4e9eb3c9 |
+4
-1
@@ -37,6 +37,7 @@ swupd_make_pack_SOURCES = \
|
|||||||
src/config.c \
|
src/config.c \
|
||||||
src/delta.c \
|
src/delta.c \
|
||||||
src/globals.c \
|
src/globals.c \
|
||||||
|
src/groups.c \
|
||||||
src/helpers.c \
|
src/helpers.c \
|
||||||
src/log.c \
|
src/log.c \
|
||||||
src/make_packs.c \
|
src/make_packs.c \
|
||||||
@@ -53,6 +54,7 @@ swupd_make_fullfiles_SOURCES = \
|
|||||||
src/delta.c \
|
src/delta.c \
|
||||||
src/fullfiles.c \
|
src/fullfiles.c \
|
||||||
src/globals.c \
|
src/globals.c \
|
||||||
|
src/groups.c \
|
||||||
src/helpers.c \
|
src/helpers.c \
|
||||||
src/log.c \
|
src/log.c \
|
||||||
src/make_fullfiles.c \
|
src/make_fullfiles.c \
|
||||||
@@ -115,7 +117,8 @@ dist_check_SCRIPTS = \
|
|||||||
test/functional/fullfiles/test.bats \
|
test/functional/fullfiles/test.bats \
|
||||||
test/functional/pack/test.bats \
|
test/functional/pack/test.bats \
|
||||||
test/functional/full-run/test.bats \
|
test/functional/full-run/test.bats \
|
||||||
test/functional/full-run-delta/test.bats
|
test/functional/full-run-delta/test.bats \
|
||||||
|
test/functional/file-name-blacklisted/test.bats
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if COVERAGE
|
if COVERAGE
|
||||||
|
|||||||
+2
-6
@@ -15,7 +15,7 @@ error() {
|
|||||||
# eg: all of openstack, pnp, bat, cloud stuff, non-basic scripting language bundles
|
# eg: all of openstack, pnp, bat, cloud stuff, non-basic scripting language bundles
|
||||||
${SWUPDREPO}/mk_groups_ini.sh
|
${SWUPDREPO}/mk_groups_ini.sh
|
||||||
|
|
||||||
PREVREL=`cat ${UPDATEDIR}/image/latest.version`
|
PREVREL=`cat ${UPDATEDIR}/image/LAST_VER`
|
||||||
|
|
||||||
export SWUPD_CERTS_DIR=${SWUPD_CERTS_DIR:-"/root/swupd-certs"}
|
export SWUPD_CERTS_DIR=${SWUPD_CERTS_DIR:-"/root/swupd-certs"}
|
||||||
export LEAF_KEY="leaf.key.pem"
|
export LEAF_KEY="leaf.key.pem"
|
||||||
@@ -45,12 +45,8 @@ for job in $(jobs -p); do
|
|||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
# create delta packs for 2 versions back
|
|
||||||
NUM_PACKS=2
|
|
||||||
${SWUPDREPO}/pack_maker.sh ${VER} ${NUM_PACKS}
|
|
||||||
|
|
||||||
# expose the new build to staging / testing
|
# expose the new build to staging / testing
|
||||||
echo ${VER} > ${UPDATEDIR}/image/latest.version
|
echo ${VER} > ${UPDATEDIR}/image/LAST_VER
|
||||||
|
|
||||||
STAGING_FILE="${UPDATEDIR}/www/version/formatstaging/latest"
|
STAGING_FILE="${UPDATEDIR}/www/version/formatstaging/latest"
|
||||||
if [ ! -f "${STAGING_FILE}" ]; then
|
if [ ! -f "${STAGING_FILE}" ]; then
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
# Process this file with autoconf to produce a configure script.
|
# Process this file with autoconf to produce a configure script.
|
||||||
|
|
||||||
AC_PREREQ([2.66])
|
AC_PREREQ([2.66])
|
||||||
AC_INIT(swupd-server, 3.2.2, timothy.c.pepper@linux.intel.com)
|
AC_INIT(swupd-server, 3.2.8, timothy.c.pepper@linux.intel.com)
|
||||||
AM_INIT_AUTOMAKE([foreign -Wall -W subdir-objects])
|
AM_INIT_AUTOMAKE([foreign -Wall -W subdir-objects])
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
|
|||||||
+12
-2
@@ -19,19 +19,25 @@
|
|||||||
#if SWUPD_WITH_BSDTAR
|
#if SWUPD_WITH_BSDTAR
|
||||||
#define TAR_COMMAND "bsdtar"
|
#define TAR_COMMAND "bsdtar"
|
||||||
#define TAR_XATTR_ARGS ""
|
#define TAR_XATTR_ARGS ""
|
||||||
|
#define TAR_XATTR_ARGS_STRLIST
|
||||||
#define TAR_WARN_ARGS ""
|
#define TAR_WARN_ARGS ""
|
||||||
#else
|
#else
|
||||||
#define TAR_COMMAND "tar"
|
#define TAR_COMMAND "tar"
|
||||||
#define TAR_XATTR_ARGS "--xattrs --xattrs-include='*'"
|
#define TAR_XATTR_ARGS "--xattrs --xattrs-include='*'"
|
||||||
|
#define TAR_XATTR_ARGS_STRLIST "--xattrs", "--xattrs-include='*'",
|
||||||
#define TAR_WARN_ARGS "--warning=no-timestamp"
|
#define TAR_WARN_ARGS "--warning=no-timestamp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SWUPD_WITH_SELINUX
|
#if SWUPD_WITH_SELINUX
|
||||||
#define TAR_PERM_ATTR_ARGS "--preserve-permissions --selinux " TAR_XATTR_ARGS
|
#define TAR_PERM_ATTR_ARGS "--preserve-permissions --selinux " TAR_XATTR_ARGS
|
||||||
|
#define TAR_PERM_ATTR_ARGS_STRLIST TAR_XATTR_ARGS_STRLIST "--preserve-permissions", "--selinux"
|
||||||
#else
|
#else
|
||||||
#define TAR_PERM_ATTR_ARGS "--preserve-permissions " TAR_XATTR_ARGS
|
#define TAR_PERM_ATTR_ARGS "--preserve-permissions " TAR_XATTR_ARGS
|
||||||
|
#define TAR_PERM_ATTR_ARGS_STRLIST TAR_XATTR_ARGS_STRLIST "--preserve-permissions"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define SWUPD_HASH_DIRNAME "DIRECTORY"
|
||||||
|
|
||||||
#if SWUPD_WITH_STATELESS
|
#if SWUPD_WITH_STATELESS
|
||||||
#define OS_IS_STATELESS 1
|
#define OS_IS_STATELESS 1
|
||||||
#else
|
#else
|
||||||
@@ -215,6 +221,7 @@ extern void read_group_file(char *filename);
|
|||||||
extern void release_group_file(void);
|
extern void release_group_file(void);
|
||||||
extern char *group_groups(char *group);
|
extern char *group_groups(char *group);
|
||||||
extern char *group_packages(char *group);
|
extern char *group_packages(char *group);
|
||||||
|
extern char *group_status(char *group);
|
||||||
extern char *next_group(void);
|
extern char *next_group(void);
|
||||||
|
|
||||||
extern void apply_heuristics(struct manifest *manifest);
|
extern void apply_heuristics(struct manifest *manifest);
|
||||||
@@ -238,7 +245,7 @@ extern void type_change_detection(struct manifest *manifest);
|
|||||||
|
|
||||||
extern void rename_detection(struct manifest *manifest, int last_change, GList *last_versions_list);
|
extern void rename_detection(struct manifest *manifest, int last_change, GList *last_versions_list);
|
||||||
extern void link_renames(GList *newfiles, struct manifest *from_manifest);
|
extern void link_renames(GList *newfiles, struct manifest *from_manifest);
|
||||||
extern void __create_delta(struct file *file, int from_version);
|
extern void __create_delta(struct file *file, int from_version, char *from_hash);
|
||||||
|
|
||||||
extern void account_delta_hit(void);
|
extern void account_delta_hit(void);
|
||||||
extern void account_delta_miss(void);
|
extern void account_delta_miss(void);
|
||||||
@@ -246,8 +253,11 @@ extern void account_delta_miss(void);
|
|||||||
extern FILE *fopen_exclusive(const char *filename); /* no mode, opens for write only */
|
extern FILE *fopen_exclusive(const char *filename); /* no mode, opens for write only */
|
||||||
extern void dump_file_info(struct file *file);
|
extern void dump_file_info(struct file *file);
|
||||||
extern void string_or_die(char **strp, const char *fmt, ...);
|
extern void string_or_die(char **strp, const char *fmt, ...);
|
||||||
extern void print_elapsed_time(struct timeval *previous_time, struct timeval *current_time);
|
extern void print_elapsed_time(const char *step, struct timeval *previous_time, struct timeval *current_time);
|
||||||
extern int system_argv(char *const argv[]);
|
extern int system_argv(char *const argv[]);
|
||||||
|
extern int system_argv_fd(char *const argv[], int newstdin, int newstdout, int newstderr);
|
||||||
|
extern int system_argv_pipe(char *const argvp1[], int stdinp1, int stderrp1,
|
||||||
|
char *const argvp2[], int stdoutp2, int stderrp2);
|
||||||
|
|
||||||
extern bool signature_initialize(void);
|
extern bool signature_initialize(void);
|
||||||
extern void signature_terminate(void);
|
extern void signature_terminate(void);
|
||||||
|
|||||||
+6
-2
@@ -18,8 +18,8 @@ if [ ! -f "$SWUPD_SERVER_INI" ]; then
|
|||||||
sed -i "s|/var/lib/update|$UPDATEDIR|" $SWUPD_SERVER_INI
|
sed -i "s|/var/lib/update|$UPDATEDIR|" $SWUPD_SERVER_INI
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ ! -f "$UPDATEDIR/image/latest.version" ]; then
|
if [ ! -f "$UPDATEDIR/image/LAST_VER" ]; then
|
||||||
echo "0" > $UPDATEDIR/image/latest.version
|
echo "0" > $UPDATEDIR/image/LAST_VER
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "rebuilding $SWUPD_GROUPS_INI based on $BUNDLEREPO"
|
echo "rebuilding $SWUPD_GROUPS_INI based on $BUNDLEREPO"
|
||||||
@@ -27,7 +27,11 @@ rm -f $SWUPD_GROUPS_INI
|
|||||||
|
|
||||||
for bundle in $(ls $BUNDLEREPO/bundles)
|
for bundle in $(ls $BUNDLEREPO/bundles)
|
||||||
do
|
do
|
||||||
|
status=$(awk -F: '/^# .STATUS/ {print $2}' $BUNDLEREPO/$bundle | tr -cd '[[:alnum:]]')
|
||||||
echo "[$bundle]" >> $SWUPD_GROUPS_INI
|
echo "[$bundle]" >> $SWUPD_GROUPS_INI
|
||||||
echo "group=$bundle" >> $SWUPD_GROUPS_INI
|
echo "group=$bundle" >> $SWUPD_GROUPS_INI
|
||||||
|
if [ -n "$status" ]; then
|
||||||
|
echo "status=$status" >> $SWUPD_GROUPS_INI
|
||||||
|
fi
|
||||||
echo "" >> $SWUPD_GROUPS_INI
|
echo "" >> $SWUPD_GROUPS_INI
|
||||||
done
|
done
|
||||||
|
|||||||
-112
@@ -1,112 +0,0 @@
|
|||||||
#!/bin/bash -e
|
|
||||||
# usage:
|
|
||||||
# pack_maker.sh <to version> <back_count>
|
|
||||||
# pack_maker.sh 2820 2
|
|
||||||
# pack_maker.sh 2730 3
|
|
||||||
#
|
|
||||||
# For each bundle changed as of the Manifest.MoM at the <to version>,
|
|
||||||
# create version-pair packs going back <back_count>
|
|
||||||
# versions of that bundle. For example if bundle "editors" changed in 2650
|
|
||||||
# and the script is run as "pack_maker.sh 2650 2", it will find that
|
|
||||||
# "editors" last two change points were 2550 and 2260 and thus create a
|
|
||||||
# 2550-to-2650 and a 2260-to-2650 version pair pack for the "editors"
|
|
||||||
# bundle.
|
|
||||||
|
|
||||||
#NOTE: fullfiles must be created before calling this script
|
|
||||||
#NOTE: zero packs need similarly created
|
|
||||||
|
|
||||||
#NOTE: build numbers are sparse, search back for the next oldest existing build
|
|
||||||
#NOTE: in the future isn't simply -10, and when that change happens we must also
|
|
||||||
# consider which version-pair packs are meaningful for intermediate builds
|
|
||||||
# and revert builds.
|
|
||||||
|
|
||||||
SWUPDREPO=${SWUPDREPO:-"/usr/src/clear-projects/swupd-server"}
|
|
||||||
BUNDLEREPO=${BUNDLEREPO:-"/usr/src/clear-projects/clr-bundles"}
|
|
||||||
UPDATEDIR=${UPDATEDIR:-"/var/lib/update"}
|
|
||||||
SWUPDWEBDIR="${UPDATEDIR}/www"
|
|
||||||
SWUPD_CERTS_DIR=${SWUPD_CERTS_DIR=:-"/root/swupd-certs"}
|
|
||||||
|
|
||||||
export XZ_DEFAULTS="--threads 0"
|
|
||||||
|
|
||||||
export SWUPD_CERTS_DIR
|
|
||||||
export LEAF_KEY="leaf.key.pem"
|
|
||||||
export LEAF_CERT="leaf.cert.pem"
|
|
||||||
export CA_CHAIN_CERT="ca-chain.cert.pem"
|
|
||||||
export PASSPHRASE="${SWUPD_CERTS_DIR}/passphrase"
|
|
||||||
|
|
||||||
VER=$1
|
|
||||||
BACK_COUNT=$2
|
|
||||||
|
|
||||||
if [ "${BACK_COUNT}" == "" ]; then
|
|
||||||
echo "missing to pack count"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ "${VER}" == "" ]; then
|
|
||||||
echo "missing to version"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
MOM=${SWUPDWEBDIR}/${VER}/Manifest.MoM
|
|
||||||
if [ ! -e ${MOM} ]; then
|
|
||||||
echo "invalid version (no ${MOM})"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
#time ${SWUPDREPO}/swupd_make_fullfiles --statedir ${UPDATEDIR} ${VER}
|
|
||||||
|
|
||||||
BUNDLE_LIST=$(cat ${MOM} | awk -v V=${VER} '$1 ~ /^M\./ && $3 == V { print $4 }')
|
|
||||||
|
|
||||||
# build packs for all bundles changed in $VER
|
|
||||||
for BUNDLE in $BUNDLE_LIST; do
|
|
||||||
#${SWUPDREPO}/swupd_make_pack --statedir ${UPDATEDIR} 0 ${VER} ${BUNDLE} &
|
|
||||||
|
|
||||||
BUNDLE_VER_LIST=""
|
|
||||||
MANIFEST_VER=$(cat ${SWUPDWEBDIR}/$VER/Manifest.MoM | grep "^previous:" | cut -f 2)
|
|
||||||
BUNDLE_VER=""
|
|
||||||
COUNT=0
|
|
||||||
while [ $COUNT -lt $BACK_COUNT ] && [ $MANIFEST_VER -gt 0 ]; do
|
|
||||||
MOM=${SWUPDWEBDIR}/$MANIFEST_VER/Manifest.MoM
|
|
||||||
if [ -e ${MOM} ]; then
|
|
||||||
BUNDLE_VER=$(cat ${MOM} | grep " ${BUNDLE}$" | cut -f 3)
|
|
||||||
if [ "$BUNDLE_VER" != "" ]; then
|
|
||||||
BUNDLE_VER_LIST="$BUNDLE_VER $BUNDLE_VER_LIST"
|
|
||||||
MANIFEST_VER=$(cat ${SWUPDWEBDIR}/$BUNDLE_VER/Manifest.MoM | grep "^previous:" | cut -f 2)
|
|
||||||
let COUNT=$((COUNT+1))
|
|
||||||
else
|
|
||||||
# back in history to where bundle didn't exist yet
|
|
||||||
MANIFEST_VER=0
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
# seek backwards until a manifest if found
|
|
||||||
MANIFEST_VER=$((MANIFEST_VER-10))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
for v in $BUNDLE_VER_LIST; do
|
|
||||||
if [ -e ${SWUPDWEBDIR}/${VER}/pack-${BUNDLE}-from-$v.tar ]; then
|
|
||||||
echo "${VER}/pack-${BUNDLE}-from-$v.tar already exists, skipping."
|
|
||||||
else
|
|
||||||
${SWUPDREPO}/swupd_make_pack --statedir ${UPDATEDIR} $v ${VER} ${BUNDLE} &
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
for job in $(jobs -p)
|
|
||||||
do
|
|
||||||
wait ${job}
|
|
||||||
RET=$?
|
|
||||||
if [ "$RET" != "0" ]; then
|
|
||||||
echo "pack creation failure!"
|
|
||||||
exit $RET
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# NOTE: your devops will want to expose the completed swupd server build to
|
|
||||||
# trial usage at some point. This would be done via code like:
|
|
||||||
#
|
|
||||||
# echo ${VER} > ${SWUPDWEBDIR}/../image/latest.version
|
|
||||||
# STAGING=$(cat ${SWUPDWEBDIR}/version/formatstaging/latest)
|
|
||||||
# if [ "${STAGING}" -lt "${VER}" ]; then
|
|
||||||
# echo ${VER} > ${SWUPDWEBDIR}/version/formatstaging/latest
|
|
||||||
# fi
|
|
||||||
+1
-1
@@ -222,7 +222,7 @@ int compute_hash(struct file *file, char *filename)
|
|||||||
hmac_sha256_for_string(file->hash,
|
hmac_sha256_for_string(file->hash,
|
||||||
(const unsigned char *)key,
|
(const unsigned char *)key,
|
||||||
key_len,
|
key_len,
|
||||||
file->filename); //file->filename not filename
|
SWUPD_HASH_DIRNAME); // Make independent of dirname
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+12
-31
@@ -34,9 +34,8 @@
|
|||||||
|
|
||||||
void chroot_create_full(int newversion)
|
void chroot_create_full(int newversion)
|
||||||
{
|
{
|
||||||
int ret;
|
|
||||||
char *group;
|
char *group;
|
||||||
char *command;
|
char *param;
|
||||||
char *full_dir;
|
char *full_dir;
|
||||||
|
|
||||||
string_or_die(&full_dir, "%s/%i/full/", image_dir, newversion);
|
string_or_die(&full_dir, "%s/%i/full/", image_dir, newversion);
|
||||||
@@ -45,11 +44,12 @@ void chroot_create_full(int newversion)
|
|||||||
|
|
||||||
/* start with base */
|
/* start with base */
|
||||||
LOG(NULL, "Copying chroot os-core to full", "");
|
LOG(NULL, "Copying chroot os-core to full", "");
|
||||||
string_or_die(&command, "rsync -aAX %s/%i/os-core/ %s",
|
string_or_die(¶m, "%s/%i/os-core/", image_dir, newversion);
|
||||||
image_dir, newversion, full_dir);
|
char *const rsynccmd[] = { "rsync", "-aAX", param, full_dir, NULL };
|
||||||
ret = system(command);
|
if (system_argv(rsynccmd) != 0) {
|
||||||
assert(ret == 0);
|
assert(0);
|
||||||
free(command);
|
}
|
||||||
|
free(param);
|
||||||
|
|
||||||
/* overlay any new files from each group */
|
/* overlay any new files from each group */
|
||||||
while (1) {
|
while (1) {
|
||||||
@@ -59,31 +59,12 @@ void chroot_create_full(int newversion)
|
|||||||
}
|
}
|
||||||
|
|
||||||
LOG(NULL, "Overlaying bundle chroot onto full", "%s", group);
|
LOG(NULL, "Overlaying bundle chroot onto full", "%s", group);
|
||||||
string_or_die(&command, "rsync -aAX --ignore-existing %s/%i/%s/ %s",
|
string_or_die(¶m, "%s/%i/%s/", image_dir, newversion, group);
|
||||||
image_dir, newversion, group, full_dir);
|
char *const rsynccmd[] = { "rsync", "-aAX", "--ignore-existing", param, full_dir, NULL };
|
||||||
ret = system(command);
|
if (system_argv(rsynccmd) != 0) {
|
||||||
assert(ret == 0);
|
assert(0);
|
||||||
free(command);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* and since some dumb files have things like install timestamps in
|
|
||||||
* them, we pull files from full back to bundles so each instance
|
|
||||||
* of the "same" file is truly identical across bundles. It may
|
|
||||||
* make sense at some point to add more logic here for conflict
|
|
||||||
* detection and resolution, including work to insure renames are
|
|
||||||
* consistent across groups. */
|
|
||||||
while (1) {
|
|
||||||
group = next_group();
|
|
||||||
if (!group) {
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
free(param);
|
||||||
LOG(NULL, "Recopy bundle chroot out of full", "%s", group);
|
|
||||||
string_or_die(&command, "rsync -aAX --existing %s %s/%i/%s",
|
|
||||||
full_dir, image_dir, newversion, group);
|
|
||||||
ret = system(command);
|
|
||||||
assert(ret == 0);
|
|
||||||
free(command);
|
|
||||||
}
|
}
|
||||||
free(full_dir);
|
free(full_dir);
|
||||||
}
|
}
|
||||||
|
|||||||
+8
-11
@@ -146,7 +146,7 @@ static void populate_dirs(int version)
|
|||||||
if ((access(newversiondir, F_OK | R_OK) != 0) && (version == 0)) {
|
if ((access(newversiondir, F_OK | R_OK) != 0) && (version == 0)) {
|
||||||
char *latestpath = NULL;
|
char *latestpath = NULL;
|
||||||
|
|
||||||
string_or_die(&latestpath, "%s/latest.version", image_dir);
|
string_or_die(&latestpath, "%s/LAST_VER", image_dir);
|
||||||
|
|
||||||
printf("** %s does not exist... creating and populating\n", newversiondir);
|
printf("** %s does not exist... creating and populating\n", newversiondir);
|
||||||
if (mkdir(newversiondir, 0755) != 0) {
|
if (mkdir(newversiondir, 0755) != 0) {
|
||||||
@@ -271,7 +271,7 @@ int main(int argc, char **argv)
|
|||||||
read_group_file(file_path);
|
read_group_file(file_path);
|
||||||
free(file_path);
|
free(file_path);
|
||||||
|
|
||||||
read_current_version("latest.version");
|
read_current_version("LAST_VER");
|
||||||
printf("Last processed version is %i\n", current_version);
|
printf("Last processed version is %i\n", current_version);
|
||||||
|
|
||||||
populate_dirs(newversion);
|
populate_dirs(newversion);
|
||||||
@@ -288,7 +288,7 @@ int main(int argc, char **argv)
|
|||||||
printf("Syncing bundle chroots with full chroot\n");
|
printf("Syncing bundle chroots with full chroot\n");
|
||||||
chroot_create_full(newversion);
|
chroot_create_full(newversion);
|
||||||
|
|
||||||
print_elapsed_time(&previous_time, ¤t_time);
|
print_elapsed_time("full chroot creation", &previous_time, ¤t_time);
|
||||||
|
|
||||||
printf("Calculating full manifest (this is expensive/slow)\n");
|
printf("Calculating full manifest (this is expensive/slow)\n");
|
||||||
old_full = manifest_from_file(current_version, "full");
|
old_full = manifest_from_file(current_version, "full");
|
||||||
@@ -307,7 +307,7 @@ int main(int argc, char **argv)
|
|||||||
#warning disabled rename detection for some simplicity
|
#warning disabled rename detection for some simplicity
|
||||||
// rename_detection(new_full);
|
// rename_detection(new_full);
|
||||||
|
|
||||||
print_elapsed_time(&previous_time, ¤t_time);
|
print_elapsed_time("full manifest creation", &previous_time, ¤t_time);
|
||||||
|
|
||||||
printf("Entering phase 2: Doing the os-core bundle\n");
|
printf("Entering phase 2: Doing the os-core bundle\n");
|
||||||
/* Phase 2 : the os-core set */
|
/* Phase 2 : the os-core set */
|
||||||
@@ -357,7 +357,6 @@ int main(int argc, char **argv)
|
|||||||
printf("Core component manifest write failed\n");
|
printf("Core component manifest write failed\n");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
create_manifest_deltas(new_core, manifests_last_versions_list);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nest_manifest(new_MoM, new_core);
|
nest_manifest(new_MoM, new_core);
|
||||||
@@ -458,7 +457,6 @@ int main(int argc, char **argv)
|
|||||||
printf("%s component manifest write failed\n", group);
|
printf("%s component manifest write failed\n", group);
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
create_manifest_deltas(newm, manifests_last_versions_list);
|
|
||||||
} else {
|
} else {
|
||||||
LOG(NULL, "", "%s component has not changed (after pruning), no new manifest", group);
|
LOG(NULL, "", "%s component has not changed (after pruning), no new manifest", group);
|
||||||
printf("%s component has not changed (after pruning), no new manifest\n", group);
|
printf("%s component has not changed (after pruning), no new manifest\n", group);
|
||||||
@@ -469,7 +467,7 @@ int main(int argc, char **argv)
|
|||||||
nest_manifest(new_MoM, newm);
|
nest_manifest(new_MoM, newm);
|
||||||
}
|
}
|
||||||
|
|
||||||
print_elapsed_time(&previous_time, ¤t_time);
|
print_elapsed_time("bundle manifest creation", &previous_time, ¤t_time);
|
||||||
|
|
||||||
printf("Entering phase 4: completion manifests \n");
|
printf("Entering phase 4: completion manifests \n");
|
||||||
/* Phase 4 : manifest completion */
|
/* Phase 4 : manifest completion */
|
||||||
@@ -480,9 +478,8 @@ int main(int argc, char **argv)
|
|||||||
printf("Failed to write new MoM\n");
|
printf("Failed to write new MoM\n");
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
create_manifest_deltas(new_MoM, manifests_last_versions_list);
|
|
||||||
|
|
||||||
print_elapsed_time(&previous_time, ¤t_time);
|
print_elapsed_time("MoM creation", &previous_time, ¤t_time);
|
||||||
|
|
||||||
printf("Entering phase 5: creating download content\n");
|
printf("Entering phase 5: creating download content\n");
|
||||||
/* Phase 5: wrapping up */
|
/* Phase 5: wrapping up */
|
||||||
@@ -499,13 +496,13 @@ int main(int argc, char **argv)
|
|||||||
/* Step 8: Prepare delta directory */
|
/* Step 8: Prepare delta directory */
|
||||||
prepare_delta_dir(new_full);
|
prepare_delta_dir(new_full);
|
||||||
|
|
||||||
print_elapsed_time(&previous_time, ¤t_time);
|
print_elapsed_time("finalize update", &previous_time, ¤t_time);
|
||||||
|
|
||||||
exit_status = EXIT_SUCCESS;
|
exit_status = EXIT_SUCCESS;
|
||||||
exit:
|
exit:
|
||||||
if (exit_status == EXIT_SUCCESS) {
|
if (exit_status == EXIT_SUCCESS) {
|
||||||
write_cookiecrumbs_to_download_area(newversion);
|
write_cookiecrumbs_to_download_area(newversion);
|
||||||
//write_new_version("latest.version", newversion);
|
//write_new_version("LAST_VER", newversion);
|
||||||
}
|
}
|
||||||
release_configuration_data();
|
release_configuration_data();
|
||||||
release_group_file();
|
release_group_file();
|
||||||
|
|||||||
+9
-11
@@ -35,10 +35,9 @@
|
|||||||
#include "swupd.h"
|
#include "swupd.h"
|
||||||
#include "xattrs.h"
|
#include "xattrs.h"
|
||||||
|
|
||||||
void __create_delta(struct file *file, int from_version)
|
void __create_delta(struct file *file, int from_version, char *from_hash)
|
||||||
{
|
{
|
||||||
char *original, *newfile, *outfile, *dotfile, *testnewfile, *sanitycheck;
|
char *original, *newfile, *outfile, *dotfile, *testnewfile, *conf;
|
||||||
char *conf;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (file->is_link) {
|
if (file->is_link) {
|
||||||
@@ -62,10 +61,9 @@ void __create_delta(struct file *file, int from_version)
|
|||||||
|
|
||||||
conf = config_output_dir();
|
conf = config_output_dir();
|
||||||
|
|
||||||
string_or_die(&outfile, "%s/%i/delta/%i-%i-%s", conf, file->last_change, from_version, file->last_change, file->hash);
|
string_or_die(&outfile, "%s/%i/delta/%i-%i-%s-%s", conf, file->last_change, from_version, file->last_change, from_hash, file->hash);
|
||||||
string_or_die(&dotfile, "%s/%i/delta/.%i-%i-%s", conf, file->last_change, from_version, file->last_change, file->hash);
|
string_or_die(&dotfile, "%s/%i/delta/.%i-%i-%s-%s", conf, file->last_change, from_version, file->last_change, from_hash, file->hash);
|
||||||
string_or_die(&testnewfile, "%s/%i/delta/.%i-%i-%s.testnewfile", conf, file->last_change, from_version, file->last_change, file->hash);
|
string_or_die(&testnewfile, "%s/%i/delta/.%i-%i-%s-%s.testnewfile", conf, file->last_change, from_version, file->last_change, from_hash, file->hash);
|
||||||
string_or_die(&sanitycheck, "cmp -s \"%s\" \"%s\"", newfile, testnewfile);
|
|
||||||
|
|
||||||
LOG(file, "Making delta", "%s->%s", original, newfile);
|
LOG(file, "Making delta", "%s->%s", original, newfile);
|
||||||
|
|
||||||
@@ -110,13 +108,14 @@ void __create_delta(struct file *file, int from_version)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = system(sanitycheck);
|
char *const sanitycheck[] = { "cmp", "-s", newfile, testnewfile, NULL };
|
||||||
if (ret == -1 || !WIFEXITED(ret) || WEXITSTATUS(ret) == 2) {
|
ret = system_argv(sanitycheck);
|
||||||
|
if (ret == -1 || ret == 2) {
|
||||||
printf("Sanity check system command failed %i. \n", ret);
|
printf("Sanity check system command failed %i. \n", ret);
|
||||||
printf("%s->%s via diff %s yielded %s\n", original, newfile, dotfile, testnewfile);
|
printf("%s->%s via diff %s yielded %s\n", original, newfile, dotfile, testnewfile);
|
||||||
assert(0);
|
assert(0);
|
||||||
goto out;
|
goto out;
|
||||||
} else if (WEXITSTATUS(ret) == 1) {
|
} else if (ret == 1) {
|
||||||
printf("Delta application resulted in file mismatch %i. \n", ret);
|
printf("Delta application resulted in file mismatch %i. \n", ret);
|
||||||
printf("%s->%s via diff %s yielded %s\n", original, newfile, dotfile, testnewfile);
|
printf("%s->%s via diff %s yielded %s\n", original, newfile, dotfile, testnewfile);
|
||||||
LOG(file, "Delta mismatch:", "%s->%s via diff %s yielded %s", original, newfile, dotfile, testnewfile);
|
LOG(file, "Delta mismatch:", "%s->%s via diff %s yielded %s", original, newfile, dotfile, testnewfile);
|
||||||
@@ -137,7 +136,6 @@ void __create_delta(struct file *file, int from_version)
|
|||||||
LOG(NULL, "Failed to rename", "");
|
LOG(NULL, "Failed to rename", "");
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
free(sanitycheck);
|
|
||||||
free(testnewfile);
|
free(testnewfile);
|
||||||
free(conf);
|
free(conf);
|
||||||
free(newfile);
|
free(newfile);
|
||||||
|
|||||||
+49
-31
@@ -24,6 +24,7 @@
|
|||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <libgen.h>
|
#include <libgen.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@@ -41,7 +42,6 @@
|
|||||||
static void create_fullfile(struct file *file)
|
static void create_fullfile(struct file *file)
|
||||||
{
|
{
|
||||||
char *origin;
|
char *origin;
|
||||||
char *tarcommand = NULL;
|
|
||||||
char *tarname = NULL;
|
char *tarname = NULL;
|
||||||
char *rename_source = NULL;
|
char *rename_source = NULL;
|
||||||
char *rename_target = NULL;
|
char *rename_target = NULL;
|
||||||
@@ -49,6 +49,8 @@ static void create_fullfile(struct file *file)
|
|||||||
int ret;
|
int ret;
|
||||||
struct stat sbuf;
|
struct stat sbuf;
|
||||||
char *empty, *indir, *outdir;
|
char *empty, *indir, *outdir;
|
||||||
|
char *param1, *param2;
|
||||||
|
int stderrfd;
|
||||||
|
|
||||||
if (file->is_deleted) {
|
if (file->is_deleted) {
|
||||||
return; /* file got deleted -> by definition we cannot tar it up */
|
return; /* file got deleted -> by definition we cannot tar it up */
|
||||||
@@ -91,13 +93,22 @@ static void create_fullfile(struct file *file)
|
|||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
string_or_die(&tarcommand, TAR_COMMAND " -C %s " TAR_PERM_ATTR_ARGS " -cf - --exclude='%s/?*' './%s' 2> /dev/null | " TAR_COMMAND " -C %s " TAR_PERM_ATTR_ARGS " -xf - 2> /dev/null",
|
string_or_die(¶m1, "--exclude=%s/?*", base);
|
||||||
dir, base, base, rename_tmpdir);
|
string_or_die(¶m2, "./%s", base);
|
||||||
if (system(tarcommand) != 0) {
|
char *const tarcfcmd[] = { TAR_COMMAND, "-C", dir, TAR_PERM_ATTR_ARGS_STRLIST, "-cf", "-", param1, param2, NULL };
|
||||||
LOG(NULL, "Failed to run command:", "%s", tarcommand);
|
char *const tarxfcmd[] = { TAR_COMMAND, "-C", rename_tmpdir, TAR_PERM_ATTR_ARGS_STRLIST, "-xf", "-", NULL };
|
||||||
|
|
||||||
|
stderrfd = open("/dev/null", O_WRONLY);
|
||||||
|
if (stderrfd == -1) {
|
||||||
|
LOG(NULL, "Failed to open /dev/null", "");
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(tarcommand);
|
if (system_argv_pipe(tarcfcmd, -1, stderrfd, tarxfcmd, -1, stderrfd) != 0) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
free(param1);
|
||||||
|
free(param2);
|
||||||
|
close(stderrfd);
|
||||||
|
|
||||||
string_or_die(&rename_source, "%s/%s", rename_tmpdir, base);
|
string_or_die(&rename_source, "%s/%s", rename_tmpdir, base);
|
||||||
string_or_die(&rename_target, "%s/%s", rename_tmpdir, file->hash);
|
string_or_die(&rename_target, "%s/%s", rename_tmpdir, file->hash);
|
||||||
@@ -108,13 +119,13 @@ static void create_fullfile(struct file *file)
|
|||||||
free(rename_source);
|
free(rename_source);
|
||||||
|
|
||||||
/* for a directory file, tar up simply with gzip */
|
/* for a directory file, tar up simply with gzip */
|
||||||
string_or_die(&tarcommand, TAR_COMMAND " -C %s " TAR_PERM_ATTR_ARGS " -zcf %s/%i/files/%s.tar %s",
|
string_or_die(¶m1, "%s/%i/files/%s.tar", outdir, file->last_change, file->hash);
|
||||||
rename_tmpdir, outdir, file->last_change, file->hash, file->hash);
|
char *const tarcmd[] = { TAR_COMMAND, "-C", rename_tmpdir, TAR_PERM_ATTR_ARGS_STRLIST, "-zcf", param1, file->hash, NULL };
|
||||||
if (system(tarcommand) != 0) {
|
|
||||||
LOG(NULL, "Failed to run command:", "%s", tarcommand);
|
if (system_argv(tarcmd) != 0) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(tarcommand);
|
free(param1);
|
||||||
|
|
||||||
if (rmdir(rename_target)) {
|
if (rmdir(rename_target)) {
|
||||||
LOG(NULL, "rmdir failed for %s", rename_target);
|
LOG(NULL, "rmdir failed for %s", rename_target);
|
||||||
@@ -123,6 +134,7 @@ static void create_fullfile(struct file *file)
|
|||||||
if (rmdir(rename_tmpdir)) {
|
if (rmdir(rename_tmpdir)) {
|
||||||
LOG(NULL, "rmdir failed for %s", rename_tmpdir);
|
LOG(NULL, "rmdir failed for %s", rename_tmpdir);
|
||||||
}
|
}
|
||||||
|
free(rename_tmpdir);
|
||||||
|
|
||||||
free(tmp1);
|
free(tmp1);
|
||||||
free(tmp2);
|
free(tmp2);
|
||||||
@@ -143,29 +155,38 @@ static void create_fullfile(struct file *file)
|
|||||||
|
|
||||||
/* step 2a: tar it with each compression type */
|
/* step 2a: tar it with each compression type */
|
||||||
// lzma
|
// lzma
|
||||||
string_or_die(&tarcommand, TAR_COMMAND " --directory=%s " TAR_PERM_ATTR_ARGS " -Jcf %s/%i/files/%s.tar.xz %s",
|
string_or_die(¶m1, "--directory=%s", empty);
|
||||||
empty, outdir, file->last_change, file->hash, file->hash);
|
string_or_die(¶m2, "%s/%i/files/%s.tar.xz", outdir, file->last_change, file->hash);
|
||||||
if (system(tarcommand) != 0) {
|
char *const tarlzmacmd[] = { TAR_COMMAND, param1, TAR_PERM_ATTR_ARGS_STRLIST, "-Jcf", param2, file->hash, NULL };
|
||||||
LOG(NULL, "Failed to run command:", "%s", tarcommand);
|
|
||||||
|
if (system_argv(tarlzmacmd) != 0) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(tarcommand);
|
free(param1);
|
||||||
|
free(param2);
|
||||||
|
|
||||||
// gzip
|
// gzip
|
||||||
string_or_die(&tarcommand, TAR_COMMAND " --directory=%s " TAR_PERM_ATTR_ARGS " -zcf %s/%i/files/%s.tar.gz %s",
|
string_or_die(¶m1, "--directory=%s", empty);
|
||||||
empty, outdir, file->last_change, file->hash, file->hash);
|
string_or_die(¶m2, "%s/%i/files/%s.tar.gz", outdir, file->last_change, file->hash);
|
||||||
if (system(tarcommand) != 0) {
|
char *const targzipcmd[] = { TAR_COMMAND, param1, TAR_PERM_ATTR_ARGS_STRLIST, "-zcf", param2, file->hash, NULL };
|
||||||
LOG(NULL, "Failed to run command:", "%s", tarcommand);
|
|
||||||
|
if (system_argv(targzipcmd) != 0) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(tarcommand);
|
free(param1);
|
||||||
|
free(param2);
|
||||||
|
|
||||||
#ifdef SWUPD_WITH_BZIP2
|
#ifdef SWUPD_WITH_BZIP2
|
||||||
string_or_die(&tarcommand, TAR_COMMAND " --directory=%s " TAR_PERM_ATTR_ARGS " -jcf %s/%i/files/%s.tar.bz2 %s",
|
string_or_die(¶m1, "--directory=%s", empty);
|
||||||
empty, outdir, file->last_change, file->hash, file->hash);
|
string_or_die(¶m2, "%s/%i/files/%s.tar.bz2", outdir, file->last_change, file->hash);
|
||||||
if (system(tarcommand) != 0) {
|
char *const tarbzip2cmd[] = { TAR_COMMAND, param1, TAR_PERM_ATTR_ARGS_STRLIST, "-jcf", param2, file->hash, NULL };
|
||||||
LOG(NULL, "Failed to run command:", "%s", tarcommand);
|
|
||||||
|
if (system_argv(tarbzip2cmd) != 0) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(tarcommand);
|
free(param1);
|
||||||
|
free(param2);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* step 2b: pick the smallest of the three compression formats */
|
/* step 2b: pick the smallest of the three compression formats */
|
||||||
@@ -301,17 +322,14 @@ void create_fullfiles(struct manifest *manifest)
|
|||||||
{
|
{
|
||||||
GList *deduped_file_list;
|
GList *deduped_file_list;
|
||||||
char *path;
|
char *path;
|
||||||
char *cmd;
|
|
||||||
char *conf, *empty;
|
char *conf, *empty;
|
||||||
|
|
||||||
empty = config_empty_dir();
|
empty = config_empty_dir();
|
||||||
|
|
||||||
string_or_die(&cmd, "rm -rf %s", empty);
|
char *const rmcmd[] = { "rm", "-rf", empty, NULL };
|
||||||
if (system(cmd) != 0) {
|
if (system_argv(rmcmd) != 0) {
|
||||||
LOG(NULL, "Failed to run command:", "%s", cmd);
|
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(cmd);
|
|
||||||
g_mkdir_with_parents(empty, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
|
g_mkdir_with_parents(empty, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
|
||||||
free(empty);
|
free(empty);
|
||||||
|
|
||||||
|
|||||||
@@ -51,6 +51,13 @@ char *group_groups(char *group)
|
|||||||
return g_key_file_get_value(groupfile, group, "groups", NULL);
|
return g_key_file_get_value(groupfile, group, "groups", NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *group_status(char *group)
|
||||||
|
{
|
||||||
|
assert(groupfile != NULL);
|
||||||
|
|
||||||
|
return g_key_file_get_value(groupfile, group, "status", NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void read_group_file(char *filename)
|
void read_group_file(char *filename)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|||||||
+96
-7
@@ -101,22 +101,27 @@ void string_or_die(char **strp, const char *fmt, ...)
|
|||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
va_start(ap, fmt);
|
va_start(ap, fmt);
|
||||||
if (vasprintf(strp, fmt, ap) <= 0) {
|
if (vasprintf(strp, fmt, ap) < 0) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
void print_elapsed_time(struct timeval *previous_time, struct timeval *current_time)
|
/* "step" should be a descriptive string for the process that completed before
|
||||||
|
* this function is called */
|
||||||
|
void print_elapsed_time(const char *step, struct timeval *previous_time,
|
||||||
|
struct timeval *current_time)
|
||||||
{
|
{
|
||||||
char *elapsed;
|
char *elapsed;
|
||||||
|
|
||||||
|
assert(strlen(step) > 0);
|
||||||
|
|
||||||
gettimeofday(current_time, NULL);
|
gettimeofday(current_time, NULL);
|
||||||
elapsed = get_elapsed_time(previous_time, current_time);
|
elapsed = get_elapsed_time(previous_time, current_time);
|
||||||
if (strcmp(elapsed, " ") == 0) {
|
if (strcmp(elapsed, " ") == 0) {
|
||||||
printf("\t~0.0 elapsed for Manifest.full creation\n");
|
printf("\t~0.0 elapsed for '%s' step\n", step);
|
||||||
} else {
|
} else {
|
||||||
printf("\t%s elapsed for full chroot creation\n", elapsed);
|
printf("\t%s elapsed for '%s' step\n", elapsed, step);
|
||||||
}
|
}
|
||||||
previous_time->tv_sec = current_time->tv_sec;
|
previous_time->tv_sec = current_time->tv_sec;
|
||||||
previous_time->tv_usec = current_time->tv_usec;
|
previous_time->tv_usec = current_time->tv_usec;
|
||||||
@@ -148,7 +153,7 @@ int system_argv(char *const argv[])
|
|||||||
{
|
{
|
||||||
int child_exit_status;
|
int child_exit_status;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int status;
|
int status = -1;
|
||||||
|
|
||||||
pid = fork();
|
pid = fork();
|
||||||
|
|
||||||
@@ -181,9 +186,93 @@ int system_argv(char *const argv[])
|
|||||||
LOG(NULL, "Failed to run command:", "%s", cmdline);
|
LOG(NULL, "Failed to run command:", "%s", cmdline);
|
||||||
free(cmdline);
|
free(cmdline);
|
||||||
}
|
}
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int system_argv_fd(char *const argv[], int newstdin, int newstdout, int newstderr)
|
||||||
|
{
|
||||||
|
int child_exit_status;
|
||||||
|
pid_t pid;
|
||||||
|
int status = -1;
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
|
||||||
|
if (pid == 0) { /* child */
|
||||||
|
if (newstdin >= 0) {
|
||||||
|
if (dup2(newstdin, STDIN_FILENO) == -1) {
|
||||||
|
LOG(NULL, "Could not redirect stdin", "");
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
close(newstdin);
|
||||||
|
}
|
||||||
|
if (newstdout >= 0) {
|
||||||
|
if (dup2(newstdout, STDOUT_FILENO) == -1) {
|
||||||
|
LOG(NULL, "Could not redirect stdout", "");
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
close(newstdout);
|
||||||
|
}
|
||||||
|
if (newstderr >= 0) {
|
||||||
|
if (dup2(newstderr, STDERR_FILENO) == -1) {
|
||||||
|
LOG(NULL, "Could not redirect stderr", "");
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
close(newstderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
execvp(*argv, argv);
|
||||||
|
LOG(NULL, "This line must not be reached", "");
|
||||||
|
assert(0);
|
||||||
|
} else if (pid < 0) {
|
||||||
|
LOG(NULL, "Failed to fork a child process", "");
|
||||||
|
assert(0);
|
||||||
|
} else {
|
||||||
|
pid_t ws = waitpid(pid, &child_exit_status, 0);
|
||||||
|
|
||||||
|
if (ws == -1) {
|
||||||
|
LOG(NULL, "Failed to wait for child process", "");
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (WIFEXITED(child_exit_status)) {
|
||||||
|
status = WEXITSTATUS(child_exit_status);
|
||||||
|
} else {
|
||||||
|
LOG(NULL, "Child process didn't exit", "");
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status != 0) {
|
||||||
|
char *cmdline = NULL;
|
||||||
|
|
||||||
|
concat_str_array(&cmdline, argv);
|
||||||
|
LOG(NULL, "Failed to run command:", "%s", cmdline);
|
||||||
|
free(cmdline);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
int system_argv_pipe(char *const argvp1[], int stdinp1, int stderrp1,
|
||||||
|
char *const argvp2[], int stdoutp2, int stderrp2)
|
||||||
|
{
|
||||||
|
int statusp2;
|
||||||
|
int pipefd[2];
|
||||||
|
|
||||||
|
if (pipe(pipefd)) {
|
||||||
|
LOG(NULL, "Failed to create a pipe", "");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
system_argv_fd(argvp1, stdinp1, pipefd[1], stderrp1);
|
||||||
|
close(pipefd[1]);
|
||||||
|
statusp2 = system_argv_fd(argvp2, pipefd[0], stdoutp2, stderrp2);
|
||||||
|
close(pipefd[0]);
|
||||||
|
|
||||||
|
/* Returns the status of the failed process if any
|
||||||
|
If both processes failed returns the status of first one */
|
||||||
|
return statusp2;
|
||||||
}
|
}
|
||||||
|
|
||||||
void check_root(void)
|
void check_root(void)
|
||||||
|
|||||||
+9
-9
@@ -44,15 +44,15 @@ static void runtime_state_heuristics(struct file *file)
|
|||||||
{
|
{
|
||||||
/* these are shipped directories that are not themselves state,
|
/* these are shipped directories that are not themselves state,
|
||||||
* rather only their contents are state */
|
* rather only their contents are state */
|
||||||
if ((strcmp(file->filename, "/usr/src/debug") == 0) ||
|
if ((strncmp(file->filename, "/usr/src/debug", 14) == 0) ||
|
||||||
(strcmp(file->filename, "/dev") == 0) ||
|
(strncmp(file->filename, "/dev", 4) == 0) ||
|
||||||
(strcmp(file->filename, "/home") == 0) ||
|
(strncmp(file->filename, "/home", 5) == 0) ||
|
||||||
(strcmp(file->filename, "/proc") == 0) ||
|
(strncmp(file->filename, "/proc", 5) == 0) ||
|
||||||
(strcmp(file->filename, "/root") == 0) ||
|
(strncmp(file->filename, "/root", 5) == 0) ||
|
||||||
(strcmp(file->filename, "/run") == 0) ||
|
(strncmp(file->filename, "/run", 4) == 0) ||
|
||||||
(strcmp(file->filename, "/sys") == 0) ||
|
(strncmp(file->filename, "/sys", 4) == 0) ||
|
||||||
(strcmp(file->filename, "/tmp") == 0) ||
|
(strncmp(file->filename, "/tmp", 4) == 0) ||
|
||||||
(strcmp(file->filename, "/var") == 0)) {
|
(strncmp(file->filename, "/var", 4) == 0)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+66
-19
@@ -728,7 +728,10 @@ static int write_manifest_plain(struct manifest *manifest)
|
|||||||
char *base = NULL, *dir;
|
char *base = NULL, *dir;
|
||||||
char *conf = config_output_dir();
|
char *conf = config_output_dir();
|
||||||
char *filename = NULL;
|
char *filename = NULL;
|
||||||
|
char *status = NULL;
|
||||||
char *submanifest_filename = NULL;
|
char *submanifest_filename = NULL;
|
||||||
|
char *manifest_tempdir = NULL;
|
||||||
|
char *tempmanifest = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
if (conf == NULL) {
|
if (conf == NULL) {
|
||||||
@@ -760,6 +763,10 @@ static int write_manifest_plain(struct manifest *manifest)
|
|||||||
compute_content_size(manifest);
|
compute_content_size(manifest);
|
||||||
fprintf(out, "contentsize:\t%llu\n", (long long unsigned int)manifest->contentsize);
|
fprintf(out, "contentsize:\t%llu\n", (long long unsigned int)manifest->contentsize);
|
||||||
includes = manifest->includes;
|
includes = manifest->includes;
|
||||||
|
status = group_status(manifest->component);
|
||||||
|
if (status) {
|
||||||
|
fprintf(out, "status:\t%s\n", status);
|
||||||
|
}
|
||||||
while (includes) {
|
while (includes) {
|
||||||
struct manifest *sub = includes->data;
|
struct manifest *sub = includes->data;
|
||||||
includes = g_list_next(includes);
|
includes = g_list_next(includes);
|
||||||
@@ -776,24 +783,61 @@ static int write_manifest_plain(struct manifest *manifest)
|
|||||||
}
|
}
|
||||||
|
|
||||||
list = g_list_first(manifest->manifests);
|
list = g_list_first(manifest->manifests);
|
||||||
|
string_or_die(&manifest_tempdir, "%s/XXXXXX", state_dir);
|
||||||
|
if (!mkdtemp(manifest_tempdir)) {
|
||||||
|
LOG(NULL, "Failed to create temporary directory %s for untarring Manifests", manifest_tempdir);
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
while (list) {
|
while (list) {
|
||||||
file = list->data;
|
file = list->data;
|
||||||
list = g_list_next(list);
|
list = g_list_next(list);
|
||||||
|
|
||||||
string_or_die(&submanifest_filename, "%s/%i/Manifest.%s", conf, file->last_change, file->filename);
|
string_or_die(&submanifest_filename, "%s/%i/Manifest.%s", conf, file->last_change, file->filename);
|
||||||
populate_file_struct(file, submanifest_filename);
|
populate_file_struct(file, submanifest_filename);
|
||||||
ret = compute_hash(file, submanifest_filename);
|
|
||||||
|
if (file->is_deleted) {
|
||||||
|
goto write_entry;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *param1, *param2;
|
||||||
|
|
||||||
|
/* Untar the Manifest.BUNDLE.tar and calculate the hash on that,
|
||||||
|
* otherwise we may get incorrect hashes due to owner permissions on
|
||||||
|
* the files. */
|
||||||
|
string_or_die(¶m1, "%s", manifest_tempdir);
|
||||||
|
string_or_die(¶m2, "%s.tar", submanifest_filename);
|
||||||
|
char *const tarcmd[] = { TAR_COMMAND, "-C", param1, TAR_PERM_ATTR_ARGS_STRLIST, "-xf", param2, NULL };
|
||||||
|
ret = system_argv(tarcmd);
|
||||||
|
free(param1);
|
||||||
|
free(param2);
|
||||||
|
|
||||||
|
if (ret != 0) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
string_or_die(&tempmanifest, "%s/Manifest.%s", manifest_tempdir, file->filename);
|
||||||
|
populate_file_struct(file, tempmanifest);
|
||||||
|
ret = compute_hash(file, tempmanifest);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
printf("Hash computation failed\n");
|
printf("Hash computation failed\n");
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
unlink(tempmanifest);
|
||||||
|
free(tempmanifest);
|
||||||
|
write_entry:
|
||||||
fprintf(out, "%s\t%s\t%i\t%s\n", file_type_to_string(file), file->hash, file->last_change, file->filename);
|
fprintf(out, "%s\t%s\t%i\t%s\n", file_type_to_string(file), file->hash, file->last_change, file->filename);
|
||||||
free(submanifest_filename);
|
free(submanifest_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
exit:
|
exit:
|
||||||
|
if (manifest_tempdir) {
|
||||||
|
if (rmdir(manifest_tempdir) != 0) {
|
||||||
|
LOG(NULL, "rmdir failed for %s: %s", manifest_tempdir, strerror(errno));
|
||||||
|
}
|
||||||
|
free(manifest_tempdir);
|
||||||
|
}
|
||||||
if (out) {
|
if (out) {
|
||||||
fclose(out);
|
fclose(out);
|
||||||
}
|
}
|
||||||
@@ -807,34 +851,37 @@ exit:
|
|||||||
static int write_manifest_tar(struct manifest *manifest)
|
static int write_manifest_tar(struct manifest *manifest)
|
||||||
{
|
{
|
||||||
char *conf = config_output_dir();
|
char *conf = config_output_dir();
|
||||||
char *tarcmd = NULL;
|
char *directory, *manifesttar, *manifestcomp, *manifestsigned;
|
||||||
int ret = -1;
|
int ret = 0;
|
||||||
|
|
||||||
if (conf == NULL) {
|
if (conf == NULL) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string_or_die(&directory, "--directory=%s/%i", conf, manifest->version);
|
||||||
|
string_or_die(&manifesttar, "%s/%i/Manifest.%s.tar", conf, manifest->version, manifest->component);
|
||||||
|
string_or_die(&manifestcomp, "Manifest.%s", manifest->component);
|
||||||
|
string_or_die(&manifestsigned, "Manifest.%s.signed", manifest->component);
|
||||||
|
|
||||||
/* now, tar the thing up for efficient full file download */
|
/* now, tar the thing up for efficient full file download */
|
||||||
/* and put the signature of the plain manifest into the archive, too */
|
/* and put the signature of the plain manifest into the archive, too */
|
||||||
if (enable_signing) {
|
if (enable_signing) {
|
||||||
string_or_die(&tarcmd, TAR_COMMAND " --directory=%s/%i " TAR_PERM_ATTR_ARGS " -Jcf "
|
char *const tarcmd[] = { TAR_COMMAND, directory, TAR_PERM_ATTR_ARGS_STRLIST, "-Jcf",
|
||||||
"%s/%i/Manifest.%s.tar Manifest.%s Manifest.%s.signed",
|
manifesttar, manifestcomp, manifestsigned, NULL };
|
||||||
conf, manifest->version, conf, manifest->version, manifest->component,
|
ret = system_argv(tarcmd);
|
||||||
manifest->component, manifest->component);
|
|
||||||
} else {
|
} else {
|
||||||
string_or_die(&tarcmd, TAR_COMMAND " --directory=%s/%i " TAR_PERM_ATTR_ARGS " -Jcf "
|
char *const tarcmd[] = { TAR_COMMAND, directory, TAR_PERM_ATTR_ARGS_STRLIST, "-Jcf",
|
||||||
"%s/%i/Manifest.%s.tar Manifest.%s",
|
manifesttar, manifestcomp, NULL };
|
||||||
conf, manifest->version, conf, manifest->version, manifest->component,
|
ret = system_argv(tarcmd);
|
||||||
manifest->component);
|
}
|
||||||
|
if (ret) {
|
||||||
|
fprintf(stderr, "Creation of Manifest.tar failed\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (system(tarcmd) != 0) {
|
free(directory);
|
||||||
fprintf(stderr, "Creation of Manifest.tar failed\n");
|
free(manifesttar);
|
||||||
goto exit;
|
free(manifestcomp);
|
||||||
}
|
free(manifestsigned);
|
||||||
ret = 0;
|
|
||||||
exit:
|
|
||||||
free(tarcmd);
|
|
||||||
free(conf);
|
free(conf);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|||||||
+37
-32
@@ -40,21 +40,19 @@
|
|||||||
|
|
||||||
static void empty_pack_stage(int full, int from_version, int to_version, char *module)
|
static void empty_pack_stage(int full, int from_version, int to_version, char *module)
|
||||||
{
|
{
|
||||||
char *cmd;
|
char *param;
|
||||||
char *path;
|
char *path;
|
||||||
int ret;
|
|
||||||
|
|
||||||
// clean any stale data (eg: re-run after a failure)
|
// clean any stale data (eg: re-run after a failure)
|
||||||
string_or_die(&cmd, "rm -rf %s/%s/%i_to_%i/", packstage_dir, module,
|
string_or_die(¶m, "%s/%s/%i_to_%i/", packstage_dir, module, from_version, to_version);
|
||||||
from_version, to_version);
|
char *const rmcmd[] = { "rm", "-fr", param, NULL };
|
||||||
ret = system(cmd);
|
if (system_argv(rmcmd) != 0) {
|
||||||
if (ret) {
|
|
||||||
fprintf(stderr, "Failed to clean %s/%s/%i_to_%i\n",
|
fprintf(stderr, "Failed to clean %s/%s/%i_to_%i\n",
|
||||||
packstage_dir, module, from_version, to_version);
|
packstage_dir, module, from_version, to_version);
|
||||||
free(cmd);
|
free(param);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
free(cmd);
|
free(param);
|
||||||
|
|
||||||
if (!full) {
|
if (!full) {
|
||||||
// (re)create module/version/{delta,staged}
|
// (re)create module/version/{delta,staged}
|
||||||
@@ -89,7 +87,7 @@ static void explode_pack_stage(int from_version, int to_version, char *module)
|
|||||||
}
|
}
|
||||||
free(path);
|
free(path);
|
||||||
while (1) {
|
while (1) {
|
||||||
char *path, *tar;
|
char *path, *param;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
entry = readdir(dir);
|
entry = readdir(dir);
|
||||||
@@ -117,13 +115,12 @@ static void explode_pack_stage(int from_version, int to_version, char *module)
|
|||||||
* the resulting pack is slightly smaller, and in addition, we're saving CPU
|
* the resulting pack is slightly smaller, and in addition, we're saving CPU
|
||||||
* time on the client...
|
* time on the client...
|
||||||
*/
|
*/
|
||||||
string_or_die(&tar, TAR_COMMAND " --directory=%s/%s/%i_to_%i/staged " TAR_WARN_ARGS " " TAR_PERM_ATTR_ARGS " -xf %s",
|
string_or_die(¶m, "%s/%s/%i_to_%i/staged", packstage_dir, module, from_version, to_version);
|
||||||
packstage_dir, module, from_version, to_version, path);
|
char *const tarcmd[] = { TAR_COMMAND, "-C", param, TAR_WARN_ARGS, TAR_PERM_ATTR_ARGS_STRLIST, "-xf", path, NULL };
|
||||||
ret = system(tar);
|
if (system_argv(tarcmd) == 0) {
|
||||||
if (!ret) {
|
|
||||||
unlink(path);
|
unlink(path);
|
||||||
}
|
}
|
||||||
free(tar);
|
free(param);
|
||||||
free(path);
|
free(path);
|
||||||
}
|
}
|
||||||
closedir(dir);
|
closedir(dir);
|
||||||
@@ -257,8 +254,8 @@ static GList *consolidate_packs_delta_files(GList *files, struct packdata *pack)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
string_or_die(&from, "%s/%i/delta/%i-%i-%s", staging_dir, file->last_change,
|
string_or_die(&from, "%s/%i/delta/%i-%i-%s-%s", staging_dir, file->last_change,
|
||||||
file->peer->last_change, file->last_change, file->hash);
|
file->peer->last_change, file->last_change, file->peer->hash, file->hash);
|
||||||
|
|
||||||
ret = stat(from, &stat_delta);
|
ret = stat(from, &stat_delta);
|
||||||
if (ret && !find_file_in_list(files, file)) {
|
if (ret && !find_file_in_list(files, file)) {
|
||||||
@@ -277,7 +274,7 @@ static void create_delta(gpointer data, __unused__ gpointer user_data)
|
|||||||
|
|
||||||
/* if the file was not found in the from version, skip delta creation */
|
/* if the file was not found in the from version, skip delta creation */
|
||||||
if (file->peer) {
|
if (file->peer) {
|
||||||
__create_delta(file, file->peer->last_change);
|
__create_delta(file, file->peer->last_change, file->peer->hash);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -334,7 +331,7 @@ static int make_final_pack(struct packdata *pack)
|
|||||||
GList *item;
|
GList *item;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
int ret;
|
int ret;
|
||||||
char *tar;
|
char *param1, *param2;
|
||||||
double penalty;
|
double penalty;
|
||||||
|
|
||||||
LOG(NULL, "make_final_pack", "%s: %i to %i", pack->module, pack->from, pack->to);
|
LOG(NULL, "make_final_pack", "%s: %i to %i", pack->module, pack->from, pack->to);
|
||||||
@@ -356,11 +353,11 @@ static int make_final_pack(struct packdata *pack)
|
|||||||
|
|
||||||
/* for each file changed since <X> */
|
/* for each file changed since <X> */
|
||||||
/* locate delta, check if the diff it's from is >= <X> */
|
/* locate delta, check if the diff it's from is >= <X> */
|
||||||
string_or_die(&from, "%s/%i/delta/%i-%i-%s", staging_dir, file->last_change,
|
string_or_die(&from, "%s/%i/delta/%i-%i-%s-%s", staging_dir, file->last_change,
|
||||||
file->peer->last_change, file->last_change, file->hash);
|
file->peer->last_change, file->last_change, file->peer->hash, file->hash);
|
||||||
string_or_die(&to, "%s/%s/%i_to_%i/delta/%i-%i-%s", packstage_dir,
|
string_or_die(&to, "%s/%s/%i_to_%i/delta/%i-%i-%s-%s", packstage_dir,
|
||||||
pack->module, pack->from, pack->to, file->peer->last_change,
|
pack->module, pack->from, pack->to, file->peer->last_change,
|
||||||
file->last_change, file->hash);
|
file->last_change, file->peer->hash, file->hash);
|
||||||
string_or_die(&tarfrom, "%s/%i/files/%s.tar", staging_dir,
|
string_or_die(&tarfrom, "%s/%i/files/%s.tar", staging_dir,
|
||||||
file->last_change, file->hash);
|
file->last_change, file->hash);
|
||||||
string_or_die(&tarto, "%s/%s/%i_to_%i/staged/%s.tar", packstage_dir,
|
string_or_die(&tarto, "%s/%s/%i_to_%i/staged/%s.tar", packstage_dir,
|
||||||
@@ -438,6 +435,8 @@ static int make_final_pack(struct packdata *pack)
|
|||||||
explode_pack_stage(pack->from, pack->to, pack->module);
|
explode_pack_stage(pack->from, pack->to, pack->module);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char *bundle_delta = NULL;
|
||||||
|
|
||||||
/* now... link in the Manifest pack */
|
/* now... link in the Manifest pack */
|
||||||
if (pack->from != 0) {
|
if (pack->from != 0) {
|
||||||
char *from, *to;
|
char *from, *to;
|
||||||
@@ -457,14 +456,18 @@ static int make_final_pack(struct packdata *pack)
|
|||||||
|
|
||||||
ret = link(from, to);
|
ret = link(from, to);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOG(NULL, "Failed to link", "Manifest-delta-from-%i", pack->from);
|
LOG(NULL, "Failed to link", "Manifest-%s-delta-from-%i (%s)", pack->module, pack->from, strerror(errno));
|
||||||
|
} else {
|
||||||
|
string_or_die(&bundle_delta, "Manifest-%s-delta-from-%i", pack->module, pack->from);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(from);
|
free(from);
|
||||||
free(to);
|
free(to);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now... link in the MoM Manifest into the base pack */
|
char *mom_delta = NULL;
|
||||||
|
|
||||||
|
/* now... link in the MoM Manifest into the os-core pack */
|
||||||
if ((pack->from != 0) && (strcmp(pack->module, "os-core") == 0)) {
|
if ((pack->from != 0) && (strcmp(pack->module, "os-core") == 0)) {
|
||||||
char *from, *to;
|
char *from, *to;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
@@ -482,7 +485,9 @@ static int make_final_pack(struct packdata *pack)
|
|||||||
|
|
||||||
ret = link(from, to);
|
ret = link(from, to);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOG(NULL, "Failed to link", "Manifest-delta-from-%i", pack->from);
|
LOG(NULL, "Failed to link", "Manifest-MoM-delta-from-%i (%s)", pack->from, strerror(errno));
|
||||||
|
} else {
|
||||||
|
string_or_die(&mom_delta, "Manifest-MoM-delta-from-%i", pack->from);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(from);
|
free(from);
|
||||||
@@ -491,15 +496,15 @@ static int make_final_pack(struct packdata *pack)
|
|||||||
|
|
||||||
/* tar the staging directory up */
|
/* tar the staging directory up */
|
||||||
LOG(NULL, "starting tar for pack", "%s: %i to %i", pack->module, pack->from, pack->to);
|
LOG(NULL, "starting tar for pack", "%s: %i to %i", pack->module, pack->from, pack->to);
|
||||||
string_or_die(&tar, TAR_COMMAND " " TAR_PERM_ATTR_ARGS " --directory=%s/%s/%i_to_%i/ "
|
string_or_die(¶m1, "%s/%s/%i_to_%i/", packstage_dir, pack->module, pack->from, pack->to);
|
||||||
"--numeric-owner -Jcf %s/%i/pack-%s-from-%i.tar delta staged",
|
string_or_die(¶m2, "%s/%i/pack-%s-from-%i.tar", staging_dir, pack->to, pack->module, pack->from);
|
||||||
packstage_dir, pack->module, pack->from, pack->to, staging_dir, pack->to,
|
char *const tarcmd[] = { TAR_COMMAND, "-C", param1, TAR_PERM_ATTR_ARGS_STRLIST, "--numeric-owner", "-Jcf", param2, "delta", "staged", bundle_delta, mom_delta, NULL };
|
||||||
pack->module, pack->from);
|
ret = system_argv(tarcmd);
|
||||||
ret = system(tar);
|
free(param1);
|
||||||
free(tar);
|
free(param2);
|
||||||
LOG(NULL, "finished tar for pack", "%s: %i to %i", pack->module, pack->from, pack->to);
|
LOG(NULL, "finished tar for pack", "%s: %i to %i", pack->module, pack->from, pack->to);
|
||||||
/* FIXME: this is a hack workaround, needs diagnosed and removed */
|
/* FIXME: this is a hack workaround, needs diagnosed and removed */
|
||||||
if ((ret != 0) && (ret != 256)) {
|
if ((ret != 0) && (ret != 1)) {
|
||||||
fprintf(stderr, "Unexpected return value (%d) creating tar of pack %s from %i to %i\n",
|
fprintf(stderr, "Unexpected return value (%d) creating tar of pack %s from %i to %i\n",
|
||||||
ret, pack->module, pack->from, pack->to);
|
ret, pack->module, pack->from, pack->to);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+13
-11
@@ -35,10 +35,6 @@
|
|||||||
|
|
||||||
static char *make_filename(const char *, const char *, const char *);
|
static char *make_filename(const char *, const char *, const char *);
|
||||||
|
|
||||||
static const char *CMD_FMT = "openssl smime -sign -in %s -binary "
|
|
||||||
"-out %s.signed -outform PEM -md sha256 -inkey %s -signer %s "
|
|
||||||
"-certfile %s -passin file:%s";
|
|
||||||
|
|
||||||
static char *leaf_key = NULL;
|
static char *leaf_key = NULL;
|
||||||
static char *leaf_cert = NULL;
|
static char *leaf_cert = NULL;
|
||||||
static char *ca_chain_cert = NULL;
|
static char *ca_chain_cert = NULL;
|
||||||
@@ -150,7 +146,7 @@ void signature_terminate(void)
|
|||||||
*/
|
*/
|
||||||
bool signature_sign(const char *filename)
|
bool signature_sign(const char *filename)
|
||||||
{
|
{
|
||||||
char *cmd = NULL;
|
char *param1, *param2;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
if (!enable_signing) {
|
if (!enable_signing) {
|
||||||
@@ -160,12 +156,18 @@ bool signature_sign(const char *filename)
|
|||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
string_or_die(&cmd, CMD_FMT, filename, filename, leaf_key, leaf_cert,
|
string_or_die(¶m1, "%s.signed", filename);
|
||||||
ca_chain_cert, passphrase);
|
string_or_die(¶m2, "file:%s", passphrase);
|
||||||
status = system(cmd);
|
char *const opensslcmd[] = { "openssl", "smime", "-sign", "-in", (char *)filename, "-binary",
|
||||||
if (status) {
|
"-out", param1, "-outform", " PEM", "-md", "sha256", "-inkey",
|
||||||
printf("Bad status %d from signing command:%s\n", status, cmd);
|
leaf_key, "-signer", leaf_cert, "-certfile", ca_chain_cert,
|
||||||
|
"-passin", param2, NULL };
|
||||||
|
status = system_argv(opensslcmd);
|
||||||
|
if (status != 0) {
|
||||||
|
printf("Bad status %d from signing command\n", status);
|
||||||
}
|
}
|
||||||
free(cmd);
|
free(param1);
|
||||||
|
free(param2);
|
||||||
|
|
||||||
return status == 0;
|
return status == 0;
|
||||||
}
|
}
|
||||||
|
|||||||
+41
-12
@@ -27,6 +27,7 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -126,35 +127,63 @@ void ensure_version_image_exists(int version)
|
|||||||
void write_cookiecrumbs_to_download_area(int version)
|
void write_cookiecrumbs_to_download_area(int version)
|
||||||
{
|
{
|
||||||
char *conf;
|
char *conf;
|
||||||
char *cmd;
|
char *filename, *strformat;
|
||||||
|
FILE *versionfd, *formatfd;
|
||||||
|
|
||||||
conf = config_output_dir();
|
conf = config_output_dir();
|
||||||
if (conf == NULL) {
|
if (conf == NULL) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
string_or_die(&cmd, "echo %s > %s/%i/swupd-server-src-version", VERSION, conf, version);
|
string_or_die(&filename, "%s/%i/swupd-server-src-version", conf, version);
|
||||||
if (system(cmd) != 0) {
|
versionfd = fopen(filename, "w");
|
||||||
|
if (versionfd == NULL) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(cmd);
|
if (fwrite(VERSION, 1, strlen(VERSION), versionfd) != strlen(VERSION)) {
|
||||||
|
|
||||||
string_or_die(&cmd, "echo %llu > %s/%i/format", format, conf, version);
|
|
||||||
if (system(cmd) != 0) {
|
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(cmd);
|
fclose(versionfd);
|
||||||
|
free(filename);
|
||||||
|
|
||||||
/* written from pack_maker.sh */
|
string_or_die(&filename, "%s/%i/format", conf, version);
|
||||||
|
string_or_die(&strformat, "%llu", format);
|
||||||
|
formatfd = fopen(filename, "w");
|
||||||
|
if (formatfd == NULL) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
if (fwrite(strformat, 1, strlen(strformat), formatfd) != strlen(strformat)) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
fclose(formatfd);
|
||||||
|
free(filename);
|
||||||
|
free(strformat);
|
||||||
|
|
||||||
|
/* Updating the WEBDIR/version/formatN/latest file is an operation very closely tied to a DevOps
|
||||||
|
* workflow and not something swupd should make a decision about.
|
||||||
|
*
|
||||||
|
* The supported format values (replacing the "N" in the path above) are:
|
||||||
|
*
|
||||||
|
* - "staging": intended for testing only
|
||||||
|
* - [1-+inf] (positive integer): the number that a corresponding version of swupd-client
|
||||||
|
* understands to run software updates. For example, if a given swupd-client release understands
|
||||||
|
* format 1, then WEBDIR/version/format1/latest contains the value of most recent release that
|
||||||
|
* that swupd-client can update to.
|
||||||
|
*
|
||||||
|
* Adapt this step appropriately for your DevOps flow.
|
||||||
|
*/
|
||||||
#if 0
|
#if 0
|
||||||
FILE *file;
|
FILE *file;
|
||||||
char *fullfile = NULL;
|
char *fullfile = NULL;
|
||||||
|
char *param;
|
||||||
|
|
||||||
string_or_die(&cmd, "mkdir -p %s/version/formatstaging/", conf);
|
string_or_die($param, "%s/version/formatstaging/", conf);
|
||||||
if (system(cmd) != 0) {
|
char *const mkdircmd[] = { "mkdir", "-p", param, NULL };
|
||||||
|
|
||||||
|
if (system_argv(mkdircmd) != 0) {
|
||||||
assert(0);
|
assert(0);
|
||||||
}
|
}
|
||||||
free(cmd);
|
free(param);
|
||||||
|
|
||||||
string_or_die(&fullfile, "%s/version/formatstaging/latest", conf);
|
string_or_die(&fullfile, "%s/version/formatstaging/latest", conf);
|
||||||
file = fopen(fullfile, "w");
|
file = fopen(fullfile, "w");
|
||||||
|
|||||||
+40
@@ -0,0 +1,40 @@
|
|||||||
|
#!/usr/bin/env bats
|
||||||
|
|
||||||
|
# common functions
|
||||||
|
load "../swupdlib"
|
||||||
|
|
||||||
|
setup() {
|
||||||
|
clean_test_dir
|
||||||
|
init_test_dir
|
||||||
|
|
||||||
|
init_server_ini
|
||||||
|
set_latest_ver 0
|
||||||
|
init_groups_ini os-core
|
||||||
|
|
||||||
|
set_os_release 10 os-core
|
||||||
|
track_bundle 10 os-core
|
||||||
|
|
||||||
|
gen_file_plain 10 os-core "semicolon;"
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_illegal_char() {
|
||||||
|
local output="$1"
|
||||||
|
local str=$(echo "Filename $2 includes illegal character(s)")
|
||||||
|
[[ "$output" =~ "$str" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
assert_valid_char() {
|
||||||
|
local output="$1"
|
||||||
|
local str=$(echo "Filename $2 includes illegal character(s)")
|
||||||
|
[[ ! "$output" =~ "$str" ]]
|
||||||
|
}
|
||||||
|
|
||||||
|
@test "file names with blacklisted characters" {
|
||||||
|
run sudo sh -c "$CREATE_UPDATE --osversion 10 --statedir $DIR --format 3"
|
||||||
|
|
||||||
|
echo "$output"
|
||||||
|
assert_illegal_char "$output" "/semicolon;"
|
||||||
|
assert_valid_char "$output" "/usr"
|
||||||
|
}
|
||||||
|
|
||||||
|
# vi: ft=sh ts=8 sw=2 sts=2 et tw=80
|
||||||
@@ -79,6 +79,11 @@ setup() {
|
|||||||
[[ 1 -eq $(grep '/foobarbaz$' $DIR/www/20/Manifest.included-nested | wc -l) ]]
|
[[ 1 -eq $(grep '/foobarbaz$' $DIR/www/20/Manifest.included-nested | wc -l) ]]
|
||||||
[[ 6 -eq $(tar -tf $DIR/www/10/pack-test-bundle-from-0.tar | wc -l) ]]
|
[[ 6 -eq $(tar -tf $DIR/www/10/pack-test-bundle-from-0.tar | wc -l) ]]
|
||||||
[[ 4 -eq $(tar -tf $DIR/www/20/pack-test-bundle-from-0.tar | wc -l) ]]
|
[[ 4 -eq $(tar -tf $DIR/www/20/pack-test-bundle-from-0.tar | wc -l) ]]
|
||||||
|
|
||||||
|
# delta packs should contain appropriate delta manifests
|
||||||
|
[[ $(tar -tf $DIR/www/20/pack-os-core-from-10.tar | grep '^Manifest-os-core-delta-from-10') ]]
|
||||||
|
[[ $(tar -tf $DIR/www/20/pack-os-core-from-10.tar | grep '^Manifest-MoM-delta-from-10') ]]
|
||||||
|
[[ $(tar -tf $DIR/www/20/pack-test-bundle-from-10.tar | grep '^Manifest-test-bundle-delta-from-10') ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
# vi: ft=sh ts=8 sw=2 sts=2 et tw=80
|
# vi: ft=sh ts=8 sw=2 sts=2 et tw=80
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ setup() {
|
|||||||
[[ 1 -eq $(grep '/usr/share/clear$' $DIR/www/10/Manifest.os-core | wc -l) ]]
|
[[ 1 -eq $(grep '/usr/share/clear$' $DIR/www/10/Manifest.os-core | wc -l) ]]
|
||||||
[[ 1 -eq $(grep '/usr/share/clear/bundles$' $DIR/www/10/Manifest.os-core | wc -l) ]]
|
[[ 1 -eq $(grep '/usr/share/clear/bundles$' $DIR/www/10/Manifest.os-core | wc -l) ]]
|
||||||
[[ 4 -eq $(tar -tf $DIR/www/10/pack-test-bundle-from-0.tar | wc -l) ]]
|
[[ 4 -eq $(tar -tf $DIR/www/10/pack-test-bundle-from-0.tar | wc -l) ]]
|
||||||
[[ 9 -eq $(tar -tf $DIR/www/10/pack-os-core-from-0.tar | wc -l) ]]
|
[[ 5 -eq $(tar -tf $DIR/www/10/pack-os-core-from-0.tar | wc -l) ]]
|
||||||
}
|
}
|
||||||
|
|
||||||
# vi: ft=sh ts=8 sw=2 sts=2 et tw=80
|
# vi: ft=sh ts=8 sw=2 sts=2 et tw=80
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ init_server_ini() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
set_latest_ver() {
|
set_latest_ver() {
|
||||||
echo "$1" > $DIR/image/latest.version
|
echo "$1" > $DIR/image/LAST_VER
|
||||||
}
|
}
|
||||||
|
|
||||||
init_groups_ini() {
|
init_groups_ini() {
|
||||||
@@ -35,6 +35,7 @@ init_groups_ini() {
|
|||||||
cat >> $DIR/groups.ini << EOF
|
cat >> $DIR/groups.ini << EOF
|
||||||
[$bundle]
|
[$bundle]
|
||||||
group=$bundle
|
group=$bundle
|
||||||
|
status=ACTIVE
|
||||||
EOF
|
EOF
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
@@ -87,21 +88,21 @@ gen_file_to_delta() {
|
|||||||
gen_file_plain() {
|
gen_file_plain() {
|
||||||
local ver=$1
|
local ver=$1
|
||||||
local bundle=$2
|
local bundle=$2
|
||||||
local name=$3
|
local name="$3"
|
||||||
|
|
||||||
# Add plain text file into a bundle
|
# Add plain text file into a bundle
|
||||||
mkdir -p $DIR/image/$ver/$bundle
|
mkdir -p $DIR/image/$ver/$bundle
|
||||||
echo $name > $DIR/image/$ver/$bundle/$name
|
echo "$name" > $DIR/image/$ver/$bundle/"$name"
|
||||||
}
|
}
|
||||||
|
|
||||||
gen_file_plain_change() {
|
gen_file_plain_change() {
|
||||||
local ver=$1
|
local ver=$1
|
||||||
local bundle=$2
|
local bundle=$2
|
||||||
local name=$3
|
local name="$3"
|
||||||
|
|
||||||
# Add plain text file into a bundle
|
# Add plain text file into a bundle
|
||||||
mkdir -p $DIR/image/$ver/$bundle
|
mkdir -p $DIR/image/$ver/$bundle
|
||||||
echo $ver $name > $DIR/image/$ver/$bundle/$name
|
echo "$ver $name" > $DIR/image/$ver/$bundle/"$name"
|
||||||
}
|
}
|
||||||
|
|
||||||
# vi: ft=sh ts=8 sw=2 sts=2 et tw=80
|
# vi: ft=sh ts=8 sw=2 sts=2 et tw=80
|
||||||
|
|||||||
Reference in New Issue
Block a user