(List (Com {[LIT_CHARS set]} {[LIT_CHARS -o]} {[LIT_CHARS errexit]} ) (Com {[LIT_CHARS set]} {[LIT_CHARS -o]} {[LIT_CHARS nounset]} ) (Com {[LIT_CHARS set]} {[LIT_CHARS -o]} {[LIT_CHARS pipefail]} ) (= scope= flags=2 words=[] bindings=[('report_dir', {[DQ [VarSub 1 test_op=VS_TEST_COLON_HYPHEN {[LIT_CHARS _artifacts]}]]})]) (= scope= flags=2 words=[] bindings=[('use_kubectl', {[DQ [VarSub LOG_DUMP_USE_KUBECTL test_op=VS_TEST_COLON_HYPHEN {}]]})]) (= scope= flags=2 words=[] bindings=[('master_ssh_supported_providers', {[DQ [LIT_CHARS "gce aws kubemark"]]})]) (= scope= flags=2 words=[] bindings=[('node_ssh_supported_providers', {[DQ [LIT_CHARS "gce gke aws"]]})]) (= scope= flags=2 words=[] bindings=[('master_logfiles', {[DQ [LIT_CHARS "kube-apiserver kube-scheduler kube-controller-manager etcd glbc cluster-autoscaler"]]})]) (= scope= flags=2 words=[] bindings=[('node_logfiles', {[DQ [LIT_CHARS kube-proxy]]})]) (= scope= flags=2 words=[] bindings=[('aws_logfiles', {[DQ [LIT_CHARS cloud-init-output]]})]) (= scope= flags=2 words=[] bindings=[('gce_logfiles', {[DQ [LIT_CHARS startupscript]]})]) (= scope= flags=2 words=[] bindings=[('kern_logfile', {[DQ [LIT_CHARS kern]]})]) (= scope= flags=2 words=[] bindings=[('initd_logfiles', {[DQ [LIT_CHARS docker]]})]) (= scope= flags=2 words=[] bindings=[('supervisord_logfiles', {[DQ [LIT_CHARS "kubelet supervisor/supervisord supervisor/kubelet-stdout supervisor/kubelet-stderr supervisor/docker-stdout supervisor/docker-stderr"]]})]) (= scope= flags=2 words=[] bindings=[('max_scp_processes', {[LIT_CHARS 25]})]) (= scope= flags=2 words=[] bindings=[('ips_and_images', {[SQ ]})]) (FunctionDef setup [] (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub use_kubectl]]}}) (List (= scope= flags=0 words=[] bindings=[('KUBE_ROOT', {[ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub BASH_SOURCE]]})] [LIT_CHARS /..]})]) (Com {[LIT_OTHER ":"]} {[VarSub KUBE_CONFIG_FILE test_op=VS_TEST_COLON_EQUALS {[DQ [LIT_CHARS config-test.sh]]}]} ) (Com {[LIT_CHARS source]} {[DQ [VarSub KUBE_ROOT][LIT_CHARS /cluster/kube-util.sh]]} ) (Fork (Com {[LIT_CHARS detect-project]} ) ) (Com < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub LOG_DUMP_SSH_KEY test_op=VS_TEST_COLON_HYPHEN {}]]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "LOG_DUMP_SSH_KEY not set, but required by LOG_DUMP_USE_KUBECTL"]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) (DBracket {B1 UNARY_STRING_z {[DQ [VarSub LOG_DUMP_SSH_USER test_op=VS_TEST_COLON_HYPHEN {}]]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "LOG_DUMP_SSH_USER not set, but required by LOG_DUMP_USE_KUBECTL"]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) (FunctionDef log-dump-ssh [] (List (If (DBracket {B1 UNARY_STRING_z {[DQ [VarSub use_kubectl]]}}) (List (Com {[LIT_CHARS ssh-to-node]} {[DQ [VarSub @]]} ) (Com {[LIT_CHARS return]} ) ) ) (= scope= flags=0 words=[] bindings=[('host', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[] bindings=[('cmd', {[DQ [VarSub 2]]})]) (Com {[LIT_CHARS ssh]} {[LIT_CHARS -oLogLevel] [LIT_DBRACKET_LIKE "="] [LIT_CHARS quiet]} {[LIT_CHARS -oConnectTimeout] [LIT_DBRACKET_LIKE "="] [LIT_CHARS 30]} {[LIT_CHARS -oStrictHostKeyChecking] [LIT_DBRACKET_LIKE "="] [LIT_CHARS no]} {[LIT_CHARS -i]} {[DQ [VarSub LOG_DUMP_SSH_KEY]]} {[DQ [VarSub LOG_DUMP_SSH_USER][LIT_CHARS "@"][VarSub host]]} {[DQ [VarSub cmd]]} ) ) ) (FunctionDef copy-logs-from-node [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('node', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('dir', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('files', {[Array {[VarSub 3]}]})]) (= scope= flags=0 words=[] bindings=[('files', {[Array {[DQ [VarSub files bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[PatSub {} {[LIT_CHARS ".log*"]} do_prefix]]]}]})]) (= scope= flags=0 words=[] bindings=[('files', {[Array {[DQ [VarSub files bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[PatSub {} {[\ LIT_ESCAPED_CHAR "\\/"] [LIT_CHARS var] [\ LIT_ESCAPED_CHAR "\\/"] [LIT_CHARS log] [\ LIT_ESCAPED_CHAR "\\/"]} do_suffix]]]}]})]) (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('scp_files', {[DQ [LIT_CHARS "{"][ComSub (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "%s,"]]} {[DQ [VarSub files bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]})][LIT_CHARS "}"]]})]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub use_kubectl]]}}) (AndOr OP_OR_IF (Com {[LIT_CHARS scp]} {[LIT_CHARS -oLogLevel] [LIT_DBRACKET_LIKE "="] [LIT_CHARS quiet]} {[LIT_CHARS -oConnectTimeout] [LIT_DBRACKET_LIKE "="] [LIT_CHARS 30]} {[LIT_CHARS -oStrictHostKeyChecking] [LIT_DBRACKET_LIKE "="] [LIT_CHARS no]} {[LIT_CHARS -i]} {[DQ [VarSub LOG_DUMP_SSH_KEY]]} {[DQ [VarSub LOG_DUMP_SSH_USER][LIT_CHARS "@"][VarSub node][LIT_CHARS ":"][VarSub scp_files]]} {[DQ [VarSub dir]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (Com {[LIT_CHARS true]} ) ) (ElseTrue) (Case to_match={[DQ [VarSub KUBERNETES_PROVIDER]]}, pat_word_list=[[{[LIT_CHARS gce]}, {[LIT_CHARS gke]}, {[LIT_CHARS kubemark]}], [{[LIT_CHARS aws]}]] (AndOr OP_OR_IF (Com {[LIT_CHARS gcloud]} {[LIT_CHARS compute]} {[LIT_CHARS copy-files]} {[LIT_CHARS --project]} {[DQ [VarSub PROJECT]]} {[LIT_CHARS --zone]} {[DQ [VarSub ZONE]]} {[DQ [VarSub node][LIT_CHARS ":"][VarSub scp_files]]} {[DQ [VarSub dir]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (Com {[LIT_CHARS true]} ) ) (List (= scope= flags=0 words=[] bindings=[('ip', {[ComSub (Com {[LIT_CHARS get_ssh_hostname]} {[DQ [VarSub node]]})]})]) (AndOr OP_OR_IF (Com {[LIT_CHARS scp]} {[LIT_CHARS -oLogLevel] [LIT_DBRACKET_LIKE "="] [LIT_CHARS quiet]} {[LIT_CHARS -oConnectTimeout] [LIT_DBRACKET_LIKE "="] [LIT_CHARS 30]} {[LIT_CHARS -oStrictHostKeyChecking] [LIT_DBRACKET_LIKE "="] [LIT_CHARS no]} {[LIT_CHARS -i]} {[DQ [VarSub AWS_SSH_KEY]]} {[DQ [VarSub SSH_USER][LIT_CHARS "@"][VarSub ip][LIT_CHARS ":"][VarSub scp_files]]} {[DQ [VarSub dir]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (Com {[LIT_CHARS true]} ) ) ) ) ) ) ) (FunctionDef save-logs [] (List (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('node_name', {[DQ [VarSub 1]]})]) (= scope= flags=0 words=[{[LIT_CHARS -r]}] bindings=[('dir', {[DQ [VarSub 2]]})]) (= scope= flags=0 words=[] bindings=[('files', {[DQ [VarSub 3]]})]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub use_kubectl]]}}) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub LOG_DUMP_SAVE_LOGS test_op=VS_TEST_COLON_HYPHEN {}]]}}) (= scope= flags=0 words=[] bindings=[('files', {[DQ [VarSub files][LIT_CHARS " "][VarSub LOG_DUMP_SAVE_LOGS test_op=VS_TEST_COLON_HYPHEN {}]]})]) ) (ElseTrue) (Case to_match={[DQ [VarSub KUBERNETES_PROVIDER]]}, pat_word_list=[[{[LIT_CHARS gce]}, {[LIT_CHARS gke]}, {[LIT_CHARS kubemark]}], [{[LIT_CHARS aws]}]] (= scope= flags=0 words=[] bindings=[('files', {[DQ [VarSub files][LIT_CHARS " "][VarSub gce_logfiles]]})]) (= scope= flags=0 words=[] bindings=[('files', {[DQ [VarSub files][LIT_CHARS " "][VarSub aws_logfiles]]})]) ) ) (If (List (Fork (Com {[LIT_CHARS log-dump-ssh]} {[DQ [VarSub node_name]]} {[DQ [LIT_CHARS "sudo systemctl status kubelet.service"]]} ) ) (Com < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) ) (List (AndOr OP_OR_IF (Com {[LIT_CHARS log-dump-ssh]} {[DQ [VarSub node_name]]} {[DQ [LIT_CHARS "sudo journalctl --output=cat -u kubelet.service"]]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /kubelet.log]]} "> 1), > ) (Com {[LIT_CHARS true]} ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS log-dump-ssh]} {[DQ [VarSub node_name]]} {[DQ [LIT_CHARS "sudo journalctl --output=cat -u docker.service"]]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /docker.log]]} "> 1), > ) (Com {[LIT_CHARS true]} ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS log-dump-ssh]} {[DQ [VarSub node_name]]} {[DQ [LIT_CHARS "sudo journalctl --output=cat -k"]]} < (FilenameRedirectNode filename={[DQ [VarSub dir][LIT_CHARS /kern.log]]} "> 1), > ) (Com {[LIT_CHARS true]} ) ) ) (ElseTrue) (= scope= flags=0 words=[] bindings=[('files', {[DQ [VarSub kern_logfile][LIT_CHARS " "][VarSub files][LIT_CHARS " "][VarSub initd_logfiles][LIT_CHARS " "][VarSub supervisord_logfiles]]})]) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Copying '"][VarSub files][LIT_CHARS "' from "][VarSub node_name]]} ) (Com {[LIT_CHARS copy-logs-from-node]} {[DQ [VarSub node_name]]} {[DQ [VarSub dir]]} {[DQ [VarSub files]]} ) ) ) (FunctionDef kubectl-guess-master [] (Pipeline (Com {[LIT_CHARS kubectl]} {[LIT_CHARS get]} {[LIT_CHARS node]} {[LIT_CHARS -ojsonpath]} {[LIT_CHARS --template] [LIT_DBRACKET_LIKE "="] [DQ [VarSub ips_and_images]]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS kube-apiserver]} ) (Com {[LIT_CHARS cut]} {[LIT_CHARS -f1]} {[LIT_CHARS -d] [DQ [LIT_CHARS " "]]} ) ) ) (FunctionDef kubectl-guess-nodes [] (Pipeline (Com {[LIT_CHARS kubectl]} {[LIT_CHARS get]} {[LIT_CHARS node]} {[LIT_CHARS -ojsonpath]} {[LIT_CHARS --template] [LIT_DBRACKET_LIKE "="] [DQ [VarSub ips_and_images]]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -v]} {[LIT_CHARS kube-apiserver]} ) (Com {[LIT_CHARS cut]} {[LIT_CHARS -f1]} {[LIT_CHARS -d] [DQ [LIT_CHARS " "]]} ) ) ) (FunctionDef dump_master [] (List (= scope= flags=0 words=[{[LIT_CHARS master_name]}] bindings=[]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub use_kubectl]]}}) (= scope= flags=0 words=[] bindings=[('master_name', {[ComSub (Com {[LIT_CHARS kubectl-guess-master]})]})]) (DBracket {B! {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub master_ssh_supported_providers]]} {[DQ [VarSub KUBERNETES_PROVIDER]]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Master SSH not supported for "][VarSub KUBERNETES_PROVIDER]]} ) (Com {[LIT_CHARS return]} ) ) (ElseTrue) (List (If (Pipeline! (Subshell (List (Fork (Com {[LIT_CHARS detect-master]} ) ) (Com < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) ) ) ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Master not detected. Is the cluster up?"]]} ) (Com {[LIT_CHARS return]} ) ) ) (= scope= flags=0 words=[] bindings=[('master_name', {[DQ [VarSub MASTER_NAME]]})]) ) ) (= scope= flags=2 words=[] bindings=[('master_dir', {[DQ [VarSub report_dir][LIT_CHARS /][VarSub master_name]]})]) (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub master_dir]]} ) (Com {[LIT_CHARS save-logs]} {[DQ [VarSub master_name]]} {[DQ [VarSub master_dir]]} {[DQ [VarSub master_logfiles]]} ) ) ) (FunctionDef dump_nodes [] (List (= scope= flags=0 words=[{[LIT_CHARS node_names]}] bindings=[]) (If (DBracket {B1 UNARY_STRING_n {[DQ [VarSub use_kubectl]]}}) (= scope= flags=0 words=[] bindings=[('node_names', {[Array {[ComSub (Com {[LIT_CHARS kubectl-guess-nodes]})]}]})]) (DBracket {B! {B2 BINARY_STRING_TILDE_EQUAL {[DQ [VarSub node_ssh_supported_providers]]} {[DQ [VarSub KUBERNETES_PROVIDER]]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Node SSH not supported for "][VarSub KUBERNETES_PROVIDER]]} ) (Com {[LIT_CHARS return]} ) ) (ElseTrue) (List (Fork (Com {[LIT_CHARS detect-node-names]} ) ) (Com < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), > ) (If (DBracket {B2 BINARY_INT_EQ {[DQ [VarSub NODE_NAMES bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}}) transform_ops=[(#len)]]]} {[LIT_CHARS 0]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Nodes not detected. Is the cluster up?"]]} ) (Com {[LIT_CHARS return]} ) ) ) (= scope= flags=0 words=[] bindings=[('node_names', {[Array {[DQ [VarSub NODE_NAMES bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}]})]) ) ) (= scope= flags=0 words=[] bindings=[('proc', {[VarSub max_scp_processes]})]) (For node_name [{[DQ [VarSub node_names bracket_op=(Index {A Atom NODE_ARITH_WORD {AS_OP_AT "@"}})]]}]) (List (= scope= flags=0 words=[] bindings=[('node_dir', {[DQ [VarSub report_dir][LIT_CHARS /][VarSub node_name]]})]) (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub node_dir]]} ) (Fork (Com {[LIT_CHARS save-logs]} {[DQ [VarSub node_name]]} {[DQ [VarSub node_dir]]} {[DQ [VarSub node_logfiles]]} ) ) (= scope= flags=0 words=[] bindings=[('proc', {[ArithSub {A2 AS_OP_MINUS {A Atom NODE_ARITH_WORD {[VarSub proc]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) (If (DBracket {B2 BINARY_INT_EQ {[LIT_CHARS proc]} {[LIT_CHARS 0]}}) (List (= scope= flags=0 words=[] bindings=[('proc', {[VarSub max_scp_processes]})]) (Com {[LIT_CHARS wait]} ) ) ) ) ) (If (DBracket {B? LOGICAL_BINARY_AND {B2 BINARY_INT_GT {[LIT_CHARS proc]} {[LIT_CHARS 0]}} {B2 BINARY_INT_LT {[LIT_CHARS proc]} {[VarSub max_scp_processes]}}}) (Com {[LIT_CHARS wait]} ) ) ) ) (Com {[LIT_CHARS setup]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Dumping master and node logs to "][VarSub report_dir]]} ) (Com {[LIT_CHARS dump_master]} ) (Com {[LIT_CHARS dump_nodes]} ) )