diff options
author | Alexander Bersenev <bay@hackerdom.ru> | 2011-07-25 01:32:59 +0000 |
---|---|---|
committer | Alexander Bersenev <bay@hackerdom.ru> | 2011-07-25 01:32:59 +0000 |
commit | 2276366a5a6200dabc0778ffeac896ca20b61bf1 (patch) | |
tree | a118d698e382f384633e5a6da95532b4705a35a6 /docs/build/html | |
parent | documentation: intro (diff) | |
download | autodep-2276366a5a6200dabc0778ffeac896ca20b61bf1.tar.gz autodep-2276366a5a6200dabc0778ffeac896ca20b61bf1.tar.bz2 autodep-2276366a5a6200dabc0778ffeac896ca20b61bf1.zip |
documentation, man page
Diffstat (limited to 'docs/build/html')
85 files changed, 1809 insertions, 103 deletions
diff --git a/docs/build/html/.buildinfo b/docs/build/html/.buildinfo index ba09b71..ef0a417 100644 --- a/docs/build/html/.buildinfo +++ b/docs/build/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: e1998453cbba6d936a55ade382a2d459 +config: a3d207b79b22f4cf7a48545c98ca198a tags: fbb0d17656682115ca4d033fb2f83ba1 diff --git a/docs/build/html/_images/autodep_arch.png b/docs/build/html/_images/autodep_arch.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch.png diff --git a/docs/build/html/_images/autodep_arch1.png b/docs/build/html/_images/autodep_arch1.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch1.png diff --git a/docs/build/html/_images/autodep_arch10.png b/docs/build/html/_images/autodep_arch10.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch10.png diff --git a/docs/build/html/_images/autodep_arch11.png b/docs/build/html/_images/autodep_arch11.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch11.png diff --git a/docs/build/html/_images/autodep_arch12.png b/docs/build/html/_images/autodep_arch12.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch12.png diff --git a/docs/build/html/_images/autodep_arch13.png b/docs/build/html/_images/autodep_arch13.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch13.png diff --git a/docs/build/html/_images/autodep_arch14.png b/docs/build/html/_images/autodep_arch14.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch14.png diff --git a/docs/build/html/_images/autodep_arch15.png b/docs/build/html/_images/autodep_arch15.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch15.png diff --git a/docs/build/html/_images/autodep_arch16.png b/docs/build/html/_images/autodep_arch16.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch16.png diff --git a/docs/build/html/_images/autodep_arch17.png b/docs/build/html/_images/autodep_arch17.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch17.png diff --git a/docs/build/html/_images/autodep_arch18.png b/docs/build/html/_images/autodep_arch18.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch18.png diff --git a/docs/build/html/_images/autodep_arch19.png b/docs/build/html/_images/autodep_arch19.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch19.png diff --git a/docs/build/html/_images/autodep_arch2.png b/docs/build/html/_images/autodep_arch2.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch2.png diff --git a/docs/build/html/_images/autodep_arch20.png b/docs/build/html/_images/autodep_arch20.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch20.png diff --git a/docs/build/html/_images/autodep_arch21.png b/docs/build/html/_images/autodep_arch21.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch21.png diff --git a/docs/build/html/_images/autodep_arch22.png b/docs/build/html/_images/autodep_arch22.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch22.png diff --git a/docs/build/html/_images/autodep_arch23.png b/docs/build/html/_images/autodep_arch23.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch23.png diff --git a/docs/build/html/_images/autodep_arch24.png b/docs/build/html/_images/autodep_arch24.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch24.png diff --git a/docs/build/html/_images/autodep_arch25.png b/docs/build/html/_images/autodep_arch25.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch25.png diff --git a/docs/build/html/_images/autodep_arch26.png b/docs/build/html/_images/autodep_arch26.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch26.png diff --git a/docs/build/html/_images/autodep_arch27.png b/docs/build/html/_images/autodep_arch27.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch27.png diff --git a/docs/build/html/_images/autodep_arch28.png b/docs/build/html/_images/autodep_arch28.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch28.png diff --git a/docs/build/html/_images/autodep_arch29.png b/docs/build/html/_images/autodep_arch29.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch29.png diff --git a/docs/build/html/_images/autodep_arch3.png b/docs/build/html/_images/autodep_arch3.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch3.png diff --git a/docs/build/html/_images/autodep_arch30.png b/docs/build/html/_images/autodep_arch30.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch30.png diff --git a/docs/build/html/_images/autodep_arch31.png b/docs/build/html/_images/autodep_arch31.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch31.png diff --git a/docs/build/html/_images/autodep_arch32.png b/docs/build/html/_images/autodep_arch32.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch32.png diff --git a/docs/build/html/_images/autodep_arch33.png b/docs/build/html/_images/autodep_arch33.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch33.png diff --git a/docs/build/html/_images/autodep_arch34.png b/docs/build/html/_images/autodep_arch34.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch34.png diff --git a/docs/build/html/_images/autodep_arch35.png b/docs/build/html/_images/autodep_arch35.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch35.png diff --git a/docs/build/html/_images/autodep_arch36.png b/docs/build/html/_images/autodep_arch36.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch36.png diff --git a/docs/build/html/_images/autodep_arch37.png b/docs/build/html/_images/autodep_arch37.png Binary files differnew file mode 100644 index 0000000..3a9d310 --- /dev/null +++ b/docs/build/html/_images/autodep_arch37.png diff --git a/docs/build/html/_images/autodep_arch38.png b/docs/build/html/_images/autodep_arch38.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch38.png diff --git a/docs/build/html/_images/autodep_arch39.png b/docs/build/html/_images/autodep_arch39.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch39.png diff --git a/docs/build/html/_images/autodep_arch4.png b/docs/build/html/_images/autodep_arch4.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch4.png diff --git a/docs/build/html/_images/autodep_arch40.png b/docs/build/html/_images/autodep_arch40.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch40.png diff --git a/docs/build/html/_images/autodep_arch41.png b/docs/build/html/_images/autodep_arch41.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch41.png diff --git a/docs/build/html/_images/autodep_arch42.png b/docs/build/html/_images/autodep_arch42.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch42.png diff --git a/docs/build/html/_images/autodep_arch43.png b/docs/build/html/_images/autodep_arch43.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch43.png diff --git a/docs/build/html/_images/autodep_arch44.png b/docs/build/html/_images/autodep_arch44.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch44.png diff --git a/docs/build/html/_images/autodep_arch45.png b/docs/build/html/_images/autodep_arch45.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch45.png diff --git a/docs/build/html/_images/autodep_arch46.png b/docs/build/html/_images/autodep_arch46.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch46.png diff --git a/docs/build/html/_images/autodep_arch47.png b/docs/build/html/_images/autodep_arch47.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch47.png diff --git a/docs/build/html/_images/autodep_arch48.png b/docs/build/html/_images/autodep_arch48.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_images/autodep_arch48.png diff --git a/docs/build/html/_images/autodep_arch5.png b/docs/build/html/_images/autodep_arch5.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch5.png diff --git a/docs/build/html/_images/autodep_arch6.png b/docs/build/html/_images/autodep_arch6.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch6.png diff --git a/docs/build/html/_images/autodep_arch7.png b/docs/build/html/_images/autodep_arch7.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch7.png diff --git a/docs/build/html/_images/autodep_arch8.png b/docs/build/html/_images/autodep_arch8.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch8.png diff --git a/docs/build/html/_images/autodep_arch9.png b/docs/build/html/_images/autodep_arch9.png Binary files differnew file mode 100644 index 0000000..0a965ee --- /dev/null +++ b/docs/build/html/_images/autodep_arch9.png diff --git a/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png b/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png Binary files differnew file mode 100644 index 0000000..7de9a01 --- /dev/null +++ b/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png diff --git a/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png.map b/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png.map new file mode 100644 index 0000000..649d660 --- /dev/null +++ b/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png.map @@ -0,0 +1,2 @@ +<map id="foo" name="foo"> +</map> diff --git a/docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png b/docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png Binary files differnew file mode 100644 index 0000000..6d9e4e8 --- /dev/null +++ b/docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png diff --git a/docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png.map b/docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png.map new file mode 100644 index 0000000..649d660 --- /dev/null +++ b/docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png.map @@ -0,0 +1,2 @@ +<map id="foo" name="foo"> +</map> diff --git a/docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png b/docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png Binary files differnew file mode 100644 index 0000000..56519ce --- /dev/null +++ b/docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png diff --git a/docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png.map b/docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png.map new file mode 100644 index 0000000..649d660 --- /dev/null +++ b/docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png.map @@ -0,0 +1,2 @@ +<map id="foo" name="foo"> +</map> diff --git a/docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png b/docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png Binary files differnew file mode 100644 index 0000000..31e68d3 --- /dev/null +++ b/docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png diff --git a/docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png.map b/docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png.map new file mode 100644 index 0000000..649d660 --- /dev/null +++ b/docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png.map @@ -0,0 +1,2 @@ +<map id="foo" name="foo"> +</map> diff --git a/docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png b/docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png Binary files differnew file mode 100644 index 0000000..d798741 --- /dev/null +++ b/docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png diff --git a/docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png.map b/docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png.map new file mode 100644 index 0000000..649d660 --- /dev/null +++ b/docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png.map @@ -0,0 +1,2 @@ +<map id="foo" name="foo"> +</map> diff --git a/docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png b/docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png Binary files differnew file mode 100644 index 0000000..534f138 --- /dev/null +++ b/docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png diff --git a/docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png.map b/docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png.map new file mode 100644 index 0000000..649d660 --- /dev/null +++ b/docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png.map @@ -0,0 +1,2 @@ +<map id="foo" name="foo"> +</map> diff --git a/docs/build/html/_modules/helpers/colorize_output.html b/docs/build/html/_modules/helpers/colorize_output.html index 4d26659..d6077f1 100644 --- a/docs/build/html/_modules/helpers/colorize_output.html +++ b/docs/build/html/_modules/helpers/colorize_output.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>helpers.colorize_output — Autodep v0.1 documentation</title> + <title>helpers.colorize_output — Autodep documentation</title> <link rel="stylesheet" href="../../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,7 +22,7 @@ <script type="text/javascript" src="../../_static/jquery.js"></script> <script type="text/javascript" src="../../_static/underscore.js"></script> <script type="text/javascript" src="../../_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="../../index.html" /> + <link rel="top" title="Autodep documentation" href="../../index.html" /> <link rel="up" title="Module code" href="../index.html" /> </head> <body> @@ -35,7 +35,7 @@ <li class="right" > <a href="../../py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="../../index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="../../index.html">Autodep</a> »</li> <li><a href="../index.html" accesskey="U">Module code</a> »</li> </ul> </div> @@ -48,7 +48,7 @@ <h1>Source code for helpers.colorize_output</h1><div class="highlight"><pre> <span class="c">#!/usr/bin/env python</span> -<div class="viewcode-block" id="color_printer"><a class="viewcode-back" href="../../architecture.html#helpers.colorize_output.color_printer">[docs]</a><span class="k">class</span> <span class="nc">color_printer</span><span class="p">:</span> +<div class="viewcode-block" id="color_printer"><a class="viewcode-back" href="../../api.html#helpers.colorize_output.color_printer">[docs]</a><span class="k">class</span> <span class="nc">color_printer</span><span class="p">:</span> <span class="sd">"""</span> <span class="sd"> A class for printing colored strings</span> <span class="sd"> """</span> @@ -103,12 +103,13 @@ <li class="right" > <a href="../../py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="../../index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="../../index.html">Autodep</a> »</li> <li><a href="../index.html" >Module code</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/_modules/index.html b/docs/build/html/_modules/index.html index 6b6c7fc..f92af48 100644 --- a/docs/build/html/_modules/index.html +++ b/docs/build/html/_modules/index.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Overview: module code — Autodep v0.1 documentation</title> + <title>Overview: module code — Autodep documentation</title> <link rel="stylesheet" href="../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,7 +22,7 @@ <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="../index.html" /> + <link rel="top" title="Autodep documentation" href="../index.html" /> </head> <body> <div class="related"> @@ -34,7 +34,7 @@ <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="../index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="../index.html">Autodep</a> »</li> </ul> </div> @@ -45,6 +45,10 @@ <h1>All modules for which code is available</h1> <ul><li><a href="helpers/colorize_output.html">helpers.colorize_output</a></li> +<li><a href="logfs/fstracer.html">logfs.fstracer</a></li> +<li><a href="package_utils/portage_log_parser.html">package_utils.portage_log_parser</a></li> +<li><a href="package_utils/portage_misc_functions.html">package_utils.portage_misc_functions</a></li> +<li><a href="package_utils/portage_utils.html">package_utils.portage_utils</a></li> <li><a href="test.html">test</a></li> </ul> @@ -79,11 +83,12 @@ <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="../index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="../index.html">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/_modules/logfs/fstracer.html b/docs/build/html/_modules/logfs/fstracer.html new file mode 100644 index 0000000..efec07a --- /dev/null +++ b/docs/build/html/_modules/logfs/fstracer.html @@ -0,0 +1,315 @@ + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>logfs.fstracer — Autodep documentation</title> + <link rel="stylesheet" href="../../_static/default.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '../../', + VERSION: '0.1', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="../../_static/jquery.js"></script> + <script type="text/javascript" src="../../_static/underscore.js"></script> + <script type="text/javascript" src="../../_static/doctools.js"></script> + <link rel="top" title="Autodep documentation" href="../../index.html" /> + <link rel="up" title="Module code" href="../index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" accesskey="U">Module code</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <h1>Source code for logfs.fstracer</h1><div class="highlight"><pre> +<span class="c">#!/usr/bin/env python2</span> +<span class="sd">"""</span> +<span class="sd">This module is a bridge between low-level logging services and high level </span> +<span class="sd">handling dependency logic.</span> + +<span class="sd">It can be used to launch a program and get all file events</span> +<span class="sd">"""</span> + +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">sys</span> +<span class="kn">import</span> <span class="nn">stat</span> +<span class="kn">import</span> <span class="nn">time</span> +<span class="kn">import</span> <span class="nn">tempfile</span> +<span class="kn">import</span> <span class="nn">socket</span> +<span class="kn">import</span> <span class="nn">select</span> +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">import</span> <span class="nn">signal</span> + +<span class="kn">import</span> <span class="nn">logger_hooklib</span> +<span class="kn">import</span> <span class="nn">logger_fusefs</span> + +<span class="n">stop</span><span class="o">=</span><span class="bp">False</span><span class="p">;</span> +<span class="n">stoptime</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> + +<span class="k">def</span> <span class="nf">parse_message</span><span class="p">(</span><span class="n">message</span><span class="p">):</span> + <span class="n">ret</span><span class="o">=</span><span class="n">message</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">"</span><span class="se">\0</span><span class="s">"</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ret</span> + +<span class="c">#check if process is zombie</span> +<span class="k">def</span> <span class="nf">iszombie</span><span class="p">(</span><span class="n">pid</span><span class="p">):</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">statfile</span><span class="o">=</span><span class="nb">open</span><span class="p">(</span><span class="s">"/proc/</span><span class="si">%d</span><span class="s">/stat"</span> <span class="o">%</span> <span class="n">pid</span><span class="p">,</span><span class="s">"r"</span><span class="p">)</span> + <span class="n">line</span><span class="o">=</span><span class="n">statfile</span><span class="o">.</span><span class="n">readline</span><span class="p">()</span> + <span class="n">statfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + <span class="n">line</span><span class="o">=</span><span class="n">line</span><span class="o">.</span><span class="n">rsplit</span><span class="p">(</span><span class="s">")"</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="c"># find last ")" char</span> + <span class="n">line</span><span class="o">=</span><span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> + <span class="n">match</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="s">r"^(\w)"</span><span class="p">,</span><span class="n">line</span><span class="p">)</span> + <span class="k">if</span> <span class="n">match</span><span class="o">==</span><span class="bp">None</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Failed to get check if process is zombie. Format of /proc/<pid>/stat is incorrect. Did you change a kernel?"</span> + <span class="k">return</span> <span class="bp">False</span> + + <span class="k">return</span> <span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">==</span><span class="s">"Z"</span> + + <span class="k">except</span> <span class="ne">IOError</span><span class="p">,</span><span class="n">e</span><span class="p">:</span> + <span class="k">return</span> <span class="bp">True</span> + +<span class="c"># default access filter. Allow acess to all files</span> +<span class="k">def</span> <span class="nf">defaultfilter</span><span class="p">(</span><span class="n">eventname</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">stage</span><span class="p">):</span> + <span class="k">return</span> <span class="bp">True</span> + +<div class="viewcode-block" id="getfsevents"><a class="viewcode-back" href="../../api.html#logfs.fstracer.getfsevents">[docs]</a><span class="k">def</span> <span class="nf">getfsevents</span><span class="p">(</span><span class="n">prog_name</span><span class="p">,</span><span class="n">arguments</span><span class="p">,</span><span class="n">approach</span><span class="o">=</span><span class="s">"hooklib"</span><span class="p">,</span><span class="n">filterproc</span><span class="o">=</span><span class="n">defaultfilter</span><span class="p">):</span> + <span class="sd">""" run the program and get file access events """</span> + <span class="n">events</span><span class="o">=</span><span class="p">{}</span> + <span class="c"># generate a random socketname</span> + <span class="n">tmpdir</span> <span class="o">=</span> <span class="n">tempfile</span><span class="o">.</span><span class="n">mkdtemp</span><span class="p">()</span> + <span class="n">socketname</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">tmpdir</span><span class="p">,</span> <span class="s">'socket'</span><span class="p">)</span> + + <span class="k">try</span><span class="p">:</span> + <span class="n">sock_listen</span><span class="o">=</span><span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_UNIX</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_SEQPACKET</span><span class="p">)</span> + + <span class="n">sock_listen</span><span class="o">.</span><span class="n">setsockopt</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">SOL_SOCKET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SO_REUSEADDR</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span> + <span class="n">sock_listen</span><span class="o">.</span><span class="n">bind</span><span class="p">(</span><span class="n">socketname</span><span class="p">)</span> + <span class="n">sock_listen</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">64</span><span class="p">)</span> + <span class="c"># enable connect a socket for anyone</span> + <span class="n">os</span><span class="o">.</span><span class="n">chmod</span><span class="p">(</span><span class="n">tmpdir</span><span class="p">,</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IRUSR</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IWUSR</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IXUSR</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IROTH</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IWOTH</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IXOTH</span><span class="p">)</span> + <span class="n">os</span><span class="o">.</span><span class="n">chmod</span><span class="p">(</span><span class="n">socketname</span><span class="p">,</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IRUSR</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IWUSR</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IXUSR</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IROTH</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IWOTH</span><span class="o">|</span><span class="n">stat</span><span class="o">.</span><span class="n">S_IXOTH</span><span class="p">)</span> + + <span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Failed to create a socket for exchange data with the logger: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">e</span> + <span class="k">return</span> <span class="p">[]</span> + <span class="k">else</span><span class="p">:</span> + <span class="c">#print socketname</span> + <span class="n">pid</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">fork</span><span class="p">()</span> + <span class="k">if</span> <span class="n">pid</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span> + <span class="n">logger</span><span class="o">=</span><span class="bp">None</span> + <span class="k">if</span> <span class="n">approach</span><span class="o">==</span><span class="s">"hooklib"</span><span class="p">:</span> + <span class="n">logger</span><span class="o">=</span><span class="n">logger_hooklib</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="n">socketname</span><span class="p">)</span> + <span class="k">elif</span> <span class="n">approach</span><span class="o">==</span><span class="s">"fusefs"</span><span class="p">:</span> + <span class="n">logger</span><span class="o">=</span><span class="n">logger_fusefs</span><span class="o">.</span><span class="n">logger</span><span class="p">(</span><span class="n">socketname</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Unknown logging approach"</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + + <span class="n">logger</span><span class="o">.</span><span class="n">execprog</span><span class="p">(</span><span class="n">prog_name</span><span class="p">,</span><span class="n">arguments</span><span class="p">)</span> + + <span class="c"># should not get here</span> + <span class="k">print</span> <span class="s">"Launch likely was unsuccessful"</span> + <span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">def</span> <span class="nf">signal_handler</span><span class="p">(</span><span class="n">sig</span><span class="p">,</span> <span class="n">frame</span><span class="p">):</span> + <span class="k">print</span> <span class="s">"You pressed Ctrl+C!"</span> + <span class="k">global</span> <span class="n">stoptime</span> + <span class="k">if</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span><span class="o">-</span><span class="n">stoptime</span><span class="o">></span><span class="mi">5</span><span class="p">):</span> + <span class="k">print</span> <span class="s">"Sending SIGINT to child"</span> + <span class="k">print</span> <span class="s">"Press again in 5 seconds to force exit"</span> + <span class="n">stoptime</span><span class="o">=</span><span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Sending SIGKILL to child"</span> + <span class="n">os</span><span class="o">.</span><span class="n">kill</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGKILL</span><span class="p">)</span> + <span class="n">os</span><span class="o">.</span><span class="n">_exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="kn">import</span> <span class="nn">signal</span> <span class="c"># signal must to be in this scope</span> + <span class="c"># global signal not works</span> + <span class="n">signal</span><span class="o">.</span><span class="n">signal</span><span class="p">(</span><span class="n">signal</span><span class="o">.</span><span class="n">SIGINT</span><span class="p">,</span> <span class="n">signal_handler</span><span class="p">)</span> + + <span class="n">epoll</span><span class="o">=</span><span class="n">select</span><span class="o">.</span><span class="n">epoll</span><span class="p">()</span> + <span class="n">epoll</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">sock_listen</span><span class="o">.</span><span class="n">fileno</span><span class="p">(),</span> <span class="n">select</span><span class="o">.</span><span class="n">EPOLLIN</span><span class="p">)</span> + + <span class="n">connects</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> + <span class="n">clients</span><span class="o">=</span><span class="p">{}</span> + <span class="n">was_first_connect</span><span class="o">=</span><span class="bp">False</span> + + <span class="k">while</span> <span class="bp">True</span><span class="p">:</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">sock_events</span> <span class="o">=</span> <span class="n">epoll</span><span class="o">.</span><span class="n">poll</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> + + <span class="k">for</span> <span class="n">fileno</span><span class="p">,</span> <span class="n">sock_event</span> <span class="ow">in</span> <span class="n">sock_events</span><span class="p">:</span> + <span class="k">if</span> <span class="n">fileno</span> <span class="o">==</span> <span class="n">sock_listen</span><span class="o">.</span><span class="n">fileno</span><span class="p">():</span> + <span class="c">#print "\n\nEVENT\n\n"</span> + <span class="n">ret</span> <span class="o">=</span> <span class="n">sock_listen</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span> + <span class="c">#print ret</span> + <span class="k">if</span> <span class="n">ret</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> + <span class="c"># print "\n\nPASS\n\n"</span> + <span class="k">pass</span> + <span class="k">else</span><span class="p">:</span> + <span class="p">(</span><span class="n">client</span><span class="p">,</span><span class="n">addr</span><span class="p">)</span><span class="o">=</span><span class="n">ret</span> + <span class="c"># print client</span> + <span class="n">connects</span><span class="o">+=</span><span class="mi">1</span><span class="p">;</span> <span class="c"># client accepted</span> + <span class="n">was_first_connect</span><span class="o">=</span><span class="bp">True</span> + <span class="n">epoll</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="n">client</span><span class="o">.</span><span class="n">fileno</span><span class="p">(),</span> <span class="n">select</span><span class="o">.</span><span class="n">EPOLLIN</span><span class="p">)</span> + <span class="n">clients</span><span class="p">[</span><span class="n">client</span><span class="o">.</span><span class="n">fileno</span><span class="p">()]</span><span class="o">=</span><span class="n">client</span> + <span class="c">#print "opened %d" % client.fileno()</span> + <span class="c">#elif sock_event & select.EPOLLHUP:</span> + <span class="c">#epoll.unregister(fileno)</span> + <span class="c">#clients[fileno].close()</span> + <span class="c">#del clients[fileno]</span> + <span class="c">#connects-=1</span> + + <span class="k">elif</span> <span class="n">sock_event</span> <span class="o">&</span> <span class="n">select</span><span class="o">.</span><span class="n">EPOLLIN</span><span class="p">:</span> + <span class="n">s</span><span class="o">=</span><span class="n">clients</span><span class="p">[</span><span class="n">fileno</span><span class="p">]</span> + <span class="n">record</span><span class="o">=</span><span class="n">s</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">8192</span><span class="p">)</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="n">record</span><span class="p">:</span> <span class="c"># if connection was closed</span> + <span class="n">epoll</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">fileno</span><span class="p">)</span> + <span class="n">clients</span><span class="p">[</span><span class="n">fileno</span><span class="p">]</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + <span class="k">del</span> <span class="n">clients</span><span class="p">[</span><span class="n">fileno</span><span class="p">]</span> + <span class="n">connects</span><span class="o">-=</span><span class="mi">1</span> + <span class="c">#print "closed %d"%fileno</span> + <span class="k">continue</span> + + <span class="n">message</span><span class="o">=</span><span class="n">record</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">"</span><span class="se">\0</span><span class="s">"</span><span class="p">)</span> + <span class="c">#if message[3]=="compile": #and message[1]=="debug":</span> + <span class="c">#print message</span> + + + <span class="k">try</span><span class="p">:</span> + <span class="k">if</span> <span class="n">message</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span><span class="o">==</span><span class="s">"ASKING"</span><span class="p">:</span> + <span class="k">if</span> <span class="n">filterproc</span><span class="p">(</span><span class="n">message</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">message</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span><span class="n">message</span><span class="p">[</span><span class="mi">3</span><span class="p">]):</span> + <span class="c">#print "Allowing an access to %s" % message[2]</span> + <span class="n">s</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="s">"ALLOW</span><span class="se">\0</span><span class="s">"</span><span class="p">);</span> <span class="c"># TODO: think about flush here</span> + + <span class="k">else</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Blocking an access to </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">message</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> + <span class="n">s</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="s">"DENY</span><span class="se">\0</span><span class="s">"</span><span class="p">);</span> <span class="c"># TODO: think about flush here</span> + + <span class="k">else</span><span class="p">:</span> + <span class="n">eventname</span><span class="p">,</span><span class="n">filename</span><span class="p">,</span><span class="n">stage</span><span class="p">,</span><span class="n">result</span><span class="o">=</span><span class="n">message</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="mi">5</span><span class="p">]</span> + + <span class="k">if</span> <span class="ow">not</span> <span class="n">stage</span> <span class="ow">in</span> <span class="n">events</span><span class="p">:</span> + <span class="n">events</span><span class="p">[</span><span class="n">stage</span><span class="p">]</span><span class="o">=</span><span class="p">[{},{}]</span> + + <span class="n">hashofsucesses</span><span class="o">=</span><span class="n">events</span><span class="p">[</span><span class="n">stage</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> + <span class="n">hashoffailures</span><span class="o">=</span><span class="n">events</span><span class="p">[</span><span class="n">stage</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> + + <span class="k">if</span> <span class="n">result</span><span class="o">==</span><span class="s">"OK"</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">hashofsucesses</span><span class="p">:</span> + <span class="n">hashofsucesses</span><span class="p">[</span><span class="n">filename</span><span class="p">]</span><span class="o">=</span><span class="p">[</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">]</span> + + <span class="n">readed_or_writed</span><span class="o">=</span><span class="n">hashofsucesses</span><span class="p">[</span><span class="n">filename</span><span class="p">]</span> + + <span class="k">if</span> <span class="n">eventname</span><span class="o">==</span><span class="s">"read"</span><span class="p">:</span> + <span class="n">readed_or_writed</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="bp">True</span> + <span class="k">elif</span> <span class="n">eventname</span><span class="o">==</span><span class="s">"write"</span><span class="p">:</span> + <span class="n">readed_or_writed</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">=</span><span class="bp">True</span> + + <span class="k">elif</span> <span class="n">result</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">3</span><span class="p">]</span><span class="o">==</span><span class="s">"ERR"</span> <span class="ow">or</span> <span class="n">result</span><span class="o">==</span><span class="s">"DENIED"</span><span class="p">:</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">hashoffailures</span><span class="p">:</span> + <span class="n">hashoffailures</span><span class="p">[</span><span class="n">filename</span><span class="p">]</span><span class="o">=</span><span class="p">[</span><span class="bp">False</span><span class="p">,</span><span class="bp">False</span><span class="p">]</span> + <span class="n">notfound_or_blocked</span><span class="o">=</span><span class="n">hashoffailures</span><span class="p">[</span><span class="n">filename</span><span class="p">]</span> + + <span class="k">if</span> <span class="n">result</span><span class="o">==</span><span class="s">"ERR/2"</span><span class="p">:</span> + <span class="n">notfound_or_blocked</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="bp">True</span> + <span class="k">elif</span> <span class="n">result</span><span class="o">==</span><span class="s">"DENIED"</span><span class="p">:</span> + <span class="n">notfound_or_blocked</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">=</span><span class="bp">True</span> + + <span class="k">else</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Error in logger module<->analyser protocol"</span> + + <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"IndexError while parsing </span><span class="si">%s</span><span class="s">"</span><span class="o">%</span><span class="n">record</span> + <span class="k">except</span> <span class="ne">IOError</span><span class="p">,</span> <span class="n">e</span><span class="p">:</span> + <span class="k">if</span> <span class="n">e</span><span class="o">.</span><span class="n">errno</span><span class="o">!=</span><span class="mi">4</span><span class="p">:</span> <span class="c"># handling "Interrupted system call" errors</span> + <span class="k">raise</span> + + <span class="k">if</span> <span class="n">was_first_connect</span> <span class="ow">and</span> <span class="n">connects</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span> + <span class="k">break</span> + + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sock_events</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">clients</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span> + <span class="c"># # seems like there is no connect</span> + <span class="k">print</span> <span class="s">"It seems like a logger module was unable to start or failed to finish</span><span class="se">\n</span><span class="s">"</span> <span class="o">+</span> \ + <span class="s">"Check that you are not launching a suid program under non-root user."</span> + <span class="k">return</span> <span class="p">[]</span> + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">clients</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span> <span class="ow">and</span> <span class="n">iszombie</span><span class="p">(</span><span class="n">pid</span><span class="p">):</span> + <span class="k">break</span> + + <span class="n">epoll</span><span class="o">.</span><span class="n">unregister</span><span class="p">(</span><span class="n">sock_listen</span><span class="o">.</span><span class="n">fileno</span><span class="p">())</span> + <span class="n">epoll</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + <span class="n">sock_listen</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + + <span class="n">_</span><span class="p">,</span> <span class="n">exit_status</span><span class="o">=</span><span class="n">os</span><span class="o">.</span><span class="n">waitpid</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span> + <span class="n">signal</span><span class="p">,</span><span class="n">exit_status</span><span class="o">=</span><span class="n">exit_status</span><span class="o">%</span><span class="mi">256</span><span class="p">,</span><span class="n">exit_status</span><span class="o">/</span><span class="mi">256</span> + <span class="k">print</span> <span class="s">"Signal: </span><span class="si">%s</span><span class="s"> Exit status: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="p">(</span><span class="n">signal</span><span class="p">,</span><span class="n">exit_status</span><span class="p">)</span> + + <span class="k">return</span> <span class="n">events</span> +</pre></div></div> + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> +<div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="../../search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" >Module code</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. + </div> + </body> +</html>
\ No newline at end of file diff --git a/docs/build/html/_modules/package_utils/portage_log_parser.html b/docs/build/html/_modules/package_utils/portage_log_parser.html new file mode 100644 index 0000000..55a3fca --- /dev/null +++ b/docs/build/html/_modules/package_utils/portage_log_parser.html @@ -0,0 +1,172 @@ + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>package_utils.portage_log_parser — Autodep documentation</title> + <link rel="stylesheet" href="../../_static/default.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '../../', + VERSION: '0.1', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="../../_static/jquery.js"></script> + <script type="text/javascript" src="../../_static/underscore.js"></script> + <script type="text/javascript" src="../../_static/doctools.js"></script> + <link rel="top" title="Autodep documentation" href="../../index.html" /> + <link rel="up" title="Module code" href="../index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" accesskey="U">Module code</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <h1>Source code for package_utils.portage_log_parser</h1><div class="highlight"><pre> +<span class="c">#!/usr/bin/env python2</span> +<span class="c"># parse log and get packages actually merged</span> + +<span class="kn">import</span> <span class="nn">re</span> +<span class="kn">import</span> <span class="nn">time</span> + +<span class="c"># the log path seems to be always on that path</span> +<span class="c"># see <portage_lib_path>/pym/_emerge/emergelog.py</span> +<span class="n">log_path</span><span class="o">=</span><span class="s">'/var/log/emerge.log'</span> + +<div class="viewcode-block" id="get_list_of_merged_packages"><a class="viewcode-back" href="../../api.html#package_utils.portage_log_parser.get_list_of_merged_packages">[docs]</a><span class="k">def</span> <span class="nf">get_list_of_merged_packages</span><span class="p">(</span><span class="n">starttime</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span><span class="n">endtime</span><span class="o">=-</span><span class="mi">1</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Parses a log and finds first successfully merged packages chain</span> +<span class="sd"> """</span> + <span class="n">ret</span><span class="o">=</span><span class="p">[]</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">log</span><span class="o">=</span><span class="nb">open</span><span class="p">(</span><span class="n">log_path</span><span class="p">)</span> + + <span class="n">found_begining</span><span class="o">=</span><span class="bp">False</span> + <span class="n">current_package</span><span class="o">=</span><span class="s">''</span> + <span class="n">current_package_num</span><span class="o">=</span><span class="mi">0</span> + <span class="n">total_packages_num</span><span class="o">=</span><span class="mi">0</span> + + <span class="n">expect_start</span><span class="o">=</span><span class="bp">True</span> + <span class="n">expect_end</span><span class="o">=</span><span class="bp">False</span> + + <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">log</span><span class="p">:</span> + <span class="k">if</span> <span class="s">':'</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">line</span><span class="p">:</span> <span class="c"># skipping bad strings</span> + <span class="k">continue</span> + + <span class="n">msgtime</span><span class="p">,</span><span class="n">msgtext</span><span class="o">=</span><span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">':'</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> + <span class="n">msgtime</span><span class="p">,</span><span class="n">msgtext</span><span class="o">=</span><span class="nb">int</span><span class="p">(</span><span class="n">msgtime</span><span class="p">),</span><span class="n">msgtext</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> + <span class="k">if</span> <span class="n">msgtime</span><span class="o"><</span><span class="n">starttime</span><span class="p">:</span> + <span class="k">continue</span> + <span class="k">if</span> <span class="n">endtime</span><span class="o">!=-</span><span class="mi">1</span> <span class="ow">and</span> <span class="n">msgtime</span><span class="o">></span><span class="n">endtime</span><span class="p">:</span> + <span class="k">continue</span> + + <span class="k">if</span> <span class="n">msgtext</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"Started emerge on: "</span><span class="p">):</span> + <span class="c"># doing an additional check: we have msg like:</span> + <span class="c"># 1310909507: Started emerge on: Jul 17, 2011 13:31:47</span> + <span class="c"># we want to make sure that two variants of time is not</span> + <span class="c"># distinguish more than on 2 days(local timezone may be changed)</span> + <span class="c"># we protect self from malformed and broken log files</span> + <span class="n">msg</span><span class="p">,</span> <span class="n">date</span> <span class="o">=</span> <span class="n">msgtext</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">": "</span><span class="p">,</span><span class="mi">1</span><span class="p">)</span> + <span class="n">msgtime2</span><span class="o">=</span><span class="n">time</span><span class="o">.</span><span class="n">mktime</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">date</span><span class="p">,</span><span class="s">"%b </span><span class="si">%d</span><span class="s">, %Y %H:%M:%S"</span><span class="p">))</span> + <span class="k">if</span> <span class="nb">abs</span><span class="p">(</span><span class="n">msgtime</span><span class="o">-</span><span class="n">msgtime2</span><span class="p">)</span><span class="o">></span><span class="mi">60</span><span class="o">*</span><span class="mi">60</span><span class="o">*</span><span class="mi">24</span><span class="o">*</span><span class="mi">2</span><span class="p">:</span> + <span class="k">continue</span> + <span class="n">found_begining</span><span class="o">=</span><span class="bp">True</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">found_begining</span><span class="p">:</span> + <span class="k">continue</span> + + <span class="k">if</span> <span class="n">expect_start</span> <span class="ow">and</span> <span class="n">msgtext</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">">>> emerge "</span><span class="p">):</span> + <span class="c"># string example: >>> emerge (1 of 1) sys-process/lsof-4.84 to /</span> + <span class="n">m</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s">r">>> emerge \((\d+) of (\d+)\) (\S+) to"</span><span class="p">,</span><span class="n">msgtext</span><span class="p">)</span> + <span class="k">if</span> <span class="n">m</span><span class="p">:</span> + <span class="n">pkgnum</span><span class="p">,</span><span class="n">total_pkgnum</span><span class="p">,</span><span class="n">pkgname</span><span class="o">=</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">),</span><span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">),</span> <span class="n">m</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">3</span><span class="p">)</span> + <span class="k">if</span> <span class="n">total_packages_num</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span> + <span class="n">total_packages_num</span><span class="o">=</span><span class="n">total_pkgnum</span> + <span class="k">elif</span> <span class="n">total_packages_num</span><span class="o">!=</span><span class="n">total_pkgnum</span><span class="p">:</span> + <span class="k">continue</span> + <span class="n">current_package_num</span><span class="o">=</span><span class="n">pkgnum</span> + <span class="n">current_package</span><span class="o">=</span><span class="n">pkgname</span> + <span class="n">expect_start</span><span class="o">=</span><span class="bp">False</span> + <span class="n">expect_end</span><span class="o">=</span><span class="bp">True</span> + <span class="k">elif</span> <span class="n">expect_end</span> <span class="ow">and</span> <span class="n">msgtext</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span> + <span class="s">"::: completed emerge ("</span> <span class="o">+</span> <span class="n">current_package_num</span> <span class="o">+</span> <span class="s">" of "</span> <span class="o">+</span> + <span class="n">total_packages_num</span> <span class="o">+</span> <span class="s">") "</span> <span class="o">+</span> <span class="n">current_package</span><span class="p">):</span> + <span class="n">ret</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">current_package</span><span class="p">)</span> + <span class="k">if</span> <span class="n">total_packages_num</span><span class="o">==</span><span class="n">current_package_num</span><span class="p">:</span> + <span class="k">break</span> + <span class="n">expect_start</span><span class="o">=</span><span class="bp">True</span> + <span class="n">expect_end</span><span class="o">=</span><span class="bp">False</span> + + <span class="n">log</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> + <span class="k">return</span> <span class="n">ret</span> + + <span class="k">except</span> <span class="ne">IOError</span><span class="p">,</span><span class="n">e</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Error while opening logfile. </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">e</span> + <span class="k">return</span> <span class="p">[]</span> + </div> +</pre></div> + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> +<div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="../../search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" >Module code</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. + </div> + </body> +</html>
\ No newline at end of file diff --git a/docs/build/html/_modules/package_utils/portage_misc_functions.html b/docs/build/html/_modules/package_utils/portage_misc_functions.html new file mode 100644 index 0000000..05a226b --- /dev/null +++ b/docs/build/html/_modules/package_utils/portage_misc_functions.html @@ -0,0 +1,176 @@ + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>package_utils.portage_misc_functions — Autodep documentation</title> + <link rel="stylesheet" href="../../_static/default.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '../../', + VERSION: '0.1', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="../../_static/jquery.js"></script> + <script type="text/javascript" src="../../_static/underscore.js"></script> + <script type="text/javascript" src="../../_static/doctools.js"></script> + <link rel="top" title="Autodep documentation" href="../../index.html" /> + <link rel="up" title="Module code" href="../index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" accesskey="U">Module code</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <h1>Source code for package_utils.portage_misc_functions</h1><div class="highlight"><pre> +<span class="c">#!/usr/bin/env python2</span> +<span class="c"># Thanks to Zac Medico <zmedico@gentoo.org> for working example of using an api</span> + +<span class="kn">import</span> <span class="nn">portage</span> +<span class="kn">from</span> <span class="nn">portage.dbapi._expand_new_virt</span> <span class="kn">import</span> <span class="n">expand_new_virt</span> + +<span class="c"># to not use own emerge option parser. Options may change but I hope </span> +<span class="c"># parse_opts function will always be there</span> +<span class="kn">from</span> <span class="nn">_emerge.main</span> <span class="kn">import</span> <span class="n">parse_opts</span> + + +<div class="viewcode-block" id="portage_api"><a class="viewcode-back" href="../../api.html#package_utils.portage_misc_functions.portage_api">[docs]</a><span class="k">class</span> <span class="nc">portage_api</span><span class="p">:</span> + <span class="sd">""" class for accessing the portage api """</span> + <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="o">=</span><span class="n">portage</span><span class="o">.</span><span class="n">config</span><span class="p">(</span><span class="n">clone</span><span class="o">=</span><span class="n">portage</span><span class="o">.</span><span class="n">settings</span><span class="p">)</span> + <span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">=</span><span class="n">portage</span><span class="o">.</span><span class="n">db</span><span class="p">[</span><span class="n">portage</span><span class="o">.</span><span class="n">root</span><span class="p">][</span><span class="s">'vartree'</span><span class="p">]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">vardb</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">.</span><span class="n">dbapi</span> + <span class="bp">self</span><span class="o">.</span><span class="n">portdb</span><span class="o">=</span><span class="n">portage</span><span class="o">.</span><span class="n">portdb</span> + <span class="bp">self</span><span class="o">.</span><span class="n">metadata_keys</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">portage</span><span class="o">.</span><span class="n">auxdbkeys</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">k</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s">"UNUSED_"</span><span class="p">)]</span> + <span class="bp">self</span><span class="o">.</span><span class="n">use</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s">"USE"</span><span class="p">]</span> + + <span class="c"># recursive dependency getter</span> +<div class="viewcode-block" id="portage_api.get_deps"><a class="viewcode-back" href="../../api.html#package_utils.portage_misc_functions.portage_api.get_deps">[docs]</a> <span class="k">def</span> <span class="nf">get_deps</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">pkg</span><span class="p">,</span><span class="n">dep_type</span><span class="o">=</span><span class="p">[</span><span class="s">"RDEPEND"</span><span class="p">,</span><span class="s">"DEPEND"</span><span class="p">]):</span> + <span class="c">#pkg="kde-meta"</span> + <span class="c">#print self.vardb.match("<sys-apps/paludis-0.26.0_alpha5")</span> + <span class="c">#metadata = dict(zip(self.metadata_keys, self.vardb.aux_get(pkg, self.metadata_keys)))</span> + + <span class="n">ret</span><span class="o">=</span><span class="nb">set</span><span class="p">()</span> + + <span class="n">pkg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">portdb</span><span class="o">.</span><span class="n">xmatch</span><span class="p">(</span><span class="s">"bestmatch-visible"</span><span class="p">,</span> <span class="n">pkg</span><span class="p">)</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">pkg</span><span class="p">:</span> + <span class="k">return</span> <span class="n">ret</span> + + <span class="c">#print pkg</span> + + <span class="n">known_packages</span><span class="o">=</span><span class="nb">set</span><span class="p">()</span> + <span class="n">unknown_packages</span><span class="o">=</span><span class="p">{</span><span class="n">pkg</span><span class="p">}</span> + + <span class="k">while</span> <span class="n">unknown_packages</span><span class="p">:</span> + <span class="n">p</span><span class="o">=</span><span class="n">unknown_packages</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span> + <span class="c">#print "proceeding "+p</span> + <span class="k">if</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">known_packages</span><span class="p">:</span> + <span class="k">continue</span> + <span class="n">known_packages</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> + + <span class="c">#print self.metadata_keys, p,self.portdb.aux_get(p, self.metadata_keys)</span> + <span class="n">metadata</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">metadata_keys</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">vardb</span><span class="o">.</span><span class="n">aux_get</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">metadata_keys</span><span class="p">)))</span> + <span class="c">#print "proceeding2 "+p</span> + + <span class="n">dep_str</span> <span class="o">=</span> <span class="s">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">metadata</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">dep_type</span><span class="p">)</span> + + <span class="n">success</span><span class="p">,</span> <span class="n">atoms</span> <span class="o">=</span> <span class="n">portage</span><span class="o">.</span><span class="n">dep_check</span><span class="p">(</span><span class="n">dep_str</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">,</span> <span class="n">myuse</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">use</span><span class="o">.</span><span class="n">split</span><span class="p">(),</span> + <span class="n">trees</span><span class="o">=</span><span class="n">portage</span><span class="o">.</span><span class="n">db</span><span class="p">,</span> <span class="n">myroot</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="p">[</span><span class="s">"ROOT"</span><span class="p">])</span> + + <span class="c">#print atoms</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">success</span><span class="p">:</span> + <span class="k">continue</span> + + <span class="k">for</span> <span class="n">atom</span> <span class="ow">in</span> <span class="n">atoms</span><span class="p">:</span> + <span class="n">atomname</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">.</span><span class="n">dep_bestmatch</span><span class="p">(</span><span class="n">atom</span><span class="p">)</span> + <span class="c">#print atomname</span> + <span class="k">if</span> <span class="ow">not</span> <span class="n">atomname</span><span class="p">:</span> + <span class="k">continue</span> + + <span class="k">for</span> <span class="n">unvirt_pkg</span> <span class="ow">in</span> <span class="n">expand_new_virt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">.</span><span class="n">dbapi</span><span class="p">,</span><span class="s">'='</span><span class="o">+</span><span class="n">atomname</span><span class="p">):</span> + <span class="k">for</span> <span class="n">pkg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">.</span><span class="n">dep_match</span><span class="p">(</span><span class="n">unvirt_pkg</span><span class="p">):</span> + <span class="n">ret</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pkg</span><span class="p">)</span> + <span class="n">unknown_packages</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">pkg</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ret</span> + + <span class="c"># returns all packages from system set. They are always implicit dependencies</span></div> +<div class="viewcode-block" id="portage_api.get_system_packages_list"><a class="viewcode-back" href="../../api.html#package_utils.portage_misc_functions.portage_api.get_system_packages_list">[docs]</a> <span class="k">def</span> <span class="nf">get_system_packages_list</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> + <span class="n">ret</span><span class="o">=</span><span class="p">[]</span> + <span class="k">for</span> <span class="n">atom</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">settings</span><span class="o">.</span><span class="n">packages</span><span class="p">:</span> + <span class="k">for</span> <span class="n">pre_pkg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">.</span><span class="n">dep_match</span><span class="p">(</span><span class="n">atom</span><span class="p">):</span> + <span class="k">for</span> <span class="n">unvirt_pkg</span> <span class="ow">in</span> <span class="n">expand_new_virt</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">.</span><span class="n">dbapi</span><span class="p">,</span><span class="s">'='</span><span class="o">+</span><span class="n">pre_pkg</span><span class="p">):</span> + <span class="k">for</span> <span class="n">pkg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">vartree</span><span class="o">.</span><span class="n">dep_match</span><span class="p">(</span><span class="n">unvirt_pkg</span><span class="p">):</span> + <span class="n">ret</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pkg</span><span class="p">)</span> + <span class="k">return</span> <span class="n">ret</span> + + <span class="c"># call emerge arguments parser</span></div> +<div class="viewcode-block" id="portage_api.parse_emerge_args"><a class="viewcode-back" href="../../api.html#package_utils.portage_misc_functions.portage_api.parse_emerge_args">[docs]</a> <span class="k">def</span> <span class="nf">parse_emerge_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span><span class="n">args</span><span class="p">):</span> + <span class="n">action</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="n">files</span> <span class="o">=</span> <span class="n">parse_opts</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">silent</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> + <span class="k">return</span> <span class="n">action</span><span class="p">,</span> <span class="n">opts</span><span class="p">,</span> <span class="n">files</span> +</pre></div></div></div> + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> +<div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="../../search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" >Module code</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. + </div> + </body> +</html>
\ No newline at end of file diff --git a/docs/build/html/_modules/package_utils/portage_utils.html b/docs/build/html/_modules/package_utils/portage_utils.html new file mode 100644 index 0000000..9acafcf --- /dev/null +++ b/docs/build/html/_modules/package_utils/portage_utils.html @@ -0,0 +1,161 @@ + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>package_utils.portage_utils — Autodep documentation</title> + <link rel="stylesheet" href="../../_static/default.css" type="text/css" /> + <link rel="stylesheet" href="../../_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '../../', + VERSION: '0.1', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="../../_static/jquery.js"></script> + <script type="text/javascript" src="../../_static/underscore.js"></script> + <script type="text/javascript" src="../../_static/doctools.js"></script> + <link rel="top" title="Autodep documentation" href="../../index.html" /> + <link rel="up" title="Module code" href="../index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" accesskey="U">Module code</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <h1>Source code for package_utils.portage_utils</h1><div class="highlight"><pre> +<span class="c">#!/usr/bin/env python2</span> + +<span class="kn">import</span> <span class="nn">os</span> +<span class="kn">import</span> <span class="nn">subprocess</span> +<span class="kn">import</span> <span class="nn">re</span> + +<div class="viewcode-block" id="getpackagesbyfiles"><a class="viewcode-back" href="../../api.html#package_utils.portage_utils.getpackagesbyfiles">[docs]</a><span class="k">def</span> <span class="nf">getpackagesbyfiles</span><span class="p">(</span><span class="n">files</span><span class="p">):</span> + <span class="sd">"""</span> +<span class="sd"> Gets packages </span> +<span class="sd"> </span> +<span class="sd"> :</span> +<span class="sd"> </span> +<span class="sd"> """</span> + <span class="n">ret</span><span class="o">=</span><span class="p">{}</span> + <span class="n">listtocheck</span><span class="o">=</span><span class="p">[]</span> + <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">files</span><span class="p">:</span> + <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">isdir</span><span class="p">(</span><span class="n">f</span><span class="p">):</span> + <span class="n">ret</span><span class="p">[</span><span class="n">f</span><span class="p">]</span><span class="o">=</span><span class="s">"directory"</span> + <span class="k">else</span><span class="p">:</span> + <span class="n">listtocheck</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">f</span><span class="p">)</span> + + <span class="k">try</span><span class="p">:</span> + <span class="n">proc</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s">'qfile'</span><span class="p">]</span><span class="o">+</span><span class="p">[</span><span class="s">'--nocolor'</span><span class="p">,</span><span class="s">'--exact'</span><span class="p">,</span><span class="s">''</span><span class="p">,</span><span class="s">'--from'</span><span class="p">,</span><span class="s">'-'</span><span class="p">],</span> + <span class="n">stdin</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span><span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">bufsize</span><span class="o">=</span><span class="mi">4096</span><span class="p">)</span> + + <span class="n">out</span><span class="p">,</span><span class="n">err</span><span class="o">=</span><span class="n">proc</span><span class="o">.</span><span class="n">communicate</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">listtocheck</span><span class="p">))</span> + <span class="k">if</span> <span class="n">err</span><span class="o">!=</span><span class="bp">None</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Noncritical error while launch qfile </span><span class="si">%s</span><span class="s">"</span><span class="o">%</span><span class="n">err</span><span class="p">;</span> + + <span class="n">lines</span><span class="o">=</span><span class="n">out</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span> + <span class="c">#print lines</span> + <span class="n">line_re</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">r"^([^ ]+)\s+\(([^)]+)\)$"</span><span class="p">)</span> + <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span> + <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">:</span> + <span class="k">continue</span> + <span class="n">match</span><span class="o">=</span><span class="n">line_re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">)</span> + <span class="k">if</span> <span class="n">match</span><span class="p">:</span> + <span class="n">ret</span><span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">2</span><span class="p">)]</span><span class="o">=</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Util qfile returned unparsable string: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">line</span> + + <span class="k">except</span> <span class="ne">OSError</span><span class="p">,</span><span class="n">e</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Error while launching qfile: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">e</span> + + + <span class="k">return</span> <span class="n">ret</span> + </div> +<div class="viewcode-block" id="getfilesbypackage"><a class="viewcode-back" href="../../api.html#package_utils.portage_utils.getfilesbypackage">[docs]</a><span class="k">def</span> <span class="nf">getfilesbypackage</span><span class="p">(</span><span class="n">packagename</span><span class="p">):</span> + <span class="n">ret</span><span class="o">=</span><span class="p">[]</span> + <span class="k">try</span><span class="p">:</span> + <span class="n">proc</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">Popen</span><span class="p">([</span><span class="s">'qlist'</span><span class="p">]</span><span class="o">+</span><span class="p">[</span><span class="s">'--nocolor'</span><span class="p">,</span><span class="s">"--obj"</span><span class="p">,</span><span class="n">packagename</span><span class="p">],</span> + <span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span><span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span> + <span class="n">bufsize</span><span class="o">=</span><span class="mi">4096</span><span class="p">)</span> + + <span class="n">out</span><span class="p">,</span><span class="n">err</span><span class="o">=</span><span class="n">proc</span><span class="o">.</span><span class="n">communicate</span><span class="p">()</span> + <span class="k">if</span> <span class="n">err</span><span class="o">!=</span><span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">err</span><span class="p">)</span><span class="o">!=</span><span class="mi">0</span> <span class="p">:</span> + <span class="k">print</span> <span class="s">"Noncritical error while launch qlist: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">err</span><span class="p">;</span> + + <span class="n">ret</span><span class="o">=</span><span class="n">out</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span> + <span class="k">if</span> <span class="n">ret</span><span class="o">==</span><span class="p">[</span><span class="s">''</span><span class="p">]:</span> + <span class="n">ret</span><span class="o">=</span><span class="p">[]</span> + <span class="k">except</span> <span class="ne">OSError</span><span class="p">,</span><span class="n">e</span><span class="p">:</span> + <span class="k">print</span> <span class="s">"Error while launching qfile: </span><span class="si">%s</span><span class="s">"</span> <span class="o">%</span> <span class="n">e</span> + + <span class="k">return</span> <span class="n">ret</span> + + + </div> +</pre></div> + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> +<div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="../../search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="../../genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="../../py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="../../index.html">Autodep</a> »</li> + <li><a href="../index.html" >Module code</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. + </div> + </body> +</html>
\ No newline at end of file diff --git a/docs/build/html/_modules/test.html b/docs/build/html/_modules/test.html index a8f992b..7d73767 100644 --- a/docs/build/html/_modules/test.html +++ b/docs/build/html/_modules/test.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>test — Autodep v0.1 documentation</title> + <title>test — Autodep documentation</title> <link rel="stylesheet" href="../_static/default.css" type="text/css" /> <link rel="stylesheet" href="../_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,7 +22,7 @@ <script type="text/javascript" src="../_static/jquery.js"></script> <script type="text/javascript" src="../_static/underscore.js"></script> <script type="text/javascript" src="../_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="../index.html" /> + <link rel="top" title="Autodep documentation" href="../index.html" /> <link rel="up" title="Module code" href="index.html" /> </head> <body> @@ -35,7 +35,7 @@ <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="../index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="../index.html">Autodep</a> »</li> <li><a href="index.html" accesskey="U">Module code</a> »</li> </ul> </div> @@ -80,12 +80,13 @@ <li class="right" > <a href="../py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="../index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="../index.html">Autodep</a> »</li> <li><a href="index.html" >Module code</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/_sources/api.txt b/docs/build/html/_sources/api.txt index 908c3aa..4a0a626 100644 --- a/docs/build/html/_sources/api.txt +++ b/docs/build/html/_sources/api.txt @@ -1,4 +1,22 @@ -:mod:`API` -=========================================================================== +*** +API +*** + +logfs.fstracer +============== + +.. automodule:: logfs.fstracer + :members: + +package_utils +================================ + +This package contains modules which works with the Portage system + +.. automodule:: package_utils.portage_log_parser + :members: +.. automodule:: package_utils.portage_utils + :members: +.. automodule:: package_utils.portage_misc_functions + :members: -hello
\ No newline at end of file diff --git a/docs/build/html/_sources/architecture.txt b/docs/build/html/_sources/architecture.txt index 38e1319..59b55f8 100644 --- a/docs/build/html/_sources/architecture.txt +++ b/docs/build/html/_sources/architecture.txt @@ -2,12 +2,94 @@ Internals ********* -hello +How it works? +============= -.. automodule:: helpers.colorize_output -.. autoclass:: color_printer +Scheme +------ +.. image:: _static/autodep_arch.png -.. py:function:: enumerate(sequence[, start=0]) +Format of network messages +-------------------------- - Return an iterator that yields tuples of an index and an item of the - *sequence*. (And so on.) + +1. Format of messages to file access registrar:: + + <time of event: sec since 1970> + <event type: open, read, write> + <name of file> + <building stage: stagename or unknown> + <result:OK,ERR/errno,ASKING,DENIED> +2. Format of answer for ASKING packet from registrar:: + + <ALLOW | DENY> + +*Notes:* + +* All sockets are SOCK_SEQPACKET +* All fields are delimited with character with code 0 + + +How Hooklib approach works? +=========================== + +The main idea of Hooklib approach is to load a dynamic library-hooker +**before** any other library(including the C runtime, libc.so). +So, the functions, such as open, read and write, executed from this library +instead of libc.so. + +Hooklib module modifies Linux's dynamic linker behavior changing LD_PRELOAD +environment variable(see +`man 8 ld-linux <http://linux.die.net/man/8/ld-linux>`_ for details). +Module protects LD_PRELOAD variable from further changes by program. + +When hooklib module loads, it connects to file access registrar via Unix domain +sockets. If program forks or creates a new thread, another copy of library +loads. + +When program do open(...), read(...), write(...), library send an information +about a call to registrar. Registar can block or allow an event. If registrer +allows an event then the original function is called. Else error +"file not found" is returned. + +How Fusefs approach works? +========================== + +The main idea if Fusefs approach is to create a loggable filesystem in userspace +and chroot a program into it. + +Before program is launched registrar prepare mounts. It usually do: + +1. mount -o bind / /mnt/rootfs/ +2. mount /dev/, /dev/pts, /dev/shm, /proc/, /sys/ same way +3. mount /lib64/, /lib32/, /var/tmp/portage/ same way to increase performance at + cost of accuracy +4. launch fuse over /mnt/rootfs/ + +Fuse module blocks all external access to /mnt/rootfs while program runs. + +Fuse module also asks the registrar about event allowness. + +*Notes:* + +* Checking for allowness takes a much time + +Futher analysis of file access events +===================================== + +After file access analyser recieves list of events it maps it on a list of +packages. + +Then analyser builds a list of dependencies for packages installed and compares +with the list it got from registrar. Analyser believes that packages from system +profile are implicit dependencies of any package in system. + +If dependency from registrar is unexpected simple heuristics used to cut +unuseful packages. + +Rules of heuristics +------------------- + +1. *Package is not useful if all files are .desktop or .xml or .m4*. + Aclocal util tries to read all .m4 files in /usr/share/aclocal directory. + Files ending on .desktop and .xml often readed on postrm phase.
\ No newline at end of file diff --git a/docs/build/html/_sources/man.txt b/docs/build/html/_sources/man.txt new file mode 100644 index 0000000..ca7fdab --- /dev/null +++ b/docs/build/html/_sources/man.txt @@ -0,0 +1,95 @@ +************* +USER COMMANDS +************* + +SYNOPSIS +======== + +**showfsevents.py** [options] <command> + +DESCRIPTION +=========== + +Auto dependency builder is a tool for analysis files accessed during +building a package. It also can be used for runtime dependencies analysis. + +The tool can block an access to files of defined packages. + +OPTIONS +======= + +.. program:: showfsevents.py + +.. cmdoption:: --help, -h + + show this help message and exit + +.. cmdoption:: -b PACKAGES, --block=PACKAGES + + block an access to files from this packages + +.. cmdoption:: -f, --files + + show accessed files and not founded files +.. cmdoption:: -v, --verbose + + show non-important packages, show unknown package and unknown stage +.. cmdoption:: --nocolor, -C + + don't output color +.. cmdoption:: --hooklib + + use ld_preload logging approach(default) +.. cmdoption:: --fusefs + + use fuse logging approach(slow, but reliable) + +HOOKLIB VS FUSEFS +================= + ++------------------------------------------------+-------------+---------------+ +| | Hooklib | Fusefs | ++================================================+=============+===============+ +| Who can use this approach? | **Any user**| Only root | ++------------------------------------------------+-------------+---------------+ +| Is approach allows blocking an access to files?| **YES** | **YES** | ++------------------------------------------------+-------------+---------------+ +| Is overhead in performance big? | **NO** | YES [#f1]_ | ++------------------------------------------------+-------------+---------------+ +| What events are logged? | Most [#f2]_| **ALL** | ++------------------------------------------------+-------------+---------------+ +| When is it recomended to use an approach? | For analysis| For analysis | +| | of | of *runtime* | +| | *buildtime* | dependencies | +| | dependencies| | ++------------------------------------------------+-------------+---------------+ +| Is any pre-requirements for using an approach? | **NO** | FUSE must be | +| | | enabled in | +| | | kernel | ++------------------------------------------------+-------------+---------------+ + +.. rubric:: Notes + +.. [#f1] Fuse file system is slower than normal one. Program reads many files + while launching, so this will take more time than usual. +.. [#f2] Loading of dynamic libraries and direct syscalls will not be logged. + +Examples +======== + +Get the potential dependencies of a xchat package: +----------------------------------------------------- +showfsevents.py emerge xchat + +Get the potential dependencies of a xchat package, blocking x11-misc/util-macros package: +-------------------------------------------------------------------------------------------- +showfsevents.py emerge --block x11-misc/util-macros emerge xchat + +Get the potential dependencies of a xchat package, and show files accessed: +------------------------------------------------------------------------------ +showfsevents.py --files emerge xchat + +Get the runtime dependencies of a xchat and show files accessed: +------------------------------------------------------------------- +showfsevents.py --fusefs --files xchat + diff --git a/docs/build/html/_sources/showfsevents.txt b/docs/build/html/_sources/showfsevents.txt new file mode 100644 index 0000000..6da2f30 --- /dev/null +++ b/docs/build/html/_sources/showfsevents.txt @@ -0,0 +1,2 @@ +TITLE +========
\ No newline at end of file diff --git a/docs/build/html/_static/autodep_arch.png b/docs/build/html/_static/autodep_arch.png Binary files differnew file mode 100644 index 0000000..d0bfee9 --- /dev/null +++ b/docs/build/html/_static/autodep_arch.png diff --git a/docs/build/html/api.html b/docs/build/html/api.html index c20b82b..a9fe272 100644 --- a/docs/build/html/api.html +++ b/docs/build/html/api.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>9. API — Autodep v0.1 documentation</title> + <title>API — Autodep documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,8 +22,8 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="index.html" /> - <link rel="prev" title="8. architecture – Internals" href="architecture.html" /> + <link rel="top" title="Autodep documentation" href="index.html" /> + <link rel="prev" title="Internals" href="architecture.html" /> </head> <body> <div class="related"> @@ -36,9 +36,9 @@ <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > - <a href="architecture.html" title="8. architecture – Internals" + <a href="architecture.html" title="Internals" accesskey="P">previous</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> @@ -48,8 +48,161 @@ <div class="body"> <div class="section" id="api"> -<h1>9. <tt class="xref py py-mod docutils literal"><span class="pre">API</span></tt><a class="headerlink" href="#api" title="Permalink to this headline">¶</a></h1> -<p>hello</p> +<h1>API<a class="headerlink" href="#api" title="Permalink to this headline">¶</a></h1> +<div class="section" id="module-logfs.fstracer"> +<span id="logfs-fstracer"></span><h2>logfs.fstracer<a class="headerlink" href="#module-logfs.fstracer" title="Permalink to this headline">¶</a></h2> +<p>This module is a bridge between low-level logging services and high level +handling dependency logic.</p> +<p>It can be used to launch a program and get all file events</p> +<dl class="function"> +<dt id="logfs.fstracer.getfsevents"> +<tt class="descclassname">logfs.fstracer.</tt><tt class="descname">getfsevents</tt><big>(</big><em>prog_name</em>, <em>arguments</em>, <em>approach='hooklib'</em>, <em>filterproc=<function defaultfilter at 0x1ac2b90></em><big>)</big><a class="reference internal" href="_modules/logfs/fstracer.html#getfsevents"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#logfs.fstracer.getfsevents" title="Permalink to this definition">¶</a></dt> +<dd><p>Launches a program and gets file access events</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>prog_name</strong> – name of program</li> +<li><strong>arguments</strong> – list of program’s arguments</li> +<li><strong>approach</strong> – a logging approach(‘hooklib’ or ‘fusefs’)</li> +<li><strong>filterproc</strong> – filter function, this function should take 3 strings: +name of event, name of file and stage, and return a <em>True</em> if event is +allowed and <em>False</em> instead. Name of event is one of <em>‘open’</em>, <em>‘read’</em> or +<em>‘write’</em>. Default function always returns <em>True</em>.</li> +</ul> +</td> +</tr> +<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"><strong>list</strong> with two elements - <em>success</em> events and <em>failed</em> events. +Each element is dictionary <strong>stage->file information</strong>. +File information is also a dictionary <strong>filename->type of events</strong>. +Type of events for success events is a 2-element tuple: <em>(was file readed, +was file writed)</em>. For failed events it is also 2-element tuple: +<em>(was file not found, was file blocked by filterproc)</em>. Each element of +tuple can be <em>True</em> or <em>False</em>. Both elements of tuple can be <em>False</em>. +Stage can be <em>‘unknown’</em></p> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +</div> +<div class="section" id="package-utils"> +<h2>package_utils<a class="headerlink" href="#package-utils" title="Permalink to this headline">¶</a></h2> +<p>This package contains modules which works with the Portage system</p> +<span class="target" id="module-package_utils.portage_log_parser"></span><dl class="function"> +<dt id="package_utils.portage_log_parser.get_list_of_merged_packages"> +<tt class="descclassname">package_utils.portage_log_parser.</tt><tt class="descname">get_list_of_merged_packages</tt><big>(</big><em>starttime=0</em>, <em>endtime=-1</em><big>)</big><a class="reference internal" href="_modules/package_utils/portage_log_parser.html#get_list_of_merged_packages"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#package_utils.portage_log_parser.get_list_of_merged_packages" title="Permalink to this definition">¶</a></dt> +<dd><p>Parses an emerge log and finds first successfully merged packages chain</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>starttime</strong> – start time for searching(in seconds since 1970)</li> +<li><strong>starttime</strong> – end time for searching(in seconds since 1970).</li> +</ul> +</td> +</tr> +<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"><strong>list</strong> of package names</p> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<span class="target" id="module-package_utils.portage_utils"></span><dl class="function"> +<dt id="package_utils.portage_utils.getfilesbypackage"> +<tt class="descclassname">package_utils.portage_utils.</tt><tt class="descname">getfilesbypackage</tt><big>(</big><em>packagename</em><big>)</big><a class="reference internal" href="_modules/package_utils/portage_utils.html#getfilesbypackage"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#package_utils.portage_utils.getfilesbypackage" title="Permalink to this definition">¶</a></dt> +<dd><table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Parameters:</th><td class="field-body"><strong>packagename</strong> – name of package</td> +</tr> +<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><strong>list</strong> of files in package with name <em>packagename</em></td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="function"> +<dt id="package_utils.portage_utils.getpackagesbyfiles"> +<tt class="descclassname">package_utils.portage_utils.</tt><tt class="descname">getpackagesbyfiles</tt><big>(</big><em>files</em><big>)</big><a class="reference internal" href="_modules/package_utils/portage_utils.html#getpackagesbyfiles"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#package_utils.portage_utils.getpackagesbyfiles" title="Permalink to this definition">¶</a></dt> +<dd><table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Parameters:</th><td class="field-body"><strong>files</strong> – list of filenames</td> +</tr> +<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><strong>dictionary</strong> file->package, if file doesn’t belong to any +package it not returned as key of this dictionary</td> +</tr> +</tbody> +</table> +</dd></dl> + +<span class="target" id="module-package_utils.portage_misc_functions"></span><dl class="class"> +<dt id="package_utils.portage_misc_functions.portage_api"> +<em class="property">class </em><tt class="descclassname">package_utils.portage_misc_functions.</tt><tt class="descname">portage_api</tt><a class="reference internal" href="_modules/package_utils/portage_misc_functions.html#portage_api"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#package_utils.portage_misc_functions.portage_api" title="Permalink to this definition">¶</a></dt> +<dd><p>class for accessing the portage api</p> +<dl class="method"> +<dt id="package_utils.portage_misc_functions.portage_api.get_deps"> +<tt class="descname">get_deps</tt><big>(</big><em>pkg, dep_type=['RDEPEND', 'DEPEND']</em><big>)</big><a class="reference internal" href="_modules/package_utils/portage_misc_functions.html#portage_api.get_deps"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#package_utils.portage_misc_functions.portage_api.get_deps" title="Permalink to this definition">¶</a></dt> +<dd><p>Gets current dependencies of a package on any depth</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Parameters:</th><td class="field-body"><ul class="first simple"> +<li><strong>pkg</strong> – name of package</li> +<li><strong>dep_type</strong> – type of dependencies to recurse. Can be [“DEPEND”] or +[“RDEPEND”, “DEPEND”]</li> +</ul> +</td> +</tr> +<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><p class="first last"><strong>set</strong> of packages names</p> +</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="package_utils.portage_misc_functions.portage_api.get_system_packages_list"> +<tt class="descname">get_system_packages_list</tt><big>(</big><big>)</big><a class="reference internal" href="_modules/package_utils/portage_misc_functions.html#portage_api.get_system_packages_list"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#package_utils.portage_misc_functions.portage_api.get_system_packages_list" title="Permalink to this definition">¶</a></dt> +<dd><p>returns all packages from system set. They are always implicit dependencies</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><strong>list</strong> of package names</td> +</tr> +</tbody> +</table> +</dd></dl> + +<dl class="method"> +<dt id="package_utils.portage_misc_functions.portage_api.parse_emerge_args"> +<tt class="descname">parse_emerge_args</tt><big>(</big><em>args</em><big>)</big><a class="reference internal" href="_modules/package_utils/portage_misc_functions.html#portage_api.parse_emerge_args"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#package_utils.portage_misc_functions.portage_api.parse_emerge_args" title="Permalink to this definition">¶</a></dt> +<dd><p>call emerge arguments parser</p> +<table class="docutils field-list" frame="void" rules="none"> +<col class="field-name" /> +<col class="field-body" /> +<tbody valign="top"> +<tr class="field"><th class="field-name">Parameters:</th><td class="field-body"><strong>args</strong> – arguments passed to emerge</td> +</tr> +<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><strong>tuple</strong> (action string, options dictionary, files or atoms +list)</td> +</tr> +</tbody> +</table> +</dd></dl> + +</dd></dl> + +</div> </div> @@ -58,9 +211,18 @@ </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> + <h3><a href="index.html">Table Of Contents</a></h3> + <ul> +<li><a class="reference internal" href="#">API</a><ul> +<li><a class="reference internal" href="#module-logfs.fstracer">logfs.fstracer</a></li> +<li><a class="reference internal" href="#package-utils">package_utils</a></li> +</ul> +</li> +</ul> + <h4>Previous topic</h4> <p class="topless"><a href="architecture.html" - title="previous chapter">8. <tt class="docutils literal"><span class="pre">architecture</span></tt> – Internals</a></p> + title="previous chapter">Internals</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="_sources/api.txt" @@ -93,13 +255,14 @@ <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > - <a href="architecture.html" title="8. architecture – Internals" + <a href="architecture.html" title="Internals" >previous</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/architecture.html b/docs/build/html/architecture.html index e0058ef..c32ea89 100644 --- a/docs/build/html/architecture.html +++ b/docs/build/html/architecture.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Internals — Autodep v0.1 documentation</title> + <title>Internals — Autodep documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,8 +22,8 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="index.html" /> - <link rel="next" title="9. API" href="api.html" /> + <link rel="top" title="Autodep documentation" href="index.html" /> + <link rel="next" title="API" href="api.html" /> <link rel="prev" title="Introduction" href="intro.html" /> </head> <body> @@ -37,12 +37,12 @@ <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > - <a href="api.html" title="9. API" + <a href="api.html" title="API" accesskey="N">next</a> |</li> <li class="right" > <a href="intro.html" title="Introduction" accesskey="P">previous</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> @@ -53,21 +53,90 @@ <div class="section" id="internals"> <h1>Internals<a class="headerlink" href="#internals" title="Permalink to this headline">¶</a></h1> -<p>hello</p> -<span class="target" id="module-helpers.colorize_output"></span><p>Output colorizing</p> -<dl class="class"> -<dt id="helpers.colorize_output.color_printer"> -<em class="property">class </em><tt class="descclassname">helpers.colorize_output.</tt><tt class="descname">color_printer</tt><big>(</big><em>enable_colors=True</em><big>)</big><a class="reference internal" href="_modules/helpers/colorize_output.html#color_printer"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#helpers.colorize_output.color_printer" title="Permalink to this definition">¶</a></dt> -<dd><p>A class for printing colored strings</p> -</dd></dl> - -<dl class="function"> -<dt id="helpers.colorize_output.enumerate"> -<tt class="descclassname">helpers.colorize_output.</tt><tt class="descname">enumerate</tt><big>(</big><em>sequence</em><span class="optional">[</span>, <em>start=0</em><span class="optional">]</span><big>)</big><a class="headerlink" href="#helpers.colorize_output.enumerate" title="Permalink to this definition">¶</a></dt> -<dd><p>Return an iterator that yields tuples of an index and an item of the -<em>sequence</em>. (And so on.)</p> -</dd></dl> - +<div class="section" id="how-it-works"> +<h2>How it works?<a class="headerlink" href="#how-it-works" title="Permalink to this headline">¶</a></h2> +<div class="section" id="scheme"> +<h3>Scheme<a class="headerlink" href="#scheme" title="Permalink to this headline">¶</a></h3> +<img alt="_images/autodep_arch48.png" src="_images/autodep_arch48.png" /> +</div> +<div class="section" id="format-of-network-messages"> +<h3>Format of network messages<a class="headerlink" href="#format-of-network-messages" title="Permalink to this headline">¶</a></h3> +<ol class="arabic"> +<li><p class="first">Format of messages to file access registrar:</p> +<div class="highlight-python"><pre><time of event: sec since 1970> +<event type: open, read, write> +<name of file> +<building stage: stagename or unknown> +<result:OK,ERR/errno,ASKING,DENIED></pre> +</div> +</li> +<li><p class="first">Format of answer for ASKING packet from registrar:</p> +<div class="highlight-python"><pre><ALLOW | DENY></pre> +</div> +</li> +</ol> +<p><em>Notes:</em></p> +<ul class="simple"> +<li>All sockets are SOCK_SEQPACKET</li> +<li>All fields are delimited with character with code 0</li> +</ul> +</div> +</div> +<div class="section" id="how-hooklib-approach-works"> +<h2>How Hooklib approach works?<a class="headerlink" href="#how-hooklib-approach-works" title="Permalink to this headline">¶</a></h2> +<p>The main idea of Hooklib approach is to load a dynamic library-hooker +<strong>before</strong> any other library(including the C runtime, libc.so). +So, the functions, such as open, read and write, executed from this library +instead of libc.so.</p> +<p>Hooklib module modifies Linux’s dynamic linker behavior changing LD_PRELOAD +environment variable(see +<a class="reference external" href="http://linux.die.net/man/8/ld-linux">man 8 ld-linux</a> for details). +Module protects LD_PRELOAD variable from further changes by program.</p> +<p>When hooklib module loads, it connects to file access registrar via Unix domain +sockets. If program forks or creates a new thread, another copy of library +loads.</p> +<p>When program do open(...), read(...), write(...), library send an information +about a call to registrar. Registar can block or allow an event. If registrer +allows an event then the original function is called. Else error +“file not found” is returned.</p> +</div> +<div class="section" id="how-fusefs-approach-works"> +<h2>How Fusefs approach works?<a class="headerlink" href="#how-fusefs-approach-works" title="Permalink to this headline">¶</a></h2> +<p>The main idea if Fusefs approach is to create a loggable filesystem in userspace +and chroot a program into it.</p> +<p>Before program is launched registrar prepare mounts. It usually do:</p> +<ol class="arabic simple"> +<li>mount -o bind / /mnt/rootfs/</li> +<li>mount /dev/, /dev/pts, /dev/shm, /proc/, /sys/ same way</li> +<li>mount /lib64/, /lib32/, /var/tmp/portage/ same way to increase performance at +cost of accuracy</li> +<li>launch fuse over /mnt/rootfs/</li> +</ol> +<p>Fuse module blocks all external access to /mnt/rootfs while program runs.</p> +<p>Fuse module also asks the registrar about event allowness.</p> +<p><em>Notes:</em></p> +<ul class="simple"> +<li>Checking for allowness takes a much time</li> +</ul> +</div> +<div class="section" id="futher-analysis-of-file-access-events"> +<h2>Futher analysis of file access events<a class="headerlink" href="#futher-analysis-of-file-access-events" title="Permalink to this headline">¶</a></h2> +<p>After file access analyser recieves list of events it maps it on a list of +packages.</p> +<p>Then analyser builds a list of dependencies for packages installed and compares +with the list it got from registrar. Analyser believes that packages from system +profile are implicit dependencies of any package in system.</p> +<p>If dependency from registrar is unexpected simple heuristics used to cut +unuseful packages.</p> +<div class="section" id="rules-of-heuristics"> +<h3>Rules of heuristics<a class="headerlink" href="#rules-of-heuristics" title="Permalink to this headline">¶</a></h3> +<ol class="arabic simple"> +<li><em>Package is not useful if all files are .desktop or .xml or .m4</em>. +Aclocal util tries to read all .m4 files in /usr/share/aclocal directory. +Files ending on .desktop and .xml often readed on postrm phase.</li> +</ol> +</div> +</div> </div> @@ -76,12 +145,30 @@ </div> <div class="sphinxsidebar"> <div class="sphinxsidebarwrapper"> + <h3><a href="index.html">Table Of Contents</a></h3> + <ul> +<li><a class="reference internal" href="#">Internals</a><ul> +<li><a class="reference internal" href="#how-it-works">How it works?</a><ul> +<li><a class="reference internal" href="#scheme">Scheme</a></li> +<li><a class="reference internal" href="#format-of-network-messages">Format of network messages</a></li> +</ul> +</li> +<li><a class="reference internal" href="#how-hooklib-approach-works">How Hooklib approach works?</a></li> +<li><a class="reference internal" href="#how-fusefs-approach-works">How Fusefs approach works?</a></li> +<li><a class="reference internal" href="#futher-analysis-of-file-access-events">Futher analysis of file access events</a><ul> +<li><a class="reference internal" href="#rules-of-heuristics">Rules of heuristics</a></li> +</ul> +</li> +</ul> +</li> +</ul> + <h4>Previous topic</h4> <p class="topless"><a href="intro.html" title="previous chapter">Introduction</a></p> <h4>Next topic</h4> <p class="topless"><a href="api.html" - title="next chapter">9. <tt class="docutils literal"><span class="pre">API</span></tt></a></p> + title="next chapter">API</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="_sources/architecture.txt" @@ -114,16 +201,17 @@ <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > - <a href="api.html" title="9. API" + <a href="api.html" title="API" >next</a> |</li> <li class="right" > <a href="intro.html" title="Introduction" >previous</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/genindex.html b/docs/build/html/genindex.html index 9b06582..b1a69d7 100644 --- a/docs/build/html/genindex.html +++ b/docs/build/html/genindex.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Index — Autodep v0.1 documentation</title> + <title>Index — Autodep documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,7 +22,7 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="index.html" /> + <link rel="top" title="Autodep documentation" href="index.html" /> </head> <body> <div class="related"> @@ -34,7 +34,7 @@ <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> @@ -47,26 +47,30 @@ <h1 id="index">Index</h1> <div class="genindex-jumpbox"> - <a href="#Symbols"><strong>Symbols</strong></a> | <a href="#C"><strong>C</strong></a> | <a href="#E"><strong>E</strong></a> | <a href="#H"><strong>H</strong></a> | <a href="#S"><strong>S</strong></a> + <a href="#Symbols"><strong>Symbols</strong></a> | <a href="#G"><strong>G</strong></a> | <a href="#L"><strong>L</strong></a> | <a href="#P"><strong>P</strong></a> | <a href="#S"><strong>S</strong></a> </div> <h2 id="Symbols">Symbols</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%" valign="top"><dl> <dt>--fusefs</dt> <dd><dl> - <dt><a href="intro.html#cmdoption-showfsevents.py--fusefs">showfsevents.py command line option</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py--fusefs">showfsevents.py command line option</a>, <a href="man.html#cmdoption-showfsevents.py--fusefs">[1]</a></dt> </dl></dd> <dt>--help, -h</dt> <dd><dl> - <dt><a href="intro.html#cmdoption-showfsevents.py--help">showfsevents.py command line option</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py--help">showfsevents.py command line option</a>, <a href="man.html#cmdoption-showfsevents.py--help">[1]</a></dt> </dl></dd> <dt>--hooklib</dt> <dd><dl> - <dt><a href="intro.html#cmdoption-showfsevents.py--hooklib">showfsevents.py command line option</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py--hooklib">showfsevents.py command line option</a>, <a href="man.html#cmdoption-showfsevents.py--hooklib">[1]</a></dt> + </dl></dd> + <dt>--nocolor, -C</dt> + <dd><dl> + <dt><a href="man.html#cmdoption-showfsevents.py--nocolor">showfsevents.py command line option</a></dt> </dl></dd> <dt>-b PACKAGES, --block=PACKAGES</dt> <dd><dl> - <dt><a href="intro.html#cmdoption-showfsevents.py-b">showfsevents.py command line option</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py-b">showfsevents.py command line option</a>, <a href="man.html#cmdoption-showfsevents.py-b">[1]</a></dt> </dl></dd> </dl></td> <td style="width: 33%" valign="top"><dl> @@ -78,31 +82,52 @@ <dd><dl> <dt><a href="intro.html#cmdoption-showfsevents.py-f">showfsevents.py command line option</a></dt> </dl></dd> + <dt>-f, --files</dt> + <dd><dl> + <dt><a href="man.html#cmdoption-showfsevents.py-f">showfsevents.py command line option</a></dt> + </dl></dd> <dt>-v , --verbose</dt> <dd><dl> <dt><a href="intro.html#cmdoption-showfsevents.py-v">showfsevents.py command line option</a></dt> </dl></dd> + <dt>-v, --verbose</dt> + <dd><dl> + <dt><a href="man.html#cmdoption-showfsevents.py-v">showfsevents.py command line option</a></dt> + </dl></dd> </dl></td> </tr></table> -<h2 id="C">C</h2> +<h2 id="G">G</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%" valign="top"><dl> - <dt><a href="architecture.html#helpers.colorize_output.color_printer">color_printer (class in helpers.colorize_output)</a></dt> + <dt><a href="api.html#package_utils.portage_misc_functions.portage_api.get_deps">get_deps() (package_utils.portage_misc_functions.portage_api method)</a></dt> + <dt><a href="api.html#package_utils.portage_log_parser.get_list_of_merged_packages">get_list_of_merged_packages() (in module package_utils.portage_log_parser)</a></dt> + <dt><a href="api.html#package_utils.portage_misc_functions.portage_api.get_system_packages_list">get_system_packages_list() (package_utils.portage_misc_functions.portage_api method)</a></dt> +</dl></td> + <td style="width: 33%" valign="top"><dl> + <dt><a href="api.html#package_utils.portage_utils.getfilesbypackage">getfilesbypackage() (in module package_utils.portage_utils)</a></dt> + <dt><a href="api.html#logfs.fstracer.getfsevents">getfsevents() (in module logfs.fstracer)</a></dt> + <dt><a href="api.html#package_utils.portage_utils.getpackagesbyfiles">getpackagesbyfiles() (in module package_utils.portage_utils)</a></dt> </dl></td> </tr></table> -<h2 id="E">E</h2> +<h2 id="L">L</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%" valign="top"><dl> - <dt><a href="architecture.html#helpers.colorize_output.enumerate">enumerate() (in module helpers.colorize_output)</a></dt> + <dt><a href="api.html#module-logfs.fstracer">logfs.fstracer (module)</a></dt> </dl></td> </tr></table> -<h2 id="H">H</h2> +<h2 id="P">P</h2> <table style="width: 100%" class="indextable genindextable"><tr> <td style="width: 33%" valign="top"><dl> - <dt><a href="architecture.html#module-helpers.colorize_output">helpers.colorize_output (module)</a></dt> + <dt><a href="api.html#module-package_utils.portage_log_parser">package_utils.portage_log_parser (module)</a></dt> + <dt><a href="api.html#module-package_utils.portage_misc_functions">package_utils.portage_misc_functions (module)</a></dt> + <dt><a href="api.html#module-package_utils.portage_utils">package_utils.portage_utils (module)</a></dt> +</dl></td> + <td style="width: 33%" valign="top"><dl> + <dt><a href="api.html#package_utils.portage_misc_functions.portage_api.parse_emerge_args">parse_emerge_args() (package_utils.portage_misc_functions.portage_api method)</a></dt> + <dt><a href="api.html#package_utils.portage_misc_functions.portage_api">portage_api (class in package_utils.portage_misc_functions)</a></dt> </dl></td> </tr></table> @@ -111,13 +136,16 @@ <td style="width: 33%" valign="top"><dl> <dt>showfsevents.py command line option</dt> <dd><dl> - <dt><a href="intro.html#cmdoption-showfsevents.py--fusefs">--fusefs</a></dt> - <dt><a href="intro.html#cmdoption-showfsevents.py--help">--help, -h</a></dt> - <dt><a href="intro.html#cmdoption-showfsevents.py--hooklib">--hooklib</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py--fusefs">--fusefs</a>, <a href="man.html#cmdoption-showfsevents.py--fusefs">[1]</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py--help">--help, -h</a>, <a href="man.html#cmdoption-showfsevents.py--help">[1]</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py--hooklib">--hooklib</a>, <a href="man.html#cmdoption-showfsevents.py--hooklib">[1]</a></dt> + <dt><a href="man.html#cmdoption-showfsevents.py--nocolor">--nocolor, -C</a></dt> <dt><a href="intro.html#cmdoption-showfsevents.py-C">-C , --nocolor</a></dt> - <dt><a href="intro.html#cmdoption-showfsevents.py-b">-b PACKAGES, --block=PACKAGES</a></dt> + <dt><a href="intro.html#cmdoption-showfsevents.py-b">-b PACKAGES, --block=PACKAGES</a>, <a href="man.html#cmdoption-showfsevents.py-b">[1]</a></dt> <dt><a href="intro.html#cmdoption-showfsevents.py-f">-f , --files</a></dt> + <dt><a href="man.html#cmdoption-showfsevents.py-f">-f, --files</a></dt> <dt><a href="intro.html#cmdoption-showfsevents.py-v">-v , --verbose</a></dt> + <dt><a href="man.html#cmdoption-showfsevents.py-v">-v, --verbose</a></dt> </dl></dd> </dl></td> </tr></table> @@ -158,11 +186,12 @@ <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/index.html b/docs/build/html/index.html index 7da54a3..6fc6a22 100644 --- a/docs/build/html/index.html +++ b/docs/build/html/index.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Autodep’s documentation — Autodep v0.1 documentation</title> + <title>Autodep’s documentation — Autodep documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,7 +22,7 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="#" /> + <link rel="top" title="Autodep documentation" href="#" /> <link rel="next" title="Introduction" href="intro.html" /> </head> <body> @@ -38,7 +38,7 @@ <li class="right" > <a href="intro.html" title="Introduction" accesskey="N">next</a> |</li> - <li><a href="#">Autodep v0.1 documentation</a> »</li> + <li><a href="#">Autodep</a> »</li> </ul> </div> @@ -64,8 +64,18 @@ <li class="toctree-l2"><a class="reference internal" href="intro.html#indices-and-tables">Indices and tables</a></li> </ul> </li> -<li class="toctree-l1"><a class="reference internal" href="architecture.html">Internals</a></li> -<li class="toctree-l1"><a class="reference internal" href="api.html">9. API</a></li> +<li class="toctree-l1"><a class="reference internal" href="architecture.html">Internals</a><ul> +<li class="toctree-l2"><a class="reference internal" href="architecture.html#how-it-works">How it works?</a></li> +<li class="toctree-l2"><a class="reference internal" href="architecture.html#how-hooklib-approach-works">How Hooklib approach works?</a></li> +<li class="toctree-l2"><a class="reference internal" href="architecture.html#how-fusefs-approach-works">How Fusefs approach works?</a></li> +<li class="toctree-l2"><a class="reference internal" href="architecture.html#futher-analysis-of-file-access-events">Futher analysis of file access events</a></li> +</ul> +</li> +<li class="toctree-l1"><a class="reference internal" href="api.html">API</a><ul> +<li class="toctree-l2"><a class="reference internal" href="api.html#module-logfs.fstracer">logfs.fstracer</a></li> +<li class="toctree-l2"><a class="reference internal" href="api.html#package-utils">package_utils</a></li> +</ul> +</li> </ul> </div> </div> @@ -121,11 +131,12 @@ <li class="right" > <a href="intro.html" title="Introduction" >next</a> |</li> - <li><a href="#">Autodep v0.1 documentation</a> »</li> + <li><a href="#">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/intro.html b/docs/build/html/intro.html index dfd7571..75211da 100644 --- a/docs/build/html/intro.html +++ b/docs/build/html/intro.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Introduction — Autodep v0.1 documentation</title> + <title>Introduction — Autodep documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,8 +22,8 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="index.html" /> - <link rel="next" title="8. architecture – Internals" href="architecture.html" /> + <link rel="top" title="Autodep documentation" href="index.html" /> + <link rel="next" title="Internals" href="architecture.html" /> <link rel="prev" title="Autodep’s documentation" href="index.html" /> </head> <body> @@ -37,12 +37,12 @@ <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > - <a href="architecture.html" title="8. architecture – Internals" + <a href="architecture.html" title="Internals" accesskey="N">next</a> |</li> <li class="right" > <a href="index.html" title="Autodep’s documentation" accesskey="P">previous</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> @@ -240,7 +240,7 @@ accessed:</p> title="previous chapter">Autodep’s documentation</a></p> <h4>Next topic</h4> <p class="topless"><a href="architecture.html" - title="next chapter">8. <tt class="docutils literal"><span class="pre">architecture</span></tt> – Internals</a></p> + title="next chapter">Internals</a></p> <h3>This Page</h3> <ul class="this-page-menu"> <li><a href="_sources/intro.txt" @@ -273,16 +273,17 @@ accessed:</p> <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> <li class="right" > - <a href="architecture.html" title="8. architecture – Internals" + <a href="architecture.html" title="Internals" >next</a> |</li> <li class="right" > <a href="index.html" title="Autodep’s documentation" >previous</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/man.html b/docs/build/html/man.html new file mode 100644 index 0000000..f2b221a --- /dev/null +++ b/docs/build/html/man.html @@ -0,0 +1,251 @@ + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>USER COMMANDS — Autodep documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '', + VERSION: '0.1', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="Autodep documentation" href="index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="index.html">Autodep</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="user-commands"> +<h1>USER COMMANDS<a class="headerlink" href="#user-commands" title="Permalink to this headline">¶</a></h1> +<div class="section" id="synopsis"> +<h2>SYNOPSIS<a class="headerlink" href="#synopsis" title="Permalink to this headline">¶</a></h2> +<p><strong>showfsevents.py</strong> [options] <command></p> +</div> +<div class="section" id="description"> +<h2>DESCRIPTION<a class="headerlink" href="#description" title="Permalink to this headline">¶</a></h2> +<p>Auto dependency builder is a tool for analysis files accessed during +building a package. It also can be used for runtime dependencies analysis.</p> +<p>The tool can block an access to files of defined packages.</p> +</div> +<div class="section" id="options"> +<h2>OPTIONS<a class="headerlink" href="#options" title="Permalink to this headline">¶</a></h2> +<dl class="cmdoption"> +<dt id="cmdoption-showfsevents.py--help"> +<tt class="descname">--help</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">-h</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-showfsevents.py--help" title="Permalink to this definition">¶</a></dt> +<dd><p>show this help message and exit</p> +</dd></dl> + +<dl class="cmdoption"> +<dt id="cmdoption-showfsevents.py-b"> +<tt class="descname">-b</tt><tt class="descclassname"> PACKAGES</tt><tt class="descclassname">, </tt><tt class="descname">--block</tt><tt class="descclassname">=PACKAGES</tt><a class="headerlink" href="#cmdoption-showfsevents.py-b" title="Permalink to this definition">¶</a></dt> +<dd><p>block an access to files from this packages</p> +</dd></dl> + +<dl class="cmdoption"> +<dt id="cmdoption-showfsevents.py-f"> +<tt class="descname">-f</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">--files</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-showfsevents.py-f" title="Permalink to this definition">¶</a></dt> +<dd><p>show accessed files and not founded files</p> +</dd></dl> + +<dl class="cmdoption"> +<dt id="cmdoption-showfsevents.py-v"> +<tt class="descname">-v</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">--verbose</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-showfsevents.py-v" title="Permalink to this definition">¶</a></dt> +<dd><p>show non-important packages, show unknown package and unknown stage</p> +</dd></dl> + +<dl class="cmdoption"> +<dt id="cmdoption-showfsevents.py--nocolor"> +<tt class="descname">--nocolor</tt><tt class="descclassname"></tt><tt class="descclassname">, </tt><tt class="descname">-C</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-showfsevents.py--nocolor" title="Permalink to this definition">¶</a></dt> +<dd><p>don’t output color</p> +</dd></dl> + +<dl class="cmdoption"> +<dt id="cmdoption-showfsevents.py--hooklib"> +<tt class="descname">--hooklib</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-showfsevents.py--hooklib" title="Permalink to this definition">¶</a></dt> +<dd><p>use ld_preload logging approach(default)</p> +</dd></dl> + +<dl class="cmdoption"> +<dt id="cmdoption-showfsevents.py--fusefs"> +<tt class="descname">--fusefs</tt><tt class="descclassname"></tt><a class="headerlink" href="#cmdoption-showfsevents.py--fusefs" title="Permalink to this definition">¶</a></dt> +<dd><p>use fuse logging approach(slow, but reliable)</p> +</dd></dl> + +</div> +<div class="section" id="hooklib-vs-fusefs"> +<h2>HOOKLIB VS FUSEFS<a class="headerlink" href="#hooklib-vs-fusefs" title="Permalink to this headline">¶</a></h2> +<table border="1" class="docutils"> +<colgroup> +<col width="63%" /> +<col width="17%" /> +<col width="20%" /> +</colgroup> +<thead valign="bottom"> +<tr><th class="head"> </th> +<th class="head">Hooklib</th> +<th class="head">Fusefs</th> +</tr> +</thead> +<tbody valign="top"> +<tr><td>Who can use this approach?</td> +<td><strong>Any user</strong></td> +<td>Only root</td> +</tr> +<tr><td>Is approach allows blocking an access to files?</td> +<td><strong>YES</strong></td> +<td><strong>YES</strong></td> +</tr> +<tr><td>Is overhead in performance big?</td> +<td><strong>NO</strong></td> +<td>YES <a class="footnote-reference" href="#f1" id="id1">[1]</a></td> +</tr> +<tr><td>What events are logged?</td> +<td>Most <a class="footnote-reference" href="#f2" id="id2">[2]</a></td> +<td><strong>ALL</strong></td> +</tr> +<tr><td>When is it recomended to use an approach?</td> +<td>For analysis +of +<em>buildtime</em> +dependencies</td> +<td>For analysis +of <em>runtime</em> +dependencies</td> +</tr> +<tr><td>Is any pre-requirements for using an approach?</td> +<td><strong>NO</strong></td> +<td>FUSE must be +enabled in +kernel</td> +</tr> +</tbody> +</table> +<p class="rubric">Notes</p> +<table class="docutils footnote" frame="void" id="f1" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label"><a class="fn-backref" href="#id1">[1]</a></td><td>Fuse file system is slower than normal one. Program reads many files +while launching, so this will take more time than usual.</td></tr> +</tbody> +</table> +<table class="docutils footnote" frame="void" id="f2" rules="none"> +<colgroup><col class="label" /><col /></colgroup> +<tbody valign="top"> +<tr><td class="label"><a class="fn-backref" href="#id2">[2]</a></td><td>Loading of dynamic libraries and direct syscalls will not be logged.</td></tr> +</tbody> +</table> +</div> +<div class="section" id="examples"> +<h2>Examples<a class="headerlink" href="#examples" title="Permalink to this headline">¶</a></h2> +<div class="section" id="get-the-potential-dependencies-of-a-xchat-package"> +<h3>Get the potential dependencies of a xchat package:<a class="headerlink" href="#get-the-potential-dependencies-of-a-xchat-package" title="Permalink to this headline">¶</a></h3> +<p>showfsevents.py emerge xchat</p> +</div> +<div class="section" id="get-the-potential-dependencies-of-a-xchat-package-blocking-x11-misc-util-macros-package"> +<h3>Get the potential dependencies of a xchat package, blocking x11-misc/util-macros package:<a class="headerlink" href="#get-the-potential-dependencies-of-a-xchat-package-blocking-x11-misc-util-macros-package" title="Permalink to this headline">¶</a></h3> +<p>showfsevents.py emerge –block x11-misc/util-macros emerge xchat</p> +</div> +<div class="section" id="get-the-potential-dependencies-of-a-xchat-package-and-show-files-accessed"> +<h3>Get the potential dependencies of a xchat package, and show files accessed:<a class="headerlink" href="#get-the-potential-dependencies-of-a-xchat-package-and-show-files-accessed" title="Permalink to this headline">¶</a></h3> +<p>showfsevents.py –files emerge xchat</p> +</div> +<div class="section" id="get-the-runtime-dependencies-of-a-xchat-and-show-files-accessed"> +<h3>Get the runtime dependencies of a xchat and show files accessed:<a class="headerlink" href="#get-the-runtime-dependencies-of-a-xchat-and-show-files-accessed" title="Permalink to this headline">¶</a></h3> +<p>showfsevents.py –fusefs –files xchat</p> +</div> +</div> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h3><a href="index.html">Table Of Contents</a></h3> + <ul> +<li><a class="reference internal" href="#">USER COMMANDS</a><ul> +<li><a class="reference internal" href="#synopsis">SYNOPSIS</a></li> +<li><a class="reference internal" href="#description">DESCRIPTION</a></li> +<li><a class="reference internal" href="#options">OPTIONS</a></li> +<li><a class="reference internal" href="#hooklib-vs-fusefs">HOOKLIB VS FUSEFS</a></li> +<li><a class="reference internal" href="#examples">Examples</a><ul> +<li><a class="reference internal" href="#get-the-potential-dependencies-of-a-xchat-package">Get the potential dependencies of a xchat package:</a></li> +<li><a class="reference internal" href="#get-the-potential-dependencies-of-a-xchat-package-blocking-x11-misc-util-macros-package">Get the potential dependencies of a xchat package, blocking x11-misc/util-macros package:</a></li> +<li><a class="reference internal" href="#get-the-potential-dependencies-of-a-xchat-package-and-show-files-accessed">Get the potential dependencies of a xchat package, and show files accessed:</a></li> +<li><a class="reference internal" href="#get-the-runtime-dependencies-of-a-xchat-and-show-files-accessed">Get the runtime dependencies of a xchat and show files accessed:</a></li> +</ul> +</li> +</ul> +</li> +</ul> + + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/man.txt" + rel="nofollow">Show Source</a></li> + </ul> +<div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="index.html">Autodep</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. + </div> + </body> +</html>
\ No newline at end of file diff --git a/docs/build/html/objects.inv b/docs/build/html/objects.inv Binary files differindex 3e01c3e..d1cea9d 100644 --- a/docs/build/html/objects.inv +++ b/docs/build/html/objects.inv diff --git a/docs/build/html/py-modindex.html b/docs/build/html/py-modindex.html index 5f97b50..a2e022c 100644 --- a/docs/build/html/py-modindex.html +++ b/docs/build/html/py-modindex.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Python Module Index — Autodep v0.1 documentation</title> + <title>Python Module Index — Autodep documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -22,7 +22,7 @@ <script type="text/javascript" src="_static/jquery.js"></script> <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="index.html" /> + <link rel="top" title="Autodep documentation" href="index.html" /> @@ -37,7 +37,7 @@ <li class="right" > <a href="#" title="Python Module Index" >modules</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> @@ -50,23 +50,48 @@ <h1>Python Module Index</h1> <div class="modindex-jumpbox"> - <a href="#cap-h"><strong>h</strong></a> + <a href="#cap-l"><strong>l</strong></a> | + <a href="#cap-p"><strong>p</strong></a> </div> <table class="indextable modindextable" cellspacing="0" cellpadding="2"> <tr class="pcap"><td></td><td> </td><td></td></tr> - <tr class="cap" id="cap-h"><td></td><td> - <strong>h</strong></td><td></td></tr> + <tr class="cap" id="cap-l"><td></td><td> + <strong>l</strong></td><td></td></tr> <tr> <td><img src="_static/minus.png" class="toggler" id="toggle-1" style="display: none" alt="-" /></td> <td> - <tt class="xref">helpers</tt></td><td> + <tt class="xref">logfs</tt></td><td> <em></em></td></tr> <tr class="cg-1"> <td></td> <td> - <a href="architecture.html#module-helpers.colorize_output"><tt class="xref">helpers.colorize_output</tt></a></td><td> + <a href="api.html#module-logfs.fstracer"><tt class="xref">logfs.fstracer</tt></a></td><td> + <em></em></td></tr> + <tr class="pcap"><td></td><td> </td><td></td></tr> + <tr class="cap" id="cap-p"><td></td><td> + <strong>p</strong></td><td></td></tr> + <tr> + <td><img src="_static/minus.png" class="toggler" + id="toggle-2" style="display: none" alt="-" /></td> + <td> + <tt class="xref">package_utils</tt></td><td> + <em></em></td></tr> + <tr class="cg-2"> + <td></td> + <td> + <a href="api.html#module-package_utils.portage_log_parser"><tt class="xref">package_utils.portage_log_parser</tt></a></td><td> + <em></em></td></tr> + <tr class="cg-2"> + <td></td> + <td> + <a href="api.html#module-package_utils.portage_misc_functions"><tt class="xref">package_utils.portage_misc_functions</tt></a></td><td> + <em></em></td></tr> + <tr class="cg-2"> + <td></td> + <td> + <a href="api.html#module-package_utils.portage_utils"><tt class="xref">package_utils.portage_utils</tt></a></td><td> <em></em></td></tr> </table> @@ -102,11 +127,12 @@ <li class="right" > <a href="#" title="Python Module Index" >modules</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/search.html b/docs/build/html/search.html index a893c34..dfff3e8 100644 --- a/docs/build/html/search.html +++ b/docs/build/html/search.html @@ -7,7 +7,7 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> - <title>Search — Autodep v0.1 documentation</title> + <title>Search — Autodep documentation</title> <link rel="stylesheet" href="_static/default.css" type="text/css" /> <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> <script type="text/javascript"> @@ -23,7 +23,7 @@ <script type="text/javascript" src="_static/underscore.js"></script> <script type="text/javascript" src="_static/doctools.js"></script> <script type="text/javascript" src="_static/searchtools.js"></script> - <link rel="top" title="Autodep v0.1 documentation" href="index.html" /> + <link rel="top" title="Autodep documentation" href="index.html" /> <script type="text/javascript"> jQuery(function() { Search.loadIndex("searchindex.js"); }); </script> @@ -40,7 +40,7 @@ <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> @@ -91,11 +91,12 @@ <li class="right" > <a href="py-modindex.html" title="Python Module Index" >modules</a> |</li> - <li><a href="index.html">Autodep v0.1 documentation</a> »</li> + <li><a href="index.html">Autodep</a> »</li> </ul> </div> <div class="footer"> © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. </div> </body> diff --git a/docs/build/html/searchindex.js b/docs/build/html/searchindex.js index 3287343..b5870ea 100644 --- a/docs/build/html/searchindex.js +++ b/docs/build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({objects:{"":{"-f":[2,0,1],"-C":[2,0,1],"-b":[2,0,1],"--hooklib":[2,0,1],"--fusefs":[2,0,1],"-v":[2,0,1],"--help":[2,0,1]},"helpers.colorize_output":{color_printer:[3,3,1],enumerate:[3,2,1]},helpers:{colorize_output:[3,1,1]}},terms:{all:2,try_stmt:[],help:2,show:2,text:[],verbos:2,colorize_output:3,dynam:2,row:[],access:2,onli:2,showfsev:2,depend:2,ham:[],binari:[],activ:2,except:[],cowsai:2,ebuild:2,program:2,under:2,els:[],cool:[],try2_stmt:[],build:2,non:2,liter:1,"return":3,string:3,get:2,fals:[],auto:2,express:[],util:2,veri:[],potenti:2,requir:2,introduct:[0,2],enabl:2,prerequir:[],docutil:1,nocolor:2,yield:3,productionlist:[],"try":[],item:3,found:2,page:2,bai:[],kernel:2,slower:2,direct:2,color_print:3,enable_color:3,intern:[0,3],iter:3,todo:2,event:2,librari:2,index:[2,3],statu:[0,2],enumer:3,content:0,autodep:[0,2],analusi:[],overlai:2,print:3,"import":2,foo:[],approach:2,run:[0,2],usag:[],bodi:[],slow:2,x11:2,releas:2,span:1,bash:2,stage:2,try1_stmt:[],search:2,alexand:[],launch:2,column:[],script:[],footnot:[],mani:2,lsof:2,block:2,user:2,load:2,directli:[],color:[2,3],overview:[0,2],modul:2,misc:2,header:[],api:[0,1],instal:[0,2],gpl:2,hackerdom:[],from:2,log:2,fusef:[0,2],spam:[],unknown:2,licens:2,system:2,messag:2,start:3,overhead:2,suit:[],xchat:2,"final":[],more:2,ld_preload:2,exit:2,option:2,tupl:3,tool:2,about:[],"true":3,than:2,must:2,cmdoption:[],target:[],gnu:2,"default":2,buildtim:2,defin:2,"while":2,intro:[],can:2,root:2,builder:2,pre:[1,2],"function":[],helper:3,dure:2,ani:2,indic:[0,2],packag:2,sourc:3,file:2,tabl:[0,2],revis:[],recomend:2,develop:2,welcom:[],output:[2,3],perform:2,titl:[],make:2,when:2,bersenev:[],note:2,also:2,emerg:2,take:2,big:2,test:[],instead:[],document:0,simpl:[],architectur:[],analysi:2,thi:2,normal:2,sequenc:3,who:2,what:2,most:2,fuse:2,hooklib:[0,2],"\u0441riterion":[],"class":[1,3],don:2,syscal:2,read:2,macro:2,reliabl:2,author:[],exampl:[0,2],command:2,runtim:2,allow:2,time:2,first:[],egg:[],hello:[1,3],usual:2},objtypes:{"0":"std:option","1":"py:module","2":"py:function","3":"py:class"},titles:["Autodep’s documentation","9. <tt class=\"docutils literal\"><span class=\"pre\">API</span></tt>","Introduction","Internals"],objnames:{"0":"option","1":"Python module","2":"Python function","3":"Python class"},filenames:["index","api","intro","architecture"]})
\ No newline at end of file +Search.setIndex({objects:{"":{"-f":[4,0,1],"-b":[4,0,1],"--hooklib":[4,0,1],"--fusefs":[4,0,1],"-v":[4,0,1],"--nocolor":[4,0,1],"--help":[4,0,1]},"logfs.fstracer":{getfsevents:[1,2,1]},"package_utils.portage_log_parser":{get_list_of_merged_packages:[1,2,1]},logfs:{fstracer:[1,1,1]},"package_utils.portage_utils":{getfilesbypackage:[1,2,1],getpackagesbyfiles:[1,2,1]},"package_utils.portage_misc_functions":{portage_api:[1,4,1]},"package_utils.portage_misc_functions.portage_api":{get_deps:[1,3,1],get_system_packages_list:[1,3,1],parse_emerge_args:[1,3,1]},package_utils:{portage_misc_functions:[1,1,1],portage_utils:[1,1,1],portage_log_parser:[1,1,1]}},terms:{all:[1,2,3,4],code:3,chain:1,mnt:3,colorize_output:[],als:[],row:[],prog_nam:1,showfsev:[2,4],depend:[1,2,3,4],send:3,ebuild:2,program:[1,2,3,4],under:2,sourc:1,string:1,fals:1,util:[2,3,4],dfdsfsdfd:[],veri:[],hooker:3,cool:[],tri:3,level:1,list:[1,3],iter:[],"try":[],item:[],mount:3,defaultfilt:1,slower:[2,4],direct:[2,4],second:1,cost:3,"0x1ac5b18":[],pass:1,further:3,index:2,what:[2,4],compar:3,access:[0,1,2,3,4],analusi:[],"new":3,"0x1abec08":[],dsfdsf:[],etyp:[],bodi:[],ggg:[],modifi:3,sinc:[1,3],valu:[],search:[1,2],action:1,chang:3,via:3,packagenam:1,modul:[1,2,3],filenam:1,unix:3,api:[0,1],heurist:3,instal:[0,2,3],get_dep:1,from:[1,2,3,4],two:1,"0x1ac2b90":1,overhead:[2,4],usr:3,type:[1,3],more:[2,4],ld_preload:[2,3,4],endtim:1,getfilesbypackag:1,must:[2,4],none:[],lib32:3,err:3,package_util:[0,1],prepar:3,launch:[1,2,3,4],dev:3,can:[1,2,3,4],root:[2,4],registr:3,share:3,indic:[0,2],high:1,liter:[],portage_log_pars:1,chroot:3,end:[1,3],anoth:3,"0x1abcb90":[],write:[1,3],how:[0,3],"0x1ac0c08":[],answer:3,instead:[1,3],simpl:3,map:3,alwai:1,after:3,befor:3,"\u0441riterion":[],man:3,syscal:[2,4],read:[1,2,3,4],bind:3,element:1,inform:[1,3],environ:3,allow:[1,2,3,4],"0x1abdc08":[],first:1,egg:[],rdepend:1,"0x1ac1b18":[],help:[2,4],over:3,rootf:3,fff:[],dynam:[2,3,4],paramet:1,cowsai:2,main:3,non:[2,4],"return":[1,3],thei:1,handl:1,auto:[2,4],introduct:[0,2],name:[1,3],productionlist:[],each:1,x11:[2,4],domain:3,idea:3,color_print:[],logf:[0,1],enable_color:[],connect:3,todo:2,event:[0,1,2,3,4],variabl:3,network:3,content:0,print:[],got:3,lib64:3,bla:[],believ:3,dictionari:1,ask:3,bash:2,try1_stmt:[],thread:3,registar:3,get_list_of_merged_packag:1,filter:1,registrar:3,getfsev:1,lambda:[],origin:3,directli:[],misc:[2,4],open:[1,3],gpl:2,script:[],unknown:[1,2,3,4],licens:2,system:[1,2,3,4],messag:[2,3,4],scheme:3,"final":[],includ:3,option:[1,2,4],tool:[2,4],copi:3,postrm:3,pars:1,than:[2,4],cmdoption:[],target:[],tree:[],charact:3,bridg:1,pre:[2,4],"function":[1,3],linker:3,argument:1,packag:[1,2,3,4],tabl:[0,2],bersenev:[],accuraci:3,note:[2,3,4],also:[1,2,3,4],take:[1,2,3,4],which:1,loggabl:3,normal:[2,4],who:[2,4],most:[2,4],buildtim:[2,4],hooklib:[0,1,2,3,4],phase:3,"class":1,don:[2,4],portage_misc_funct:1,doe:[],deni:3,runtim:[2,3,4],try_stmt:[],show:[2,4],text:[],verbos:[2,4],pkg:1,find:1,xml:3,current:1,onli:[2,4],slow:[2,4],activ:2,dep_typ:1,should:1,parse_emerge_arg:1,footnot:[],analys:3,try2_stmt:[],unus:3,get:[1,2,4],express:[],format_except:[],increas:3,requir:[2,4],portage_util:1,enabl:[2,4],yield:[],"0x1ac1b90":[],contain:1,userspac:3,shm:3,bai:[],kernel:[2,4],set:1,packet:3,dsfd:[],see:3,sec:3,result:3,arg:1,fail:1,statu:[0,2],enumer:[],between:1,"import":[2,4],approach:[0,1,2,3,4],kei:1,xchat:[2,4],both:1,protect:3,delimit:3,"0x1ac6b90":[],logic:1,futher:[0,3],mani:[2,4],lsof:2,"0x1ac0b18":[],load:[2,3,4],color:[2,4],overview:[0,2],header:[],linux:3,reciev:3,fusef:[0,1,2,3,4],implicit:[1,3],much:3,recomend:[2,4],"0x1ac1c08":[],fstracer:[0,1],ani:[1,2,3,4],stagenam:3,gnu:2,servic:1,defin:[2,4],"while":[2,3,4],behavior:3,error:3,helper:[],sock_seqpacket:3,synopsi:4,revis:[],develop:2,welcom:[],author:[],perform:[2,3,4],make:2,belong:1,same:3,binari:[],document:0,helpdsfdsfd:[],fuse:[2,3,4],user:[2,4],extern:3,portag:[1,3],macro:[2,4],builder:[2,4],exampl:[0,2,4],command:[2,4],thi:[1,2,3,4],filesystem:3,programm:[],usual:[2,3,4],execut:3,cut:3,ham:[],except:[],param:[],desktop:3,els:3,logger:[],build:[2,3,4],filterproc:1,format:3,libc:3,big:[2,4],recurs:1,prerequir:[],success:1,docutil:[],nocolor:[2,4],"0x1abeb90":[],output:[2,4],page:2,often:3,stat:[],intern:[0,3],successfulli:1,librari:[2,3,4],tmp:3,autodep:[0,2],exit:[2,4],overlai:2,foo:[],proc:3,"0x1ac2b18":[],run:[0,2,3],usag:[],starttim:1,found:[1,2,3,4],portage_api:1,"0x1ac0b90":[],stage:[1,2,3,4],about:3,alexand:[],socket:3,column:[],block:[1,2,3,4],merg:1,hackerdom:[],span:[],log:[1,2,4],wai:3,spam:[],errno:3,start:1,low:1,suit:[],"var":3,call:[1,3],analysi:[0,2,3,4],unexpect:3,tupl:1,atom:1,"true":1,made:[],"default":[1,2,4],record:[],limit:[],creat:3,dure:[2,4],parser:1,doesn:1,intro:[],file:[0,1,2,3,4],work:[0,1,3],check:3,acloc:3,titl:[],when:[2,3,4],detail:3,field:3,other:3,test:[],architectur:[],fork:3,getpackagesbyfil:1,"0x1abbb90":[],get_system_packages_list:1,sequenc:[],releas:2,directori:3,reliabl:[2,4],descript:4,rule:3,depth:1,emerg:[1,2,4],potenti:[2,4],time:[1,2,3,4],profil:3,hello:[]},objtypes:{"0":"std:option","1":"py:module","2":"py:function","3":"py:method","4":"py:class"},titles:["Autodep’s documentation","API","Introduction","Internals","USER COMMANDS"],objnames:{"0":"option","1":"Python module","2":"Python function","3":"Python method","4":"Python class"},filenames:["index","api","intro","architecture","man"]})
\ No newline at end of file diff --git a/docs/build/html/showfsevents.html b/docs/build/html/showfsevents.html new file mode 100644 index 0000000..fb9c953 --- /dev/null +++ b/docs/build/html/showfsevents.html @@ -0,0 +1,96 @@ + + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>TITLE — Autodep documentation</title> + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: '', + VERSION: '0.1', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="Autodep documentation" href="index.html" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li class="right" > + <a href="py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="index.html">Autodep</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="title"> +<h1>TITLE<a class="headerlink" href="#title" title="Permalink to this headline">¶</a></h1> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/showfsevents.txt" + rel="nofollow">Show Source</a></li> + </ul> +<div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" size="18" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li class="right" > + <a href="py-modindex.html" title="Python Module Index" + >modules</a> |</li> + <li><a href="index.html">Autodep</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright 2011, Alexander Bersenev. + Last updated on Jul 25, 2011. + Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> 1.0.7. + </div> + </body> +</html>
\ No newline at end of file |