--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="210mm"
+ height="297mm"
+ id="svg3018"
+ version="1.1"
+ inkscape:version="0.48.2 r9819"
+ sodipodi:docname="python.svg">
+ <sodipodi:namedview
+ inkscape:document-units="mm"
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.979899"
+ inkscape:cx="273.12925"
+ inkscape:cy="546.65265"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1267"
+ inkscape:window-height="850"
+ inkscape:window-x="149"
+ inkscape:window-y="31"
+ inkscape:window-maximized="0">
+ <inkscape:grid
+ id="grid3047"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <defs
+ id="defs3">
+ <marker
+ style="overflow:visible;"
+ id="Arrow1Mend"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1Mend">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path3921" />
+ </marker>
+ <marker
+ style="overflow:visible;"
+ id="Arrow1MendU"
+ refX="0.0"
+ refY="0.0"
+ orient="auto"
+ inkscape:stockid="Arrow1MendU">
+ <path
+ transform="scale(0.4) rotate(180) translate(10,0)"
+ style="marker-start:none;stroke:#cc0000;stroke-width:1.0pt;fill:#cc0000;fill-rule:evenodd"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ id="path4358" />
+ </marker>
+ </defs>
+ <metadata
+ id="metadata4">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1">
+ <rect
+ style="fill:none;stroke:#000000;stroke-width:0.70866142;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3052"
+ width="598.57141"
+ height="898.57141"
+ x="50"
+ y="93.790756"
+ ry="0" />
+ <text
+ sodipodi:linespacing="125%"
+ id="text3043"
+ y="0"
+ x="0"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ xml:space="preserve"><tspan
+ y="0"
+ x="0"
+ id="tspan3045"
+ sodipodi:role="line" /></text>
+ <text
+ sodipodi:linespacing="125%"
+ id="text3049"
+ y="112.36218"
+ x="58.57143"
+ style="font-size:18px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ xml:space="preserve"><tspan
+ y="112.36218"
+ x="58.57143"
+ id="tspan3051"
+ sodipodi:role="line">#!/usr/bin/python</tspan><tspan
+ id="tspan3053"
+ y="142.36218"
+ x="58.57143"
+ sodipodi:role="line" /><tspan
+ id="tspan3055"
+ y="172.36218"
+ x="58.57143"
+ sodipodi:role="line">import sys</tspan><tspan
+ id="tspan3057"
+ y="202.36218"
+ x="58.57143"
+ sodipodi:role="line">import re</tspan><tspan
+ id="tspan3059"
+ y="232.36218"
+ x="58.57143"
+ sodipodi:role="line">import guestfs</tspan><tspan
+ id="tspan3061"
+ y="262.36218"
+ x="58.57143"
+ sodipodi:role="line" /><tspan
+ id="tspan3063"
+ y="292.36218"
+ x="58.57143"
+ sodipodi:role="line">assert (len (sys.argv) == 2)</tspan><tspan
+ id="tspan3065"
+ y="322.36218"
+ x="58.57143"
+ sodipodi:role="line">disk = sys.argv[1]</tspan><tspan
+ id="tspan3067"
+ y="352.36218"
+ x="58.57143"
+ sodipodi:role="line" /><tspan
+ id="tspan3069"
+ y="382.36218"
+ x="58.57143"
+ sodipodi:role="line">g = guestfs.GuestFS ()</tspan><tspan
+ id="tspan3071"
+ y="412.36218"
+ x="58.57143"
+ sodipodi:role="line">g.add_drive_opts (disk, readonly=1)</tspan><tspan
+ id="tspan3073"
+ y="442.36218"
+ x="58.57143"
+ sodipodi:role="line">g.launch ()</tspan><tspan
+ id="tspan3075"
+ y="472.36218"
+ x="58.57143"
+ sodipodi:role="line" /><tspan
+ id="tspan3077"
+ y="502.36218"
+ x="58.57143"
+ sodipodi:role="line">roots = g.inspect_os ()</tspan><tspan
+ id="tspan3079"
+ y="532.36218"
+ x="58.57143"
+ sodipodi:role="line">if len (roots) == 0:</tspan><tspan
+ id="tspan3081"
+ y="562.36218"
+ x="58.57143"
+ sodipodi:role="line"> raise (Error ("inspect_vm: no operating systems found"))</tspan><tspan
+ id="tspan3083"
+ y="592.36218"
+ x="58.57143"
+ sodipodi:role="line" /><tspan
+ id="tspan3085"
+ y="622.36218"
+ x="58.57143"
+ sodipodi:role="line">for root in roots:</tspan><tspan
+ id="tspan3087"
+ y="652.36218"
+ x="58.57143"
+ sodipodi:role="line"> mps = g.inspect_get_mountpoints (root)</tspan><tspan
+ id="tspan3089"
+ y="682.36218"
+ x="58.57143"
+ sodipodi:role="line"> def compare (a, b):</tspan><tspan
+ id="tspan3091"
+ y="712.36218"
+ x="58.57143"
+ sodipodi:role="line"> if len(a[0]) > len(b[0]):</tspan><tspan
+ id="tspan3093"
+ y="742.36218"
+ x="58.57143"
+ sodipodi:role="line"> return 1</tspan><tspan
+ id="tspan3095"
+ y="772.36218"
+ x="58.57143"
+ sodipodi:role="line"> elif len(a[0]) == len(b[0]):</tspan><tspan
+ id="tspan3097"
+ y="802.36218"
+ x="58.57143"
+ sodipodi:role="line"> return 0</tspan><tspan
+ id="tspan3099"
+ y="832.36218"
+ x="58.57143"
+ sodipodi:role="line"> else:</tspan><tspan
+ id="tspan3101"
+ y="862.36218"
+ x="58.57143"
+ sodipodi:role="line"> return -1</tspan><tspan
+ id="tspan3103"
+ y="892.36218"
+ x="58.57143"
+ sodipodi:role="line"> mps.sort (compare)</tspan><tspan
+ id="tspan3105"
+ y="922.36218"
+ x="58.57143"
+ sodipodi:role="line"> for mp_dev in mps:</tspan><tspan
+ id="tspan3107"
+ y="952.36218"
+ x="58.57143"
+ sodipodi:role="line"> try:</tspan><tspan
+ id="tspan3109"
+ y="982.36218"
+ x="58.57143"
+ sodipodi:role="line"> g.mount_ro (mp_dev[1], mp_dev[0])</tspan><tspan
+ id="tspan3111"
+ y="1012.3622"
+ x="58.57143"
+ sodipodi:role="line"> except RuntimeError as msg:</tspan><tspan
+ id="tspan3113"
+ y="1042.3622"
+ x="58.57143"
+ sodipodi:role="line"> print "%s (ignored)" % msg</tspan><tspan
+ id="tspan3115"
+ y="1072.3622"
+ x="58.57143"
+ sodipodi:role="line" /><tspan
+ id="tspan3117"
+ y="1102.3622"
+ x="58.57143"
+ sodipodi:role="line"> apps = g.inspect_list_applications (root)</tspan><tspan
+ id="tspan3119"
+ y="1132.3622"
+ x="58.57143"
+ sodipodi:role="line"> for app in apps:</tspan><tspan
+ id="tspan3121"
+ y="1162.3622"
+ x="58.57143"
+ sodipodi:role="line"> if re.search ('firefox', app['app_name'], re.I):</tspan><tspan
+ id="tspan3123"
+ y="1192.3622"
+ x="58.57143"
+ sodipodi:role="line"> print ("'%s' version: %s" % (app['app_name'], app['app_version']))</tspan><tspan
+ id="tspan3125"
+ y="1222.3622"
+ x="58.57143"
+ sodipodi:role="line" /><tspan
+ id="tspan3127"
+ y="1252.3622"
+ x="58.57143"
+ sodipodi:role="line"> g.umount_all ()</tspan></text>
+ <rect
+ ry="20"
+ y="292.36218"
+ x="40"
+ height="77.14286"
+ width="320"
+ id="rect3897"
+ style="fill:none;stroke:#cc0000;stroke-width:4.2519685;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <rect
+ ry="20"
+ y="382.36218"
+ x="40"
+ height="84.285713"
+ width="502.85715"
+ id="rect3901"
+ style="fill:none;stroke:#cc0000;stroke-width:4.2519685;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <rect
+ style="fill:none;stroke:#cc0000;stroke-width:4.2519685;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect3903"
+ width="381.42856"
+ height="320.57144"
+ x="40"
+ y="500.36218"
+ ry="20" />
+ <rect
+ ry="20"
+ y="838.36218"
+ x="40"
+ height="101.14286"
+ width="620"
+ id="rect3905"
+ style="fill:none;stroke:#cc0000;stroke-width:4.2519685;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3907"
+ d="M 420,212.36218 354.28571,276.6479"
+ style="fill:none;stroke:#cc0000;stroke-width:3.54330707;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1MendU)" />
+ <path
+ style="fill:none;stroke:#cc0000;stroke-width:3.54330707;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1MendU)"
+ d="M 525.71429,308.07646 460,372.36218"
+ id="path4466"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4468"
+ d="M 500,552.36218 434.28571,616.6479"
+ style="fill:none;stroke:#cc0000;stroke-width:3.54330707;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1MendU)" />
+ <path
+ style="fill:none;stroke:#cc0000;stroke-width:3.54330707;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#Arrow1MendU)"
+ d="M 525.71429,748.07646 460,812.36218"
+ id="path4470"
+ inkscape:connector-curvature="0" />
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#cc0000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ x="440"
+ y="192.36218"
+ id="text4472"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4474"
+ x="440"
+ y="192.36218">add the disks</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#cc0000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ x="540"
+ y="272.36218"
+ id="text4476"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4478"
+ x="540"
+ y="272.36218">inspection:</tspan><tspan
+ sodipodi:role="line"
+ x="540"
+ y="302.36218"
+ id="tspan4480">look for OSes</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#cc0000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ x="520"
+ y="512.36218"
+ id="text4482"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4484"
+ x="520"
+ y="512.36218">mount filesystems</tspan><tspan
+ sodipodi:role="line"
+ x="520"
+ y="542.36218"
+ id="tspan4486">as they would be</tspan><tspan
+ sodipodi:role="line"
+ x="520"
+ y="572.36218"
+ id="tspan4488">when the guest is</tspan><tspan
+ sodipodi:role="line"
+ x="520"
+ y="602.36218"
+ id="tspan4490">running</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:24px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:start;fill:#cc0000;fill-opacity:1;stroke:none;font-family:Liberation Sans;-inkscape-font-specification:Liberation Sans"
+ x="540"
+ y="712.36218"
+ id="text4492"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan4494"
+ x="540"
+ y="712.36218">list installed</tspan><tspan
+ sodipodi:role="line"
+ x="540"
+ y="742.36218"
+ id="tspan4496">apps and look</tspan><tspan
+ sodipodi:role="line"
+ x="540"
+ y="772.36218"
+ id="tspan4498">for firefox &</tspan><tspan
+ sodipodi:role="line"
+ x="540"
+ y="802.36218"
+ id="tspan4500">version</tspan></text>
+ </g>
+</svg>