diff --git a/README.md b/README.md index b818360..502d0ee 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,12 @@ ex: ## Script Just run ```dotfiles/INSTALL.sh``` + +## Requirements: +- bin/sshc + cpan Term::Title + cpan Perl::Critic + cpan XML::Dumper + cpan Curses + cpan Curses::UI + diff --git a/bin/adpass.sh b/bin/adpass.sh new file mode 100755 index 0000000..6088b80 --- /dev/null +++ b/bin/adpass.sh @@ -0,0 +1,2 @@ +#!/bin/bash +smbpasswd -r winsrv2.addgene.org -U tyrel diff --git a/bin/archive_git.sh b/bin/archive_git.sh new file mode 100755 index 0000000..e752609 --- /dev/null +++ b/bin/archive_git.sh @@ -0,0 +1,7 @@ +#!/bin/bash +git checkout $1 +git tag archive/$1 $1 +git push origin --tags +git checkout - +git branch -D $1 +git push origin :$1 diff --git a/bin/git_undo_everything.sh b/bin/git_undo_everything.sh new file mode 100755 index 0000000..ef51241 --- /dev/null +++ b/bin/git_undo_everything.sh @@ -0,0 +1,5 @@ +#!/bin/bash +git tag temp$RANDOM +git reset --hard HEAD^ +git push --force +echo "There. I fixed your stupid mistake Tyrel" diff --git a/bin/json2yaml b/bin/json2yaml new file mode 100755 index 0000000..76b3016 --- /dev/null +++ b/bin/json2yaml @@ -0,0 +1,8 @@ +#!/usr/bin/env python +# convert json to yaml +# http://pyyaml.org/wiki/PyYAMLDocumentation +# python3 json2yaml.py < ~/code/manpow/moneybug/mbuploader/support/offices.json +# gist https://gist.github.com/noahcoad/46909253a5891af3699580b8f17baba8 + +import yaml, json, sys +sys.stdout.write(yaml.dump(json.load(sys.stdin))) diff --git a/bin/keybase_download_gpg_keys.sh b/bin/keybase_download_gpg_keys.sh new file mode 100755 index 0000000..9cb92ec --- /dev/null +++ b/bin/keybase_download_gpg_keys.sh @@ -0,0 +1,10 @@ +#!/bin/bash +keybase list-following | while read -r line ; do + if [ -n "$line" ]; then + curl -s https://keybase.io/$line/key.asc | gpg --with-fingerprint | sed -n 's/.*=//p' | awk 'NF>1{print $(NF-3)$(NF-2)$(NF-1)$(NF) }' | while read -r key; do + echo "Trying $line's key: $key" + gpg --recv-key $key + echo + done + fi +done diff --git a/bin/mov_to_gif.sh b/bin/mov_to_gif.sh new file mode 100755 index 0000000..073b11d --- /dev/null +++ b/bin/mov_to_gif.sh @@ -0,0 +1,14 @@ +#!/bin/bash +NAME=$1 +START=$2 +# If duration is unset, use the full length of the video +if [[ $3 ]]; then + END=$3 +else + END=$(ffprobe -loglevel error -show_streams $NAME | grep duration\= | cut -f2 -d=) +fi +echo "Making a gif of $NAME from $START seconds to $END seconds" + +ffmpeg -y -ss $START -t $END -i $NAME -vf fps=24,scale=640:-1:flags=lanczos,palettegen temp_palette.png +ffmpeg -i $NAME -i temp_palette.png -ss $START -t $END -pix_fmt rgb24 -filter_complex "fps=24,scale=640:-1:flags=lanczos[x];[x][1:v]paletteuse" $NAME.gif +rm temp_palette.png diff --git a/bin/mysql_in_ram.sh b/bin/mysql_in_ram.sh new file mode 100755 index 0000000..d248ddc --- /dev/null +++ b/bin/mysql_in_ram.sh @@ -0,0 +1,33 @@ +#!/bin/bash +set -e +set -x +set -v + +if [[ $OSTYPE == "*darwin*" ]];then + umount /Volumes/ramdisk + mysql.server stop + killall mysqld + killall mysqld + killall mysqld + killall mysqld + killall mysqld + killall mysqld + diskutil erasevolume HFS+ "ramdisk" `hdiutil attach -nomount ram://2048000` + cp -r /usr/local/var/mysql /Volumes/ramdisk + mysql.server start +else + sudo service mysql stop + + # This works on Ubuntu 14.04, but not 16.04: + # sudo mkdir -p /mnt/mysql-data-orig + # sudo mount --bind /var/lib/mysql /mnt/mysql-data-orig + # sudo mount -t tmpfs -o size=32G,uid=mysql,gid=mysql,mode=700 tmpfs /var/lib/mysql + # sudo sh -c 'cp -avi /mnt/mysql-data-orig/* /var/lib/mysql/' + + # This works on 16.04 and maybe elsewhere too + sudo mkdir -p /mnt/mysql-ram + sudo mount -t tmpfs -o size=8G,uid=mysql,gid=mysql,mode=700 tmpfs /mnt/mysql-ram + sudo mount -t aufs -o br:/mnt/mysql-ram:/var/lib/mysql=ro aufs /var/lib/mysql + + sudo service mysql start +fi diff --git a/bin/sshc b/bin/sshc new file mode 100755 index 0000000..49fcc0d --- /dev/null +++ b/bin/sshc @@ -0,0 +1,422 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use diagnostics -verbose; +use Term::Title 'set_titlebar', 'set_tab_title'; + +# perltidy --backup-and-modify-in-place -l=120 -cti=2 --opening-brace-on-new-line --opening-sub-brace-on-new-line -lp -vt=0 -vtc=0 -cab=0 sshc.pl + +BEGIN +{ + $diagnostics::DEBUG = 0; + $diagnostics::PRETTY = 1; + + if (0) + { + use Perl::Critic; + my $file = $0; + my $critic = Perl::Critic->new( -severity => '3', + -verbose => 11 ); + my @violations = $critic->critique($file); + + my ( $i, $n ) = ( 0, scalar @violations ); + for ( reverse Perl::Critic::Violation::sort_by_severity(@violations) ) + { + print '-' x 20, "\n"; + printf( "%3d/%d ", ++$i, $n ); + print "[" . $_->severity() . "] " . $_; + print " -- source --- \n"; + print " source: ", $_->source(), "\n"; + print " -- /source --- \n"; + print " expl: ", $_->explanation(), "\n"; + print " desc: ", $_->description(), "\n"; + print " dia : ", $_->diagnostics(), "\n"; + print "\n --- press Enter to continue ---\n"; + ; + } + exit; + } +} + +use XML::Dumper; +use Data::Dumper; +use autodie qw< :io >; +use English qw(-no_match_vars); +$OUTPUT_AUTOFLUSH = 1; + +use Curses; +use Curses::UI; +use Term::ANSIColor; + +my $cui = Curses::UI->new( -color_support => 1, + -clear_on_exit => 0 ); + + +my $ssh_config = &read_ssh_config; + +#-color_support,-clear_on_exit,-mouse_support +#); + +my $w = $cui->width(); +my $h = $cui->height(); + +sub exit_dialog +{ + my $return = $cui->dialog( + -message => 'Do you really want to quit?', + -title => 'Are you sure???', + -buttons => [ 'yes', 'no' ], + -border => 1, + + ); + + exit 0 if $return; + + return; +} + +my %options = ( + -title => 'profile', + -width => $w / 3, + -height => $h, + -border => 1, + -padtop => 3, + ); + +my %options_info = ( + -title => 'infos', + -width => $w, + -height => 3, + -border => 1, + ); + +my %options2 = ( + -title => 'details', + -width => $w, + -height => $options{-height}, + -border => 1, + -padleft => $w - $options{-width} * 2, + -padtop => $options{-padtop}, + ); + +my $win = $cui->add( 'window_id', 'Window', %options ); +my $win_info = $cui->add( 'window_info', 'Window', %options_info ); + +$cui->set_binding( sub { \&exit_dialog(); }, 'q' ); + +my $label = $win_info->add( + 'mylabel', 'Label', + -text => 'quit: q connect: ENTER', + -bold => 0, + )->draw(); + +#~ my $label2 = $win_info->add( +#~ 'mylabel1', 'Label', +#~ -text => 'Hello, world!\nds', +#~ -bold => 0, +#~ -x => 30 +#~ )->draw(); + +my @values = sort { lc $a cmp lc $b } ( keys %{$ssh_config} ); + +my $listbox = $win->add( + 'mylistbox', 'Listbox', + -values => \@values, + + #~ -labels => {'12designer-dev'=>'12'}, + -onselchange => sub { \&display_ssh_config($ssh_config); } + ); +$listbox->set_binding( sub { &ssh_connect( $ssh_config, $listbox ) }, KEY_ENTER ); +$listbox->{-onselchange}->(); +$listbox->focus(); + +sub ssh_connect +{ + my ( $config, $listbox ) = @_; + + my $key = $listbox->get_active_value(); + + set_tab_title($key); + $cui->leave_curses(); + + my $cmdline = "ssh $key"; + print colored ( "executing ssh : $cmdline", 'bold on_white' ), "\n"; + + my $e = system($cmdline); + + $e /= 256; + + if ( $e == 255 ) + { + + #~ print colored ("exit code = $e",'bold red'),"\n"; + print colored ( "--- error occurred - see message above --- ", 'bold red on_black' ), "\n"; + print colored ( "- press ENTER to continue ---", 'green on_white' ); + ; + } + +} + +# debugging function +sub dump +{ + use XML::Dumper; + my $dump = new XML::Dumper; + + # ===== Dump to a file + my $file = "dump.xml"; + $dump->pl2xml( $_[0], $file ); +} + +$cui->mainloop(); + +sub CURSE_setProperty +{ + my ( $obj, $property, $value ) = @_; + + if ($obj) + { + + #~ if ( exists($ob->{$property}) ) + { + $obj->{$property} = $value; + + $obj->draw(); + } + + #~ else + #~ { + #~ $cui->error(" \$obj has not such property : $property "); + #~ } + } + else + { + $cui->error('no such obj'); + } + + return; +} + +sub display_ssh_config +{ + my $config = shift; + my $key = $win->getobj('mylistbox')->get_active_value(); + + if ( $cui->getobj('w2') ) + { + $cui->delete('w2'); + } + + my $win2 = $cui->add( 'w2', 'Window', %options2 )->draw(); + my $offSet = { + x => 0, + y => 0 + }; + + # $key - of the hash with the dataset + # $offset - remember the postions of the labels + # $value_key - the config-key + # $default_value- if the config-key not exists display this instead [optional] + my $subFillLabels = sub { + my ( $key_, $_offSet, $list_already_onscreen, $value_key, $default_value ) = @_; + + $value_key = lc $value_key; + $list_already_onscreen->{$value_key} = 1; + + my ( $label_key, $label_val ) = ( 'label_k_' . $value_key, 'label_v_' . $value_key ); + my $x_offset = 20; + + my $entry = $config->{$key_}; + + if ( exists $entry->{$value_key} || $default_value ) + { + my $init_obj = sub { + my ( $_key, $options ) = @_; + + if ( !$win2->getobj($_key) ) + { + $win2->add( @{$options} )->draw(); + } + }; + + $init_obj->( + $label_key, + [ + $label_key, 'Label', + -text => $value_key, + -bold => 1, + -x => $_offSet->{x}, + -y => $_offSet->{y} + ] + ); + + my $value = exists $entry->{$value_key} ? $entry->{$value_key} : $default_value; + my @value_labels = ( ref $value eq 'ARRAY' ) ? @{$value} : ($value); + + for my $i ( 0 .. scalar @value_labels - 1 ) + { + my $_label = $label_val . '_' . $i; + $init_obj->( + $label, + [ + $_label, 'Label', + -bold => 0, + -x => $x_offset, + -y => $_offSet->{y}, + -text => $value_labels[$i] + ] + ); + + $_offSet->{y} += $win2->getobj($_label)->{-height}; + } + } + + }; + + my $list_already_onscreen = { 'host' => 1 }; + + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ( 'Hostname', $key ) ); + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ('User') ); + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ('Port') ); + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ('IdentityFile') ); + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ('Compression') ); + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ('LocalForward') ); + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ('RemoteForward') ); + + #~ $cui->leave_curses(); + + grep { + if ( !( exists $list_already_onscreen->{$_} ) ) + { + $subFillLabels->( ( $key, $offSet, $list_already_onscreen ), ($_) ); + } + + } sort keys %{ $config->{$key} }; + + #~ ; + + return; +} + +sub read_ssh_config +{ + my $user = $ENV{'USER'}; + + my %config = (); + + # temporary + my $host; + + my $process_ssh_config = sub { + my ( $fh, $config ) = @_; + while (<$fh>) + { + ( local $_ = $_ ) =~ s/\n//smx; + + if ( + m{ + ^(Host) # a comment + [\ \t] # or + ([^#]+) # empty line + }smxi + ) + { + $host = $2; + $config->{$host} = { lc "$1" => $host }; + + #print $host,"\n"; + } + else + { + if ( + m{ + ^\# # a comment + | # or + ^$ # empty line + }smx + ) + { + + # ignore + } + else + { + if ( + m{ + ([^\ \t]+) # match everything except + [\ \t] # with space and tab in between + ([^\#]+) # match everthing except beginning comment + }smx + ) + { + + # coz the keys are case-insensitive - lower them all + my ( $key, $value ) = ( lc $1, $2 ); + + if ( exists $config->{$host}->{$key} ) + { + if ( ref $config->{$host}->{$key} eq 'ARRAY' ) + { + push @{ $config->{$host}->{$key} }, $value; + } + else + { + my $old_val = $config->{$host}->{$key}; + $config->{$host}->{$key} = [ $old_val, $value ]; + } + } + else + { + $config->{$host}->{$key} = $value; + } + } + else + { + warn "regex not matched \n"; + } + } + } + + #print $_ if (/^$/); + } + }; + + my $ssh_config_file = '/Users/' . $user . '/.ssh/config'; + if ( -e $ssh_config_file ) + { + my $error_on_open = open my $fh, q{<}, $ssh_config_file; + if ( !$error_on_open ) + { + die $EXTENDED_OS_ERROR; + } + else + { + $process_ssh_config->( $fh, \%config ); + my $error_on_close = close $fh; + if ( !$error_on_close ) + { + die $EXTENDED_OS_ERROR; + } + } + } + else + { + $cui->error( + -message => 'please create a ssh config file : '.$ssh_config_file, + -title => 'config missing', + -buttons => [ 'ok' ], + -border => 1, + ); + exit 1; + } + + #~ &dump( \%config ); + #~ exit; + + #~ &ssh_get_connection_info( \%config, 'zeus.fh-brandenburg.de' ); + #~ exit; + + return \%config; +} + diff --git a/bin/upload_and_copy b/bin/upload_and_copy index ca85f27..4ed8ead 100755 --- a/bin/upload_and_copy +++ b/bin/upload_and_copy @@ -1,8 +1,9 @@ #!/bin/bash set -e -MD5=($(md5sum "$@" | cut -d ' ' -f 1)) +MD5=($(md5 -q "$@")) fname=$MD5."${1##*.}" -scp -rp "$1" tyrelsouza.com:/var/www/html/screenshots/$fname; -echo https://tyrelsouza.com/screenshots/$fname | xsel --clipboard --input +scp -rp "$1" vpsimgs:/var/www/html/screenshots/$fname; +osascript -e "display notification \"Uploaded $1 to https://tyrelsouza.com/screenshots/$fname\" with title \"Tyrel Upload\"" +echo https://tyrelsouza.com/screenshots/$fname | pbcopy rm "$1" diff --git a/bin/water_reminder b/bin/water_reminder new file mode 100755 index 0000000..97b5176 --- /dev/null +++ b/bin/water_reminder @@ -0,0 +1,4 @@ +#!/bin/bash +osascript -e "display notification \"Drink Water\" with title \"Drink Water\"" +say "drink water" + diff --git a/zshrc b/zshrc index 4ceabc6..01d1c01 100644 --- a/zshrc +++ b/zshrc @@ -83,4 +83,6 @@ function adtest () { eval $run_test; } - +function dots(){ + cd $(dirname `readlink ~/.zshrc`) +}