diff -rupN src\Whyteboard/hashes.db src\Whyteboard-integrity/hashes.db --- src\Whyteboard/hashes.db 1969-12-31 19:00:00.000000000 -0500 +++ src\Whyteboard-integrity/hashes.db 2010-11-28 17:09:09.792600000 -0500 @@ -0,0 +1 @@ +hash_dict = {'.\\locale\\hi\\LC_MESSAGES': {'whyteboard.mo': '349bbf9bde46209afa0620edd608b484c8a4fc55e01141e8ce6ed25ee46856ed'}, '.\\whyteboard\\gui': {'__init__.pyc': 'e8891609b1f2d34a56709745c31cb349d5167cd81509840441ad030c74ec22d0', 'printing.pyc': '516fccd12be3b4c01faf28284969bbae313e8c2d3d72b2ca54c2ff56afe9c115', 'event_ids.pyc': '35a87d78268c90674fd3ebb400e666618b84ec8f11de1cff47b667f4d9dddead', 'popups.pyc': 'bf1397f26467d623b8183e21c45dfbe49b4d49b4150e1e0d461a84c9701d0d27', 'menu.py': '3c54e46b9a122b1b2e5af6b7f8a3f29489b716fc7f4567af15aaf72f499768e0', 'menu.pyc': 'ef6643c75a8600ac1cfcdfa03085a4477f3976e0334455c28c468273bf2946b6', 'frame.pyc': 'd56cc95dc20847695ec6960610a4454a22bcb9d5ba993ba58d6a2b73b58bc40c', 'event_ids.py': '51a3d74482ec5c0bdcf6ddc0862a3a0797dafee8e7151fdb1dcfd04fe8e75bb1', 'preferences.pyc': '48044df147b30fab200992848ccb4c5cf8e82ebde99b712649bddcd0cd9391b3', 'panels.pyc': 'd0d3c5b8ce5eccd7835e11a821089ed7876157041b5ba413cfeac8b5f703437b', 'canvas.pyc': 'd5dc593c206fbab741c1cc7aeb3f966bde3c3391ad2ba94d5eaf2b58a6d09af0', 'popups.py': '060ec1e04da5fc6624d853bbe25d84498c5dbeddacc58ae14a97cfc808f012dc', 'panels.py': '6151211e2de75d1629ff414cd2421a179d530bcb03d7ba862b44804ba536d3a4', 'sheets.py': 'e62a697c7f74c7df859271a88b98a95dc401f064fa3cabaa25c9680631d2efe0', 'app.pyc': '366eac4b4f03f2f4181c311f0e7de035867fb56c8a0da06d5e176e8bdc927544', 'canvas.py': '4aaea0fefde9f05576d051b1538100378382025351ab82e8c13a6b5a6d557c01', 'preferences.py': '5db578dbdfa45edff932b13abedb17aa281c250c28770f7263facb9377427f76', 'frame.py': 'bba128353315cae9451ae4d1df5cbe33469c04140d3c21140c8488b5135cafd1', 'dialogs.py': '24a597b74a7dc0715be94fa1cc80bb279fea5afb8c95eabb4a925b01ea7b9126', 'dialogs.pyc': 'c8ccad9d22365d7e5d98acad305009b54c6a0e250df77c0981c7e801ca01ff8a', '__init__.py': '84fdcab41ca00ce3d6a780a7694e83efc747f49ef10ce28f8a3b7fdc937917b1', 'app.py': '75118ee210fdc798fd37b66d3b8b9c9c06fb2624b53dbef3c0d70e579824040d', 'printing.py': '1769795996d49d6694c7665bc77316c6a721d34bbadf63abdb45b993e503682a', 'sheets.pyc': '1eac90e7997cc3e422800a98e46f6a7d7d1639de081d9338fb8bdcf73a97071c'}, '.\\whyteboard': {'__init__.pyc': '5354192a3f1448c36d7a2542bad5aa6bd5481501d2015fbc2653499b50c1495a', 'tools.py': '9dd4ad738a2aeac9a8837ca42c240273c41788dd2bee34d45e7544227c9addb3', '__init__.py': 'd3b1cbc0b245ad1832d801f06579e09790e0e304b0e7041ef5e296e80d79fa92', 'tools.pyc': '92e9a9c90833b7365d56ca71d0b3927c4b4fcad4a6468617e6d645df3d1b4104'}, '.\\images\\tools': {'media.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'highlighter.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'pen.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'line.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'text.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'polygon.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'eraser.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'circle.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'select-rectangular.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'ellipse.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'zoom.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'eyedrop.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'rounded-rect.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'flood.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'note.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'rectangle.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'arrow.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'select.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707'}, '.\\whyteboard\\misc': {'utility.pyc': 'f94044984d5bf6fd8d1e18b0e7f6a7cfd5ec230a33b41574fd4a68943f0986a7', '__init__.pyc': '14c1af173bbd48612240bf4b3b04729b430207f3ad4287c5bb5fb3420f3dd560', 'functions.py': '209f2e0f705c0209ff61d1c290d041c1d7fc5b00a79fd5ceb1055f8e51f5ee80', 'functions.pyc': 'dc1acdbe01950ca6bd8759ad4eeb6881f210dc0de9b11ab92daf24359f46295f', 'topic_tree.py': 'a7c7629d84a8e6cd04b447d25b5d814913a49f2561ae12c406b97424bfaadd80', '__init__.py': '31b8f0f8859dab0dca785eb436b1c8631da3c55f2944e263bbfabdde3e2933f4', 'meta.py': 'c545b9eace476ddbb228e392c156b2633b2df9cbb5735b2ea506df570803773e', 'meta.pyc': '7ed2868d91d9b52237acc9ff22a8ec64160586ab80f733ecebf557aaee29c263', 'undo.py': 'ec9cf903794f7c65c3b2a5f991e08a8ad2700d9a62213b432039ba22d6133448', 'utility.py': 'c8cb2ca0ee84cda998780244f8644ee043e934ca3d2fb6d0cab389e35a6ae561'}, '.\\locale\\de': {}, '.\\images': {}, '.\\locale\\fr': {}, '.\\locale\\zh_TW\\LC_MESSAGES': {'whyteboard.mo': '24b5c7fe02c34d5a520f700512951eefbf259dd5ce20a987a76ad22027ca716b'}, '.\\locale\\cs': {}, '.\\locale\\nl\\LC_MESSAGES': {'whyteboard.mo': '5e8ba03139155ae0777396e3c8f7815d9dcd0505dacb3941bb7df7f8cd9425af'}, '.\\locale\\pt\\LC_MESSAGES': {'whyteboard.mo': '9fa2b5cb3a23498d85dbbcabc7b40a9192d717f879124adff94efa30b866fb9f'}, '.\\locale\\hi': {}, '.\\locale\\ja': {}, '.\\locale\\en_GB': {}, '.': {'whyteboard.py': '328ea5e25778fcecd0068dbc57a4db7218b1bcc880ccc34586675fe309d93f13', 'TODO.txt': 'cf1e64dd01cc032a5628c75914c1ccdfe6849eb7a1a39a9e833785ddb4d46170', 'DEVELOPING.txt': '8c3e459c8da3fdac887694b19c3000689513ff58f532f034ebb71b2043be9c7e', 'CHANGELOG.txt': '60aea81a6dc2640613924ba7b5ad7568d7afe1359181d45b020f2373209d756d', 'integrity.py': '83f7dc41d5b2e55eb36b3c3a5150db0c818ae8f9c2886e992ee2a289bf4ca035', 'integrity.pyc': '81a013b58abc58d2f8949e569e8b968f5930ba89c88cae3a0036bd9cd7a1044a', 'LICENSE.txt': '8ceb4b9ee5adedde47b31e975c1d90c73ad27b6b165a1dcd80c7c545eb65b903', 'README.txt': '2bb874cce66a379f24123d7f3abf95e720843eb73c4e1344cc4cb2da22900495'}, '.\\locale\\nl': {}, '.\\locale\\de\\LC_MESSAGES': {'whyteboard.mo': '662521b86d252634af047cd24a6ef7d143b6130a1407b2f2bfbdf701d4045f94'}, '.\\images\\icons': {'move-bottom-small.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'move-down-small.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'move-up.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'stop.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'pause.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'move-bottom.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'move-up-small.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'swap_colours.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'move-top.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'move-top-small.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'prev_sheet.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'delete.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'next_sheet.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'play.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'cursor.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707', 'move-down.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707'}, '.\\locale\\cy\\LC_MESSAGES': {'whyteboard.mo': '07d9742c50241c3e0d1232c01041a7be24eac64b60a7c4eb401ee3f3393f8876'}, '.\\locale\\ar\\LC_MESSAGES': {'whyteboard.mo': 'a59dbb5ea2527cd37a7bd1cee6f46eea9aaeb2a1164f06011367b192a38851d9'}, '.\\locale\\en_GB\\LC_MESSAGES': {'whyteboard.mo': '36e10a080a05d4ef306a1794c714ea5d0a10a2bf591330a8d06accb8c7fe53d9'}, '.\\locale': {}, '.\\locale\\ru\\LC_MESSAGES': {'whyteboard.mo': '3d649d059655a3d26119ee72d398a9fc9678f85a0fda8d31f92af0e686a4ef3f'}, '.\\locale\\zh_TW': {}, '.\\locale\\gl': {}, '.\\whyteboard\\lib\\pubsub': {'__init__.pyc': '26b83490aa1464eb4bcdb56eb7c94dba9765ace229629b73d918758120e84205', 'pubsubconf.pyc': '4f2ef31c3be1cc1b19cbeba744b9a909ae898d378ef9b475d22c77e55c3b0890', 'pub.pyc': '8d466bdf3d1442be29169d22d2b0245662be4f206aa1406553a20c7524599883', '__init__.py': '548a34896d3f5b8bb757d53edfbcebd7d1803e4d688e38623b8426d841a779c3', 'pubsubconf.py': '7bba18f102d73514c47236b3fbb9e5248873ee0b65bd6fe6357e328ada5d6f4b', 'pub.py': 'cd3e9548c148a43e6c90a13647ea574050479e4b9359597b6e4bdd8564f1f6c2'}, '.\\locale\\it\\LC_MESSAGES': {'whyteboard.mo': '88d9e94fae6324925be27735b45c5d1867de6a79d362ca65c168c65761ac1ce2'}, '.\\whyteboard\\lib': {'dragscroller.py': '9dc1dedfdfa6b93c6ebd7c3d9617eb54f43487c5ffb2f9ea0d3e4f762b2b8e07', '__init__.pyc': 'a11b3f8050bba1e43f41b445f722ba5c310cb65f5b25395596df2aa5c96512a2', 'flatnotebook.pyc': '1b6502b9162f36c22f1273cd68274f88995a28546a48846fc9b969339e1ae8d5', '__init__.py': '4ca236cc478c2f98409c67bed2c874aa220c24d53820ad498238fecf39a40163', 'errdlg.pyc': '37dc440fe610a155ef93cdaf764e2854634b83314017fc2338620119e6785db9', 'flatnotebook.py': '3360e68f12230ac4df8a0623bc787617feceebe0ea69790238f00c3d5b8da17a', 'mock.py': 'd3fb67a5a4f79b924bd53eb100c66b3ce40ad82d198ed8af4887d9aea1ba1ddc', 'mock.pyc': '69a46de0470418b851c37f3a5f32921390930cc48d0e662d2c2830f808b372bd', 'icon.pyc': '23c0b50933725157319e198fc7480fe8d24f72282eedbcc616c3bb0630bc369d', 'configobj.pyc': 'cfbed3fe78a82ff847a4c36a0df036008d3e0ce860ac50efb94ab5be34dfcd09', 'dragscroller.pyc': 'b361233359da9f610e93d89db41bb2c67d055d256f9461f07fd416a733e80aba', 'pubsubconf.py': '7bba18f102d73514c47236b3fbb9e5248873ee0b65bd6fe6357e328ada5d6f4b', 'configobj.py': '05880472b1fb531c7b7245681fdd82fed7f619a3dbbb3ac78678c2acf9b4ba4e', 'icon.py': 'b7a9c00d07fdd232fc228bb73c91cbd2d311d2633b4b19e3347c7726421a3004', 'validate.py': '78d39e633bb1125a2fe994ddae14a69854bc245ea85a7b1dcf923e7ac185732a', 'validate.pyc': 'b1b542f44ad1949374f268f3ee94c385a1295baf20d58f5430644dc15258f5ee', 'errdlg.py': 'e0dd52ddbecf932a040a9a6d2719b1075f639fe85024e19c42d06fcdba19a96a'}, '.\\whyteboard\\lib\\pubsub\\utils': {'utils.py': 'be1ed7b6b3412d8301b46c690a1dae1aa1dde1d1b9d74fc38645ceca02adc4f0', 'topicspec.py': '822a5cea64b61213d09e519832b044e3ef372ee8524dce2e6ea6d43dcef77266', '__init__.py': '6e0fea7b595a454e7cd4c80b1437abaf45f468894371ef51283f064f4b29c3d8', 'exchandling.py': '0e270a6ed29cc520f8fb8a5be8ef5b87d8aba640f7e01b56f69a5bfd364ab898', 'notification.py': '4dab4955da21fcc18076ade81a09332b9ce2759ef8b665a75f6bd0ff713fa739'}, '.\\integrity': {}, '.\\locale\\ja\\LC_MESSAGES': {'whyteboard.mo': '9191318392455f2736a962d0847dd2a6a66357e37951de30952cadde23f54600'}, '.\\locale\\cs\\LC_MESSAGES': {'whyteboard.mo': 'dc849dd3b451d696b48f4e9acd880b519ac0ae931b2d4751c1f4302e37e0780f'}, '.\\locale\\es\\LC_MESSAGES': {'whyteboard.mo': '80c89cadb680144f5b4fbf19d82c148fbd1fc82029fa284d34f64ac58fe5e398'}, '.\\locale\\es': {}, '.\\whyteboard-help': {'notes.htm': '2aa4bb5be05668b1d71aff74d44cc6c58109ff23f01cd65984ec64c495a0ff1e', 'drawing.htm': 'c53a208e33afeab713c5fc1d6d506aea0e044c8ab1d79535b7b9f919c51a26cd', 'index.html': '08a55fdbd51a6e31a4d65c2d19917be79e19983eae64f33e19d53095b29f2dc0', 'Index.hhk': '9dea7b046bdfd9c96d9096a717aa14a3f6a325af19fec2993bf29a806ac85d83', 'whyteboard.hhp': 'bdeda75149878b4ec4fc72be067a1d2ec39b873236d28f11e0b209af7b8e8b3b', 'select.htm': '109ee26fd7219f49d20bbdeab33fb1bd808d22c774e1659f691bf6a0bda58ddb', 'preferences.htm': '8fbf03b68c5558b2715b5852ea8b554f79e0a7cb61c9b51ddb2eb7985e951c46', 'contents.hhc': '8883127b46295b4c3d282250291d39e4c242273cd028206a02b12710e22504b7', 'menu.htm': 'f374a6dcb4f8f078c614f240b02f4000a24df6ee9d5fecaa17e4401626487249', 'main.htm': 'a7122537b160608dd4bb75f742c1be0704224c9c2c04ddf2932dcd7107e17dea', 'saving.htm': '98c33c1601312fbe5d4e8bc35d8075902ba322c6ff809f273c48f4589932d0da', 'pdfs.htm': '75220577770e5e48f832926eb17aac6c41bb6dedff45a1c8bc73b247d3242992', 'misc.htm': '0da9fb2dc7affdd1b58b79e1f40c081c3c5036984fad56879f8404f7da77cb9a', 'shape_viewer.htm': '682db55e3fd4d7322e2338d69302aeb0b9c45546b0c0572f768a5bfeeeda4f38'}, '.\\locale\\ar': {}, '.\\whyteboard\\lib\\pubsub\\core': {'__init__.pyc': '6aa4a997a3bc9543d088b1f34e19818296c763144720f5db4a6c9b60918281bc', 'pubsub1.py': '055698708711efadbe311b4881de03c5ad7b4dfb07a6ed46a263de1ef431e1ea', 'callables.pyc': '8689de96a1e661af6100d12c9d5292d62d9f61adcfa64c13c0b616653ef76275', 'pubsub2.py': 'eb9f13e6478d790ec8e2966ad331996e7ffcd0246f2b989165638802251bae71', 'topicargspec.py': '027fcf6c1d9ac9d8079910a8c8f9371703f98ab8ec9d6ee67911c8ee1761fad8', 'topics.pyc': 'a97b4a21f88643760c49a2b68c70e61338149a5cc9a516c0ce5efa1e74829c6f', 'pubsubconf.py': '7bba18f102d73514c47236b3fbb9e5248873ee0b65bd6fe6357e328ada5d6f4b', 'topics.py': 'acc61d72c68a3cef51c354fc6c3eedd846d7ae74314036c5d18a920d17cc87ff', 'weakmethod.pyc': '4b9aa254edeeb86e13bb4a2d3fb52f90bd7f75229f0e4998a6ba5ecc52d92cf0', 'topicutils.pyc': 'fbb02dd0d6d74a20553e5fc652f308e1180bc80e9f4f69c39015c0f2b9fea287', 'topicutils.py': '2da903f5d2c353578cc7785b8ca423d5266bbccff5e7b60cd3d573b326a410d3', 'pubsubconf.pyc': '4f2ef31c3be1cc1b19cbeba744b9a909ae898d378ef9b475d22c77e55c3b0890', 'weakmethod.py': '9ffb8eba124d7bbdbadfe27f26dc874c5c9c4daccde93293e1f9cc8caebe65da', 'datamsg.py': '4f68227aeb6fceea02b149236db4631ce8c4581ade1692aba58e59c35a395449', 'topicargspec.pyc': '0e281974775684dcb844ebef33b479f0580f77e90fd66849ef761bdcb9d96559', 'listener.pyc': '17eac0a19764f240cda7867d627e0d426274cef0a63f30c1a59449bb3327a916', 'publisher.pyc': 'db0fb69087f1a3934d7d315fb897d3e138010bb11f3abb88c8c0ee24f9f50c37', 'pubsub3.pyc': '5b464d4a2bfea15371d45a9883848842de722d0c684b34b99f4fafd459d83633', 'publisher.py': '2135c45f44a8c415baf57b84f090c0a63e2f5426d703afc972306db9800afd6e', '__init__.py': 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855', 'callables.py': '93d01729995a99040b54cd5a4b0d6c86e6f11e144b39b58a0f681dcc8ee1d246', 'listener.py': '8f6c38e60acf0e2864231ce7b1732df627a3f56f74b7c44476317a797170ce34', 'pubsub3.py': '0761b796266e246acf6d6cc34aa00d3bc55331b5c633123f96a5c8a9b39addaa'}, '.\\locale\\ru': {}, '.\\images\\cursors': {'rotate.png': '12c593c5bd2f0972188eb30e32bee7ad4060be582c2c6826caff89372ca84707'}, '.\\locale\\cy': {}, '.\\locale\\pt': {}, '.\\locale\\gl\\LC_MESSAGES': {'whyteboard.mo': '24b5c7fe02c34d5a520f700512951eefbf259dd5ce20a987a76ad22027ca716b'}, '.\\locale\\it': {}, '.\\locale\\fr\\LC_MESSAGES': {'whyteboard.mo': '88d9e94fae6324925be27735b45c5d1867de6a79d362ca65c168c65761ac1ce2'}} \ No newline at end of file diff -rupN src\Whyteboard/integrity.py src\Whyteboard-integrity/integrity.py --- src\Whyteboard/integrity.py 1969-12-31 19:00:00.000000000 -0500 +++ src\Whyteboard-integrity/integrity.py 2010-11-28 17:05:56.772600000 -0500 @@ -0,0 +1,202 @@ +import os +import hashlib +import time +import urllib + +class Validator( object ): + def __init__( self, text = "" ): + self.text = text + + def YesNo( self ): + i = raw_input( self.text + " [Y/N]: " ) + i = i.lower() + if i[0] in ["y", "n"]: + if i[0] == "y": + return True + else: + return False + else: + print "Invalid response" + self.YesNo() + +class UrllibDownloader( object ): + def __init__( self ): + self.url = None + self.timer = None + self.dest = None + + def _downloadPath( self, dest ): + if not os.path.exists( self.dest ): + os.mkdir( self.dest ) + + def Start( self, url, dest ): + # TODO: Report download speed + + self.url = url + self.dest = dest + + self.timer = time.clock() + + self._downloadPath( dest ) + + print url, self.dest + + urllib.urlretrieve( self.url, self.dest, reporthook = self._downloadProgress ) + + def _downloadProgress( self, count, blockSize, totalSize ): + if time.clock() >= self.timer + 1: + percent = int( count * blockSize * 100 / totalSize ) + + url = os.path.split( self.url )[1] + print "\r" + url + "...%d%%" % percent + + self.timer = time.clock() + + +def Hash( filename, algorithm = "sha256", block_size = 2 ** 20 ): + file = open( filename ) + file.seek( 0 ) + + hash_function = hashlib.new( algorithm ) + while True: + data = file.read( block_size ) + if not data: + break + hash_function.update( data ) + return hash_function.hexdigest() + + +def GenerateHashes( verbose = False ): + print "Generating hashes... ", + if verbose: print "\n" + hash_dict = {} + generator = os.walk( "." ) + + for tuple in generator: + directory = tuple[0] + file_list = tuple[2] + #print directory + #print file_list + + hash_dict[directory] = {} + + for file in file_list: + hash = Hash( os.path.join( directory, file ) ) + hash_dict[directory][file] = hash + if verbose: + print file, hash + + print "Done!" + return hash_dict + +def SaveHashes( hash_dict ): + file = open( 'hashes.db', 'w' ) + file.write( "hash_dict = " + str( hash_dict ) ) + file.close() + +def ReadHashes(): + try: + file = open( 'hashes.db' ) + text = file.read() + exec( text ) + return hash_dict #@UndefinedVariable + except IOError: + return False + + +def VerifyHashes( hash_dict ): + print "Checking file integrity... ", + badfile_dict = {} + for directory, file_list in zip( hash_dict.keys(), hash_dict.values() ): + for file, hash in zip( file_list.keys(), file_list.values() ): + filename = os.path.join( directory, file ) + if hash != Hash( filename ): + print "File %(filename)s failed integrity check!" % \ + { "filename" : filename } + badfile_dict[directory] = file + + if badfile_dict == {}: + print "Good!" + else: + print "Failed!" + + return badfile_dict + +def Repair( badfile_dict ): + # Just uploaded it to a random server I had; this should be changed prior to release + server = "http://totalyfuckinawesomest.com/whyteboard-0.41.1" + + downloader = UrllibDownloader() + + print "Reparing whyteboard... ", + + for directory, file in zip( badfile_dict.keys(), badfile_dict.values() ): + + dest = os.path.join( directory, file ) + url = os.path.join( server, dest ) + + # TODO: use the re module instead + url = _lazy_assed_url_fixer( url ) + + downloader.Start( url, dest ) + + print "Done!" + + if __name__ != "__main__": + _loop( True ) + else: + print "Not looping" + +def _lazy_assed_url_fixer( url ): + for index, char in enumerate( url ): + if char == "\\": + url = _lazy_assed_url_fixer( str( url[:index] + "/" + url[index + 1:] ) ) + return url + + +def _test(): + timer = time.clock() + + hash_dict = GenerateHashes() + badfile_dict = VerifyHashes( hash_dict ) + + seconds = time.clock() - timer + print "Executed in %(seconds)s seconds" % \ + {"seconds" : seconds} + +def _test2(): + SaveHashes( GenerateHashes() ) + print ReadHashes() + +def _test3(): + test_dict = {'locale\\it\\LC_MESSAGES': 'whyteboard.mo'} + Repair( test_dict ) + +def main(): + # Simplest 1-pass usage: + #Repair( VerifyHashes( ReadHashes() ) ) + _loop() + +def _loop( anti_loop = False ): + hash_dict = ReadHashes() + if hash_dict: + bad_dict = VerifyHashes( hash_dict ) + if bad_dict != {}: + if not anti_loop: + print "Whyteboard has become courrupt." + if Validator( "Would you like to repair now?" ).YesNo(): + Repair( bad_dict ) + else: + print "Repair failed!" + else: + if not anti_loop: + print "Hash table missing! Unable to verify file integrity!" + if Validator( "Would you like to generate integrity data now?" ).YesNo(): + SaveHashes( GenerateHashes() ) + _loop( True ) + else: + print "Sanity check... Failed! (this is not a good thing, as you might imagine)" + +if __name__ == "__main__": + main() + Files src\Whyteboard/integrity.pyc and src\Whyteboard-integrity/integrity.pyc differ Files src\Whyteboard/whyteboard/__init__.pyc and src\Whyteboard-integrity/whyteboard/__init__.pyc differ Files src\Whyteboard/whyteboard/gui/__init__.pyc and src\Whyteboard-integrity/whyteboard/gui/__init__.pyc differ Files src\Whyteboard/whyteboard/gui/event_ids.pyc and src\Whyteboard-integrity/whyteboard/gui/event_ids.pyc differ Files src\Whyteboard/whyteboard/gui/menu.pyc and src\Whyteboard-integrity/whyteboard/gui/menu.pyc differ Files src\Whyteboard/whyteboard/lib/__init__.pyc and src\Whyteboard-integrity/whyteboard/lib/__init__.pyc differ Files src\Whyteboard/whyteboard/lib/configobj.pyc and src\Whyteboard-integrity/whyteboard/lib/configobj.pyc differ Files src\Whyteboard/whyteboard/lib/dragscroller.pyc and src\Whyteboard-integrity/whyteboard/lib/dragscroller.pyc differ Files src\Whyteboard/whyteboard/lib/errdlg.pyc and src\Whyteboard-integrity/whyteboard/lib/errdlg.pyc differ Files src\Whyteboard/whyteboard/lib/flatnotebook.pyc and src\Whyteboard-integrity/whyteboard/lib/flatnotebook.pyc differ Files src\Whyteboard/whyteboard/lib/icon.pyc and src\Whyteboard-integrity/whyteboard/lib/icon.pyc differ Files src\Whyteboard/whyteboard/lib/mock.pyc and src\Whyteboard-integrity/whyteboard/lib/mock.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/__init__.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/__init__.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/__init__.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/__init__.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/callables.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/callables.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/listener.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/listener.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/pubsub3.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/pubsub3.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/pubsubconf.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/pubsubconf.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/topics.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/topics.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/topicutils.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/topicutils.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/core/weakmethod.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/core/weakmethod.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/pub.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/pub.pyc differ Files src\Whyteboard/whyteboard/lib/pubsub/pubsubconf.pyc and src\Whyteboard-integrity/whyteboard/lib/pubsub/pubsubconf.pyc differ Files src\Whyteboard/whyteboard/misc/__init__.pyc and src\Whyteboard-integrity/whyteboard/misc/__init__.pyc differ Files src\Whyteboard/whyteboard/misc/functions.pyc and src\Whyteboard-integrity/whyteboard/misc/functions.pyc differ diff -rupN src\Whyteboard/whyteboard.py src\Whyteboard-integrity/whyteboard.py --- src\Whyteboard/whyteboard.py 2010-11-28 14:06:55.654600000 -0500 +++ src\Whyteboard-integrity/whyteboard.py 2010-11-28 17:08:23.632600000 -0500 @@ -26,24 +26,26 @@ wxPython version is recent enough, as Wh import sys import webbrowser import locale +import integrity -locale.setlocale(locale.LC_ALL) +locale.setlocale( locale.LC_ALL ) -if not hasattr(sys, 'frozen'): +if not hasattr( sys, 'frozen' ): WXVER = '2.8.9' import wxversion - if not wxversion.checkInstalled(WXVER): + if not wxversion.checkInstalled( WXVER ): import wx - app = wx.App(False) + app = wx.App( False ) - wx.MessageBox(u"The minimum required version of wxPython, \n%s is not installed." % WXVER, - u"wxPython Version Error") + wx.MessageBox( u"The minimum required version of wxPython, \n%s is not installed." % WXVER, + u"wxPython Version Error" ) app.MainLoop() - webbrowser.open(u"http://www.wxpython.org/download.php") + webbrowser.open( u"http://www.wxpython.org/download.php" ) sys.exit() +integrity.main() import wx from whyteboard import WhyteboardApp -WhyteboardApp().MainLoop() \ No newline at end of file +WhyteboardApp().MainLoop()