mirror of
https://github.com/PacktPublishing/Python-Digital-Forensics-Cookbook.git
synced 2026-02-20 13:50:43 +00:00
Code files added
This commit is contained in:
92
Chapter01/copy_metadata.py
Normal file
92
Chapter01/copy_metadata.py
Normal file
@@ -0,0 +1,92 @@
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
from datetime import datetime as dt
|
||||
import os
|
||||
import pytz
|
||||
from pywintypes import Time
|
||||
import shutil
|
||||
from win32file import SetFileTime, CreateFile, CloseHandle
|
||||
from win32file import GENERIC_WRITE, FILE_SHARE_WRITE
|
||||
from win32file import OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
__authors__ = ["Chapin Bryce", "Preston Miller"]
|
||||
__date__ = 20170815
|
||||
__description__ = "Utility to copy files and associated metadata on Windows"
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=__description__,
|
||||
epilog="Developed by {} on {}".format(
|
||||
", ".join(__authors__), __date__)
|
||||
)
|
||||
parser.add_argument("source", help="Source file")
|
||||
parser.add_argument("dest", help="Destination directory or file")
|
||||
parser.add_argument("--timezone", help="Timezone of the file's timestamp",
|
||||
choices=['EST5EDT', 'CST6CDT', 'MST7MDT', 'PST8PDT'],
|
||||
required=True)
|
||||
args = parser.parse_args()
|
||||
|
||||
source = os.path.abspath(args.source)
|
||||
if os.sep in args.source:
|
||||
src_file_name = args.source.split(os.sep, 1)[1]
|
||||
else:
|
||||
src_file_name = args.source
|
||||
|
||||
dest = os.path.abspath(args.dest)
|
||||
tz = pytz.timezone(args.timezone)
|
||||
|
||||
shutil.copy2(source, dest)
|
||||
if os.path.isdir(dest):
|
||||
dest_file = os.path.join(dest, src_file_name)
|
||||
else:
|
||||
dest_file = dest
|
||||
|
||||
created = dt.fromtimestamp(os.path.getctime(source))
|
||||
created = Time(tz.localize(created))
|
||||
modified = dt.fromtimestamp(os.path.getmtime(source))
|
||||
modified = Time(tz.localize(modified))
|
||||
accessed = dt.fromtimestamp(os.path.getatime(source))
|
||||
accessed = Time(tz.localize(accessed))
|
||||
|
||||
print("Source\n======")
|
||||
print("Created: {}\nModified: {}\nAccessed: {}".format(
|
||||
created, modified, accessed))
|
||||
|
||||
handle = CreateFile(dest_file, GENERIC_WRITE, FILE_SHARE_WRITE,
|
||||
None, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, None)
|
||||
SetFileTime(handle, created, accessed, modified)
|
||||
CloseHandle(handle)
|
||||
|
||||
created = tz.localize(dt.fromtimestamp(os.path.getctime(dest_file)))
|
||||
modified = tz.localize(dt.fromtimestamp(os.path.getmtime(dest_file)))
|
||||
accessed = tz.localize(dt.fromtimestamp(os.path.getatime(dest_file)))
|
||||
print("\nDestination\n===========")
|
||||
print("Created: {}\nModified: {}\nAccessed: {}".format(
|
||||
created, modified, accessed))
|
||||
78
Chapter01/file_metadata.py
Normal file
78
Chapter01/file_metadata.py
Normal file
@@ -0,0 +1,78 @@
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
from datetime import datetime as dt
|
||||
import os
|
||||
import sys
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
__authors__ = ["Chapin Bryce", "Preston Miller"]
|
||||
__date__ = 20170815
|
||||
__description__ = "Gather filesystem metadata of provided file"
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=__description__,
|
||||
epilog="Developed by {} on {}".format(", ".join(__authors__), __date__)
|
||||
)
|
||||
parser.add_argument("FILE_PATH",
|
||||
help="Path to file to gather metadata for")
|
||||
args = parser.parse_args()
|
||||
file_path = args.FILE_PATH
|
||||
|
||||
stat_info = os.stat(file_path)
|
||||
if "linux" in sys.platform or "darwin" in sys.platform:
|
||||
print("Change time: ", dt.fromtimestamp(stat_info.st_ctime))
|
||||
elif "win" in sys.platform:
|
||||
print("Creation time: ", dt.fromtimestamp(stat_info.st_ctime))
|
||||
else:
|
||||
print("[-] Unsupported platform {} detected. Cannot interpret "
|
||||
"creation/change timestamp.".format(sys.platform)
|
||||
)
|
||||
print("Modification time: ", dt.fromtimestamp(stat_info.st_mtime))
|
||||
print("Access time: ", dt.fromtimestamp(stat_info.st_atime))
|
||||
|
||||
print("File mode: ", stat_info.st_mode)
|
||||
print("File inode: ", stat_info.st_ino)
|
||||
major = os.major(stat_info.st_dev)
|
||||
minor = os.minor(stat_info.st_dev)
|
||||
print("Device ID: ", stat_info.st_dev)
|
||||
print("\tMajor: ", major)
|
||||
print("\tMinor: ", minor)
|
||||
|
||||
print("Number of hard links: ", stat_info.st_nlink)
|
||||
print("Owner User ID: ", stat_info.st_uid)
|
||||
print("Group ID: ", stat_info.st_gid)
|
||||
print("File Size: ", stat_info.st_size)
|
||||
|
||||
print("Is a symlink: ", os.path.islink(file_path))
|
||||
print("Absolute Path: ", os.path.abspath(file_path))
|
||||
print("File exists: ", os.path.exists(file_path))
|
||||
print("Parent directory: ", os.path.dirname(file_path))
|
||||
print("Parent directory: {} | File name: {}".format(
|
||||
*os.path.split(file_path)))
|
||||
74
Chapter01/hashing.py
Normal file
74
Chapter01/hashing.py
Normal file
@@ -0,0 +1,74 @@
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import hashlib
|
||||
import os
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
__authors__ = ["Chapin Bryce", "Preston Miller"]
|
||||
__date__ = 20170815
|
||||
__description__ = "Script to hash a file's name and contents"
|
||||
|
||||
available_algorithms = {
|
||||
"md5": hashlib.md5,
|
||||
"sha1": hashlib.sha1,
|
||||
"sha256": hashlib.sha256,
|
||||
"sha512": hashlib.sha512
|
||||
}
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=__description__,
|
||||
epilog="Developed by {} on {}".format(", ".join(__authors__), __date__)
|
||||
)
|
||||
parser.add_argument("FILE_NAME", help="Path of file to hash")
|
||||
parser.add_argument("ALGORITHM", help="Hash algorithm to use",
|
||||
choices=sorted(available_algorithms.keys()))
|
||||
args = parser.parse_args()
|
||||
|
||||
input_file = args.FILE_NAME
|
||||
hash_alg = args.ALGORITHM
|
||||
|
||||
file_name = available_algorithms[hash_alg]()
|
||||
abs_path = os.path.abspath(input_file)
|
||||
file_name.update(abs_path.encode())
|
||||
|
||||
print("The {} of the filename is: {}".format(
|
||||
hash_alg, file_name.hexdigest()))
|
||||
|
||||
file_content = available_algorithms[hash_alg]()
|
||||
with open(input_file, 'rb') as open_file:
|
||||
buff_size = 1024
|
||||
buff = open_file.read(buff_size)
|
||||
|
||||
while buff:
|
||||
file_content.update(buff)
|
||||
buff = open_file.read(buff_size)
|
||||
|
||||
print("The {} of the content is: {}".format(
|
||||
hash_alg, file_content.hexdigest()))
|
||||
61
Chapter01/logging_recipe.py
Normal file
61
Chapter01/logging_recipe.py
Normal file
@@ -0,0 +1,61 @@
|
||||
from __future__ import print_function
|
||||
import logging
|
||||
import sys
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
logger = logging.getLogger(__file__)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
|
||||
msg_fmt = logging.Formatter("%(asctime)-15s %(funcName)-20s"
|
||||
"%(levelname)-8s %(message)s")
|
||||
|
||||
strhndl = logging.StreamHandler(sys.stdout)
|
||||
strhndl.setFormatter(fmt=msg_fmt)
|
||||
|
||||
fhndl = logging.FileHandler(__file__ + ".log", mode='a')
|
||||
fhndl.setFormatter(fmt=msg_fmt)
|
||||
|
||||
logger.addHandler(strhndl)
|
||||
logger.addHandler(fhndl)
|
||||
|
||||
logger.info("information message")
|
||||
logger.debug("debug message")
|
||||
|
||||
|
||||
def function_one():
|
||||
logger.warning("warning message")
|
||||
|
||||
|
||||
def function_two():
|
||||
logger.error("error message")
|
||||
|
||||
|
||||
function_one()
|
||||
function_two()
|
||||
61
Chapter01/multiproc_example.py
Normal file
61
Chapter01/multiproc_example.py
Normal file
@@ -0,0 +1,61 @@
|
||||
from __future__ import print_function
|
||||
import logging
|
||||
import multiprocessing as mp
|
||||
from random import randint
|
||||
import sys
|
||||
import time
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
|
||||
def sleepy(seconds):
|
||||
proc_name = mp.current_process().name
|
||||
logger.info("{} is sleeping for {} seconds.".format(
|
||||
proc_name, seconds))
|
||||
time.sleep(seconds)
|
||||
|
||||
|
||||
logger = logging.getLogger(__file__)
|
||||
logger.setLevel(logging.DEBUG)
|
||||
msg_fmt = logging.Formatter("%(asctime)-15s %(funcName)-7s "
|
||||
"%(levelname)-8s %(message)s")
|
||||
strhndl = logging.StreamHandler(sys.stdout)
|
||||
strhndl.setFormatter(fmt=msg_fmt)
|
||||
logger.addHandler(strhndl)
|
||||
|
||||
num_workers = 5
|
||||
workers = []
|
||||
for w in range(num_workers):
|
||||
p = mp.Process(target=sleepy, args=(randint(1, 20),))
|
||||
p.start()
|
||||
workers.append(p)
|
||||
|
||||
for worker in workers:
|
||||
worker.join()
|
||||
logger.info("Joined process {}".format(worker.name))
|
||||
52
Chapter01/os_walk.py
Normal file
52
Chapter01/os_walk.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
import os
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
__authors__ = ["Chapin Bryce", "Preston Miller"]
|
||||
__date__ = 20170815
|
||||
__description__ = "Directory tree walker"
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=__description__,
|
||||
epilog="Developed by {} on {}".format(
|
||||
", ".join(__authors__), __date__)
|
||||
)
|
||||
parser.add_argument("DIR_PATH", help="Path to directory")
|
||||
args = parser.parse_args()
|
||||
path_to_scan = args.DIR_PATH
|
||||
|
||||
# Iterate over the path_to_scan
|
||||
for root, directories, files in os.walk(path_to_scan):
|
||||
# Iterate over the files in the current "root"
|
||||
for file_entry in files:
|
||||
# create the relative path to the file
|
||||
file_path = os.path.join(root, file_entry)
|
||||
print(file_path)
|
||||
58
Chapter01/progressbars.py
Normal file
58
Chapter01/progressbars.py
Normal file
@@ -0,0 +1,58 @@
|
||||
from __future__ import print_function
|
||||
from time import sleep
|
||||
import tqdm
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
fruits = [
|
||||
"Acai", "Apple", "Apricots", "Avocado", "Banana", "Blackberry",
|
||||
"Blueberries", "Cherries", "Coconut", "Cranberry", "Cucumber",
|
||||
"Durian", "Fig", "Grapefruit", "Grapes", "Kiwi", "Lemon", "Lime",
|
||||
"Mango", "Melon", "Orange", "Papaya", "Peach", "Pear", "Pineapple",
|
||||
"Pomegranate", "Raspberries", "Strawberries", "Watermelon"
|
||||
]
|
||||
|
||||
contains_berry = 0
|
||||
for fruit in tqdm.tqdm(fruits):
|
||||
if "berr" in fruit.lower():
|
||||
contains_berry += 1
|
||||
sleep(.1)
|
||||
print("{} fruit names contain 'berry' or 'berries'".format(contains_berry))
|
||||
|
||||
contains_berry = 0
|
||||
pbar = tqdm.tqdm(fruits, desc="Reviewing names", unit="fruits")
|
||||
for fruit in pbar:
|
||||
if "berr" in fruit.lower():
|
||||
contains_berry += 1
|
||||
pbar.set_postfix(hits=contains_berry)
|
||||
sleep(.1)
|
||||
print("{} fruit names contain 'berry' or 'berries'".format(contains_berry))
|
||||
|
||||
for i in tqdm.trange(10000000, unit_scale=True, desc="Trange: "):
|
||||
pass
|
||||
69
Chapter01/simple_arguments.py
Normal file
69
Chapter01/simple_arguments.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from __future__ import print_function
|
||||
import argparse
|
||||
|
||||
"""
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2017 Chapin Bryce, Preston Miller
|
||||
|
||||
Please share comments and questions at:
|
||||
https://github.com/PythonForensics/PythonForensicsCookbook
|
||||
or email pyforcookbook@gmail.com
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
"""
|
||||
|
||||
__authors__ = ["Chapin Bryce", "Preston Miller"]
|
||||
__date__ = 20170815
|
||||
__description__ = 'A simple argparse example'
|
||||
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description=__description__,
|
||||
epilog="Developed by {} on {}".format(
|
||||
", ".join(__authors__), __date__)
|
||||
)
|
||||
|
||||
parser.add_argument("INPUT_FILE", help="Path to input file")
|
||||
parser.add_argument("OUTPUT_FILE", help="Path to output file")
|
||||
|
||||
parser.add_argument("--hash", help="Hash the files", action="store_true")
|
||||
|
||||
parser.add_argument("--hash-algorithm",
|
||||
help="Hash algorithm to use. ie md5, sha1, sha256",
|
||||
choices=['md5', 'sha1', 'sha256'], default="sha256"
|
||||
)
|
||||
|
||||
parser.add_argument("-v", "--version", "--script-version",
|
||||
help="Displays script version information",
|
||||
action="version", version=str(__date__)
|
||||
)
|
||||
|
||||
parser.add_argument('-l', '--log', help="Path to log file", required=True)
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
input_file = args.INPUT_FILE
|
||||
output_file = args.OUTPUT_FILE
|
||||
|
||||
if args.hash:
|
||||
ha = args.hash_algorithm
|
||||
print("File hashing enabled with {} algorithm".format(ha))
|
||||
if not args.log:
|
||||
print("Log file not defined. Will write to stdout")
|
||||
Reference in New Issue
Block a user