#!/bin/sh set -e show_help() { cat << EOF Simple tool to generate Mender Artifact suitable for single-file Update Module Usage: $0 [options] file [-- [options-for-mender-artifact] ] Options: [ -n|artifact-name -t|--device-type -d|--dest-dir --software-name --software-version --software-filesystem -o|--output_path -h|--help ] --artifact-name - Artifact name --device-type - Target device type identification (can be given more than once) --dest-dir - Target destination directory where to deploy the update --software-name - Name of the key to store the software version: rootfs-image.NAME.version, instead of rootfs-image.single-file.version --software-version - Value for the software version, defaults to the name of the artifact --software-filesystem - If specified, is used instead of rootfs-image --output-path - Path to output file. Default: file-install-artifact.mender --help - Show help and exit file - Single file to bundle in the update Anything after a '--' gets passed directly to the mender-artifact tool. EOF } show_help_and_exit_error() { show_help exit 1 } check_dependency() { if ! which "$1" > /dev/null; then echo "The $1 utility is not found but required to generate Artifacts." 1>&2 return 1 fi } if ! check_dependency mender-artifact; then echo "Please follow the instructions here to install mender-artifact and then try again: https://docs.mender.io/downloads#mender-artifact" 1>&2 exit 1 fi device_types="" artifact_name="" dest_dir="" output_path="single-file-artifact.mender" file="" passthrough_args="" while [ -n "$1" ]; do case "$1" in --device-type | -t) if [ -z "$2" ]; then show_help_and_exit_error fi device_types="$device_types $1 $2" shift 2 ;; --artifact-name | -n) if [ -z "$2" ]; then show_help_and_exit_error fi artifact_name=$2 shift 2 ;; --dest-dir | -d) if [ -z "$2" ]; then show_help_and_exit_error fi dest_dir=$2 shift 2 ;; --software-name | --software-version | --software-filesystem) if [ -z "$2" ]; then show_help_and_exit_error fi passthrough_args="$passthrough_args $1 $2" shift 2 ;; --output-path | -o) if [ -z "$2" ]; then show_help_and_exit_error fi output_path=$2 shift 2 ;; -h | --help) show_help exit 0 ;; --) shift passthrough_args="$@" break ;; -*) echo "Error: unsupported option $1" show_help_and_exit_error ;; *) if [ -n "$file" ]; then echo "File already specified. Unrecognized argument \"$1\"" show_help_and_exit_error fi file="$1" shift ;; esac done if [ -z "${artifact_name}" ]; then echo "Artifact name not specified. Aborting." show_help_and_exit_error fi if [ -z "${device_types}" ]; then echo "Device type not specified. Aborting." show_help_and_exit_error fi if [ -z "${dest_dir}" ]; then echo "Destination dir not specified. Aborting." show_help_and_exit_error fi if [ -z "${file}" ]; then echo "File not specified. Aborting." show_help_and_exit_error fi # Check dest-dir is an absolute path case $dest_dir in /*) ;; *) echo "Destination dir must be an absolute path. Aborting" exit 1 ;; esac # Create tarball, accepts single file filename="" if [ -e "${file}" ]; then if [ -f "${file}" ]; then filename=$(basename $file) else echo "Error: \"${file}\" is not a regular file. Aborting." exit 1 fi else echo "Error: File \"${file}\" does not exist. Aborting." exit 1 fi # Create required files for the Update Module tmpdir=$(mktemp -d) dest_dir_file="$tmpdir/dest_dir" filename_file="$tmpdir/filename" permissions_file="$tmpdir/permissions" # Create dest_dir file in plain text echo "$dest_dir" > $dest_dir_file # Create single_file file in plain text echo "$filename" > $filename_file STAT_HAS_f=1; stat -f %A "${file}" >/dev/null 2>&1 || STAT_HAS_f=0; # Create permissions file in plain text if [ $STAT_HAS_f -eq 1 ]; then stat -f %A "${file}" > $permissions_file else stat -c %a "${file}" > $permissions_file fi mender-artifact write module-image \ -T single-file \ $device_types \ -o "$output_path" \ -n "$artifact_name" \ -f "$dest_dir_file" \ -f "$filename_file" \ -f "$permissions_file" \ -f "$file" \ $passthrough_args rm -rf $tmpdir echo "Artifact $output_path generated successfully:" mender-artifact read $output_path exit 0