| @@ -6,22 +6,15 @@ LAST:=$(shell cat .last || echo 0) | |||||
| NEXT:=$(shell l=$(LAST); ((l=l+1)); echo $$l) | NEXT:=$(shell l=$(LAST); ((l=l+1)); echo $$l) | ||||
| NEXTGEN:=$(PWD)/generation/$(NEXT) | NEXTGEN:=$(PWD)/generation/$(NEXT) | ||||
| LASTGEN:=$(PWD)/generation/$(LAST) | LASTGEN:=$(PWD)/generation/$(LAST) | ||||
| TANGLERS:=readme.org emacs.org | |||||
| TANGLERS:=$(shell ls -d *.org) | |||||
| GEN:=$(LAST) | GEN:=$(LAST) | ||||
| OPTIONS:= | OPTIONS:= | ||||
| all: clean tangle-next | |||||
| tmp: | |||||
| install -dm755 $@ | |||||
| INSTALLDIRS=tmp $(NEXTGEN) $(LASTGEN) generation/$(GEN) | |||||
| $(NEXTGEN): | |||||
| install -dm755 $@ | |||||
| $(LASTGEN): | |||||
| install -dm755 $@ | |||||
| all: clean tangle-next | |||||
| generation/$(GEN): | |||||
| $(INSTALLDIRS): | |||||
| install -dm755 $@ | install -dm755 $@ | ||||
| generation: $(NEXTGEN) $(LASTGEN) tmp | generation: $(NEXTGEN) $(LASTGEN) tmp | ||||
| @@ -0,0 +1,1042 @@ | |||||
| #+TITLE: ~/bin files | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no | |||||
| ~/bin files and other shenanigans | |||||
| * ~/bin/cidr | |||||
| A stupid script I wrote ages ago to help me be lazy with cidr | |||||
| notation for stuff. Setup the wrong netmask a few times and | |||||
| you too, will wish for something similar. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/cidr :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Convert input ip/cidr|netmask|hexnetmask to useable network information. | |||||
| # | |||||
| use strict; | |||||
| use warnings; | |||||
| use Socket; | |||||
| use Sys::Hostname; | |||||
| # | |||||
| # Globalish vars | |||||
| # | |||||
| $ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; # Paranoia, know thy name! | |||||
| my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/; | |||||
| # | |||||
| # converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal | |||||
| # ip address. | |||||
| # | |||||
| sub int2ip { | |||||
| my $n=int(pop); | |||||
| return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff, | |||||
| ($n>>8)&0xff,$n&0xff)); | |||||
| }; | |||||
| # | |||||
| # Convert a host/ip/netmask/cidr/etc.... to a hash of information | |||||
| # Example: host.domain.tld/24 will get the ip and calculate the netmask info | |||||
| # equally if host.domain.tld corresponds with 1.2.3.4 the following is valid | |||||
| # 1.2.3.4/255.255.255.0 would obtain the same information. | |||||
| # | |||||
| # die()'s if anything isn't kosher. | |||||
| # | |||||
| # Ultra long function, probably needs to be looked at for condensing/splitting. | |||||
| # | |||||
| sub cidr2raw { | |||||
| my $rawinput = pop; | |||||
| my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef); | |||||
| my ($ucidr) = 0; | |||||
| my ($network, $bits, $netmask, $broadcast, $low, $high); | |||||
| if ($rawinput =~ qr/(.*)\/(.*)/){ | |||||
| $lhs = $1; $rhs = $2; | |||||
| }else{ | |||||
| die "Input: $rawinput not expected.\n"; | |||||
| }; | |||||
| # | |||||
| # Handle ip/hostname for left hand side. | |||||
| if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ | |||||
| foreach my $dotted (($1,$2,$3,$4)){ | |||||
| if (($dotted > 255) or ($dotted < 0)){ | |||||
| die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n"; | |||||
| }; | |||||
| }; | |||||
| $uip = inet_ntoa(scalar gethostbyname($lhs)); | |||||
| die "FATAL: Cannot determine hostname for $lhs$!\n" if (!defined($lhs)); | |||||
| }elsif ($lhs =~ $fqdn_regexp){ | |||||
| my $tmp = gethostbyname($lhs); | |||||
| die "FATAL: Cannot determine ip for $lhs" if (!defined($tmp)); | |||||
| $uip = inet_ntoa($tmp); | |||||
| }else{ | |||||
| die "FATAL: host value not fully qualified, or not an ip <$lhs>\n"; | |||||
| }; | |||||
| # | |||||
| # Handle the netmask/cidr for the right hand side, | |||||
| # | |||||
| # All input netmasks are converted to a cidr address for notation | |||||
| if ($rhs =~ qr/^(\d+)$/){ # /cidr | |||||
| $ucidr = $1; | |||||
| die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0)); | |||||
| }elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask | |||||
| my $trimmed = $2; | |||||
| my $insane = 0; | |||||
| foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form | |||||
| my @a = ($1, $2, $3, $4); | |||||
| my $insane = 0; | |||||
| foreach my $t (@a){ | |||||
| die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255)); | |||||
| }; | |||||
| foreach my $byte (split('', unpack("B32", pack("C4", @a)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }else{ | |||||
| die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n"; | |||||
| }; | |||||
| # | |||||
| # Network math GO! This is the meat of the function. | |||||
| my (@uip) = split(/\./, $uip); | |||||
| $network = 0; | |||||
| for ($j = 0; $j <= $#uip; $j++){ | |||||
| $network += int($uip[$j])<<((3-$j)*8); | |||||
| }; | |||||
| $bits = 0; $j = 0; | |||||
| for ($j = 31 - $ucidr; $j >= 0; $j--){ | |||||
| $bits |= 1<<$j; | |||||
| }; | |||||
| $netmask = 0xffffffff^$bits; | |||||
| $low = ($network&$netmask); | |||||
| $high = ($network&$netmask)+$bits-1; | |||||
| $broadcast = ($network&$netmask)|$bits; | |||||
| my ($guessed_hostname,undef,undef,undef,undef) = gethostbyaddr(inet_aton($uip), AF_INET); | |||||
| # | |||||
| # Throw the info back, they get a hash with zie info they may/may not need. | |||||
| # All up to the caller what they want to use. | |||||
| # | |||||
| return ("inet4" => $uip, | |||||
| "netmask" => int2ip($netmask), | |||||
| "broadcast" => int2ip($broadcast), | |||||
| "cidr" => $ucidr, | |||||
| "router" => int2ip($low+1), | |||||
| "network" => int2ip($low), | |||||
| "high" => int2ip($high), | |||||
| "hostname" => $guessed_hostname, | |||||
| ); | |||||
| }; | |||||
| #package Main; # future use | |||||
| foreach my $arg (@ARGV){ | |||||
| my %stuff = cidr2raw($arg); | |||||
| printf("%s/%s is %s/%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n", | |||||
| $stuff{"inet4"},$stuff{"cidr"}, | |||||
| $stuff{"network"},$stuff{"cidr"}, | |||||
| "Netmask",$stuff{"netmask"}, | |||||
| "Broadcast",$stuff{"broadcast"}, | |||||
| "Network",$stuff{"network"}, | |||||
| "Router",$stuff{"router"}, | |||||
| "HighUsable",$stuff{"high"}, | |||||
| ); | |||||
| }; | |||||
| #+END_SRC | |||||
| * ~/bin/dns | |||||
| Just a silly dns script that slighly mimics the old host utility | |||||
| of yore. Can also do reverse lookups. | |||||
| Example: | |||||
| $ dns google.com | |||||
| google.com is 216.58.216.206 | |||||
| google.com is also google.com | |||||
| $ dns 216.58.216.206 | |||||
| ord31s21-in-f206.1e100.net is 216.58.216.206 | |||||
| ord31s21-in-f206.1e100.net is also ord31s21-in-f206.1e100.net | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/dns :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Stupid script to help with dns information. Solaris 9/8 lack the host utility. | |||||
| # Which this (kinda) mimics, except the mx record crap | |||||
| use strict; | |||||
| use warnings; | |||||
| use Socket; | |||||
| use Sys::Hostname; | |||||
| my $input = shift || hostname(); | |||||
| my $lookup = $input; | |||||
| if ( $lookup =~ /\d+[.]\d+[.]\d+[.]\d+/smx ) { | |||||
| $lookup = ( gethostbyaddr inet_aton($lookup), AF_INET )[0]; | |||||
| die "Error: Unable to reverse lookup ip $input.\n" if ( $lookup eq q{} ); | |||||
| } | |||||
| my $ipv4 = gethostbyname $lookup; | |||||
| die "Error: $lookup doesn't have any known ip addresses\n" | |||||
| if ( !defined $ipv4 ); | |||||
| $ipv4 = inet_ntoa($ipv4); | |||||
| my ( $short_name, $aliases, $addrtype, $len, @addrs ) = gethostbyname $lookup; | |||||
| foreach my $ipv4 (@addrs) { | |||||
| $ipv4 = inet_ntoa($ipv4); | |||||
| print "$lookup is $ipv4\n"; | |||||
| } | |||||
| print "$lookup is also $short_name\n"; | |||||
| if ( defined $aliases and "$aliases" ne q{} ) { | |||||
| print "aliases are ($aliases)\n"; | |||||
| } | |||||
| exit 0; | |||||
| #+END_SRC | |||||
| * ~/bin/ts | |||||
| Stupid simple timestamp script that just takes input, and prefixes a timestamp to to output. Thats it. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ts :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Timestamp stdin and then print to stdout and flush. | |||||
| # | |||||
| # Thats about it. Might add a quick and dirty option to allow you to | |||||
| # specify the time output whatnot. But this is intended to be simple. | |||||
| use strict; | |||||
| use warnings; | |||||
| use POSIX qw(strftime); | |||||
| use IO::Handle; | |||||
| STDOUT->autoflush(1); | |||||
| while(<STDIN>){ | |||||
| my $now = time; | |||||
| my $tz = strftime(('%z', (localtime $now))); | |||||
| $tz =~ s/(\d{2})(\d{2})/$1:$2/smx; | |||||
| my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now)); | |||||
| print "$time$tz ".$_; | |||||
| }; | |||||
| #+END_SRC | |||||
| * ~/bin/diskhog | |||||
| Old script I wrote after I had to figure out where space was used and it was mostly all in a directory with a ton of small files. | |||||
| Written in anger. Not all that useful nominally. | |||||
| Defaults to /tmp if you don't specify where, also defaults to the top 10 offenders/users of space. | |||||
| Its not particuarly bright, or even good code. If you want ALL THE THINGS, pass -n -1 in and you will get a ton of output. Good luck with that. | |||||
| Example: | |||||
| $ diskhog | |||||
| 1.79m /private/tmp | |||||
| 1.38m /private/tmp/wifi-Ea5Y9F.log | |||||
| 420.57k /private/tmp/sysp.xml | |||||
| 161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=/ksfetch | |||||
| 161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68= | |||||
| 0.00k /private/tmp/com.apple.launchd.yaVsd6J1re | |||||
| 0.00k /private/tmp/cvcd | |||||
| 0.00k /private/tmp/com.apple.launchd.IPS1lPqGTD | |||||
| 0.00k /private/tmp/com.apple.launchd.voZH6WFol3 | |||||
| 0.00k /private/tmp/ct.shutdown | |||||
| $ diskhog -n 4 /tmp | |||||
| 1.79m /private/tmp | |||||
| 1.38m /private/tmp/wifi-Ea5Y9F.log | |||||
| 420.57k /private/tmp/sysp.xml | |||||
| 161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68= | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/diskhog :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Find out who is hogging disk space and where. | |||||
| # | |||||
| # Argument is the directory to start from. Only calculates size of files. | |||||
| # Adds the size of files in a directory to the size of the parent directory only. | |||||
| # | |||||
| # Defaults to top 10 directories/files. | |||||
| # | |||||
| # Override with -n num to list whatever amount of large things you desire. | |||||
| # Or if you want to abuse the parser, use -1 for all files/directories. | |||||
| # | |||||
| # Defaults to pwd for space. | |||||
| # | |||||
| use File::Find; | |||||
| use Getopt::Long; | |||||
| use Cwd; | |||||
| my $debug; | |||||
| my $statbug; | |||||
| (exists($ENV{"DEBUG"})) ? $debug++ : undef; | |||||
| my $dir = Cwd::abs_path($ARGV[-1] || Cwd::getcwd()); | |||||
| my %diskhogs = (); | |||||
| my %inodes = (); | |||||
| my ($topdev,undef,undef,undef,undef,undef,undef,undef) = lstat($dir); | |||||
| local $opt_displaynum = 10; | |||||
| GetOptions( 'n=i', => \$opt_displaynum, | |||||
| ); | |||||
| find(\&sieve, $dir); | |||||
| # | |||||
| # For outputing the size of a bunch of bytes in g/m/k depending upon the size | |||||
| # | |||||
| sub byte_print { | |||||
| my $byte_k = 1_024; | |||||
| my $byte_m = $byte_k**2; | |||||
| my $byte_g = $byte_k**3; | |||||
| my $bytes = pop; | |||||
| my $base = $bytes; | |||||
| my $suffix = "nil"; | |||||
| my $out_string = "BUG"; | |||||
| if($bytes > $byte_g){ | |||||
| $base = $bytes / $byte_g; | |||||
| $suffix = "g"; | |||||
| }elsif($bytes > $byte_m){ | |||||
| $base = $bytes / $byte_m; | |||||
| $suffix = "m"; | |||||
| }else{ | |||||
| $base = $bytes / $byte_k; | |||||
| $suffix = "k"; | |||||
| }; | |||||
| $out_string = sprintf("%.2f%s", $base, $suffix); | |||||
| return $out_string; | |||||
| }; | |||||
| # | |||||
| # Dumb function to return if an inode has already been seen. | |||||
| # So we handle hard links sane(er-ish-ly) in size calculations. | |||||
| # This has more truthiness(tm). | |||||
| # | |||||
| sub seeninode{ | |||||
| my $what = pop(); | |||||
| my $ret = 0; | |||||
| unless(exists($inodes{$what})){ | |||||
| $inodes{$what} = 0; | |||||
| print "New inode $what added to seen inodes.\n" if $debug; | |||||
| }else{ | |||||
| $inodes{$what}++; | |||||
| $ret++; | |||||
| print "Found a hardlink for $what.\n" if $debug; | |||||
| }; | |||||
| return $ret; | |||||
| }; | |||||
| sub sieve { | |||||
| my $file = $File::Find::name; | |||||
| my $filedir = $File::Find::dir; | |||||
| my @statinfo = lstat($file); | |||||
| my $dev = $statinfo[0]; | |||||
| my $inode = $statinfo[1]; | |||||
| my $size = $statinfo[7]; | |||||
| my $blocksize = 512; # field 11 is the "preferred" block size, which appears | |||||
| # to not match the actual blocksize of the filesystems | |||||
| # in use. For now every hard drive uses 512bytes/block. | |||||
| # Will revisit this when 4096byte/block hard drives arrive | |||||
| my $apparentsize = $statinfo[12] * $blocksize; | |||||
| print "$file\@$filedir \<$topdev\>\=\<$dev\>\n" if $debug; | |||||
| print "size,apparentsize,blocksize = <$statinfo[7],$apparentsize\,$blocksize\>\n" if $debug; | |||||
| # | |||||
| # Try to handle sparse files. | |||||
| # | |||||
| if ($size > $apparentsize) { | |||||
| print "Sparse file $file!\n" if $debug; | |||||
| $size = $apparentsize; | |||||
| }; | |||||
| $dev = (-l $file) ? 0xdeadbeef : $dev; | |||||
| if (($file =~ m/\/proc|\/chroot|udev\/devices/) || | |||||
| ($dev != $topdev) || seeninode($inode)){ | |||||
| print "Pruned $file.\n" if $debug; | |||||
| $File::Find::prune = 1; | |||||
| next; | |||||
| }; | |||||
| unless ($dev){ | |||||
| # Yay, we can't l(stat) files. This version of perl is broken. | |||||
| # Snag information from ls, assume it's a file. Thanks Solaris 8, you suck. | |||||
| $statbug++; | |||||
| warn "Hit empty device statbug while stat()ing file <$file>.\n"; | |||||
| my $ls = qx(ls -ld $file); | |||||
| my @raw = split(/\s+/, $ls); | |||||
| $diskhogs{"$file"} = $raw[4]; | |||||
| $diskhogs{"$filedir"} += $raw[4]; | |||||
| }elsif (-f){ | |||||
| if ($debug){ | |||||
| print "Adding $file size ", &byte_print($size), " to $filedir.\n"; | |||||
| print "Adding $file size ", &byte_print($size), "\n"; | |||||
| }; | |||||
| $diskhogs{"$file"} = $size; | |||||
| $diskhogs{"$filedir"} += $size; | |||||
| }elsif (-d){ | |||||
| print "Adding $file size ".&byte_print($size)."\n" if $debug; | |||||
| $diskhogs{"$file"} += $size; | |||||
| }; | |||||
| if ($debug) { | |||||
| print "$file from $filedir has size ".&byte_print($diskhogs{"$file"})."\n"; | |||||
| }; | |||||
| }; | |||||
| # | |||||
| # Reverse sort the keys by size. | |||||
| # | |||||
| my @sorted = sort {$diskhogs{$b} <=> $diskhogs{$a}} keys %diskhogs; | |||||
| splice @sorted, $opt_displaynum if @sorted > $opt_displaynum; | |||||
| warn "Found one or more instances of the stat() call statbug. This is normally only present on Solaris 8 with stock perl.\n" if $statbug; | |||||
| foreach (@sorted){ | |||||
| printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_; | |||||
| }; | |||||
| if ($debug){ | |||||
| print "DEBUG INFORMATION:\n"; | |||||
| foreach (keys %diskhogs){ | |||||
| printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_; | |||||
| }; | |||||
| }; | |||||
| #+END_SRC | |||||
| * ~/bin/ifinfo | |||||
| I don't remember now why I wrote this but its just a simpler view | |||||
| of interfaces on a system. | |||||
| Probably some old solaris holdover thing I can nuke. | |||||
| Example: | |||||
| $ ifinfo | |||||
| gif0@1280 127.0.0.1/8 a:b:c:d:e:f | |||||
| en1@1500 10.1.10.15/24 a:b:c:d:e:f | |||||
| bridge100@1500 192.168.64.1/24 a:b:c:d:e:f | |||||
| Comes in slightly handy, no guarantees it parses ifconfig right tho. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ifinfo :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Because ifconfig output is... overly verbose. | |||||
| # | |||||
| # Output information from ifconfig -a like so: | |||||
| # interface:mtu ipv4/cidr mac_address ipv6_addr(if applicable) | |||||
| # ipv6 is not yet in place due to a: lazy, b: can't use it yet. | |||||
| # | |||||
| use strict; | |||||
| use Socket; | |||||
| use Sys::Hostname; | |||||
| $ENV{'PATH'}='/sbin:/usr/sbin:/bin:/usr/bin'; | |||||
| my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/; | |||||
| # | |||||
| # converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal | |||||
| # ip address. | |||||
| # | |||||
| sub int2ip { | |||||
| my $n=int(pop); | |||||
| return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff, | |||||
| ($n>>8)&0xff,$n&0xff)); | |||||
| }; | |||||
| # | |||||
| # Convert a host/ip/netmask/cidr/etc.... to a hash of information | |||||
| # Example: host.domain.tld/24 will get the ip and calculate the netmask info | |||||
| # equally if host.domain.tld corresponds with 1.2.3.4 the following is valid | |||||
| # 1.2.3.4/255.255.255.0 would obtain the same information. | |||||
| # | |||||
| # die()'s if anything isn't kosher. | |||||
| # | |||||
| # Ultra long function, probably needs to be looked at for condensing/splitting. | |||||
| # | |||||
| sub cidr2raw { | |||||
| my $rawinput = pop; | |||||
| my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef); | |||||
| my ($ucidr) = 0; | |||||
| my ($network, $bits, $netmask, $broadcast, $low, $high); | |||||
| if ($rawinput =~ qr/(.*)\/(.*)/){ | |||||
| $lhs = $1; $rhs = $2; | |||||
| }else{ | |||||
| die "Input: $rawinput not expected.\n"; | |||||
| }; | |||||
| # | |||||
| # Handle ip/hostname for left hand side. | |||||
| if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ | |||||
| foreach my $dotted (($1,$2,$3,$4)){ | |||||
| if (($dotted > 255) or ($dotted < 0)){ | |||||
| die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n"; | |||||
| }; | |||||
| }; | |||||
| $uip = "$1.$2.$3.$4"; | |||||
| }; | |||||
| # | |||||
| # Handle the netmask/cidr for the right hand side, | |||||
| # | |||||
| # All input netmasks are converted to a cidr address for notation | |||||
| if ($rhs =~ qr/^(\d+)$/){ # /cidr | |||||
| $ucidr = $1; | |||||
| die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0)); | |||||
| }elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask | |||||
| my $trimmed = $2; | |||||
| my $insane = 0; | |||||
| foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form | |||||
| my @a = ($1, $2, $3, $4); | |||||
| my $insane = 0; | |||||
| foreach my $t (@a){ | |||||
| die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255)); | |||||
| }; | |||||
| foreach my $byte (split('', unpack("B32", pack("C4", @a)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }else{ | |||||
| die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n"; | |||||
| }; | |||||
| # | |||||
| # Network math GO! This is the meat of the function. | |||||
| my (@uip) = split(/\./, $uip); | |||||
| $network = 0; | |||||
| for ($j = 0; $j <= $#uip; $j++){ | |||||
| $network += int($uip[$j])<<((3-$j)*8); | |||||
| }; | |||||
| $bits = 0; $j = 0; | |||||
| for ($j = 31 - $ucidr; $j >= 0; $j--){ | |||||
| $bits |= 1<<$j; | |||||
| }; | |||||
| $netmask = 0xffffffff^$bits; | |||||
| $low = ($network&$netmask); | |||||
| $high = ($network&$netmask)+$bits-1; | |||||
| $broadcast = ($network&$netmask)|$bits; | |||||
| # | |||||
| # Throw the info back, they get a hash with zie info they may/may not need. | |||||
| # All up to the caller what they want to use. | |||||
| # | |||||
| return ("inet4" => $uip, | |||||
| "netmask" => int2ip($netmask), | |||||
| "broadcast" => int2ip($broadcast), | |||||
| "cidr" => $ucidr, | |||||
| "router" => int2ip($low+1), | |||||
| "network" => int2ip($low), | |||||
| "high" => int2ip($high), | |||||
| ); | |||||
| }; | |||||
| my @ifout; | |||||
| if ($ENV{'TESTING'} ne '') { | |||||
| while(<>){ | |||||
| chomp($_); | |||||
| last if ($_ eq ''); | |||||
| push(@ifout, $_); | |||||
| # sleep 1; | |||||
| # print STDERR $_ . "\n"; | |||||
| } | |||||
| }else{ | |||||
| open IFCONFIG, "ifconfig -a |"; | |||||
| @ifout = <IFCONFIG>; | |||||
| close IFCONFIG; | |||||
| } | |||||
| # This seems wrong but it makes parsing easier due to solaris | |||||
| # non root ifconfig not displaying the mac address. Reverse the output. | |||||
| # | |||||
| @ifout = reverse(@ifout); | |||||
| my @output = (); | |||||
| my ($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef); | |||||
| sub printiface{ | |||||
| # assume a /32 if we don't know it | |||||
| unless (defined($ifnetmask)) { | |||||
| warn "$ifname has indeterminant netmask assuming /32\n"; | |||||
| $ifnetmask = '32'; | |||||
| } | |||||
| unless (defined($ifnetmask)) { | |||||
| $ifether = 'unknown'; | |||||
| } | |||||
| unless ($ifname =~ m/lo.*/){ | |||||
| my %netinfo = cidr2raw("$ifipv4\/$ifnetmask"); | |||||
| $ifnetmask = $netinfo{"cidr"}; | |||||
| $ifether = lc($ifether); | |||||
| my $line = sprintf "%-16s %-18s %-17s\n", "$ifname\@$ifmtu", "$ifipv4\/$ifnetmask", $ifether; | |||||
| push @output, $line; | |||||
| } | |||||
| # reset vars | |||||
| ($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef); | |||||
| }; | |||||
| foreach my $line (@ifout) { | |||||
| if ($line =~ /inet\s+(\d+[.]\d+[.]\d+[.]\d+)\s+/){ | |||||
| $ifipv4 = $1; | |||||
| } | |||||
| if ($line =~ m/ether\s([:,0-9,a-f,A-F]{11,})/){ | |||||
| $ifether =$1; | |||||
| } | |||||
| if ($line =~ m/^([\w,\:\d+]+)\s+.*HWaddr\s([:,0-9,a-f,A-F]{11,})/){ | |||||
| $ifname = $1; | |||||
| $ifether = $2; | |||||
| } | |||||
| if ($line =~ m/^(.*)\:\s+.*mtu\s(\d+)/){ | |||||
| $ifname = $1; | |||||
| $ifmtu = $2; | |||||
| } | |||||
| if ($line =~ m/MTU[:](\d+)/){ | |||||
| $ifmtu = $1; | |||||
| } | |||||
| if ($line =~ m/inet\saddr\:(\d+[.]\d+[.]\d+[.]\d+)/){ | |||||
| $ifipv4 = $1; | |||||
| } | |||||
| if ($line =~ m/netmask\s+(0[xX])?([a-f,A-F,0-9]{8})/){ | |||||
| $ifnetmask = $2; | |||||
| } | |||||
| if ($line =~ m/Mask[:](\d+\.\d+\.\d+\.\d+)/){ | |||||
| $ifnetmask = $1; | |||||
| } | |||||
| if ($line =~ m/netmask\s+(\d+[.]\d+[.]\d+[.]\d+)/){ | |||||
| $ifnetmask = $1; | |||||
| } | |||||
| if ($line =~ m/netmask\s+0\s+broadcast/){ | |||||
| $ifnetmask = '0'; | |||||
| } | |||||
| print ":$ifether:$ifname:$ifmtu:$ifipv4:$ifnetmask:$ifipv6:\n" if ($ENV{'DEBUG'} ne ''); | |||||
| printiface() if ($ifname and $ifmtu and $ifipv4 ); | |||||
| }; | |||||
| if (scalar(@output) < 1){ | |||||
| warn "No interfaces? Scripts busted yo.\n"; | |||||
| }else{ | |||||
| foreach my $line (reverse(@output)){ | |||||
| print $line; | |||||
| } | |||||
| } | |||||
| #+END_SRC | |||||
| * ~/bin/iso8601 | |||||
| Mostly because I use iso8601 timestamps and its nice to use them | |||||
| generally without depending on gnu date. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/iso8601 :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| #-*-mode: Perl; coding: utf-8;-*- | |||||
| use strict; | |||||
| use warnings; | |||||
| use POSIX qw(strftime); | |||||
| my $now = time; | |||||
| my $tz = strftime(('%z', (localtime $now))); | |||||
| $tz =~ s/(\d{2})(\d{2})/$1:$2/smx; | |||||
| my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now)); | |||||
| print "$time$tz\n"; | |||||
| exit 0; | |||||
| #+END_SRC | |||||
| * ~/bin/whoson | |||||
| Basically getent passwd $username/$uid to show who is on a system. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/whoson :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Because i'm lazy and sick of typing in getent passwd $someusername/uid | |||||
| # | |||||
| my %who_cmds = ("solaris", "/bin/who -q", | |||||
| "linux", "/usr/bin/who -q", | |||||
| "darwin", "/usr/bin/who -q", | |||||
| ); | |||||
| my $who_cmd = $who_cmds{$^O}; | |||||
| local %users = (); | |||||
| foreach my $l (qx/$who_cmd/){ | |||||
| next if($l =~ m/^\#.*/); | |||||
| foreach my $user (split(/\s+/,$l)){ | |||||
| unless(exists($users{$user})){ | |||||
| $users{$user} = 0; | |||||
| }else{ | |||||
| $users{$user}++; | |||||
| }; | |||||
| }; | |||||
| }; | |||||
| foreach my $user (keys %users){ | |||||
| my $gecos = ( getpwnam($user) )[6]; | |||||
| my $count = $users{$user} + 1; | |||||
| my $output = "$user\, ".((defined($gecos)) ? "$gecos, " : '')."is logged in on $count tty".(($count>1) ? "\'s" : '')."\n"; | |||||
| print $output; | |||||
| }; | |||||
| #+END_SRC | |||||
| * ~/bin/gecos | |||||
| Silly wrapper perl script that makes it easier to get at the gecos string for a $user/$uid. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/gecos :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Dumb wrapper to get the gecos information from a uid/username. | |||||
| foreach my $input (@ARGV){ | |||||
| my $gecos = undef; | |||||
| my $uid = undef; | |||||
| my $name = undef; | |||||
| if ( $input =~ m/^\d+$/ ) { | |||||
| ( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6]; | |||||
| } else { | |||||
| ( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6]; | |||||
| } | |||||
| print "$name is '$gecos' uid '$uid'\n" if $gecos; | |||||
| } | |||||
| #+END_SRC | |||||
| * ~/bin/hatimerun | |||||
| Stupid perl script to mimic hatimerun for systems that don't have it. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/hatimerun :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # hatimerun in perl, sorta | |||||
| # | |||||
| use Getopt::Long; | |||||
| my $opt_exitcode = 99; | |||||
| my $opt_killcode = 9; | |||||
| my $opt_timeout = 60; | |||||
| GetOptions( 'e=i' => \$opt_exitcode, | |||||
| 'k=i' => \$opt_killcode, | |||||
| 't=i' => \$opt_timeout, | |||||
| 'h' => \&opt_help, | |||||
| 'help' => \&opt_help, | |||||
| ); | |||||
| sub opt_help{ | |||||
| my $message = <<__END__; | |||||
| UX: ERROR: invalid syntax | |||||
| usage: [-e return code][-k kill signal][-t seconds to wait] | |||||
| [-h][--help] | |||||
| Options | |||||
| --help, -h Prints this help text. | |||||
| -e Exit code to return on timeout. | |||||
| NOTE: 99 by default. | |||||
| -k Signal number to send via kill. | |||||
| NOTE: 9 by default. | |||||
| -t Timeout in seconds before alarming. | |||||
| NOTE: 60 by default. | |||||
| __END__ | |||||
| print $message; | |||||
| exit 1; | |||||
| }; | |||||
| my $pid; | |||||
| local $SIG{ALRM} = sub { kill $opt_killcode, $pid or die "Kill failed: $!"; | |||||
| die "Timeout!\n"}; | |||||
| eval{ | |||||
| my $x = defined($pid = fork()); | |||||
| unless ($pid){ | |||||
| print qx(@ARGV); | |||||
| die "Exec of ", join(' ', @ARGV), " failed at $!\n"; | |||||
| }; | |||||
| alarm $opt_timeout; | |||||
| waitpid $pid => 0; | |||||
| alarm 0; | |||||
| exit 0; | |||||
| }; | |||||
| if ($@){ | |||||
| die "Nothing to do!\n" unless $@ eq "Timeout!\n"; | |||||
| exit $opt_exitcode; | |||||
| }else{ | |||||
| exit 0; | |||||
| }; | |||||
| #+END_SRC | |||||
| * ~/bin/ptree.pl | |||||
| Silly perl based ptree alike implementation. Mad old code that should be avoided at all costs but it works and I'm not fixing it unless I need to. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ptree.pl :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # ptree for linux/darwin/solaris. I got sick of ps and pstree on linux. | |||||
| # ptree works on solaris fine, but doesn't exist for darwin/linux/etc... | |||||
| # | |||||
| # TODO: Allow passing a regexp instead of a pid and passing multiple pids. | |||||
| # | |||||
| local $ENV{"PATH"} = '/bin:/usr/bin:/sbin:/usr/sbin'; | |||||
| local $debug = 0; | |||||
| (exists($ENV{"DEBUG"})) ? $debug = 1 : undef; | |||||
| ($debug) ? local $| = 1 : undef; # disable buffering for STDERR and STDOUT | |||||
| sub debug_print { | |||||
| ($debug) && warn pop; | |||||
| }; | |||||
| local @cmd = ('/bin/ps'); | |||||
| local $init = 0; | |||||
| local $start = 1; | |||||
| if ($^O eq "linux"){ | |||||
| push(@cmd, 'ajxSw'); | |||||
| $start = 0; | |||||
| }elsif ($^O =~ m/darwin|freebsd/){ | |||||
| push(@cmd, 'Ajwww'); | |||||
| }elsif ($^O eq "solaris"){ | |||||
| @cmd = ('/usr/ucb/ps'); | |||||
| if ((-x "/bin/zonename") && !(qx(zonename) eq "global\n")){ | |||||
| $init = qx(pgrep zsched); | |||||
| chomp($init); | |||||
| $start = $init; | |||||
| }; | |||||
| push(@cmd, 'laxwww'); | |||||
| }else{ | |||||
| die "$^O isn't a known os to this script\n"; | |||||
| }; | |||||
| local @ps = qx(@cmd); | |||||
| ($?) ? die $cmd[0]." posix return code $?\n" : undef; | |||||
| local %proc; | |||||
| local @trail; | |||||
| (defined($ARGV[0])) ? $start = $ARGV[0] : undef; | |||||
| debug_print("Dump of raw line array data:\n"); | |||||
| foreach my $x (@ps){ | |||||
| my $cmd_index = 9; | |||||
| my $ppid = -1; | |||||
| my $pid = -1; | |||||
| next if ($x =~ m/.*PID.*/); | |||||
| my @line = split(m/\s+/,$x); | |||||
| splice(@line, 0, 1) unless ($line[0] =~ m/\d+/); | |||||
| splice(@line, 0, 1) if ("$line[0]" eq ""); | |||||
| if ($^O eq "linux"){ | |||||
| ($ppid,$pid) = @line; | |||||
| $cmd_index = 9; | |||||
| }elsif ($^O =~ m/darwin|freebsd/){ | |||||
| ($pid,$ppid) = @line; | |||||
| $cmd_index = 8; | |||||
| }elsif ($^O eq "solaris"){ | |||||
| (undef, undef, $pid,$ppid) = @line; | |||||
| for($x=$cmd_index; $x < 14; $x++){ | |||||
| $cmd_index = ($line[$x] =~ m/\d+\:\d+/) ? ($x + 1) : $cmd_index; | |||||
| }; | |||||
| }; | |||||
| my $command = join(' ', @line[$cmd_index..$#line++]); | |||||
| (!defined $proc{$pid}) ? $proc{$pid}->{"children"} = [ ] : undef; | |||||
| (!defined $proc{$ppid}) ? $proc{$ppid}->{"children"} = [ ] : undef; | |||||
| $proc{$pid}->{"pid"} = $pid; | |||||
| $proc{$pid}->{"command"} = $command; | |||||
| $proc{$pid}->{"ppid"} = $ppid; | |||||
| push(@{$proc{$ppid}->{"children"}},$pid); | |||||
| debug_print(join(',', @line[0..($#line-1)])."\n"); | |||||
| }; | |||||
| if ($debug){ | |||||
| debug_print("Done reading ps output\nDump of Hash\n"); | |||||
| foreach my $key (sort({$a <=> $b} (keys %proc))){ | |||||
| $ppid = $proc{$key}->{"ppid"}; | |||||
| $command = $proc{$key}->{"command"}; | |||||
| $children = join(',', @{$proc{$key}->{"children"}}); | |||||
| debug_print("PID<$key> PPID<$ppid> Children<$children> Command<$command>\n"); | |||||
| }; | |||||
| }; | |||||
| sub intrail{ | |||||
| my $crumb = pop; | |||||
| my $ret = 0; | |||||
| map {$ret++ if ($crumb == $_)} @trail; | |||||
| return $ret; | |||||
| }; | |||||
| sub addchildren{ | |||||
| my $start_node = pop; | |||||
| foreach my $child (@{$proc{$start_node}->{"children"}}){ | |||||
| next if (!defined($child) || ($start_node == $child)); | |||||
| debug_print("Start ($start_node) Add child $child.\n"); | |||||
| push(@trail, $child); | |||||
| addchildren($child); | |||||
| }; | |||||
| }; | |||||
| sub addparents{ | |||||
| my $start_node = pop; | |||||
| my $parent = $proc{$start_node}->{"ppid"}; | |||||
| return unless (defined($start_node)); | |||||
| return if (($parent == $start_node) || !(defined($parent))); # At the top of the tree, or in a zone | |||||
| debug_print("Start ($start_node) Add parent $parent.\n"); | |||||
| push(@trail, $parent); | |||||
| addparents($parent) if ($parent != $init); | |||||
| }; | |||||
| sub printnode{ | |||||
| my $start_node = pop; | |||||
| my $indent = pop; | |||||
| if (intrail($start_node)){ | |||||
| my $pid = $proc{$start_node}->{"pid"}; | |||||
| my $ppid = $proc{$start_node}->{"ppid"}; | |||||
| my $cmdline = $proc{$start_node}->{"command"}; | |||||
| my $indentation = ' 'x($indent); | |||||
| if ($pid == $init){ | |||||
| my $s = $^O." kernel"; | |||||
| if ($cmdline ne ''){ | |||||
| $s = $s." <$cmdline>"; | |||||
| }; | |||||
| $cmdline = $s; | |||||
| }; | |||||
| printf("%s%d %s\n", $indentation, $pid, $cmdline); | |||||
| foreach my $child (@{$proc{$start_node}->{"children"}}){ | |||||
| next if ($pid == $child); | |||||
| printnode($indent+1,$child); | |||||
| }; | |||||
| }; | |||||
| }; | |||||
| my $valid = 0; | |||||
| foreach my $j (keys %proc){ ($j == $start) ? $valid++ : undef; }; | |||||
| debug_print("Starting from <$start>, validity is<$valid>\n"); | |||||
| if ($valid){ | |||||
| if (!$start){ | |||||
| @trail = keys %proc; | |||||
| push(@trail, $start); push(@trail, 1); | |||||
| debug_print("Done with adding $start to trail.\n"); | |||||
| }else{ | |||||
| push(@trail, $start); | |||||
| debug_print("Adding children from $start.\n"); | |||||
| addchildren($start); | |||||
| debug_print("Adding parents from $start.\n"); | |||||
| addparents($start); | |||||
| }; | |||||
| @trail = sort(@trail); | |||||
| debug_print("Trail is: ".join(',', @trail)."\nStarting at pid $start\ninit pid $init\n"); | |||||
| print "PID COMMAND\n"; | |||||
| my $startindent = 0; | |||||
| (intrail($startindent)) ? $startindent = -1 : undef; | |||||
| printnode($startindent,$init); | |||||
| }else{ | |||||
| die "pid $start doesn't exist.\n"; | |||||
| }; | |||||
| exit 0; | |||||
| #+END_SRC | |||||
| * ~/bin/portchk | |||||
| Just find out if a port responds to anything tcp related or not. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/portchk :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Dumb wrapper to get the gecos information from a uid/username. | |||||
| foreach my $input (@ARGV){ | |||||
| my $gecos = undef; | |||||
| my $uid = undef; | |||||
| my $name = undef; | |||||
| if ( $input =~ m/^\d+$/ ) { | |||||
| ( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6]; | |||||
| } else { | |||||
| ( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6]; | |||||
| } | |||||
| print "$name is '$gecos' uid '$uid'\n" if $gecos; | |||||
| } | |||||
| #+END_SRC | |||||
| * ~/bin/notify | |||||
| OSX only really, just fires off a notification when its ran. | |||||
| Example: | |||||
| notify "some command" "not ok" | |||||
| First param is the message, second title of the notification. | |||||
| #+BEGIN_SRC sh :mkdirp yes :tangle (when (eq osx-p t) "tmp/bin/notify") :results replace :tangle-mode (identity #o755) | |||||
| #!/bin/sh | |||||
| message=${1:="no message"} | |||||
| title='' | |||||
| if [ "${2}" != "" ]; then | |||||
| message="${2}" | |||||
| title="${1}" | |||||
| fi | |||||
| notification="display notification \"${message}\"" | |||||
| [ "${title}" != "" ] && notification="${notification} with title \"${title}\"" | |||||
| osascript -e "${notification}" | |||||
| #+END_SRC | |||||
| * ~/bin/today | |||||
| Stupid ruby script I wrote to highlight the week/day in a calendar. | |||||
| #+BEGIN_SRC ruby :mkdirp yes :tangle tmp/bin/today :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env ruby | |||||
| cal, today, week_color, day_color, reset = %x(cal).split(%r(\n)), Time.now.day, %x(tput sgr0;tput setab 4;tput setaf 7), %x(tput sgr0; tput setab 0;tput setaf 7;tput bold), %x(tput sgr0) | |||||
| done=false | |||||
| cal.each do |line| | |||||
| if done then | |||||
| puts line | |||||
| next | |||||
| end | |||||
| if(line =~ /^(.*\s+?)#{today}(\s+?.*)$/ or | |||||
| line =~ /^(.*\s+?)#{today}$/ or | |||||
| line =~ /^()#{today}(\s+?.*)$/ or | |||||
| line =~ /^#{today}$/ ) then | |||||
| puts "#{week_color}#{$1}#{day_color}#{today}#{week_color}#{$2}#{reset}" | |||||
| done=true | |||||
| else | |||||
| puts line | |||||
| end | |||||
| end | |||||
| #+END_SRC | |||||
| @@ -22,4 +22,7 @@ for file in $(find . -type f -print); do | |||||
| fi | fi | ||||
| done | done | ||||
| if [ $rc != 0 ]; then | |||||
| echo differences between ${src} and ${dest} | |||||
| fi | |||||
| exit $rc | exit $rc | ||||
| @@ -0,0 +1,395 @@ | |||||
| #+TITLE: .profile | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no :tangle tmp/.profile | |||||
| ~/.profile setup in all its peculiarities. | |||||
| * PS1 | |||||
| #+BEGIN_SRC sh | |||||
| # -*- mode: Shell-script; -*- | |||||
| # Common .profile | |||||
| # | |||||
| # DO NOT EDIT, managed by org mode | |||||
| _uname=$(uname) | |||||
| _uname_n=$(uname -n) | |||||
| _hostname=$(hostname) | |||||
| export _uname _uname_n _hostname | |||||
| #+END_SRC | |||||
| OSX uses hostname -s for getting hostname | |||||
| #+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile") | |||||
| _host=$(hostname -s) | |||||
| #+END_SRC | |||||
| Otherwise we just use what uname -n sent. | |||||
| #+BEGIN_SRC sh | |||||
| _host=${_host:=${_uname_n}} | |||||
| #+END_SRC | |||||
| * PATH | |||||
| ** haskell | |||||
| #+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") | |||||
| PATH="${PATH}:${HOME}/.cabal/bin" | |||||
| #+END_SRC | |||||
| ** General | |||||
| #+BEGIN_SRC sh :tangle "tmp/.profile" | |||||
| PATH="${PATH}:${HOME}/bin:${HOME}/.local/bin" | |||||
| export PATH | |||||
| #+END_SRC | |||||
| * Functions | |||||
| ** General | |||||
| Generally useful functions. | |||||
| #+BEGIN_SRC sh | |||||
| # cat out a : separated env variable | |||||
| # variable is the parameter | |||||
| cat_env() | |||||
| { | |||||
| set | grep '^'"$1"'=' > /dev/null 2>&1 && eval "echo \$$1" | tr ':' ' | |||||
| ' | awk '!/^\s+$/' | awk '!/^$/' | |||||
| } | |||||
| # Convert a line delimited input to : delimited | |||||
| to_env() | |||||
| { | |||||
| awk '!a[$0]++' < /dev/stdin | tr -s ' | |||||
| ' ':' | sed -e 's/\:$//' | awk 'NF > 0' | |||||
| } | |||||
| # Unshift a new value onto the env var | |||||
| # first arg is ENV second is value to unshift | |||||
| # basically prepend value to the ENV variable | |||||
| unshift_env() | |||||
| { | |||||
| new=$(eval "echo $2; echo \$$1" | to_env) | |||||
| eval "$1=${new}; export $1" | |||||
| } | |||||
| # Opposite of above, but echos what was shifted off | |||||
| shift_env() | |||||
| { | |||||
| first=$(cat_env "$1" | head -n 1) | |||||
| rest=$(cat_env "$1" | awk '{if (NR!=1) {print}}' | to_env) | |||||
| eval "$1=$rest; export $1" | |||||
| echo "${first}" | |||||
| } | |||||
| # push $2 to $1 on the variable | |||||
| push_env() | |||||
| { | |||||
| have=$(cat_env "$1") | |||||
| new=$(printf "%s | |||||
| %s" "$have" "$2" | to_env) | |||||
| eval "$1=$new; export $1" | |||||
| } | |||||
| # Remove a line matched in $HOME/.ssh/known_hosts for when there are legit | |||||
| # host key changes. | |||||
| nukehost() | |||||
| { | |||||
| if [ -z "$1" ]; then | |||||
| echo "Usage: nukehost <hostname>" | |||||
| echo " Removes <hostname> from ssh known_host file." | |||||
| else | |||||
| sed -i -e "/$1/d" ~/.ssh/known_hosts | |||||
| fi | |||||
| } | |||||
| # Cheap copy function to make copying a file via ssh from one host | |||||
| # to another less painful, use pipeviewer to give some idea as to progress. | |||||
| ssh-copyfile() | |||||
| { | |||||
| if [ -z "$1" -o -z "$2" ]; then | |||||
| echo "Usage: copy source:/file/location destination:/file/location" | |||||
| else | |||||
| srchost="$(echo "$1" | awk -F: '{print $1}')" | |||||
| src="$(echo "$1" | awk -F: '{print $2}')" | |||||
| dsthost="$(echo "$2" | awk -F: '{print $1}')" | |||||
| dst="$(echo "$2" | awk -F: '{print $2}')" | |||||
| size=$(ssh "$srchost" du -hs "$src" 2> /dev/null) | |||||
| size=$(echo "${size}" | awk '{print $1}') | |||||
| echo "Copying $size to $dst" | |||||
| ssh "$srchost" "/bin/cat \$src" 2> /dev/null | pv -cb -N copied - | ssh "$dsthost" "/bin/cat - > \$dst" 2> /dev/null | |||||
| fi | |||||
| } | |||||
| # extract function to automate being lazy at extracting archives. | |||||
| extract() | |||||
| { | |||||
| if [ -f "$1" ]; then | |||||
| case ${1} in | |||||
| *.tar.bz2|*.tbz2|*.tbz) bunzip2 -c "$1" | tar xvf -;; | |||||
| *.tar.gz|*.tgz) gunzip -c "$1" | tar xvf -;; | |||||
| *.tz|*.tar.z) zcat "$1" | tar xvf -;; | |||||
| *.tar.xz|*.txz|*.tpxz) xz -d -c "$1" | tar xvf -;; | |||||
| *.bz2) bunzip2 "$1";; | |||||
| *.gz) gunzip "$1";; | |||||
| *.jar|*.zip) unzip "$1";; | |||||
| *.rar) unrar x "$1";; | |||||
| *.tar) tar -xvf "$1";; | |||||
| *.z) uncompress "$1";; | |||||
| *.rpm) rpm2cpio "$1" | cpio -idv;; | |||||
| *) echo "Unable to extract <$1> Unknown extension." | |||||
| esac | |||||
| else | |||||
| print "File <$1> does not exist." | |||||
| fi | |||||
| } | |||||
| # Tcsh compatibility so I can be a lazy bastard and paste things directly | |||||
| # if/when I need to. | |||||
| setenv() | |||||
| { | |||||
| export "$1=$2" | |||||
| } | |||||
| # Just to be lazy, set/unset the DEBUG env variable used in my scripts | |||||
| debug() | |||||
| { | |||||
| if [ -z "$DEBUG" ]; then | |||||
| if [ -z "$1" ]; then | |||||
| echo Setting DEBUG to "$1" | |||||
| setenv DEBUG "$1" | |||||
| else | |||||
| echo Setting DEBUG to default | |||||
| setenv DEBUG default | |||||
| fi | |||||
| else | |||||
| echo Unsetting DEBUG | |||||
| unset DEBUG | |||||
| fi | |||||
| } | |||||
| login_shell() | |||||
| { | |||||
| [ "$-" = "*i*" ] | |||||
| } | |||||
| # Yeah, sick of using the web browser for this crap | |||||
| # Use is NUM FROM TO and boom get the currency converted from goggle. | |||||
| cconv() | |||||
| { | |||||
| curl -L --silent\ | |||||
| "https://www.google.com/finance/converter?a=$1&from=$2&to=$3" \ | |||||
| | grep converter_result \ | |||||
| | perl -pe 's|[<]\w+ \w+[=]\w+[>]||g;' -e 's|[<][/]span[>]||' | |||||
| } | |||||
| #+END_SRC | |||||
| ** git | |||||
| #+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile") | |||||
| maybe_git_repo() | |||||
| { | |||||
| # assume https if input doesn't contain a protocol | |||||
| proto=https | |||||
| destination=${HOME}/src | |||||
| echo "${1}" | grep '://' > /dev/null 2>&1 | |||||
| [ $? = 0 ] && proto=$(echo "${1}" | sed -e 's|[:]\/\/.*||g') | |||||
| git_dir=$(echo "${1}" | sed -e 's|.*[:]\/\/||g') | |||||
| rrepo="${proto}://${git_dir}" | |||||
| # strip user@, :NNN, and .git from input uri's | |||||
| repo="${destination}/"$(echo "${git_dir}" | | |||||
| sed -e 's/\.git$//g' | | |||||
| sed -e 's|.*\@||g' | | |||||
| sed -e 's|\:[[:digit:]]\{1,\}\/|/|g' | | |||||
| tr -d '~') | |||||
| if [ ! -d "${repo}" ]; then | |||||
| git ls-remote "${rrepo}" > /dev/null 2>&1 | |||||
| if [ $? = 0 ]; then | |||||
| mkdir -p "${repo}" | |||||
| echo "git clone ${rrepo} ${repo}" | |||||
| git clone --recursive "${rrepo}" "${repo}" | |||||
| else | |||||
| echo "${rrepo} doesn't look to be a git repository" | |||||
| fi | |||||
| fi | |||||
| [ -d "${repo}" ] && cd "${repo}" | |||||
| } | |||||
| gh() | |||||
| { | |||||
| maybe_git_repo "https://github.com/${1}" | |||||
| } | |||||
| bb() | |||||
| { | |||||
| maybe_git_repo "https://bitbucket.org/${1}" | |||||
| } | |||||
| #+END_SRC | |||||
| ** haskell | |||||
| #+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") | |||||
| hmap() | |||||
| { | |||||
| ghc -e "interact ($*)" | |||||
| } | |||||
| hmapl() | |||||
| { | |||||
| hmap "unlines.($*).lines" | |||||
| } | |||||
| hmapw() | |||||
| { | |||||
| hmapl "map (unwords.($*).words)" | |||||
| } | |||||
| #+END_SRC | |||||
| ** nix | |||||
| #+BEGIN_SRC sh :tangle (when (eq nix-p t) "tmp/.profile") | |||||
| mk_nix_shell() | |||||
| { | |||||
| cabal2nix --sha256="0" . \ | |||||
| | perl -0777 -p -e 's/{.+}:/{ haskellPackages ? (import <nixpkgs> {}).haskellPackages }:/s' \ | |||||
| | sed -E -e 's/(cabal\.mkDerivation)/with haskellPackages; \1/' -e 'sXsha256 = "0";Xsrc = "./.";X' \ | |||||
| > shell.nix; | |||||
| } | |||||
| nix_env_setup() | |||||
| { | |||||
| # The nix installer put something like this into the .profile. | |||||
| # BAD INSTALLER NO COOKIE! | |||||
| if [ -e ${HOME}/.nix-profile/etc/profile.d/nix.sh ]; then | |||||
| . ${HOME}/.nix-profile/etc/profile.d/nix.sh; | |||||
| export NIX_PATH=${HOME}/src/github.com/NixOS/nixpkgs:nixpkgs=${HOME}/src/github.com/NixOS/nixpkgs | |||||
| export NIX_CFLAGS_COMPILE="-idirafter /usr/include" | |||||
| export NIX_CFLAGS_LINK="-L/usr/lib" | |||||
| NIX_GHC=$(type -p ghc > /dev/null 2>&1) | |||||
| if [ -n "$NIX_GHC" ]; then | |||||
| eval $(grep export "$NIX_GHC") | |||||
| fi | |||||
| fi | |||||
| nr() | |||||
| { | |||||
| nix-shell --run "$(echo $@)" | |||||
| } | |||||
| } | |||||
| nix_env_setup | |||||
| #+END_SRC | |||||
| Workaround stupid ssl crap with recent nix. | |||||
| #+BEGIN_SRC sh :tangle (when (and (eq nix-p t) (eq osx-p t)) "tmp/.profile") | |||||
| SSL_CERT_FILE="${HOME}/.nix-profile/etc/ssl/certs/ca-bundle.crt" | |||||
| GIT_SSL_CAINFO=$SSL_CERT_FILE | |||||
| export SSL_CERT_FILE | |||||
| export GIT_SSL_CAINFO | |||||
| #+END_SRC | |||||
| TODO Add linux ca-bundle detection | |||||
| if test -e /etc/ssl/certs/ca-bundle.crt ; # Fedora, NixOS | |||||
| set -xg SSL_CERT_FILE /etc/ssl/certs/ca-bundle.crt ; | |||||
| else if test -e /etc/ssl/certs/ca-certificates.crt ; # Ubuntu, Debian | |||||
| set -xg SSL_CERT_FILE /etc/ssl/certs/ca-certificates.crt | |||||
| ** tmux | |||||
| #+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile") | |||||
| t() | |||||
| { | |||||
| if [ -z "$1" ]; then | |||||
| echo "Supply a tmux session name to connect to/create" | |||||
| else | |||||
| tmux has-session -t "$1" 2>/dev/null | |||||
| [ $? != 0 ] && tmux new-session -d -s "$1" | |||||
| tmux attach-session -d -t "$1" | |||||
| fi | |||||
| } | |||||
| #+END_SRC | |||||
| ** x | |||||
| #+BEGIN_SRC sh :tangle (when (eq x-p t) "tmp/.profile") | |||||
| modmap() | |||||
| { | |||||
| [ -f "${HOME}/.Xmodmap" ] && xmodmap "${HOME}/.Xmodmap" | |||||
| } | |||||
| #+END_SRC | |||||
| * Aliases | |||||
| ** General | |||||
| #+BEGIN_SRC sh | |||||
| # general aliases | |||||
| alias s="\$(which ssh)" | |||||
| alias quit='exit' | |||||
| alias cr='reset; clear' | |||||
| alias a=ag | |||||
| alias n=noglob | |||||
| alias l=ls | |||||
| alias L='ls -dal' | |||||
| alias cleandir="find . -type f \( -name '*~' -o -name '#*#' -o -name '.*~' -o -name '.#*#' -o -name 'core' -o -name 'dead.letter*' \) | grep -v auto-save-list | xargs -t rm" | |||||
| # Prefer less for paging duties. | |||||
| which less > /dev/null 2>&1 | |||||
| if [ $? -eq 0 ]; then | |||||
| alias T="\$(which less) -f +F" | |||||
| else | |||||
| alias T="\$(which tail) -f" | |||||
| fi | |||||
| alias e=emacs | |||||
| alias de=emacs --debug-init -nw | |||||
| alias ec=emacsclient | |||||
| alias ect=emacsclient -t | |||||
| alias oec=emacsclient -n -c | |||||
| alias stope=emacsclient -t -e "(save-buffers-kill-emacs)(kill-emacs)" | |||||
| alias kille=emacsclient -e "(kill-emacs)" | |||||
| #+END_SRC | |||||
| ** osx | |||||
| #+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile") | |||||
| alias o='open -a' | |||||
| #+END_SRC | |||||
| ** git | |||||
| #+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile") | |||||
| alias g=git | |||||
| #+END_SRC | |||||
| ** haskell | |||||
| #+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") | |||||
| alias ghce="ghc -e ':l ~/.ghc.hs' -e" | |||||
| #+END_SRC | |||||
| ** mosh | |||||
| #+BEGIN_SRC sh :tangle (when (eq mosh-p t) "tmp/.profile") | |||||
| alias m=mosh | |||||
| #+END_SRC | |||||
| ** tmux | |||||
| #+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile") | |||||
| alias tl='tmux ls' | |||||
| #+END_SRC | |||||
| * cray | |||||
| Cray specific stuff. | |||||
| #+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/.profile") | |||||
| stash() | |||||
| { | |||||
| maybe_git_repo "ssh://git@stash.us.cray.com:7999/${1}.git" || \ | |||||
| maybe_git_repo "ssh://git@stash.us.cray.com:7999/~${1}.git" | |||||
| } | |||||
| haste() | |||||
| { | |||||
| set -e | |||||
| URL=http://buildservice.us.cray.com:7777/ | |||||
| if [ ! -z "$@" ]; then | |||||
| for x in "$@"; do | |||||
| if [ -f "${x}" ]; then | |||||
| curl -X POST -s -d "@${x}" ${URL}documents | awk -F '"' '{print "'$URL'"$4}'; | |||||
| else | |||||
| echo "file ${x} does not exist to upload" | |||||
| fi | |||||
| done | |||||
| else | |||||
| cat /dev/stdin | curl -X POST -s -d "@-" ${URL}documents | awk -F '"' '{print "'$URL'"$4}'; | |||||
| fi | |||||
| set +e | |||||
| } | |||||
| #+END_SRC | |||||
| @@ -9,6 +9,18 @@ | |||||
| Startup related tasks/setup that might be used later on. | Startup related tasks/setup that might be used later on. | ||||
| *** tangle functions | |||||
| Duplicated from tangle.el just to make using org easier. | |||||
| TODO: make this stuff work sanely in emacs org mode and | |||||
| via external tangling. Not tangled for now. | |||||
| #+BEGIN_SRC emacs-lisp :tangle no | |||||
| (defun tangle/yn (p) (if (bound-and-true-p p) "yes" "no")) | |||||
| (defun tangle/file (p file) (if (bound-and-true-p p) (concat "tmp/" file) "no")) | |||||
| #+END_SRC | |||||
| *** emacs package setup | *** emacs package setup | ||||
| Setup the builtin emacs package manager. | Setup the builtin emacs package manager. | ||||
| @@ -596,6 +608,9 @@ Highlight matching ()'s []'s etc... | |||||
| *** org-mode | *** org-mode | ||||
| - foo | |||||
| - bar | |||||
| Org-mode keybindings and settings, pretty sparse really. | Org-mode keybindings and settings, pretty sparse really. | ||||
| #+BEGIN_SRC emacs-lisp | #+BEGIN_SRC emacs-lisp | ||||
| @@ -606,13 +621,38 @@ Org-mode keybindings and settings, pretty sparse really. | |||||
| ("C-c c" . org-capture) | ("C-c c" . org-capture) | ||||
| ("C-c l" . org-store-link) | ("C-c l" . org-store-link) | ||||
| ("C-c p" . org-latex-export-to-pdf)) | ("C-c p" . org-latex-export-to-pdf)) | ||||
| :init (use-package org-bullets) | |||||
| :init (use-package org-bullets | |||||
| :config | |||||
| (progn | |||||
| (add-hook 'org-mode-hook (lambda () (org-bullets-mode 1))))) | |||||
| :config | :config | ||||
| (progn | (progn | ||||
| (custom-set-variables | (custom-set-variables | ||||
| '(org-log-done t) | '(org-log-done t) | ||||
| '(org-hide-leading-stars t) | '(org-hide-leading-stars t) | ||||
| '(org-hide-emphasis-markers t) | |||||
| ) | ) | ||||
| (font-lock-add-keywords 'org-mode | |||||
| '(("^ +\\([-*]\\) " | |||||
| (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))) | |||||
| (let* ((variable-tuple (cond ((x-list-fonts "Source Sans Pro") '(:font "Source Sans Pro")) | |||||
| ((x-list-fonts "Lucida Grande") '(:font "Lucida Grande")) | |||||
| ((x-list-fonts "Verdana") '(:font "Verdana")) | |||||
| ((x-family-fonts "Sans Serif") '(:family "Sans Serif")) | |||||
| (nil (warn "Cannot find a Sans Serif Font. Install Source Sans Pro.")))) | |||||
| (base-font-color (face-foreground 'default nil 'default)) | |||||
| (headline `(:inherit default :weight bold :foreground ,base-font-color))) | |||||
| (custom-theme-set-faces 'user | |||||
| `(org-level-8 ((t (,@headline ,@variable-tuple)))) | |||||
| `(org-level-7 ((t (,@headline ,@variable-tuple)))) | |||||
| `(org-level-6 ((t (,@headline ,@variable-tuple)))) | |||||
| `(org-level-5 ((t (,@headline ,@variable-tuple)))) | |||||
| `(org-level-4 ((t (,@headline ,@variable-tuple :height 1.1)))) | |||||
| `(org-level-3 ((t (,@headline ,@variable-tuple :height 1.25)))) | |||||
| `(org-level-2 ((t (,@headline ,@variable-tuple :height 1.5)))) | |||||
| `(org-level-1 ((t (,@headline ,@variable-tuple :height 1.75)))) | |||||
| `(org-document-title ((t (,@headline ,@variable-tuple :height 1.5 :underline nil)))))) | |||||
| (org-reload) | (org-reload) | ||||
| ) | ) | ||||
| ) | ) | ||||
| @@ -1,13 +1,13 @@ | |||||
| ;;-*-mode: emacs-lisp; coding: utf-8;-*- | ;;-*-mode: emacs-lisp; coding: utf-8;-*- | ||||
| ;; Copyright: 2016 Mitchell Tishmack | ;; Copyright: 2016 Mitchell Tishmack | ||||
| ;; Tangle an org mode file with babel using emacs. | ;; Tangle an org mode file with babel using emacs. | ||||
| (load-file (if (getenv "OPTIONS") | |||||
| (concat (concat "./" (getenv "OPTIONS")) ".el") | |||||
| "./options.el")) | |||||
| (require 'org-install) | (require 'org-install) | ||||
| (require 'org) | (require 'org) | ||||
| (load-file "./tangle.el") | |||||
| (load-defaults-or-options) | |||||
| ;; Iterate through all the files given and tangle them | ;; Iterate through all the files given and tangle them | ||||
| (dolist | (dolist | ||||
| (file command-line-args-left) | (file command-line-args-left) | ||||
| @@ -0,0 +1,140 @@ | |||||
| #+TITLE: Git Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :comments no | |||||
| General git configuration split out into sections mostly. | |||||
| * ~/.gitconfig | |||||
| :PROPERTIES: | |||||
| :header-args: :tangle tmp/.gitconfig :comments no :padline no :cache yes :mkdirp yes | |||||
| :END: | |||||
| ** pager | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [pager] | |||||
| color = true | |||||
| #+END_SRC | |||||
| ** color | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [color] | |||||
| status = auto | |||||
| diff = auto | |||||
| branch = auto | |||||
| [color "status"] | |||||
| added = green | |||||
| changed = blue | |||||
| untracked = red | |||||
| [color "branch"] | |||||
| current = green | |||||
| local = blue | |||||
| remote = red | |||||
| [color "diff"] | |||||
| meta = blue bold | |||||
| frag = black reverse | |||||
| old = red reverse | |||||
| new = green reverse | |||||
| #+END_SRC | |||||
| ** alias | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [alias] | |||||
| begin = !git init && git commit --allow-empty -m 'Initial empty commit' | |||||
| up = !git pull --rebase && git push | |||||
| wsdiff = diff --color-words --ignore-space-at-eol --ignore-space-change --ignore-all-space --ignore-all-space | |||||
| wdiff = diff --color-words | |||||
| ci = commit | |||||
| ciu = commit --all | |||||
| co = checkout | |||||
| ds = diff --stat | |||||
| ba = branch --all | |||||
| st = status --short --branch | |||||
| s = status --short --branch --untracked-files=no | |||||
| unstage = reset HEAD | |||||
| tlog = log --graph --color=always --abbrev-commit --date=relative --pretty=oneline | |||||
| hist = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative | |||||
| slog = log --oneline --decorate | |||||
| fixup = commit --fixup | |||||
| squash = commit --squash | |||||
| ri = rebase --interactive --autosquash | |||||
| ra = rebase --abort | |||||
| effit = reset --hard | |||||
| # What commits differ between branches, note, equivalent commits are omitted. | |||||
| # Use this with three dot operator aka master...origin/master | |||||
| cpdiff = log --no-merges --left-right --graph --cherry-pick --oneline | |||||
| # Same as ^ only equivalent commits are listed with a = sign. | |||||
| cmdiff = log --no-merges --left-right --graph --cherry-mark --oneline | |||||
| # git update with submodule update | |||||
| sup = git pull && git submodule update --init --recursive | |||||
| # git clone with submodules | |||||
| sc = !git clone --recursive $1 | |||||
| # what files are getting updated a lot | |||||
| churn = !git log --all -M -C --name-only --format='format:' "$@" | sort | grep -v '^$' | uniq -c | sort | awk 'BEGIN {print "count,file"} {print $1 "," $2}' | |||||
| # help the gc a bit and get a bit more space back for a local clone | |||||
| trim = !git reflog expire --expire=now --all && git gc --prune=now | |||||
| #+END_SRC | |||||
| ** github | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [github] | |||||
| user = mitchty | |||||
| #+END_SRC | |||||
| ** credential | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [credential] | |||||
| helper = netrc -v -f ~/.netrc.gpg -f ~/.netrc | |||||
| #+END_SRC | |||||
| ** advice | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [advice] | |||||
| statushints = false | |||||
| #+END_SRC | |||||
| ** gui | |||||
| #+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig") | |||||
| [gui] | |||||
| fontui = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 | |||||
| fontdiff = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 | |||||
| #+END_SRC | |||||
| ** http | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [http] | |||||
| postBuffer = 209715200 | |||||
| #+END_SRC | |||||
| ** push | |||||
| #+BEGIN_SRC conf :tangle (when (eq git-p t) "tmp/.gitconfig") | |||||
| [push] | |||||
| default = simple | |||||
| #+END_SRC | |||||
| ** url rewrites | |||||
| #+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig") | |||||
| [url "https://github.com/"] | |||||
| insteadOf = git://github.com/ | |||||
| #+END_SRC | |||||
| ** username/email | |||||
| #+BEGIN_SRC conf :tangle (tangle/file 'git-p ".gitconfig") | |||||
| [user] | |||||
| name = Mitch Tishmack | |||||
| email = mitch.tishmack@gmail.com | |||||
| #+END_SRC | |||||
| * ~/.gitignore | |||||
| :PROPERTIES: | |||||
| :header-args: :tangle tmp/.gitignore :comments no :padline no :cache yes :mkdirp yes | |||||
| :END: | |||||
| Common crap/build artifacts that git should always ignore. | |||||
| #+BEGIN_SRC conf :tangle no | |||||
| .*~ | |||||
| *~ | |||||
| .\#* | |||||
| \#* | |||||
| \#*\# | |||||
| .\#*\# | |||||
| .DS_Store | |||||
| *.pyc | |||||
| *.rbc | |||||
| *.elc | |||||
| *.swp | |||||
| *.[oa] | |||||
| *.hi | |||||
| #+END_SRC | |||||
| @@ -0,0 +1,32 @@ | |||||
| #+TITLE: Haskell Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no | |||||
| Haskell setup. | |||||
| * ~/.ghci | |||||
| Ghci setup, mostly just cosmetics. | |||||
| #+BEGIN_SRC haskell :tangle tmp/.ghci | |||||
| :l ~/.ghc.hs | |||||
| :set prompt "λ " | |||||
| :set +t | |||||
| #+END_SRC | |||||
| * ~/.ghc.hs | |||||
| What to automatically have loaded into ghci sessions. | |||||
| #+BEGIN_SRC haskell :tangle tmp/.ghc.hs | |||||
| import Control.Applicative | |||||
| import Control.Monad | |||||
| import Data.Monoid | |||||
| import Data.Maybe | |||||
| import Data.List | |||||
| import Data.Bool | |||||
| import qualified Data.Set as S | |||||
| import qualified Data.Map as M | |||||
| #+END_SRC | |||||
| @@ -0,0 +1,122 @@ | |||||
| #+TITLE: Misc Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no | |||||
| Stuff that didn't fit anywhere else. | |||||
| * ~/.dir_colors | |||||
| For BSD ps, make colors closer to what the GNU utilities produce by default. | |||||
| #+BEGIN_SRC conf :tangle tmp/.dir_colors :results replace | |||||
| COLOR tty | |||||
| TERM ansi | |||||
| TERM color-xterm | |||||
| TERM con132x25 | |||||
| TERM con132x30 | |||||
| TERM con132x43 | |||||
| TERM con132x60 | |||||
| TERM con80x25 | |||||
| TERM con80x28 | |||||
| TERM con80x30 | |||||
| TERM con80x43 | |||||
| TERM con80x50 | |||||
| TERM con80x60 | |||||
| TERM cons25 | |||||
| TERM console | |||||
| TERM cygwin | |||||
| TERM dtterm | |||||
| TERM eterm-color | |||||
| TERM Eterm | |||||
| TERM gnome | |||||
| TERM konsole | |||||
| TERM kterm | |||||
| TERM linux | |||||
| TERM linux-c | |||||
| TERM mach-color | |||||
| TERM putty | |||||
| TERM rxvt | |||||
| TERM rxvt-cygwin | |||||
| TERM rxvt-cygwin-native | |||||
| TERM rxvt-unicode | |||||
| TERM screen | |||||
| TERM screen-bce | |||||
| TERM screen-w | |||||
| TERM screen.linux | |||||
| TERM vt100 | |||||
| TERM xterm | |||||
| TERM xterm-256color | |||||
| TERM xterm-color | |||||
| TERM xterm-debian | |||||
| # Below are the color init strings for the basic file types. A color init | |||||
| # string consists of one or more of the following numeric codes: | |||||
| # Attribute codes: | |||||
| # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed | |||||
| # Text color codes: | |||||
| # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white | |||||
| # Background color codes: | |||||
| # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white | |||||
| NORMAL 00 # global default, although everything should be something. | |||||
| FILE 00 # normal file | |||||
| DIR 01;34 # directory | |||||
| LINK 01;36 # symbolic link. (If you set this to 'target' instead of a | |||||
| # numerical value, the color will match the file pointed to) | |||||
| FIFO 40;33 # pipe | |||||
| SOCK 01;35 # socket | |||||
| DOOR 01;35 # door | |||||
| BLK 40;33;01 # block device driver | |||||
| CHR 40;33;01 # character device driver | |||||
| ORPHAN 01;05;37;41 # orphaned syminks | |||||
| MISSING 01;05;37;41 # ... and the files they point to | |||||
| # This is for files with execute permission: | |||||
| EXEC 01;32 | |||||
| # List any file extensions like '.gz' or '.tar' that you would like ls | |||||
| # to colorize below. Put the extension, a space, and the color init string. | |||||
| # (and any comments you want to add after a '#') | |||||
| .cmd 01;32 # executables (bright green) | |||||
| .exe 01;32 | |||||
| .com 01;32 | |||||
| .btm 01;32 | |||||
| .bat 01;32 | |||||
| .sh 01;32 | |||||
| .csh 01;32 | |||||
| .ksh 01;32 | |||||
| .zsh 01;32 | |||||
| .tar 01;31 # archives / compressed (bright red) | |||||
| .tgz 01;31 | |||||
| .arj 01;31 | |||||
| .taz 01;31 | |||||
| .lzh 01;31 | |||||
| .zip 01;31 | |||||
| .z 01;31 | |||||
| .Z 01;31 | |||||
| .gz 01;31 | |||||
| .bz2 01;31 | |||||
| .bz 01;31 | |||||
| .tbz2 01;31 | |||||
| .tz 01;31 | |||||
| .deb 01;31 | |||||
| .rpm 01;31 | |||||
| .rar 01;31 # app-arch/rar | |||||
| .ace 01;31 # app-arch/unace | |||||
| .zoo 01;31 # app-arch/zoo | |||||
| .cpio 01;31 # app-arch/cpio | |||||
| .7z 01;31 # app-arch/p7zip | |||||
| .rz 01;31 # app-arch/rzip | |||||
| #+END_SRC | |||||
| * ~/.hushlogin | |||||
| Because who gives a rats when and where I last logged on from? | |||||
| #+BEGIN_SRC conf :tangle tmp/.hushlogin :results replace | |||||
| #+END_SRC | |||||
| @@ -0,0 +1,171 @@ | |||||
| #+TITLE: Nix Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :tangle tmp/.nixpkgs/config.nix :cache yes :padline no :mkdirp yes :comments no | |||||
| Nix user config.nix setup. | |||||
| #+BEGIN_SRC conf :tangle (when (eq nix-p t) "tmp/.nixpkgs/config.nix") | |||||
| { | |||||
| allowUnfree = true; | |||||
| allowBroken = true; | |||||
| packageOverrides = pkgs: rec { | |||||
| pinentry = pkgs.pinentry.override { gtk2 = null; qt4 = null; ncurses = null; }; | |||||
| gnupg = pkgs.gnupg.override { x11Support = false; pinentry = false; }; | |||||
| youtube-dl = pkgs.youtube-dl.override { pandoc = null; }; | |||||
| # This didn't work | |||||
| # haskell = pkgs.haskell // { | |||||
| # packages = pkgs.haskell.packages // { | |||||
| # ghc = pkgs.haskell.packages.ghc.override { | |||||
| # overrides = self: pkgs: { | |||||
| # idris = self.callPackage ./idris-0.10.nix {}; | |||||
| # }; | |||||
| # }; | |||||
| # }; | |||||
| # }; | |||||
| # Nor this | |||||
| # idris = pkgs.haskell.lib.overrideCabal pkgs.idris (oldAttrs: { | |||||
| # version = "0.10"; | |||||
| # sha256 = "043adsnadjxfyk8lqkv6dgq3l6qijsj5s4rpky0zy06x5k5gx4sm"; | |||||
| # }); | |||||
| default = with pkgs; buildEnv { | |||||
| name = "default"; | |||||
| paths = [ | |||||
| ansible | |||||
| ack | |||||
| aria | |||||
| iperf | |||||
| cacert | |||||
| curl | |||||
| clang | |||||
| clang-analyzer | |||||
| diffutils | |||||
| patchutils | |||||
| gitAndTools.gitFull | |||||
| gitAndTools.git-extras | |||||
| bazaarTools | |||||
| mercurial | |||||
| subversionClient | |||||
| gist | |||||
| mercurial | |||||
| docbook5 | |||||
| entr | |||||
| emacs | |||||
| gnupg1compat | |||||
| gnutar | |||||
| gnumake | |||||
| sloccount | |||||
| cloc | |||||
| less | |||||
| multitail | |||||
| rlwrap | |||||
| gdbm | |||||
| mosh | |||||
| htop | |||||
| # imagemagick also busted on osx now | |||||
| keychain | |||||
| silver-searcher | |||||
| aspell | |||||
| aspellDicts.en | |||||
| openssl | |||||
| pinentry | |||||
| pbzip2 | |||||
| pigz | |||||
| pv | |||||
| postgresql | |||||
| readline | |||||
| rsync | |||||
| sqlite | |||||
| # texLiveFull and now this things broken on osx nix, sigh | |||||
| tmux | |||||
| tree | |||||
| wget | |||||
| wakelan | |||||
| unzip | |||||
| upx | |||||
| xz | |||||
| multimarkdown | |||||
| jq | |||||
| # rtags broken again on osx, fix it | |||||
| # p7zip broken again on osx, god nix is terribad at keeping things working | |||||
| unrar | |||||
| watch | |||||
| nox | |||||
| mutt | |||||
| duply | |||||
| zsh | |||||
| pylint | |||||
| python27Packages.howdoi | |||||
| python27Packages.youtube-dl | |||||
| python27Packages.pyflakes | |||||
| python27Packages.flake8 | |||||
| python27Packages.virtualenv | |||||
| python27Packages.pip | |||||
| # xhyve compiles normally, figure out hypervisor framework issue | |||||
| lastpass-cli | |||||
| haskellPackages.alex | |||||
| haskellPackages.happy | |||||
| haskellPackages.bake | |||||
| haskellPackages.cabal-dependency-licenses | |||||
| haskellPackages.cabal-install | |||||
| haskellPackages.cabal-meta | |||||
| haskellPackages.ghc-core | |||||
| haskellPackages.ghc-mod | |||||
| haskellPackages.hasktags | |||||
| haskellPackages.hindent | |||||
| haskellPackages.hoogle | |||||
| haskellPackages.hspec | |||||
| haskellPackages.pandoc | |||||
| haskellPackages.shake | |||||
| haskellPackages.ShellCheck | |||||
| haskellPackages.stack | |||||
| haskellPackages.nats | |||||
| haskellPackages.transformers-compat | |||||
| ]; | |||||
| }; | |||||
| }; | |||||
| } | |||||
| #+END_SRC | |||||
| Because idris 0.11 fails its testsuite, got no time to figure it out right now. | |||||
| #+END_SRC conf :tangle (when (eq nix-p t) ".nixpkgs/idris-0.10.nix") | |||||
| { mkDerivation, annotated-wl-pprint, ansi-terminal, ansi-wl-pprint | |||||
| , async, base, base64-bytestring, binary, blaze-html, blaze-markup | |||||
| , bytestring, cheapskate, containers, deepseq, directory, filepath | |||||
| , fingertree, fsnotify, haskeline, mtl, network | |||||
| , optparse-applicative, parsers, pretty, process, safe, split | |||||
| , stdenv, text, time, transformers, transformers-compat, trifecta | |||||
| , uniplate, unix, unordered-containers, utf8-string, vector | |||||
| , vector-binary-instances, zip-archive, zlib | |||||
| }: | |||||
| mkDerivation { | |||||
| pname = "idris"; | |||||
| version = "0.10"; | |||||
| sha256 = "043adsnadjxfyk8lqkv6dgq3l6qijsj5s4rpky0zy06x5k5gx4sm"; | |||||
| isLibrary = true; | |||||
| isExecutable = true; | |||||
| libraryHaskellDepends = [ | |||||
| annotated-wl-pprint ansi-terminal ansi-wl-pprint async base | |||||
| base64-bytestring binary blaze-html blaze-markup bytestring | |||||
| cheapskate containers deepseq directory filepath fingertree | |||||
| fsnotify haskeline mtl network optparse-applicative parsers pretty | |||||
| process safe split text time transformers transformers-compat | |||||
| trifecta uniplate unix unordered-containers utf8-string vector | |||||
| vector-binary-instances zip-archive zlib | |||||
| ]; | |||||
| executableHaskellDepends = [ | |||||
| base directory filepath haskeline transformers | |||||
| ]; | |||||
| homepage = "http://www.idris-lang.org/"; | |||||
| description = "Functional Programming Language with Dependent Types"; | |||||
| license = stdenv.lib.licenses.bsd3; | |||||
| } | |||||
| #+END_SRC | |||||
| @@ -0,0 +1,23 @@ | |||||
| ;;-*-mode: emacs-lisp; coding: utf-8;-*- | |||||
| ;; All these variables control what/how readme.org gets tangled | |||||
| ;; into dotfiles. Off by default set to t to turn them on as | |||||
| ;; needed. | |||||
| ;; OS types | |||||
| (setq bsd-p nil) | |||||
| (setq linux-p nil) | |||||
| (setq osx-p t) | |||||
| ;; Optional things | |||||
| (setq nix-p nil) | |||||
| (setq tmux-p t) | |||||
| (setq git-p t) | |||||
| (setq emacs-p t) | |||||
| (setq vim-p nil) | |||||
| (setq zsh-p t) | |||||
| (setq mosh-p t) | |||||
| (setq x-p t) | |||||
| ;; Language specific | |||||
| (setq haskell-p t) | |||||
| (setq perl-p t) | |||||
| @@ -0,0 +1,93 @@ | |||||
| #+TITLE: Perl Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no | |||||
| Mostly old holdovers from the days of perl, just perlcritic and perltidy configuration. | |||||
| * ~/.perlcriticrc | |||||
| What to complain about by default. | |||||
| #+BEGIN_SRC conf :tangle tmp/.perlcritirc :results replace | |||||
| # Show the severity level | |||||
| severity = 1 | |||||
| # Basically show what profile is complaining | |||||
| verbose = %f:%l:%c: %m, %e (%p, severity %s)\n | |||||
| # Don't warn on these variables | |||||
| [Variables::ProhibitPunctuationVars] | |||||
| allow = $@ $! | |||||
| # Ignore syscall returns on print, it not actually returning is... whatever. | |||||
| [InputOutput::RequireCheckedSyscalls] | |||||
| exclude_functions = print say | |||||
| # Allow things like print qx(somecmd) in a void context to work, this is ok. | |||||
| [InputOutput::ProhibitBacktickOperators] | |||||
| only_in_void_context = 1 | |||||
| # I actually like using unless... so don't piss me off whinging about it | |||||
| [-ControlStructures::ProhibitUnlessBlocks] | |||||
| # The following only apply to modules | |||||
| [-Modules::RequireVersionVar] | |||||
| [-ErrorHandling::RequireCarping] | |||||
| # Tabs suck, no | |||||
| [CodeLayout::ProhibitHardTabs] | |||||
| allow_leading_tabs = 0 | |||||
| # For small regexes, no /x at the end is fine, 12 should be enough | |||||
| [RegularExpressions::RequireExtendedFormatting] | |||||
| minimum_regex_length_to_complain_about = 12 | |||||
| # These are kosher kthxbai | |||||
| [ControlStructures::ProhibitPostfixControls] | |||||
| allow = for if until unless | |||||
| # For POE, we do things like my $foo = $_[HEAP]; and thats OK | |||||
| [Subroutines::RequireArgUnpacking] | |||||
| allow_subscripts = 1 | |||||
| # For POD documentation, I don't care about required sections. | |||||
| [Documentation::RequirePodSections] | |||||
| lib_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO | |||||
| script_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO | |||||
| # This is for POD documentation mainly. | |||||
| [CodeLayout::ProhibitHardTabs] | |||||
| allow_leading_tabs = 1 | |||||
| #+END_SRC | |||||
| * ~/.perltidyrc | |||||
| Control how perltidy should clean things up. | |||||
| #+BEGIN_SRC conf :tangle tmp/.perltidyrc :results replace | |||||
| # cuddled elses pls | |||||
| -ce | |||||
| # indent 2 spaces | |||||
| -i=2 | |||||
| # for tokens with things like arrays, start the data next line down one indent in | |||||
| -lp | |||||
| # align closing tokens for things like arrays with the opening token | |||||
| -cti=1 | |||||
| # default, but spaces between multiple entries, none with one arg | |||||
| -pt=1 | |||||
| # line encoding | |||||
| -ole=unix | |||||
| # braces not on new line | |||||
| -nsbl | |||||
| # stack opening tokens, don't create a new line with one token, note no stacking of closing tokens | |||||
| -sot | |||||
| # no space before ;'s in for loops | |||||
| -nsfs | |||||
| # Make curly braces act more like the args param | |||||
| -bbt=1 | |||||
| # Trim qw whitespaces | |||||
| -tqw | |||||
| #+END_SRC | |||||
| @@ -56,7 +56,7 @@ Where N is the generation you want to copy. | |||||
| ** How does it work? | ** How does it work? | ||||
| It is really rather simple, the makefile isn't that complex. Look at that | |||||
| It is really rather simple, the [[file:Makefile][Makefile]] isn't that complex. Look at that | |||||
| for details. | for details. | ||||
| This isn't intended to cover everything. This could be considered a template | This isn't intended to cover everything. This could be considered a template | ||||
| @@ -70,7 +70,7 @@ files is the users job, not this setup. | |||||
| ** Explanation of what is happening | ** Explanation of what is happening | ||||
| The file options.el controls predicates that change how files get tangled to files. | |||||
| The file [[file:defaults.el][defaults.el]] controls predicates that change how files get tangled to files. | |||||
| This allows me to tangle files that would be useful for linux/bsd/etc... | This allows me to tangle files that would be useful for linux/bsd/etc... | ||||
| without affecting the existing files. | without affecting the existing files. | ||||
| @@ -96,7 +96,7 @@ to generate config files, not necessarily to use them. | |||||
| Should be easy enough to either clone this repo or copy things to a new repo | Should be easy enough to either clone this repo or copy things to a new repo | ||||
| and hack in what you need. Your call. | and hack in what you need. Your call. | ||||
| But, say you have a heading, take .profile which comes up next, under the | |||||
| But, say you have a heading, take .profile as an example, under an org mode | |||||
| heading you would just add: | heading you would just add: | ||||
| #+BEGIN_SRC org :tangle no | #+BEGIN_SRC org :tangle no | ||||
| @@ -122,2634 +122,38 @@ Pretty simple, just add a source block like normal: | |||||
| #+END_SRC | #+END_SRC | ||||
| ** TODO | |||||
| - [ ] Auto load-file options.el to make code blocks editable in their major | |||||
| modes. | |||||
| - [ ] Need to have some way to autocleanup old generations. Rm works for now | |||||
| so meh. | |||||
| - [ ] Need to add the ability to detect that make is generating a pointless | |||||
| new generation. Aka generation N and generation N-1 are the same, just leave | |||||
| N and don't increment. | |||||
| - [ ] Maybe checksum file contents somehow and use that? | |||||
| - [ ] More? For now its functional. | |||||
| * ~/.profile | |||||
| :PROPERTIES: | |||||
| :header-args: :tangle tmp/.profile :comments no :padline no :cache yes :mkdirp yes | |||||
| :END: | |||||
| ** PS1 | |||||
| #+BEGIN_SRC sh | |||||
| # -*- mode: Shell-script; -*- | |||||
| # Common .profile | |||||
| # | |||||
| # DO NOT EDIT, managed by org mode | |||||
| _uname=$(uname) | |||||
| _uname_n=$(uname -n) | |||||
| _hostname=$(hostname) | |||||
| export _uname _uname_n _hostname | |||||
| #+END_SRC | |||||
| OSX uses hostname -s for getting hostname | |||||
| #+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile") | |||||
| _host=$(hostname -s) | |||||
| #+END_SRC | |||||
| Otherwise we just use what uname -n sent. | |||||
| #+BEGIN_SRC sh | |||||
| _host=${_host:=${_uname_n}} | |||||
| #+END_SRC | |||||
| ** PATH | |||||
| *** osx | |||||
| OSX homebrew leftovers, need to make sure it make sense any longer as I've switched to nix. | |||||
| #+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile") | |||||
| osx_release=$(sw_vers -productVersion | sed -e 's/\.[0-9]\{1\}//2') | |||||
| brew_home=/usr/local/brew/${osx_release} | |||||
| PATH="${brew_home}/bin:/usr/local/bin:${PATH}" | |||||
| export PATH | |||||
| #+END_SRC | |||||
| *** haskell | |||||
| #+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") | |||||
| PATH="${PATH}:${HOME}/.cabal/bin" | |||||
| #+END_SRC | |||||
| *** General | |||||
| #+BEGIN_SRC sh :tangle "tmp/.profile" | |||||
| PATH="${PATH}:${HOME}/bin" | |||||
| export PATH | |||||
| #+END_SRC | |||||
| ** Functions | |||||
| *** General | |||||
| Generally useful functions. | |||||
| #+BEGIN_SRC sh | |||||
| # cat out a : separated env variable | |||||
| # variable is the parameter | |||||
| cat_env() | |||||
| { | |||||
| set | grep '^'"$1"'=' > /dev/null 2>&1 && eval "echo \$$1" | tr ':' ' | |||||
| ' | awk '!/^\s+$/' | awk '!/^$/' | |||||
| } | |||||
| # Convert a line delimited input to : delimited | |||||
| to_env() | |||||
| { | |||||
| awk '!a[$0]++' < /dev/stdin | tr -s ' | |||||
| ' ':' | sed -e 's/\:$//' | awk 'NF > 0' | |||||
| } | |||||
| # Unshift a new value onto the env var | |||||
| # first arg is ENV second is value to unshift | |||||
| # basically prepend value to the ENV variable | |||||
| unshift_env() | |||||
| { | |||||
| new=$(eval "echo $2; echo \$$1" | to_env) | |||||
| eval "$1=${new}; export $1" | |||||
| } | |||||
| # Opposite of above, but echos what was shifted off | |||||
| shift_env() | |||||
| { | |||||
| first=$(cat_env "$1" | head -n 1) | |||||
| rest=$(cat_env "$1" | awk '{if (NR!=1) {print}}' | to_env) | |||||
| eval "$1=$rest; export $1" | |||||
| echo "${first}" | |||||
| } | |||||
| # push $2 to $1 on the variable | |||||
| push_env() | |||||
| { | |||||
| have=$(cat_env "$1") | |||||
| new=$(printf "%s | |||||
| %s" "$have" "$2" | to_env) | |||||
| eval "$1=$new; export $1" | |||||
| } | |||||
| # Remove a line matched in $HOME/.ssh/known_hosts for when there are legit | |||||
| # host key changes. | |||||
| nukehost() | |||||
| { | |||||
| if [ -z "$1" ]; then | |||||
| echo "Usage: nukehost <hostname>" | |||||
| echo " Removes <hostname> from ssh known_host file." | |||||
| else | |||||
| sed -i -e "/$1/d" ~/.ssh/known_hosts | |||||
| fi | |||||
| } | |||||
| # Cheap copy function to make copying a file via ssh from one host | |||||
| # to another less painful, use pipeviewer to give some idea as to progress. | |||||
| ssh-copyfile() | |||||
| { | |||||
| if [ -z "$1" -o -z "$2" ]; then | |||||
| echo "Usage: copy source:/file/location destination:/file/location" | |||||
| else | |||||
| srchost="$(echo "$1" | awk -F: '{print $1}')" | |||||
| src="$(echo "$1" | awk -F: '{print $2}')" | |||||
| dsthost="$(echo "$2" | awk -F: '{print $1}')" | |||||
| dst="$(echo "$2" | awk -F: '{print $2}')" | |||||
| size=$(ssh "$srchost" du -hs "$src" 2> /dev/null) | |||||
| size=$(echo "${size}" | awk '{print $1}') | |||||
| echo "Copying $size to $dst" | |||||
| ssh "$srchost" "/bin/cat \$src" 2> /dev/null | pv -cb -N copied - | ssh "$dsthost" "/bin/cat - > \$dst" 2> /dev/null | |||||
| fi | |||||
| } | |||||
| # extract function to automate being lazy at extracting archives. | |||||
| extract() | |||||
| { | |||||
| if [ -f "$1" ]; then | |||||
| case ${1} in | |||||
| *.tar.bz2|*.tbz2|*.tbz) bunzip2 -c "$1" | tar xvf -;; | |||||
| *.tar.gz|*.tgz) gunzip -c "$1" | tar xvf -;; | |||||
| *.tz|*.tar.z) zcat "$1" | tar xvf -;; | |||||
| *.tar.xz|*.txz|*.tpxz) xz -d -c "$1" | tar xvf -;; | |||||
| *.bz2) bunzip2 "$1";; | |||||
| *.gz) gunzip "$1";; | |||||
| *.jar|*.zip) unzip "$1";; | |||||
| *.rar) unrar x "$1";; | |||||
| *.tar) tar -xvf "$1";; | |||||
| *.z) uncompress "$1";; | |||||
| *.rpm) rpm2cpio "$1" | cpio -idv;; | |||||
| *) echo "Unable to extract <$1> Unknown extension." | |||||
| esac | |||||
| else | |||||
| print "File <$1> does not exist." | |||||
| fi | |||||
| } | |||||
| # Tcsh compatibility so I can be a lazy bastard and paste things directly | |||||
| # if/when I need to. | |||||
| setenv() | |||||
| { | |||||
| export "$1=$2" | |||||
| } | |||||
| # Just to be lazy, set/unset the DEBUG env variable used in my scripts | |||||
| debug() | |||||
| { | |||||
| if [ -z "$DEBUG" ]; then | |||||
| if [ -z "$1" ]; then | |||||
| echo Setting DEBUG to "$1" | |||||
| setenv DEBUG "$1" | |||||
| else | |||||
| echo Setting DEBUG to default | |||||
| setenv DEBUG default | |||||
| fi | |||||
| else | |||||
| echo Unsetting DEBUG | |||||
| unset DEBUG | |||||
| fi | |||||
| } | |||||
| login_shell() | |||||
| { | |||||
| [ "$-" = "*i*" ] | |||||
| } | |||||
| # Yeah, sick of using the web browser for this crap | |||||
| # Use is NUM FROM TO and boom get the currency converted from goggle. | |||||
| cconv() | |||||
| { | |||||
| curl -L --silent\ | |||||
| "https://www.google.com/finance/converter?a=$1&from=$2&to=$3" \ | |||||
| | grep converter_result \ | |||||
| | perl -pe 's|[<]\w+ \w+[=]\w+[>]||g;' -e 's|[<][/]span[>]||' | |||||
| } | |||||
| #+END_SRC | |||||
| *** git | |||||
| #+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile") | |||||
| maybe_git_repo() | |||||
| { | |||||
| # assume https if input doesn't contain a protocol | |||||
| proto=https | |||||
| destination=${HOME}/src | |||||
| echo "${1}" | grep '://' > /dev/null 2>&1 | |||||
| [ $? = 0 ] && proto=$(echo "${1}" | sed -e 's|[:]\/\/.*||g') | |||||
| git_dir=$(echo "${1}" | sed -e 's|.*[:]\/\/||g') | |||||
| rrepo="${proto}://${git_dir}" | |||||
| # strip user@, :NNN, and .git from input uri's | |||||
| repo="${destination}/"$(echo "${git_dir}" | | |||||
| sed -e 's/\.git$//g' | | |||||
| sed -e 's|.*\@||g' | | |||||
| sed -e 's|\:[[:digit:]]\{1,\}\/|/|g' | | |||||
| tr -d '~') | |||||
| if [ ! -d "${repo}" ]; then | |||||
| git ls-remote "${rrepo}" > /dev/null 2>&1 | |||||
| if [ $? = 0 ]; then | |||||
| mkdir -p "${repo}" | |||||
| echo "git clone ${rrepo} ${repo}" | |||||
| git clone --recursive "${rrepo}" "${repo}" | |||||
| else | |||||
| echo "${rrepo} doesn't look to be a git repository" | |||||
| fi | |||||
| fi | |||||
| [ -d "${repo}" ] && cd "${repo}" | |||||
| } | |||||
| gh() | |||||
| { | |||||
| maybe_git_repo "https://github.com/${1}" | |||||
| } | |||||
| bb() | |||||
| { | |||||
| maybe_git_repo "https://bitbucket.org/${1}" | |||||
| } | |||||
| #+END_SRC | |||||
| *** haskell | |||||
| #+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") | |||||
| hmap() | |||||
| { | |||||
| ghc -e "interact ($*)" | |||||
| } | |||||
| hmapl() | |||||
| { | |||||
| hmap "unlines.($*).lines" | |||||
| } | |||||
| hmapw() | |||||
| { | |||||
| hmapl "map (unwords.($*).words)" | |||||
| } | |||||
| #+END_SRC | |||||
| *** nix | |||||
| #+BEGIN_SRC sh :tangle (when (eq nix-p t) "tmp/.profile") | |||||
| mk_nix_shell() | |||||
| { | |||||
| cabal2nix --sha256="0" . \ | |||||
| | perl -0777 -p -e 's/{.+}:/{ haskellPackages ? (import <nixpkgs> {}).haskellPackages }:/s' \ | |||||
| | sed -E -e 's/(cabal\.mkDerivation)/with haskellPackages; \1/' -e 'sXsha256 = "0";Xsrc = "./.";X' \ | |||||
| > shell.nix; | |||||
| } | |||||
| nix_env_setup() | |||||
| { | |||||
| # The nix installer put something like this into the .profile. | |||||
| # BAD INSTALLER NO COOKIE! | |||||
| if [ -e ${HOME}/.nix-profile/etc/profile.d/nix.sh ]; then | |||||
| . ${HOME}/.nix-profile/etc/profile.d/nix.sh; | |||||
| export NIX_PATH=${HOME}/src/github.com/NixOS/nixpkgs:nixpkgs=${HOME}/src/github.com/NixOS/nixpkgs | |||||
| export NIX_CFLAGS_COMPILE="-idirafter /usr/include" | |||||
| export NIX_CFLAGS_LINK="-L/usr/lib" | |||||
| NIX_GHC=$(type -p ghc > /dev/null 2>&1) | |||||
| if [ -n "$NIX_GHC" ]; then | |||||
| eval $(grep export "$NIX_GHC") | |||||
| fi | |||||
| fi | |||||
| nr() | |||||
| { | |||||
| nix-shell --run "$(echo $@)" | |||||
| } | |||||
| } | |||||
| nix_env_setup | |||||
| #+END_SRC | |||||
| Workaround stupid ssl crap with recent nix. | |||||
| #+BEGIN_SRC sh :tangle (when (and (eq nix-p t) (eq osx-p t)) "tmp/.profile") | |||||
| SSL_CERT_FILE="${HOME}/.nix-profile/etc/ssl/certs/ca-bundle.crt" | |||||
| GIT_SSL_CAINFO=$SSL_CERT_FILE | |||||
| export SSL_CERT_FILE | |||||
| export GIT_SSL_CAINFO | |||||
| #+END_SRC | |||||
| TODO Add linux ca-bundle detection | |||||
| if test -e /etc/ssl/certs/ca-bundle.crt ; # Fedora, NixOS | |||||
| set -xg SSL_CERT_FILE /etc/ssl/certs/ca-bundle.crt ; | |||||
| else if test -e /etc/ssl/certs/ca-certificates.crt ; # Ubuntu, Debian | |||||
| set -xg SSL_CERT_FILE /etc/ssl/certs/ca-certificates.crt | |||||
| *** tmux | |||||
| #+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile") | |||||
| t() | |||||
| { | |||||
| if [ -z "$1" ]; then | |||||
| echo "Supply a tmux session name to connect to/create" | |||||
| else | |||||
| tmux has-session -t "$1" 2>/dev/null | |||||
| [ $? != 0 ] && tmux new-session -d -s "$1" | |||||
| tmux attach-session -d -t "$1" | |||||
| fi | |||||
| } | |||||
| #+END_SRC | |||||
| *** x | |||||
| #+BEGIN_SRC sh :tangle (when (eq x-p t) "tmp/.profile") | |||||
| modmap() | |||||
| { | |||||
| [ -f "${HOME}/.Xmodmap" ] && xmodmap "${HOME}/.Xmodmap" | |||||
| } | |||||
| #+END_SRC | |||||
| *** cray | |||||
| #+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/.profile") | |||||
| stash() | |||||
| { | |||||
| maybe_git_repo "ssh://git@stash.us.cray.com:7999/${1}.git" || \ | |||||
| maybe_git_repo "ssh://git@stash.us.cray.com:7999/~${1}.git" | |||||
| } | |||||
| haste() | |||||
| { | |||||
| set -e | |||||
| URL=http://buildservice.us.cray.com:7777/ | |||||
| if [ ! -z "$@" ]; then | |||||
| for x in "$@"; do | |||||
| if [ -f "${x}" ]; then | |||||
| curl -X POST -s -d "@${x}" ${URL}documents | awk -F '"' '{print "'$URL'"$4}'; | |||||
| else | |||||
| echo "file ${x} does not exist to upload" | |||||
| fi | |||||
| done | |||||
| else | |||||
| cat /dev/stdin | curl -X POST -s -d "@-" ${URL}documents | awk -F '"' '{print "'$URL'"$4}'; | |||||
| fi | |||||
| set +e | |||||
| } | |||||
| #+END_SRC | |||||
| ** Aliases | |||||
| *** General | |||||
| #+BEGIN_SRC sh | |||||
| # general aliases | |||||
| alias s="\$(which ssh)" | |||||
| alias quit='exit' | |||||
| alias cr='reset; clear' | |||||
| alias a=ag | |||||
| alias n=noglob | |||||
| alias l=ls | |||||
| alias L='ls -dal' | |||||
| alias cleandir="find . -type f \( -name '*~' -o -name '#*#' -o -name '.*~' -o -name '.#*#' -o -name 'core' -o -name 'dead.letter*' \) | grep -v auto-save-list | xargs -t rm" | |||||
| # Prefer less for paging duties. | |||||
| which less > /dev/null 2>&1 | |||||
| if [ $? -eq 0 ]; then | |||||
| alias T="\$(which less) -f +F" | |||||
| else | |||||
| alias T="\$(which tail) -f" | |||||
| fi | |||||
| alias e=emacs | |||||
| alias de=emacs --debug-init -nw | |||||
| alias ec=emacsclient | |||||
| alias ect=emacsclient -t | |||||
| alias oec=emacsclient -n -c | |||||
| alias stope=emacsclient -t -e "(save-buffers-kill-emacs)(kill-emacs)" | |||||
| alias kille=emacsclient -e "(kill-emacs)" | |||||
| #+END_SRC | |||||
| *** osx | |||||
| #+BEGIN_SRC sh :tangle (when (eq osx-p t) "tmp/.profile") | |||||
| alias o='open -a' | |||||
| #+END_SRC | |||||
| *** git | |||||
| #+BEGIN_SRC sh :tangle (when (eq git-p t) "tmp/.profile") | |||||
| alias g=git | |||||
| #+END_SRC | |||||
| *** haskell | |||||
| #+BEGIN_SRC sh :tangle (when (eq haskell-p t) "tmp/.profile") | |||||
| alias ghce="ghc -e ':l ~/.ghc.hs' -e" | |||||
| #+END_SRC | |||||
| *** mosh | |||||
| #+BEGIN_SRC sh :tangle (when (eq mosh-p t) "tmp/.profile") | |||||
| alias m=mosh | |||||
| #+END_SRC | |||||
| *** tmux | |||||
| #+BEGIN_SRC sh :tangle (when (eq tmux-p t) "tmp/.profile") | |||||
| alias tl='tmux ls' | |||||
| #+END_SRC | |||||
| * ~/bin | |||||
| ** ~/bin/cidr | |||||
| A stupid script I wrote ages ago to help me be lazy with cidr | |||||
| notation for stuff. Setup the wrong netmask a few times and | |||||
| you too, will wish for something similar. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/cidr :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Convert input ip/cidr|netmask|hexnetmask to useable network information. | |||||
| # | |||||
| use strict; | |||||
| use warnings; | |||||
| use Socket; | |||||
| use Sys::Hostname; | |||||
| # | |||||
| # Globalish vars | |||||
| # | |||||
| $ENV{PATH} = '/usr/bin:/bin:/usr/sbin:/sbin'; # Paranoia, know thy name! | |||||
| my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/; | |||||
| # | |||||
| # converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal | |||||
| # ip address. | |||||
| # | |||||
| sub int2ip { | |||||
| my $n=int(pop); | |||||
| return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff, | |||||
| ($n>>8)&0xff,$n&0xff)); | |||||
| }; | |||||
| # | |||||
| # Convert a host/ip/netmask/cidr/etc.... to a hash of information | |||||
| # Example: host.domain.tld/24 will get the ip and calculate the netmask info | |||||
| # equally if host.domain.tld corresponds with 1.2.3.4 the following is valid | |||||
| # 1.2.3.4/255.255.255.0 would obtain the same information. | |||||
| # | |||||
| # die()'s if anything isn't kosher. | |||||
| # | |||||
| # Ultra long function, probably needs to be looked at for condensing/splitting. | |||||
| # | |||||
| sub cidr2raw { | |||||
| my $rawinput = pop; | |||||
| my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef); | |||||
| my ($ucidr) = 0; | |||||
| my ($network, $bits, $netmask, $broadcast, $low, $high); | |||||
| if ($rawinput =~ qr/(.*)\/(.*)/){ | |||||
| $lhs = $1; $rhs = $2; | |||||
| }else{ | |||||
| die "Input: $rawinput not expected.\n"; | |||||
| }; | |||||
| # | |||||
| # Handle ip/hostname for left hand side. | |||||
| if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ | |||||
| foreach my $dotted (($1,$2,$3,$4)){ | |||||
| if (($dotted > 255) or ($dotted < 0)){ | |||||
| die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n"; | |||||
| }; | |||||
| }; | |||||
| $uip = inet_ntoa(scalar gethostbyname($lhs)); | |||||
| die "FATAL: Cannot determine hostname for $lhs$!\n" if (!defined($lhs)); | |||||
| }elsif ($lhs =~ $fqdn_regexp){ | |||||
| my $tmp = gethostbyname($lhs); | |||||
| die "FATAL: Cannot determine ip for $lhs" if (!defined($tmp)); | |||||
| $uip = inet_ntoa($tmp); | |||||
| }else{ | |||||
| die "FATAL: host value not fully qualified, or not an ip <$lhs>\n"; | |||||
| }; | |||||
| # | |||||
| # Handle the netmask/cidr for the right hand side, | |||||
| # | |||||
| # All input netmasks are converted to a cidr address for notation | |||||
| if ($rhs =~ qr/^(\d+)$/){ # /cidr | |||||
| $ucidr = $1; | |||||
| die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0)); | |||||
| }elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask | |||||
| my $trimmed = $2; | |||||
| my $insane = 0; | |||||
| foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form | |||||
| my @a = ($1, $2, $3, $4); | |||||
| my $insane = 0; | |||||
| foreach my $t (@a){ | |||||
| die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255)); | |||||
| }; | |||||
| foreach my $byte (split('', unpack("B32", pack("C4", @a)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }else{ | |||||
| die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n"; | |||||
| }; | |||||
| # | |||||
| # Network math GO! This is the meat of the function. | |||||
| my (@uip) = split(/\./, $uip); | |||||
| $network = 0; | |||||
| for ($j = 0; $j <= $#uip; $j++){ | |||||
| $network += int($uip[$j])<<((3-$j)*8); | |||||
| }; | |||||
| $bits = 0; $j = 0; | |||||
| for ($j = 31 - $ucidr; $j >= 0; $j--){ | |||||
| $bits |= 1<<$j; | |||||
| }; | |||||
| $netmask = 0xffffffff^$bits; | |||||
| $low = ($network&$netmask); | |||||
| $high = ($network&$netmask)+$bits-1; | |||||
| $broadcast = ($network&$netmask)|$bits; | |||||
| my ($guessed_hostname,undef,undef,undef,undef) = gethostbyaddr(inet_aton($uip), AF_INET); | |||||
| # | |||||
| # Throw the info back, they get a hash with zie info they may/may not need. | |||||
| # All up to the caller what they want to use. | |||||
| # | |||||
| return ("inet4" => $uip, | |||||
| "netmask" => int2ip($netmask), | |||||
| "broadcast" => int2ip($broadcast), | |||||
| "cidr" => $ucidr, | |||||
| "router" => int2ip($low+1), | |||||
| "network" => int2ip($low), | |||||
| "high" => int2ip($high), | |||||
| "hostname" => $guessed_hostname, | |||||
| ); | |||||
| }; | |||||
| #package Main; # future use | |||||
| foreach my $arg (@ARGV){ | |||||
| my %stuff = cidr2raw($arg); | |||||
| printf("%s/%s is %s/%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n%-12s\t%s\n", | |||||
| $stuff{"inet4"},$stuff{"cidr"}, | |||||
| $stuff{"network"},$stuff{"cidr"}, | |||||
| "Netmask",$stuff{"netmask"}, | |||||
| "Broadcast",$stuff{"broadcast"}, | |||||
| "Network",$stuff{"network"}, | |||||
| "Router",$stuff{"router"}, | |||||
| "HighUsable",$stuff{"high"}, | |||||
| ); | |||||
| }; | |||||
| #+END_SRC | |||||
| ** ~/bin/dns | |||||
| Just a silly dns script that slighly mimics the old host utility | |||||
| of yore. Can also do reverse lookups. | |||||
| Example: | |||||
| $ dns google.com | |||||
| google.com is 216.58.216.206 | |||||
| google.com is also google.com | |||||
| $ dns 216.58.216.206 | |||||
| ord31s21-in-f206.1e100.net is 216.58.216.206 | |||||
| ord31s21-in-f206.1e100.net is also ord31s21-in-f206.1e100.net | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/dns :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Stupid script to help with dns information. Solaris 9/8 lack the host utility. | |||||
| # Which this (kinda) mimics, except the mx record crap | |||||
| use strict; | |||||
| use warnings; | |||||
| use Socket; | |||||
| use Sys::Hostname; | |||||
| my $input = shift || hostname(); | |||||
| my $lookup = $input; | |||||
| if ( $lookup =~ /\d+[.]\d+[.]\d+[.]\d+/smx ) { | |||||
| $lookup = ( gethostbyaddr inet_aton($lookup), AF_INET )[0]; | |||||
| die "Error: Unable to reverse lookup ip $input.\n" if ( $lookup eq q{} ); | |||||
| } | |||||
| my $ipv4 = gethostbyname $lookup; | |||||
| die "Error: $lookup doesn't have any known ip addresses\n" | |||||
| if ( !defined $ipv4 ); | |||||
| $ipv4 = inet_ntoa($ipv4); | |||||
| my ( $short_name, $aliases, $addrtype, $len, @addrs ) = gethostbyname $lookup; | |||||
| foreach my $ipv4 (@addrs) { | |||||
| $ipv4 = inet_ntoa($ipv4); | |||||
| print "$lookup is $ipv4\n"; | |||||
| } | |||||
| print "$lookup is also $short_name\n"; | |||||
| if ( defined $aliases and "$aliases" ne q{} ) { | |||||
| print "aliases are ($aliases)\n"; | |||||
| } | |||||
| exit 0; | |||||
| #+END_SRC | |||||
| ** ~/bin/ts | |||||
| Stupid simple timestamp script that just takes input, and prefixes a timestamp to to output. Thats it. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ts :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Timestamp stdin and then print to stdout and flush. | |||||
| # | |||||
| # Thats about it. Might add a quick and dirty option to allow you to | |||||
| # specify the time output whatnot. But this is intended to be simple. | |||||
| use strict; | |||||
| use warnings; | |||||
| use POSIX qw(strftime); | |||||
| use IO::Handle; | |||||
| STDOUT->autoflush(1); | |||||
| while(<STDIN>){ | |||||
| my $now = time; | |||||
| my $tz = strftime(('%z', (localtime $now))); | |||||
| $tz =~ s/(\d{2})(\d{2})/$1:$2/smx; | |||||
| my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now)); | |||||
| print "$time$tz ".$_; | |||||
| }; | |||||
| #+END_SRC | |||||
| ** ~/bin/diskhog | |||||
| Old script I wrote after I had to figure out where space was used and it was mostly all in a directory with a ton of small files. | |||||
| Written in anger. Not all that useful nominally. | |||||
| Defaults to /tmp if you don't specify where, also defaults to the top 10 offenders/users of space. | |||||
| Its not particuarly bright, or even good code. If you want ALL THE THINGS, pass -n -1 in and you will get a ton of output. Good luck with that. | |||||
| Example: | |||||
| $ diskhog | |||||
| 1.79m /private/tmp | |||||
| 1.38m /private/tmp/wifi-Ea5Y9F.log | |||||
| 420.57k /private/tmp/sysp.xml | |||||
| 161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68=/ksfetch | |||||
| 161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68= | |||||
| 0.00k /private/tmp/com.apple.launchd.yaVsd6J1re | |||||
| 0.00k /private/tmp/cvcd | |||||
| 0.00k /private/tmp/com.apple.launchd.IPS1lPqGTD | |||||
| 0.00k /private/tmp/com.apple.launchd.voZH6WFol3 | |||||
| 0.00k /private/tmp/ct.shutdown | |||||
| $ diskhog -n 4 /tmp | |||||
| 1.79m /private/tmp | |||||
| 1.38m /private/tmp/wifi-Ea5Y9F.log | |||||
| 420.57k /private/tmp/sysp.xml | |||||
| 161.17k /private/tmp/KSOutOfProcessFetcher.12572.ppfIhqX0vjaTSb8AJYobDV7Cu68= | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/diskhog :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Find out who is hogging disk space and where. | |||||
| # | |||||
| # Argument is the directory to start from. Only calculates size of files. | |||||
| # Adds the size of files in a directory to the size of the parent directory only. | |||||
| # | |||||
| # Defaults to top 10 directories/files. | |||||
| # | |||||
| # Override with -n num to list whatever amount of large things you desire. | |||||
| # Or if you want to abuse the parser, use -1 for all files/directories. | |||||
| # | |||||
| # Defaults to pwd for space. | |||||
| # | |||||
| use File::Find; | |||||
| use Getopt::Long; | |||||
| use Cwd; | |||||
| my $debug; | |||||
| my $statbug; | |||||
| (exists($ENV{"DEBUG"})) ? $debug++ : undef; | |||||
| my $dir = Cwd::abs_path($ARGV[-1] || Cwd::getcwd()); | |||||
| my %diskhogs = (); | |||||
| my %inodes = (); | |||||
| my ($topdev,undef,undef,undef,undef,undef,undef,undef) = lstat($dir); | |||||
| local $opt_displaynum = 10; | |||||
| GetOptions( 'n=i', => \$opt_displaynum, | |||||
| ); | |||||
| find(\&sieve, $dir); | |||||
| # | |||||
| # For outputing the size of a bunch of bytes in g/m/k depending upon the size | |||||
| # | |||||
| sub byte_print { | |||||
| my $byte_k = 1_024; | |||||
| my $byte_m = $byte_k**2; | |||||
| my $byte_g = $byte_k**3; | |||||
| my $bytes = pop; | |||||
| my $base = $bytes; | |||||
| my $suffix = "nil"; | |||||
| my $out_string = "BUG"; | |||||
| if($bytes > $byte_g){ | |||||
| $base = $bytes / $byte_g; | |||||
| $suffix = "g"; | |||||
| }elsif($bytes > $byte_m){ | |||||
| $base = $bytes / $byte_m; | |||||
| $suffix = "m"; | |||||
| }else{ | |||||
| $base = $bytes / $byte_k; | |||||
| $suffix = "k"; | |||||
| }; | |||||
| $out_string = sprintf("%.2f%s", $base, $suffix); | |||||
| return $out_string; | |||||
| }; | |||||
| # | |||||
| # Dumb function to return if an inode has already been seen. | |||||
| # So we handle hard links sane(er-ish-ly) in size calculations. | |||||
| # This has more truthiness(tm). | |||||
| # | |||||
| sub seeninode{ | |||||
| my $what = pop(); | |||||
| my $ret = 0; | |||||
| unless(exists($inodes{$what})){ | |||||
| $inodes{$what} = 0; | |||||
| print "New inode $what added to seen inodes.\n" if $debug; | |||||
| }else{ | |||||
| $inodes{$what}++; | |||||
| $ret++; | |||||
| print "Found a hardlink for $what.\n" if $debug; | |||||
| }; | |||||
| return $ret; | |||||
| }; | |||||
| sub sieve { | |||||
| my $file = $File::Find::name; | |||||
| my $filedir = $File::Find::dir; | |||||
| my @statinfo = lstat($file); | |||||
| my $dev = $statinfo[0]; | |||||
| my $inode = $statinfo[1]; | |||||
| my $size = $statinfo[7]; | |||||
| my $blocksize = 512; # field 11 is the "preferred" block size, which appears | |||||
| # to not match the actual blocksize of the filesystems | |||||
| # in use. For now every hard drive uses 512bytes/block. | |||||
| # Will revisit this when 4096byte/block hard drives arrive | |||||
| my $apparentsize = $statinfo[12] * $blocksize; | |||||
| print "$file\@$filedir \<$topdev\>\=\<$dev\>\n" if $debug; | |||||
| print "size,apparentsize,blocksize = <$statinfo[7],$apparentsize\,$blocksize\>\n" if $debug; | |||||
| # | |||||
| # Try to handle sparse files. | |||||
| # | |||||
| if ($size > $apparentsize) { | |||||
| print "Sparse file $file!\n" if $debug; | |||||
| $size = $apparentsize; | |||||
| }; | |||||
| $dev = (-l $file) ? 0xdeadbeef : $dev; | |||||
| if (($file =~ m/\/proc|\/chroot|udev\/devices/) || | |||||
| ($dev != $topdev) || seeninode($inode)){ | |||||
| print "Pruned $file.\n" if $debug; | |||||
| $File::Find::prune = 1; | |||||
| next; | |||||
| }; | |||||
| unless ($dev){ | |||||
| # Yay, we can't l(stat) files. This version of perl is broken. | |||||
| # Snag information from ls, assume it's a file. Thanks Solaris 8, you suck. | |||||
| $statbug++; | |||||
| warn "Hit empty device statbug while stat()ing file <$file>.\n"; | |||||
| my $ls = qx(ls -ld $file); | |||||
| my @raw = split(/\s+/, $ls); | |||||
| $diskhogs{"$file"} = $raw[4]; | |||||
| $diskhogs{"$filedir"} += $raw[4]; | |||||
| }elsif (-f){ | |||||
| if ($debug){ | |||||
| print "Adding $file size ", &byte_print($size), " to $filedir.\n"; | |||||
| print "Adding $file size ", &byte_print($size), "\n"; | |||||
| }; | |||||
| $diskhogs{"$file"} = $size; | |||||
| $diskhogs{"$filedir"} += $size; | |||||
| }elsif (-d){ | |||||
| print "Adding $file size ".&byte_print($size)."\n" if $debug; | |||||
| $diskhogs{"$file"} += $size; | |||||
| }; | |||||
| if ($debug) { | |||||
| print "$file from $filedir has size ".&byte_print($diskhogs{"$file"})."\n"; | |||||
| }; | |||||
| }; | |||||
| # | |||||
| # Reverse sort the keys by size. | |||||
| # | |||||
| my @sorted = sort {$diskhogs{$b} <=> $diskhogs{$a}} keys %diskhogs; | |||||
| splice @sorted, $opt_displaynum if @sorted > $opt_displaynum; | |||||
| warn "Found one or more instances of the stat() call statbug. This is normally only present on Solaris 8 with stock perl.\n" if $statbug; | |||||
| foreach (@sorted){ | |||||
| printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_; | |||||
| }; | |||||
| if ($debug){ | |||||
| print "DEBUG INFORMATION:\n"; | |||||
| foreach (keys %diskhogs){ | |||||
| printf "%-9s%s\n", &byte_print($diskhogs{$_}), $_; | |||||
| }; | |||||
| }; | |||||
| #+END_SRC | |||||
| ** ~/bin/ifinfo | |||||
| I don't remember now why I wrote this but its just a simpler view | |||||
| of interfaces on a system. | |||||
| Probably some old solaris holdover thing I can nuke. | |||||
| Example: | |||||
| $ ifinfo | |||||
| gif0@1280 127.0.0.1/8 a:b:c:d:e:f | |||||
| en1@1500 10.1.10.15/24 a:b:c:d:e:f | |||||
| bridge100@1500 192.168.64.1/24 a:b:c:d:e:f | |||||
| Comes in slightly handy, no guarantees it parses ifconfig right tho. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ifinfo :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Because ifconfig output is... overly verbose. | |||||
| # | |||||
| # Output information from ifconfig -a like so: | |||||
| # interface:mtu ipv4/cidr mac_address ipv6_addr(if applicable) | |||||
| # ipv6 is not yet in place due to a: lazy, b: can't use it yet. | |||||
| # | |||||
| use strict; | |||||
| use Socket; | |||||
| use Sys::Hostname; | |||||
| $ENV{'PATH'}='/sbin:/usr/sbin:/bin:/usr/bin'; | |||||
| my ($fqdn_regexp) = qr/([0-9,a-z,A-Z,\-,\_]+)\.([0-9,a-z,A-Z,\-,\_]+)\.(com|gov)/; | |||||
| # | |||||
| # converts a 1-word (4 byte) signed or unsigned integer into a dotted decimal | |||||
| # ip address. | |||||
| # | |||||
| sub int2ip { | |||||
| my $n=int(pop); | |||||
| return(sprintf("%d.%d.%d.%d", ($n>>24)&0xff,($n>>16)&0xff, | |||||
| ($n>>8)&0xff,$n&0xff)); | |||||
| }; | |||||
| # | |||||
| # Convert a host/ip/netmask/cidr/etc.... to a hash of information | |||||
| # Example: host.domain.tld/24 will get the ip and calculate the netmask info | |||||
| # equally if host.domain.tld corresponds with 1.2.3.4 the following is valid | |||||
| # 1.2.3.4/255.255.255.0 would obtain the same information. | |||||
| # | |||||
| # die()'s if anything isn't kosher. | |||||
| # | |||||
| # Ultra long function, probably needs to be looked at for condensing/splitting. | |||||
| # | |||||
| sub cidr2raw { | |||||
| my $rawinput = pop; | |||||
| my ($lhs, $rhs, $j, $uip) = (undef, undef, undef, undef); | |||||
| my ($ucidr) = 0; | |||||
| my ($network, $bits, $netmask, $broadcast, $low, $high); | |||||
| if ($rawinput =~ qr/(.*)\/(.*)/){ | |||||
| $lhs = $1; $rhs = $2; | |||||
| }else{ | |||||
| die "Input: $rawinput not expected.\n"; | |||||
| }; | |||||
| # | |||||
| # Handle ip/hostname for left hand side. | |||||
| if ($lhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ | |||||
| foreach my $dotted (($1,$2,$3,$4)){ | |||||
| if (($dotted > 255) or ($dotted < 0)){ | |||||
| die "FATAL: ipv4 address entered, $lhs entered is impossible, $dotted is not between 0-255.\n"; | |||||
| }; | |||||
| }; | |||||
| $uip = "$1.$2.$3.$4"; | |||||
| }; | |||||
| # | |||||
| # Handle the netmask/cidr for the right hand side, | |||||
| # | |||||
| # All input netmasks are converted to a cidr address for notation | |||||
| if ($rhs =~ qr/^(\d+)$/){ # /cidr | |||||
| $ucidr = $1; | |||||
| die "FATAL: Invalid CIDR <$ucidr>.$!\n" if (($ucidr > 32) or ($ucidr < 0)); | |||||
| }elsif ($rhs =~ qr/(0[xX])?([0-9,a-f,A-F]{7})/){ # /0xhexnetmask | |||||
| my $trimmed = $2; | |||||
| my $insane = 0; | |||||
| foreach my $byte (split('', unpack("B32", pack("H*", $trimmed)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid hex netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }elsif ($rhs =~ qr/(\d+)\.(\d+)\.(\d+)\.(\d+)/){ # /255.255.255.0 form | |||||
| my @a = ($1, $2, $3, $4); | |||||
| my $insane = 0; | |||||
| foreach my $t (@a){ | |||||
| die "FATAL: Netmask out of range. Input <$rhs> Invalid <$t>$!\n" if (($t < 0) or ($t > 255)); | |||||
| }; | |||||
| foreach my $byte (split('', unpack("B32", pack("C4", @a)))){ | |||||
| ($byte) ? $ucidr++ : $insane++; | |||||
| die "FATAL: $rhs is not a valid netmask.$!\n" if ($insane and $byte); | |||||
| }; | |||||
| }else{ | |||||
| die "FATAL: Unknown or invalid netmask value entered. <$rhs>\n"; | |||||
| }; | |||||
| # | |||||
| # Network math GO! This is the meat of the function. | |||||
| my (@uip) = split(/\./, $uip); | |||||
| $network = 0; | |||||
| for ($j = 0; $j <= $#uip; $j++){ | |||||
| $network += int($uip[$j])<<((3-$j)*8); | |||||
| }; | |||||
| $bits = 0; $j = 0; | |||||
| for ($j = 31 - $ucidr; $j >= 0; $j--){ | |||||
| $bits |= 1<<$j; | |||||
| }; | |||||
| $netmask = 0xffffffff^$bits; | |||||
| $low = ($network&$netmask); | |||||
| $high = ($network&$netmask)+$bits-1; | |||||
| $broadcast = ($network&$netmask)|$bits; | |||||
| # | |||||
| # Throw the info back, they get a hash with zie info they may/may not need. | |||||
| # All up to the caller what they want to use. | |||||
| # | |||||
| return ("inet4" => $uip, | |||||
| "netmask" => int2ip($netmask), | |||||
| "broadcast" => int2ip($broadcast), | |||||
| "cidr" => $ucidr, | |||||
| "router" => int2ip($low+1), | |||||
| "network" => int2ip($low), | |||||
| "high" => int2ip($high), | |||||
| ); | |||||
| }; | |||||
| my @ifout; | |||||
| if ($ENV{'TESTING'} ne '') { | |||||
| while(<>){ | |||||
| chomp($_); | |||||
| last if ($_ eq ''); | |||||
| push(@ifout, $_); | |||||
| # sleep 1; | |||||
| # print STDERR $_ . "\n"; | |||||
| } | |||||
| }else{ | |||||
| open IFCONFIG, "ifconfig -a |"; | |||||
| @ifout = <IFCONFIG>; | |||||
| close IFCONFIG; | |||||
| } | |||||
| # This seems wrong but it makes parsing easier due to solaris | |||||
| # non root ifconfig not displaying the mac address. Reverse the output. | |||||
| # | |||||
| @ifout = reverse(@ifout); | |||||
| my @output = (); | |||||
| my ($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef); | |||||
| sub printiface{ | |||||
| # assume a /32 if we don't know it | |||||
| unless (defined($ifnetmask)) { | |||||
| warn "$ifname has indeterminant netmask assuming /32\n"; | |||||
| $ifnetmask = '32'; | |||||
| } | |||||
| unless (defined($ifnetmask)) { | |||||
| $ifether = 'unknown'; | |||||
| } | |||||
| unless ($ifname =~ m/lo.*/){ | |||||
| my %netinfo = cidr2raw("$ifipv4\/$ifnetmask"); | |||||
| $ifnetmask = $netinfo{"cidr"}; | |||||
| $ifether = lc($ifether); | |||||
| my $line = sprintf "%-16s %-18s %-17s\n", "$ifname\@$ifmtu", "$ifipv4\/$ifnetmask", $ifether; | |||||
| push @output, $line; | |||||
| } | |||||
| # reset vars | |||||
| ($ifname, $ifether, $ifmtu, $ifipv4, $ifnetmask, $ifipv6) = (undef,undef,undef,undef,undef,undef); | |||||
| }; | |||||
| foreach my $line (@ifout) { | |||||
| if ($line =~ /inet\s+(\d+[.]\d+[.]\d+[.]\d+)\s+/){ | |||||
| $ifipv4 = $1; | |||||
| } | |||||
| if ($line =~ m/ether\s([:,0-9,a-f,A-F]{11,})/){ | |||||
| $ifether =$1; | |||||
| } | |||||
| if ($line =~ m/^([\w,\:\d+]+)\s+.*HWaddr\s([:,0-9,a-f,A-F]{11,})/){ | |||||
| $ifname = $1; | |||||
| $ifether = $2; | |||||
| } | |||||
| if ($line =~ m/^(.*)\:\s+.*mtu\s(\d+)/){ | |||||
| $ifname = $1; | |||||
| $ifmtu = $2; | |||||
| } | |||||
| if ($line =~ m/MTU[:](\d+)/){ | |||||
| $ifmtu = $1; | |||||
| } | |||||
| if ($line =~ m/inet\saddr\:(\d+[.]\d+[.]\d+[.]\d+)/){ | |||||
| $ifipv4 = $1; | |||||
| } | |||||
| if ($line =~ m/netmask\s+(0[xX])?([a-f,A-F,0-9]{8})/){ | |||||
| $ifnetmask = $2; | |||||
| } | |||||
| if ($line =~ m/Mask[:](\d+\.\d+\.\d+\.\d+)/){ | |||||
| $ifnetmask = $1; | |||||
| } | |||||
| if ($line =~ m/netmask\s+(\d+[.]\d+[.]\d+[.]\d+)/){ | |||||
| $ifnetmask = $1; | |||||
| } | |||||
| if ($line =~ m/netmask\s+0\s+broadcast/){ | |||||
| $ifnetmask = '0'; | |||||
| } | |||||
| print ":$ifether:$ifname:$ifmtu:$ifipv4:$ifnetmask:$ifipv6:\n" if ($ENV{'DEBUG'} ne ''); | |||||
| printiface() if ($ifname and $ifmtu and $ifipv4 ); | |||||
| }; | |||||
| if (scalar(@output) < 1){ | |||||
| warn "No interfaces? Scripts busted yo.\n"; | |||||
| }else{ | |||||
| foreach my $line (reverse(@output)){ | |||||
| print $line; | |||||
| } | |||||
| } | |||||
| #+END_SRC | |||||
| ** ~/bin/iso8601 | |||||
| Mostly because I use iso8601 timestamps and its nice to use them | |||||
| generally without depending on gnu date. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/iso8601 :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| #-*-mode: Perl; coding: utf-8;-*- | |||||
| use strict; | |||||
| use warnings; | |||||
| use POSIX qw(strftime); | |||||
| my $now = time; | |||||
| my $tz = strftime(('%z', (localtime $now))); | |||||
| $tz =~ s/(\d{2})(\d{2})/$1:$2/smx; | |||||
| my $time = strftime('%Y-%m-%dT%H:%M:%S', (localtime $now)); | |||||
| print "$time$tz\n"; | |||||
| exit 0; | |||||
| #+END_SRC | |||||
| ** ~/bin/whoson | |||||
| Basically getent passwd $username/$uid to show who is on a system. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/whoson :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Because i'm lazy and sick of typing in getent passwd $someusername/uid | |||||
| # | |||||
| my %who_cmds = ("solaris", "/bin/who -q", | |||||
| "linux", "/usr/bin/who -q", | |||||
| "darwin", "/usr/bin/who -q", | |||||
| ); | |||||
| my $who_cmd = $who_cmds{$^O}; | |||||
| local %users = (); | |||||
| foreach my $l (qx/$who_cmd/){ | |||||
| next if($l =~ m/^\#.*/); | |||||
| foreach my $user (split(/\s+/,$l)){ | |||||
| unless(exists($users{$user})){ | |||||
| $users{$user} = 0; | |||||
| }else{ | |||||
| $users{$user}++; | |||||
| }; | |||||
| }; | |||||
| }; | |||||
| foreach my $user (keys %users){ | |||||
| my $gecos = ( getpwnam($user) )[6]; | |||||
| my $count = $users{$user} + 1; | |||||
| my $output = "$user\, ".((defined($gecos)) ? "$gecos, " : '')."is logged in on $count tty".(($count>1) ? "\'s" : '')."\n"; | |||||
| print $output; | |||||
| }; | |||||
| #+END_SRC | |||||
| ** ~/bin/gecos | |||||
| Silly wrapper perl script that makes it easier to get at the gecos string for a $user/$uid. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/gecos :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Dumb wrapper to get the gecos information from a uid/username. | |||||
| foreach my $input (@ARGV){ | |||||
| my $gecos = undef; | |||||
| my $uid = undef; | |||||
| my $name = undef; | |||||
| if ( $input =~ m/^\d+$/ ) { | |||||
| ( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6]; | |||||
| } else { | |||||
| ( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6]; | |||||
| } | |||||
| print "$name is '$gecos' uid '$uid'\n" if $gecos; | |||||
| } | |||||
| #+END_SRC | |||||
| ** ~/bin/hatimerun | |||||
| Stupid perl script to mimic hatimerun for systems that don't have it. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/hatimerun :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # hatimerun in perl, sorta | |||||
| # | |||||
| use Getopt::Long; | |||||
| my $opt_exitcode = 99; | |||||
| my $opt_killcode = 9; | |||||
| my $opt_timeout = 60; | |||||
| GetOptions( 'e=i' => \$opt_exitcode, | |||||
| 'k=i' => \$opt_killcode, | |||||
| 't=i' => \$opt_timeout, | |||||
| 'h' => \&opt_help, | |||||
| 'help' => \&opt_help, | |||||
| ); | |||||
| sub opt_help{ | |||||
| my $message = <<__END__; | |||||
| UX: ERROR: invalid syntax | |||||
| usage: [-e return code][-k kill signal][-t seconds to wait] | |||||
| [-h][--help] | |||||
| Options | |||||
| --help, -h Prints this help text. | |||||
| -e Exit code to return on timeout. | |||||
| NOTE: 99 by default. | |||||
| -k Signal number to send via kill. | |||||
| NOTE: 9 by default. | |||||
| -t Timeout in seconds before alarming. | |||||
| NOTE: 60 by default. | |||||
| __END__ | |||||
| print $message; | |||||
| exit 1; | |||||
| }; | |||||
| my $pid; | |||||
| local $SIG{ALRM} = sub { kill $opt_killcode, $pid or die "Kill failed: $!"; | |||||
| die "Timeout!\n"}; | |||||
| eval{ | |||||
| my $x = defined($pid = fork()); | |||||
| unless ($pid){ | |||||
| print qx(@ARGV); | |||||
| die "Exec of ", join(' ', @ARGV), " failed at $!\n"; | |||||
| }; | |||||
| alarm $opt_timeout; | |||||
| waitpid $pid => 0; | |||||
| alarm 0; | |||||
| exit 0; | |||||
| }; | |||||
| if ($@){ | |||||
| die "Nothing to do!\n" unless $@ eq "Timeout!\n"; | |||||
| exit $opt_exitcode; | |||||
| }else{ | |||||
| exit 0; | |||||
| }; | |||||
| #+END_SRC | |||||
| ** ~/bin/ptree.pl | |||||
| Silly perl based ptree alike implementation. Mad old code that should be avoided at all costs but it works and I'm not fixing it unless I need to. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/ptree.pl :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # ptree for linux/darwin/solaris. I got sick of ps and pstree on linux. | |||||
| # ptree works on solaris fine, but doesn't exist for darwin/linux/etc... | |||||
| # | |||||
| # TODO: Allow passing a regexp instead of a pid and passing multiple pids. | |||||
| # | |||||
| local $ENV{"PATH"} = '/bin:/usr/bin:/sbin:/usr/sbin'; | |||||
| local $debug = 0; | |||||
| (exists($ENV{"DEBUG"})) ? $debug = 1 : undef; | |||||
| ($debug) ? local $| = 1 : undef; # disable buffering for STDERR and STDOUT | |||||
| sub debug_print { | |||||
| ($debug) && warn pop; | |||||
| }; | |||||
| local @cmd = ('/bin/ps'); | |||||
| local $init = 0; | |||||
| local $start = 1; | |||||
| if ($^O eq "linux"){ | |||||
| push(@cmd, 'ajxSw'); | |||||
| $start = 0; | |||||
| }elsif ($^O =~ m/darwin|freebsd/){ | |||||
| push(@cmd, 'Ajwww'); | |||||
| }elsif ($^O eq "solaris"){ | |||||
| @cmd = ('/usr/ucb/ps'); | |||||
| if ((-x "/bin/zonename") && !(qx(zonename) eq "global\n")){ | |||||
| $init = qx(pgrep zsched); | |||||
| chomp($init); | |||||
| $start = $init; | |||||
| }; | |||||
| push(@cmd, 'laxwww'); | |||||
| }else{ | |||||
| die "$^O isn't a known os to this script\n"; | |||||
| }; | |||||
| local @ps = qx(@cmd); | |||||
| ($?) ? die $cmd[0]." posix return code $?\n" : undef; | |||||
| local %proc; | |||||
| local @trail; | |||||
| (defined($ARGV[0])) ? $start = $ARGV[0] : undef; | |||||
| debug_print("Dump of raw line array data:\n"); | |||||
| foreach my $x (@ps){ | |||||
| my $cmd_index = 9; | |||||
| my $ppid = -1; | |||||
| my $pid = -1; | |||||
| next if ($x =~ m/.*PID.*/); | |||||
| my @line = split(m/\s+/,$x); | |||||
| splice(@line, 0, 1) unless ($line[0] =~ m/\d+/); | |||||
| splice(@line, 0, 1) if ("$line[0]" eq ""); | |||||
| if ($^O eq "linux"){ | |||||
| ($ppid,$pid) = @line; | |||||
| $cmd_index = 9; | |||||
| }elsif ($^O =~ m/darwin|freebsd/){ | |||||
| ($pid,$ppid) = @line; | |||||
| $cmd_index = 8; | |||||
| }elsif ($^O eq "solaris"){ | |||||
| (undef, undef, $pid,$ppid) = @line; | |||||
| for($x=$cmd_index; $x < 14; $x++){ | |||||
| $cmd_index = ($line[$x] =~ m/\d+\:\d+/) ? ($x + 1) : $cmd_index; | |||||
| }; | |||||
| }; | |||||
| my $command = join(' ', @line[$cmd_index..$#line++]); | |||||
| (!defined $proc{$pid}) ? $proc{$pid}->{"children"} = [ ] : undef; | |||||
| (!defined $proc{$ppid}) ? $proc{$ppid}->{"children"} = [ ] : undef; | |||||
| $proc{$pid}->{"pid"} = $pid; | |||||
| $proc{$pid}->{"command"} = $command; | |||||
| $proc{$pid}->{"ppid"} = $ppid; | |||||
| push(@{$proc{$ppid}->{"children"}},$pid); | |||||
| debug_print(join(',', @line[0..($#line-1)])."\n"); | |||||
| }; | |||||
| if ($debug){ | |||||
| debug_print("Done reading ps output\nDump of Hash\n"); | |||||
| foreach my $key (sort({$a <=> $b} (keys %proc))){ | |||||
| $ppid = $proc{$key}->{"ppid"}; | |||||
| $command = $proc{$key}->{"command"}; | |||||
| $children = join(',', @{$proc{$key}->{"children"}}); | |||||
| debug_print("PID<$key> PPID<$ppid> Children<$children> Command<$command>\n"); | |||||
| }; | |||||
| }; | |||||
| sub intrail{ | |||||
| my $crumb = pop; | |||||
| my $ret = 0; | |||||
| map {$ret++ if ($crumb == $_)} @trail; | |||||
| return $ret; | |||||
| }; | |||||
| sub addchildren{ | |||||
| my $start_node = pop; | |||||
| foreach my $child (@{$proc{$start_node}->{"children"}}){ | |||||
| next if (!defined($child) || ($start_node == $child)); | |||||
| debug_print("Start ($start_node) Add child $child.\n"); | |||||
| push(@trail, $child); | |||||
| addchildren($child); | |||||
| }; | |||||
| }; | |||||
| sub addparents{ | |||||
| my $start_node = pop; | |||||
| my $parent = $proc{$start_node}->{"ppid"}; | |||||
| return unless (defined($start_node)); | |||||
| return if (($parent == $start_node) || !(defined($parent))); # At the top of the tree, or in a zone | |||||
| debug_print("Start ($start_node) Add parent $parent.\n"); | |||||
| push(@trail, $parent); | |||||
| addparents($parent) if ($parent != $init); | |||||
| }; | |||||
| sub printnode{ | |||||
| my $start_node = pop; | |||||
| my $indent = pop; | |||||
| if (intrail($start_node)){ | |||||
| my $pid = $proc{$start_node}->{"pid"}; | |||||
| my $ppid = $proc{$start_node}->{"ppid"}; | |||||
| my $cmdline = $proc{$start_node}->{"command"}; | |||||
| my $indentation = ' 'x($indent); | |||||
| if ($pid == $init){ | |||||
| my $s = $^O." kernel"; | |||||
| if ($cmdline ne ''){ | |||||
| $s = $s." <$cmdline>"; | |||||
| }; | |||||
| $cmdline = $s; | |||||
| }; | |||||
| printf("%s%d %s\n", $indentation, $pid, $cmdline); | |||||
| foreach my $child (@{$proc{$start_node}->{"children"}}){ | |||||
| next if ($pid == $child); | |||||
| printnode($indent+1,$child); | |||||
| }; | |||||
| }; | |||||
| }; | |||||
| my $valid = 0; | |||||
| foreach my $j (keys %proc){ ($j == $start) ? $valid++ : undef; }; | |||||
| debug_print("Starting from <$start>, validity is<$valid>\n"); | |||||
| if ($valid){ | |||||
| if (!$start){ | |||||
| @trail = keys %proc; | |||||
| push(@trail, $start); push(@trail, 1); | |||||
| debug_print("Done with adding $start to trail.\n"); | |||||
| }else{ | |||||
| push(@trail, $start); | |||||
| debug_print("Adding children from $start.\n"); | |||||
| addchildren($start); | |||||
| debug_print("Adding parents from $start.\n"); | |||||
| addparents($start); | |||||
| }; | |||||
| @trail = sort(@trail); | |||||
| debug_print("Trail is: ".join(',', @trail)."\nStarting at pid $start\ninit pid $init\n"); | |||||
| print "PID COMMAND\n"; | |||||
| my $startindent = 0; | |||||
| (intrail($startindent)) ? $startindent = -1 : undef; | |||||
| printnode($startindent,$init); | |||||
| }else{ | |||||
| die "pid $start doesn't exist.\n"; | |||||
| }; | |||||
| exit 0; | |||||
| #+END_SRC | |||||
| * External Tanglers | |||||
| ** ~/bin/portchk | |||||
| Putting everything in readme.org was getting annoying. So started to split | |||||
| things apart. Org links to all the | |||||
| Just find out if a port responds to anything tcp related or not. | |||||
| #+BEGIN_SRC perl :mkdirp yes :tangle tmp/bin/portchk :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env perl | |||||
| # | |||||
| # Dumb wrapper to get the gecos information from a uid/username. | |||||
| | name | file | | |||||
| |----------+----------------| | |||||
| | emacs | [[file:emacs.org][emacs.org]] | | |||||
| | tmux | [[file:tmux.org][tmux.org]] | | |||||
| | git | [[file:git.org][git.org]] | | |||||
| | x | [[file:x.org][x.org]] | | |||||
| | nix | [[file:nix.org][nix.org]] | | |||||
| | zsh | [[file:zsh.org][zsh.org]] | | |||||
| | vim | [[file:vim.org][vim.org]] | | |||||
| | misc | [[file:misc.org][misc.org]] | | |||||
| | .profile | [[file:dotprofile.org][dotprofile.org]] | | |||||
| | ~/bin | [[file:bin.org][bin.org]] | | |||||
| foreach my $input (@ARGV){ | |||||
| my $gecos = undef; | |||||
| my $uid = undef; | |||||
| my $name = undef; | |||||
| if ( $input =~ m/^\d+$/ ) { | |||||
| ( $name,$uid,$gecos ) = ( getpwuid($input) )[0,2,6]; | |||||
| } else { | |||||
| ( $name,$uid,$gecos ) = ( getpwnam($input) )[0,2,6]; | |||||
| } | |||||
| print "$name is '$gecos' uid '$uid'\n" if $gecos; | |||||
| } | |||||
| #+END_SRC | |||||
| ** ~/bin/notify | |||||
| OSX only really, just fires off a notification when its ran. | |||||
| Example: | |||||
| notify "some command" "not ok" | |||||
| First param is the message, second title of the notification. | |||||
| #+BEGIN_SRC sh :mkdirp yes :tangle (when (eq osx-p t) "tmp/bin/notify") :results replace :tangle-mode (identity #o755) | |||||
| #!/bin/sh | |||||
| message=${1:="no message"} | |||||
| title='' | |||||
| if [ "${2}" != "" ]; then | |||||
| message="${2}" | |||||
| title="${1}" | |||||
| fi | |||||
| notification="display notification \"${message}\"" | |||||
| [ "${title}" != "" ] && notification="${notification} with title \"${title}\"" | |||||
| osascript -e "${notification}" | |||||
| #+END_SRC | |||||
| ** ~/bin/today | |||||
| Stupid ruby script I wrote to highlight the week/day in a calendar. | |||||
| #+BEGIN_SRC ruby :mkdirp yes :tangle tmp/bin/today :results replace :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env ruby | |||||
| cal, today, week_color, day_color, reset = %x(cal).split(%r(\n)), Time.now.day, %x(tput sgr0;tput setab 4;tput setaf 7), %x(tput sgr0; tput setab 0;tput setaf 7;tput bold), %x(tput sgr0) | |||||
| done=false | |||||
| cal.each do |line| | |||||
| if done then | |||||
| puts line | |||||
| next | |||||
| end | |||||
| if(line =~ /^(.*\s+?)#{today}(\s+?.*)$/ or | |||||
| line =~ /^(.*\s+?)#{today}$/ or | |||||
| line =~ /^()#{today}(\s+?.*)$/ or | |||||
| line =~ /^#{today}$/ ) then | |||||
| puts "#{week_color}#{$1}#{day_color}#{today}#{week_color}#{$2}#{reset}" | |||||
| done=true | |||||
| else | |||||
| puts line | |||||
| end | |||||
| end | |||||
| #+END_SRC | |||||
| ** Cray specific | |||||
| *** ~/bin/essh | |||||
| Expect ssh, to aide login to smw's etc.. | |||||
| #+BEGIN_SRC expect :tangle (when (eq cray-p t) "tmp/bin/essh") :mkdirp yes :tangle-mode (identity #o755) | |||||
| #!/usr/bin/expect | |||||
| set prompt "> " | |||||
| set password [lindex $argv 1] | |||||
| set connstr [lindex $argv 0] | |||||
| if {$argc > 2} { | |||||
| eval spawn ssh -q $connstr "[lrange $argv 2 end]" | |||||
| set timeout 3600 | |||||
| expect { | |||||
| timeout { | |||||
| puts "Command took too long" | |||||
| exit 1 | |||||
| } | |||||
| "yes/no" { | |||||
| send "yes\r" | |||||
| exp_continue | |||||
| } | |||||
| "assword:" { | |||||
| send -- "$password\r" | |||||
| exp_continue | |||||
| } | |||||
| } | |||||
| } else { | |||||
| spawn ssh -q $connstr | |||||
| set timeout 5 | |||||
| expect { | |||||
| timeout { | |||||
| puts "Connection timed out" | |||||
| exit 1 | |||||
| } | |||||
| "yes/no" { | |||||
| send "yes\r" | |||||
| exp_continue | |||||
| } | |||||
| "assword:" { | |||||
| send -- "$password\r" | |||||
| exp_continue | |||||
| } | |||||
| "$prompt" { | |||||
| interact | |||||
| } | |||||
| } | |||||
| } | |||||
| #+END_SRC | |||||
| *** ~/bin/escp | |||||
| Similar to the above only for scp. | |||||
| #+BEGIN_SRC expect :tangle (when (eq cray-p t) "tmp/bin/escp") :mkdirp yes :tangle-mode (identity #o755) | |||||
| #!/usr/bin/expect | |||||
| set prompt "> " | |||||
| set password [lindex $argv 0] | |||||
| if {$argc > 2} { | |||||
| eval spawn scp -q "[lrange $argv 1 end]" | |||||
| set timeout 3600 | |||||
| expect { | |||||
| timeout { | |||||
| puts "Command took too long" | |||||
| exit 1 | |||||
| } | |||||
| "yes/no" { | |||||
| send "yes\r" | |||||
| exp_continue | |||||
| } | |||||
| "assword:" { | |||||
| send -- "$password\r" | |||||
| exp_continue | |||||
| } | |||||
| } | |||||
| } | |||||
| #+END_SRC | |||||
| *** ~/bin/flushdns | |||||
| For some reason this sometimes needs to happen, stupid work dns. | |||||
| #+BEGIN_SRC sh :tangle-mode (identity #o755) :tangle (when (and (eq cray-p t) (eq osx-p t)) "tmp/bin/flushdns") :mkdirp yes :tangle-mode (identity #o755) | |||||
| #!/bin/sh | |||||
| set +e | |||||
| dscacheutil -flushcache | |||||
| sudo killall -HUP mDNSResponder | |||||
| sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist | |||||
| sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.mDNSResponder.plist | |||||
| exit $? | |||||
| #+END_SRC | |||||
| *** ~/bin/tomod | |||||
| #+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/bin/tomod") :mkdirp yes :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env sh | |||||
| #-*-mode: Shell-script; coding: utf-8;-*- | |||||
| export script=$(basename "$0") | |||||
| export dir=$(cd "$(dirname "$0")"; pwd) | |||||
| export iam=${dir}/${script} | |||||
| remote=cfosbld01 | |||||
| export PATH=/usr/local/brew/10.10/bin:~/bin:${PATH} | |||||
| branch=$(git rev-parse --abbrev-ref HEAD) | |||||
| if [ $? -ne 0 ]; then | |||||
| echo not on a branch or in a git repo | |||||
| exit 2 | |||||
| fi | |||||
| base_git="$(pwd)" | |||||
| opwd="${base_git}" | |||||
| while true; do | |||||
| if [ -d ".git" ]; then | |||||
| base_git="$(pwd)" | |||||
| break | |||||
| fi | |||||
| if [ "$(pwd)" == "/" ]; then | |||||
| echo "No .git base directory found from ${opwd}" | |||||
| exit 2 | |||||
| fi | |||||
| ((count=$count+1)) | |||||
| cd .. | |||||
| done | |||||
| svn_url=$(git svn info --url) | |||||
| remote_svn="/notbackedup/users/mtishmack/mod_data/${branch}" | |||||
| ssh $remote "module load cpkg sdev craysvn; rm -fr ${remote_svn}; mkdir -p ${remote_svn} && svn co ${svn_url} ${remote_svn} > /dev/null 2>&1;" | |||||
| echo "rsyncing local git branch to ${remote}:${remote_svn}" | |||||
| rsync \ | |||||
| --stats \ | |||||
| --checksum \ | |||||
| -avz \ | |||||
| --hard-links \ | |||||
| --exclude=.git \ | |||||
| --delete-excluded \ | |||||
| --delete \ | |||||
| --filter="-rs_.svn" \ | |||||
| --filter="-ss_covhtml" \ | |||||
| --filter="-ss_dev.yml" \ | |||||
| --filter="-ss_.gitignore" \ | |||||
| --filter="-ss_*.log" \ | |||||
| --filter="-ss_.\#*" \ | |||||
| --filter="-ss_*.swp" \ | |||||
| --filter="-ss_*.pyc" \ | |||||
| --filter="-ss_venv" \ | |||||
| --filter="-ss_testdirs" \ | |||||
| --filter="-ss_testfiles" \ | |||||
| --filter="-ss_.*.git.*" \ | |||||
| --filter="-ss_*.o" \ | |||||
| --filter="-ss_*.o.cmd" \ | |||||
| --filter="-ss_*.ko" \ | |||||
| --filter="-ss_*.ko.cmd" \ | |||||
| --filter="-ss_*.tmp_versions" \ | |||||
| "${base_git}/" "${remote}:${remote_svn}" | |||||
| echo "done rsyncing ${base_git} to ${remote}:${remote_svn}" | |||||
| #+END_SRC | |||||
| *** ~/bin/towip | |||||
| #+BEGIN_SRC sh :tangle (when (eq cray-p t) "tmp/bin/towip") :mkdirp yes :tangle-mode (identity #o755) | |||||
| #!/usr/bin/env sh | |||||
| #-*-mode: Shell-script; coding: utf-8;-*- | |||||
| export script=$(basename "$0") | |||||
| export dir=$(cd "$(dirname "$0")"; pwd) | |||||
| export iam=${dir}/${script} | |||||
| remote=cfosbld01 | |||||
| export PATH=/usr/local/brew/10.10/bin:~/bin:${PATH} | |||||
| branch=$(git rev-parse --abbrev-ref HEAD) | |||||
| if [ $? -ne 0 ]; then | |||||
| echo not on a branch or in a git repo | |||||
| exit 2 | |||||
| fi | |||||
| base_git="$(pwd)" | |||||
| opwd="${base_git}" | |||||
| while true; do | |||||
| if [ -d ".git" ]; then | |||||
| base_git="$(pwd)" | |||||
| break | |||||
| fi | |||||
| if [ "$(pwd)" == "/" ]; then | |||||
| echo "No .git base directory found from ${opwd}" | |||||
| exit 2 | |||||
| fi | |||||
| ((count=$count+1)) | |||||
| cd .. | |||||
| done | |||||
| svn_url=$(git svn info --url) | |||||
| remote_svn="/notbackedup/users/mtishmack/wip-dws" | |||||
| ssh $remote "module load cpkg sdev craysvn; rm -fr ${remote_svn}; mkdir -p ${remote_svn} && svn co ${svn_url} ${remote_svn} > /dev/null 2>&1;" | |||||
| echo "rsyncing local git branch to ${remote}:${remote_svn}" | |||||
| rsync \ | |||||
| --progress \ | |||||
| --checksum \ | |||||
| -avz \ | |||||
| --hard-links \ | |||||
| --exclude=.git \ | |||||
| --delete-excluded \ | |||||
| --delete \ | |||||
| --filter="-rs_.svn" \ | |||||
| --filter="-ss_covhtml" \ | |||||
| --filter="-ss_dev.yml" \ | |||||
| --filter="-ss_.gitignore" \ | |||||
| --filter="-ss_*.log" \ | |||||
| --filter="-ss_.\#*" \ | |||||
| --filter="-ss_*.swp" \ | |||||
| --filter="-ss_*.pyc" \ | |||||
| --filter="-ss_*.o" \ | |||||
| --filter="-ss_*.o.cmd" \ | |||||
| --filter="-ss_*.tmp_versions" \ | |||||
| --filter="-ss_venv" \ | |||||
| --filter="-ss_testdirs" \ | |||||
| --filter="-ss_testfiles" \ | |||||
| --filter="-ss_.*.git.*" \ | |||||
| "${base_git}/" "${remote}:${remote_svn}" | |||||
| echo "done rsyncing ${base_git} to ${remote}:${remote_svn}" | |||||
| #+END_SRC | |||||
| * git | |||||
| ** ~/.gitconfig | |||||
| :PROPERTIES: | |||||
| :header-args: :tangle tmp/.gitconfig :comments no :padline no :cache yes :mkdirp yes | |||||
| :END: | |||||
| General git configuration. | |||||
| *** pager | |||||
| #+BEGIN_SRC conf | |||||
| [pager] | |||||
| color = true | |||||
| #+END_SRC | |||||
| *** color | |||||
| #+BEGIN_SRC conf | |||||
| [color] | |||||
| status = auto | |||||
| diff = auto | |||||
| branch = auto | |||||
| [color "status"] | |||||
| added = green | |||||
| changed = blue | |||||
| untracked = red | |||||
| [color "branch"] | |||||
| current = green | |||||
| local = blue | |||||
| remote = red | |||||
| [color "diff"] | |||||
| meta = blue bold | |||||
| frag = black reverse | |||||
| old = red reverse | |||||
| new = green reverse | |||||
| #+END_SRC | |||||
| *** alias | |||||
| #+BEGIN_SRC conf | |||||
| [alias] | |||||
| begin = !git init && git commit --allow-empty -m 'Initial empty commit' | |||||
| up = !git pull --rebase && git push | |||||
| wsdiff = diff --color-words --ignore-space-at-eol --ignore-space-change --ignore-all-space --ignore-all-space | |||||
| wdiff = diff --color-words | |||||
| ci = commit | |||||
| ciu = commit --all | |||||
| co = checkout | |||||
| ds = diff --stat | |||||
| ba = branch --all | |||||
| st = status --short --branch | |||||
| s = status --short --branch --untracked-files=no | |||||
| unstage = reset HEAD | |||||
| tlog = log --graph --color=always --abbrev-commit --date=relative --pretty=oneline | |||||
| hist = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative | |||||
| slog = log --oneline --decorate | |||||
| fixup = commit --fixup | |||||
| squash = commit --squash | |||||
| ri = rebase --interactive --autosquash | |||||
| ra = rebase --abort | |||||
| effit = reset --hard | |||||
| # What commits differ between branches, note, equivalent commits are omitted. | |||||
| # Use this with three dot operator aka master...origin/master | |||||
| cpdiff = log --no-merges --left-right --graph --cherry-pick --oneline | |||||
| # Same as ^ only equivalent commits are listed with a = sign. | |||||
| cmdiff = log --no-merges --left-right --graph --cherry-mark --oneline | |||||
| # git update with submodule update | |||||
| sup = !git checkout master && git pull && git submodule update --init --recursive | |||||
| # git clone with submodules | |||||
| sc = !git clone --recursive $1 | |||||
| # what files are getting updated a lot | |||||
| churn = !git log --all -M -C --name-only --format='format:' "$@" | sort | grep -v '^$' | uniq -c | sort | awk 'BEGIN {print "count,file"} {print $1 "," $2}' | |||||
| # help the gc a bit and get a bit more space back for a local clone | |||||
| trim = !git reflog expire --expire=now --all && git gc --prune=now | |||||
| #+END_SRC | |||||
| *** github | |||||
| #+BEGIN_SRC conf | |||||
| [github] | |||||
| user = mitchty | |||||
| #+END_SRC | |||||
| *** credential | |||||
| #+BEGIN_SRC conf | |||||
| [credential] | |||||
| helper = netrc -v -f ~/.netrc.gpg -f ~/.netrc | |||||
| #+END_SRC | |||||
| *** advice | |||||
| #+BEGIN_SRC conf | |||||
| [advice] | |||||
| statushints = false | |||||
| #+END_SRC | |||||
| *** gui | |||||
| #+BEGIN_SRC | |||||
| [gui] | |||||
| fontui = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 | |||||
| fontdiff = -family Monaco -size 8 -weight normal -slant roman -underline 0 -overstrike 0 | |||||
| #+END_SRC | |||||
| *** http | |||||
| #+BEGIN_SRC | |||||
| [http] | |||||
| postBuffer = 209715200 | |||||
| #+END_SRC | |||||
| *** push | |||||
| #+BEGIN_SRC conf | |||||
| [push] | |||||
| default = simple | |||||
| #+END_SRC | |||||
| *** url rewrites | |||||
| #+BEGIN_SRC conf | |||||
| [url "https://github.com/"] | |||||
| insteadOf = git://github.com/ | |||||
| #+END_SRC | |||||
| *** username/email | |||||
| #+BEGIN_SRC conf | |||||
| [user] | |||||
| name = Mitch Tishmack | |||||
| email = mitch.tishmack@gmail.com | |||||
| #+END_SRC | |||||
| ** ~/.gitignore | |||||
| Common crap/build artifacts that git should always ignore. | |||||
| #+BEGIN_SRC conf :tangle tmp/.gitignore :results replace | |||||
| .*~ | |||||
| *~ | |||||
| .\#* | |||||
| \#* | |||||
| \#*\# | |||||
| .\#*\# | |||||
| .DS_Store | |||||
| *.pyc | |||||
| *.rbc | |||||
| *.elc | |||||
| *.swp | |||||
| *.[oa] | |||||
| *.hi | |||||
| #+END_SRC | |||||
| * x | |||||
| ** ~/.Xdefaults | |||||
| X defaults, just urxvt for the moment. Slightly linux/bsd only but not really. | |||||
| #+BEGIN_SRC conf :tangle (when (eq x-p t) "tmp/.Xdefaults") :results replace | |||||
| ! urxvt generalish stuff | |||||
| ! | |||||
| urxvt*termName: rxvt-256color | |||||
| urxvt*font: xft:menlo:size=12:antialias=true | |||||
| urxvt*perl-ext-common: default,matcher | |||||
| urxvt*jumpScroll: true | |||||
| urxvt*cursorColor: pink | |||||
| urxvt*loginShell: true | |||||
| urxvt*scrollBar: true | |||||
| urxvt*scrollstyle: next | |||||
| urxvt*scrollBar_right: true | |||||
| urxvt*scrollTtyOutput: false | |||||
| urxvt*cursorBlink: true | |||||
| urxvt*saveLines: 10000 | |||||
| urxvt*urlLauncher: /usr/bin/google-chrome | |||||
| urxvt*matcher.button: 1 | |||||
| urxvt*allowWindowOps: true | |||||
| #+END_SRC | |||||
| ** ~/.Xmodmap | |||||
| Swap around left/right clicks basically. | |||||
| #+BEGIN_SRC conf :tangle (when (and (eq x-p t) (not (eq osx-p t))) "tmp/.Xmodmap") | |||||
| pointer = 3 2 1 4 5 | |||||
| #+END_SRC | |||||
| OSX is odd. | |||||
| #+BEGIN_SRC conf :tangle (when (and (eq x-p t) (eq osx-p t)) "tmp/.Xmodmap") | |||||
| pointer = 1 2 3 4 5 | |||||
| #+END_SRC | |||||
| ** ~/.Xresources | |||||
| I can't remember why I did all this effort. But I'll remove it some year I bet. | |||||
| #+BEGIN_SRC conf :tangle (when (eq x-p t) "tmp/.Xresources") :results replace | |||||
| #define brightblack #ffffff | |||||
| #define normblack #f9f9f9 | |||||
| #define normgreen #00cc33 | |||||
| #define brightgreen #00cc99 | |||||
| #define normblue #f00033 | |||||
| #define brightblue #0099ff | |||||
| #define normcyan #66ccff | |||||
| #define brightcyan #66ccff | |||||
| #define normwhite #060606 | |||||
| #define brightwhite #000000 | |||||
| #define normyellow #ffcc33 | |||||
| #define brightyellow #ffcc33 | |||||
| #define normred #ff3300 | |||||
| #define brightred #ff3300 | |||||
| #define normmagenta #ff66ff | |||||
| #define brightmagenta #ff66ff | |||||
| *background: normblack | |||||
| *foreground: normwhite | |||||
| *fading: 40 | |||||
| *fadeColor: brightblack | |||||
| *cursorColor: brightcyan | |||||
| *pointerColorBackground: #3f3f3f | |||||
| *pointerColorForeground: #f3f3f3 | |||||
| *color0: #090909 | |||||
| *color1: #f00000 | |||||
| *color2: normgreen | |||||
| *color3: normyellow | |||||
| *color4: #0066ff | |||||
| *color5: normmagenta | |||||
| *color6: normcyan | |||||
| *color7: #c8c8c8 | |||||
| *color8: #888888 | |||||
| *color9: #f00033 | |||||
| *color10: brightgreen | |||||
| *color11: brightyellow | |||||
| *color12: #0099ff | |||||
| *color13: brightmagenta | |||||
| *color14: brightcyan | |||||
| *color15: #f9f9f9 | |||||
| #+END_SRC | |||||
| * zsh | |||||
| ** ~/.zprofile | |||||
| Make sure that zsh sources ~/.profile correctly on login. | |||||
| #+BEGIN_SRC sh :tangle tmp/.zprofile :results replace | |||||
| emulate sh | |||||
| source ~/.profile | |||||
| emulate zsh | |||||
| # zsh does this differently | |||||
| login_shell() | |||||
| { | |||||
| [[ -o login ]] | |||||
| } | |||||
| #+END_SRC | |||||
| ** ~/.zshrc | |||||
| Zsh configuration, its not too crazy... I think. Don't judge me. | |||||
| #+BEGIN_SRC sh :tangle tmp/.zshrc :results replace | |||||
| #-*-mode: Shell-script; coding: utf-8;-*- | |||||
| # zsh specific global aliases | |||||
| alias -g silent="> /dev/null 2>&1" | |||||
| alias -g noerr="2> /dev/null" | |||||
| alias -g stdboth="2>&1" | |||||
| # mainly for firefox, because it can suck up the cycles, but not when | |||||
| # in a SIGSTOP state you can't use any power then firefox. | |||||
| alias -g sigcont='kill -CONT ' | |||||
| alias -g sigstop='kill -STOP ' | |||||
| # Keybindings, what few there are. | |||||
| bindkey -v | |||||
| bindkey '^P' push-line # Saves the current line and returns to it afterwards. | |||||
| # General history options | |||||
| export HISTSIZE=5000 | |||||
| export SAVEHIST=${HISTSIZE} | |||||
| export HISTFILE=~/.zsh_history | |||||
| # I like my options | |||||
| setopt append_history | |||||
| setopt extended_history | |||||
| setopt hist_reduce_blanks | |||||
| setopt hist_no_store | |||||
| setopt hist_ignore_dups | |||||
| setopt histignorespace | |||||
| setopt no_hist_beep | |||||
| setopt no_list_beep | |||||
| setopt share_history | |||||
| setopt inc_append_history | |||||
| setopt auto_menu | |||||
| setopt bash_auto_list | |||||
| # Options that don't need to be set. | |||||
| unsetopt bad_pattern # No, don't warn me on bad file patterns kthxbai. | |||||
| # The rest of the story (tm) (c) (r) in option settings. | |||||
| setopt equals | |||||
| setopt notify | |||||
| setopt auto_cd | |||||
| setopt glob_dots | |||||
| setopt print_exit_value # I love you zsh for this, print out non zero exits. | |||||
| other_term() | |||||
| { | |||||
| case $TERM in | |||||
| *xterm*|*rxvt*|(dt|k|e)term) | |||||
| print -Pn "\e]2;%~\a" | |||||
| ;; | |||||
| sun-cmd) | |||||
| print -Pn "\e]l%~\e\\" | |||||
| ;; | |||||
| *) | |||||
| ;; | |||||
| esac | |||||
| } | |||||
| chpwd() | |||||
| { | |||||
| [[ -o interactive ]] || return | |||||
| case $TERM in | |||||
| eterm-color) # getting emacs terminal to not be annoying... sucks | |||||
| print -Pn "" | |||||
| ;; | |||||
| *) | |||||
| if [[ $SSH_TTY != '' ]]; then | |||||
| case $ORIG_TERM in | |||||
| eterm-color) | |||||
| print -Pn "" | |||||
| ;; | |||||
| *) | |||||
| other_term | |||||
| ;; | |||||
| esac | |||||
| fi | |||||
| ;; | |||||
| esac | |||||
| } | |||||
| # Needs to be reviewed a bit. | |||||
| zstyle ':completion:*' squeeze-slashes true | |||||
| zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} | |||||
| zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' | |||||
| zstyle ':completion:*:*:*:*:processes' force-list always | |||||
| # No need to setup ssh known host parsing as root, just regular users. | |||||
| # This is pretty old using compctl, need to update eventually. | |||||
| Language specific | |||||
| if [[ "$LOGNAME" != "root" ]]; then | |||||
| zmodload zsh/mathfunc | |||||
| if [[ -f "$HOME/.ssh/known_hosts" ]]; then | |||||
| hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}%%,*}) | |||||
| zstyle ':completion:*:(ssh|scp|cssh):*' hosts $hosts | |||||
| zstyle ':completion:*:*:*:hosts-host' ignored-patterns '|1|*' loopback localhost | |||||
| fi | |||||
| zstyle ':completion:::complete*' use-cache 1 | |||||
| # This really should be closer to the definition of extract. | |||||
| compctl -g '*.tar.bz2 *.tbz2 *.tbz *.tar.gz *.tgz *.bz2 *.gz *.jar *.zip *.rar *.tar *.Z *.tZ *.tar.Z' + -g '*(-/)' extract | |||||
| fi | |||||
| # More history options for newer zsh versions | |||||
| setopt share_history | |||||
| setopt hist_save_no_dups | |||||
| setopt hist_find_no_dups | |||||
| setopt hist_no_functions | |||||
| setopt hist_expire_dups_first | |||||
| bindkey ' ' magic-space # Complete spaces too dammit, i'm lazy. | |||||
| alias edirs='ls -d **/*(/^F)' # empty directories | |||||
| zstyle ':completion:*:*:kill:*' menu yes select | |||||
| zstyle ':completion:*:kill:*' force-list always | |||||
| zstyle ':completion:*:kill:*:processes' command "ps x" | |||||
| zstyle ':completion:*' menu select=2 | |||||
| autoload -U compinit | |||||
| autoload -U colors && colors | |||||
| autoload -Uz vcs_info | |||||
| bindkey -e | |||||
| local userat="%{$fg[blue]%}%n%(!.%{$fg[red]%}.%{$fg[blue]%})%{$reset_color%}%B@%b%{$fg[blue]%}%m%b" | |||||
| local pwd="%B%~%b" | |||||
| local userchar="%(!.#.$)" | |||||
| zstyle ':vcs_info:*' enable git | |||||
| zstyle ':vcs_info:*' check-for-changes true | |||||
| setopt prompt_subst | |||||
| precmd() | |||||
| { | |||||
| vcs_info | |||||
| } | |||||
| # +N/-N upstream info | |||||
| function +vi-git-st() { | |||||
| local ahead behind | |||||
| local -a gitstatus | |||||
| ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l | sed -e 's|^ *||g') | |||||
| behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l | sed -e 's|^ *||g') | |||||
| (( $ahead )) && gitstatus+=( "+${ahead}" ) | |||||
| (( $behind )) && gitstatus+=( "-${behind}" ) | |||||
| hook_com[misc]+=${(j:/:)gitstatus} | |||||
| } | |||||
| # Untracked crap in the repo not covered by .gitignore? | |||||
| function +vi-git-untracked(){ | |||||
| if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ | |||||
| git status --porcelain | grep '??' &> /dev/null ; then | |||||
| hook_com[staged]+="%{$fg[red]%}N" | |||||
| fi | |||||
| } | |||||
| local branch="%{$fg[green]%}%b%c%u%{$fg[green]%}%{$reset_color%}" | |||||
| zstyle ':vcs_info:*' formats "%m $branch" | |||||
| zstyle ':vcs_info:*' actionformats "%a $branch" | |||||
| zstyle ':vcs_info:*' stagedstr "%{$fg[blue]%}S" | |||||
| zstyle ':vcs_info:*' unstagedstr "%{$fg[blue]%}M" | |||||
| zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-st | |||||
| PROMPT="%(!.#.$) " # $ as a user # as root | |||||
| RPROMPT='${vcs_info_msg_0_} ${PWD/#$HOME/~}' | |||||
| #+END_SRC | |||||
| * tmux | |||||
| ** ~/.tmux.conf | |||||
| Tmux configuration. Pretty boring in most ways. | |||||
| #+BEGIN_SRC conf :tangle tmp/.tmux.conf | |||||
| # Setup utf8 by default and vi mode | |||||
| set-window-option -g utf8 on | |||||
| set-window-option -g mode-keys vi | |||||
| set-window-option -g aggressive-resize on | |||||
| # Force zsh to be a login shell | |||||
| set-option -g default-command 'zsh -l' | |||||
| set-option -g default-terminal 'xterm-256color' | |||||
| # Status line options, mainly coloring | |||||
| set-window-option -g window-status-bg colour6 | |||||
| set-window-option -g window-status-fg black | |||||
| set-window-option -g window-status-current-bg white | |||||
| # Status line options | |||||
| set-option -g status-bg black | |||||
| set-option -g status-fg colour7 | |||||
| set-option -g status-left-length 24 | |||||
| set-option -g status-left '' | |||||
| set-option -g status-right-length 13 | |||||
| set-option -g status-right "%a %H:%M:%S" | |||||
| set-option -g status-interval 7 | |||||
| set-option -g status-utf8 on | |||||
| # Pane border options, mimics the status line coloring | |||||
| set-option -g pane-border-bg colour15 | |||||
| set-option -g pane-border-fg colour82 | |||||
| set-option -g pane-active-border-bg colour15 | |||||
| set-option -g pane-active-border-fg colour2 | |||||
| # Alert related things | |||||
| set-option -g visual-activity on | |||||
| set-option -g visual-bell on | |||||
| set-option -g message-bg colour7 | |||||
| set-option -g message-fg black | |||||
| # Pass through the window title and display it automatically on changes. | |||||
| set-option -g set-titles on | |||||
| set-option -g set-titles-string '#T' | |||||
| set-window-option -g automatic-rename on | |||||
| # Key rebinding to make things more au naturalle | |||||
| bind-key R \ | |||||
| source-file ~/.tmux.conf \;\ | |||||
| display 'reloaded tmux config' | |||||
| # Log pane output to a file, save with an iso8601 datestamp | |||||
| bind-key o \ | |||||
| pipe-pane -o "cat >> $HOME/tmux-`iso8601`.log" \;\ | |||||
| set-window-option window-status-current-fg green \; | |||||
| bind-key O \ | |||||
| pipe-pane \;\ | |||||
| set-window-option window-status-current-fg default \; | |||||
| bind-key N new-session -t default | |||||
| # Using s for synchronizing panes, means that s for choosing sessions | |||||
| # is now e | |||||
| unbind-key s # interactive select sessions | |||||
| bind-key e choose-tree | |||||
| # (un)synchronize panes with prefix-s | |||||
| bind-key s \ | |||||
| if-shell \ | |||||
| "tmux show-window-options | grep 'synchronize-panes on'" \ | |||||
| "set-window-option window-status-current-bg colour7; \ | |||||
| set-window-option pane-active-border-fg colour2; \ | |||||
| set-window-option pane-active-border-bg colour15; \ | |||||
| set-window-option synchronize-panes off; \ | |||||
| display 'synchronization off'" \ | |||||
| "set-window-option window-status-current-bg red; \ | |||||
| set-window-option pane-active-border-fg red; \ | |||||
| set-window-option pane-active-border-bg colour15; \ | |||||
| set-window-option synchronize-panes on; \ | |||||
| display 'synchronizing'" | |||||
| # same thing as ^ so it sets up things if we were started with | |||||
| # something else that set synchronization. | |||||
| if-shell \ | |||||
| "tmux show-window-options | grep 'synchronize-panes on' || /bin/true" \ | |||||
| "set-window-option window-status-current-bg red; \ | |||||
| set-window-option pane-active-border-fg yellow; \ | |||||
| set-window-option pane-active-border-bg red" | |||||
| # Setup splits to be less annoying | |||||
| bind-key \ split-window -h | |||||
| bind-key - split-window -v | |||||
| # vi keybindings for pane navigation | |||||
| bind-key k select-pane -U | |||||
| bind-key j select-pane -D | |||||
| bind-key h select-pane -L | |||||
| bind-key l select-pane -R | |||||
| # Make it so that I can detach/etc while holding control down, | |||||
| # PURE LAZY | |||||
| bind-key C-d detach | |||||
| bind-key C-n next-window | |||||
| bind-key C-p previous-window | |||||
| bind-key C-k select-pane -U | |||||
| bind-key C-j select-pane -D | |||||
| bind-key C-h select-pane -L | |||||
| bind-key C-l select-pane -R | |||||
| # Non confirming kill pane plskthxbai | |||||
| bind-key x kill-pane | |||||
| # In case something I run exits straight away, i'd like to know about it. | |||||
| set-option -g set-remain-on-exit on | |||||
| # Lets change the prefix key so we don't clobber emacs back one char key | |||||
| unbind-key C-b | |||||
| # hacky, but C-\ isn't used by anything overly important in emacs | |||||
| set-option -g prefix 'C-\' | |||||
| # two C-\'s == C-\, if i need it, likely not | |||||
| bind 'C-\' send-prefix | |||||
| # Delay in sending things is dumb | |||||
| set-option -s escape-time 1 | |||||
| # so we can scroll the mouse, select panes, etc... | |||||
| set -g mouse on | |||||
| bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'" | |||||
| bind-key m \ | |||||
| if-shell \ | |||||
| "tmux show-options -g | grep 'mouse on'" \ | |||||
| "set -g mouse off; \ | |||||
| display 'Mouse modes off'" \ | |||||
| "set -g mouse on; \ | |||||
| display 'Mouse modes on'" | |||||
| #+END_SRC | |||||
| #+BEGIN_SRC conf :tangle (when (not (eq osx-p t)) "tmp/.tmux.conf") | |||||
| # Assume linux for things, load osx stuff only on osx | |||||
| bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer" | |||||
| bind C-y run "tmux save-buffer - | xclip -i" | |||||
| #+END_SRC | |||||
| * vim | |||||
| ** ~/.vimrc | |||||
| What remains of my days from being a vim user. | |||||
| #+BEGIN_SRC conf :tangle tmp/.vimrc :results replace | |||||
| set nocompatible | |||||
| set backspace=indent,eol,start | |||||
| set history=50 " keep 50 lines of command line history | |||||
| set ruler " show the cursor position all the time | |||||
| set showcmd " display incomplete commands | |||||
| set incsearch " do incremental searching | |||||
| map Q gq | |||||
| if &t_Co > 2 || has("gui_running") | |||||
| syntax on | |||||
| set hlsearch | |||||
| endif | |||||
| if has("autocmd") | |||||
| filetype plugin indent on | |||||
| augroup vimrcEx | |||||
| au! | |||||
| autocmd FileType text setlocal textwidth=78 | |||||
| autocmd BufReadPost * | |||||
| \ if line("'\"") > 0 && line("'\"") <= line("$") | | |||||
| \ exe "normal g`\"" | | |||||
| \ endif | |||||
| augroup END | |||||
| else | |||||
| set autoindent " always set autoindenting on | |||||
| endif " has("autocmd") | |||||
| #+END_SRC | |||||
| * nix | |||||
| #+BEGIN_SRC conf :mkdirp yes :tangle (when (eq nix-p t) "tmp/.nixpkgs/config.nix") | |||||
| {pkgs}: { | |||||
| allowUnfree = true; | |||||
| allowBroken = true; | |||||
| packageOverrides = pkgs: with pkgs; { | |||||
| pinentry = pkgs.pinentry.override { | |||||
| gtk2 = null; | |||||
| qt4 = null; | |||||
| ncurses = null; | |||||
| }; | |||||
| gnupg = pkgs.gnupg.override { | |||||
| x11Support = false; | |||||
| pinentry = true; | |||||
| }; | |||||
| youtube-dl = pkgs.youtube-dl.override { | |||||
| pandoc = null; | |||||
| }; | |||||
| # haskellPackages = haskellPackages.override { | |||||
| # extension = self : super : { | |||||
| # cabal = pkgs.haskellPackages.cabalNoTest; | |||||
| # }; | |||||
| # }; | |||||
| default = with pkgs; buildEnv { | |||||
| name = "default"; | |||||
| paths = [ | |||||
| ansible | |||||
| ack | |||||
| aria | |||||
| iperf | |||||
| cacert | |||||
| curl | |||||
| clang | |||||
| clang-analyzer | |||||
| diffutils | |||||
| patchutils | |||||
| gitAndTools.gitFull | |||||
| gitAndTools.git-extras | |||||
| bazaarTools | |||||
| mercurial | |||||
| subversionClient | |||||
| gist | |||||
| mercurial | |||||
| docbook5 | |||||
| entr | |||||
| emacs | |||||
| gnupg1compat | |||||
| gnutar | |||||
| gnumake | |||||
| sloccount | |||||
| cloc | |||||
| less | |||||
| multitail | |||||
| rlwrap | |||||
| gdbm | |||||
| mosh | |||||
| htop | |||||
| imagemagick | |||||
| keychain | |||||
| silver-searcher | |||||
| aspell | |||||
| aspellDicts.en | |||||
| openssl | |||||
| pinentry | |||||
| pbzip2 | |||||
| pigz | |||||
| pv | |||||
| postgresql | |||||
| readline | |||||
| rsync | |||||
| sqlite | |||||
| texLiveFull | |||||
| tmux | |||||
| tree | |||||
| wget | |||||
| wakelan | |||||
| unzip | |||||
| upx | |||||
| xz | |||||
| multimarkdown | |||||
| jq | |||||
| # rtags broken again on osx, fix it | |||||
| p7zip | |||||
| unrar | |||||
| watch | |||||
| nox | |||||
| mutt | |||||
| duply | |||||
| zsh | |||||
| pylint | |||||
| python27Packages.howdoi | |||||
| python27Packages.youtube-dl | |||||
| python27Packages.pyflakes | |||||
| python27Packages.flake8 | |||||
| python27Packages.virtualenv | |||||
| python27Packages.pip | |||||
| # xhyve compiles normally, figure out hypervisor framework issue | |||||
| # lastpass-cli no worky on osx TODO fix this it works on homebrew | |||||
| ]; | |||||
| }; | |||||
| env_hs = | |||||
| pkgs.haskell.packages.ghc7103.ghcWithPackages | |||||
| (haskellPackages: with haskellPackages; [ | |||||
| alex | |||||
| happy | |||||
| bake | |||||
| cabal-dependency-licenses | |||||
| cabal-install | |||||
| cabal-meta | |||||
| ghc-core | |||||
| ghc-mod | |||||
| hasktags | |||||
| hindent | |||||
| hoogle | |||||
| hspec | |||||
| # idris # zlib is complaining for some reason, hmmm | |||||
| pandoc | |||||
| shake | |||||
| ShellCheck | |||||
| stack | |||||
| stylish-haskell | |||||
| nats | |||||
| transformers-compat | |||||
| ] | |||||
| ); | |||||
| }; | |||||
| } | |||||
| #+END_SRC | |||||
| * Language related | |||||
| ** Haskell | |||||
| *** ~/.ghci | |||||
| Ghci setup, mostly just cosmetics. | |||||
| #+BEGIN_SRC haskell :tangle tmp/.ghci :results replace | |||||
| :l ~/.ghc.hs | |||||
| :set prompt "λ " | |||||
| :set +t | |||||
| #+END_SRC | |||||
| *** ~/.ghc.hs | |||||
| What to automatically have loaded into ghci sessions. | |||||
| #+BEGIN_SRC haskell :tangle tmp/.ghc.hs :results replace | |||||
| import Control.Applicative | |||||
| import Control.Monad | |||||
| import Data.Monoid | |||||
| import Data.Maybe | |||||
| import Data.List | |||||
| import Data.Bool | |||||
| import qualified Data.Set as S | |||||
| import qualified Data.Map as M | |||||
| #+END_SRC | |||||
| ** Perl | |||||
| *** ~/.perlcriticrc | |||||
| What to complain about by default. | |||||
| #+BEGIN_SRC conf :tangle tmp/.perlcritirc :results replace | |||||
| # Show the severity level | |||||
| severity = 1 | |||||
| # Basically show what profile is complaining | |||||
| verbose = %f:%l:%c: %m, %e (%p, severity %s)\n | |||||
| # Don't warn on these variables | |||||
| [Variables::ProhibitPunctuationVars] | |||||
| allow = $@ $! | |||||
| # Ignore syscall returns on print, it not actually returning is... whatever. | |||||
| [InputOutput::RequireCheckedSyscalls] | |||||
| exclude_functions = print say | |||||
| # Allow things like print qx(somecmd) in a void context to work, this is ok. | |||||
| [InputOutput::ProhibitBacktickOperators] | |||||
| only_in_void_context = 1 | |||||
| # I actually like using unless... so don't piss me off whinging about it | |||||
| [-ControlStructures::ProhibitUnlessBlocks] | |||||
| # The following only apply to modules | |||||
| [-Modules::RequireVersionVar] | |||||
| [-ErrorHandling::RequireCarping] | |||||
| # Tabs suck, no | |||||
| [CodeLayout::ProhibitHardTabs] | |||||
| allow_leading_tabs = 0 | |||||
| # For small regexes, no /x at the end is fine, 12 should be enough | |||||
| [RegularExpressions::RequireExtendedFormatting] | |||||
| minimum_regex_length_to_complain_about = 12 | |||||
| # These are kosher kthxbai | |||||
| [ControlStructures::ProhibitPostfixControls] | |||||
| allow = for if until unless | |||||
| # For POE, we do things like my $foo = $_[HEAP]; and thats OK | |||||
| [Subroutines::RequireArgUnpacking] | |||||
| allow_subscripts = 1 | |||||
| # For POD documentation, I don't care about required sections. | |||||
| [Documentation::RequirePodSections] | |||||
| lib_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO | |||||
| script_sections = NAME | SYNOPSIS | DESCRIPTION | AUTHOR | COPYRIGHT | SEE ALSO | |||||
| # This is for POD documentation mainly. | |||||
| [CodeLayout::ProhibitHardTabs] | |||||
| allow_leading_tabs = 1 | |||||
| #+END_SRC | |||||
| *** ~/.perltidyrc | |||||
| Control how perltidy should clean things up. | |||||
| #+BEGIN_SRC conf :tangle tmp/.perltidyrc :results replace | |||||
| # cuddled elses pls | |||||
| -ce | |||||
| # indent 2 spaces | |||||
| -i=2 | |||||
| # for tokens with things like arrays, start the data next line down one indent in | |||||
| -lp | |||||
| # align closing tokens for things like arrays with the opening token | |||||
| -cti=1 | |||||
| # default, but spaces between multiple entries, none with one arg | |||||
| -pt=1 | |||||
| # line encoding | |||||
| -ole=unix | |||||
| # braces not on new line | |||||
| -nsbl | |||||
| # stack opening tokens, don't create a new line with one token, note no stacking of closing tokens | |||||
| -sot | |||||
| # no space before ;'s in for loops | |||||
| -nsfs | |||||
| # Make curly braces act more like the args param | |||||
| -bbt=1 | |||||
| # Trim qw whitespaces | |||||
| -tqw | |||||
| #+END_SRC | |||||
| * Misc | |||||
| Stuff that logically doesn't fit elsewhere or in any other category. | |||||
| ** ~/.dir_colors | |||||
| For BSD ps, make colors closer to what the GNU utilities produce by default. | |||||
| #+BEGIN_SRC conf :tangle tmp/.dir_colors :results replace | |||||
| COLOR tty | |||||
| TERM ansi | |||||
| TERM color-xterm | |||||
| TERM con132x25 | |||||
| TERM con132x30 | |||||
| TERM con132x43 | |||||
| TERM con132x60 | |||||
| TERM con80x25 | |||||
| TERM con80x28 | |||||
| TERM con80x30 | |||||
| TERM con80x43 | |||||
| TERM con80x50 | |||||
| TERM con80x60 | |||||
| TERM cons25 | |||||
| TERM console | |||||
| TERM cygwin | |||||
| TERM dtterm | |||||
| TERM eterm-color | |||||
| TERM Eterm | |||||
| TERM gnome | |||||
| TERM konsole | |||||
| TERM kterm | |||||
| TERM linux | |||||
| TERM linux-c | |||||
| TERM mach-color | |||||
| TERM putty | |||||
| TERM rxvt | |||||
| TERM rxvt-cygwin | |||||
| TERM rxvt-cygwin-native | |||||
| TERM rxvt-unicode | |||||
| TERM screen | |||||
| TERM screen-bce | |||||
| TERM screen-w | |||||
| TERM screen.linux | |||||
| TERM vt100 | |||||
| TERM xterm | |||||
| TERM xterm-256color | |||||
| TERM xterm-color | |||||
| TERM xterm-debian | |||||
| # Below are the color init strings for the basic file types. A color init | |||||
| # string consists of one or more of the following numeric codes: | |||||
| # Attribute codes: | |||||
| # 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed | |||||
| # Text color codes: | |||||
| # 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white | |||||
| # Background color codes: | |||||
| # 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white | |||||
| NORMAL 00 # global default, although everything should be something. | |||||
| FILE 00 # normal file | |||||
| DIR 01;34 # directory | |||||
| LINK 01;36 # symbolic link. (If you set this to 'target' instead of a | |||||
| # numerical value, the color will match the file pointed to) | |||||
| FIFO 40;33 # pipe | |||||
| SOCK 01;35 # socket | |||||
| DOOR 01;35 # door | |||||
| BLK 40;33;01 # block device driver | |||||
| CHR 40;33;01 # character device driver | |||||
| ORPHAN 01;05;37;41 # orphaned syminks | |||||
| MISSING 01;05;37;41 # ... and the files they point to | |||||
| # This is for files with execute permission: | |||||
| EXEC 01;32 | |||||
| # List any file extensions like '.gz' or '.tar' that you would like ls | |||||
| # to colorize below. Put the extension, a space, and the color init string. | |||||
| # (and any comments you want to add after a '#') | |||||
| .cmd 01;32 # executables (bright green) | |||||
| .exe 01;32 | |||||
| .com 01;32 | |||||
| .btm 01;32 | |||||
| .bat 01;32 | |||||
| .sh 01;32 | |||||
| .csh 01;32 | |||||
| .ksh 01;32 | |||||
| .zsh 01;32 | |||||
| .tar 01;31 # archives / compressed (bright red) | |||||
| .tgz 01;31 | |||||
| .arj 01;31 | |||||
| .taz 01;31 | |||||
| .lzh 01;31 | |||||
| .zip 01;31 | |||||
| .z 01;31 | |||||
| .Z 01;31 | |||||
| .gz 01;31 | |||||
| .bz2 01;31 | |||||
| .bz 01;31 | |||||
| .tbz2 01;31 | |||||
| .tz 01;31 | |||||
| .deb 01;31 | |||||
| .rpm 01;31 | |||||
| .rar 01;31 # app-arch/rar | |||||
| .ace 01;31 # app-arch/unace | |||||
| .zoo 01;31 # app-arch/zoo | |||||
| .cpio 01;31 # app-arch/cpio | |||||
| .7z 01;31 # app-arch/p7zip | |||||
| .rz 01;31 # app-arch/rzip | |||||
| #+END_SRC | |||||
| ** ~/.hushlogin | |||||
| Because who gives a rats when and where I last logged on from? | |||||
| #+BEGIN_SRC conf :tangle tmp/.hushlogin :results replace | |||||
| #+END_SRC | |||||
| | name | file | | |||||
| |---------+-------------| | |||||
| | haskell | [[file:haskell.org][haskell.org]] | | |||||
| | perl | [[file:perl.org][perl.org]] | | |||||
| * TODO | |||||
| - [ ] Figure out some way to make code blocks editable with :tangle, it sucks not being able to edit blocks as they are. | |||||
| - [ ] Need to have some way to autocleanup old generations. Rm works for now so meh. | |||||
| - [ ] Need to add the ability to detect that make is generating a pointless new generation. Aka generation N and generation N-1 are the same, just leave N and don't increment. | |||||
| - [ ] Maybe checksum file contents somehow and use that? | |||||
| - [ ] More? For now its functional. | |||||
| * Reference for babel stuff | * Reference for babel stuff | ||||
| @@ -0,0 +1,22 @@ | |||||
| ;;-*-mode: emacs-lisp; coding: utf-8;-*- | |||||
| ;; File: tangle.el | |||||
| ;; Load the default options used or what was passed in as OPTIONS | |||||
| (defun load-defaults-or-options () | |||||
| (load-file (if (getenv "OPTIONS") | |||||
| (concat (concat "./" (getenv "OPTIONS")) ".el") | |||||
| "./defaults.el"))) | |||||
| ;; Define functions we use in :tangle blocks | |||||
| ;; tangle/yn | |||||
| ;; tangle to "yes" or "no" if the predicate given exists and defined as t. | |||||
| ;; | |||||
| ;; Iff predicate is bound, and t, "yes" | |||||
| ;; rest is "no" | |||||
| (defun tangle/yn (p) (load-defaults-or-options) (if (bound-and-true-p p) "yes" "no")) | |||||
| ;; tangle/file | |||||
| ;; tangle to filename if predicate is bound and t | |||||
| ;; Note, prepends tmp/ to the filename to conform to match expected layout | |||||
| (defun tangle/file (p file) (load-defaults-or-options) (if (bound-and-true-p p) (concat "tmp/" file) "no")) | |||||
| @@ -0,0 +1,152 @@ | |||||
| #+TITLE: Tmux Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no | |||||
| Tmux configuration. Pretty boring in most ways. | |||||
| #+BEGIN_SRC conf :tangle (tangle/file tmux-p ".tmux.conf") | |||||
| # Setup utf8 by default and vi mode | |||||
| set-window-option -g utf8 on | |||||
| set-window-option -g mode-keys vi | |||||
| set-window-option -g aggressive-resize on | |||||
| # Force zsh to be a login shell | |||||
| set-option -g default-command 'zsh -l' | |||||
| set-option -g default-terminal 'xterm-256color' | |||||
| # Status line options, mainly coloring | |||||
| set-window-option -g window-status-bg colour6 | |||||
| set-window-option -g window-status-fg black | |||||
| set-window-option -g window-status-current-bg white | |||||
| # Status line options | |||||
| set-option -g status-bg black | |||||
| set-option -g status-fg colour7 | |||||
| set-option -g status-left-length 24 | |||||
| set-option -g status-left '' | |||||
| set-option -g status-right-length 13 | |||||
| set-option -g status-right "%a %H:%M:%S" | |||||
| set-option -g status-interval 7 | |||||
| set-option -g status-utf8 on | |||||
| # Pane border options, mimics the status line coloring | |||||
| set-option -g pane-border-bg colour15 | |||||
| set-option -g pane-border-fg colour82 | |||||
| set-option -g pane-active-border-bg colour15 | |||||
| set-option -g pane-active-border-fg colour2 | |||||
| # Alert related things | |||||
| set-option -g visual-activity on | |||||
| set-option -g visual-bell on | |||||
| set-option -g message-bg colour7 | |||||
| set-option -g message-fg black | |||||
| # Pass through the window title and display it automatically on changes. | |||||
| set-option -g set-titles on | |||||
| set-option -g set-titles-string '#T' | |||||
| set-window-option -g automatic-rename on | |||||
| # Key rebinding to make things more au naturalle | |||||
| bind-key R \ | |||||
| source-file ~/.tmux.conf \;\ | |||||
| display 'reloaded tmux config' | |||||
| # Log pane output to a file, save with an iso8601 datestamp | |||||
| bind-key o \ | |||||
| pipe-pane -o "cat >> $HOME/tmux-`iso8601`.log" \;\ | |||||
| set-window-option window-status-current-fg green \; | |||||
| bind-key O \ | |||||
| pipe-pane \;\ | |||||
| set-window-option window-status-current-fg default \; | |||||
| bind-key N new-session -t default | |||||
| # Using s for synchronizing panes, means that s for choosing sessions | |||||
| # is now e | |||||
| unbind-key s # interactive select sessions | |||||
| bind-key e choose-tree | |||||
| # (un)synchronize panes with prefix-s | |||||
| bind-key s \ | |||||
| if-shell \ | |||||
| "tmux show-window-options | grep 'synchronize-panes on'" \ | |||||
| "set-window-option window-status-current-bg colour7; \ | |||||
| set-window-option pane-active-border-fg colour2; \ | |||||
| set-window-option pane-active-border-bg colour15; \ | |||||
| set-window-option synchronize-panes off; \ | |||||
| display 'synchronization off'" \ | |||||
| "set-window-option window-status-current-bg red; \ | |||||
| set-window-option pane-active-border-fg red; \ | |||||
| set-window-option pane-active-border-bg colour15; \ | |||||
| set-window-option synchronize-panes on; \ | |||||
| display 'synchronizing'" | |||||
| # same thing as ^ so it sets up things if we were started with | |||||
| # something else that set synchronization. | |||||
| if-shell \ | |||||
| "tmux show-window-options | grep 'synchronize-panes on' || /bin/true" \ | |||||
| "set-window-option window-status-current-bg red; \ | |||||
| set-window-option pane-active-border-fg yellow; \ | |||||
| set-window-option pane-active-border-bg red" | |||||
| # Setup splits to be less annoying | |||||
| bind-key \ split-window -h | |||||
| bind-key - split-window -v | |||||
| # vi keybindings for pane navigation | |||||
| bind-key k select-pane -U | |||||
| bind-key j select-pane -D | |||||
| bind-key h select-pane -L | |||||
| bind-key l select-pane -R | |||||
| # Make it so that I can detach/etc while holding control down, | |||||
| # PURE LAZY | |||||
| bind-key C-d detach | |||||
| bind-key C-n next-window | |||||
| bind-key C-p previous-window | |||||
| bind-key C-k select-pane -U | |||||
| bind-key C-j select-pane -D | |||||
| bind-key C-h select-pane -L | |||||
| bind-key C-l select-pane -R | |||||
| # Non confirming kill pane plskthxbai | |||||
| bind-key x kill-pane | |||||
| # In case something I run exits straight away, i'd like to know about it. | |||||
| set-option -g set-remain-on-exit on | |||||
| # Lets change the prefix key so we don't clobber emacs back one char key | |||||
| unbind-key C-b | |||||
| # hacky, but C-\ isn't used by anything overly important in emacs | |||||
| set-option -g prefix 'C-\' | |||||
| # two C-\'s == C-\, if i need it, likely not | |||||
| bind 'C-\' send-prefix | |||||
| # Delay in sending things is dumb | |||||
| set-option -s escape-time 1 | |||||
| # so we can scroll the mouse, select panes, etc... | |||||
| set -g mouse on | |||||
| bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'" | |||||
| bind-key m \ | |||||
| if-shell \ | |||||
| "tmux show-options -g | grep 'mouse on'" \ | |||||
| "set -g mouse off; \ | |||||
| display 'Mouse modes off'" \ | |||||
| "set -g mouse on; \ | |||||
| display 'Mouse modes on'" | |||||
| #+END_SRC | |||||
| Only set xclip for x setup. | |||||
| #+BEGIN_SRC conf :tangle (eq (tangle/file tmux-p ".tmux.conf") (tangle/file x-p ".tmux.conf")) | |||||
| bind C-p run "tmux set-buffer \"$(xclip -o)\"; tmux paste-buffer" | |||||
| bind C-y run "tmux save-buffer - | xclip -i" | |||||
| #+END_SRC | |||||
| @@ -0,0 +1,36 @@ | |||||
| #+TITLE: Vim Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no :tangle tmp/.vimrc | |||||
| What remains of my days from being a vim user. | |||||
| #+BEGIN_SRC conf :tangle tmp/.vimrc :results replace | |||||
| set nocompatible | |||||
| set backspace=indent,eol,start | |||||
| set history=50 " keep 50 lines of command line history | |||||
| set ruler " show the cursor position all the time | |||||
| set showcmd " display incomplete commands | |||||
| set incsearch " do incremental searching | |||||
| map Q gq | |||||
| if &t_Co > 2 || has("gui_running") | |||||
| syntax on | |||||
| set hlsearch | |||||
| endif | |||||
| if has("autocmd") | |||||
| filetype plugin indent on | |||||
| augroup vimrcEx | |||||
| au! | |||||
| autocmd FileType text setlocal textwidth=78 | |||||
| autocmd BufReadPost * | |||||
| \ if line("'\"") > 0 && line("'\"") <= line("$") | | |||||
| \ exe "normal g`\"" | | |||||
| \ endif | |||||
| augroup END | |||||
| else | |||||
| set autoindent " always set autoindenting on | |||||
| endif " has("autocmd") | |||||
| #+END_SRC | |||||
| @@ -0,0 +1,103 @@ | |||||
| #+TITLE: X Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no | |||||
| X related configuration, nothing overly huge to be honest just stupid configuration. | |||||
| * ~/.Xdefaults | |||||
| :PROPERTIES: | |||||
| :header-args: :tangle (when (eq x-p t) "tmp/.Xdefaults") :comments no :padline no :cache yes :mkdirp yes | |||||
| :END: | |||||
| X defaults, just urxvt for the moment. Slightly linux/bsd only but not really. | |||||
| #+BEGIN_SRC conf | |||||
| ! urxvt generalish stuff | |||||
| ! | |||||
| urxvt*termName: rxvt-256color | |||||
| urxvt*font: xft:menlo:size=12:antialias=true | |||||
| urxvt*perl-ext-common: default,matcher | |||||
| urxvt*jumpScroll: true | |||||
| urxvt*cursorColor: pink | |||||
| urxvt*loginShell: true | |||||
| urxvt*scrollBar: true | |||||
| urxvt*scrollstyle: next | |||||
| urxvt*scrollBar_right: true | |||||
| urxvt*scrollTtyOutput: false | |||||
| urxvt*cursorBlink: true | |||||
| urxvt*saveLines: 10000 | |||||
| urxvt*urlLauncher: /usr/bin/google-chrome | |||||
| urxvt*matcher.button: 1 | |||||
| urxvt*allowWindowOps: true | |||||
| #+END_SRC | |||||
| * ~/.Xmodmap | |||||
| :PROPERTIES: | |||||
| :header-args: :tangle (when (eq x-p t) "tmp/.Xmodmap") :comments no :padline no :cache yes :mkdirp yes | |||||
| :END: | |||||
| Swap around left/right clicks basically. | |||||
| #+BEGIN_SRC conf :tangle (when (not (and (eq x-p t) (eq osx-p t))) "tmp/.Xmodmap") | |||||
| pointer = 3 2 1 4 5 | |||||
| #+END_SRC | |||||
| OSX is odd/inverted cause reasons (who cares why). | |||||
| #+BEGIN_SRC conf :tangle (when (and (eq x-p t) (eq osx-p t)) "tmp/.Xmodmap") | |||||
| pointer = 1 2 3 4 5 | |||||
| #+END_SRC | |||||
| * ~/.Xresources | |||||
| :PROPERTIES: | |||||
| :header-args: :tangle (when (eq x-p t) "tmp/.Xresources") :comments no :padline no :cache yes :mkdirp yes | |||||
| :END: | |||||
| I can't remember why I did all this effort. But I'll remove it some year I bet. | |||||
| #+BEGIN_SRC conf | |||||
| #define brightblack #ffffff | |||||
| #define normblack #f9f9f9 | |||||
| #define normgreen #00cc33 | |||||
| #define brightgreen #00cc99 | |||||
| #define normblue #f00033 | |||||
| #define brightblue #0099ff | |||||
| #define normcyan #66ccff | |||||
| #define brightcyan #66ccff | |||||
| #define normwhite #060606 | |||||
| #define brightwhite #000000 | |||||
| #define normyellow #ffcc33 | |||||
| #define brightyellow #ffcc33 | |||||
| #define normred #ff3300 | |||||
| #define brightred #ff3300 | |||||
| #define normmagenta #ff66ff | |||||
| #define brightmagenta #ff66ff | |||||
| *background: normblack | |||||
| *foreground: normwhite | |||||
| *fading: 40 | |||||
| *fadeColor: brightblack | |||||
| *cursorColor: brightcyan | |||||
| *pointerColorBackground: #3f3f3f | |||||
| *pointerColorForeground: #f3f3f3 | |||||
| *color0: #090909 | |||||
| *color1: #f00000 | |||||
| *color2: normgreen | |||||
| *color3: normyellow | |||||
| *color4: #0066ff | |||||
| *color5: normmagenta | |||||
| *color6: normcyan | |||||
| *color7: #c8c8c8 | |||||
| *color8: #888888 | |||||
| *color9: #f00033 | |||||
| *color10: brightgreen | |||||
| *color11: brightyellow | |||||
| *color12: #0099ff | |||||
| *color13: brightmagenta | |||||
| *color14: brightcyan | |||||
| *color15: #f9f9f9 | |||||
| #+END_SRC | |||||
| @@ -0,0 +1,197 @@ | |||||
| #+TITLE: Zsh Configuration | |||||
| #+AUTHOR: Mitch Tishmack | |||||
| #+STARTUP: hidestars | |||||
| #+STARTUP: odd | |||||
| #+BABEL: :cache yes | |||||
| #+PROPERTY: header-args :cache yes :padline no :mkdirp yes :comments no | |||||
| ~/.zshrc and ~/.zprofile setup. Nothing too special. | |||||
| * ~/.zprofile | |||||
| Make sure that zsh sources ~/.profile correctly on login. | |||||
| #+BEGIN_SRC sh :tangle tmp/.zprofile :results replace | |||||
| emulate sh | |||||
| source ~/.profile | |||||
| emulate zsh | |||||
| # zsh does this differently | |||||
| login_shell() | |||||
| { | |||||
| [[ -o login ]] | |||||
| } | |||||
| #+END_SRC | |||||
| * ~/.zshrc | |||||
| Zsh configuration, its not too crazy... I think. Don't judge me. | |||||
| #+BEGIN_SRC sh :tangle tmp/.zshrc :results replace | |||||
| #-*-mode: Shell-script; coding: utf-8;-*- | |||||
| # zsh specific global aliases | |||||
| alias -g silent="> /dev/null 2>&1" | |||||
| alias -g noerr="2> /dev/null" | |||||
| alias -g stdboth="2>&1" | |||||
| # mainly for firefox, because it can suck up the cycles, but not when | |||||
| # in a SIGSTOP state you can't use any power then firefox. | |||||
| alias -g sigcont='kill -CONT ' | |||||
| alias -g sigstop='kill -STOP ' | |||||
| # Keybindings, what few there are. | |||||
| bindkey -v | |||||
| bindkey '^P' push-line # Saves the current line and returns to it afterwards. | |||||
| # General history options | |||||
| export HISTSIZE=5000 | |||||
| export SAVEHIST=${HISTSIZE} | |||||
| export HISTFILE=~/.zsh_history | |||||
| # I like my options | |||||
| setopt append_history | |||||
| setopt extended_history | |||||
| setopt hist_reduce_blanks | |||||
| setopt hist_no_store | |||||
| setopt hist_ignore_dups | |||||
| setopt histignorespace | |||||
| setopt no_hist_beep | |||||
| setopt no_list_beep | |||||
| setopt share_history | |||||
| setopt inc_append_history | |||||
| setopt auto_menu | |||||
| setopt bash_auto_list | |||||
| # Options that don't need to be set. | |||||
| unsetopt bad_pattern # No, don't warn me on bad file patterns kthxbai. | |||||
| # The rest of the story (tm) (c) (r) in option settings. | |||||
| setopt equals | |||||
| setopt notify | |||||
| setopt auto_cd | |||||
| setopt glob_dots | |||||
| setopt print_exit_value # I love you zsh for this, print out non zero exits. | |||||
| other_term() | |||||
| { | |||||
| case $TERM in | |||||
| *xterm*|*rxvt*|(dt|k|e)term) | |||||
| print -Pn "\e]2;%~\a" | |||||
| ;; | |||||
| sun-cmd) | |||||
| print -Pn "\e]l%~\e\\" | |||||
| ;; | |||||
| *) | |||||
| ;; | |||||
| esac | |||||
| } | |||||
| chpwd() | |||||
| { | |||||
| [[ -o interactive ]] || return | |||||
| case $TERM in | |||||
| eterm-color) # getting emacs terminal to not be annoying... sucks | |||||
| print -Pn "" | |||||
| ;; | |||||
| *) | |||||
| if [[ $SSH_TTY != '' ]]; then | |||||
| case $ORIG_TERM in | |||||
| eterm-color) | |||||
| print -Pn "" | |||||
| ;; | |||||
| *) | |||||
| other_term | |||||
| ;; | |||||
| esac | |||||
| fi | |||||
| ;; | |||||
| esac | |||||
| } | |||||
| # Needs to be reviewed a bit. | |||||
| zstyle ':completion:*' squeeze-slashes true | |||||
| zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS} | |||||
| zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#)*=0=01;31' | |||||
| zstyle ':completion:*:*:*:*:processes' force-list always | |||||
| # No need to setup ssh known host parsing as root, just regular users. | |||||
| # This is pretty old using compctl, need to update eventually. | |||||
| if [[ "$LOGNAME" != "root" ]]; then | |||||
| zmodload zsh/mathfunc | |||||
| if [[ -f "$HOME/.ssh/known_hosts" ]]; then | |||||
| hosts=(${${${${(f)"$(<$HOME/.ssh/known_hosts)"}:#[0-9]*}%%\ *}%%,*}) | |||||
| zstyle ':completion:*:(ssh|scp|cssh):*' hosts $hosts | |||||
| zstyle ':completion:*:*:*:hosts-host' ignored-patterns '|1|*' loopback localhost | |||||
| fi | |||||
| zstyle ':completion:::complete*' use-cache 1 | |||||
| # This really should be closer to the definition of extract. | |||||
| compctl -g '*.tar.bz2 *.tbz2 *.tbz *.tar.gz *.tgz *.bz2 *.gz *.jar *.zip *.rar *.tar *.Z *.tZ *.tar.Z' + -g '*(-/)' extract | |||||
| fi | |||||
| # More history options for newer zsh versions | |||||
| setopt share_history | |||||
| setopt hist_save_no_dups | |||||
| setopt hist_find_no_dups | |||||
| setopt hist_no_functions | |||||
| setopt hist_expire_dups_first | |||||
| bindkey ' ' magic-space # Complete spaces too dammit, i'm lazy. | |||||
| alias edirs='ls -d **/*(/^F)' # empty directories | |||||
| zstyle ':completion:*:*:kill:*' menu yes select | |||||
| zstyle ':completion:*:kill:*' force-list always | |||||
| zstyle ':completion:*:kill:*:processes' command "ps x" | |||||
| zstyle ':completion:*' menu select=2 | |||||
| autoload -U compinit | |||||
| autoload -U colors && colors | |||||
| autoload -Uz vcs_info | |||||
| bindkey -e | |||||
| local userat="%{$fg[blue]%}%n%(!.%{$fg[red]%}.%{$fg[blue]%})%{$reset_color%}%B@%b%{$fg[blue]%}%m%b" | |||||
| local pwd="%B%~%b" | |||||
| local userchar="%(!.#.$)" | |||||
| zstyle ':vcs_info:*' enable git | |||||
| zstyle ':vcs_info:*' check-for-changes true | |||||
| setopt prompt_subst | |||||
| precmd() | |||||
| { | |||||
| vcs_info | |||||
| } | |||||
| # +N/-N upstream info | |||||
| function +vi-git-st() { | |||||
| local ahead behind | |||||
| local -a gitstatus | |||||
| ahead=$(git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l | sed -e 's|^ *||g') | |||||
| behind=$(git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l | sed -e 's|^ *||g') | |||||
| (( $ahead )) && gitstatus+=( "+${ahead}" ) | |||||
| (( $behind )) && gitstatus+=( "-${behind}" ) | |||||
| hook_com[misc]+=${(j:/:)gitstatus} | |||||
| } | |||||
| # Untracked crap in the repo not covered by .gitignore? | |||||
| function +vi-git-untracked(){ | |||||
| if [[ $(git rev-parse --is-inside-work-tree 2> /dev/null) == 'true' ]] && \ | |||||
| git status --porcelain | grep '??' &> /dev/null ; then | |||||
| hook_com[staged]+="%{$fg[red]%}N" | |||||
| fi | |||||
| } | |||||
| local branch="%{$fg[green]%}%b%c%u%{$fg[green]%}%{$reset_color%}" | |||||
| zstyle ':vcs_info:*' formats "%m $branch" | |||||
| zstyle ':vcs_info:*' actionformats "%a $branch" | |||||
| zstyle ':vcs_info:*' stagedstr "%{$fg[blue]%}S" | |||||
| zstyle ':vcs_info:*' unstagedstr "%{$fg[blue]%}M" | |||||
| zstyle ':vcs_info:git*+set-message:*' hooks git-untracked git-st | |||||
| PROMPT="%(!.#.$) " # $ as a user # as root | |||||
| RPROMPT='${vcs_info_msg_0_} ${PWD/#$HOME/~}' | |||||
| #+END_SRC | |||||