(command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <-e>)} {<-o>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <--empty>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <rm> more_env: [] words: [{<rm>} {<-f>} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <truncate> more_env: [] words: [{<truncate>} {<-s>} {<20M>} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Created new hard disk image file \'hdd.img\' with 20MB size.'>)}] redirects: [] do_fork: T ) ] spids: [8 38] ) (IfArm keyword: <Id.KW_Elif elif> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <-f>)} {<-o>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <--folder>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <id> more_env: [] words: [{<id>} {<-u>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {(DQ <'Using option \'-f\' (or \'--folder\') requires root permissions.'>)} ] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [100 124] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Simple blame_tok: <rm> more_env: [] words: [{<rm>} {<-f>} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <truncate> more_env: [] words: [{<truncate>} {<-s>} {<20M>} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Created new hard disk image file \'hdd.img\' with 20MB size.'>)}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'LOOP_DEVICE='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'LOOP_DEVICE='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'LOOP_DEVICE='> name:LOOP_DEVICE) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {<-f>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) } ) ] redirects: [] ) (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {($ Id.VSub_DollarName LOOP_DEVICE)} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Attached hard disk image file to loop device.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkfs.ext2> more_env: [] words: [{<mkfs.ext2>} {($ Id.VSub_DollarName LOOP_DEVICE)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Hard disk image file has been formatted with Ext2 filesystem.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkdir> more_env: [] words: [{<mkdir>} {<folder>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mount> more_env: [] words: [{<mount>} {<hdd.img>} {<folder>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Mounted hard disk image file to temporary folder.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkdir> more_env: [] words: [{<mkdir>} {<-p>} {<'folder/minimal/rootfs'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkdir> more_env: [] words: [{<mkdir>} {<-p>} {<'folder/minimal/work'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Overlay structure has been created.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'This file is on external hard disk.'>)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'folder/minimal/rootfs/overlay.txt'>} ) ] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Created sample text file.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <umount> more_env: [] words: [{<umount>} {<folder>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <rm> more_env: [] words: [{<rm>} {<-rf>} {<folder>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Unmounted hard disk image file.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {<-d>} {($ Id.VSub_DollarName LOOP_DEVICE)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Detached hard disk image file from loop device.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <chown> more_env: [] words: [ {<chown>} { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <logname> more_env: [] words: [{<logname>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) } {<hdd.img>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Applied original ownership to hard disk image file.'>)}] redirects: [] do_fork: T ) ] spids: [67 97] ) (IfArm keyword: <Id.KW_Elif elif> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <-s>)} {<-o>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <--sparse>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.If if_kw: <Id.KW_If if> arms: [ (IfArm keyword: <Id.KW_If if> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {<Id.KW_Bang '!'>} { (DQ (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <id> more_env: [] words: [{<id>} {<-u>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) ) } {<Id.Lit_Equals '='>} {(DQ <0>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} {(DQ <'Using option \'-s\' (or \'--sparse\') requires root permissions.'>)} ] redirects: [] do_fork: T ) (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>}) ] spids: [356 380] ) ] else_action: [] fi_kw: <Id.KW_Fi fi> redirects: [] ) (command.Simple blame_tok: <rm> more_env: [] words: [{<rm>} {<-f>} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <truncate> more_env: [] words: [{<truncate>} {<-s>} {<20M>} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Created new hard disk image file \'hdd.img\' with 20MB size.'>)}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'LOOP_DEVICE_HDD='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'LOOP_DEVICE_HDD='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'LOOP_DEVICE_HDD='> name:LOOP_DEVICE_HDD) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {<-f>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) } ) ] redirects: [] ) (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {($ Id.VSub_DollarName LOOP_DEVICE_HDD)} {<hdd.img>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Attached hard disk image file to loop device.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkfs.vfat> more_env: [] words: [{<mkfs.vfat>} {($ Id.VSub_DollarName LOOP_DEVICE_HDD)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Hard disk image file has been formatted with FAT filesystem.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkdir> more_env: [] words: [{<mkdir>} {<sparse>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mount> more_env: [] words: [{<mount>} {<hdd.img>} {<sparse>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Mounted hard disk image file to temporary folder.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <rm> more_env: [] words: [{<rm>} {<-f>} {<'sparse/minimal.img'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <truncate> more_env: [] words: [{<truncate>} {<-s>} {<1M>} {<'sparse/minimal.img'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Created new overlay image file with 1MB size.'>)}] redirects: [] do_fork: T ) (command.ShAssignment left: <Id.Lit_VarLike 'LOOP_DEVICE_OVL='> pairs: [ (AssignPair left: <Id.Lit_VarLike 'LOOP_DEVICE_OVL='> lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'LOOP_DEVICE_OVL='> name:LOOP_DEVICE_OVL) op: assign_op.Equal rhs: { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {<-f>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) } ) ] redirects: [] ) (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {($ Id.VSub_DollarName LOOP_DEVICE_OVL)} {<'sparse/minimal.img'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Attached overlay image file to loop device.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkfs.ext2> more_env: [] words: [{<mkfs.ext2>} {($ Id.VSub_DollarName LOOP_DEVICE_OVL)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Overlay image file has been formatted with Ext2 filesystem.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkdir> more_env: [] words: [{<mkdir>} {<ovl>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mount> more_env: [] words: [{<mount>} {<'sparse/minimal.img'>} {<ovl>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Mounted overlay image file to temporary folder.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkdir> more_env: [] words: [{<mkdir>} {<-p>} {<'ovl/rootfs'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <mkdir> more_env: [] words: [{<mkdir>} {<-p>} {<'ovl/work'>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Overlay structure has been created.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Create sample text file.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'This file is on external hard disk.'>)}] redirects: [ (Redir op: <Id.Redir_Great '>'> loc: (redir_loc.Fd fd:1) arg: {<'ovl/rootfs/overlay.txt'>} ) ] do_fork: T ) (command.Simple blame_tok: <chown> more_env: [] words: [{<chown>} {<-R>} {<root> <Id.Lit_Colon ':'> <root>} {<ovl>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Applied root ownership to overlay content.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <umount> more_env: [] words: [{<umount>} {<ovl>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <sleep> more_env: [] words: [{<sleep>} {<1>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <rm> more_env: [] words: [{<rm>} {<-rf>} {<ovl>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Unmounted overlay image file.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {<-d>} {($ Id.VSub_DollarName LOOP_DEVICE_OVL)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <sleep> more_env: [] words: [{<sleep>} {<1>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Overlay image file has been detached from loop device.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <umount> more_env: [] words: [{<umount>} {<sparse>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <sleep> more_env: [] words: [{<sleep>} {<1>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <rm> more_env: [] words: [{<rm>} {<-rf>} {<sparse>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Unmounted hard disk image file.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <losetup> more_env: [] words: [{<losetup>} {<-d>} {($ Id.VSub_DollarName LOOP_DEVICE_HDD)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <sleep> more_env: [] words: [{<sleep>} {<1>}] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Hard disk image file has been detached from loop device.'>)}] redirects: [] do_fork: T ) (command.Simple blame_tok: <chown> more_env: [] words: [ {<chown>} { (CommandSub left_token: <Id.Left_DollarParen '$('> child: (command.Simple blame_tok: <logname> more_env: [] words: [{<logname>}] redirects: [] do_fork: T ) right: <Id.Eof_RParen _> ) } {<hdd.img>} ] redirects: [] do_fork: T ) (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'Applied original ownership to hard disk image file.'>)}] redirects: [] do_fork: T ) ] spids: [323 353] ) (IfArm keyword: <Id.KW_Elif elif> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <-h>)} {<-o>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ <--help>)} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <cat> more_env: [] words: [{<cat>}] redirects: [ (Redir op: <Id.Redir_DLess '<<'> loc: (redir_loc.Fd fd:0) arg: (redir_param.HereDoc here_begin: {<CEOF>} here_end_tok: <Id.Undefined_Tok ''> stdin_parts: [ <' Usage: '> ($ Id.VSub_Number 0) <' [OPTION]\n'> < ' This utility generates 20MB sparse file \'hdd.img\' which can be used as QEMU\n' > < ' disk image where all filesystem changes from the live session are persisted.\n' > <' \n'> <' -e, --empty Create empty sparse image file which is not formatted.\n'> < ' -f, --folder Create sparse image file formatted with Ext2 filesystem which\n' > <' contains compatible overlay folder structure.\n'> <' -h, --help Prints this help information.\n'> < ' -s, --sparse Create sparse image file formatted with FAT filesystem which\n' > < ' contains sparse image file \'minimal.img\' (1MB) formatted with\n' > < ' Ext2 filesystem which contains the actual overlay structure.\n' > ] ) ) ] do_fork: T ) ] spids: [734 764] ) (IfArm keyword: <Id.KW_Elif elif> cond: (condition.Shell commands: [ (command.Sentence child: (command.Simple blame_tok: <Id.Lit_LBracket '['> more_env: [] words: [ {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_Number 1))} {<Id.Lit_Equals '='>} {(DQ )} {<Id.Lit_RBracket ']'>} ] redirects: [] do_fork: T ) terminator: <Id.Op_Semi _> ) ] ) then_kw: <Id.KW_Then then> action: [ (command.Simple blame_tok: <echo> more_env: [] words: [{<echo>} {(DQ <'No option specified. Use \'-h\' or \'--help\' for more info.'>)}] redirects: [] do_fork: T ) ] spids: [789 806] ) ] else_kw: <Id.KW_Else else> else_action: [ (command.Simple blame_tok: <echo> more_env: [] words: [ {<echo>} { (DQ <'Option \''> ($ Id.VSub_Number 1) <'\' is not recognized. Use \'-h\' or \'--help\' for more info.'> ) } ] redirects: [] do_fork: T ) ] fi_kw: <Id.KW_Fi fi> redirects: [] )