(List (= scope= flags=0 words=[] bindings=[('admin', {[ComSub (AndOr OP_AND_IF (Com redirects=[(DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1)]{[LIT_CHARS grep]} {[SQ ]} {[LIT_CHARS /etc/group]}) (AndOr OP_OR_IF (Com {[LIT_CHARS echo]} {[LIT_CHARS admin]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS adm]}) ) )]})]) (FunctionDef usage [] (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "usage: "][VarSub 0 transform_ops=[VS_UNARY_DPOUND {[LIT_CHARS "*"] [LIT_SLASH /]}]][LIT_CHARS " [-m mirror] [-g group,...] [-s] [-c]"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-b dir additional directories that should be bind mounted,"]]} ) (Com {[LIT_CHARS echo]} {[SQ ]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " Default: if local filesystems present, ask user for help"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-g group,... groups that can use the chroot unauthenticated"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS " Default: '"][VarSub admin][LIT_CHARS "' and current user's group ('"][ComSub (Com {[LIT_CHARS id]} {[LIT_CHARS -gn]})][LIT_CHARS "')"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-l List all installed chroot environments"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-m mirror an alternate repository mirror for package downloads"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-s configure default deb-srcs"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-c always copy 64bit helper binaries to 32bit chroot"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "-h this help message"]]} ) ) ) (FunctionDef process_opts [] (List (= scope= flags=0 words=[{[LIT_CHARS OPTNAME]}, {[LIT_CHARS OPTIND]}, {[LIT_CHARS OPTERR]}, {[LIT_CHARS OPTARG]}] bindings=[]) (While (Com {[LIT_CHARS getopts]} {[DQ [LIT_CHARS ":b:g:lm:sch"]]} {[LIT_CHARS OPTNAME]} ) (Case to_match={[DQ [VarSub OPTNAME]]}, pat_word_list=[[{[LIT_CHARS b]}], [{[LIT_CHARS g]}], [{[LIT_CHARS l]}], [{[LIT_CHARS m]}], [{[LIT_CHARS s]}], [{[LIT_CHARS c]}], [{[LIT_CHARS h]}], [{[\ LIT_ESCAPED_CHAR "\\:"]}], [{[LIT_OTHER "*"]}]] (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub OPTARG]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS NONE]]} {[LIT_CHARS -a]} {[LIT_CHARS -z]} {[DQ [VarSub bind_mounts]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('bind_mounts', {[DQ [VarSub OPTARG]]})]) (ElseTrue) (List (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub bind_mounts]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS NONE]]} {[LIT_CHARS -o]} {[DQ [VarSub OPTARG]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [VarSub OPTARG transform_ops=[VS_UNARY_POUND {[LIT_SLASH /]}]]]} {[LIT_CHARS -o]} {[LIT_OTHER "!"]} {[LIT_CHARS -d]} {[DQ [VarSub OPTARG]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Invalid -b option(s)"]]} ) (Com {[LIT_CHARS usage]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (= scope= flags=0 words=[] bindings=[('bind_mounts', {[DQ [VarSub bind_mounts][LIT_CHARS "\n"][VarSub OPTARG][LIT_CHARS " "][VarSub OPTARG][LIT_CHARS " none rw,bind 0 0"]]})]) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub OPTARG]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('chroot_groups', {[DQ [VarSub chroot_groups][VarSub chroot_groups test_op=VS_TEST_COLON_PLUS {[LIT_CHARS ","]}][VarSub OPTARG]]})]) ) (List (Com {[LIT_CHARS list_all_chroots]} ) (Com {[LIT_CHARS exit]} ) ) (List (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub mirror]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "You can only specify exactly one mirror location"]]} ) (Com {[LIT_CHARS usage]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (= scope= flags=0 words=[] bindings=[('mirror', {[DQ [VarSub OPTARG]]})]) ) (= scope= flags=0 words=[] bindings=[('add_srcs', {[DQ [LIT_CHARS y]]})]) (= scope= flags=0 words=[] bindings=[('copy_64', {[DQ [LIT_CHARS y]]})]) (List (Com {[LIT_CHARS usage]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 0]} ) ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "'-"][VarSub OPTARG][LIT_CHARS "' needs an argument."]]} ) (Com {[LIT_CHARS usage]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "invalid command-line option: "][VarSub OPTARG]]} ) (Com {[LIT_CHARS usage]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub #]} {[LIT_CHARS -ge]} {[VarSub OPTIND]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS eval]} {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Unexpected command line argument: "][\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS "{"][VarSub OPTIND][LIT_CHARS "}"]]} ) (Com {[LIT_CHARS usage]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) ) ) (FunctionDef list_all_chroots [] (For i [{[LIT_CHARS /var/lib/chroot/] [LIT_OTHER "*"]}]) (List (= scope= flags=0 words=[] bindings=[('i', {[DQ [VarSub i transform_ops=[VS_UNARY_DPOUND {[LIT_CHARS "*"] [LIT_SLASH /]}]]]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub i]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS "*"]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS continue]} ) ) (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -x]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub i transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS continue]} ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[DQ [LIT_CHARS "^"][\ LIT_ESCAPED_CHAR "\\["][VarSub i transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][\ LIT_ESCAPED_CHAR "\\]"][\ LIT_ESCAPED_CHAR "\\$"]]} {[LIT_CHARS /etc/schroot/schroot.conf]} ) (Com {[LIT_CHARS continue]} ) ) (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -r]} {[DQ [LIT_CHARS /etc/schroot/script-][VarSub i]]} {[LIT_CHARS -a]} {[LIT_CHARS -r]} {[DQ [LIT_CHARS /etc/schroot/mount-][VarSub i]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS continue]} ) ) (Com {[LIT_CHARS echo]} {[DQ [VarSub i transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} ) ) ) ) (FunctionDef getkey [] (Subshell (List (Com {[LIT_CHARS trap]} {[SQ /dev/null">]} {[LIT_CHARS EXIT]} {[LIT_CHARS INT]} {[LIT_CHARS TERM]} {[LIT_CHARS QUIT]} {[LIT_CHARS HUP]} ) (Com {[LIT_CHARS stty]} {[LIT_CHARS -echo]} {[LIT_CHARS iuclc]} {[LIT_CHARS -icanon]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS dd]} {[LIT_VAR_LIKE "count="] [LIT_CHARS 1] =} {[LIT_VAR_LIKE "bs="] [LIT_CHARS 1] =} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) ) ) ) (FunctionDef chr [] (Com {[LIT_CHARS printf]} {[DQ [\ LIT_ESCAPED_CHAR "\\\\"][ComSub (Com {[LIT_CHARS printf]} {[SQ ]} {[DQ [VarSub 1]]})]]} ) ) (FunctionDef ord [] (Com {[LIT_CHARS printf]} {[SQ ]} {[ComSub (Pipeline (Com {[LIT_CHARS printf]} {[SQ ]} {[DQ [VarSub 1]]}) (Com {[LIT_CHARS od]} {[LIT_CHARS -tu1]} {[LIT_CHARS -An]}) )]} ) ) (FunctionDef is_network_drive [] (Pipeline (Com {[LIT_CHARS stat]} {[LIT_CHARS -c]} {[LIT_OTHER "%"] [LIT_CHARS T]} {[LIT_CHARS -f]} {[DQ [VarSub 1][LIT_CHARS /]]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS egrep]} {[LIT_CHARS -qs]} {[SQ ]} ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [ComSub (Com {[LIT_CHARS id]} {[LIT_CHARS -nu]})]]} {[LIT_DBRACKET_LIKE "="]} {[LIT_CHARS root]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Run this script as a regular user and provide your "][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS sudo][\ LIT_ESCAPED_CHAR "\\\""]]} {[DQ [LIT_CHARS "password if requested"]]} < (DescriptorRedirectNode target={[LIT_CHARS 2]} &"> 1), > ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (Com {[LIT_CHARS process_opts]} {[DQ [VarSub @]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "This script will help you through the process of installing a"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Debian or Ubuntu distribution in a chroot environment. You will"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "have to provide your "][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS sudo][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS " password when requested."]]} ) (Com {[LIT_CHARS echo]} ) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS INT]} {[LIT_CHARS TERM]} {[LIT_CHARS QUIT]} {[LIT_CHARS HUP]} ) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS EXIT]} ) (= scope= flags=0 words=[] bindings=[('dep', {[SQ ]})]) (For i [{[LIT_CHARS dchroot]}, {[LIT_CHARS debootstrap]}, {[LIT_CHARS libwww-perl]}]) (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[LIT_CHARS /usr/share/doc/] [DQ [VarSub i]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('dep', {[DQ [VarSub dep][LIT_CHARS " "][VarSub i]]})]) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub dep]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS apt-get]} {[LIT_CHARS -y]} {[LIT_CHARS install]} {[VarSub dep]} ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS apt-get]} {[LIT_CHARS -y]} {[LIT_CHARS install]} {[LIT_CHARS schroot]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[LIT_CHARS /var/lib/chroot]} ) (= scope= flags=0 words=[] bindings=[('targets', {[DQ [ComSub (List (Com {[LIT_CHARS cd]} {[LIT_CHARS /usr/share/debootstrap/scripts]}) (Pipeline (Com {[LIT_CHARS ls]}) (Com {[LIT_CHARS grep]} {[SQ ]}) ) )]]})]) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "The following targets are available to be installed in a chroot:"]]} ) (= scope= flags=0 words=[] bindings=[('j', {[LIT_CHARS 1]})]) (For i [{[VarSub targets]}]) (List (Com {[LIT_CHARS printf]} {[SQ ]} {[DQ [VarSub j]]} {[DQ [VarSub i]]} ) (= scope= flags=0 words=[] bindings=[('j', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub j]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) ) ) (While (Com {[LIT_OTHER ":"]} ) (List (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "Which target would you like to install: "]]} ) (Com {[LIT_CHARS read]} {[LIT_CHARS n]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub n]]} {[LIT_CHARS -gt]} {[LIT_CHARS 0]} {[LIT_CHARS -a]} {[DQ [VarSub n]]} {[LIT_CHARS -lt]} {[DQ [VarSub j]]} {[LIT_DBRACKET_LIKE "]"]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) (Com {[LIT_CHARS break]} ) ) ) ) (= scope= flags=0 words=[] bindings=[('j', {[LIT_CHARS 1]})]) (For i [{[VarSub targets]}]) (List (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub j]]} {[LIT_CHARS -eq]} {[DQ [VarSub n]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (= scope= flags=0 words=[] bindings=[('distname', {[DQ [VarSub i]]})]) (Com {[LIT_CHARS break]} ) ) ) (= scope= flags=0 words=[] bindings=[('j', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub j]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) ) ) (Com {[LIT_CHARS echo]} ) (= scope= flags=0 words=[] bindings=[('archflag', {[SQ ]})]) (= scope= flags=0 words=[] bindings=[('arch', {[SQ ]})]) (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [ComSub (Com {[LIT_CHARS uname]} {[LIT_CHARS -m]})]]} {[LIT_DBRACKET_LIKE "="]} {[LIT_CHARS x86_64]} {[LIT_DBRACKET_LIKE "]"]} ) (List (While (Com {[LIT_OTHER ":"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "You are running a 64bit kernel. This allows you to install either a"]]} ) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "32bit or a 64bit chroot environment. %s"]]} {[DQ [LIT_CHARS "Which one do you want (32, 64) "]]} ) (Com {[LIT_CHARS read]} {[LIT_CHARS arch]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub arch]]} {[LIT_DBRACKET_LIKE "=="]} {[LIT_CHARS 32]} {[LIT_CHARS -o]} {[DQ [VarSub arch]]} {[LIT_DBRACKET_LIKE "=="]} {[LIT_CHARS 64]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS break]} ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub arch]]} {[LIT_DBRACKET_LIKE "=="]} {[LIT_CHARS 32]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('archflag', {[DQ [LIT_CHARS "--arch i386"]]})]) (= scope= flags=0 words=[] bindings=[('archflag', {[DQ [LIT_CHARS "--arch amd64"]]})]) ) ) (= scope= flags=0 words=[] bindings=[('arch', {[DQ [VarSub arch][LIT_CHARS bit]]})]) (Com {[LIT_CHARS echo]} ) ) ) (= scope= flags=0 words=[] bindings=[('target', {[DQ [VarSub distname][VarSub arch]]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[LIT_CHARS /var/lib/chroot/] [DQ [VarSub target]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (While (Com {[LIT_OTHER ":"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "This chroot already exists on your machine."]]} ) (If (Pipeline (Com {[LIT_CHARS schroot]} {[LIT_CHARS -l]} {[LIT_CHARS --all-sessions]} < (DescriptorRedirectNode target={[LIT_CHARS 1]} &"> 2), > ) (Com {[LIT_CHARS sed]} {[SQ ]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[DQ [LIT_CHARS "^"][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][LIT_CHARS -]]} ) ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "And it appears to be in active use. Terminate all programs that"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "are currently using the chroot environment and then re-run this"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS script.]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "If you still get an error message, you might have stale mounts"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "that you forgot to delete. You can always clean up mounts by"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "executing "][\ LIT_ESCAPED_CHAR "\\\""][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][LIT_CHARS " -c"][\ LIT_ESCAPED_CHAR "\\\""][LIT_CHARS .]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "I can abort installation, I can overwrite the existing chroot,"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "or I can delete the old one and then exit. What would you like to"]]} ) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "do (a/o/d)? "]]} ) (Com {[LIT_CHARS read]} {[LIT_CHARS choice]} ) (Case to_match={[DQ [VarSub choice]]}, pat_word_list=[[{[LIT_CHARS a]}, {[LIT_CHARS A]}], [{[LIT_CHARS o]}, {[LIT_CHARS O]}], [{[LIT_CHARS d]}, {[LIT_CHARS D]}]] (Com {[LIT_CHARS exit]} {[LIT_CHARS 1]} ) (List (Com {[LIT_CHARS sudo]} {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target]]} ) (Com {[LIT_CHARS break]} ) ) (List (Com {[LIT_CHARS sudo]} {[LIT_CHARS rm]} {[LIT_CHARS -rf]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target]]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[DQ [LIT_CHARS /etc/schroot/mount-][VarSub target]]} {[DQ [LIT_CHARS /etc/schroot/script-][VarSub target]]} {[DQ [LIT_CHARS /etc/schroot/][VarSub target]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sed]} {[LIT_CHARS -ni]} {[SQ ] [DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]] [SQ ]} {[DQ [LIT_CHARS /etc/schroot/schroot.conf]]} ) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS INT]} {[LIT_CHARS TERM]} {[LIT_CHARS QUIT]} {[LIT_CHARS HUP]} ) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS EXIT]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Deleted!"]]} ) (Com {[LIT_CHARS exit]} {[LIT_CHARS 0]} ) ) ) ) ) (Com {[LIT_CHARS echo]} ) ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[LIT_CHARS /var/lib/chroot/] [DQ [VarSub target]]} ) (= scope= flags=0 words=[] bindings=[('alt_repos', {[SQ ]})]) (AndOr OP_AND_IF (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[LIT_CHARS ubuntu.com]} {[LIT_CHARS /usr/share/debootstrap/scripts/] [DQ [VarSub distname]]} ) (List (While (Com {[LIT_OTHER ":"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Would you like to add "][VarSub distname][LIT_CHARS "-updates and "][VarSub distname][LIT_CHARS "-security "]]} ) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "to the chroot's sources.list (y/n)? "]]} ) (Com {[LIT_CHARS read]} {[LIT_CHARS alt_repos]} ) (Case to_match={[DQ [VarSub alt_repos]]}, pat_word_list=[[{[LIT_CHARS y]}, {[LIT_CHARS Y]}], [{[LIT_CHARS n]}, {[LIT_CHARS N]}]] (List (= scope= flags=0 words=[] bindings=[('alt_repos', {[DQ [LIT_CHARS y]]})]) (Com {[LIT_CHARS break]} ) ) (Com {[LIT_CHARS break]} ) ) ) ) (Com {[LIT_CHARS echo]} ) ) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub bind_mounts]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (= scope= flags=0 words=[] bindings=[('mounts', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS awk]} {[SQ ]} {[LIT_CHARS /proc/mounts]}) (Com {[LIT_CHARS head]} {[LIT_CHARS -n26]}) )]]})]) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub mounts]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "You appear to have non-standard mount points that you"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "might want to import into the chroot environment:"]]} ) (Com {[LIT_CHARS echo]} ) (= scope= flags=0 words=[] bindings=[('sel', {[SQ ]})]) (While (Com {[LIT_OTHER ":"]} ) (List (= scope= flags=0 words=[] bindings=[('j', {[LIT_CHARS 1]})]) (For m [{[VarSub mounts]}]) (List (= scope= flags=0 words=[] bindings=[('c', {[DQ [ComSub (Com {[LIT_CHARS printf]} {[ComSub (Com {[LIT_CHARS printf]} {[SQ ]} {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 64]}} {A Atom NODE_ARITH_WORD {[VarSub j]}}}]})]})]]})]) (AndOr OP_AND_IF (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub sel]]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[VarSub c]} ) ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('state', {[DQ [LIT_CHARS "mounted in chroot"]]})]) (= scope= flags=0 words=[] bindings=[('state', {[DQ [ComSub (Com {[LIT_CHARS tput]} {[LIT_CHARS el]})]]})]) ) ) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS " "][VarSub c][LIT_CHARS ") %-40s"][VarSub state][\ LIT_ESCAPED_CHAR "\\n"]]} {[DQ [VarSub m]]} ) (= scope= flags=0 words=[] bindings=[('j', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub j]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) ) ) (Com {[LIT_CHARS echo]} ) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "Select mount points that you want to be included or press %s"]]} {[DQ [LIT_CHARS "SPACE to continue"]]} ) (= scope= flags=0 words=[] bindings=[('c', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS getkey]}) (Com {[LIT_CHARS tr]} {[LIT_CHARS a-z]} {[LIT_CHARS A-Z]}) )]]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub c]]} {[LIT_DBRACKET_LIKE "=="]} {[DQ [LIT_CHARS " "]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS echo]} ) (Com {[LIT_CHARS echo]} ) (Com {[LIT_CHARS break]} ) ) ) (If (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub c]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub c]]} {[SQ ]} {[SQ ]} {[LIT_CHARS -o]} {[ComSub (Com {[LIT_CHARS ord]} {[DQ [VarSub c]]})]} {[LIT_CHARS -gt]} {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 64]}} {A Atom NODE_ARITH_WORD {[ComSub (Com {[LIT_CHARS ord]} {[DQ [VarSub j]]})]}}}]} {[LIT_DBRACKET_LIKE "]"]} ) ) (Com {[LIT_CHARS tput]} {[LIT_CHARS bel]} ) (ElseTrue) (If (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub sel]]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[VarSub c]} ) ) (= scope= flags=0 words=[] bindings=[('sel', {[DQ [ComSub (Pipeline (Com {[LIT_CHARS printf]} {[DQ [VarSub sel]]}) (Com {[LIT_CHARS sed]} {[DQ [LIT_CHARS s/][VarSub c][LIT_CHARS //]]}) )]]})]) (ElseTrue) (= scope= flags=0 words=[] bindings=[('sel', {[DQ [VarSub sel][VarSub c]]})]) ) ) (Com {[LIT_CHARS tput]} {[LIT_CHARS cuu]} {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub j]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]} ) (Com {[LIT_CHARS echo]} ) ) ) ) ) (= scope= flags=0 words=[] bindings=[('j', {[LIT_CHARS 1]})]) (For m [{[VarSub mounts]}]) (List (= scope= flags=0 words=[] bindings=[('c', {[DQ [ComSub (Com {[LIT_CHARS chr]} {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub j]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 64]}}}]})]]})]) (If (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub sel]]} ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[VarSub c]} ) ) (= scope= flags=0 words=[] bindings=[('bind_mounts', {[DQ [VarSub bind_mounts][VarSub m][LIT_CHARS " "][VarSub m][LIT_CHARS " none rw,bind 0 0\n"]]})]) ) (= scope= flags=0 words=[] bindings=[('j', {[ArithSub {A2 AS_OP_PLUS {A Atom NODE_ARITH_WORD {[VarSub j]}} {A Atom NODE_ARITH_WORD {[AS_NUM_LITERAL 1]}}}]})]) ) ) ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sed]} {[LIT_CHARS -ni]} {[SQ ] [DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]] [SQ ]} {[LIT_CHARS /etc/schroot/schroot.conf]} ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub mirror]]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[LIT_CHARS ubuntu.com]} {[LIT_CHARS /usr/share/debootstrap/scripts/] [DQ [VarSub distname]]} ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('mirror', {[DQ [LIT_CHARS "http://archive.ubuntu.com/ubuntu"]]})]) (= scope= flags=0 words=[] bindings=[('mirror', {[DQ [LIT_CHARS "http://ftp.us.debian.org/debian"]]})]) ) ) ) (Com {[LIT_CHARS sudo]} {[VarSub http_proxy test_op=VS_TEST_COLON_PLUS {[LIT_CHARS "http_proxy="] [DQ [VarSub http_proxy]]}]} {[LIT_CHARS debootstrap]} {[VarSub archflag]} {[DQ [VarSub distname]]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target]]} {[DQ [VarSub mirror]]} ) (AndOr OP_AND_IF (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[LIT_CHARS ubuntu.com]} {[LIT_CHARS /usr/share/debootstrap/scripts/] [DQ [VarSub distname]]} ) (AndOr OP_OR_IF (= scope= flags=0 words=[] bindings=[('brand', {[DQ [LIT_CHARS Ubuntu]]})]) (= scope= flags=0 words=[] bindings=[('brand', {[DQ [LIT_CHARS Debian]]})]) ) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub chroot_groups]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('chroot_groups', {[DQ [VarSub admin][LIT_CHARS ","][ComSub (Com {[LIT_CHARS id]} {[LIT_CHARS -gn]})]]})]) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[SQ ]} {[LIT_DBRACKET_LIKE "]"]} ) (List (= scope= flags=0 words=[] bindings=[('new_version', {[LIT_CHARS 1]})]) (= scope= flags=0 words=[] bindings=[('fstab', {[DQ [LIT_CHARS /etc/schroot/][VarSub target][LIT_CHARS /fstab]]})]) ) (ElseTrue) (List (= scope= flags=0 words=[] bindings=[('new_version', {[LIT_CHARS 0]})]) (= scope= flags=0 words=[] bindings=[('fstab', {[DQ [LIT_CHARS /etc/schroot/mount-][VarSub target]]})]) ) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub new_version]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS 1]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS sudo]} {[LIT_CHARS cp]} {[LIT_CHARS -ar]} {[LIT_CHARS /etc/schroot/default]} {[LIT_CHARS /etc/schroot/] [VarSub target]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >/etc/schroot/schroot.conf">]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "["][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][LIT_CHARS "]\n"][LIT_CHARS "description="][VarSub brand][LIT_CHARS " "][VarSub distname][LIT_CHARS " "][VarSub arch][LIT_CHARS "\n"][LIT_CHARS "type=directory\n"][LIT_CHARS "directory=/var/lib/chroot/"][VarSub target][LIT_CHARS "\n"][LIT_CHARS "users=root\n"][LIT_CHARS "groups="][VarSub chroot_groups][LIT_CHARS "\n"][LIT_CHARS "root-groups="][VarSub chroot_groups][LIT_CHARS "\n"][LIT_CHARS "personality=linux"][ComSub (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub arch]]} {[LIT_NEQUAL "!="]} {[LIT_CHARS 64bit]} {[LIT_DBRACKET_LIKE "]"]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS 32]}) )][LIT_CHARS "\n"][LIT_CHARS "profile="][VarSub target][LIT_CHARS "\n"][LIT_CHARS "\n"]]} 0), > ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub bind_mounts]]} {[LIT_CHARS -a]} {[DQ [VarSub bind_mounts]]} {[LIT_NEQUAL "!="]} {[DQ [LIT_CHARS NONE]]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline (Com {[LIT_CHARS printf]} {[DQ [VarSub bind_mounts]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[DQ [LIT_CHARS "cat >>"][VarSub fstab]]} ) ) ) ) (ElseTrue) (List (= scope= flags=0 words=[] bindings=[('priority', {[ComSub (AndOr OP_AND_IF (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[SQ ]}) (Com {[LIT_OTHER ":"]}) ) )]})]) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >/etc/schroot/schroot.conf">]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "["][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][LIT_CHARS "]\n"][LIT_CHARS "description="][VarSub brand][LIT_CHARS " "][VarSub distname][LIT_CHARS " "][VarSub arch][LIT_CHARS "\n"][LIT_CHARS "type=directory\n"][LIT_CHARS "directory=/var/lib/chroot/"][VarSub target][LIT_CHARS "\n"][LIT_CHARS "users=root\n"][LIT_CHARS "groups="][VarSub chroot_groups][LIT_CHARS "\n"][LIT_CHARS "root-groups="][VarSub chroot_groups][LIT_CHARS "\n"][LIT_CHARS "personality=linux"][ComSub (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub arch]]} {[LIT_NEQUAL "!="]} {[LIT_CHARS 64bit]} {[LIT_DBRACKET_LIKE "]"]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS 32]}) )][LIT_CHARS "\n"][LIT_CHARS "script-config=script-"][VarSub target][LIT_CHARS "\n"][VarSub priority][LIT_CHARS "\n"][LIT_CHARS "\n"]]} 0), > ) (Pipeline (Com {[LIT_CHARS sed]} {[SQ ] [DQ [VarSub fstab]] [SQ ]} {[LIT_CHARS /etc/schroot/script-defaults]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ /etc/schroot/script-">] [DQ [VarSub target]]} ) ) (Pipeline (Com {[LIT_CHARS sed]} {[SQ ]} {[LIT_CHARS /etc/schroot/mount-defaults]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[DQ [LIT_CHARS "cat > "][VarSub fstab]]} ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub bind_mounts]]} {[LIT_CHARS -a]} {[DQ [VarSub bind_mounts]]} {[LIT_NEQUAL "!="]} {[DQ [LIT_CHARS NONE]]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline (Com {[LIT_CHARS printf]} {[DQ [VarSub bind_mounts]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >">] [DQ [VarSub fstab]]} ) ) ) (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[LIT_CHARS /media]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline! (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[SQ ]} {[DQ [VarSub fstab]]} ) ) ) (Pipeline (Com {[LIT_CHARS echo]} {[SQ ]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >">] [DQ [VarSub fstab]]} ) ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[SQ ]} {[DQ [VarSub fstab]]} ) (Pipeline (Com {[LIT_CHARS echo]} {[SQ ]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >">] [DQ [VarSub fstab]]} ) ) ) (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_OTHER "!"]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /run]]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline! (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[SQ ]} {[DQ [VarSub fstab]]} ) ) ) (Pipeline (Com {[LIT_CHARS echo]} {[SQ ]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >">] [DQ [VarSub fstab]]} ) ) ) (If (Pipeline! (Com {[LIT_CHARS grep]} {[LIT_CHARS -qs]} {[SQ ]} {[DQ [VarSub fstab]]} ) ) (Pipeline (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[LIT_CHARS /run]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_OR_IF (Com {[LIT_CHARS echo]} {[SQ ]} ) (Com {[LIT_CHARS echo]} {[SQ ]} ) ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >">] [DQ [VarSub fstab]]} ) ) ) (= scope= flags=0 words=[] bindings=[('d', {[DQ [ComSub (AndOr OP_OR_IF (Com redirects=[(FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2)]{[LIT_CHARS readlink]} {[LIT_CHARS -f]} {[DQ [VarSub HOME][LIT_CHARS /chroot]]}) (Com {[LIT_CHARS echo]} {[DQ [VarSub HOME][LIT_CHARS /chroot]]}) )]]})]) (= scope= flags=0 words=[] bindings=[('s', {[DQ [VarSub d][LIT_CHARS /.][VarSub target]]})]) (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub s][LIT_CHARS " "][VarSub d][LIT_CHARS " none rw,bind 0 0"]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ >">] [DQ [VarSub target]]} ) ) (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub s]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ /usr/local/bin/">] [DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} < (HereDocRedirectNode here_end='EOF' do_expansion=False body_word={[LIT_CHARS "#!/bin/bash\n"] [LIT_CHARS "\n"] [LIT_CHARS "chroot=\"${0##*/}\"\n"] [LIT_CHARS "\n"] [LIT_CHARS "wrap() {\n"] [LIT_CHARS " # Word-wrap the text passed-in on stdin. Optionally, on continuation lines\n"] [LIT_CHARS " # insert the same number of spaces as the number of characters in the\n"] [LIT_CHARS " # parameter(s) passed to this function.\n"] [LIT_CHARS " # If the \"fold\" program cannot be found, or if the actual width of the\n"] [LIT_CHARS " # terminal cannot be determined, this function doesn't attempt to do any\n"] [LIT_CHARS " # wrapping.\n"] [LIT_CHARS " local f=\"$(type -P fold)\"\n"] [LIT_CHARS " [ -z \"${f}\" ] && { cat; return; }\n"] [LIT_CHARS " local c=\"$(stty -a /dev/null |\n"] [LIT_CHARS " sed 's/.*columns[[:space:]]*\\([0-9]*\\).*/\\1/;t;d')\"\n"] [LIT_CHARS " [ -z \"${c}\" ] && { cat; return; }\n"] [LIT_CHARS " local i=\"$(echo \"$*\"|sed 's/./ /g')\"\n"] [LIT_CHARS " local j=\"$(printf %s \"${i}\"|wc -c)\"\n"] [LIT_CHARS " if [ \"${c}\" -gt \"${j}\" ]; then\n"] [LIT_CHARS " dd bs=1 count=\"${j}\" 2>/dev/null\n"] [LIT_CHARS " \"${f}\" -sw \"$((${c}-${j}))\" | sed '2,$s/^/'\"${i}\"'/'\n"] [LIT_CHARS " else\n"] [LIT_CHARS " \"${f}\" -sw \"${c}\"\n"] [LIT_CHARS " fi\n"] [LIT_CHARS "}\n"] [LIT_CHARS "\n"] [LIT_CHARS "help() {\n"] [LIT_CHARS " echo \"Usage ${0##*/} [-h|--help] [-c|--clean] [-C|--clean-all] [-l|--list] [--] args\" | wrap \"Usage ${0##*/} \"\n"] [LIT_CHARS " echo \" help: print this message\" | wrap \" \"\n"] [LIT_CHARS " echo \" list: list all known chroot environments\" | wrap \" \"\n"] [LIT_CHARS " echo \" clean: remove all old chroot sessions for \\\"${chroot}\\\"\" | wrap \" \"\n"] [LIT_CHARS " echo \" clean-all: remove all old chroot sessions for all environments\" | wrap \" \"\n"] [LIT_CHARS " exit 0\n"] [LIT_CHARS "}\n"] [LIT_CHARS "\n"] [LIT_CHARS "clean() {\n"] [LIT_CHARS " local s t rc\n"] [LIT_CHARS " rc=0\n"] [LIT_CHARS " for s in $(schroot -l --all-sessions); do\n"] [LIT_CHARS " if [ -n \"$1\" ]; then\n"] [LIT_CHARS " t=\"${s#session:}\"\n"] [LIT_CHARS " [ \"${t#${chroot}-}\" == \"${t}\" ] && continue\n"] [LIT_CHARS " fi\n"] [LIT_CHARS " if ls -l /proc/*/{cwd,fd} 2>/dev/null |\n"] [LIT_CHARS " fgrep -qs \"/var/lib/schroot/mount/${t}\"; then\n"] [LIT_CHARS " echo \"Session \\\"${t}\\\" still has active users, not cleaning up\" | wrap\n"] [LIT_CHARS " rc=1\n"] [LIT_CHARS " continue\n"] [LIT_CHARS " fi\n"] [LIT_CHARS " sudo schroot -c \"${s}\" -e || rc=1\n"] [LIT_CHARS " done\n"] [LIT_CHARS " exit ${rc}\n"] [LIT_CHARS "}\n"] [LIT_CHARS "\n"] [LIT_CHARS "list() {\n"] [LIT_CHARS " for e in $(schroot -l); do\n"] [LIT_CHARS " e=\"${e#chroot:}\"\n"] [LIT_CHARS " [ -x \"/usr/local/bin/${e}\" ] || continue\n"] [LIT_CHARS " if schroot -l --all-sessions 2>/dev/null |\n"] [LIT_CHARS " sed 's/^session://' |\n"] [LIT_CHARS " grep -qs \"^${e}-\"; then\n"] [LIT_CHARS " echo \"${e} is currently active\"\n"] [LIT_CHARS " else\n"] [LIT_CHARS " echo \"${e}\"\n"] [LIT_CHARS " fi\n"] [LIT_CHARS " done\n"] [LIT_CHARS " exit 0\n"] [LIT_CHARS "}\n"] [LIT_CHARS "\n"] [LIT_CHARS "while [ \"$#\" -ne 0 ]; do\n"] [LIT_CHARS " case \"$1\" in\n"] [LIT_CHARS " --) shift; break;;\n"] [LIT_CHARS " -h|--help) shift; help;;\n"] [LIT_CHARS " -l|--list) shift; list;;\n"] [LIT_CHARS " -c|--clean) shift; clean \"${chroot}\";;\n"] [LIT_CHARS " -C|--clean-all) shift; clean;;\n"] [LIT_CHARS " *) break;;\n"] [LIT_CHARS " esac\n"] [LIT_CHARS "done\n"] [LIT_CHARS "\n"] [LIT_CHARS "# Start a new chroot session and keep track of the session id. We inject this\n"] [LIT_CHARS "# id into all processes that run inside the chroot. Unless they go out of their\n"] [LIT_CHARS "# way to clear their environment, we can then later identify our child and\n"] [LIT_CHARS "# grand-child processes by scanning their environment.\n"] [LIT_CHARS "session=\"$(schroot -c \"${chroot}\" -b)\"\n"] [LIT_CHARS "export CHROOT_SESSION_ID=\"${session}\"\n"] [LIT_CHARS "\n"] [LIT_CHARS "# Set GOMA_TMP_DIR for better handling of goma inside chroot.\n"] [LIT_CHARS "export GOMA_TMP_DIR=\"/tmp/goma_tmp_$CHROOT_SESSION_ID\"\n"] [LIT_CHARS "mkdir -p \"$GOMA_TMP_DIR\"\n"] [LIT_CHARS "\n"] [LIT_CHARS "if [ $# -eq 0 ]; then\n"] [LIT_CHARS " # Run an interactive shell session\n"] [LIT_CHARS " schroot -c \"${session}\" -r -p\n"] [LIT_CHARS "else\n"] [LIT_CHARS " # Run a command inside of the chroot environment\n"] [LIT_CHARS " p=\"$1\"; shift\n"] [LIT_CHARS " schroot -c \"${session}\" -r -p \"$p\" -- \"$@\"\n"] [LIT_CHARS "fi\n"] [LIT_CHARS "rc=$?\n"] [LIT_CHARS "\n"] [LIT_CHARS "# Compute the inode of the root directory inside of the chroot environment.\n"] [LIT_CHARS "i=$(schroot -c \"${session}\" -r -p ls -- -id /proc/self/root/. |\n"] [LIT_CHARS " awk '{ print $1 }') 2>/dev/null\n"] [LIT_CHARS "other_pids=\n"] [LIT_CHARS "while [ -n \"$i\" ]; do\n"] [LIT_CHARS " # Identify processes by the inode number of their root directory. Then\n"] [LIT_CHARS " # remove all processes that we know belong to other sessions. We use\n"] [LIT_CHARS " # \"sort | uniq -u\" to do what amounts to a \"set substraction operation\".\n"] [LIT_CHARS " pids=$({ ls -id1 /proc/*/root/. 2>/dev/null |\n"] [LIT_CHARS " sed -e 's,^[^0-9]*'$i'.*/\\([1-9][0-9]*\\)/.*$,\\1,\n"] [LIT_CHARS " t\n"] [LIT_CHARS " d';\n"] [LIT_CHARS " echo \"${other_pids}\";\n"] [LIT_CHARS " echo \"${other_pids}\"; } | sort | uniq -u) >/dev/null 2>&1\n"] [LIT_CHARS " # Kill all processes that are still left running in the session. This is\n"] [LIT_CHARS " # typically an assortment of daemon processes that were started\n"] [LIT_CHARS " # automatically. They result in us being unable to tear down the session\n"] [LIT_CHARS " # cleanly.\n"] [LIT_CHARS " [ -z \"${pids}\" ] && break\n"] [LIT_CHARS " for j in $pids; do\n"] [LIT_CHARS " # Unfortunately, the way that schroot sets up sessions has the\n"] [LIT_CHARS " # side-effect of being unable to tell one session apart from another.\n"] [LIT_CHARS " # This can result in us attempting to kill processes in other sessions.\n"] [LIT_CHARS " # We make a best-effort to avoid doing so.\n"] [LIT_CHARS " k=\"$( ( xargs -0 -n1 /dev/null |\n"] [LIT_CHARS " sed 's/^CHROOT_SESSION_ID=/x/;t1;d;:1;q')\"\n"] [LIT_CHARS " if [ -n \"${k}\" -a \"${k#x}\" != \"${session}\" ]; then\n"] [LIT_CHARS " other_pids=\"${other_pids}\n"] [LIT_CHARS "${j}\"\n"] [LIT_CHARS " continue\n"] [LIT_CHARS " fi\n"] [LIT_CHARS " kill -9 $pids\n"] [LIT_CHARS " done\n"] [LIT_CHARS "done\n"] [LIT_CHARS "# End the chroot session. This should clean up all temporary files. But if we\n"] [LIT_CHARS "# earlier failed to terminate all (daemon) processes inside of the session,\n"] [LIT_CHARS "# deleting the session could fail. When that happens, the user has to manually\n"] [LIT_CHARS "# clean up the stale files by invoking us with \"--clean\" after having killed\n"] [LIT_CHARS "# all running processes.\n"] [LIT_CHARS "schroot -c \"${session}\" -e\n"] [LIT_CHARS "# Since no goma processes are running, we can remove goma directory.\n"] [LIT_CHARS "rm -rf \"$GOMA_TMP_DIR\"\n"] [LIT_CHARS "exit $rc\n"]} 0), > ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS chown]} {[LIT_CHARS root] [LIT_OTHER ":"] [LIT_CHARS root]} {[LIT_CHARS /usr/local/bin/] [DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS chmod]} {[LIT_CHARS 755]} {[LIT_CHARS /usr/local/bin/] [DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub alt_repos]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS y]]} {[LIT_CHARS -a]} {[LIT_CHARS -r]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sed]} {[LIT_CHARS -i]} {[SQ ]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -r]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sed]} {[LIT_CHARS -i]} {[SQ ]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} ) ) (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -r]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS HEAD]} {[DQ [LIT_CHARS "http://archive.canonical.com/ubuntu/dists/"][VarSub distname][LIT_CHARS /partner]]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ ] [DQ [VarSub distname]] [SQ >\"/var/lib/chroot/">] [DQ [VarSub target]] [SQ ]} ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub add_srcs]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS y]]} {[LIT_CHARS -a]} {[LIT_CHARS -r]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sed]} {[LIT_CHARS -i]} {[SQ ]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} ) ) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub http_proxy]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ ] [DQ [VarSub http_proxy]] [SQ >\"/var/lib/chroot/">] [DQ [VarSub target]] [SQ ]} ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS /bin/sh]} {[LIT_CHARS -c]} {[SQ ]} ) (Com {[LIT_OTHER ":"]} ) ) (For i [{[LIT_CHARS debian-keyring]}, {[LIT_CHARS ubuntu-keyring]}, {[LIT_CHARS locales]}, {[LIT_CHARS sudo]}]) (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /usr/share/doc/][VarSub i]]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_OR_IF (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS apt-get]} {[LIT_CHARS -y]} {[LIT_CHARS install]} {[DQ [VarSub i]]} ) (Com {[LIT_OTHER ":"]} ) ) ) ) (AndOr OP_OR_IF (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS /bin/sh]} {[LIT_CHARS -c]} {[SQ ]} ) (Com {[LIT_OTHER ":"]} ) ) (AndOr OP_AND_IF (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS dpkg]} {[LIT_CHARS --assert-multi-arch]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -r]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (Com {[LIT_CHARS sudo]} {[LIT_CHARS sed]} {[LIT_CHARS -i]} {[SQ ]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /etc/apt/sources.list]]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[LIT_CHARS /var/lib/chroot/] [VarSub target] [LIT_CHARS /etc/dpkg/dpkg.cfg.d/]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_OR_IF (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS dpkg]} {[LIT_CHARS --add-architecture]} {[ComSub (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub arch]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS 32bit]]} {[LIT_DBRACKET_LIKE "]"]}) (AndOr OP_OR_IF (Com {[LIT_CHARS echo]} {[LIT_CHARS amd64]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS i386]}) ) )]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) (Pipeline (Com {[LIT_CHARS echo]} {[LIT_CHARS foreign-architecture]} {[ComSub (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub arch]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS 32bit]]} {[LIT_DBRACKET_LIKE "]"]}) (AndOr OP_OR_IF (Com {[LIT_CHARS echo]} {[LIT_CHARS amd64]}) (Com {[LIT_CHARS echo]} {[LIT_CHARS i386]}) ) )]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[DQ [LIT_CHARS "cat >'/var/lib/chroot/"][VarSub target][LIT_CHARS "/etc/dpkg/dpkg.cfg.d/multiarch'"]]} ) ) ) ) ) ) ) (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS /bin/sh]} {[LIT_CHARS -c]} {[SQ ] [DQ [LIT_CHARS "'^"][ComSub (Com {[LIT_CHARS id]} {[LIT_CHARS -nu]})][LIT_CHARS " '"]] [SQ ] [DQ [LIT_CHARS "'"][ComSub (Com {[LIT_CHARS id]} {[LIT_CHARS -nu]})][LIT_CHARS " ALL=(ALL) ALL'"]] [SQ >/etc/sudoers">]} ) (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS apt-get]} {[LIT_CHARS -y]} {[LIT_CHARS install]} {[LIT_CHARS autoconf]} {[LIT_CHARS automake1.9]} {[LIT_CHARS dpkg-dev]} {[LIT_CHARS g] [LIT_OTHER "+"] [LIT_OTHER "+"] [LIT_CHARS -multilib]} {[LIT_CHARS gcc-multilib]} {[LIT_CHARS gdb]} {[LIT_CHARS less]} {[LIT_CHARS libtool]} {[LIT_CHARS lsof]} {[LIT_CHARS strace]} ) (= scope= flags=0 words=[] bindings=[('host_distro', {[ComSub (Pipeline (Com {[LIT_CHARS grep]} {[LIT_CHARS -s]} {[LIT_CHARS DISTRIB_CODENAME]} {[LIT_CHARS /etc/lsb-release]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[DQ [LIT_CHARS "="]]} {[LIT_CHARS -f]} {[LIT_CHARS 2]}) )]})]) (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub copy_64]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [LIT_CHARS y]]} {[LIT_CHARS -o]} {[DQ [VarSub host_distro]]} {[LIT_DBRACKET_LIKE "="]} {[DQ [VarSub distname]]} {[LIT_CHARS -a]} {[DQ [VarSub arch]]} {[LIT_DBRACKET_LIKE "="]} {[LIT_CHARS 32bit]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline (Com {[LIT_CHARS file]} {[LIT_CHARS /bin/bash]} < (FilenameRedirectNode filename={[LIT_CHARS /dev/null]} "> 2), > ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -q]} {[LIT_CHARS x86-64]} ) ) ) (List (= scope= flags=0 words=[] bindings=[('readlinepkg', {[ComSub (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[SQ ]})]})]) (Com {[LIT_CHARS sudo]} {[DQ [LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS apt-get]} {[LIT_CHARS -y]} {[LIT_CHARS install]} {[LIT_CHARS lib64expat1]} {[LIT_CHARS lib64ncurses5]} {[VarSub readlinepkg]} {[LIT_CHARS lib64z1]} {[LIT_CHARS lib64stdc] [LIT_OTHER "+"] [LIT_OTHER "+"] [LIT_CHARS 6]} ) (= scope= flags=0 words=[] bindings=[('dep', {[SQ ]})]) (For i [{[LIT_CHARS binutils]}, {[LIT_CHARS gdb]}]) (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[LIT_CHARS /usr/share/doc/] [DQ [VarSub i]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('dep', {[DQ [VarSub dep][LIT_CHARS " "][VarSub i]]})]) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub dep]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS apt-get]} {[LIT_CHARS -y]} {[LIT_CHARS install]} {[VarSub dep]} ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /usr/local/lib/amd64]]} ) (For i [{[LIT_CHARS libbfd]}, {[LIT_CHARS libpython]}]) (List (= scope= flags=0 words=[] bindings=[('lib', {[DQ [ComSub (Pipeline (List (Com {[LIT_CHARS ldd]} {[LIT_CHARS /usr/bin/ld]}) (Com {[LIT_CHARS ldd]} {[LIT_CHARS /usr/bin/gdb]}) ) (Com {[LIT_CHARS grep]} {[LIT_CHARS -s]} {[DQ [VarSub i]]}) (Com {[LIT_CHARS awk]} {[SQ ]}) )]]})]) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub lib]]} {[LIT_CHARS -a]} {[LIT_CHARS -r]} {[DQ [VarSub lib]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS cp]} {[DQ [VarSub lib]]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /usr/local/lib/amd64]]} ) ) ) ) (For lib [{[LIT_CHARS libssl]}, {[LIT_CHARS libcrypt]}]) (For path [{[LIT_CHARS /usr/lib]}, {[LIT_CHARS /usr/lib/x86_64-linux-gnu]}]) (AndOr OP_OR_IF (Com {[LIT_CHARS sudo]} {[LIT_CHARS cp]} {[VarSub path] [LIT_CHARS /] [VarSub lib] [LIT_OTHER "*"]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /usr/local/lib/amd64/]]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) (Com {[LIT_OTHER ":"]} ) ) ) ) (For i [{[LIT_CHARS gdb]}, {[LIT_CHARS ld]}]) (List (Com {[LIT_CHARS sudo]} {[LIT_CHARS cp]} {[LIT_CHARS /usr/bin/] [VarSub i]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /usr/local/lib/amd64/]]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[DQ [LIT_CHARS "cat >'/var/lib/chroot/"][VarSub target][LIT_CHARS /usr/local/bin/][VarSub i][LIT_CHARS "'"]]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "#!/bin/sh\n"][LIT_CHARS "exec /lib64/ld-linux-x86-64.so.2 --library-path /usr/local/lib/amd64 "][LIT_CHARS " /usr/local/lib/amd64/"][VarSub i][LIT_CHARS " "][RIGHT_D_QUOTE "\""][\ LIT_ESCAPED_CHAR "\\$"][LIT_CHARS "@"][RIGHT_D_QUOTE "\""][LIT_CHARS "\n"]]} 0), > ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS chmod]} {[LIT_CHARS 755]} {[DQ [LIT_CHARS /var/lib/chroot/][VarSub target][LIT_CHARS /usr/local/bin/][VarSub i]]} ) ) ) ) ) (= scope= flags=0 words=[] bindings=[('script', {[DQ [ComSub (Com {[LIT_CHARS dirname]} {[ComSub (Com {[LIT_CHARS readlink]} {[LIT_CHARS -f]} {[DQ [VarSub 0]]})]})][LIT_CHARS /install-build-deps.sh]]})]) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -x]} {[DQ [VarSub script]]} {[LIT_DBRACKET_LIKE "]"]} ) (List (While (Com {[LIT_OTHER ":"]} ) (List (Com {[LIT_CHARS echo]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "If you plan on building Chrome inside of the new chroot environment,"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "you now have to install the build dependencies. Do you want me to"]]} ) (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "start the script that does this for you (y/n)? "]]} ) (Com {[LIT_CHARS read]} {[LIT_CHARS install_deps]} ) (Case to_match={[DQ [VarSub install_deps]]}, pat_word_list=[[{[LIT_CHARS y]}, {[LIT_CHARS Y]}], [{[LIT_CHARS n]}, {[LIT_CHARS N]}]] (List (Com {[LIT_CHARS echo]} ) (= scope= flags=0 words=[] bindings=[('tmp_script', {[SQ ]})]) (If (Pipeline! (Com {[LIT_CHARS sudo]} {[LIT_CHARS /usr/local/bin/] [DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[DQ [LIT_CHARS "[ -x '"][VarSub script][LIT_CHARS "' ]"]]} < (DescriptorRedirectNode target={[LIT_CHARS /dev/null]} &"> 1), > ) ) (List (= scope= flags=0 words=[] bindings=[('tmp_script', {[DQ [LIT_CHARS /tmp/][VarSub script transform_ops=[VS_UNARY_DPOUND {[LIT_CHARS "*"] [LIT_SLASH /]}]]]})]) (Com {[LIT_CHARS cp]} {[DQ [VarSub script]]} {[DQ [VarSub tmp_script]]} ) ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS /usr/local/bin/] [DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS sh]} {[LIT_CHARS -c]} {[DQ [VarSub script][LIT_CHARS ";\n"][LIT_CHARS " rc="][VarSub ?][LIT_CHARS ";\n"][LIT_CHARS " /etc/init.d/cron stop >/dev/null 2>&1 || :;\n"][LIT_CHARS " /etc/init.d/rsyslog stop >/dev/null 2>&1 || :;\n"][LIT_CHARS " /etc/init.d/dbus stop >/dev/null 2>&1 || :;\n"][LIT_CHARS " exit "][VarSub rc]]} ) (= scope= flags=0 words=[] bindings=[('rc', {[VarSub ?]})]) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub tmp_script]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS rm]} {[LIT_CHARS -f]} {[DQ [VarSub tmp_script]]} ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[VarSub rc]} {[LIT_CHARS -ne]} {[LIT_CHARS 0]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS exit]} {[VarSub rc]} ) ) (Com {[LIT_CHARS break]} ) ) (Com {[LIT_CHARS break]} ) ) ) ) (Com {[LIT_CHARS echo]} ) ) ) (Com {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub HOME][LIT_CHARS /chroot/]]} ) (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_OTHER "!"]} {[LIT_CHARS -h]} {[DQ [VarSub HOME][LIT_CHARS /chroot]]} {[LIT_DBRACKET_LIKE "]"]} ) (AndOr OP_AND_IF (Pipeline! (Com {[LIT_CHARS egrep]} {[LIT_CHARS -qs]} {[SQ ]} {[LIT_CHARS /etc/fstab]} ) ) (AndOr OP_AND_IF (AndOr OP_OR_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub bind_mounts]]} {[LIT_CHARS -a]} {[DQ [VarSub bind_mounts]]} {[LIT_NEQUAL "!="]} {[DQ [LIT_CHARS NONE]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS is_network_drive]} {[DQ [VarSub HOME][LIT_CHARS /chroot]]} ) ) (Pipeline! (Com {[LIT_CHARS egrep]} {[LIT_CHARS -qs]} {[SQ ]} {[LIT_CHARS /proc/mounts]} ) ) ) ) ) (List (Com {[LIT_CHARS echo]} {[DQ [VarSub HOME][LIT_CHARS "/chroot is currently located on the same device as your"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "home directory."]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "This might not be what you want. Do you want me to move it somewhere"]]} ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "else?"]]} ) (= scope= flags=0 words=[] bindings=[('suggest', {[SQ ]})]) (For i [{[ComSub (Pipeline (Com {[LIT_CHARS echo]} {[DQ [VarSub bind_mounts]]}) (Com {[LIT_CHARS cut]} {[LIT_CHARS -d]} {[SQ ]} {[LIT_CHARS -f]} {[LIT_CHARS 1]}) )]}]) (List (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[DQ [VarSub i]]} {[LIT_CHARS -a]} {[LIT_CHARS -w]} {[DQ [VarSub i]]} {[LIT_CHARS -a]} {[\ LIT_ESCAPED_CHAR "\\("]} {[LIT_OTHER "!"]} {[LIT_CHARS -a]} {[DQ [VarSub i][LIT_CHARS /chroot]]} {[LIT_CHARS -o]} {[LIT_CHARS -w]} {[DQ [VarSub i][LIT_CHARS /chroot/.]]} {[\ LIT_ESCAPED_CHAR "\\)"]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline! (Com {[LIT_CHARS is_network_drive]} {[DQ [VarSub i]]} ) ) ) (= scope= flags=0 words=[] bindings=[('suggest', {[DQ [VarSub i]]})]) (ElseTrue) (For j [{[DQ [VarSub i][LIT_CHARS /]] [LIT_OTHER "*"]}]) (List (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[DQ [VarSub j]]} {[LIT_CHARS -a]} {[LIT_CHARS -w]} {[DQ [VarSub j]]} {[LIT_CHARS -a]} {[\ LIT_ESCAPED_CHAR "\\("]} {[LIT_OTHER "!"]} {[LIT_CHARS -a]} {[DQ [VarSub j][LIT_CHARS /chroot]]} {[LIT_CHARS -o]} {[LIT_CHARS -w]} {[DQ [VarSub j][LIT_CHARS /chroot/.]]} {[\ LIT_ESCAPED_CHAR "\\)"]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline! (Com {[LIT_CHARS is_network_drive]} {[DQ [VarSub j]]} ) ) ) (= scope= flags=0 words=[] bindings=[('suggest', {[DQ [VarSub j]]})]) (ElseTrue) (For k [{[DQ [VarSub j][LIT_CHARS /]] [LIT_OTHER "*"]}]) (If (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[DQ [VarSub k]]} {[LIT_CHARS -a]} {[LIT_CHARS -w]} {[DQ [VarSub k]]} {[LIT_CHARS -a]} {[\ LIT_ESCAPED_CHAR "\\("]} {[LIT_OTHER "!"]} {[LIT_CHARS -a]} {[DQ [VarSub k][LIT_CHARS /chroot]]} {[LIT_CHARS -o]} {[LIT_CHARS -w]} {[DQ [VarSub k][LIT_CHARS /chroot/.]]} {[\ LIT_ESCAPED_CHAR "\\)"]} {[LIT_DBRACKET_LIKE "]"]} ) (Pipeline! (Com {[LIT_CHARS is_network_drive]} {[DQ [VarSub k]]} ) ) ) (List (= scope= flags=0 words=[] bindings=[('suggest', {[DQ [VarSub k]]})]) (Com {[LIT_CHARS break]} ) ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub suggest]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS break]} ) ) ) ) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub suggest]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS break]} ) ) ) ) (= scope= flags=0 words=[] bindings=[('def_suggest', {[DQ [VarSub HOME]]})]) (If (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -n]} {[DQ [VarSub suggest]]} {[LIT_DBRACKET_LIKE "]"]} ) (If (Com {[LIT_CHARS is_network_drive]} {[DQ [VarSub HOME]]} ) (= scope= flags=0 words=[] bindings=[('def_suggest', {[DQ [VarSub suggest]]})]) (ElseTrue) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "A good location would probably be in "][\ LIT_ESCAPED_CHAR "\\\""][VarSub suggest][\ LIT_ESCAPED_CHAR "\\\""]]} ) ) ) (While (Com {[LIT_OTHER ":"]} ) (List (Com {[LIT_CHARS printf]} {[DQ [LIT_CHARS "Physical location ["][VarSub def_suggest][LIT_CHARS "]: "]]} ) (Com {[LIT_CHARS read]} {[LIT_CHARS dir]} ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -z]} {[DQ [VarSub dir]]} {[LIT_DBRACKET_LIKE "]"]} ) (= scope= flags=0 words=[] bindings=[('dir', {[DQ [VarSub def_suggest]]})]) ) (AndOr OP_AND_IF (Com {[LIT_DBRACKET_LIKE "["]} {[DQ [VarSub dir transform_ops=[VS_UNARY_DPERCENT {[LIT_SLASH /]}]]]} {[LIT_DBRACKET_LIKE "=="]} {[DQ [VarSub HOME transform_ops=[VS_UNARY_DPERCENT {[LIT_SLASH /]}]]]} {[LIT_DBRACKET_LIKE "]"]} ) (Com {[LIT_CHARS break]} ) ) (If (AndOr OP_OR_IF (Pipeline! (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -d]} {[DQ [VarSub dir]]} {[LIT_CHARS -a]} {[LIT_CHARS -w]} {[DQ [VarSub dir]]} {[LIT_DBRACKET_LIKE "]"]} ) ) (Com {[LIT_DBRACKET_LIKE "["]} {[LIT_CHARS -a]} {[DQ [VarSub dir][LIT_CHARS /chroot]]} {[LIT_CHARS -a]} {[LIT_OTHER "!"]} {[LIT_CHARS -w]} {[DQ [VarSub dir][LIT_CHARS /chroot/.]]} {[LIT_DBRACKET_LIKE "]"]} ) ) (Com {[LIT_CHARS echo]} {[DQ [LIT_CHARS "Cannot write to "][VarSub dir][LIT_CHARS "/chroot. Please try again"]]} ) (ElseTrue) (List (Com {[LIT_CHARS mv]} {[DQ [VarSub HOME][LIT_CHARS /chroot]]} {[DQ [VarSub dir][LIT_CHARS /chroot]]} ) (Com {[LIT_CHARS ln]} {[LIT_CHARS -s]} {[DQ [VarSub dir][LIT_CHARS /chroot]]} {[DQ [VarSub HOME][LIT_CHARS /chroot]]} ) (For i [{[ComSub (Com {[LIT_CHARS list_all_chroots]})]}]) (Com {[LIT_CHARS sudo]} {[DQ [VarSub i]]} {[LIT_CHARS mkdir]} {[LIT_CHARS -p]} {[DQ [VarSub dir][LIT_CHARS /chroot]]} ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS sed]} {[LIT_CHARS -i]} {[DQ [LIT_CHARS "s,"][VarSub HOME][LIT_CHARS "/chroot,"][VarSub dir][LIT_CHARS "/chroot,g"]]} {[LIT_CHARS /etc/schroot/mount-] [LIT_OTHER "*"]} ) (Com {[LIT_CHARS break]} ) ) ) ) ) ) ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS schroot]} {[LIT_CHARS -c]} {[DQ [VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]]]} {[LIT_CHARS -p]} {[LIT_CHARS --]} {[LIT_CHARS apt-get]} {[LIT_CHARS clean]} ) (Com {[LIT_CHARS sudo]} {[LIT_CHARS apt-get]} {[LIT_CHARS clean]} ) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS INT]} {[LIT_CHARS TERM]} {[LIT_CHARS QUIT]} {[LIT_CHARS HUP]} ) (Com {[LIT_CHARS trap]} {[SQ ]} {[LIT_CHARS EXIT]} ) (Com {[LIT_CHARS cat]} < (HereDocRedirectNode here_end='EOF' do_expansion=True body_word={[DQ [LIT_CHARS "\n"][LIT_CHARS "\n"][LIT_CHARS "Successfully installed "][VarSub distname][LIT_CHARS " "][VarSub arch][LIT_CHARS "\n"][LIT_CHARS "\n"][LIT_CHARS "You can run programs inside of the chroot by invoking the\n"][RIGHT_D_QUOTE "\""][LIT_CHARS /usr/local/bin/][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][RIGHT_D_QUOTE "\""][LIT_CHARS " command.\n"][LIT_CHARS "\n"][LIT_CHARS "This command can be used with arguments, in order to just run a single\n"][LIT_CHARS "program inside of the chroot environment (e.g. "][RIGHT_D_QUOTE "\""][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][LIT_CHARS " make chrome"][RIGHT_D_QUOTE "\""][LIT_CHARS ")\n"][LIT_CHARS "or without arguments, in order to run an interactive shell session inside\n"][LIT_CHARS "of the chroot environment.\n"][LIT_CHARS "\n"][LIT_CHARS "If you need to run things as "][RIGHT_D_QUOTE "\""][LIT_CHARS root][RIGHT_D_QUOTE "\""][LIT_CHARS ", you can use "][RIGHT_D_QUOTE "\""][LIT_CHARS sudo][RIGHT_D_QUOTE "\""][LIT_CHARS " (e.g. try\n"][RIGHT_D_QUOTE "\""][LIT_CHARS "sudo "][VarSub target transform_ops=[VS_UNARY_PERCENT {[LIT_CHARS bit]}]][LIT_CHARS " apt-get update"][RIGHT_D_QUOTE "\""][LIT_CHARS ").\n"][LIT_CHARS "\n"][LIT_CHARS "Your home directory is shared between the host and the chroot. But I\n"][LIT_CHARS "configured "][RIGHT_D_QUOTE "\""][VarSub HOME][LIT_CHARS /chroot][RIGHT_D_QUOTE "\""][LIT_CHARS " to be private to the chroot environment.\n"][LIT_CHARS "You can use it for files that need to differ between environments. This\n"][LIT_CHARS "would be a good place to store binaries that you have built from your\n"][LIT_CHARS "source files.\n"][LIT_CHARS "\n"][LIT_CHARS "For Chrome, this probably means you want to make your "][RIGHT_D_QUOTE "\""][LIT_CHARS out][RIGHT_D_QUOTE "\""][LIT_CHARS " directory a\n"][LIT_CHARS "symbolic link that points somewhere inside of "][RIGHT_D_QUOTE "\""][VarSub HOME][LIT_CHARS /chroot][RIGHT_D_QUOTE "\""][LIT_CHARS ".\n"][LIT_CHARS "\n"][LIT_CHARS "You still need to run "][RIGHT_D_QUOTE "\""][LIT_CHARS "gclient runhooks"][RIGHT_D_QUOTE "\""][LIT_CHARS " whenever you switch from building\n"][LIT_CHARS "outside of the chroot to inside of the chroot. But you will find that you\n"][LIT_CHARS "don't have to repeatedly erase and then completely rebuild all your object\n"][LIT_CHARS "and binary files.\n"][LIT_CHARS "\n"]]} 0), > ) )