|
|
@@ -0,0 +1,523 @@ |
|
|
|
# see if which can find the command in the PATH |
|
|
|
# defined before other aliases so they don't get |
|
|
|
# added if the command they use isn't installed |
|
|
|
cmds_exist () { |
|
|
|
for cmd in ${@}; do |
|
|
|
if ! PATH="/usr/lib/ccache:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" which ${1} &>/dev/null; then |
|
|
|
return 1 |
|
|
|
fi |
|
|
|
done |
|
|
|
return 0 |
|
|
|
} |
|
|
|
|
|
|
|
if cmds_exist sudo; then |
|
|
|
if cmds_exist apt-fast; then |
|
|
|
alias apt-fast="sudo apt-fast" |
|
|
|
if [ -z $APT_CMD ]; then APT_CMD="apt-fast"; fi |
|
|
|
fi |
|
|
|
if cmds_exist apt; then |
|
|
|
alias apt="sudo apt" |
|
|
|
if [ -z $APT_CMD ]; then APT_CMD="apt"; fi |
|
|
|
fi |
|
|
|
if cmds_exist apt-get; then |
|
|
|
alias apt-get="sudo apt-get" |
|
|
|
if [ -z $APT_CMD ]; then APT_CMD="apt-get"; fi |
|
|
|
fi |
|
|
|
|
|
|
|
alias dist-upgrade="${APT_CMD} update -qq && ${APT_CMD} dist-upgrade" |
|
|
|
alias upgrade="${APT_CMD} update -qq && ${APT_CMD} upgrade --with-new-pkgs" |
|
|
|
|
|
|
|
if cmds_exist add-apt-repository; then |
|
|
|
alias add-apt-repository="sudo add-apt-repository" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist apt-key; then |
|
|
|
alias apt-recv-key="sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys" |
|
|
|
fi |
|
|
|
alias dpkg="sudo dpkg" |
|
|
|
alias cleanoldkernels="dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'$(uname -r)'/q;p' | xargs ${APT_CMD} purge" |
|
|
|
|
|
|
|
function apt-get-update-repo () { |
|
|
|
options="-o Dir::Etc::sourcelist=sources.list.d/${1}.list -o Dir::Etc::sourceparts='-' -o APT::Get::List-Cleanup='0 |
|
|
|
'" |
|
|
|
${APT_CMD} ${options} update |
|
|
|
} |
|
|
|
|
|
|
|
alias service="sudo /usr/sbin/service" |
|
|
|
|
|
|
|
alias iwconfig="sudo /sbin/iwconfig" |
|
|
|
alias iw="sudo /sbin/iw" |
|
|
|
alias ip="sudo /sbin/ip" |
|
|
|
alias iptables="sudo /sbin/iptables" |
|
|
|
alias ip6tables="sudo /sbin/ip6tables" |
|
|
|
|
|
|
|
if cmds_exist tcpdump; then |
|
|
|
alias tcpdump="sudo /usr/sbin/tcpdump" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist iftop; then |
|
|
|
alias iftop="sudo /usr/sbin/iftop" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist nethogs; then |
|
|
|
alias nethogs="sudo /usr/sbin/nethogs" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist iotop; then |
|
|
|
alias iotop="sudo /usr/sbin/iotop" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist unbound-control; then |
|
|
|
alias unbound-control="sudo /usr/sbin/unbound-control" |
|
|
|
fi |
|
|
|
|
|
|
|
alias fsck="sudo /sbin/fsck" |
|
|
|
|
|
|
|
if cmds_exist lxc-start; then |
|
|
|
alias lxc-start="sudo /usr/bin/lxc-start" |
|
|
|
fi |
|
|
|
if cmds_exist lxc-stop; then |
|
|
|
alias lxc-stop="sudo /usr/bin/lxc-stop" |
|
|
|
fi |
|
|
|
if cmds_exist lxc-attach; then |
|
|
|
alias lxc-attach="sudo /usr/bin/lxc-attach" |
|
|
|
fi |
|
|
|
if cmds_exist lxc-ls; then |
|
|
|
alias lxc-ls="sudo /usr/bin/lxc-ls" |
|
|
|
fi |
|
|
|
|
|
|
|
if [ -f /opt/borgbackup/bin/borg ]; then |
|
|
|
alias overstock-borg="sudo BORG_REPO=/mnt/c_isilon/home/nbohman/borgbackup BORG_PASSPHRASE='aey4zah4eish9weekaizega7ooph9joo9eep3otoh4uev9eez4oof9Ko7ga3zah' /opt/borgbackup/bin/borg" |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist grc; then |
|
|
|
alias mtr="grc mtr --curses" |
|
|
|
alias ping="grc ping" |
|
|
|
alias dig="grc dig" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist pigz; then |
|
|
|
alias gzip="pigz" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist sfs; then |
|
|
|
alias organize_downloads="sfs ~/.config/sfs/Dowloads.yaml ~/Downloads" |
|
|
|
fi |
|
|
|
|
|
|
|
alias xz="xz -T0" |
|
|
|
|
|
|
|
if cmds_exist zfs; then |
|
|
|
function zfs_snapshots_by_size () { |
|
|
|
root_dataset=${1} |
|
|
|
zfs list -r -t snapshot -o name,used,creation ${root_dataset} | sort -k 2,2h |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist lsblk; then |
|
|
|
alias lsblk="lsblk -o 'NAME,UUID,PARTUUID,SIZE,TYPE,SCHED,FSTYPE,LABEL,MOUNTPOINT'" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist git; then |
|
|
|
alias git-reset-hard="git fetch origin; git reset --hard origin/master; git clean -f" |
|
|
|
fi |
|
|
|
|
|
|
|
alias ssh-remove-host-key="ssh-keygen -f "/home/natrinicle/.ssh/known_hosts" -R" |
|
|
|
alias ssh-stop-multiplex="ssh -O stop" |
|
|
|
alias extract-jpg-from-dngs="for file in *.dng; do exiftool -b -JpgFromRaw $file > $file.jpg; done" |
|
|
|
|
|
|
|
if cmds_exist pwgen; then |
|
|
|
alias genpass="pwgen -1yBn" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist dig; then |
|
|
|
alias dig-short="dig +short" |
|
|
|
fi |
|
|
|
|
|
|
|
alias load="uptime | grep -Eo '([0-9]+\.[0-9]+,? ?){3}'" |
|
|
|
|
|
|
|
alias pip="/usr/bin/env pip" |
|
|
|
alias pip3="/usr/bin/env pip3" |
|
|
|
|
|
|
|
scp_home_rc () { |
|
|
|
scp ${@:2} .bashrc ${1}:~ |
|
|
|
scp ${@:2} .bash_aliases ${1}:~ |
|
|
|
scp ${@:2} .vimrc ${1}:~ |
|
|
|
} |
|
|
|
|
|
|
|
# Add a path to $PATH if it's not already in there |
|
|
|
# pathmunge /path/to/add |
|
|
|
pathmunge () { |
|
|
|
if ! echo $PATH | /bin/egrep -q "(^|:)$1($|:)" ; then |
|
|
|
if [ "$2" = "after" ] ; then |
|
|
|
PATH=$PATH:$1 |
|
|
|
else |
|
|
|
PATH=$1:$PATH |
|
|
|
fi |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
if cmds_exist ipmitool ; then |
|
|
|
export IPMI_USER="ADMIN" |
|
|
|
export IPMI_PASS="ADMIN" |
|
|
|
|
|
|
|
# Set boot device on next boot to pxe |
|
|
|
ipmipxe() { |
|
|
|
ipmitool -I lanplus -H ${1} -U ADMIN -P ADMIN chassis bootdev pxe |
|
|
|
} |
|
|
|
# Reset a hung bmc |
|
|
|
ipmiresetbmc() { |
|
|
|
ipmitool -I lanplus -H ${1} -U ADMIN -P ADMIN mc reset cold |
|
|
|
} |
|
|
|
# Power cycle a server from it's bmc |
|
|
|
ipmipowercycle() { |
|
|
|
ipmitool -I lanplus -H ${1} -U ADMIN -P ADMIN chassis power cycle |
|
|
|
} |
|
|
|
# Ipmi wrapper with username/password for any other commands |
|
|
|
ipmi() { |
|
|
|
# ${@:2} pulls in all argv from 2 to the end of the line |
|
|
|
ipmitool -I lanplus -H ${1} -U ${IPMI_USER} -P ${IPMI_PASS} ${@:2} |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist pv dd; then |
|
|
|
dd-progress() { |
|
|
|
sudo dd if=${1} ${@:3} | pv -tpreb | sudo dd of=${2} ${@:3} |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
if [ -d /sys/devices/platform/applesmc.768 ]; then |
|
|
|
fanspeed() { |
|
|
|
# Pulled from http://ubuntuforums.org/showthread.php?t=1645913&p=10246215#post10246215 |
|
|
|
# Requires applesmc-dkms package and modprobe applesmc |
|
|
|
# Included in kernels >=2.6.27 |
|
|
|
service mbpfan stop |
|
|
|
echo 1 | sudo tee /sys/devices/platform/applesmc.768/fan1_manual > /dev/null |
|
|
|
echo 1 | sudo tee /sys/devices/platform/applesmc.768/fan2_manual > /dev/null |
|
|
|
echo $1 | sudo tee /sys/devices/platform/applesmc.768/fan1_output > /dev/null |
|
|
|
echo $1 | sudo tee /sys/devices/platform/applesmc.768/fan2_output > /dev/null |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
extract () { |
|
|
|
if [ -f $1 ] ; then |
|
|
|
case $1 in |
|
|
|
*.tar.bz2) tar xjf $1 ;; |
|
|
|
*.tar.gz) tar xzf $1 ;; |
|
|
|
*.bz2) bunzip2 $1 ;; |
|
|
|
*.rar) unrar e $1 ;; |
|
|
|
*.gz) gunzip $1 ;; |
|
|
|
*.tar) tar xf $1 ;; |
|
|
|
*.tbz2) tar xjf $1 ;; |
|
|
|
*.tgz) tar xzf $1 ;; |
|
|
|
*.zip) unzip $1 ;; |
|
|
|
*.Z) uncompress $1 ;; |
|
|
|
*.7z) 7z x $1 ;; |
|
|
|
*) echo "'$1' cannot be extracted via extract()" ;; |
|
|
|
esac |
|
|
|
else |
|
|
|
echo "'$1' is not a valid file" |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
if cmds_exist ldapsearch; then |
|
|
|
export LDAP_USER="nate.bohman" |
|
|
|
|
|
|
|
ldapmultisearch() { |
|
|
|
if [ -z $LDAP_USER ]; then |
|
|
|
read -p "Username: " LDAP_USER |
|
|
|
export LDAP_USER |
|
|
|
fi |
|
|
|
read -s -p "${LDAP_USER}'s Password: " LDAP_PASSWORD |
|
|
|
echo "" |
|
|
|
for uid in "${@}"; do |
|
|
|
ldapsearch -x -ZZ -D "${LDAP_USER}@purestorage.com" -b "ou=PSUsers,dc=purestorage,dc=com" -h ldap.purestorage.com -w ${LDAP_PASSWORD} uid=${uid} |
|
|
|
if [ ${?} != 0 ]; then |
|
|
|
echo "ldapsearch had an error" |
|
|
|
unset LDAP_PASSWORD |
|
|
|
break |
|
|
|
fi |
|
|
|
done |
|
|
|
export LDAP_PASSWORD |
|
|
|
} |
|
|
|
|
|
|
|
ldapfindteam() { |
|
|
|
LDAP_SEARCH="$(ldapmultisearch ${1})" |
|
|
|
MANAGER_DN=$(echo "${LDAP_SEARCH}" | grep -Po "(?<=^manager: ).*$") |
|
|
|
MANAGER_NAME=$(echo "${LDAP_SEARCH}" | grep -Po "(?<=^name: ).*$") |
|
|
|
MANAGER_TITLE=$(echo "${LDAP_SEARCH}" | grep -Po "(?<=^title: ).*$") |
|
|
|
TEAM_UIDS=$(ldapsearch -x -ZZ -D "${LDAP_USER}@purestorage.com" -b "ou=PSUsers,dc=purestorage,dc=com" -h ldap.purestorage.com -w ${LDAP_PASSWORD} "manager=${MANAGER_DN}" | grep -Po "(?<=^uid: ).*") |
|
|
|
echo "Manager: ${MANAGER_NAME} - ${MANAGER_TITLE}" |
|
|
|
for character in $(echo "Manager: ${MANAGER_NAME} - ${MANAGER_TITLE}" | wc -c); do echo -e "-"; done |
|
|
|
ldapmultisearch ${TEAM_UIDS} | grep -Po "(?<=^name: ).*$" |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist curl; then |
|
|
|
test_redirect() { |
|
|
|
if [ $(echo $2 | cut -d":" -f1) == "https" ]; then |
|
|
|
port=443 |
|
|
|
else |
|
|
|
port=80 |
|
|
|
fi |
|
|
|
domain=$(echo $2 | cut -d"/" -f3) |
|
|
|
# echo "IP $1" |
|
|
|
# echo "Port $port" |
|
|
|
# echo "Domain $domain" |
|
|
|
# echo "URL $2" |
|
|
|
echo "Testing $2 against $1:$port" |
|
|
|
|
|
|
|
curl --resolve $domain:$port:$1 $2 --progress-bar --insecure -sL -w "%{http_code} %{url_effective}\\n" -o /dev/null |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
psgrep() { |
|
|
|
ps auxw | grep "$(echo ${@} | sed 's/^\(.\)/[\1]/')" |
|
|
|
} |
|
|
|
ps_forest_pid () { |
|
|
|
ps --forest -o user,pid,pcpu,pmem,vsz,rss,tty,stat,start,time,cmd -g $(ps -o sid= -p ${1}) |
|
|
|
} |
|
|
|
psmem() { |
|
|
|
# Print the number of processes matching name given, memory per process, and total memory usage |
|
|
|
ps -C $1 -O rss | gawk '{ count ++; sum += $2 }; END {count --; print "Number of processes =",count; print "Memory usage per process =",sum/1024/count, "MB"; print "Total memory usage =", sum/1024, "MB" ;};' |
|
|
|
} |
|
|
|
lsof_proc_open_cons () { |
|
|
|
lsof -c ${1} -a -i${2} |
|
|
|
} |
|
|
|
memused() { |
|
|
|
# Get ram total, free, and used without cached/buffers then calculate the percentage used to the nearest whole number |
|
|
|
mem_total=$(cat /proc/meminfo | egrep "^MemTotal:" | egrep -o "[0-9]+") |
|
|
|
mem_free=$(echo $(cat /proc/meminfo | egrep "^MemFree:" | egrep -o "[0-9]+") + $(cat /proc/meminfo | egrep "^Cached:" | egrep -o "[0-9]+") | bc) |
|
|
|
mem_used=$(echo ${mem_total} - ${mem_free} | bc) |
|
|
|
percent_used=$(awk "BEGIN { pc=${mem_used}/${mem_total}*100; i=int(pc); print (pc-i<0.5)?i:i+1 }") |
|
|
|
|
|
|
|
# Output as used/total (percent%) |
|
|
|
echo -e "${mem_used}/${mem_total} (${percent_used}%)" |
|
|
|
} |
|
|
|
swapused() { |
|
|
|
# Get swap total, free, and used then calculate the percentage used to the nearest whole number |
|
|
|
swap_total=$(cat /proc/meminfo | egrep "^SwapTotal:" | egrep -o "[0-9]+") |
|
|
|
swap_free=$(cat /proc/meminfo | egrep "^SwapFree:" | egrep -o "[0-9]+") |
|
|
|
swap_used=$(echo ${swap_total} - ${swap_free} | bc) |
|
|
|
percent_used=$(awk "BEGIN { pc=${swap_used}/${swap_total}*100; i=int(pc); print (pc-i<0.5)?i:i+1 }") |
|
|
|
|
|
|
|
# Output as used/total (percent%) |
|
|
|
echo -e "${swap_used}/${swap_total} (${percent_used}%)" |
|
|
|
} |
|
|
|
|
|
|
|
suspend_process_soft() { |
|
|
|
for pid in $(psgrep $1 | awk '{print $2}'); do |
|
|
|
kill -TSTP ${pid} |
|
|
|
done |
|
|
|
} |
|
|
|
|
|
|
|
suspend_process_hard() { |
|
|
|
for pid in $(psgrep $1 | awk '{print $2}'); do |
|
|
|
kill -STOP ${pid} |
|
|
|
done |
|
|
|
} |
|
|
|
|
|
|
|
unsuspend_process() { |
|
|
|
for pid in $(psgrep $1 | grep -P " Tl? " | awk '{print $2}'); do |
|
|
|
kill -CONT ${pid} |
|
|
|
done |
|
|
|
} |
|
|
|
|
|
|
|
zram_stat() { |
|
|
|
for i in /sys/block/zram*; do |
|
|
|
if [ -f $i/compr_data_size ] && [ -f $i/orig_data_size ]; then |
|
|
|
compr=$(< $i/compr_data_size) |
|
|
|
orig=$(< $i/orig_data_size) |
|
|
|
ratio=0 |
|
|
|
if [ $compr -gt 0 ]; then |
|
|
|
ratio=$(echo "scale=2; $orig*100/$compr" | bc -q) |
|
|
|
fi |
|
|
|
echo -e "/dev/${i/*\/}:\t$ratio% ($orig -> $compr)" |
|
|
|
fi |
|
|
|
done |
|
|
|
} |
|
|
|
|
|
|
|
ksm_stat() { |
|
|
|
# offered = pages_sharing + pages_shared + pages_unshared + pages_volatile; |
|
|
|
# saved = pages_sharing - pages_shared; |
|
|
|
# savings (ksm_ratios) = saved / offered; |
|
|
|
|
|
|
|
page_size=$(getconf PAGE_SIZE) |
|
|
|
|
|
|
|
pages_shared=$(cat /sys/kernel/mm/ksm/pages_shared) |
|
|
|
pages_sharing=$(cat /sys/kernel/mm/ksm/pages_sharing) |
|
|
|
pages_unshared=$(cat /sys/kernel/mm/ksm/pages_unshared) |
|
|
|
pages_volatile=$(cat /sys/kernel/mm/ksm/pages_volatile) |
|
|
|
|
|
|
|
offered=$(echo "${pages_sharing} + ${pages_shared} + ${pages_unshared} + ${pages_volatile}" | bc -l) |
|
|
|
offered_bytes=$(echo "${offered} * ${page_size}" | bc -l) |
|
|
|
offered_human="$(echo "${offered_bytes}" | numfmt --to=iec-i)B" |
|
|
|
saved=$(echo "${pages_sharing} - ${pages_shared}" | bc -l) |
|
|
|
saved_bytes=$(echo "${saved} * ${page_size}" | bc -l) |
|
|
|
saved_human="$(echo "${saved_bytes}" | numfmt --to=iec-i)B" |
|
|
|
saved_percent="0.00" |
|
|
|
|
|
|
|
if [ ${offered} -gt 0 ]; then |
|
|
|
saved_percent=$(python -c "print(round(float($(echo "${saved} / ${offered} * 100" | bc -l)), 2))") |
|
|
|
fi |
|
|
|
|
|
|
|
echo -e "${saved_human}/${offered_human} (${saved_percent}%)" |
|
|
|
} |
|
|
|
|
|
|
|
if cmds_exist dkms; then |
|
|
|
if cmds_exist sudo; then |
|
|
|
DKMS_CMD="sudo dkms" |
|
|
|
else |
|
|
|
DKMS_CMD="dkms" |
|
|
|
fi |
|
|
|
|
|
|
|
dkms-buildall() { |
|
|
|
$DKMS_CMD status | sed s/,//g | awk '{print "-m",$1,"-v",$2}' | while read line; do ls /var/lib/initramfs-tools | xargs -n 1 $DKMS_CMD install $line -k; done |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist sudo; then |
|
|
|
function check_open_files () { |
|
|
|
alert_percent=${1:-0.75} |
|
|
|
for running_pid in $(sudo ps aux | awk '{print $2}' | tail -n+2); do |
|
|
|
if sudo test -d /proc/${running_pid}/fd && sudo test -f /proc/${running_pid}/limits; then |
|
|
|
open_files=$(sudo ls -l /proc/${running_pid}/fd | wc -l) |
|
|
|
open_limit=$(sudo grep "open files" /proc/${running_pid}/limits | awk '{print $4}') |
|
|
|
alert_limit=$(echo "((${open_limit} * ${alert_percent}) + 0.5) / 1" | bc) |
|
|
|
if [ ${open_files} -gt ${alert_limit} ]; then |
|
|
|
echo "PID ${running_pid} has ${open_files} open files with a limit of ${open_limit} max" |
|
|
|
fi |
|
|
|
fi |
|
|
|
done |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist sudo wg; then |
|
|
|
alias wg="sudo /usr/bin/wg" |
|
|
|
fi |
|
|
|
if cmds_exist sudo wg-quick; then |
|
|
|
alias wg-quick="sudo /usr/bin/wg-quick" |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist nc; then |
|
|
|
function port_open_check () { |
|
|
|
nc -zv ${@} |
|
|
|
} |
|
|
|
fi |
|
|
|
|
|
|
|
if cmds_exist youtube-dl; then |
|
|
|
alias youtube-dl-best="youtube-dl -f bestvideo+bestaudio" |
|
|
|
fi |
|
|
|
|
|
|
|
function dedup_text () { |
|
|
|
# Can use inline or with a filename |
|
|
|
# echo -e "Test\nTest\nTest\nTest2\nTest" | dedup_text |
|
|
|
# dedup_text /var/log/badly_duplicated_log > /var/log/deduplicated_log |
|
|
|
|
|
|
|
# Stolen from https://stackoverflow.com/questions/1444406/how-can-i-delete-duplicate-lines-in-a-file-in-unix |
|
|
|
# seen is an associative-array that Awk will pass every line of the file to. |
|
|
|
# If a line isn't in the array then seen[$0] will evaluate to false. |
|
|
|
# The ! is a logical NOT operator and will invert the false to true. |
|
|
|
# Awk will print the lines where the expression evaluates to true. |
|
|
|
# The ++ increments seen so that seen[$0] == 1 after the first time a |
|
|
|
# line is found and then seen[$0] == 2, and so on. |
|
|
|
# Awk evaluates everything but 0 and "" (empty string) to true. |
|
|
|
# If a duplicate line is placed in seen then !seen[$0] will evaluate to |
|
|
|
# false and the line will not be written to the output. |
|
|
|
awk '!seen[$0]++' |
|
|
|
} |
|
|
|
|
|
|
|
function escape_string () { |
|
|
|
# string=${@} |
|
|
|
# echo ${string//\\/\\\\} |
|
|
|
printf "%q" "${@}" |
|
|
|
} |
|
|
|
|
|
|
|
function round () { |
|
|
|
round_float=${1} |
|
|
|
round_places=${2:-2} |
|
|
|
|
|
|
|
python -c "print(round(float(${round_float}), ${round_places}))" |
|
|
|
} |
|
|
|
|
|
|
|
function percent_change () { |
|
|
|
old_number=${1} |
|
|
|
new_number=${2} |
|
|
|
|
|
|
|
if [ $(echo "${new_number} < ${old_number}" | bc -l) -eq 1 ]; then |
|
|
|
percent_decrease=$(round $(echo "((${old_number} - ${new_number}) / ${old_number}) * 100" | bc -l) 2) |
|
|
|
echo "${old_number} -> ${new_number} is a ${percent_decrease}% decrease" |
|
|
|
else |
|
|
|
percent_increase=$(round $(echo "((${new_number} - ${old_number}) / ${old_number}) * 100" | bc -l) 2) |
|
|
|
echo "${old_number} -> ${new_number} is a ${percent_increase}% increase" |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
# add thefuck function |
|
|
|
#eval $(thefuck --alias) |
|
|
|
function fuck () { |
|
|
|
TF_PREVIOUS=$(fc -ln -1); |
|
|
|
TF_CMD=$( |
|
|
|
TF_ALIAS=fuck |
|
|
|
TF_SHELL_ALIASES=$(alias) |
|
|
|
PYTHONIOENCODING=utf-8 |
|
|
|
thefuck $TF_PREVIOUS THEFUCK_ARGUMENT_PLACEHOLDER $@ |
|
|
|
) && eval $TF_CMD; |
|
|
|
history -s $TF_CMD; |
|
|
|
} |
|
|
|
|
|
|
|
if cmds_exist ffmpeg; then |
|
|
|
convert_video_to_webm () { |
|
|
|
filename=${1} |
|
|
|
filename_wo_ext=$(echo ${filename} | rev | cut -d"." -f2- | rev) |
|
|
|
|
|
|
|
# First pass |
|
|
|
ffmpeg -i ${filename} -c:v libvpx-vp9 -pass 1 -b:v 0 -crf 21 -threads 8 -speed 4 -tile-columns 6 -frame-parallel 1 -an -f webm -y /dev/null |
|
|
|
|
|
|
|
# Second pass |
|
|
|
ffmpeg -i ${filename} -c:v libvpx-vp9 -pass 2 -b:v 0 -crf 21 -threads 8 -speed 2 -tile-columns 6 -frame-parallel 1 -auto-alt-ref 1 -lag-in-frames 25 -c:a libopus -b:a 96k -f webm ${filename_wo_ext}.webm |
|
|
|
} |
|
|
|
|
|
|
|
stabilize_video () { |
|
|
|
filename=${1} |
|
|
|
filename_wo_ext=$(echo ${filename} | rev | cut -d"." -f2- | rev) |
|
|
|
filename_ext=$(echo ${filename} | rev | cut -d"." -f1 | rev) |
|
|
|
shakiness=${2:-5} |
|
|
|
accuracy=${3:-15} |
|
|
|
smoothing=${4:-30} |
|
|
|
|
|
|
|
# First pass |
|
|
|
ffmpeg -i ${filename} -vf vidstabdetect=shakiness=${shakiness}:accuracy=${accuracy} -f null - |
|
|
|
|
|
|
|
# Second pass |
|
|
|
ffmpeg -i ${filename} -vf vidstabtransform=smoothing=${smoothing}:input="transforms.trf" ${filename_wo_ext}.stabilized.${filename_ext} |
|
|
|
} |
|
|
|
if cmds_exist flac; then |
|
|
|
convert_flac_to_mp3 () { |
|
|
|
filename=${1} |
|
|
|
filename_wo_ext=$(echo ${filename} | rev | cut -d"." -f2- | rev) |
|
|
|
|
|
|
|
flac --silent --decode --stdout "${filename}" | ffmpeg -i - -map 0:a:0 -b:a 320k -v 0 -f mp3 "${filename_wo_ext}.mp3" |
|
|
|
} |
|
|
|
fi |
|
|
|
fi |
|
|
|
|
|
|
|
# Nuitka converts Python source into C |
|
|
|
if cmds_exist nuitka; then |
|
|
|
# Convert and compile all .py files in current directory to modules |
|
|
|
function nuitka_compile_all_as_modules() { |
|
|
|
for py_file in *.py; do |
|
|
|
# Ignore things like __init__.py that tend to break |
|
|
|
if echo ${py_file} | grep -qv "^__"; then |
|
|
|
nuitka --module ${py_file} --recurse-none --show-progress |
|
|
|
fi |
|
|
|
done |
|
|
|
} |
|
|
|
|
|
|
|
# Undo Nuitka module conversion and compilation |
|
|
|
function nuitka_remove_all_compiled_modules() { |
|
|
|
rm -r *.build |
|
|
|
rm *.so |
|
|
|
rm *.pyi |
|
|
|
} |
|
|
|
fi |