Moved Bin/ to bin/

This commit is contained in:
Damien Broqua 2021-01-24 15:16:13 +01:00
parent d5c79fcfc2
commit 39772dcd24
32 changed files with 9 additions and 9 deletions

4
bin/.directory Normal file
View file

@ -0,0 +1,4 @@
[Dolphin]
Timestamp=2014,5,29,15,46,0
Version=3
ViewMode=2

15
bin/attachTmux.sh Executable file
View file

@ -0,0 +1,15 @@
#! /bin/bash
if [ -z "$1" ]; then
echo "Missing session name"
exit 1
fi
TMUXSESSION=$1
EXISTS=`tmux ls|grep "${TMUXSESSION}:"`
if [ -z "${EXISTS}" ]; then
tmux new -s ${TMUXSESSION}
else
tmux attach-session -t ${TMUXSESSION}
fi

View file

@ -0,0 +1,48 @@
#!/bin/zsh
DIR=$(dirname $0)
CMD=$1
# Get the first bluetooth device info
# This comes as a CSV
BT_SINK=$(pacmd list-cards | $DIR/bt_dev_info.awk | grep "bluez" | head -n 1)
if [ ! -z ${BT_SINK} ]; then
# if there is a device connected, then we can either list or change profile
# otherwise we do nothing
id=$(echo ${BT_SINK} | cut -d "," -f 1)
current_profile=$(echo ${BT_SINK} | cut -d "," -f 4)
case ${current_profile} in
"<a2dp_sink>")
icon="headphones"
next_profile="headset_head_unit"
;;
"<headset_head_unit>")
icon="phone"
next_profile="a2dp_sink"
;;
*)
icon="unknown"
next_profile=""
;;
esac
case $CMD in
"toggle_profile")
pacmd set-card-profile ${id} ${next_profile}
;;
*)
case ${current_profile} in
"<a2dp_sink>")
echo ""
;;
"<headset_head_unit>")
echo ""
;;
*)
echo "-"
;;
esac
;;
esac
else
echo "none"
fi

24
bin/brightness.sh Executable file
View file

@ -0,0 +1,24 @@
#! /bin/bash
CURRENT=`xrandr --verbose | grep -m 1 -i brightness | cut -f2 -d ' '`
OUTPUT=`xrandr|grep ' connected'|grep 'primary'|cut -d' ' -f 1`
GAP=0.1
NEWVALUE=${CURRENT}
case $1 in
up)
NEWVALUE=`echo "${CURRENT}+${GAP}"|bc -l`
;;
down)
NEWVALUE=`echo "${CURRENT}-${GAP}"|bc -l`
;;
reset)
NEWVALUE=1
;;
read)
echo "${CURRENT}*100/1"|bc
exit 0
;;
esac
xrandr --output ${OUTPUT} --brightness ${NEWVALUE}

16
bin/bt_dev_info.awk Executable file
View file

@ -0,0 +1,16 @@
#!/usr/bin/awk -f
BEGIN {
FS = "([ ]?:[ ])|([ ]=[ ])";
print "INDEX,NICE_NAME,DEVICE,ACTIVE_PROFILE"
count = 0;
}
/index/ { i=$2; indices[count++] = $2 }
/^\s+name:/ { names[i] = $2 }
/^\s+active profile:/ { profiles[i] = $2 }
/^\s+device\.description/ { nice[i] = $2 }
END {
for (j=0; j<count; j++) {
i=indices[j];
print i "," nice[i] "," names[i] "," profiles[i]
}
}

13
bin/build-kernel.sh Executable file
View file

@ -0,0 +1,13 @@
#! /bin/bash
cd /usr/src/linux
make oldconfig
make menuconfig
make -j17
make modules_install
make install
grub-mkconfig -o /boot/grub/grub.cfg

6
bin/device_battery.sh Executable file
View file

@ -0,0 +1,6 @@
#! /bin/bash
MOUSE_PATH=`qdbus --system org.freedesktop.UPower|grep $1`
PERCENTAGE=`qdbus --system org.freedesktop.UPower ${MOUSE_PATH} org.freedesktop.UPower.Device.Percentage`
echo ${PERCENTAGE}%

14
bin/i3quit.sh Executable file
View file

@ -0,0 +1,14 @@
#!/bin/bash
# a simple logout dialog
# launch exit menu
choice=`echo -e "0: Logout\n1: Shutdown\n2: Suspend\n3: Reboot\n4: Cancel" | rofi -dmenu -p "select an action" | cut -d ':' -f 1`
# execute the choice in background
case "$choice" in
0) i3-msg exit & ;;
1) systemctl poweroff & ;;
2) ~/bin/lock.sh & sleep 2 && systemctl suspend & ;;
3) systemctl reboot & ;;
4) exit ;;
esac

8
bin/lock.sh Executable file
View file

@ -0,0 +1,8 @@
#!/bin/bash
#notify-send --icon=gtk-info Lock "Screen lock in progress..."
i3lock-fancy
#/opt/i3lock-fancy-multimonitor/lock
#dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Pause

12
bin/logitech.py Executable file
View file

@ -0,0 +1,12 @@
#!/usr/bin/env python2.7
# dbus-send --print-reply --system --dest=org.freedesktop.UPower /org/freedesktop/UPower/devices/battery_BAT0 org.freedesktop.DBus.Properties.Get string:org.freedesktop.UPower.Device string:'Percentage'
import dbus
bus = dbus.SystemBus()
bat0_object = bus.get_object('org.freedesktop.UPower',
'/org/freedesktop/UPower/devices/mouse_hidpp_battery_0')
bat0 = dbus.Interface(bat0_object, 'org.freedesktop.DBus.Properties')
print bat0.Get("org.freedesktop.UPower.Device", "Percentage")

6
bin/mouse_battery.sh Executable file
View file

@ -0,0 +1,6 @@
#! /bin/bash
MOUSE_PATH=`qdbus --system org.freedesktop.UPower|grep mouse`
PERCENTAGE=`qdbus --system org.freedesktop.UPower ${MOUSE_PATH} org.freedesktop.UPower.Device.Percentage`
echo ${PERCENTAGE}%

18
bin/music.sh Executable file
View file

@ -0,0 +1,18 @@
#! /bin/bash
service=""
spotifyIsUp=`pidof spotify`
rhythmboxIsUp=`pidof rhythmbox`
if [ "${spotifyIsUp}" ]; then
echo "Spotify is up!"
service="spotify"
elif [ "${rhythmboxIsUp}" ]; then
echo "Rhythmbox is up!"
service="rhythmbox"
else
echo "All down…"
exit -1
fi
qdbus org.mpris.MediaPlayer2.${service} /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.$1

12
bin/nowPlaying.sh Executable file
View file

@ -0,0 +1,12 @@
#! /bin/bash
spotifyIsUp=`pidof spotify`
rhythmboxIsUp=`pidof rhythmbox`
if [ "${spotifyIsUp}" ]; then
echo $(qdbus org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.Metadata | grep "^xesam:\(title\|artist\):" | grep -o " .*" | column | sed "s/\t\+/:/g")
elif [ "${rhythmboxIsUp}" ]; then
echo $(rhythmbox-client --print-playing-format "%ta - %tt (%at)")
else
echo ""
fi

423
bin/pishrink.sh Executable file
View file

@ -0,0 +1,423 @@
#!/bin/bash
version="v0.1.2"
CURRENT_DIR="$(pwd)"
SCRIPTNAME="${0##*/}"
MYNAME="${SCRIPTNAME%.*}"
LOGFILE="${CURRENT_DIR}/${SCRIPTNAME%.*}.log"
REQUIRED_TOOLS="parted losetup tune2fs md5sum e2fsck resize2fs"
ZIPTOOLS=("gzip xz")
declare -A ZIP_PARALLEL_TOOL=( [gzip]="pigz" [xz]="xz" ) # parallel zip tool to use in parallel mode
declare -A ZIP_PARALLEL_OPTIONS=( [gzip]="-f9" [xz]="-T0" ) # options for zip tools in parallel mode
declare -A ZIPEXTENSIONS=( [gzip]="gz" [xz]="xz" ) # extensions of zipped files
function info() {
echo "$SCRIPTNAME: $1 ..."
}
function error() {
echo -n "$SCRIPTNAME: ERROR occured in line $1: "
shift
echo "$@"
}
function cleanup() {
if losetup "$loopback" &>/dev/null; then
losetup -d "$loopback"
fi
if [ "$debug" = true ]; then
local old_owner=$(stat -c %u:%g "$src")
chown "$old_owner" "$LOGFILE"
fi
}
function logVariables() {
if [ "$debug" = true ]; then
echo "Line $1" >> "$LOGFILE"
shift
local v var
for var in "$@"; do
eval "v=\$$var"
echo "$var: $v" >> "$LOGFILE"
done
fi
}
function checkFilesystem() {
info "Checking filesystem"
e2fsck -pf "$loopback"
(( $? < 4 )) && return
info "Filesystem error detected!"
info "Trying to recover corrupted filesystem"
e2fsck -y "$loopback"
(( $? < 4 )) && return
if [[ $repair == true ]]; then
info "Trying to recover corrupted filesystem - Phase 2"
e2fsck -fy -b 32768 "$loopback"
(( $? < 4 )) && return
fi
error $LINENO "Filesystem recoveries failed. Giving up..."
exit 9
}
function set_autoexpand() {
#Make pi expand rootfs on next boot
mountdir=$(mktemp -d)
partprobe "$loopback"
mount "$loopback" "$mountdir"
if [ ! -d "$mountdir/etc" ]; then
info "/etc not found, autoexpand will not be enabled"
umount "$mountdir"
return
fi
if [[ -f "$mountdir/etc/rc.local" ]] && [[ "$(md5sum "$mountdir/etc/rc.local" | cut -d ' ' -f 1)" != "1c579c7d5b4292fd948399b6ece39009" ]]; then
echo "Creating new /etc/rc.local"
if [ -f "$mountdir/etc/rc.local" ]; then
mv "$mountdir/etc/rc.local" "$mountdir/etc/rc.local.bak"
fi
#####Do not touch the following lines#####
cat <<\EOF1 > "$mountdir/etc/rc.local"
#!/bin/bash
do_expand_rootfs() {
ROOT_PART=$(mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p')
PART_NUM=${ROOT_PART#mmcblk0p}
if [ "$PART_NUM" = "$ROOT_PART" ]; then
echo "$ROOT_PART is not an SD card. Don't know how to expand"
return 0
fi
# Get the starting offset of the root partition
PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g')
[ "$PART_START" ] || return 1
# Return value will likely be error for fdisk as it fails to reload the
# partition table because the root fs is mounted
fdisk /dev/mmcblk0 <<EOF
p
d
$PART_NUM
n
p
$PART_NUM
$PART_START
p
w
EOF
cat <<EOF > /etc/rc.local &&
#!/bin/sh
echo "Expanding /dev/$ROOT_PART"
resize2fs /dev/$ROOT_PART
rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local
EOF
reboot
exit
}
raspi_config_expand() {
/usr/bin/env raspi-config --expand-rootfs
if [[ $? != 0 ]]; then
return -1
else
rm -f /etc/rc.local; cp -f /etc/rc.local.bak /etc/rc.local; /etc/rc.local
reboot
exit
fi
}
raspi_config_expand
echo "WARNING: Using backup expand..."
sleep 5
do_expand_rootfs
echo "ERROR: Expanding failed..."
sleep 5
if [[ -f /etc/rc.local.bak ]]; then
cp -f /etc/rc.local.bak /etc/rc.local
/etc/rc.local
fi
exit 0
EOF1
#####End no touch zone#####
chmod +x "$mountdir/etc/rc.local"
fi
umount "$mountdir"
}
help() {
local help
read -r -d '' help << EOM
Usage: $0 [-adhrspvzZ] imagefile.img [newimagefile.img]
-s Don't expand filesystem when image is booted the first time
-v Be verbose
-r Use advanced filesystem repair option if the normal one fails
-z Compress image after shrinking with gzip
-Z Compress image after shrinking with xz
-a Compress image in parallel using multiple cores
-p Remove logs, apt archives, dhcp leases and ssh hostkeys
-d Write debug messages in a debug log file
EOM
echo "$help"
exit 1
}
should_skip_autoexpand=false
debug=false
repair=false
parallel=false
verbose=false
prep=false
ziptool=""
while getopts ":adhprsvzZ" opt; do
case "${opt}" in
a) parallel=true;;
d) debug=true;;
h) help;;
p) prep=true;;
r) repair=true;;
s) should_skip_autoexpand=true ;;
v) verbose=true;;
z) ziptool="gzip";;
Z) ziptool="xz";;
*) help;;
esac
done
shift $((OPTIND-1))
if [ "$debug" = true ]; then
info "Creating log file $LOGFILE"
rm "$LOGFILE" &>/dev/null
exec 1> >(stdbuf -i0 -o0 -e0 tee -a "$LOGFILE" >&1)
exec 2> >(stdbuf -i0 -o0 -e0 tee -a "$LOGFILE" >&2)
fi
echo "${0##*/} $version"
#Args
src="$1"
img="$1"
#Usage checks
if [[ -z "$img" ]]; then
help
fi
if [[ ! -f "$img" ]]; then
error $LINENO "$img is not a file..."
exit 2
fi
if (( EUID != 0 )); then
error $LINENO "You need to be running as root."
exit 3
fi
# check selected compression tool is supported and installed
if [[ -n $ziptool ]]; then
if [[ ! " ${ZIPTOOLS[@]} " =~ $ziptool ]]; then
error $LINENO "$ziptool is an unsupported ziptool."
exit 17
else
if [[ $parallel == true && $ziptool == "gzip" ]]; then
REQUIRED_TOOLS="$REQUIRED_TOOLS pigz"
else
REQUIRED_TOOLS="$REQUIRED_TOOLS $ziptool"
fi
fi
fi
#Check that what we need is installed
for command in $REQUIRED_TOOLS; do
command -v $command >/dev/null 2>&1
if (( $? != 0 )); then
error $LINENO "$command is not installed."
exit 4
fi
done
#Copy to new file if requested
if [ -n "$2" ]; then
f="$2"
if [[ -n $ziptool && "${f##*.}" == "${ZIPEXTENSIONS[$ziptool]}" ]]; then # remove zip extension if zip requested because zip tool will complain about extension
f="${f%.*}"
fi
info "Copying $1 to $f..."
cp --reflink=auto --sparse=always "$1" "$f"
if (( $? != 0 )); then
error $LINENO "Could not copy file..."
exit 5
fi
old_owner=$(stat -c %u:%g "$1")
chown "$old_owner" "$f"
img="$f"
fi
# cleanup at script exit
trap cleanup EXIT
#Gather info
info "Gathering data"
beforesize="$(ls -lh "$img" | cut -d ' ' -f 5)"
parted_output="$(parted -ms "$img" unit B print)"
rc=$?
if (( $rc )); then
error $LINENO "parted failed with rc $rc"
info "Possibly invalid image. Run 'parted $img unit B print' manually to investigate"
exit 6
fi
partnum="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 1)"
partstart="$(echo "$parted_output" | tail -n 1 | cut -d ':' -f 2 | tr -d 'B')"
if [ -z "$(parted -s "$img" unit B print | grep "$partstart" | grep logical)" ]; then
parttype="primary"
else
parttype="logical"
fi
loopback="$(losetup -f --show -o "$partstart" "$img")"
tune2fs_output="$(tune2fs -l "$loopback")"
rc=$?
if (( $rc )); then
echo "$tune2fs_output"
error $LINENO "tune2fs failed. Unable to shrink this type of image"
exit 7
fi
currentsize="$(echo "$tune2fs_output" | grep '^Block count:' | tr -d ' ' | cut -d ':' -f 2)"
blocksize="$(echo "$tune2fs_output" | grep '^Block size:' | tr -d ' ' | cut -d ':' -f 2)"
logVariables $LINENO beforesize parted_output partnum partstart parttype tune2fs_output currentsize blocksize
#Check if we should make pi expand rootfs on next boot
if [ "$parttype" == "logical" ]; then
echo "WARNING: PiShrink does not yet support autoexpanding of this type of image"
elif [ "$should_skip_autoexpand" = false ]; then
set_autoexpand
else
echo "Skipping autoexpanding process..."
fi
if [[ $prep == true ]]; then
info "Syspreping: Removing logs, apt archives, dhcp leases and ssh hostkeys"
mountdir=$(mktemp -d)
mount "$loopback" "$mountdir"
rm -rvf $mountdir/var/cache/apt/archives/* $mountdir/var/lib/dhcpcd5/* $mountdir/var/log/* $mountdir/var/tmp/* $mountdir/tmp/* $mountdir/etc/ssh/*_host_*
umount "$mountdir"
fi
#Make sure filesystem is ok
checkFilesystem
if ! minsize=$(resize2fs -P "$loopback"); then
rc=$?
error $LINENO "resize2fs failed with rc $rc"
exit 10
fi
minsize=$(cut -d ':' -f 2 <<< "$minsize" | tr -d ' ')
logVariables $LINENO currentsize minsize
if [[ $currentsize -eq $minsize ]]; then
error $LINENO "Image already shrunk to smallest size"
exit 11
fi
#Add some free space to the end of the filesystem
extra_space=$(($currentsize - $minsize))
logVariables $LINENO extra_space
for space in 5000 1000 100; do
if [[ $extra_space -gt $space ]]; then
minsize=$(($minsize + $space))
break
fi
done
logVariables $LINENO minsize
#Shrink filesystem
info "Shrinking filesystem"
resize2fs -p "$loopback" $minsize
rc=$?
if (( $rc )); then
error $LINENO "resize2fs failed with rc $rc"
mount "$loopback" "$mountdir"
mv "$mountdir/etc/rc.local.bak" "$mountdir/etc/rc.local"
umount "$mountdir"
losetup -d "$loopback"
exit 12
fi
sleep 1
#Shrink partition
partnewsize=$(($minsize * $blocksize))
newpartend=$(($partstart + $partnewsize))
logVariables $LINENO partnewsize newpartend
parted -s -a minimal "$img" rm "$partnum"
rc=$?
if (( $rc )); then
error $LINENO "parted failed with rc $rc"
exit 13
fi
parted -s "$img" unit B mkpart "$parttype" "$partstart" "$newpartend"
rc=$?
if (( $rc )); then
error $LINENO "parted failed with rc $rc"
exit 14
fi
#Truncate the file
info "Shrinking image"
endresult=$(parted -ms "$img" unit B print free)
rc=$?
if (( $rc )); then
error $LINENO "parted failed with rc $rc"
exit 15
fi
endresult=$(tail -1 <<< "$endresult" | cut -d ':' -f 2 | tr -d 'B')
logVariables $LINENO endresult
truncate -s "$endresult" "$img"
rc=$?
if (( $rc )); then
error $LINENO "trunate failed with rc $rc"
exit 16
fi
# handle compression
if [[ -n $ziptool ]]; then
options=""
envVarname="${MYNAME^^}_${ziptool^^}" # PISHRINK_GZIP or PISHRINK_XZ environment variables allow to override all options for gzip or xz
[[ $parallel == true ]] && options="${ZIP_PARALLEL_OPTIONS[$ziptool]}"
[[ -v $envVarname ]] && options="${!envVarname}" # if environment variable defined use these options
[[ $verbose == true ]] && options="$options -v" # add verbose flag if requested
if [[ $parallel == true ]]; then
parallel_tool="${ZIP_PARALLEL_TOOL[$ziptool]}"
info "Using $parallel_tool on the shrunk image"
if ! $parallel_tool ${options} "$img"; then
rc=$?
error $LINENO "$parallel_tool failed with rc $rc"
exit 18
fi
else # sequential
info "Using $ziptool on the shrunk image"
if ! $ziptool ${options} "$img"; then
rc=$?
error $LINENO "$ziptool failed with rc $rc"
exit 19
fi
fi
img=$img.${ZIPEXTENSIONS[$ziptool]}
fi
aftersize=$(ls -lh "$img" | cut -d ' ' -f 5)
logVariables $LINENO aftersize
info "Shrunk $img from $beforesize to $aftersize"

28
bin/plymouth.sh Executable file
View file

@ -0,0 +1,28 @@
#!/bin/bash
## Preview Plymouth Splash ##
## by _khAttAm_ ##
## www.khattam.info ##
## License: GPL v3 ##
chk_root () {
if [ ! $( id -u ) -eq 0 ]; then
echo Must be run as root
exit
fi
}
chk_root
DURATION=$1
if [ $# -ne 1 ]; then
DURATION=5
fi
plymouthd
plymouth --show-splash
for ((I=0; I<$DURATION; I++)); do
plymouth --update=test$I;
sleep 1;
done;
plymouth quit

14
bin/qmkCreateBranch.sh Executable file
View file

@ -0,0 +1,14 @@
#! /bin/bash
if [ -z "$1" ]; then
echo "Missing branch name"
exit 1
fi
git checkout master
git fetch upstream
git pull upstream master
git push origin master
git checkout -b $1
git push --set-upstream origin $1

5
bin/rebuild-world.sh Executable file
View file

@ -0,0 +1,5 @@
#! /bin/bash
emerge --ask --verbose --update --changed-use --deep @world
emerge --ask --verbose --depclean

17
bin/removeMerged.sh Executable file
View file

@ -0,0 +1,17 @@
#! /bin/bash
# Checkout develop
git develop
if [ $? = 1 ] ; then
git checkout dev
fi
# Get last changes
git pull
# Get list of available remote's branch
git fetch --prune origin
# List merged branch and remove it
git branch --merged | egrep -v "(^\*|master|dev)" |xargs git branch -d

9
bin/rpi-create.sh Executable file
View file

@ -0,0 +1,9 @@
#! /bin/bash
sudo dd if=$1 of=$2.raw.img
sudo ~dbroqua/Bin/pishrink.sh $2.raw.img $2.img
sudo chown dbroqua: $2.*
gzip $2.img
rm $2.raw.img

93
bin/rsync.sh Executable file
View file

@ -0,0 +1,93 @@
#!/bin/bash
TYPE='' # usb / sshfs
CMD=rsync
ARGS='-avz --delete
--exclude /Nextcloud
--exclude /.cache
--exclude /Downloads
--exclude /.thunderbird
--exclude /Projects
--exclude /Software
--exclude /tmp
--exclude /fonts
--exclude /Music
--exclude /node_modules
--exclude /snap
--exclude /.local/share/Trash
--exclude /.npm
--exclude /.thumbnails
--exclude /Android
--exclude /.AndroidStudio*
--exclude /.android
--exclude /.bundle/cache
--exclude /.config/cache
--exclude /.config/Code/Cache
--exclude /.config/Code/CachedData
--exclude /.config/Slack
--exclude /.config/*/Cache
--exclude /.config/chromium
--exclude /.mozilla
--exclude /.config/discord
--exclude /.config/spotify
--exclude /.crashlytics
--exclude /.fastlane
--exclude /.gradle
--exclude ./Software
--exclude /.local
--exclude /.DataGrip*'
ORIG='/home/dbroqua/'
DEST=''
HOSTNAME=`hostname`
# USB
UUID='6e3f7ae3-8fa1-43f3-88c0-a12651519ffb'
MOUNT='/mnt/backup'
DEST_USB="/mnt/backup/${HOSTNAME}/dbroqua/"
# SSHFS
DEST_SSHFS="storage:Backup/${HOSTNAME}/dbroqua/"
echo `date` > ${ORIG}/lastBackup
while getopts t:h opt
do
case $opt in
t)
case ${OPTARG} in
usb)
TYPE='usb'
DEST=${DEST_USB}
;;
sshfs)
TYPE='sshfs'
DEST=${DEST_SSHFS}
;;
*)
echo "usb / sshfs attendu"
exit 1;
esac
;;
esac
done
echo "Method: ${TYPE}" >> ${ORIG}/lastBackup
if [ "${TYPE}" != '' ] ; then
case ${TYPE} in
usb)
sudo cryptsetup luksOpen /dev/sdb1 backup
sudo mount /dev/mapper/backup ${MOUNT}
echo "Go !"
if [ $? == 0 ] ; then
${CMD} ${ARGS} ${ORIG} ${DEST}
fi
sudo umount ${MOUNT}
sudo cryptsetup luksClose backup
;;
sshfs)
${CMD} ${ARGS} ${ORIG} ${DEST}
;;
esac
fi

72
bin/screenlayout.sh Executable file
View file

@ -0,0 +1,72 @@
#! /bin/bash
activeconfig='laptop'
if [ -f ~/.screenlayout.info ] ; then
activeconfig=`cat ~/.screenlayout.info`
fi
nextconfig='laptop'
case $activeconfig in
home)
nextconfig='homeoffice'
;;
homeoffice)
nextconfig='laptop'
;;
laptop)
nextconfig='home'
;;
esac
if [ $1 ]; then
if [ "$1" = "menu" ]; then
chosen="$(echo -e "$options" | $rofi_command -dmenu -selected-row 1)"
exit 0
else
nextconfig=$1
fi
fi
echo ${nextconfig} > ~/.screenlayout.info
case $nextconfig in
home)
# Home
xrandr --output DP-2-1 --primary --mode 2560x1080 --pos 0x0 --rotate normal \
--output DP-2-2 --off \
--output DP-2-3 --off \
--output eDP-1 --off \
--output HDMI-2 --off \
--output HDMI-1 --off \
--output DP-2 --off \
--output DP-1 --off
;;
homeoffice)
# Home Office
xrandr --output DP-2-1 --primary --mode 2560x1080 --pos 0x0 --rotate normal \
--output DP-2-2 --mode 1920x1080 --pos 2560x0 --rotate normal \
# --output DP-2-2 --mode 1920x1080 --pos 2560x0 --rotate left \
--output DP-2-3 --off \
--output eDP-1 --off \
--output HDMI-2 --off \
--output HDMI-1 --off \
--output DP-2 --off \
--output DP-1 --off
;;
laptop)
# Laptop mode
xrandr --output DP-2-1 --off \
--output DP-2-2 --off \
--output DP-2-3 --off \
--output eDP-1 --primary --mode 1920x1080 --pos 0x0 --rotate normal \
--output HDMI-2 --off \
--output HDMI-1 --off \
--output DP-2 --off \
--output DP-1 --off
;;
esac
# Reset wallpaper
~/bin/wallpaper.sh

26
bin/screenlayoutrofi.sh Executable file
View file

@ -0,0 +1,26 @@
#! /bin/bash
rofi_command="rofi"
mode="laptop"
### Options ###
laptop=" Laptop only"
home=" Wide screen"
homeoffice="  Dual screen"
# Variable passed to rofi
options="$laptop\n$home\n$homeoffice"
chosen="$(echo -e "$options" | $rofi_command -dmenu -selected-row 1)"
case $chosen in
$latpop)
mode="laptop"
;;
$home)
mode="home"
;;
$homeoffice)
mode="homeoffice"
;;
esac
~/bin/screenlayout.sh $mode

7
bin/screenshooter.sh Executable file
View file

@ -0,0 +1,7 @@
#! /bin/bash
FILENAME="Screenshots-$(date +%Y%m%d-%H%M%S).png"
scrot -q 70 ${FILENAME} -e 'mv $f ~/Pictures/screenshots/'
notify-send -i screenie 'Screenshot!' "Saved as ${FILENAME}"

354
bin/slip Executable file
View file

@ -0,0 +1,354 @@
#! /bin/bash
set -eo pipefail
VERSION="2.0.4"
# Sane defaults in case of not being set in the config / config not existing.
CREDENTIALS_FILE="$HOME/.config/slip/credentials"
RECORD_PIDFILE="/tmp/slip_record.pid"
IMAGES="$HOME/Pictures"
VIDEOS="$HOME/Videos"
GIF_SCALE="640"
GIF_FPS=15
SOUND=0
NOUPLOAD=0
DMENU_CMD="rofi -dmenu -p slip"
# Load config.
CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}/slip/config"
if [ -f $CONFIG ]; then
source $CONFIG
else
echo "No config was found - using default options. Please copy the example configuration to ~/.config/slip/config from https://github.com/Toqozz/slip"
fi
CLIENT_ID="abd3a90bbfb65e9"
# Dmenu prompts.
DMENU_OPTS="screenshot
video
gif
exit"
DMENU_RECORD_OPTS="stop
cancel"
DMENU_UPLOAD_OPTS_BIG="upload (gfycat)
delete
exit"
DMENU_UPLOAD_OPTS="upload (imgur)
upload (gfycat)
delete
exit"
# Maximum size for upload (kb).
# Gfycat does not have a file limit.
MAX_GIF_SIZE_IMGUR=10000
function usage() {
echo ""
echo " slip [ -h | -v | -s | -r | -a | -q ] -nu"
echo " Uploads images taken with ffmpeg via slop to imgur. Quick video recording."
echo " That's all."
echo ""
echo " -h | --help show this help"
echo " -v | --version show version"
echo " -s | --screenshot take a screenshot (skip dmenu)"
echo " -g | --gif take a gif (skip dmenu)"
echo " -r | --record take a video (skip dmenu)"
echo " -nu | --no-upload don't upload the result"
echo " -q | --stop stop recording a video / gif (skip dmenu) (only when recording)"
echo ""
}
function upload_imgur() {
file="$1"
if [ -f "$file" ]; then
if [ -f "$CREDENTIALS_FILE" ]; then
# We have an auth token to use.
check_auth_credentials
if [ $? -ne 1 ]; then
# Token valid.
curl -sH "Authorization: Bearer ${access_token}" -F "image=@$file" "https://api.imgur.com/3/upload"
fi
else
# Imgur needs to know what program is using its services.
curl -sH "Authorization: Client-ID ${CLIENT_ID}" -F "image=@$file" "https://api.imgur.com/3/upload"
fi
else
echo "File does not exist, what happened?"
fi
}
function upload_gfycat() {
local file="$1"
local result=$(curl -s -XPOST https://api.gfycat.com/v1/gfycats -H "Content-Type: application/json")
local gfyname=$(parse "gfycat" $result)
curl -s "https://filedrop.gfycat.com/$gfyname" --upload-file "$file"
# No new line so we can append it easily.
echo -n "$gfyname"
}
function check_auth_credentials() {
token_expire_time=0
if [ -f "${CREDENTIALS_FILE}" ]; then
source "${CREDENTIALS_FILE}"
fi
if [ ! -z ${access_token} ]; then
current_time="$(date +%s)"
preemptive_refresh_time="$((10*60))"
expired="$((current_time > (token_expire_time - preemptive_refresh_time)))"
if [ "${expired}" -eq "0" ]; then
#token has expired, get a new one.
echo 'The authorization token has expired, please get a new one.'
return 1;
fi
else
return 1;
fi
}
function clip_clear() {
# Clear x cliboard selection.
xsel -bc # Ctrl-v / Shift-Insert.
# xsel -pc # Middle click.
}
# Run slop and get the geometry line.
function slop_geom() {
if [ "$1" = "image" ]; then
slop -f '%wx%h+%x+%y'
else
slop -f '%wx%h|%x,%y' # | sed -e s/+/\|/ -e s/+/,/
fi
#elif [ "$1" = "video" ]; then
#slop -f '%wx%h+%x+%y' | sed -e s/+/\|/ -e s/+/,/
#slop | sed -n 5p | sed -e s/G=// -e s/+/\|/ -e s/+/,/
#elif [ "$1" = "gif" ]; then
#slop -f '%wx%h+%x+%y' | sed -e s/+/\|/ -e s/+/,/
}
# Take the shot (or start the video.)
function shot() {
if [ "$1" = "image" ]; then
extension=".png" # img-2016-04-16-153906.png
filename="$IMAGES/img-`date +%Y-%m-%d-%H%M%S`$extension" # .png, .jpg
maim -g "$2" $filename
# TODO, do we want more dependencies? (optional dependencies?)
#ffmpeg -f x11grab -video_size "$2" -i "$DISPLAY+$3" -vframes 1 $filename &> /dev/null
elif [ "$1" = "video" ]; then
extension=".mkv" # vid-2016-04-16-153906.mkv
filename="$VIDEOS/vid-`date +%Y-%m-%d-%H%M%S`$extension" # .mkv, .mp4
if [ $SOUND == 0 ]; then
ffmpeg -f x11grab -video_size "$2" -framerate 60 -i "$DISPLAY+$3" -loglevel quiet -c:v libx264 -preset ultrafast $filename &
else
ffmpeg -f pulse -i 1 -f x11grab -video_size "$2" -framerate 60 -i "$DISPLAY+$3" -loglevel quiet -c:v libx264 -preset ultrafast $filename &
fi
echo "$! vid $filename" > "$RECORD_PIDFILE"
elif [ "$1" = "gif" ]; then
extension=".gif" # gif-2016-04-16-153906.gif
tmpfilename="/tmp/gif-`date +%Y-%m-%d-%H%M%S-tmp`.mkv"
filename="$VIDEOS/gif-`date +%Y-%m-%d-%H%M%S`$extension" # .gif
# Record a video to be converted to gif.
ffmpeg -f x11grab -video_size "$2" -framerate $GIF_FPS -i "$DISPLAY+$3" -loglevel quiet -c:v libx264 -preset ultrafast $tmpfilename &
#ffmpeg -f x11grab -video_size "$2" -framerate 15 -i "$DISPLAY+$3" -vf scale="$GIF_SCALE:-1" $filename &> /dev/null &
# We need to access this information later.
ratio=$(awk -F"x" '{ print int($1/$2) }' <<< "$2") # We only really need a binary answer.
if [ "$ratio" -ge 1 ]; then echo "$! gif $tmpfilename $filename 0" > "$RECORD_PIDFILE"
else echo "$! gif $tmpfilename $filename 1" > "$RECORD_PIDFILE"
fi
fi
}
function kill_ffmpeg() {
# Kill ffmpeg (stopping the recording.)
kill $1 || echo "Failed to kill ffmpeg, did it crash? Removing $RECORD_PIDFILE anyway."
# Remove the pid file so that slip can be used as normal again.
rm "$RECORD_PIDFILE"
}
function convert_to_gif() {
local tfn=$1
local pfn=$2
local fn=$3
local wh=$4 # 0 = width larger than height, 1 = height larger than width
local ratio
# If the width is larger than the height, we want to scale with the width, otherwise scale with the height.
if [ $wh -eq 0 ]; then
ratio="$GIF_SCALE:-1"
else
ratio="-1:$GIF_SCALE"
fi
notify "Converting to gif…"
# Give enough time to save the file.
sleep 1 && ffmpeg -i "$tfn" -loglevel quiet -vf fps=$GIF_FPS,scale="$ratio":flags=lanczos,palettegen "$pfn" &&
ffmpeg -i "$tfn" -i "$pfn" -loglevel quiet -filter_complex "fps=$GIF_FPS,scale=$ratio:flags=lanczos[x];[x][1:v]paletteuse" "$fn" &&
echo "$fn"
}
function stop_rec() {
local choice
local pid=$1 # Process id (for killing ffmpeg).
local tfn=$3 # Temp file name (for gifs).
local fn=$4 # File name for the gif/vid we're saving.
local pfn="${tfn}-palette.png" # Palette file name (for gif rendering).
# Stop recording.
kill_ffmpeg "$pid"
# When processing a gif, we canvert it straight away and then upload.
# NOTE: gfycat does not require the video to be converted, but we convert it anyway to store
# the .gif file.
# Is this actually a good idea? We could just store the .mkv instead, but then we lose the ability to store .gif.
if [ "$2" = "gif" ]; then
fn=$(convert_to_gif "$tfn" "$pfn" "$fn" "$5")
size=$(du -k $fn | cut -f1)
if [ $NOUPLOAD == 0 ]; then
if [ "$size" -lt "${MAX_GIF_SIZE_IMGUR}" ]; then
choice=$($DMENU_CMD <<< $DMENU_UPLOAD_OPTS)
else
choice=$($DMENU_CMD <<< $DMENU_UPLOAD_OPTS_BIG)
fi
if [ "$choice" = "upload (gfycat)" ]; then
clip_clear
name=$(upload_gfycat "$tfn")
url="https://gfycat.com/$name"
notify "Uploading to $url ..."
echo "$url"
echo -n "$url" | xsel -bi # Read to clipboard.
elif [ "$choice" = "upload (imgur)" ]; then
clip_clear
output=$(upload_imgur "$fn")
url=$(parse "imgur" "$output")
notify "$url"
echo "$url"
echo -n "$url" | xsel -bi # Read to clipboard.
elif [ "$choice" = "delete" ]; then
rm $fn
fi
fi
else
notify "$fn"
fi
}
# Parse x,y -- but also imgur.
function parse() {
if [ "$1" = "geometryx" ]; then
awk -F"|" '{ print $1 }' <<< "$2"
elif [ "$1" = "geometry+" ]; then
awk -F"|" '{ print $2 }' <<< "$2"
elif [ "$1" = "imgur" ]; then
jq -r ".data.link" <<< "$2"
#sed -e 's/.*\"link\":"\([^"]*\).*/\1/' -e 's/\\//g' <<< "$2"
#sed -e 's/\"link\":"\([^"]*\)/\1/' -e 's/\\//g' <<< "$2"
elif [ "$1" = "gfycat" ]; then
jq -r ".gfyname" <<< "$2"
fi
}
function notify() {
notify-send -t 7000 "slip" "$1"
}
function main() {
if [ "$1" = "screenshot" ]; then
# Run slop and get geometry from it.
# maim naturally supports slop's output coordinates.
geometry=$(slop_geom "image")
# Take the shot.
shot "image" "$geometry"
# Parse imgur json into link.
# If noupload is not set.
if [ $NOUPLOAD == 0 ]; then
#echo "uploading..."
# Clear cliboard before doing anything, so we can copy link to it later.
clip_clear
output=$(upload_imgur "$filename")
url=$(parse "imgur" "$output")
# Notify user that upload has finished.
notify "$url"
echo "$url"
# Read to clipboard, removing trailing newline.
echo -n "$url" | xsel -bi
else
notify "$filename"
fi
# echo "$url" | xsel -pi # Read to primary.
elif [ "$1" = "video" ]; then
geometry=$(slop_geom "video")
wxh=$(parse "geometryx" $geometry)
off=$(parse "geometry+" $geometry)
shot "video" "$wxh" "$off"
elif [ "$1" = "gif" ]; then
geometry=$(slop_geom "gif")
wxh=$(parse "geometryx" $geometry)
off=$(parse "geometry+" $geometry)
shot "gif" "$wxh" "$off"
elif [ "$1" = "stop" ]; then
# Get info of recording process.
local info
# Get infor from the pidfile.
info=$(cat "$RECORD_PIDFILE")
# Stop with parameters ("<pid> <type> <filename> <ratio>")
stop_rec $info
exit 0
else
exit 0
fi
}
# Dependencies.
depends="curl
jq
maim
slop
ffmpeg"
while read line
do
if ! type $line &> /dev/null ; then
echo "$line not found, expect unexpected or breakage."
fi
done <<< "$depends"
# Main.
# Yes, we could call this stuff with integers, but this is much clearer.
if [ "$1" = "-nu" -o "$1" = "--no-upload" -o "$2" = "-nu" -o "$2" = "--no-upload" ]; then
NOUPLOAD=1
fi
if [ "$1" = "-h" -o "$1" = "--help" ]; then
usage
exit 0
elif [ "$1" = "-v" -o "$1" = "--version" ]; then
echo "Version: $VERSION"
exit 0
elif [ "$1" = "-s" -o "$1" = "--screenshot" ]; then
main "screenshot"
elif [ "$1" = "-g" -o "$1" = "--gif" ]; then
main "gif"
elif [ "$1" = "-r" -o "$1" = "--record" ]; then
main "video"
elif [ "$1" = "-q" -o "$1" = "--stop" ]; then
main "stop"
elif [ $# == 0 ]; then
if [ -a "$RECORD_PIDFILE" ]; then
main $($DMENU_CMD <<< "$DMENU_RECORD_OPTS")
else
main $($DMENU_CMD <<< "$DMENU_OPTS")
fi
fi

7
bin/timelapse.sh Executable file
View file

@ -0,0 +1,7 @@
#! /bin/bash
ls -1tr | grep -v files.txt > files.txt
mencoder -nosound -noskip -oac copy -ovc copy -o output.avi -mf fps=20 'mf://@files.txt'
ffmpeg -i output.avi -y -sameq -vf scale=1920:1440,crop=1920:1080 output-final.avi

6
bin/to_utf-8 Executable file
View file

@ -0,0 +1,6 @@
#! /bin/bash
for i in "*.${1}"; do
iconv -f iso-8859-15 -t utf-8 ${i} > ${i}.tmp
mv ${i}.tmp ${i}
done

33
bin/tunnel.sh Executable file
View file

@ -0,0 +1,33 @@
#! /bin/bash
LOCAL_PORT=6660
CLIENT=127.0.0.1
REMOTE="-"
while [ $# -gt 0 ]; do
case "$1" in
--local-port=*)
LOCAL_PORT="${1#*=}"
;;
--remote=*)
REMOTE="${1#*=}"
;;
--client=*)
CLIENT="${1#*=}"
;;
*)
printf "Invalid parameter $1"
exit 1
esac
shift
done
if [ "${REMOTE}" = "-" ] ; then
printf "Invalid value for --remote="
exit 1
fi
REMOTE_SERVER=`echo ${REMOTE}|cut -d: -f1`
REMOTE_PORT=`echo ${REMOTE}|cut -d: -f2`
ssh -L ${LOCAL_PORT}:${CLIENT}:${REMOTE_PORT} ${REMOTE_SERVER}

19
bin/umount Executable file
View file

@ -0,0 +1,19 @@
#!/bin/sh
# A mettre dans le dossier : /lib/systemd/system-sleep
PATH=/bin:/usr/bin
case ${1} in
pre)
fusermount -u /home/dbroqua/Gdrive
fusermount -u /home/dbroqua/S3FS
umount -f /media/freebox
umount -f /media/malpartida/dbroqua
umount -f /media/malpartida/medias
umount -f /media/malpartida/family
;;
*)
exit ${NA}
esac

11
bin/wallpaper.sh Executable file
View file

@ -0,0 +1,11 @@
#! /bin/bash
# CONFIG
DIRECTORY="/home/dbroqua/Nextcloud/images/Wallpaper/Rotation"
# SCRIPT START HERE
SELECTED=`find ${DIRECTORY} -type f | shuf -n 1`
feh --bg-fill ${SELECTED}