aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Bersenev <bay@hackerdom.ru>2011-07-25 01:32:59 +0000
committerAlexander Bersenev <bay@hackerdom.ru>2011-07-25 01:32:59 +0000
commit2276366a5a6200dabc0778ffeac896ca20b61bf1 (patch)
treea118d698e382f384633e5a6da95532b4705a35a6
parentdocumentation: intro (diff)
downloadautodep-2276366a5a6200dabc0778ffeac896ca20b61bf1.tar.gz
autodep-2276366a5a6200dabc0778ffeac896ca20b61bf1.tar.bz2
autodep-2276366a5a6200dabc0778ffeac896ca20b61bf1.zip
documentation, man page
-rw-r--r--NOTES2
-rw-r--r--docs/build/doctrees/api.doctreebin2823 -> 36541 bytes
-rw-r--r--docs/build/doctrees/architecture.doctreebin7719 -> 16699 bytes
-rw-r--r--docs/build/doctrees/environment.picklebin946116 -> 971243 bytes
-rw-r--r--docs/build/doctrees/index.doctreebin3609 -> 3611 bytes
-rw-r--r--docs/build/doctrees/man.doctreebin0 -> 25112 bytes
-rw-r--r--docs/build/doctrees/showfsevents.doctreebin0 -> 2358 bytes
-rw-r--r--docs/build/html/.buildinfo2
-rw-r--r--docs/build/html/_images/autodep_arch.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch1.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch10.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch11.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch12.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch13.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch14.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch15.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch16.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch17.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch18.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch19.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch2.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch20.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch21.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch22.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch23.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch24.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch25.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch26.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch27.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch28.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch29.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch3.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch30.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch31.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch32.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch33.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch34.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch35.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch36.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch37.pngbin0 -> 55203 bytes
-rw-r--r--docs/build/html/_images/autodep_arch38.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch39.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch4.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch40.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch41.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch42.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch43.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch44.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch45.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch46.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch47.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch48.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/_images/autodep_arch5.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch6.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch7.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch8.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/autodep_arch9.pngbin0 -> 48586 bytes
-rw-r--r--docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.pngbin0 -> 2520 bytes
-rw-r--r--docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png.map2
-rw-r--r--docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.pngbin0 -> 8280 bytes
-rw-r--r--docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png.map2
-rw-r--r--docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.pngbin0 -> 2252 bytes
-rw-r--r--docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png.map2
-rw-r--r--docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.pngbin0 -> 4429 bytes
-rw-r--r--docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png.map2
-rw-r--r--docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.pngbin0 -> 5501 bytes
-rw-r--r--docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png.map2
-rw-r--r--docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.pngbin0 -> 5300 bytes
-rw-r--r--docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png.map2
-rw-r--r--docs/build/html/_modules/helpers/colorize_output.html11
-rw-r--r--docs/build/html/_modules/index.html13
-rw-r--r--docs/build/html/_modules/logfs/fstracer.html315
-rw-r--r--docs/build/html/_modules/package_utils/portage_log_parser.html172
-rw-r--r--docs/build/html/_modules/package_utils/portage_misc_functions.html176
-rw-r--r--docs/build/html/_modules/package_utils/portage_utils.html161
-rw-r--r--docs/build/html/_modules/test.html9
-rw-r--r--docs/build/html/_sources/api.txt24
-rw-r--r--docs/build/html/_sources/architecture.txt94
-rw-r--r--docs/build/html/_sources/man.txt95
-rw-r--r--docs/build/html/_sources/showfsevents.txt2
-rw-r--r--docs/build/html/_static/autodep_arch.pngbin0 -> 44565 bytes
-rw-r--r--docs/build/html/api.html183
-rw-r--r--docs/build/html/architecture.html134
-rw-r--r--docs/build/html/genindex.html67
-rw-r--r--docs/build/html/index.html23
-rw-r--r--docs/build/html/intro.html17
-rw-r--r--docs/build/html/man.html251
-rw-r--r--docs/build/html/objects.invbin347 -> 456 bytes
-rw-r--r--docs/build/html/py-modindex.html44
-rw-r--r--docs/build/html/search.html9
-rw-r--r--docs/build/html/searchindex.js2
-rw-r--r--docs/build/html/showfsevents.html96
-rw-r--r--docs/build/man/showfsevents.py.1 (renamed from docs/build/man/autodep.1)121
-rw-r--r--docs/source/_static/autodep_arch.pngbin0 -> 44565 bytes
-rw-r--r--docs/source/api.rst24
-rw-r--r--docs/source/architecture.rst94
-rw-r--r--docs/source/conf.py30
-rw-r--r--docs/source/man.rst95
-rw-r--r--src/autodep/__init__.py0
-rw-r--r--src/autodep/helpers/colorize_output.py12
-rw-r--r--src/autodep/helpers/events_analysis.py4
-rw-r--r--src/autodep/logfs/fstracer.py82
-rw-r--r--src/autodep/package_utils/portage_log_parser.py8
-rw-r--r--src/autodep/package_utils/portage_misc_functions.py24
-rw-r--r--src/autodep/package_utils/portage_utils.py10
-rwxr-xr-xsrc/autodep/showfsevents.py6
106 files changed, 2163 insertions, 261 deletions
diff --git a/NOTES b/NOTES
index dd303c0..99a214d 100644
--- a/NOTES
+++ b/NOTES
@@ -2,7 +2,7 @@ This is few notes mainly for myself.
1. Format of log record:
<time of event: sec since 1970>
- <event type: stat, create, open, read, write>
+ <event type: open, read, write>
<name of file>
<building stage: stagename or unknown>
<result:OK,ERR/errno,ASKING,DENIED>
diff --git a/docs/build/doctrees/api.doctree b/docs/build/doctrees/api.doctree
index 13f557c..1d53a5b 100644
--- a/docs/build/doctrees/api.doctree
+++ b/docs/build/doctrees/api.doctree
Binary files differ
diff --git a/docs/build/doctrees/architecture.doctree b/docs/build/doctrees/architecture.doctree
index 2450289..ca0afd1 100644
--- a/docs/build/doctrees/architecture.doctree
+++ b/docs/build/doctrees/architecture.doctree
Binary files differ
diff --git a/docs/build/doctrees/environment.pickle b/docs/build/doctrees/environment.pickle
index 988885b..8ec5ced 100644
--- a/docs/build/doctrees/environment.pickle
+++ b/docs/build/doctrees/environment.pickle
Binary files differ
diff --git a/docs/build/doctrees/index.doctree b/docs/build/doctrees/index.doctree
index 8643071..f33221b 100644
--- a/docs/build/doctrees/index.doctree
+++ b/docs/build/doctrees/index.doctree
Binary files differ
diff --git a/docs/build/doctrees/man.doctree b/docs/build/doctrees/man.doctree
new file mode 100644
index 0000000..72dad49
--- /dev/null
+++ b/docs/build/doctrees/man.doctree
Binary files differ
diff --git a/docs/build/doctrees/showfsevents.doctree b/docs/build/doctrees/showfsevents.doctree
new file mode 100644
index 0000000..14331d4
--- /dev/null
+++ b/docs/build/doctrees/showfsevents.doctree
Binary files differ
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
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch1.png b/docs/build/html/_images/autodep_arch1.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch1.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch10.png b/docs/build/html/_images/autodep_arch10.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch10.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch11.png b/docs/build/html/_images/autodep_arch11.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch11.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch12.png b/docs/build/html/_images/autodep_arch12.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch12.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch13.png b/docs/build/html/_images/autodep_arch13.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch13.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch14.png b/docs/build/html/_images/autodep_arch14.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch14.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch15.png b/docs/build/html/_images/autodep_arch15.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch15.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch16.png b/docs/build/html/_images/autodep_arch16.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch16.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch17.png b/docs/build/html/_images/autodep_arch17.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch17.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch18.png b/docs/build/html/_images/autodep_arch18.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch18.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch19.png b/docs/build/html/_images/autodep_arch19.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch19.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch2.png b/docs/build/html/_images/autodep_arch2.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch2.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch20.png b/docs/build/html/_images/autodep_arch20.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch20.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch21.png b/docs/build/html/_images/autodep_arch21.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch21.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch22.png b/docs/build/html/_images/autodep_arch22.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch22.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch23.png b/docs/build/html/_images/autodep_arch23.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch23.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch24.png b/docs/build/html/_images/autodep_arch24.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch24.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch25.png b/docs/build/html/_images/autodep_arch25.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch25.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch26.png b/docs/build/html/_images/autodep_arch26.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch26.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch27.png b/docs/build/html/_images/autodep_arch27.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch27.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch28.png b/docs/build/html/_images/autodep_arch28.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch28.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch29.png b/docs/build/html/_images/autodep_arch29.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch29.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch3.png b/docs/build/html/_images/autodep_arch3.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch3.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch30.png b/docs/build/html/_images/autodep_arch30.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch30.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch31.png b/docs/build/html/_images/autodep_arch31.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch31.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch32.png b/docs/build/html/_images/autodep_arch32.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch32.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch33.png b/docs/build/html/_images/autodep_arch33.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch33.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch34.png b/docs/build/html/_images/autodep_arch34.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch34.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch35.png b/docs/build/html/_images/autodep_arch35.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch35.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch36.png b/docs/build/html/_images/autodep_arch36.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch36.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch37.png b/docs/build/html/_images/autodep_arch37.png
new file mode 100644
index 0000000..3a9d310
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch37.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch38.png b/docs/build/html/_images/autodep_arch38.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch38.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch39.png b/docs/build/html/_images/autodep_arch39.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch39.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch4.png b/docs/build/html/_images/autodep_arch4.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch4.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch40.png b/docs/build/html/_images/autodep_arch40.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch40.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch41.png b/docs/build/html/_images/autodep_arch41.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch41.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch42.png b/docs/build/html/_images/autodep_arch42.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch42.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch43.png b/docs/build/html/_images/autodep_arch43.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch43.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch44.png b/docs/build/html/_images/autodep_arch44.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch44.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch45.png b/docs/build/html/_images/autodep_arch45.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch45.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch46.png b/docs/build/html/_images/autodep_arch46.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch46.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch47.png b/docs/build/html/_images/autodep_arch47.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch47.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch48.png b/docs/build/html/_images/autodep_arch48.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch48.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch5.png b/docs/build/html/_images/autodep_arch5.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch5.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch6.png b/docs/build/html/_images/autodep_arch6.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch6.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch7.png b/docs/build/html/_images/autodep_arch7.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch7.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch8.png b/docs/build/html/_images/autodep_arch8.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch8.png
Binary files differ
diff --git a/docs/build/html/_images/autodep_arch9.png b/docs/build/html/_images/autodep_arch9.png
new file mode 100644
index 0000000..0a965ee
--- /dev/null
+++ b/docs/build/html/_images/autodep_arch9.png
Binary files differ
diff --git a/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png b/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png
new file mode 100644
index 0000000..7de9a01
--- /dev/null
+++ b/docs/build/html/_images/graphviz-1d7724071aa6c7e719d4a7dfbe5e67c8e2ce14a6.png
Binary files differ
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
new file mode 100644
index 0000000..6d9e4e8
--- /dev/null
+++ b/docs/build/html/_images/graphviz-338b456b762ba164f6da32145fa8824021aa744d.png
Binary files differ
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
new file mode 100644
index 0000000..56519ce
--- /dev/null
+++ b/docs/build/html/_images/graphviz-509ef36c80465decbfacbd606577688e01d7f7f8.png
Binary files differ
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
new file mode 100644
index 0000000..31e68d3
--- /dev/null
+++ b/docs/build/html/_images/graphviz-7d4cad14c55812f78f51e2aadd74c8006953ba91.png
Binary files differ
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
new file mode 100644
index 0000000..d798741
--- /dev/null
+++ b/docs/build/html/_images/graphviz-bd36c7a40132734a92167ffd31f6b6279ec648c0.png
Binary files differ
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
new file mode 100644
index 0000000..534f138
--- /dev/null
+++ b/docs/build/html/_images/graphviz-d8f3ab7a7bb23eac4fcdf217185fce2c8149cab7.png
Binary files differ
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 &mdash; Autodep v0.1 documentation</title>
+ <title>helpers.colorize_output &mdash; 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> &raquo;</li>
+ <li><a href="../../index.html">Autodep</a> &raquo;</li>
<li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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">&quot;&quot;&quot;</span>
<span class="sd"> A class for printing colored strings</span>
<span class="sd"> &quot;&quot;&quot;</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> &raquo;</li>
+ <li><a href="../../index.html">Autodep</a> &raquo;</li>
<li><a href="../index.html" >Module code</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; Autodep v0.1 documentation</title>
+ <title>Overview: module code &mdash; 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> &raquo;</li>
+ <li><a href="../index.html">Autodep</a> &raquo;</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> &raquo;</li>
+ <li><a href="../index.html">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; 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> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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">&quot;&quot;&quot;</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">&quot;&quot;&quot;</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">&quot;</span><span class="se">\0</span><span class="s">&quot;</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">&quot;/proc/</span><span class="si">%d</span><span class="s">/stat&quot;</span> <span class="o">%</span> <span class="n">pid</span><span class="p">,</span><span class="s">&quot;r&quot;</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">&quot;)&quot;</span><span class="p">)[</span><span class="mi">1</span><span class="p">]</span> <span class="c"># find last &quot;)&quot; 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&quot;^(\w)&quot;</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">&quot;Failed to get check if process is zombie. Format of /proc/&lt;pid&gt;/stat is incorrect. Did you change a kernel?&quot;</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">&quot;Z&quot;</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">&quot;hooklib&quot;</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">&quot;&quot;&quot; run the program and get file access events &quot;&quot;&quot;</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">&#39;socket&#39;</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">&quot;Failed to create a socket for exchange data with the logger: </span><span class="si">%s</span><span class="s">&quot;</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">&quot;hooklib&quot;</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">&quot;fusefs&quot;</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">&quot;Unknown logging approach&quot;</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">&quot;Launch likely was unsuccessful&quot;</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">&quot;You pressed Ctrl+C!&quot;</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">&gt;</span><span class="mi">5</span><span class="p">):</span>
+ <span class="k">print</span> <span class="s">&quot;Sending SIGINT to child&quot;</span>
+ <span class="k">print</span> <span class="s">&quot;Press again in 5 seconds to force exit&quot;</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">&quot;Sending SIGKILL to child&quot;</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 &quot;\n\nEVENT\n\n&quot;</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 &quot;\n\nPASS\n\n&quot;</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 &quot;opened %d&quot; % client.fileno()</span>
+ <span class="c">#elif sock_event &amp; 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">&amp;</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 &quot;closed %d&quot;%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">&quot;</span><span class="se">\0</span><span class="s">&quot;</span><span class="p">)</span>
+ <span class="c">#if message[3]==&quot;compile&quot;: #and message[1]==&quot;debug&quot;:</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">&quot;ASKING&quot;</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 &quot;Allowing an access to %s&quot; % message[2]</span>
+ <span class="n">s</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="s">&quot;ALLOW</span><span class="se">\0</span><span class="s">&quot;</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">&quot;Blocking an access to </span><span class="si">%s</span><span class="s">&quot;</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">&quot;DENY</span><span class="se">\0</span><span class="s">&quot;</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">&quot;OK&quot;</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">&quot;read&quot;</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">&quot;write&quot;</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">&quot;ERR&quot;</span> <span class="ow">or</span> <span class="n">result</span><span class="o">==</span><span class="s">&quot;DENIED&quot;</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">&quot;ERR/2&quot;</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">&quot;DENIED&quot;</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">&quot;Error in logger module&lt;-&gt;analyser protocol&quot;</span>
+
+ <span class="k">except</span> <span class="ne">IndexError</span><span class="p">:</span>
+ <span class="k">print</span> <span class="s">&quot;IndexError while parsing </span><span class="si">%s</span><span class="s">&quot;</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 &quot;Interrupted system call&quot; 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">&quot;It seems like a logger module was unable to start or failed to finish</span><span class="se">\n</span><span class="s">&quot;</span> <span class="o">+</span> \
+ <span class="s">&quot;Check that you are not launching a suid program under non-root user.&quot;</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">&quot;Signal: </span><span class="si">%s</span><span class="s"> Exit status: </span><span class="si">%s</span><span class="s">&quot;</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> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; 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 &mdash; 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> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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 &lt;portage_lib_path&gt;/pym/_emerge/emergelog.py</span>
+<span class="n">log_path</span><span class="o">=</span><span class="s">&#39;/var/log/emerge.log&#39;</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">&quot;&quot;&quot;</span>
+<span class="sd"> Parses a log and finds first successfully merged packages chain</span>
+<span class="sd"> &quot;&quot;&quot;</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">&#39;&#39;</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">&#39;:&#39;</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">&#39;:&#39;</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">&lt;</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">&gt;</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">&quot;Started emerge on: &quot;</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">&quot;: &quot;</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">&quot;%b </span><span class="si">%d</span><span class="s">, %Y %H:%M:%S&quot;</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">&gt;</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">&quot;&gt;&gt;&gt; emerge &quot;</span><span class="p">):</span>
+ <span class="c"># string example: &gt;&gt;&gt; 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&quot;&gt;&gt;&gt; emerge \((\d+) of (\d+)\) (\S+) to&quot;</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">&quot;::: completed emerge (&quot;</span> <span class="o">+</span> <span class="n">current_package_num</span> <span class="o">+</span> <span class="s">&quot; of &quot;</span> <span class="o">+</span>
+ <span class="n">total_packages_num</span> <span class="o">+</span> <span class="s">&quot;) &quot;</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">&quot;Error while opening logfile. </span><span class="si">%s</span><span class="s">&quot;</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> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; 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 &mdash; 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> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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 &lt;zmedico@gentoo.org&gt; 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">&quot;&quot;&quot; class for accessing the portage api &quot;&quot;&quot;</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">&#39;vartree&#39;</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">&quot;UNUSED_&quot;</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">&quot;USE&quot;</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">&quot;RDEPEND&quot;</span><span class="p">,</span><span class="s">&quot;DEPEND&quot;</span><span class="p">]):</span>
+ <span class="c">#pkg=&quot;kde-meta&quot;</span>
+ <span class="c">#print self.vardb.match(&quot;&lt;sys-apps/paludis-0.26.0_alpha5&quot;)</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">&quot;bestmatch-visible&quot;</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 &quot;proceeding &quot;+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 &quot;proceeding2 &quot;+p</span>
+
+ <span class="n">dep_str</span> <span class="o">=</span> <span class="s">&quot; &quot;</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">&quot;ROOT&quot;</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">&#39;=&#39;</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">&#39;=&#39;</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> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; 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 &mdash; 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> &raquo;</li>
+ <li><a href="../index.html" accesskey="U">Module code</a> &raquo;</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">&quot;&quot;&quot;</span>
+<span class="sd"> Gets packages </span>
+<span class="sd"> </span>
+<span class="sd"> :</span>
+<span class="sd"> </span>
+<span class="sd"> &quot;&quot;&quot;</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">&quot;directory&quot;</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">&#39;qfile&#39;</span><span class="p">]</span><span class="o">+</span><span class="p">[</span><span class="s">&#39;--nocolor&#39;</span><span class="p">,</span><span class="s">&#39;--exact&#39;</span><span class="p">,</span><span class="s">&#39;&#39;</span><span class="p">,</span><span class="s">&#39;--from&#39;</span><span class="p">,</span><span class="s">&#39;-&#39;</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">&quot;</span><span class="se">\n</span><span class="s">&quot;</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">&quot;Noncritical error while launch qfile </span><span class="si">%s</span><span class="s">&quot;</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">&quot;</span><span class="se">\n</span><span class="s">&quot;</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&quot;^([^ ]+)\s+\(([^)]+)\)$&quot;</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">&quot;Util qfile returned unparsable string: </span><span class="si">%s</span><span class="s">&quot;</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">&quot;Error while launching qfile: </span><span class="si">%s</span><span class="s">&quot;</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">&#39;qlist&#39;</span><span class="p">]</span><span class="o">+</span><span class="p">[</span><span class="s">&#39;--nocolor&#39;</span><span class="p">,</span><span class="s">&quot;--obj&quot;</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">&quot;Noncritical error while launch qlist: </span><span class="si">%s</span><span class="s">&quot;</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">&quot;</span><span class="se">\n</span><span class="s">&quot;</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">&#39;&#39;</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">&quot;Error while launching qfile: </span><span class="si">%s</span><span class="s">&quot;</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> &raquo;</li>
+ <li><a href="../index.html" >Module code</a> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; 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 &mdash; Autodep v0.1 documentation</title>
+ <title>test &mdash; 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> &raquo;</li>
+ <li><a href="../index.html">Autodep</a> &raquo;</li>
<li><a href="index.html" accesskey="U">Module code</a> &raquo;</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> &raquo;</li>
+ <li><a href="../index.html">Autodep</a> &raquo;</li>
<li><a href="index.html" >Module code</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/build/html/_static/autodep_arch.png
Binary files differ
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 &mdash; Autodep v0.1 documentation</title>
+ <title>API &mdash; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</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=&lt;function defaultfilter at 0x1ac2b90&gt;</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> &#8211; name of program</li>
+<li><strong>arguments</strong> &#8211; list of program&#8217;s arguments</li>
+<li><strong>approach</strong> &#8211; a logging approach(&#8216;hooklib&#8217; or &#8216;fusefs&#8217;)</li>
+<li><strong>filterproc</strong> &#8211; 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>&#8216;open&#8217;</em>, <em>&#8216;read&#8217;</em> or
+<em>&#8216;write&#8217;</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-&gt;file information</strong>.
+File information is also a dictionary <strong>filename-&gt;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>&#8216;unknown&#8217;</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> &#8211; start time for searching(in seconds since 1970)</li>
+<li><strong>starttime</strong> &#8211; 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> &#8211; 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> &#8211; list of filenames</td>
+</tr>
+<tr class="field"><th class="field-name">Returns:</th><td class="field-body"><strong>dictionary</strong> file-&gt;package, if file doesn&#8217;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> &#8211; name of package</li>
+<li><strong>dep_type</strong> &#8211; type of dependencies to recurse. Can be [&#8220;DEPEND&#8221;] or
+[&#8220;RDEPEND&#8221;, &#8220;DEPEND&#8221;]</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> &#8211; 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> &#8211; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; Autodep v0.1 documentation</title>
+ <title>Internals &mdash; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</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>&lt;time of event: sec since 1970&gt;
+&lt;event type: open, read, write&gt;
+&lt;name of file&gt;
+&lt;building stage: stagename or unknown&gt;
+&lt;result:OK,ERR/errno,ASKING,DENIED&gt;</pre>
+</div>
+</li>
+<li><p class="first">Format of answer for ASKING packet from registrar:</p>
+<div class="highlight-python"><pre>&lt;ALLOW | DENY&gt;</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&#8217;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
+&#8220;file not found&#8221; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; Autodep v0.1 documentation</title>
+ <title>Index &mdash; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; Autodep v0.1 documentation</title>
+ <title>Autodep’s documentation &mdash; 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> &raquo;</li>
+ <li><a href="#">Autodep</a> &raquo;</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> &raquo;</li>
+ <li><a href="#">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; Autodep v0.1 documentation</title>
+ <title>Introduction &mdash; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</li>
</ul>
</div>
@@ -240,7 +240,7 @@ accessed:</p>
title="previous chapter">Autodep&#8217;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> &#8211; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; 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> &raquo;</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] &lt;command&gt;</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&#8217;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">&nbsp;</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 &#8211;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 &#8211;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 &#8211;fusefs &#8211;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> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; 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
index 3e01c3e..d1cea9d 100644
--- a/docs/build/html/objects.inv
+++ b/docs/build/html/objects.inv
Binary files differ
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 &mdash; Autodep v0.1 documentation</title>
+ <title>Python Module Index &mdash; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</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>&nbsp;</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>&nbsp;&nbsp;&nbsp;
- <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>&nbsp;</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>&nbsp;&nbsp;&nbsp;
+ <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>&nbsp;&nbsp;&nbsp;
+ <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>&nbsp;&nbsp;&nbsp;
+ <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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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 &mdash; Autodep v0.1 documentation</title>
+ <title>Search &mdash; 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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</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> &raquo;</li>
+ <li><a href="index.html">Autodep</a> &raquo;</li>
</ul>
</div>
<div class="footer">
&copy; 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&#8217;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&#8217;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 &mdash; 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> &raquo;</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> &raquo;</li>
+ </ul>
+ </div>
+ <div class="footer">
+ &copy; 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/man/autodep.1 b/docs/build/man/showfsevents.py.1
index 6f1a7bb..3723d1e 100644
--- a/docs/build/man/autodep.1
+++ b/docs/build/man/showfsevents.py.1
@@ -1,6 +1,6 @@
-.TH "AUTODEP" "1" "July 24, 2011" "0.1" "Autodep"
+.TH "SHOWFSEVENTS.PY" "1" "July 25, 2011" "0.1" "Autodep"
.SH NAME
-autodep \- Autodep Documentation
+showfsevents.py \- auto dependency builder for Gentoo
.
.nr rst2man-indent-level 0
.
@@ -30,54 +30,16 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
..
.\" Man page generated from reStructeredText.
.
-.INDENT 0.0
-.TP
-.B author
-.
-Alexander Bersenev <\fI\%bay@hackerdom.ru\fP>
-.UNINDENT
-.sp
-Contents:
-.SH ARCHITECTURE -- INTERNALS
-.sp
-hello
-.sp
-Output colorizing
-.INDENT 0.0
-.TP
-.B class helpers.colorize_output.color_printer(enable_colors=True)
-.sp
-A class for printing colored strings
-.UNINDENT
-.INDENT 0.0
-.TP
-.B helpers.colorize_output.enumerate(sequence[, start=0])
-.sp
-Return an iterator that yields tuples of an index and an item of the
-\fIsequence\fP. (And so on.)
-.UNINDENT
-.SH API
+.SH SYNOPSIS
.sp
-hello
+\fBshowfsevents.py\fP [options] <command>
+.SH DESCRIPTION
.sp
Auto dependency builder is a tool for analysis files accessed during
building a package. It also can be used for runtime dependencies analysis.
.sp
The tool can block an access to files of defined packages.
-.sp
-It is released under GNU GPL license.
-.sp
-Autodep is in active developing.
-.IP Note
-.
-TODO: make an overlay and ebuild
-.RE
-.sp
-.nf
-.ft C
-showfsevents.py [options] <command>
-.ft P
-.fi
+.SH OPTIONS
.INDENT 0.0
.TP
.B \-\-help, \-h
@@ -92,19 +54,19 @@ block an access to files from this packages
.UNINDENT
.INDENT 0.0
.TP
-.B \-f , \-\-files
+.B \-f, \-\-files
.sp
show accessed files and not founded files
.UNINDENT
.INDENT 0.0
.TP
-.B \-v , \-\-verbose
+.B \-v, \-\-verbose
.sp
show non\-important packages, show unknown package and unknown stage
.UNINDENT
.INDENT 0.0
.TP
-.B \-C , \-\-nocolor
+.B \-\-nocolor, \-C
.sp
don\(aqt output color
.UNINDENT
@@ -120,14 +82,12 @@ use ld_preload logging approach(default)
.
use fuse logging approach(slow, but reliable)
.UNINDENT
-.sp
-Example: showfsevents.py \-b lsof,cowsay emerge bash
+.SH HOOKLIB VS FUSEFS
.TS
center;
|l|l|l|.
_
T{
-Сriterion
T} T{
Hooklib
T} T{
@@ -155,21 +115,62 @@ Is overhead in performance big?
T} T{
\fBNO\fP
T} T{
-YES
+YES [1]
+T}
+_
+T{
+What events are logged?
+T} T{
+Most [2]
+T} T{
+\fBALL\fP
+T}
+_
+T{
+When is it recomended to use an approach?
+T} T{
+For analysis
+of
+\fIbuildtime\fP
+dependencies
+T} T{
+For analysis
+of \fIruntime\fP
+dependencies
+T}
+_
+T{
+Is any pre\-requirements for using an approach?
+T} T{
+\fBNO\fP
+T} T{
+FUSE must be
+enabled in
+kernel
T}
_
.TE
-.INDENT 0.0
-.IP \(bu 2
-.
-\fIgenindex\fP
-.IP \(bu 2
+Notes
+.IP [1] 5
.
-\fImodindex\fP
-.IP \(bu 2
+Fuse file system is slower than normal one. Program reads many files
+while launching, so this will take more time than usual.
+.IP [2] 5
.
-\fIsearch\fP
-.UNINDENT
+Loading of dynamic libraries and direct syscalls will not be logged.
+.SH EXAMPLES
+.SS Get the potential dependencies of a xchat package:
+.sp
+showfsevents.py emerge xchat
+.SS Get the potential dependencies of a xchat package, blocking x11\-misc/util\-macros package:
+.sp
+showfsevents.py emerge \-\-block x11\-misc/util\-macros emerge xchat
+.SS Get the potential dependencies of a xchat package, and show files accessed:
+.sp
+showfsevents.py \-\-files emerge xchat
+.SS Get the runtime dependencies of a xchat and show files accessed:
+.sp
+showfsevents.py \-\-fusefs \-\-files xchat
.SH AUTHOR
Alexander Bersenev
.SH COPYRIGHT
diff --git a/docs/source/_static/autodep_arch.png b/docs/source/_static/autodep_arch.png
new file mode 100644
index 0000000..d0bfee9
--- /dev/null
+++ b/docs/source/_static/autodep_arch.png
Binary files differ
diff --git a/docs/source/api.rst b/docs/source/api.rst
index 908c3aa..4a0a626 100644
--- a/docs/source/api.rst
+++ b/docs/source/api.rst
@@ -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/source/architecture.rst b/docs/source/architecture.rst
index 38e1319..59b55f8 100644
--- a/docs/source/architecture.rst
+++ b/docs/source/architecture.rst
@@ -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/source/conf.py b/docs/source/conf.py
index 914ab5a..12fdf8e 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -1,23 +1,7 @@
# -*- coding: utf-8 -*-
#
-# Autodep documentation build configuration file, created by
-# sphinx-quickstart on Sat Jul 23 18:33:12 2011.
-#
-# This file is execfile()d with the current directory set to its containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
import sys, os
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
sys.path.insert(0, os.path.abspath('../../src/autodep'))
-#print os.path.abspath('../../src/autodep')
# -- General configuration -----------------------------------------------------
@@ -26,16 +10,14 @@ sys.path.insert(0, os.path.abspath('../../src/autodep'))
# Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
-extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode']
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.intersphinx', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.viewcode', 'sphinx.ext.graphviz']
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
-# The suffix of source filenames.
source_suffix = '.rst'
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
+source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
@@ -104,10 +86,10 @@ html_theme = 'default'
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
-#html_title = None
+html_title = 'Autodep documentation'
# A shorter title for the navigation bar. Default is the same as html_title.
-#html_short_title = None
+html_short_title = 'Autodep'
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
@@ -125,7 +107,7 @@ html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
+html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
@@ -212,7 +194,7 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
- ('index', 'autodep', u'Autodep Documentation',
+ ('man', 'showfsevents.py', u'auto dependency builder for Gentoo',
[u'Alexander Bersenev'], 1)
]
diff --git a/docs/source/man.rst b/docs/source/man.rst
new file mode 100644
index 0000000..ca7fdab
--- /dev/null
+++ b/docs/source/man.rst
@@ -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/src/autodep/__init__.py b/src/autodep/__init__.py
deleted file mode 100644
index e69de29..0000000
--- a/src/autodep/__init__.py
+++ /dev/null
diff --git a/src/autodep/helpers/colorize_output.py b/src/autodep/helpers/colorize_output.py
index fb4c9c4..3b8af17 100644
--- a/src/autodep/helpers/colorize_output.py
+++ b/src/autodep/helpers/colorize_output.py
@@ -1,12 +1,17 @@
#!/usr/bin/env python
-# color output support
+""" Output colorizing """
+
class color_printer:
+ """
+ A class for printing colored strings
+ """
# HEADER = '\033[95m'
# OKBLUE = '\033[94m'
# OKGREEN = '\033[92m'
# FAIL = '\033[91m'
-
+
+ ## \param enable_colors activate color output
def __init__(self, enable_colors=True):
if enable_colors:
self.COLOR2CODE={"warning":'\033[91m', "text":'\033[90m'}
@@ -14,5 +19,8 @@ class color_printer:
else:
self.COLOR2CODE={"warning":'', "text":''}
self.ENDCOLOR=''
+ ## Prints a colored message
+ # \param importance is a string "warning" or "text". Color depends on it
+ # \param msg is a message to print
def printmsg(self,importance,msg):
print self.COLOR2CODE[importance] + str(msg) + self.ENDCOLOR,
diff --git a/src/autodep/helpers/events_analysis.py b/src/autodep/helpers/events_analysis.py
index e4cb342..2928aad 100644
--- a/src/autodep/helpers/events_analysis.py
+++ b/src/autodep/helpers/events_analysis.py
@@ -1,6 +1,8 @@
#!/usr/bin/env python
-# some heuristics here to cut few packets
+
+
+## some heuristics here to cut few packets
def is_package_useful(pkg,stages,files):
# test 1: package is not useful if all files are *.desktop or *.xml or *.m4
for f in files:
diff --git a/src/autodep/logfs/fstracer.py b/src/autodep/logfs/fstracer.py
index 7eca160..ef185b8 100644
--- a/src/autodep/logfs/fstracer.py
+++ b/src/autodep/logfs/fstracer.py
@@ -1,6 +1,9 @@
#!/usr/bin/env python2
"""
-This module is a bridge between low-level logging services and high level handling dependency logic
+This module is a bridge between low-level logging services and high level
+handling dependency logic.
+
+It can be used to launch a program and get all file events
"""
import os
@@ -13,8 +16,6 @@ import select
import re
import signal
-import proc_helpers
-
import logger_hooklib
import logger_fusefs
@@ -25,23 +26,6 @@ def parse_message(message):
ret=message.split("\0")
return ret
-# check if proccess is finished
-def checkfinished(pid):
- if not os.path.exists("/proc/%d/stat" % pid):
- return True
-
- try:
- pid_child,exitcode = os.waitpid(pid, os.WNOHANG)
- except OSError, e:
- if e.errno == 10:
- return False
- else:
- raise
-
- if pid_child==0:
- return False
- return True
-
#check if process is zombie
def iszombie(pid):
try:
@@ -60,49 +44,31 @@ def iszombie(pid):
except IOError,e:
return True
-
-# uses /proc filesystem to get pid of parent
-# it is not used in program. Using function on C instead
-def getparentpid(pid):
- try:
- statfile=open("/proc/%d/stat" % pid,"r")
- line=statfile.readline()
- statfile.close()
- line=line.rsplit(")")[1] # find last ")" char
- line=line.strip()
- match=re.match(r"^\w\s(\d+)",line)
- if match==None:
- print "Failed to get parent process. Format of /proc/<pid>/stat is incorrect. Did you change a kernel?"
- return 1
-
- return int(match.group(1))
-
- except IOError,e:
- return 1
-
-#check if message came from one of a child
-def checkparent(parent,child):
- #print "Parent %s, child %s"%(parent,child)
- if child==1 or getparentpid(child)==1:
- return True
-
- currpid=child
-# for(pid=getpid();pid!=0;pid=__getparentpid(pid))
- while getparentpid(currpid)!=1:
- currpid=getparentpid(currpid)
- if currpid==parent:
- return True
-
- print "External actions with filesystem detected pid of external prog is %d" % child
- return False
-
-
# default access filter. Allow acess to all files
def defaultfilter(eventname, filename, stage):
return True
-# run the program and get file access events
def getfsevents(prog_name,arguments,approach="hooklib",filterproc=defaultfilter):
+ """
+ Launches a program and gets file access events
+
+ :param prog_name: name of program
+ :param arguments: list of program's arguments
+ :param approach: a logging approach('hooklib' or 'fusefs')
+ :param filterproc: filter function, this function should take 3 strings:
+ name of event, name of file and stage, and return a *True* if event is
+ allowed and *False* instead. Name of event is one of *'open'*, *'read'* or
+ *'write'*. Default function always returns *True*.
+ :returns: **list** with two elements - *success* events and *failed* events.
+ Each element is dictionary **stage->file information**.
+ File information is also a dictionary **filename->type of events**.
+ Type of events for success events is a 2-element tuple: *(was file readed,
+ was file writed)*. For failed events it is also 2-element tuple:
+ *(was file not found, was file blocked by filterproc)*. Each element of
+ tuple can be *True* or *False*. Both elements of tuple can be *False*.
+ Stage can be *'unknown'*
+ """
+
events={}
# generate a random socketname
tmpdir = tempfile.mkdtemp()
diff --git a/src/autodep/package_utils/portage_log_parser.py b/src/autodep/package_utils/portage_log_parser.py
index 3854996..c0f0820 100644
--- a/src/autodep/package_utils/portage_log_parser.py
+++ b/src/autodep/package_utils/portage_log_parser.py
@@ -9,6 +9,14 @@ import time
log_path='/var/log/emerge.log'
def get_list_of_merged_packages(starttime=0,endtime=-1):
+ """
+ Parses an emerge log and finds first successfully merged packages chain
+
+ :param starttime: start time for searching(in seconds since 1970)
+ :param starttime: end time for searching(in seconds since 1970).
+ :returns: **list** of package names
+
+ """
ret=[]
try:
log=open(log_path)
diff --git a/src/autodep/package_utils/portage_misc_functions.py b/src/autodep/package_utils/portage_misc_functions.py
index 4d63de4..c090d89 100644
--- a/src/autodep/package_utils/portage_misc_functions.py
+++ b/src/autodep/package_utils/portage_misc_functions.py
@@ -10,7 +10,9 @@ from _emerge.main import parse_opts
class portage_api:
+ """ class for accessing the portage api """
def __init__(self):
+ """ test """
self.settings=portage.config(clone=portage.settings)
self.vartree=portage.db[portage.root]['vartree']
self.vardb=self.vartree.dbapi
@@ -20,6 +22,14 @@ class portage_api:
# recursive dependency getter
def get_deps(self,pkg,dep_type=["RDEPEND","DEPEND"]):
+ """
+ Gets current dependencies of a package on any depth
+
+ :param pkg: name of package
+ :param dep_type: type of dependencies to recurse. Can be ["DEPEND"] or
+ ["RDEPEND", "DEPEND"]
+ :returns: **set** of packages names
+ """
#pkg="kde-meta"
#print self.vardb.match("<sys-apps/paludis-0.26.0_alpha5")
#metadata = dict(zip(self.metadata_keys, self.vardb.aux_get(pkg, self.metadata_keys)))
@@ -67,8 +77,12 @@ class portage_api:
unknown_packages.add(pkg)
return ret
- # returns all packages from system set. They are always implicit dependencies
def get_system_packages_list(self):
+ """
+ returns all packages from system set. They are always implicit dependencies
+
+ :returns: **list** of package names
+ """
ret=[]
for atom in self.settings.packages:
for pre_pkg in self.vartree.dep_match(atom):
@@ -77,8 +91,14 @@ class portage_api:
ret.append(pkg)
return ret
- # call emerge arguments parser
def parse_emerge_args(self,args):
+ """
+ call emerge arguments parser
+
+ :param args: arguments passed to emerge
+ :returns: **tuple** (action string, options dictionary, files or atoms
+ list)
+ """
action, opts, files = parse_opts(args, silent=True)
return action, opts, files
diff --git a/src/autodep/package_utils/portage_utils.py b/src/autodep/package_utils/portage_utils.py
index c98ce1d..5401d99 100644
--- a/src/autodep/package_utils/portage_utils.py
+++ b/src/autodep/package_utils/portage_utils.py
@@ -5,6 +5,11 @@ import subprocess
import re
def getpackagesbyfiles(files):
+ """
+ :param files: list of filenames
+ :returns: **dictionary** file->package, if file doesn't belong to any
+ package it not returned as key of this dictionary
+ """
ret={}
listtocheck=[]
for f in files:
@@ -41,6 +46,11 @@ def getpackagesbyfiles(files):
return ret
def getfilesbypackage(packagename):
+ """
+
+ :param packagename: name of package
+ :returns: **list** of files in package with name *packagename*
+ """
ret=[]
try:
proc=subprocess.Popen(['qlist']+['--nocolor',"--obj",packagename],
diff --git a/src/autodep/showfsevents.py b/src/autodep/showfsevents.py
index 1d7834f..518eed8 100755
--- a/src/autodep/showfsevents.py
+++ b/src/autodep/showfsevents.py
@@ -10,8 +10,12 @@ import logfs.fstracer
from helpers import colorize_output, events_analysis
from package_utils import portage_utils, portage_misc_functions, portage_log_parser
-# dies if bad args
def parse_args():
+ """
+ This function parses an input args
+ It dies if bad args passed
+ """
+
args_parser=optparse.OptionParser("%prog [options] <command>")
args_parser.add_option("-b", "--block",action="store", type="string",
dest="packages", default="",