diff --git a/README.md b/README.md index 260f986..7495af9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,31 @@ -Dotfiles and Scripts -==================== +## dotfiles, shell scripts, and other scripts (decades of *nix 🐧) -Some sample of my config files (note: this is kinda like from years ago, but have fun) +
-OBVIOUSLY I DON'T INCLUDE SENSITIVE PARTS. +* **[bash scripts](shell_scripts)** +* **[awk](awk)** +* **[chef](chef)** +* **[git](git)** +* **[pgp](gpg)** +* **[tmux](tmux)** +* **[iterm](iterm)** +* **[network](network)** +* **[gcloud](gcloud)** +* **[vim](vim)** +* **[vscode](vscode)** +* **[vpn](vpn)** +* **[elastic search](elasticsearch)** +* **[data science](data_science)** +* **[ubuntu](ubuntu)** +* **[funny](funny)** -Some bash scripts, examples and useful stuff. +
+--- +### external resources + +
+ +* **[google style guide for shell](https://github.com/google/styleguide/blob/gh-pages/shellguide.md)** +* **[create a new ssh key](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) and [add to github](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account)** diff --git a/shell_scripts/power_user_awk/AWK_TIPS.txt b/awk/AWK_TIPS.md similarity index 93% rename from shell_scripts/power_user_awk/AWK_TIPS.txt rename to awk/AWK_TIPS.md index 326a431..3934e8b 100644 --- a/shell_scripts/power_user_awk/AWK_TIPS.txt +++ b/awk/AWK_TIPS.md @@ -3,19 +3,26 @@ Data Manipulation Print elements in the column 3 that has the word "good" in the other columns + +``` $ awk '/good/ { print $3 }' inventory +``` Syntax: + +``` $ awk -f {PROGRAM FILE} FILENAME +``` awk program is: +``` PATTERN{ ACTION 1 ACTION 2 ACTION 3 } - +``` . (Dot) Match any character * Match zero or more character @@ -30,9 +37,10 @@ $ Match end of line -IF CONDITION +IF condition ------------ +``` if (condition) { Statement 1 @@ -47,7 +55,5 @@ else Statement N if condition is FALSE } +``` - -FOR LOOP --------- \ No newline at end of file diff --git a/shell_scripts/power_user_awk/TIPS.txt b/awk/TIPS.txt similarity index 100% rename from shell_scripts/power_user_awk/TIPS.txt rename to awk/TIPS.txt diff --git a/shell_scripts/power_user_awk/file_directory_example.awk b/awk/file_directory_example.awk similarity index 100% rename from shell_scripts/power_user_awk/file_directory_example.awk rename to awk/file_directory_example.awk diff --git a/shell_scripts/power_user_awk/for_loop.awk b/awk/for_loop.awk similarity index 100% rename from shell_scripts/power_user_awk/for_loop.awk rename to awk/for_loop.awk diff --git a/shell_scripts/power_user_awk/math1.awk b/awk/math1.awk similarity index 100% rename from shell_scripts/power_user_awk/math1.awk rename to awk/math1.awk diff --git a/shell_scripts/power_user_awk/math2.awk b/awk/math2.awk similarity index 100% rename from shell_scripts/power_user_awk/math2.awk rename to awk/math2.awk diff --git a/chef/README.md b/chef/README.md new file mode 100644 index 0000000..55a1264 --- /dev/null +++ b/chef/README.md @@ -0,0 +1,47 @@ +## Chef Commands + +Roles contain recipes: + +``` +$ knife role list +``` + +All the recipes that are in that role + +``` +$ knife role show +``` + +To see the nodes: + +``` +$ knife node list +$ knife node show +``` + +To register a brand new machine with chef + +``` +$ knife bootstrap +``` +This will SSH into the machine, download chef package, install chef to `/opt`, and get it running and registered with the chef server, see `~/.chef/knife.rb`, + + +Before adding/pushing a change in chef + +``` +$ knife spork role from file roles/key.json +$ knife spork omni logstash --remote +``` + +when logstash version: + +``` +$ knife spork bump logstash +``` + +then + +``` +$ knife spork omni logstash --remote +``` diff --git a/configs/tmux.conf b/configs/tmux.conf deleted file mode 100644 index b2b8bb1..0000000 --- a/configs/tmux.conf +++ /dev/null @@ -1,58 +0,0 @@ -# Change prefix key to Ctrl+p -# unbind C-b -# set -g prefix C-p - -# More straight forward key bindings for splitting -unbind % -bind | split-window -h -unbind '"' -bind - split-window -v - -# History -set -g history-limit 10000 - -# Terminal emulator window title -set -g set-titles on -set -g set-titles-string '[#S:#I.#H] #W' - -# Status Bar -set-option -g status-bg white -set-option -g status-fg black - -# Notifying if other windows has activities -setw -g monitor-activity off -set -g visual-activity on - - -# Clock -#setw -g clock-mode-colour green -#setw -g clock-mode-style 24 - -# Mouse Support -set -g mode-mouse on -set -g mouse-resize-pane on -set -g mouse-select-pane on -set -g mouse-select-window on - -# Add SSH_TTY to the list of environment variables tmux knows about: -set-option -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY SSH_TTY" - -# Assume terminals want 256 colors -set-option -g default-terminal screen-256color - -# Colors -# Status bar has a dim gray background -set-option -g status-bg colour234 -set-option -g status-fg colour74 -# Left shows the session name, in blue -set-option -g status-left-bg default -set-option -g status-left-fg colour74 -# Right is some CPU stats, so terminal green -set-option -g status-right-bg default -set-option -g status-right-fg colour71 -# Highlighting the active window in status bar -setw -g window-status-current-bg colour234 -setw -g window-status-current-fg colour71 - -new-session - diff --git a/configs/vim/.netrwhist b/configs/vim/.netrwhist deleted file mode 100644 index b9c4d99..0000000 --- a/configs/vim/.netrwhist +++ /dev/null @@ -1,3 +0,0 @@ -let g:netrw_dirhistmax =10 -let g:netrw_dirhist_cnt =1 -let g:netrw_dirhist_1='/Users/bt3_/Projects/blog/blog/output/author' diff --git a/configs/vim/bundle/ctrlp.vim b/configs/vim/bundle/ctrlp.vim deleted file mode 160000 index b5d3fe6..0000000 --- a/configs/vim/bundle/ctrlp.vim +++ /dev/null @@ -1 +0,0 @@ -Subproject commit b5d3fe66a58a13d2ff8b6391f4387608496a030f diff --git a/configs/vim/bundle/nerdtree b/configs/vim/bundle/nerdtree deleted file mode 160000 index 96c0774..0000000 --- a/configs/vim/bundle/nerdtree +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 96c07746b46c12d0aca7a5276cc5bd0a260b82fe diff --git a/configs/vim/bundle/python-mode b/configs/vim/bundle/python-mode deleted file mode 160000 index 9c8468e..0000000 --- a/configs/vim/bundle/python-mode +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 9c8468e83232c3e45b730d2d0b28d609053dec05 diff --git a/configs/vim/bundle/vim-airline b/configs/vim/bundle/vim-airline deleted file mode 160000 index 78566c3..0000000 --- a/configs/vim/bundle/vim-airline +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 78566c37aeb3b7609eee84a7b10114a0f512830e diff --git a/configs/vim/bundle/vim-fugitive b/configs/vim/bundle/vim-fugitive deleted file mode 160000 index 1c84437..0000000 --- a/configs/vim/bundle/vim-fugitive +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 1c844375fa2762e3b7c16294fa36afee6fef28b1 diff --git a/configs/vim/bundle/vim-sensible b/configs/vim/bundle/vim-sensible deleted file mode 160000 index d0beb8a..0000000 --- a/configs/vim/bundle/vim-sensible +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d0beb8ab42627bea2c747564ca46ec663e3ba0ba diff --git a/configs/vim/bundle/vim/.netrwhist b/configs/vim/bundle/vim/.netrwhist deleted file mode 100644 index 06f22f1..0000000 --- a/configs/vim/bundle/vim/.netrwhist +++ /dev/null @@ -1,4 +0,0 @@ -let g:netrw_dirhistmax =10 -let g:netrw_dirhist_cnt =2 -let g:netrw_dirhist_1='/Users/marina/Projects/THREAT_INTEL/threat_intel/threat_intel/util' -let g:netrw_dirhist_2='/Users/marina/Projects/security-tools' diff --git a/configs/vim/bundle/vundle b/configs/vim/bundle/vundle deleted file mode 160000 index cfd3b2d..0000000 --- a/configs/vim/bundle/vundle +++ /dev/null @@ -1 +0,0 @@ -Subproject commit cfd3b2d388a8c2e9903d7a9d80a65539aabfe933 diff --git a/data_science/export_csv_reports.py b/data_science/export_csv_reports.py new file mode 100644 index 0000000..51dc5b6 --- /dev/null +++ b/data_science/export_csv_reports.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +""" + Export data in a CSV spreadsheet. + + Mia Stein - 2017 + + Need to have argparse installed: + $ pip install argparse +""" + +import sys +import argparse +from pandas import DataFrame + + +def read_data(data): + lines = data.readlines() + + feature, precision, recall, f1 = [], [], [], [] + for line in lines: + line_clean = line.strip().split(",") + feature.append(line_clean[0]) + precision.append(line_clean[1]) + recall.append(line_clean[4]) + f1.append(line_clean[6]) + return feature, precision, recall, f1 + + +def save_to_spreadsheet(resultfile, data): + try: + df = DataFrame({'Feature': data[0], 'Precision': data[1], 'Recall': data[2], 'f1-score': data[3]}) + df.to_csv(resultfile, index=False) + print("Spreadsheet saved at {0}".format(resultfile)) + except: + print("Error: {0}".format(sys.exc_info()[0])) + + +def menu(): + parser = argparse.ArgumentParser(description='Copy data results into a spreadsheet.') + parser.add_argument('-s', dest='input', type=argparse.FileType('r'), required=True, help="File with the results.") + parser.add_argument('-d', dest='output', required=True, help="The name of the file to save the spreadsheet.") + args = parser.parse_args() + args.input, args.output + return args.input, args.output + + +if __name__ == "__main__": + datafile, resultfile = menu() + data = read_data(datafile) + save_to_spreadsheet(resultfile, data) + diff --git a/data_science/export_results.py b/data_science/export_results.py new file mode 100644 index 0000000..ca2ab8b --- /dev/null +++ b/data_science/export_results.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python +# Need to have argparse installed: +# $ pip install argparse + +import sys +import os.path +import argparse +from pandas import DataFrame + + +def read_data(data): + lines = data.readlines() + + feature, precision, recall, f1 = [], [], [], [] + for line in lines: + line_clean = line.strip().split(",") + feature.append(line_clean[0]) + precision.append(line_clean[1]) + recall.append(line_clean[4]) + f1.append(line_clean[6]) + return feature, precision, recall, f1 + + +def save_to_spreadsheet(resultfile, data): + try: + df = DataFrame({'Feature': data[0], 'Precision': data[1], 'Recall': data[2], 'f1-score': data[3]}) + df.to_csv(resultfile, index=False) + print("Spreadsheet saved at {0}".format(resultfile)) + except: + print("Error: {0}".format(sys.exc_info()[0])) + + +def menu(): + parser = argparse.ArgumentParser(description='Copy data results into a spreadsheet.') + parser.add_argument('-s', dest='input', type=argparse.FileType('r'), required=True, help="File with the results.") + parser.add_argument('-d', dest='output', required=True, help="The name of the file to save the spreadsheet.") + args = parser.parse_args() + args.input, args.output + return args.input, args.output + + +if __name__ == "__main__": + datafile, resultfile = menu() + data = read_data(datafile) + save_to_spreadsheet(resultfile, data) + diff --git a/data_science/run_eval.py b/data_science/run_eval.py new file mode 100644 index 0000000..1873f87 --- /dev/null +++ b/data_science/run_eval.py @@ -0,0 +1,226 @@ +#!/usr/bin/env python + +""" + Run svm_light, parse its stdout, calculate + ML scores, HDFS copy data to local. +""" + +import sys +import os +import getpass +import subprocess +import shutil +import math + + +def delete_dir(dir_path): + ''' + Remove a directory. + + Args: + dir_path: full path to the directory. + ''' + if os.path.isdir(dir_path): + shutil.rmtree(dir_path) + + +def usage(): + ''' + Handle the CLI arguments. + ''' + args = sys.argv + if len(args) != 3: + print("Usage: ./runEval ") + sys.exit(2) + return args[1], args[2] + + +def create_dir(dir_path): + ''' + Create a a directory. + + Args: + dir_path: full path to the directory. + ''' + if not os.path.exists(dir_path): + os.makedirs(dir_path) + + +def run_svm_classify(test_data, svml_model, svml_eval): + ''' + Spawn a subprocess to run svm_classify binary. + + From svm_classify.c, svm_light usage requires the following + arguments: example_file model_file output_file. + + Args: + test_data: path_to_feature/test.dat + svml_model: something like ~/data/models/svmlight/method/version/model + svml_eval: something like ~/data/models/svmlight/method/version/eval + + Returns: + Strings with stdout and stderr so that it can be parsed later. + ''' + p = subprocess.Popen(['./models/svm_classify', \ + '{0}'.format(test_data), \ + '{0}'.format(svml_model),\ + '{0}'.format(svml_eval)],\ + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + out, err = p.communicate() + return out, err + + +def paste_data(test_data, svml_eval, final_eval, svml_alpha, final_alphas, out): + ''' + Copy all eval and alpha data from results to local files. + + Args: + src and dst paths. + ''' + # Copy all eval data. + with open(test_data, 'r') as ft: + test_data = ft.readlines() + + with open(svml_eval, 'r') as fe: + eval_data = fe.readlines() + + with open(final_eval, 'a') as f: + for line in test_data: + f.write('{0}\n'.format(line)) + for line in eval_data: + f.write('{0}\n'.format(line)) + + # Copy all alpha data. + with open(svml_alpha, 'r') as fa: + alpha_data = fa.readlines() + + with open(final_alphas, 'a') as f: + for line in alpha_data: + f.write('{0} {1}\n'.format(line, out)) + + +def parse_svmlight_output(out): + ''' + Parse the svm_light stdout string for an example + + Returns: + c: counts + p: precision + r: recall + ''' + c = out.split('OK. (')[1].split(' support')[0] + pr = out.split('Precision/recall on test set: ')[1].split(' support')[0].strip() + p, r = pr.split('/') + p = float(p.strip('%').strip()) / 100 + r = float(r.strip('%').strip()) / 100 + + return c, p, r + + +def hdfs_copy_data(home_dir, method, version): + ''' + Run CLI HDFS commands to clean up and save data. + ''' + os.system('hdfs dfs -rm /data/shared/structdata/modelOutput/{0}/{1}/scores'.format(method, version)) + os.system('hdfs dfs -rm /data/shared/structdata/modelOutput/{0}/{1}/alphas'.format(method, version)) + + os.system('hdfs dfs -mkdir /data/shared/structdata/modelOutput/{0}/{1}'.format(method, version)) + + os.system('hdfs dfs -copyFromLocal {0}/data/eval/{1}/{2}/alphas \ + /data/shared/structdata/modelOutput/{3}/{4}/alphas'.format(home_dir, version, method, method, version)) + + os.system('hdfs dfs -copyFromLocal {0}/data/eval/{1}/{2}/eval \ + /data/shared/structdata/modelOutput/{3}/{4}/scores'.format(home_dir, version, method, method, version)) + +def calculate_scores(list_of_scores): + ''' + Calculate the mean of a given list of scores, + taking care of any nan or 0 division. + ''' + c, score = 0, 0 + for i in list_of_scores: + if not math.isnan(i): + c += 1 + score += i + if c > 0: + return score / c + else: + return 0 + + +def calculate_f1(precision, recall): + ''' + Calculates the f1-score as the harmonic + mean of precision and recall. + ''' + if precision + recall < 1: + return 0 + else: + return 2 / (1/precision + 1/recall) + + +if __name__ == '__main__': + + # Grab the CLI arguments. + METHOD, VERSION = usage() + + # Setup output dirs. + home_dir = os.path.join('/home', getpass.getuser()) + final_dir = os.path.join(home_dir, 'data/eval', VERSION, METHOD) + final_alphas = os.path.join(final_dir, 'alphas') + final_eval = os.path.join(final_dir, 'eval') + + delete_dir(final_alphas) + delete_dir(final_eval) + create_dir(final_dir) + + # Loop over the attributes and features. + training_data_dir = os.path.join(home_dir, 'data/training_data/', VERSION, METHOD) + + for attribute in os.listdir(training_data_dir): + + attribute_path = os.path.join(training_data_dir, attribute) + counts = 0 + precision, recall = [], [] + + for feature in os.listdir(attribute_path): + + # Create all the paths in use. + out = os.path.join(VERSION, METHOD, attribute, feature) + svmlight = os.path.join(home_dir,'data/models/svmlight', out) + svml_model = os.path.join(svmlight, 'model') + svml_eval = os.path.join(svmlight, 'eval') + svml_alpha = os.path.join(svmlight, 'alphas') + test_data = os.path.join(attribute_path, feature, 'test.dat') + + # Run svm_classify. + out, err = run_svm_classify(test_data, svml_model, svml_eval) + + # Save current results. + paste_data(test_data, svml_eval, final_eval, svml_alpha, final_alphas, out) + + # Parse output from svm_classify to print to stdout. + if err: + print('Error: {0}'.format(err)) + + # Get Train counts, Test counts, Accuracy, Precision, Recall. + c, p ,r = parse_svmlight_output(out) + + counts += int(c) + precision.append(p) + recall.append(r) + + attribute_precision = calculate_scores(precision) + attribute_recall = calculate_scores(recall) + attribute_f1 = calculate_f1(attribute_precision, attribute_recall) + + print("{: <20} Counts: {: <20} Precision: {: <20} Recall: {: <20} F1-score: {: <20}".format(attribute.title(), \ + counts, round(attribute_precision, 4), round(attribute_recall, 4), round(attribute_f1, 4))) + + + # Copying results from remote hdfs. + print("\nCopying results to hdfs") + hdfs_copy_data(home_dir, METHOD, VERSION) + print("\nDone!".format()) + diff --git a/elasticsearch/README.md b/elasticsearch/README.md new file mode 100644 index 0000000..860b061 --- /dev/null +++ b/elasticsearch/README.md @@ -0,0 +1,6 @@ +# Elastalert hacks + +``` +curl -s logs.HOST.com:9200/logstash-2017.09.08/_search\?q=ty_params.ProcessName:osqueryd\&size=10000\&sort=@timestamp:desc | jq -r '.hits.hits[]._source.ty_params.Username' | sort | uniq -c | sort -nr +``` + diff --git a/elasticsearch/grabbing_es_data.py b/elasticsearch/grabbing_es_data.py new file mode 100644 index 0000000..008a874 --- /dev/null +++ b/elasticsearch/grabbing_es_data.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +import elasticsearch +import whois +import json + +from elasticsearch import Elasticsearch + +es = Elasticsearch([{ 'host': "HOST NAME"}]) + +query = { + 'size': 100, + 'query': { + 'filtered': { + 'query': { + 'query_string': { + 'query': 'type:named_query_log', + 'analyze_wildcard': True + } + }, + 'filter': { + 'bool': { + 'must_not': { + 'query_string': { + 'query': '*HOST.com OR *otherhost.com', + 'analyze_wildcard': True + } + } + } + } +}}} + +# Make the search +res = es.search(index="LOG-NAME", body=query) + +results = [] +counter = 0 +# Print out our results +for hit in res['hits']['hits']: + if "dns_dest" in hit['_source'].keys(): + try: + results.append(json.dumps(whois.whois(hit['_source']['dns_dest']))) + except Exception as e: + pass + counter += 1 + print "Scanning {0}/{1} domains, {2} succeeded..".format(counter, len(res['hits']['hits']), len(results)) + +with open('processed_domains.txt', 'w') as outfile: + json.dump(results, outfile) + diff --git a/elasticsearch/set_log.py b/elasticsearch/set_log.py new file mode 100644 index 0000000..e6ff0fc --- /dev/null +++ b/elasticsearch/set_log.py @@ -0,0 +1,50 @@ +#!/usr/bin/env python + +import os +import subprocess +import json +import socket +import logging + +LOG_PATH = "/var/log/logname.log" +FORWARD_PATH = "/etc/logstash-forwarder.conf" +LOG_LEVEL = logging.DEBUG + + +# Set up logpath +if not os.path.isfile(LOG_PATH): + + logging.info("No {0} file. Calling: sudo touch {1}".format(LOG_PATH, LOG_PATH)) + subprocess.call("sudo touch {0}".format(LOG_PATH), shell=True) + + logging.info("Setting perms. Calling: sudo chmod 666 {0}".format(LOG_PATH)) + subprocess.call("sudo chmod 666 {0}".format(LOG_PATH), shell=True) + +# Set up forwarding +if os.path.isfile(FORWARD_PATH): + + logging.info("Forwarding {0} to logstash...".format(FORWARD_PATH)) + try: + with open(FORWARD_PATH, "r+") as f: + data = json.load(jsonFile) + + try: + if LOG_PATH not in data['files'][0]['paths']: + data['files'][0]['paths'].append(LOG_PATH) + jsonFile = open("/etc/logstash-forwarder.conf", "w+") + jsonFile.write(json.dumps(data)) + + except KeyError: + logging.error("Could not set logstash: {0} is not well formated.".format(FORWARD_PATH)) + + except IOError: + logging.error("Could not open {0}".format(FORWARD_PATH)) + +else: + hostname = socket.gethostname() + + #Search for logstash-forwarder locations per each host + if "prodvpn" in hostname: + logging.warning("Forwarder should be in {0}. Please set up a forwarder and try again.".format(FORWARD_PATH)) + + diff --git a/shell_scripts/super_fun/let_it_snow.sh b/funny/let_it_snow.sh similarity index 100% rename from shell_scripts/super_fun/let_it_snow.sh rename to funny/let_it_snow.sh diff --git a/shell_scripts/super_fun/matrix.sh b/funny/matrix.sh similarity index 86% rename from shell_scripts/super_fun/matrix.sh rename to funny/matrix.sh index c55cd33..240b10f 100644 --- a/shell_scripts/super_fun/matrix.sh +++ b/funny/matrix.sh @@ -1 +1,3 @@ -echo -e "\e[1;40m" ; clear ; while :; do echo $LINES $COLUMNS $(( $RANDOM % $COLUMNS)) $(( $RANDOM % 72 )) ;sleep 0.05; done|gawk '{ letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^&*()"; c=$4; letter=substr(letters,c,1);a[$3]=0;for (x in a) {o=a[x];a[x]=a[x]+1; printf "\033[%s;%sH\033[2;32m%s",o,x,letter; printf "\033[%s;%sH\033[1;37m%s\033[0;0H",a[x],x,letter;if (a[x] >= $1) { a[x]=0; } }}' \ No newline at end of file +#!/usr/bin/env bash + +echo -e "\e[1;40m" ; clear ; while :; do echo $LINES $COLUMNS $(( $RANDOM % $COLUMNS)) $(( $RANDOM % 72 )) ;sleep 0.05; done|gawk '{ letters="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789@#$%^&*()"; c=$4; letter=substr(letters,c,1);a[$3]=0;for (x in a) {o=a[x];a[x]=a[x]+1; printf "\033[%s;%sH\033[2;32m%s",o,x,letter; printf "\033[%s;%sH\033[1;37m%s\033[0;0H",a[x],x,letter;if (a[x] >= $1) { a[x]=0; } }}' diff --git a/shell_scripts/super_fun/rainbow.sh b/funny/rainbow.sh similarity index 100% rename from shell_scripts/super_fun/rainbow.sh rename to funny/rainbow.sh diff --git a/gcloud/get_cloudsql_instances.sh b/gcloud/get_cloudsql_instances.sh new file mode 100755 index 0000000..36de962 --- /dev/null +++ b/gcloud/get_cloudsql_instances.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +for x in $(gcloud projects list | tail -n +2 | awk '{ print $1}'); +do + gcloud sql instances list --project $x +done + diff --git a/gcloud/get_gcp_apps.sh b/gcloud/get_gcp_apps.sh new file mode 100755 index 0000000..31fa7ef --- /dev/null +++ b/gcloud/get_gcp_apps.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +projects=$(gcloud projects list | tail -n +2 | awk '{ print $1}') + +list_app () { + gcloud app services list --project $1 2>&1 | grep -v ERROR +} + +for x in $projects; +do + list_app $x +done + diff --git a/gcloud/get_kb8_clusters.sh b/gcloud/get_kb8_clusters.sh new file mode 100755 index 0000000..0e97611 --- /dev/null +++ b/gcloud/get_kb8_clusters.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +projects=$(gcloud projects list | tail -n +2 | awk '{ print $1}'); + +for x in $projects; +do + project_json=$(gcloud container clusters list --project $x --format json) + echo $project_json | jq -e -r '.[] | .endpoint' +done + diff --git a/gcloud/get_public_ips.sh b/gcloud/get_public_ips.sh new file mode 100755 index 0000000..2a25a50 --- /dev/null +++ b/gcloud/get_public_ips.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +for x in $(gcloud projects list | tail -n +2 | awk '{ print $1}'); +do + ip_list=$(gcloud compute instances list --project $x --format json) + gcloud compute instances list --project $x --format json | jq -r '.[] | .networkInterfaces[] | .accessConfigs[] | .natIP'; +done + diff --git a/git/README.md b/git/README.md new file mode 100644 index 0000000..9ce1977 --- /dev/null +++ b/git/README.md @@ -0,0 +1,74 @@ +## useful git stuff + +
+ +### reset all commits + +
+ +#### check out to a temporary branch: + +``` +git checkout --orphan TEMP_BRANCH +``` + +#### add all the files: + +``` +git add -A +``` + +#### commit the changes: + +``` +git commit -am "🛹👾" +``` + +#### delete the old branch: + +``` +git branch -D main +``` + +#### rename the temporary branch to `main`: + +``` +git branch -m main +``` + +#### finally, force update to our repository: + +``` +git push -f origin main +``` + +
+ +--- + +### delete all local branches + +
+ +```shell +git branch | grep -v "main" | xargs git branch -D +``` + +
+ +--- + +### troubleshooting + +
+ +#### error: RPC failed; HTTP 400 curl 22 The requested URL returned error: 400 + +```shell +git config http.postBuffer 524288000 +``` + +
+ + + diff --git a/shell_scripts/git/gi.sh b/git/gi.sh similarity index 100% rename from shell_scripts/git/gi.sh rename to git/gi.sh diff --git a/shell_scripts/git/gitpass.sh b/git/gitpass.sh similarity index 100% rename from shell_scripts/git/gitpass.sh rename to git/gitpass.sh diff --git a/gpg/README.md b/gpg/README.md new file mode 100644 index 0000000..1bc6995 --- /dev/null +++ b/gpg/README.md @@ -0,0 +1,58 @@ +## gpg shortcuts + +
+ +(adapted from [bt3gl's 20216 guide](https://coderwall.com/p/ajtlqa/getting-started-with-pgp-gpg)) + + +1. create a key (choose RSA with 4096): + +``` +gpg --full-generate-key +``` + +
+ +2. share the public key with: +``` +gpg --armor --export > public-key.asc +``` + +
+ +3. upload to some keyservers, such as ubuntu or MIT: +``` +gpg --send-keys --keyserver keyserver.ubuntu.com KEYID +gpg --keyserver hkp://pgp.mit.edu --send-key KEYID +``` + +
+ +4. backup the private key: +``` +gpg --export-secret-keys --armor KEYID > priv.asc +``` + +
+ +5. list your keys: +``` +gpg --list-keys +gpg --list-secret-keys +``` + +
+ +6. clean up if needed: +``` +gpg --delete-secret-key KEYID +gpg --delete-key KEYID +``` + +
+ +7. finally, you should upload your key into official servers such as **[ubuntu](https://keyserver.ubuntu.com/)** or **[mit](https://pgp.mit.edu/)**. + + + + diff --git a/iterm/iterm_profile.json b/iterm/iterm_profile.json new file mode 100644 index 0000000..a699056 --- /dev/null +++ b/iterm/iterm_profile.json @@ -0,0 +1,379 @@ +{ + "Ansi 4 Color" : { + "Red Component" : 0.49340518936514854, + "Color Space" : "sRGB", + "Blue Component" : 0.7667236328125, + "Alpha Component" : 1, + "Green Component" : 0.54157522728399154 + }, + "Tags" : [ + + ], + "Ansi 12 Color" : { + "Red Component" : 0.369100421667099, + "Color Space" : "sRGB", + "Blue Component" : 0.90869140625, + "Alpha Component" : 1, + "Green Component" : 0.43231727316288016 + }, + "Ansi 7 Color" : { + "Green Component" : 0.73333334922790527, + "Blue Component" : 0.73333334922790527, + "Red Component" : 0.73333334922790527 + }, + "Ansi 8 Color" : { + "Green Component" : 0.3333333432674408, + "Blue Component" : 0.3333333432674408, + "Red Component" : 0.3333333432674408 + }, + "Bold Color" : { + "Green Component" : 1, + "Blue Component" : 1, + "Red Component" : 1 + }, + "Ansi 9 Color" : { + "Red Component" : 1, + "Color Space" : "sRGB", + "Blue Component" : 0, + "Alpha Component" : 1, + "Green Component" : 0.041481197916263146 + }, + "Right Option Key Sends" : 0, + "Ansi 6 Color" : { + "Red Component" : 0, + "Color Space" : "sRGB", + "Blue Component" : 1, + "Alpha Component" : 1, + "Green Component" : 0.99052921849475251 + }, + "Rows" : 25, + "Default Bookmark" : "No", + "Cursor Guide Color" : { + "Red Component" : 0.70213186740875244, + "Color Space" : "sRGB", + "Blue Component" : 1, + "Alpha Component" : 0.25, + "Green Component" : 0.9268307089805603 + }, + "Non-ASCII Anti Aliased" : true, + "Use Bright Bold" : true, + "Ansi 10 Color" : { + "Red Component" : 0, + "Color Space" : "sRGB", + "Blue Component" : 0, + "Alpha Component" : 1, + "Green Component" : 1 + }, + "Ambiguous Double Width" : false, + "Jobs to Ignore" : [ + "rlogin", + "ssh", + "slogin", + "telnet" + ], + "Ansi 15 Color" : { + "Green Component" : 1, + "Blue Component" : 1, + "Red Component" : 1 + }, + "Foreground Color" : { + "Green Component" : 0.73333334922790527, + "Blue Component" : 0.73333334922790527, + "Red Component" : 0.73333334922790527 + }, + "Working Directory" : "\/Users\/mia", + "Blinking Cursor" : true, + "Disable Window Resizing" : true, + "Sync Title" : false, + "Prompt Before Closing 2" : false, + "BM Growl" : true, + "Command" : "", + "Description" : "Default", + "Mouse Reporting" : true, + "Screen" : -1, + "Selection Color" : { + "Green Component" : 0.8353000283241272, + "Blue Component" : 1, + "Red Component" : 0.70980000495910645 + }, + "Columns" : 80, + "Idle Code" : 0, + "Ansi 13 Color" : { + "Red Component" : 0, + "Color Space" : "sRGB", + "Blue Component" : 1, + "Alpha Component" : 1, + "Green Component" : 0.5572509765625 + }, + "Custom Command" : "No", + "Use Custom Window Title" : false, + "ASCII Anti Aliased" : true, + "Non Ascii Font" : "Monaco 12", + "Vertical Spacing" : 1.0900000000000001, + "Use Bold Font" : true, + "Option Key Sends" : 0, + "Selected Text Color" : { + "Green Component" : 0, + "Blue Component" : 0, + "Red Component" : 0 + }, + "Background Color" : { + "Green Component" : 0, + "Blue Component" : 0, + "Red Component" : 0 + }, + "Character Encoding" : 4, + "Ansi 11 Color" : { + "Green Component" : 1, + "Blue Component" : 0.3333333432674408, + "Red Component" : 1 + }, + "Use Italic Font" : true, + "Unlimited Scrollback" : true, + "Keyboard Map" : { + "0xf700-0x260000" : { + "Text" : "[1;6A", + "Action" : 10 + }, + "0x37-0x40000" : { + "Text" : "0x1f", + "Action" : 11 + }, + "0x32-0x40000" : { + "Text" : "0x00", + "Action" : 11 + }, + "0xf709-0x20000" : { + "Text" : "[17;2~", + "Action" : 10 + }, + "0xf70c-0x20000" : { + "Text" : "[20;2~", + "Action" : 10 + }, + "0xf729-0x20000" : { + "Text" : "[1;2H", + "Action" : 10 + }, + "0xf72b-0x40000" : { + "Text" : "[1;5F", + "Action" : 10 + }, + "0xf705-0x20000" : { + "Text" : "[1;2Q", + "Action" : 10 + }, + "0xf703-0x260000" : { + "Text" : "[1;6C", + "Action" : 10 + }, + "0xf700-0x220000" : { + "Text" : "[1;2A", + "Action" : 10 + }, + "0xf701-0x280000" : { + "Text" : "0x1b 0x1b 0x5b 0x42", + "Action" : 11 + }, + "0x38-0x40000" : { + "Text" : "0x7f", + "Action" : 11 + }, + "0x33-0x40000" : { + "Text" : "0x1b", + "Action" : 11 + }, + "0xf703-0x220000" : { + "Text" : "[1;2C", + "Action" : 10 + }, + "0xf701-0x240000" : { + "Text" : "[1;5B", + "Action" : 10 + }, + "0xf70d-0x20000" : { + "Text" : "[21;2~", + "Action" : 10 + }, + "0xf702-0x260000" : { + "Text" : "[1;6D", + "Action" : 10 + }, + "0xf729-0x40000" : { + "Text" : "[1;5H", + "Action" : 10 + }, + "0xf706-0x20000" : { + "Text" : "[1;2R", + "Action" : 10 + }, + "0x34-0x40000" : { + "Text" : "0x1c", + "Action" : 11 + }, + "0xf700-0x280000" : { + "Text" : "0x1b 0x1b 0x5b 0x41", + "Action" : 11 + }, + "0x2d-0x40000" : { + "Text" : "0x1f", + "Action" : 11 + }, + "0xf70e-0x20000" : { + "Text" : "[23;2~", + "Action" : 10 + }, + "0xf702-0x220000" : { + "Text" : "[1;2D", + "Action" : 10 + }, + "0xf703-0x280000" : { + "Text" : "0x1b 0x1b 0x5b 0x43", + "Action" : 11 + }, + "0xf700-0x240000" : { + "Text" : "[1;5A", + "Action" : 10 + }, + "0xf707-0x20000" : { + "Text" : "[1;2S", + "Action" : 10 + }, + "0xf70a-0x20000" : { + "Text" : "[18;2~", + "Action" : 10 + }, + "0x35-0x40000" : { + "Text" : "0x1d", + "Action" : 11 + }, + "0xf70f-0x20000" : { + "Text" : "[24;2~", + "Action" : 10 + }, + "0xf703-0x240000" : { + "Text" : "[1;5C", + "Action" : 10 + }, + "0xf701-0x260000" : { + "Text" : "[1;6B", + "Action" : 10 + }, + "0xf702-0x280000" : { + "Text" : "0x1b 0x1b 0x5b 0x44", + "Action" : 11 + }, + "0xf72b-0x20000" : { + "Text" : "[1;2F", + "Action" : 10 + }, + "0x36-0x40000" : { + "Text" : "0x1e", + "Action" : 11 + }, + "0xf708-0x20000" : { + "Text" : "[15;2~", + "Action" : 10 + }, + "0xf701-0x220000" : { + "Text" : "[1;2B", + "Action" : 10 + }, + "0xf70b-0x20000" : { + "Text" : "[19;2~", + "Action" : 10 + }, + "0xf702-0x240000" : { + "Text" : "[1;5D", + "Action" : 10 + }, + "0xf704-0x20000" : { + "Text" : "[1;2P", + "Action" : 10 + } + }, + "Window Type" : 1, + "Cursor Boost" : 0, + "Cursor Type" : 0, + "Background Image Location" : "", + "Blur" : false, + "Badge Color" : { + "Red Component" : 1, + "Color Space" : "sRGB", + "Blue Component" : 0, + "Alpha Component" : 0.5, + "Green Component" : 0.1491314172744751 + }, + "Blink Allowed" : false, + "Scrollback Lines" : 0, + "Send Code When Idle" : false, + "Close Sessions On End" : true, + "Terminal Type" : "xterm-256color", + "Visual Bell" : true, + "Flashing Bell" : false, + "Silence Bell" : false, + "Ansi 14 Color" : { + "Red Component" : 1, + "Color Space" : "sRGB", + "Blue Component" : 0.70697021484375, + "Alpha Component" : 1, + "Green Component" : 0 + }, + "Name" : "Default", + "Cursor Text Color" : { + "Green Component" : 1, + "Blue Component" : 1, + "Red Component" : 1 + }, + "Minimum Contrast" : 0, + "Shortcut" : "", + "Cursor Color" : { + "Green Component" : 0.73333334922790527, + "Blue Component" : 0.73333334922790527, + "Red Component" : 0.73333334922790527 + }, + "Ansi 0 Color" : { + "Green Component" : 0, + "Blue Component" : 0, + "Red Component" : 0 + }, + "Guid" : "77B335E5-2787-4854-B408-FF002FEE6AE0", + "Custom Directory" : "No", + "Ansi 3 Color" : { + "Green Component" : 0.73333334922790527, + "Blue Component" : 0, + "Red Component" : 0.73333334922790527 + }, + "Link Color" : { + "Red Component" : 0, + "Color Space" : "sRGB", + "Blue Component" : 0.73423302173614502, + "Alpha Component" : 1, + "Green Component" : 0.35916060209274292 + }, + "Ansi 5 Color" : { + "Red Component" : 0.82745098039215681, + "Color Space" : "sRGB", + "Blue Component" : 0.82745098039215681, + "Alpha Component" : 1, + "Green Component" : 0.52941176470588236 + }, + "Use Non-ASCII Font" : false, + "Transparency" : 0, + "Normal Font" : "Courier 14", + "Ansi 1 Color" : { + "Red Component" : 0.921539306640625, + "Color Space" : "sRGB", + "Blue Component" : 0.40294846147298813, + "Alpha Component" : 1, + "Green Component" : 0.47305398313954738 + }, + "Ansi 2 Color" : { + "Red Component" : 0.54448666982352734, + "Color Space" : "sRGB", + "Blue Component" : 0.54448666982352734, + "Alpha Component" : 1, + "Green Component" : 0.829925537109375 + }, + "Horizontal Spacing" : 1 +} \ No newline at end of file diff --git a/network/check_port.sh b/network/check_port.sh new file mode 100644 index 0000000..83213e4 --- /dev/null +++ b/network/check_port.sh @@ -0,0 +1,23 @@ +#!/bin/bash +# Check a whether a port is open or not +# +# then use the script in your tests like +# check_port 9200 + +function check_port() { + local host=${1} && shift + local port=${1} && shift + local retries=5 + local wait=1 + + until( nc -zv "${host}" "${port}" ); do + ((retries--)) + if [ $retries -lt 0 ]; then + echo "Service ${host}:${port} didn't become ready in time." + exit 1 + fi + sleep "${wait}" + done +} + +check_port "localhost" "$@" \ No newline at end of file diff --git a/configs/bash_logout b/shell/bash_logout similarity index 100% rename from configs/bash_logout rename to shell/bash_logout diff --git a/configs/bashrc b/shell/bashrc similarity index 99% rename from configs/bashrc rename to shell/bashrc index 5d54be8..5e71a36 100644 --- a/configs/bashrc +++ b/shell/bashrc @@ -1,5 +1,5 @@ ###################################################### -# bt3's .bashrc (partially modified for publishing) +# mia's .bashrc (partially modified for publishing) ###################################################### # ## diff --git a/shell/profile b/shell/profile new file mode 100644 index 0000000..d19631d --- /dev/null +++ b/shell/profile @@ -0,0 +1,153 @@ +###################################################### +# PRETTY STUFF +###################################################### + +# Normal Colors +Black='\e[0;30m' # Black +Red='\e[0;31m' # Red +Green='\e[0;32m' # Green +Yellow='\e[0;33m' # Yellow +Blue='\e[0;34m' # Blue +Purple='\e[0;35m' # Purple +Cyan='\e[0;36m' # Cyan +White='\e[0;37m' # White + +# Bold +BBlack='\e[1;30m' # Black +BRed='\e[1;31m' # Red +BGreen='\e[1;32m' # Green +BYellow='\e[1;33m' # Yellow +BBlue='\e[1;34m' # Blue +BPurple='\e[1;35m' # Purple +BCyan='\e[1;36m' # Cyan +BWhite='\e[1;37m' # White + +# Background +On_Black='\e[40m' # Black +On_Red='\e[41m' # Red +On_Green='\e[42m' # Green +On_Yellow='\e[43m' # Yellow +On_Blue='\e[44m' # Blue +On_Purple='\e[45m' # Purple +On_Cyan='\e[46m' # Cyan +On_White='\e[47m' # White + +NC="\e[m" # Color Reset + + +# \a an ASCII bell character (07) +# \d the date in "Weekday Month Date" format (e.g., "Tue May 26") +# \] end a sequence of non-printing characters +# \e an ASCII escape character (033) +# \h the hostname up to the first `.' +# \H the hostname +# \j the number of jobs currently managed by the shell +# \l the basename of the shell's terminal device name +# \n newline +# \r carriage return +# \s the name of the shell, the basename of $0 (the portion following the final slash) +# \t the current time in 24-hour HH:MM:SS format +# \T the current time in 12-hour HH:MM:SS format +# \@ the current time in 12-hour am/pm format +# \A the current time in 24-hour HH:MM format +# \u the username of the current user +# \v the version of bash (e.g., 2.00) +# \V the release of bash, version + patchelvel (e.g., 2.00.0) +# \w the current working directory +# \W the basename of the current working directory +# \! the history number of this command +# \# the command number of this command +# \$ if the effective UID is 0, a #, otherwise a $ +# \nnn the character corresponding to the octal number nnn +# \\ a backslash +# \[ begin a sequence of non-printing characters, which could be used to embed a terminal control sequence into the prompt + + +PS1='\[\e[1;32m\]\d \T> \[\e[1;35m\]\h> \[\e[1;34m\] \w: \[\e[m\]' + + +###################################################### +# PERSONAL ALIASES +###################################################### + +alias home='cd ~' +alias rm='rm -i' +alias cp='cp -i' +alias mv='mv -i' +alias mkdir='mkdir -p' +alias h='history' +alias j='jobs -l' +alias which='type -a' +alias ..='cd ..' +alias jup="jupyter notebook" + +# Pretty-print of some PATH variables: +alias path='echo -e ${PATH//:/\\n}' +alias libpath='echo -e ${LD_LIBRARY_PATH//:/\\n}' + +alias du='du -kh' # Makes a more readable output. +alias df='df -kTh' +alias dc="docker-compose" +alias dcrun="docker-compose run --rm" + + +###################################################### +# EXPORT OPTIONS +###################################################### + +export GREP_OPTIONS='--color=auto' +export GREP_COLOR='1;31' # green for matches +export CLICOLOR=230 +export HISTFILESIZE=3000 +export HISTCONTROL=ignoredups + + +###################################################### +# FUNCTIONS +###################################################### + +function extract() # Handy Extract Program +{ + if [ -f $1 ] ; then + case $1 in + *.tar.bz2) tar xvjf $1 ;; + *.tar.gz) tar xvzf $1 ;; + *.bz2) bunzip2 $1 ;; + *.rar) unrar x $1 ;; + *.gz) gunzip $1 ;; + *.tar) tar xvf $1 ;; + *.tbz2) tar xvjf $1 ;; + *.tgz) tar xvzf $1 ;; + *.zip) unzip $1 ;; + *.Z) uncompress $1 ;; + *.7z) 7z x $1 ;; + *) echo "'$1' cannot be extracted via >extract<" ;; + esac + else + echo "'$1' is not a valid file!" + fi +} + +# Function to run upon exit of shell. +function _exit() +{ + echo -e "${BRed}Hasta la vista, Baby! ${NC}" +} +trap _exit EXIT + + +# Creates an archive (*.tar.gz) from given directory. +function maketar() { tar cvzf "${1%%/}.tar.gz" "${1%%/}/"; } + +# Create a ZIP archive of a file or folder. +function makezip() { zip -r "${1%%/}.zip" "$1" ; } + +# Make your directories and files access rights sane. +function sanitize() { chmod -R u=rwX,g=rX,o= "$@" ;} +export PATH="/usr/local/opt/openssl/bin:$PATH" + +# The next line updates PATH for the Google Cloud SDK. +if [ -f '/Users/mia/Desktop/google-cloud-sdk/path.bash.inc' ]; then . '/Users/mia/Desktop/google-cloud-sdk/path.bash.inc'; fi + +# The next line enables shell command completion for gcloud. +if [ -f '/Users/mia/Desktop/google-cloud-sdk/completion.bash.inc' ]; then . '/Users/mia/Desktop/google-cloud-sdk/completion.bash.inc'; fi diff --git a/shell_scripts/useful/SAB.sh b/shell_scripts/SAB.sh similarity index 100% rename from shell_scripts/useful/SAB.sh rename to shell_scripts/SAB.sh diff --git a/shell_scripts/SHELL_USEFUL.md b/shell_scripts/SHELL_USEFUL.md new file mode 100644 index 0000000..0d6394e --- /dev/null +++ b/shell_scripts/SHELL_USEFUL.md @@ -0,0 +1,50 @@ +# Some Quick and Useful Shell Commands + +
+ + +## Downloading all pdfs of url + +```shell +$ wget --recursive --level=2 --no-directories --no-host-directories --accept pdf +``` + +
+ +## Extended attributes of files + +```shell +$ xattr -l $file +``` + +
+ +## Check signatures of Apps + +
+ +```shell +$ codesign -dvvv $file.app +``` + +
+ +## Show all the configs + +
+ +```shell +$ system_profiler -detaillevel full +``` + +
+ +## 瑪麗 + + +
+ + +```shell +$ convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black -draw @ascii.txt +``` diff --git a/shell_scripts/useful/USENET.sh b/shell_scripts/USENET.sh similarity index 100% rename from shell_scripts/useful/USENET.sh rename to shell_scripts/USENET.sh diff --git a/shell_scripts/useful/backup.sh b/shell_scripts/backup.sh similarity index 100% rename from shell_scripts/useful/backup.sh rename to shell_scripts/backup.sh diff --git a/shell_scripts/useful/bye.sh b/shell_scripts/bye.sh similarity index 100% rename from shell_scripts/useful/bye.sh rename to shell_scripts/bye.sh diff --git a/shell_scripts/useful/check_if_req_are_update.sh b/shell_scripts/check_if_req_are_update.sh similarity index 100% rename from shell_scripts/useful/check_if_req_are_update.sh rename to shell_scripts/check_if_req_are_update.sh diff --git a/shell_scripts/check_time_zone.sh b/shell_scripts/check_time_zone.sh new file mode 100644 index 0000000..de37c26 --- /dev/null +++ b/shell_scripts/check_time_zone.sh @@ -0,0 +1,9 @@ +#!/bin/sh + +# Set a random timezone +TZ_SIGN=$( echo "+:-" | cut -d: -f "$( shuf -i 1-2 -n 1 )" ) +TZ=UTC${TZ_SIGN}$( shuf -i 0-24 -n1 ) + +export TZ + +echo "Set TZ to: ${TZ}" \ No newline at end of file diff --git a/shell_scripts/useful/find_if_file_exists.sh b/shell_scripts/find_if_file_exists.sh similarity index 100% rename from shell_scripts/useful/find_if_file_exists.sh rename to shell_scripts/find_if_file_exists.sh diff --git a/shell_scripts/useful/i2p.sh b/shell_scripts/i2p.sh similarity index 100% rename from shell_scripts/useful/i2p.sh rename to shell_scripts/i2p.sh diff --git a/shell_scripts/useful/menu.sh b/shell_scripts/menu.sh similarity index 100% rename from shell_scripts/useful/menu.sh rename to shell_scripts/menu.sh diff --git a/shell_scripts/useful/red_hello_world.sh b/shell_scripts/red_hello_world.sh similarity index 100% rename from shell_scripts/useful/red_hello_world.sh rename to shell_scripts/red_hello_world.sh diff --git a/shell_scripts/rsync.sh b/shell_scripts/rsync.sh new file mode 100755 index 0000000..375294f --- /dev/null +++ b/shell_scripts/rsync.sh @@ -0,0 +1,3 @@ +#!/bin/bash +VM=vm_dev +rsync -avz -e ssh ${VM}: --exclude-from ~/.rsync-excludes diff --git a/shell_scripts/useful/secure_pan.sh b/shell_scripts/secure_pan.sh similarity index 100% rename from shell_scripts/useful/secure_pan.sh rename to shell_scripts/secure_pan.sh diff --git a/shell_scripts/sshfs.sh b/shell_scripts/sshfs.sh new file mode 100755 index 0000000..28df562 --- /dev/null +++ b/shell_scripts/sshfs.sh @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +/usr/local/bin/sshfs vm_dev: diff --git a/shell_scripts/useful/system_info.sh b/shell_scripts/system_info.sh similarity index 100% rename from shell_scripts/useful/system_info.sh rename to shell_scripts/system_info.sh diff --git a/tmux/README.md b/tmux/README.md new file mode 100644 index 0000000..624939c --- /dev/null +++ b/tmux/README.md @@ -0,0 +1,50 @@ +## Basic Tmux Usage + +
+ +* Starting a new (named session): + +``` +tmux new -s my_session +``` + +
+ + +* Detach the session with `Ctrl-b + d`. + +
+ + +* List sessions with: + +``` +tmux ls +``` + +
+ + +* Re-attach a session: + +``` +tmux attach-session -t my_session +``` + +
+ + +* Reload a tmux config file: + +``` +tmux source-file ~/.tmux.conf +``` + +
+ + +* Kill tmux + +``` +tmux kill-server +``` diff --git a/tmux/tmux-config/.gitattributes b/tmux/tmux-config/.gitattributes new file mode 100644 index 0000000..4c9e44d --- /dev/null +++ b/tmux/tmux-config/.gitattributes @@ -0,0 +1,43 @@ +# common settings that generally should always be used with your language specific settings + +# Auto detect text files and perform LF normalization +# http://davidlaing.com/2012/09/19/customise-your-gitattributes-to-become-a-git-ninja/ +* text=auto + +# +# The above will handle all files NOT found below +# + +# Documents +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain +*.md text +*.adoc text +*.textile text +*.mustache text +*.csv text +*.tab text +*.tsv text +*.sql text + +# Graphics +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.tif binary +*.tiff binary +*.ico binary +# SVG treated as an asset (binary) by default. If you want to treat it as text, +# comment-out the following line and uncomment the line after. +*.svg binary +#*.svg text +*.eps binary \ No newline at end of file diff --git a/tmux/tmux-config/.gitignore b/tmux/tmux-config/.gitignore new file mode 100644 index 0000000..4fe6511 --- /dev/null +++ b/tmux/tmux-config/.gitignore @@ -0,0 +1,28 @@ +### https://raw.github.com/github/gitignore/8ab86f6bb71e85b5046f1d921bbbe5ceec9063ba/Global/OSX.gitignore + +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + diff --git a/tmux/tmux-config/Dockerfile b/tmux/tmux-config/Dockerfile new file mode 100644 index 0000000..706e022 --- /dev/null +++ b/tmux/tmux-config/Dockerfile @@ -0,0 +1,46 @@ +FROM debian:stretch-slim + +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + fontconfig \ + git \ + gcc \ + iputils-ping \ + libevent-dev \ + libncurses-dev \ + locales \ + make \ + procps \ + wget \ + && wget -O - https://github.com/tmux/tmux/releases/download/2.6/tmux-2.6.tar.gz | tar xzf - \ + && cd tmux-2.6 \ + && LDFLAGS="-L/usr/local/lib -Wl,-rpath=/usr/local/lib" ./configure --prefix=/usr/local \ + && make \ + && make install \ + && cd .. \ + && rm -rf tmux-2.6 \ + && apt-get purge -y gcc make \ + && apt-get -y autoremove \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen \ + && locale-gen +ENV LC_ALL=en_US.UTF-8 +ENV LANG=en_US.UTF-8 + +RUN mkdir -p $HOME/.fonts $HOME/.config/fontconfig/conf.d \ + && wget -P $HOME/.fonts https://github.com/powerline/powerline/raw/develop/font/PowerlineSymbols.otf \ + && wget -P $HOME/.config/fontconfig/conf.d/ https://github.com/powerline/powerline/raw/develop/font/10-powerline-symbols.conf \ + && fc-cache -vf $HOME/.fonts/ + +WORKDIR /root + +RUN git clone https://github.com/samoshkin/tmux-config \ + && ./tmux-config/install.sh \ + && rm -rf ./tmux-config + +ENV TERM=xterm-256color + + diff --git a/tmux/tmux-config/install.sh b/tmux/tmux-config/install.sh new file mode 100755 index 0000000..1a09b66 --- /dev/null +++ b/tmux/tmux-config/install.sh @@ -0,0 +1,43 @@ +#!/usr/bin/env bash + +set -e +set -u +set -o pipefail + +is_app_installed() { + type "$1" &>/dev/null +} + +REPODIR="$(cd "$(dirname "$0")"; pwd -P)" +cd "$REPODIR"; + +if ! is_app_installed tmux; then + printf "WARNING: \"tmux\" command is not found. \ +Install it first\n" + exit 1 +fi + +if [ ! -e "$HOME/.tmux/plugins/tpm" ]; then + printf "WARNING: Cannot found TPM (Tmux Plugin Manager) \ + at default location: \$HOME/.tmux/plugins/tpm.\n" + git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm +fi + +if [ -e "$HOME/.tmux.conf" ]; then + printf "Found existing .tmux.conf in your \$HOME directory. Will create a backup at $HOME/.tmux.conf.bak\n" +fi + +cp -f "$HOME/.tmux.conf" "$HOME/.tmux.conf.bak" 2>/dev/null || true +cp -a ./tmux/. "$HOME"/.tmux/ +ln -sf .tmux/tmux.conf "$HOME"/.tmux.conf; + +# Install TPM plugins. +# TPM requires running tmux server, as soon as `tmux start-server` does not work +# create dump __noop session in detached mode, and kill it when plugins are installed +printf "Install TPM plugins\n" +tmux new -d -s __noop >/dev/null 2>&1 || true +tmux set-environment -g TMUX_PLUGIN_MANAGER_PATH "~/.tmux/plugins" +"$HOME"/.tmux/plugins/tpm/bin/install_plugins || true +tmux kill-session -t __noop >/dev/null 2>&1 || true + +printf "OK: Completed\n" diff --git a/tmux/tmux-config/readme.md b/tmux/tmux-config/readme.md new file mode 100644 index 0000000..3e6efac --- /dev/null +++ b/tmux/tmux-config/readme.md @@ -0,0 +1,6 @@ +Tmux configuration, that supercharges your [tmux](https://tmux.github.io/) and builds cozy and cool terminal environment. + +``` +$ ./tmux-config/install.sh +``` + diff --git a/tmux/tmux-config/tmux/renew_env.sh b/tmux/tmux-config/tmux/renew_env.sh new file mode 100755 index 0000000..31a4b7c --- /dev/null +++ b/tmux/tmux-config/tmux/renew_env.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -eu + +pane_fmt="#{pane_id} #{pane_in_mode} #{pane_input_off} #{pane_dead} #{pane_current_command}" +tmux list-panes -s -F "$pane_fmt" | awk ' + $2 == 0 && $3 == 0 && $4 == 0 && $5 ~ /(bash|zsh|ksh|fish)/ { print $1 } +' | while read -r pane_id; do + # renew environment variables according to update-environment tmux option + # also clear screen + tmux send-keys -t "$pane_id" 'Enter' 'eval "$(tmux show-env -s)"' 'Enter' 'C-l' +done; \ No newline at end of file diff --git a/tmux/tmux-config/tmux/tmux.conf b/tmux/tmux-config/tmux/tmux.conf new file mode 100644 index 0000000..afa72fa --- /dev/null +++ b/tmux/tmux-config/tmux/tmux.conf @@ -0,0 +1,384 @@ +# ========================== +# === General settings === +# ========================== + +set -g default-terminal "screen-256color" +set -g history-limit 20000 +set -g buffer-limit 20 +set -sg escape-time 0 +set -g display-time 1500 +set -g remain-on-exit off +set -g repeat-time 300 +setw -g allow-rename off +setw -g automatic-rename off +setw -g aggressive-resize on + +# Change prefix key to C-a, easier to type, same to "screen" +unbind C-b +set -g prefix C-a + +# Set parent terminal title to reflect current window in tmux session +set -g set-titles on +set -g set-titles-string "#I:#W" + +# Start index of window/pane with 1, because we're humans, not computers +set -g base-index 1 +setw -g pane-base-index 1 + +# Enable mouse support +set -g mouse on + + +# ========================== +# === Key bindings === +# ========================== + +# Unbind default key bindings, we're going to override +unbind "\$" # rename-session +unbind , # rename-window +unbind % # split-window -h +unbind '"' # split-window +unbind } # swap-pane -D +unbind { # swap-pane -U +unbind [ # paste-buffer +unbind ] +unbind "'" # select-window +unbind n # next-window +unbind p # previous-window +unbind l # last-window +unbind M-n # next window with alert +unbind M-p # next window with alert +unbind o # focus thru panes +unbind & # kill-window +unbind "#" # list-buffer +unbind = # choose-buffer +unbind z # zoom-pane +unbind M-Up # resize 5 rows up +unbind M-Down # resize 5 rows down +unbind M-Right # resize 5 rows right +unbind M-Left # resize 5 rows left + + +# Edit configuration and reload +bind C-e new-window -n 'tmux.conf' "sh -c '\${EDITOR:-vim} ~/.tmux.conf && tmux source ~/.tmux.conf && tmux display \"Config reloaded\"'" + +# Reload tmux configuration +bind C-r source-file ~/.tmux.conf \; display "Config reloaded" + +# new window and retain cwd +bind c new-window -c "#{pane_current_path}" + +# Prompt to rename window right after it's created +set-hook -g after-new-window 'command-prompt -I "#{window_name}" "rename-window '%%'"' + +# Rename session and window +bind r command-prompt -I "#{window_name}" "rename-window '%%'" +bind R command-prompt -I "#{session_name}" "rename-session '%%'" + +# Split panes +bind | split-window -h -c "#{pane_current_path}" +bind _ split-window -v -c "#{pane_current_path}" + +# Select pane and windows +bind -r C-[ previous-window +bind -r C-] next-window +bind -r [ select-pane -t :.- +bind -r ] select-pane -t :.+ +bind -r Tab last-window # cycle thru MRU tabs +bind -r C-o swap-pane -D + +# Zoom pane +bind + resize-pane -Z + +# Link window +bind L command-prompt -p "Link window from (session:window): " "link-window -s %% -a" + +# Swap panes back and forth with 1st pane +# When in main-(horizontal|vertical) layouts, the biggest/widest panel is always @1 +bind \ if '[ #{pane_index} -eq 1 ]' \ + 'swap-pane -s "!"' \ + 'select-pane -t:.1 ; swap-pane -d -t 1 -s "!"' + +# Kill pane/window/session shortcuts +bind x kill-pane +bind X kill-window +bind C-x confirm-before -p "kill other windows? (y/n)" "kill-window -a" +bind Q confirm-before -p "kill-session #S? (y/n)" kill-session + +# Merge session with another one (e.g. move all windows) +# If you use adhoc 1-window sessions, and you want to preserve session upon exit +# but don't want to create a lot of small unnamed 1-window sessions around +# move all windows from current session to main named one (dev, work, etc) +bind C-u command-prompt -p "Session to merge with: " \ + "run-shell 'yes | head -n #{session_windows} | xargs -I {} -n 1 tmux movew -t %%'" + +# Detach from session +bind d detach +bind D if -F '#{session_many_attached}' \ + 'confirm-before -p "Detach other clients? (y/n)" "detach -a"' \ + 'display "Session has only 1 client attached"' + +# Hide status bar on demand +bind C-s if -F '#{s/off//:status}' 'set status off' 'set status on' + + + +# ================================================== +# === Window monitoring for activity and silence === +# ================================================== +bind m setw monitor-activity \; display-message 'Monitor window activity [#{?monitor-activity,ON,OFF}]' +bind M if -F '#{monitor-silence}' \ + 'setw monitor-silence 0 ; display-message "Monitor window silence [OFF]"' \ + 'command-prompt -p "Monitor silence: interval (s)" "setw monitor-silence %%"' + +# Activity bell and whistles +set -g visual-activity on + +# TODO: Does not work as well, check on newer versions +# set -g visual-silence on + +# BUG: bell-action other ignored · Issue #1027 · tmux/tmux · GitHub - https://github.com/tmux/tmux/issues/1027 +# set -g visual-bell on +# setw -g bell-action other + +# ================================================ +# === Copy mode, scroll and clipboard === +# ================================================ +set -g @copy_use_osc52_fallback on + +# Prefer vi style key table +setw -g mode-keys vi + +bind p paste-buffer +bind C-p choose-buffer + +# trigger copy mode by +bind -n M-Up copy-mode + +# Scroll up/down by 1 line, half screen, whole screen +bind -T copy-mode-vi M-Up send-keys -X scroll-up +bind -T copy-mode-vi M-Down send-keys -X scroll-down +bind -T copy-mode-vi M-PageUp send-keys -X halfpage-up +bind -T copy-mode-vi M-PageDown send-keys -X halfpage-down +bind -T copy-mode-vi PageDown send-keys -X page-down +bind -T copy-mode-vi PageUp send-keys -X page-up + +# When scrolling with mouse wheel, reduce number of scrolled rows per tick to "2" (default is 5) +bind -T copy-mode-vi WheelUpPane select-pane \; send-keys -X -N 2 scroll-up +bind -T copy-mode-vi WheelDownPane select-pane \; send-keys -X -N 2 scroll-down + +# wrap default shell in reattach-to-user-namespace if available +# there is some hack with `exec & reattach`, credits to "https://github.com/gpakosz/.tmux" +# don't really understand how it works, but at least window are not renamed to "reattach-to-user-namespace" +if -b "command -v reattach-to-user-namespace > /dev/null 2>&1" \ + "run 'tmux set -g default-command \"exec $(tmux show -gv default-shell) 2>/dev/null & reattach-to-user-namespace -l $(tmux show -gv default-shell)\"'" + +yank="~/.tmux/yank.sh" + +# Copy selected text +bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "$yank" +bind -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "$yank" +bind -T copy-mode-vi Y send-keys -X copy-line \;\ + run "tmux save-buffer - | $yank" +bind-key -T copy-mode-vi D send-keys -X copy-end-of-line \;\ + run "tmux save-buffer - | $yank" +bind -T copy-mode-vi C-j send-keys -X copy-pipe-and-cancel "$yank" +bind-key -T copy-mode-vi A send-keys -X append-selection-and-cancel \;\ + run "tmux save-buffer - | $yank" + +# Copy selection on drag end event, but do not cancel copy mode and do not clear selection +# clear select on subsequence mouse click +bind -T copy-mode-vi MouseDragEnd1Pane \ + send-keys -X copy-pipe "$yank" +bind -T copy-mode-vi MouseDown1Pane select-pane \;\ + send-keys -X clear-selection + +# iTerm2 works with clipboard out of the box, set-clipboard already set to "external" +# tmux show-options -g -s set-clipboard +# set-clipboard on|external + +# ===================================== +# === Theme === +# ===================================== + +# Feel free to NOT use this variables at all (remove, rename) +# this are named colors, just for convenience +color_orange="colour166" # 208, 166 +color_purple="colour134" # 135, 134 +color_green="colour076" # 070 +color_blue="colour39" +color_yellow="colour220" +color_red="colour160" +color_black="colour232" +color_white="white" # 015 + +# This is a theme CONTRACT, you are required to define variables below +# Change values, but not remove/rename variables itself +color_dark="$color_black" +color_light="$color_white" +color_session_text="$color_blue" +color_status_text="colour245" +color_main="$color_orange" +color_secondary="$color_purple" +color_level_ok="$color_green" +color_level_warn="$color_yellow" +color_level_stress="$color_red" +color_window_off_indicator="colour088" +color_window_off_status_bg="colour238" +color_window_off_status_current_bg="colour254" + +# ===================================== +# === Appearence and status bar === +# ====================================== + +set -g mode-style "fg=default,bg=$color_main" + +# command line style +set -g message-style "fg=$color_main,bg=$color_dark" + +# status line style +set -g status-style "fg=$color_status_text,bg=$color_dark" + +# window segments in status line +set -g window-status-separator "" +separator_powerline_left="" +separator_powerline_right="" + +# setw -g window-status-style "fg=$color_status_text,bg=$color_dark" +setw -g window-status-format " #I:#W " +setw -g window-status-current-style "fg=$color_light,bold,bg=$color_main" +setw -g window-status-current-format "#[fg=$color_dark,bg=$color_main]$separator_powerline_right#[default] #I:#W# #[fg=$color_main,bg=$color_dark]$separator_powerline_right#[default]" + +# when window has monitoring notification +setw -g window-status-activity-style "fg=$color_main" + +# outline for active pane +setw -g pane-active-border-style "fg=$color_main" + +# general status bar settings +set -g status on +set -g status-interval 5 +set -g status-position top +set -g status-justify left +set -g status-right-length 100 + +# define widgets we're going to use in status bar +# note, that this is not the complete list, some of them are loaded from plugins +wg_session="#[fg=$color_session_text] #S #[default]" +wg_battery="#{battery_status_fg} #{battery_icon} #{battery_percentage}" +wg_date="#[fg=$color_secondary]%h %d %H:%M#[default]" +wg_user_host="#[fg=$color_secondary]#(whoami)#[default]@#H" +wg_is_zoomed="#[fg=$color_dark,bg=$color_secondary]#{?window_zoomed_flag,[Z],}#[default]" +# TODO: highlighted for nested local session as well +wg_is_keys_off="#[fg=$color_light,bg=$color_window_off_indicator]#([ $(tmux show-option -qv key-table) = 'off' ] && echo 'OFF')#[default]" + +set -g status-left "$wg_session" +set -g status-right "#{prefix_highlight} $wg_is_keys_off $wg_is_zoomed #{sysstat_cpu} | #{sysstat_mem} | #{sysstat_loadavg} | $wg_user_host | $wg_date $wg_battery #{online_status}" + +# online and offline icon for tmux-online-status +set -g @online_icon "#[fg=$color_level_ok]●#[default]" +set -g @offline_icon "#[fg=$color_level_stress]●#[default]" + +# Configure view templates for tmux-plugin-sysstat "MEM" and "CPU" widget +set -g @sysstat_mem_view_tmpl 'MEM:#[fg=#{mem.color}]#{mem.pused}#[default] #{mem.used}' + +# Configure colors for tmux-plugin-sysstat "MEM" and "CPU" widget +set -g @sysstat_cpu_color_low "$color_level_ok" +set -g @sysstat_cpu_color_medium "$color_level_warn" +set -g @sysstat_cpu_color_stress "$color_level_stress" + +set -g @sysstat_mem_color_low "$color_level_ok" +set -g @sysstat_mem_color_medium "$color_level_warn" +set -g @sysstat_mem_color_stress "$color_level_stress" + +set -g @sysstat_swap_color_low "$color_level_ok" +set -g @sysstat_swap_color_medium "$color_level_warn" +set -g @sysstat_swap_color_stress "$color_level_stress" + + +# Configure tmux-battery widget colors +set -g @batt_color_full_charge "#[fg=$color_level_ok]" +set -g @batt_color_high_charge "#[fg=$color_level_ok]" +set -g @batt_color_medium_charge "#[fg=$color_level_warn]" +set -g @batt_color_low_charge "#[fg=$color_level_stress]" + +# Configure tmux-prefix-highlight colors +set -g @prefix_highlight_output_prefix '[' +set -g @prefix_highlight_output_suffix ']' +set -g @prefix_highlight_fg "$color_dark" +set -g @prefix_highlight_bg "$color_secondary" +set -g @prefix_highlight_show_copy_mode 'on' +set -g @prefix_highlight_copy_mode_attr "fg=$color_dark,bg=$color_secondary" + + +# ===================================== +# === Renew environment === +# ===================================== +set -g update-environment \ + "DISPLAY\ + SSH_ASKPASS\ + SSH_AUTH_SOCK\ + SSH_AGENT_PID\ + SSH_CONNECTION\ + SSH_TTY\ + WINDOWID\ + XAUTHORITY" + +bind '$' run "~/.tmux/renew_env.sh" + + +# ============================ +# === Plugins === +# ============================ +set -g @plugin 'tmux-plugins/tpm' +set -g @plugin 'tmux-plugins/tmux-battery' +set -g @plugin 'tmux-plugins/tmux-prefix-highlight' +set -g @plugin 'tmux-plugins/tmux-online-status' +set -g @plugin 'tmux-plugins/tmux-sidebar' +set -g @plugin 'tmux-plugins/tmux-copycat' +set -g @plugin 'tmux-plugins/tmux-open' +set -g @plugin 'samoshkin/tmux-plugin-sysstat' + +# Plugin properties +set -g @sidebar-tree 't' +set -g @sidebar-tree-focus 'T' +set -g @sidebar-tree-command 'tree -C' + +set -g @open-S 'https://www.google.com/search?q=' + + +# ============================================== +# === Nesting local and remote sessions === +# ============================================== + +# Session is considered to be remote when we ssh into host +if-shell 'test -n "$SSH_CLIENT"' \ + 'source-file ~/.tmux/tmux.remote.conf' + +# We want to have single prefix key "C-a", usable both for local and remote session +# we don't want to "C-a" + "a" approach either +# Idea is to turn off all key bindings and prefix handling on local session, +# so that all keystrokes are passed to inner/remote session + +# see: toggle on/off all keybindings · Issue #237 · tmux/tmux - https://github.com/tmux/tmux/issues/237 + +# Also, change some visual styles when window keys are off +bind -T root F12 \ + set prefix None \;\ + set key-table off \;\ + set status-style "fg=$color_status_text,bg=$color_window_off_status_bg" \;\ + set window-status-current-format "#[fg=$color_window_off_status_bg,bg=$color_window_off_status_current_bg]$separator_powerline_right#[default] #I:#W# #[fg=$color_window_off_status_current_bg,bg=$color_window_off_status_bg]$separator_powerline_right#[default]" \;\ + set window-status-current-style "fg=$color_dark,bold,bg=$color_window_off_status_current_bg" \;\ + if -F '#{pane_in_mode}' 'send-keys -X cancel' \;\ + refresh-client -S \;\ + +bind -T off F12 \ + set -u prefix \;\ + set -u key-table \;\ + set -u status-style \;\ + set -u window-status-current-style \;\ + set -u window-status-current-format \;\ + refresh-client -S + +# Run all plugins' scripts +run '~/.tmux/plugins/tpm/tpm' diff --git a/tmux/tmux-config/tmux/tmux.remote.conf b/tmux/tmux-config/tmux/tmux.remote.conf new file mode 100644 index 0000000..ea385bc --- /dev/null +++ b/tmux/tmux-config/tmux/tmux.remote.conf @@ -0,0 +1,10 @@ +# show status bar at bottom for remote session, +# so it do not stack together with local session's one +set -g status-position bottom + +# Set port of SSH remote tunnel, where tmux will pipe buffers to transfer on local machine for copy +set -g @copy_backend_remote_tunnel_port 11988 + +# In remote mode we don't show "clock" and "battery status" widgets +set -g status-left "$wg_session" +set -g status-right "#{prefix_highlight} $wg_is_keys_off $wg_is_zoomed #{sysstat_cpu} | #{sysstat_mem} | #{sysstat_loadavg} | $wg_user_host | #{online_status}" diff --git a/tmux/tmux-config/tmux/yank.sh b/tmux/tmux-config/tmux/yank.sh new file mode 100755 index 0000000..83686c6 --- /dev/null +++ b/tmux/tmux-config/tmux/yank.sh @@ -0,0 +1,68 @@ +#!/usr/bin/env bash + +set -eu + +is_app_installed() { + type "$1" &>/dev/null +} + +# get data either form stdin or from file +buf=$(cat "$@") + +copy_backend_remote_tunnel_port=$(tmux show-option -gvq "@copy_backend_remote_tunnel_port") +copy_use_osc52_fallback=$(tmux show-option -gvq "@copy_use_osc52_fallback") + +# Resolve copy backend: pbcopy (OSX), reattach-to-user-namespace (OSX), xclip/xsel (Linux) +copy_backend="" +if is_app_installed pbcopy; then + copy_backend="pbcopy" +elif is_app_installed reattach-to-user-namespace; then + copy_backend="reattach-to-user-namespace pbcopy" +elif [ -n "${DISPLAY-}" ] && is_app_installed xsel; then + copy_backend="xsel -i --clipboard" +elif [ -n "${DISPLAY-}" ] && is_app_installed xclip; then + copy_backend="xclip -i -f -selection primary | xclip -i -selection clipboard" +elif [ -n "${copy_backend_remote_tunnel_port-}" ] \ + && (netstat -f inet -nl 2>/dev/null || netstat -4 -nl 2>/dev/null) \ + | grep -q "[.:]$copy_backend_remote_tunnel_port"; then + copy_backend="nc localhost $copy_backend_remote_tunnel_port" +fi + +# if copy backend is resolved, copy and exit +if [ -n "$copy_backend" ]; then + printf "%s" "$buf" | eval "$copy_backend" + exit; +fi + + +# If no copy backends were eligible, decide to fallback to OSC 52 escape sequences +# Note, most terminals do not handle OSC +if [ "$copy_use_osc52_fallback" == "off" ]; then + exit; +fi + +# Copy via OSC 52 ANSI escape sequence to controlling terminal +buflen=$( printf %s "$buf" | wc -c ) + +# https://sunaku.github.io/tmux-yank-osc52.html +# The maximum length of an OSC 52 escape sequence is 100_000 bytes, of which +# 7 bytes are occupied by a "\033]52;c;" header, 1 byte by a "\a" footer, and +# 99_992 bytes by the base64-encoded result of 74_994 bytes of copyable text +maxlen=74994 + +# warn if exceeds maxlen +if [ "$buflen" -gt "$maxlen" ]; then + printf "input is %d bytes too long" "$(( buflen - maxlen ))" >&2 +fi + +# build up OSC 52 ANSI escape sequence +esc="\033]52;c;$( printf %s "$buf" | head -c $maxlen | base64 | tr -d '\r\n' )\a" +esc="\033Ptmux;\033$esc\033\\" + +# resolve target terminal to send escape sequence +# if we are on remote machine, send directly to SSH_TTY to transport escape sequence +# to terminal on local machine, so data lands in clipboard on our local machine +pane_active_tty=$(tmux list-panes -F "#{pane_active} #{pane_tty}" | awk '$1=="1" { print $2 }') +target_tty="${SSH_TTY:-$pane_active_tty}" + +printf "$esc" > "$target_tty" diff --git a/tmux/tmux.conf b/tmux/tmux.conf new file mode 100644 index 0000000..fd9fa13 --- /dev/null +++ b/tmux/tmux.conf @@ -0,0 +1,77 @@ +# split panes using | and - +bind | split-window -h +bind - split-window -v +unbind '"' +unbind % + +# History +set -g history-limit 10000 + +# Terminal emulator window title +set -g set-titles on +set -g set-titles-string '[#S:#I.#H] #W' + +# Status Bar +set-option -g status-bg white +set-option -g status-fg black + +# Notifying if other windows has activities +setw -g monitor-activity off +set -g visual-activity on + +# Clock +setw -g clock-mode-colour green +setw -g clock-mode-style 24 + +# make scrolling with wheels work +bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'select-pane -t=; copy-mode -e; send-keys -M'" + +# Mouse Support +setw -g mouse + +# Add SSH_TTY to the list of environment variables tmux knows about: +set-option -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY SSH_TTY" + +# Assume terminals want 256 colors +set-option -g default-terminal screen-256color + +# Colors +# Status bar has a dim gray background +set-option -g status-bg black +set-option -g status-fg colour74 + +# Left shows the session name, in blue +set-option -g status-left-bg default +set-option -g status-left-fg colour74 + +# Right is some CPU stats, so terminal green +set-option -g status-right-bg default +set-option -g status-right-fg black +set -g status-right "Impossible is a State of Mind" + +# statusbar +set -g status-position bottom +set -g status-justify left +set -g status-style 'bg=colour219 fg=colour137' +set -g status-left '#[fg=colour233,bg=colour219] %d/%m #[fg=colour233,bg=colour8] %H:%M:%S ' +set -g status-right-length 50 +set -g status-left-length 20 + +setw -g window-status-current-style 'fg=colour1 bg=colour219 bold' +setw -g window-status-current-format ' #I#[fg=colour249]:#[fg=colour255]#W#[fg=colour249]#F ' + +setw -g window-status-style 'fg=colour9 bg=colour219' +setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F ' + +setw -g window-status-bell-style 'fg=colour255 bg=colour1 bold' + +# Highlighting the active window in status bar +setw -g window-status-current-bg colour234 +setw -g window-status-current-fg colour71 + +# zsh +set-option -g default-shell ${SHELL} +set-option -g default-shell /bin/zsh + + +new-session diff --git a/ubuntu/post_install_ubuntu.sh b/ubuntu/post_install_ubuntu.sh new file mode 100644 index 0000000..b52d5ef --- /dev/null +++ b/ubuntu/post_install_ubuntu.sh @@ -0,0 +1,88 @@ +#!/bin/bash + + +# Post-installation bash script for Ubuntu + + +tabs 4 + + +TITLE="Ubuntu Post-Install Script" + + +function main { + echo_message header "Starting 'main' function" + # Draw window + MAIN=$(eval `resize` && whiptail \ + --notags \ + --title "$TITLE" \ + --menu "\nWhat would you like to do?" \ + --cancel-button "Quit" \ + $LINES $COLUMNS $(( $LINES - 12 )) \ + 'system_update' 'Perform system updates' \ + 'install_favs' 'Install preferred applications' \ + 'install_favs_dev' 'Install preferred development tools' \ + 'install_favs_utils' 'Install preferred utilities' \ + 'install_gnome' 'Install preferred GNOME software' \ + 'install_codecs' 'Install multimedia codecs' \ + 'install_fonts' 'Install additional fonts' \ + 'install_snap_apps' 'Install Snap applications' \ + 'install_flatpak_apps' 'Install Flatpak applications' \ + 'install_thirdparty' 'Install third-party applications' \ + 'setup_dotfiles' 'Configure dotfiles' \ + 'system_configure' 'Configure system' \ + 'system_cleanup' 'Cleanup the system' \ + 3>&1 1>&2 2>&3) + # check exit status + if [ $? = 0 ]; then + echo_message header "Starting '$MAIN' function" + $MAIN + else + # Quit + quit + fi +} + +# Quit +function quit { + echo_message header "Starting 'quit' function" + echo_message title "Exiting $TITLE..." + # Draw window + if (whiptail --title "Quit" --yesno "Are you sure you want quit?" 8 56) then + echo_message welcome 'Thanks for using!' + exit 99 + else + main + fi +} + +# Import Functions +function import_functions { + DIR="functions" + # iterate through the files in the 'functions' folder + for FUNCTION in $(dirname "$0")/$DIR/*; do + # skip directories + if [[ -d $FUNCTION ]]; then + continue + # exclude markdown readmes + elif [[ $FUNCTION == *.md ]]; then + continue + elif [[ -f $FUNCTION ]]; then + # source the function file + . $FUNCTION + fi + done +} + +# Import main functions +import_functions +# Welcome message +echo_message welcome "$TITLE" +# Run system checks +system_checks +# main +while : +do + main +done + diff --git a/vim/.netrwhist b/vim/.netrwhist new file mode 100644 index 0000000..1577cdf --- /dev/null +++ b/vim/.netrwhist @@ -0,0 +1,3 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhist_cnt =1 +let g:netrw_dirhist_1='/Users/mia/Projects/blog/blog/output/author' diff --git a/vim/bundle/vim/.netrwhist b/vim/bundle/vim/.netrwhist new file mode 100644 index 0000000..125993e --- /dev/null +++ b/vim/bundle/vim/.netrwhist @@ -0,0 +1,4 @@ +let g:netrw_dirhistmax =10 +let g:netrw_dirhist_cnt =2 +let g:netrw_dirhist_1='/Users/mia/Projects/THREAT_INTEL/threat_intel/threat_intel/util' +let g:netrw_dirhist_2='/Users/mia/Projects/security-tools' diff --git a/configs/vim/colors/cyberpunk.vim b/vim/colors/cyberpunk.vim similarity index 100% rename from configs/vim/colors/cyberpunk.vim rename to vim/colors/cyberpunk.vim diff --git a/configs/vimrc b/vim/vimrc similarity index 100% rename from configs/vimrc rename to vim/vimrc diff --git a/vpn/README.md b/vpn/README.md new file mode 100644 index 0000000..8c2bf3f --- /dev/null +++ b/vpn/README.md @@ -0,0 +1 @@ +# Cloud Scripts diff --git a/vpn/generate_vpn_pki_resources.sh b/vpn/generate_vpn_pki_resources.sh new file mode 100755 index 0000000..5bd188b --- /dev/null +++ b/vpn/generate_vpn_pki_resources.sh @@ -0,0 +1,41 @@ +#!/bin/bash +# This scripts creates PKI secrets +# Author: Mia Stein + +DOMAIN= +ACM_ENV= +ACM_DIR=~/.acm_secrets + +LOCAL_DIR=$(pwd) +git clone https://github.com/OpenVPN/easy-rsa.git && cd easy-rsa/easyrsa3 + +# Create PKI +./easyrsa init-pki + +# Generates the CA certificate without a password +yes | ./easyrsa build-ca nopass + +# Build server certificate without a password +./easyrsa build-server-full server"$DOMAIN" nopass + +# Build client certificate without a password +./easyrsa build-client-full client"$DOMAIN" nopass + +# Copy certificate files to a new directory +if [ -d "$ACM_DIR" ] +then + echo Info: directory "$ACM_DIR" exists. +else + mkdir "$ACM_DIR" +fi + +cp "$LOCAL_DIR"/easy-rsa/easyrsa3/pki/ca.crt "$ACM_DIR"/"$ACM_ENV"_ca.crt +cp "$LOCAL_DIR"/easy-rsa/easyrsa3/pki/issued/*.crt "$ACM_DIR" +cp "$LOCAL_DIR"/easy-rsa/easyrsa3/pki/private/*.key "$ACM_DIR" + +echo Info: Certificates and keys were generate in "$ACM_DIR" + +# Clean up +cd "$LOCAL_DIR" +rm -rf "$LOCAL_DIR"/easy-rsa + diff --git a/vpn/push_vpn_pki_resources.sh b/vpn/push_vpn_pki_resources.sh new file mode 100755 index 0000000..72986bf --- /dev/null +++ b/vpn/push_vpn_pki_resources.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# This script pushes PKI certs to AWS ACM. +# Author: Mia Stein + +ACM_ENV= +DOMAIN= +AWS_REGION= + +ACM_DIR=~/.acm_secrets + +CLIENT_KEY="$ACM_DIR"/client"$DOMAIN".key +CLIENT_CERT="$ACM_DIR"/client"$DOMAIN".crt +SERVER_KEY="$ACM_DIR"/server"$DOMAIN".key +SERVER_CERT="$ACM_DIR"/server"$DOMAIN".crt +CA_CERTIFICATE="$ACM_DIR"/"$ACM_ENV"_ca.crt + + +echo "Pushing client certificate and key to ACM..." + +CLIENT_CERT_ARN=`aws acm import-certificate --certificate file://"$CLIENT_CERT" --private-key file://"$CLIENT_KEY" --certificate-chain file://"$CA_CERTIFICATE" --region "$AWS_REGION" | jq '.CertificateArn' + +echo "Successfully pushed client certificate with ARN "$CLIENT_CERT_ARN + + +echo "Pushing server certificate and key to ACM..." + +SERVER_CERT_ARN=`aws acm import-certificate --certificate file://"$SERVER_CERT" --private-key file://"$SERVER_KEY" --certificate-chain file://"$CA_CERTIFICATE" --region "$AWS_REGION" | jq '.CertificateArn' + +echo "Successfully pushed client certificate with ARN "$SERVER_CERT_ARN + diff --git a/vscode/README.md b/vscode/README.md new file mode 100644 index 0000000..1d41eb8 --- /dev/null +++ b/vscode/README.md @@ -0,0 +1,36 @@ +# Vscode plugins + +* Auto Import +* Code Spell Checker +* Debugger for Chrome +* Docker +* Document This +* EditorConfig +* ESLint +* GitLens +* GraphQL +* JavaScript (ES6) Code Snippets +* Jest Snippets Standard Style +* npm +* npm Intellisense +* Prettier +* Prettify Selected JSON +* Promise Snippets +* ReactJS Code Snippets +* Remark +* Simple React Snippets +* Commitizen Support +* styled-components + +## Useful Shortcuts + +* Open the terminal with: + +``` +^` +``` +* add this alias to your shell profile (e.g. `~/.zshrc`): + +``` +alias code="open -a 'Visual Studio Code'" +``` diff --git a/zsh/README.md b/zsh/README.md new file mode 100644 index 0000000..6f5452f --- /dev/null +++ b/zsh/README.md @@ -0,0 +1,3 @@ +## zsh + +* [spaceship plugin](https://github.com/denysdovhan/spaceship-prompt). diff --git a/zsh/zshrc b/zsh/zshrc new file mode 100644 index 0000000..641929e --- /dev/null +++ b/zsh/zshrc @@ -0,0 +1,47 @@ +########### +# Exports +########### + +export PATH="$HOME/go/bin/:$PATH" +export GOPATH=$HOME/go +export GOROOT=/usr/local/opt/go/libexec +export PATH=$PATH:$GOPATH/bin +export PATH=$PATH:$GOROOT/bin + +export KUBECONFIG=~/.kube/config +export KUBECTX_CURRENT_FGCOLOR=$(tput setaf 3) +export KUBECTX_CURRENT_BGCOLOR=$(tput setab 5) + +export HISTCONTROL=ignoredups +export CLICOLOR=230 +export GREP_COLOR='1;31' # green for matches +export GREP_OPTIONS='--color=auto' + +export ZSH="/Users/mia/.oh-my-zsh" +ZSH_THEME="robbyrussell" + + +########### +# PLUGINS ✨ +############ + +plugins=(git) +source $ZSH/oh-my-zsh.sh + + +########## +# ALIAS ✨ +########## + +alias fly="/usr/local/opt/fly" +alias zshconfig="mate ~/.zshrc" +alias ohmyzsh="mate ~/.oh-my-zsh" +alias code="open -a 'Visual Studio Code'" + +alias gc="git commit" +alias ga="git add" +alias gp="git push" +alias gp="git pull" + +alias k="kubectl" +