(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=0 words=[] bindings=[('KUBE_ROOT', {[ComSub (Com {[LIT_CHARS dirname]} {[DQ [VarSub BASH_SOURCE bracket_op=(Index {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 0]}})]]})] [LIT_CHARS /../..]})]) (Com {[LIT_CHARS source]} {[DQ [VarSub KUBE_ROOT][LIT_CHARS /cluster/photon-controller/util.sh]]} ) (FunctionDef main [] (List (Com {[LIT_CHARS verify-cmd-in-path]} {[LIT_CHARS photon]} ) (Com {[LIT_CHARS set-target]} ) (Com {[LIT_CHARS create-tenant]} ) (Com {[LIT_CHARS create-project]} ) (Com {[LIT_CHARS create-vm-flavor]} {[DQ [VarSub PHOTON_MASTER_FLAVOR]]} {[DQ [VarSub SETUP_MASTER_FLAVOR_SPEC]]} ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub PHOTON_MASTER_FLAVOR]]} {[LIT_NEQUAL "!="]} {[DQ [VarSub PHOTON_NODE_FLAVOR]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS create-vm-flavor]} {[DQ [VarSub PHOTON_NODE_FLAVOR]]} {[DQ [VarSub SETUP_NODE_FLAVOR_SPEC]]} ) ) (Com {[LIT_CHARS create-disk-flavor]} ) (Com {[LIT_CHARS create-image]} ) ) ) (FunctionDef parse-cmd-line [] (List (= scope= flags=0 words=[] bindings=[('PHOTON_TARGET', {[VarSub 1 test_op=VS_TEST_COLON_HYPHEN {[DQ ]}]})]) (= scope= flags=0 words=[] bindings=[('PHOTON_VMDK', {[VarSub 2 test_op=VS_TEST_COLON_HYPHEN {[DQ ]}]})]) (If (DBracket {B? LOGICAL_BINARY_OR {B2 BINARY_STRING_EQUAL {[DQ [VarSub PHOTON_TARGET]]} {[DQ ]}} {B2 BINARY_STRING_EQUAL {[DQ [VarSub PHOTON_VMDK]]} {[DQ ]}}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Usage: setup-prereq "]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Target should be a URL like https://192.0.2.1"]]} ) (Com {[LIT_CHARS echo]} {[DQ ]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "This will create the following, based on the configuration in config-common.sh"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " * A tenant named "][VarSub PHOTON_TENANT]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " * A project named "][VarSub PHOTON_PROJECT]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " * A VM flavor named "][VarSub PHOTON_MASTER_FLAVOR]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " * A disk flavor named "][VarSub PHOTON_DISK_FLAVOR]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "It will also upload the Kube VMDK"]]} ) (Com {[LIT_CHARS echo]} {[DQ ]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "It creates the tenant with a resource ticket (quota) that may"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "be inappropriate for your environment. For a production"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "environment, you should configure these to match your"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS environment.]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Photon Target: "][VarSub PHOTON_TARGET]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Photon VMDK: "][VarSub PHOTON_VMDK]]} ) ) ) (FunctionDef set-target [] (Com {[VarSub PHOTON]} {[LIT_CHARS target]} {[LIT_CHARS set]} {[DQ [VarSub PHOTON_TARGET]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (FunctionDef create-tenant [] (List (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[{[LIT_CHARS output]}] bindings=[]) (AndOr OP_OR_IF (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS tenant]} {[LIT_CHARS list]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub PHOTON_TENANT][LIT_OTHER "$"]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (= scope= flags=0 words=[] bindings=[('rc', {[VarSub ?]})]) ) (If (DBracket {B2 BINARY_INT_EQ {[VarSub rc]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Tenant "][VarSub PHOTON_TENANT][LIT_CHARS " already made, skipping"]]} ) (ElseTrue) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Making tenant "][VarSub PHOTON_TENANT]]} ) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('output', {[ComSub (Com redirects=[(DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2)]{[VarSub PHOTON]} {[LIT_CHARS tenant]} {[LIT_CHARS create]} {[DQ [VarSub PHOTON_TENANT]]})]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Could not create tenant "][\ LIT_ESCAPED_CHAR "\\\""][VarSub PHOTON_TENANT][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS ", exiting"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Output from tenant creation:"]]} ) (Com {[LIT_CHARS echo]} {[DQ [VarSub output]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) (Com {[VarSub PHOTON]} {[LIT_CHARS tenant]} {[LIT_CHARS set]} {[DQ [VarSub PHOTON_TENANT]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) ) (FunctionDef create-project [] (List (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[{[LIT_CHARS output]}] bindings=[]) (AndOr OP_OR_IF (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS project]} {[LIT_CHARS list]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub PHOTON_PROJECT][\ LIT_ESCAPED_CHAR "\\t"]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (= scope= flags=0 words=[] bindings=[('rc', {[VarSub ?]})]) ) (If (DBracket {B2 BINARY_INT_EQ {[VarSub rc]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Project "][VarSub PHOTON_PROJECT][LIT_CHARS " already made, skipping"]]} ) (ElseTrue) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Making project "][VarSub PHOTON_PROJECT]]} ) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('output', {[ComSub (Com redirects=[(DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2)]{[VarSub PHOTON]} {[LIT_CHARS resource-ticket]} {[LIT_CHARS create]} {[LIT_CHARS --tenant]} {[DQ [VarSub PHOTON_TENANT]]} {[LIT_CHARS --name]} {[DQ [VarSub PHOTON_TENANT][LIT_CHARS -resources]]} {[LIT_CHARS --limits]} {[DQ [VarSub SETUP_TICKET_SPEC]]})]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Could not create resource ticket, exiting"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Output from resource ticket creation:"]]} ) (Com {[LIT_CHARS echo]} {[DQ [VarSub output]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('output', {[ComSub (Com redirects=[(DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2)]{[VarSub PHOTON]} {[LIT_CHARS project]} {[LIT_CHARS create]} {[LIT_CHARS --tenant]} {[DQ [VarSub PHOTON_TENANT]]} {[LIT_CHARS --resource-ticket]} {[DQ [VarSub PHOTON_TENANT][LIT_CHARS -resources]]} {[LIT_CHARS --name]} {[DQ [VarSub PHOTON_PROJECT]]} {[LIT_CHARS --limits]} {[DQ [VarSub SETUP_PROJECT_SPEC]]})]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Could not create project "][\ LIT_ESCAPED_CHAR "\\\""][VarSub PHOTON_PROJECT][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS ", exiting"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Output from project creation:"]]} ) (Com {[LIT_CHARS echo]} {[DQ [VarSub output]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) (Com {[VarSub PHOTON]} {[LIT_CHARS project]} {[LIT_CHARS set]} {[DQ [VarSub PHOTON_PROJECT]]} ) ) ) (FunctionDef create-vm-flavor [] (List (= scope= flags=0 words=[] bindings=[('flavor_name', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('flavor_spec', {[VarSub 2]})]) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[{[LIT_CHARS output]}] bindings=[]) (AndOr OP_OR_IF (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS flavor]} {[LIT_CHARS list]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub flavor_name][\ LIT_ESCAPED_CHAR "\\t"]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (= scope= flags=0 words=[] bindings=[('rc', {[VarSub ?]})]) ) (If (DBracket {B2 BINARY_INT_EQ {[VarSub rc]} {[LIT_CHARS 0]}}) (List (Com {[LIT_CHARS check-flavor-ready]} {[DQ [VarSub flavor_name]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Flavor "][VarSub flavor_name][LIT_CHARS " already made, skipping"]]} ) ) (ElseTrue) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Making VM flavor "][VarSub flavor_name]]} ) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('output', {[ComSub (Com redirects=[(DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2)]{[VarSub PHOTON]} {[LIT_CHARS -n]} {[LIT_CHARS flavor]} {[LIT_CHARS create]} {[LIT_CHARS --name]} {[DQ [VarSub flavor_name]]} {[LIT_CHARS --kind]} {[DQ [LIT_CHARS vm]]} {[LIT_CHARS --cost]} {[DQ [VarSub flavor_spec]]})]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Could not create vm flavor "][\ LIT_ESCAPED_CHAR "\\\""][VarSub flavor_name][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS ", exiting"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Output from flavor creation:"]]} ) (Com {[LIT_CHARS echo]} {[DQ [VarSub output]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) ) ) (FunctionDef create-disk-flavor [] (List (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[{[LIT_CHARS output]}] bindings=[]) (AndOr OP_OR_IF (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS flavor]} {[LIT_CHARS list]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub PHOTON_DISK_FLAVOR][\ LIT_ESCAPED_CHAR "\\t"]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (= scope= flags=0 words=[] bindings=[('rc', {[VarSub ?]})]) ) (If (DBracket {B2 BINARY_INT_EQ {[VarSub rc]} {[LIT_CHARS 0]}}) (List (Com {[LIT_CHARS check-flavor-ready]} {[DQ [VarSub PHOTON_DISK_FLAVOR]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Flavor "][VarSub PHOTON_DISK_FLAVOR][LIT_CHARS " already made, skipping"]]} ) ) (ElseTrue) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Making disk flavor "][VarSub PHOTON_DISK_FLAVOR]]} ) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('output', {[ComSub (Com redirects=[(DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2)]{[VarSub PHOTON]} {[LIT_CHARS -n]} {[LIT_CHARS flavor]} {[LIT_CHARS create]} {[LIT_CHARS --name]} {[DQ [VarSub PHOTON_DISK_FLAVOR]]} {[LIT_CHARS --kind]} {[DQ [LIT_CHARS ephemeral-disk]]} {[LIT_CHARS --cost]} {[DQ [VarSub SETUP_DISK_FLAVOR_SPEC]]})]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Could not create disk flavor "][\ LIT_ESCAPED_CHAR "\\\""][VarSub PHOTON_DISK_FLAVOR][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS ", exiting"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Output from flavor creation:"]]} ) (Com {[LIT_CHARS echo]} {[DQ [VarSub output]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) ) ) (FunctionDef check-flavor-ready [] (List (= scope= flags=0 words=[] bindings=[('flavor_name', {[VarSub 1]})]) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[{[LIT_CHARS flavor_id]}] bindings=[]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('flavor_id', {[ComSub (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS flavor]} {[LIT_CHARS list]}) (Com {[LIT_CHARS grep]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub flavor_name][\ LIT_ESCAPED_CHAR "\\t"]]}) (Com {[LIT_CHARS awk]} {[SQ ]}) )]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Found "][VarSub flavor_name][LIT_CHARS " but cannot find it's id"]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (AndOr OP_OR_IF (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS flavor]} {[LIT_CHARS show]} {[DQ [VarSub flavor_id]]} ) (Com {[LIT_CHARS grep]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][LIT_CHARS READY][\ LIT_ESCAPED_CHAR "\\$"]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Flavor "][\ LIT_ESCAPED_CHAR "\\\""][VarSub flavor_name][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS " already exists but is not READY. Please delete or fix it."]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) (FunctionDef create-image [] (List (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[{[LIT_CHARS num_images]}] bindings=[]) (= scope= flags=0 words=[{[LIT_CHARS output]}] bindings=[]) (AndOr OP_OR_IF (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS image]} {[LIT_CHARS list]} ) (Com {[LIT_CHARS grep]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub PHOTON_IMAGE][\ LIT_ESCAPED_CHAR "\\t"]]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[LIT_CHARS ERROR]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (= scope= flags=0 words=[] bindings=[('rc', {[VarSub ?]})]) ) (If (DBracket {B2 BINARY_INT_EQ {[VarSub rc]} {[LIT_CHARS 0]}}) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Warning: You have at least one "][VarSub PHOTON_IMAGE][LIT_CHARS " image in the ERROR state. You may want to investigate."]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Images in the ERROR state will be ignored."]]} ) ) ) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('num_images', {[ComSub (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS image]} {[LIT_CHARS list]}) (Com {[LIT_CHARS grep]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub PHOTON_IMAGE][\ LIT_ESCAPED_CHAR "\\t"]]}) (Com {[LIT_CHARS grep]} {[LIT_CHARS READY]}) (Com {[LIT_CHARS wc]} {[LIT_CHARS -l]}) )]})]) (If (DBracket {B2 BINARY_INT_GT {[DQ [VarSub num_images]]} {[LIT_CHARS 1]}}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Warning: You have more than one good "][VarSub PHOTON_IMAGE][LIT_CHARS " image. You may want to remove duplicates."]]} ) ) (AndOr OP_OR_IF (Pipeline (Com {[VarSub PHOTON]} {[LIT_CHARS image]} {[LIT_CHARS list]} ) (Com {[LIT_CHARS grep]} {[DQ [\ LIT_ESCAPED_CHAR "\\t"][VarSub PHOTON_IMAGE][\ LIT_ESCAPED_CHAR "\\t"]]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[LIT_CHARS READY]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 1), (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) ) (= scope= flags=0 words=[] bindings=[('rc', {[VarSub ?]})]) ) (If (DBracket {B2 BINARY_INT_EQ {[VarSub rc]} {[LIT_CHARS 0]}}) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Image "][VarSub PHOTON_VMDK][LIT_CHARS " already uploaded, skipping"]]} ) (ElseTrue) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Uploading image "][VarSub PHOTON_VMDK]]} ) (= scope= flags=0 words=[] bindings=[('rc', {[LIT_CHARS 0]})]) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('output', {[ComSub (Com redirects=[(DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2)]{[VarSub PHOTON]} {[LIT_CHARS image]} {[LIT_CHARS create]} {[DQ [VarSub PHOTON_VMDK]]} {[LIT_CHARS -n]} {[DQ [VarSub PHOTON_IMAGE]]} {[LIT_CHARS -i]} {[LIT_CHARS EAGER]})]})]) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "ERROR: Could not upload image, exiting"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Output from image create:"]]} ) (Com {[LIT_CHARS echo]} {[DQ [VarSub output]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) ) ) (Com {[LIT_CHARS set]} {[LIT_OTHER "+"] [LIT_CHARS o]} {[LIT_CHARS pipefail]} ) (Com {[LIT_CHARS parse-cmd-line]} {[DQ [VarSub @]]} ) (Com {[LIT_CHARS main]} ) )