From dc8d497a298165ec954a5ff550cd97c79dde1a8a Mon Sep 17 00:00:00 2001 From: VG Date: Thu, 11 May 2017 10:01:40 +0200 Subject: add more scripts --- scripts/git-do | 7 +++++ scripts/git-sync | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/maketar | 6 ++++ scripts/makezip | 2 ++ scripts/pmount | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/pumount | 44 ++++++++++++++++++++++++++++++ scripts/qrs | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ scripts/qs | 39 ++++++++++++++++++++++++++ scripts/qs1 | 41 ++++++++++++++++++++++++++++ 9 files changed, 376 insertions(+) create mode 100755 scripts/git-do create mode 100755 scripts/git-sync create mode 100755 scripts/maketar create mode 100755 scripts/makezip create mode 100755 scripts/pmount create mode 100755 scripts/pumount create mode 100755 scripts/qrs create mode 100755 scripts/qs create mode 100755 scripts/qs1 (limited to 'scripts') diff --git a/scripts/git-do b/scripts/git-do new file mode 100755 index 0000000..2e2cde3 --- /dev/null +++ b/scripts/git-do @@ -0,0 +1,7 @@ +#!/bin/sh +for i in *; do + if [ ! -e "$i"/.git ]; then continue; fi + echo "================== $i ==================" + (cd "$i" && git "$@") +done + diff --git a/scripts/git-sync b/scripts/git-sync new file mode 100755 index 0000000..deb19bc --- /dev/null +++ b/scripts/git-sync @@ -0,0 +1,74 @@ +#!/bin/bash +set -e + +hosthash=$(python3 -c "import uuid, hashlib +print(hashlib.new('sha1', str(uuid.getnode()).encode('utf8')).hexdigest())") + +if [ -d "$(git rev-parse --git-dir)/annex" ]; then + echo 'Sync: using git annex' + exec git annex sync "$@" +fi + +# determine current branch name +branch_name=$(git symbolic-ref -q --short HEAD) + +# remote name +remote_name=$(git config --get branch.${branch_name}.remote || true) + +# conflict commit message +conflict_message="Merge conflict autocommit on ${hosthash}" + +if [ -z "$remote_name" ]; then + echo "No remote for this repository" >&2 + exit 1 +fi + +if [ "$(git config --get --bool branch.${branch_name}.sync)" != "true" ]; then + echo "Branch is not configured to accept git-sync" >&2 + echo "To accept git-sync operation, set current branch sync to true:" >&2 + echo " git config --bool branch.${branch_name}.sync true" >&2 + exit 1 +fi + +echo 'Sync: git autocommit' +git add -A "./$(git rev-parse --show-cdup)" +git commit -m "Auto-commit on ${hosthash}" >/dev/null 2>&1 || true + +echo 'Sync: fetch and merge' + +git fetch + +# might fail one time if conflict detected +git merge -m "$conflict_message" || true + +echo 'Sync: conflict autocommit' + +git status --porcelain | while read -r filename; do + state="${filename:0:2}" + filename="${filename:3}" + ours="${filename}.${hosthash}.conflict" + theirs="${filename}.${remote_name}.conflict" + case "$state" in + *U*) + git checkout --ours -- "$filename" + mv -i -- "$filename" "$ours" + git add -- "$ours" + git checkout --theirs -- "$filename" + cp -ai -- "$filename" "$theirs" + git add -- "$filename" + git add -- "$theirs" + ;; + esac +done + +# no action is done if there is nothing to commit +git commit -m "$conflict_message" || true + +# should not fail again +git merge -m "$conflict_message" + +echo 'Sync: pushing changes' + +git push + +echo 'Sync: done' diff --git a/scripts/maketar b/scripts/maketar new file mode 100755 index 0000000..a85fc58 --- /dev/null +++ b/scripts/maketar @@ -0,0 +1,6 @@ +#!/bin/bash +if [ -x "$(which pigz)" ]; then + exec tar cf - "${1%%/}/" | pigz > "${1%%/}.tgz" +else + exec tar czf "${1%%/}.tgz" "${1%%/}/" +fi diff --git a/scripts/makezip b/scripts/makezip new file mode 100755 index 0000000..6a73850 --- /dev/null +++ b/scripts/makezip @@ -0,0 +1,2 @@ +#!/bin/bash +exec zip -9 -r "${1%%/}.zip" "${1%%/}/" diff --git a/scripts/pmount b/scripts/pmount new file mode 100755 index 0000000..2022c10 --- /dev/null +++ b/scripts/pmount @@ -0,0 +1,83 @@ +#!/bin/bash + +set -e + +declare -a devices + +populate_devices() +{ + for devsys in /sys/class/block/sd*; do + case $(readlink $devsys) in + */devices/*/usb*/*/block/sd*[a-z]);; + # Skip non removable devices (/removable in sys is not reliable + # for usb3 disks). My definition of a removable device in this + # script is usb devices for now. + *) continue;; + esac + dev=${devsys##/sys/class/block/} + if [ -e /sys/class/block/$dev/${dev}1 ]; then + for subdev in /sys/class/block/$dev/${dev}*; do + subdev=${subdev##/sys/class/block/$dev/} + if ! mount | grep -q "^/dev/$subdev on /media/"; then + devices+=($subdev) + fi + done + else + if ! mount | grep -q "^/dev/$dev on /media/"; then + devices+=($dev) + fi + fi + done +} + +get_label() +{ + dev=$1 + for label in /dev/disk/by-label/*; do + label=${label##*/} + devfound=$(readlink /dev/disk/by-label/$label) + devfound=${devfound##*/} + if [ "$devfound" == "$dev" ]; then + echo $label + return + fi + done + echo $dev +} + +choose_device() +{ + echo "List of mountable devices (${#devices[*]}):" + format=" %-8s %s\n" + printf "$format" =Device= =Label= + for dev in ${devices[*]}; do + printf "$format" $dev "$(get_label $dev)" + done + + select choice in ${devices[@]}; do + REPLY=$((REPLY-1)) + break + done +} + +if [ "$#" -eq 0 ]; then + populate_devices + if [ ${#devices[*]} -eq 0 ]; then + echo "Nothing can be done, bye." + exit 0 + fi + + if [ ${#devices[*]} -eq 1 ]; then + dev=${devices[0]} + label="$(get_label ${devices[0]})" + else + choose_device + dev=${devices[$REPLY]} + label="$(get_label $dev)" + fi + + echo "mounting /dev/$dev in /media/$label" + exec pmount $dev "$label" +fi + +exec /usr/bin/pmount "$@" diff --git a/scripts/pumount b/scripts/pumount new file mode 100755 index 0000000..db1ce8b --- /dev/null +++ b/scripts/pumount @@ -0,0 +1,44 @@ +#!/bin/bash + +set -e + +dash_found= +for arg in "$@"; do + if [ -z "${arg##-*}" ]; then + dash_found=true + break + fi +done + +if [ "$#" -gt 0 ]; then + if [ -n "$dash_found" ]; then + exec /usr/bin/pumount "$@" + fi + for arg in "$@"; do + /usr/bin/pumount "$arg" + done + exit 0 +fi + +cd /media/ + +mps=(*) + +if [ ${#mps[@]} -eq 0 ]; then + echo "Nothing to be done." + exit 0 +fi + +if [ ${#mps[@]} -eq 1 ]; then + if [ "${mps[0]}" == "*" ]; then + echo "Nothing to be done." + exit 0 + fi + echo "unmounting /media/${mps[0]}" + exec /usr/bin/pumount "/media/${mps[0]}" +fi + +select mp in ${mps[*]}; do + echo "unmounting /media/$mp" + exec /usr/bin/pumount "/media/$mp" +done diff --git a/scripts/qrs b/scripts/qrs new file mode 100755 index 0000000..be41aa0 --- /dev/null +++ b/scripts/qrs @@ -0,0 +1,80 @@ +#!/bin/bash + +# standard rsync port is 873, I choose 8873 for userside listen. +PORT=8873 + +printf "Examples of get with rsync (full rsync):\n" + +msg=" rsync -Pa 'rsync://%s:${PORT}/qrs/.' .\n" +printf "$msg" "${HOSTNAME}.local" +printf "$msg" "${HOSTNAME}" + +for ipv6 in ::1 \ + $(ip -oneline -family inet6 address show scope site \ + | sed 's/^.*inet6 \([0-9:a-fA-F]\+\).*$/\1/') \ + $(ip -oneline -family inet6 address show scope global \ + | sed 's/^.*inet6 \([0-9:a-fA-F]\+\).*$/\1/') \ +; do + printf "$msg" "[${ipv6}]" +done + +for ipv4 in $(ip -oneline -family inet address show \ + | sed 's/^.*inet \([0-9.]\+\).*$/\1/'); do + printf "$msg" "${ipv4}" +done + +# <(cat <"$CONF" < use remote filename" + echo "==================================================" +} + + +disp_quick_usage +filename="$1" +sfilename="$(echo x$filename | sed 's/^x//;s/"//')" +( + echo "HTTP/1.1 200 OK" + #echo "Content-Type: $(file -bni "$1")" + echo "Content-Type: application/octet-stream" + echo "Content-Transfer-Encoding: binary" + echo "Content-Disposition: attachment; filename=\"$sfilename\"" + echo "Content-Length: $(du -b "$filename" | cut -f1)" + echo "" + cat -- "$filename" +) | nc -l -q0 -p $port >/dev/null 2>&1 -- cgit v1.2.3