diff --git a/.gitignore b/.gitignore index 5b4d8cb..1c9e4d8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ __pycache__/ *.py[cod] *$py.class +# IDE +.vscode + # C extensions *.so diff --git a/README.md b/README.md index 93f27b2..e6dbb46 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,22 @@ TL;DR: Python implementation for low-level disk (and disk images) reading, parse MBR, file systems, etc. + +# Installation +py-disk-reader is temporarily unavailable on PyPI. + +Use github link to install: +``` +pip install git+https://github.com/bashkirtsevich/py-disk-reader +``` # Examples ## FAT12 ```python from hashlib import sha1 -from reader import FileReader +from disk_reader import FAT12Reader +from disk_reader.reader import FileReader with open("images/floppy2.img", "rb") as f: img = FAT12Reader(FileReader(f)) @@ -37,7 +46,8 @@ with open("images/floppy2.img", "rb") as f: ```python from hashlib import sha1 -from reader import FileReader +from disk_reader import FAT16Reader +from disk_reader.reader import FileReader with open("images/fat16.img", "rb") as f: img = FAT16Reader(FileReader(f)) @@ -66,7 +76,8 @@ with open("images/fat16.img", "rb") as f: ```python from hashlib import sha1 -from reader import FileReader +from disk_reader import FAT32Reader +from disk_reader.reader import FileReader with open("images/fat32.img", "rb") as f: img = FAT32Reader(FileReader(f)) diff --git a/fat/__init__.py b/fat/__init__.py deleted file mode 100644 index 95179b6..0000000 --- a/fat/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -from fat.fat12 import FAT12Reader -from fat.fat16 import FAT16Reader -from fat.fat32 import FAT32Reader - -__all__ = [ - "FAT12Reader", - "FAT16Reader", - "FAT32Reader" -] diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..5975c90 --- /dev/null +++ b/setup.py @@ -0,0 +1,13 @@ +from setuptools import setup, find_packages + + +setup( + name="disk_reader", + version="0.0.1", + description="Python low-level disk reader", + long_description=open("README.md").read(), + long_description_content_type="text/markdown", + packages=find_packages("src"), + package_dir={"": "src"}, + python_requires=">=3.6.*" +) \ No newline at end of file diff --git a/src/disk_reader/__init__.py b/src/disk_reader/__init__.py new file mode 100644 index 0000000..b0149a9 --- /dev/null +++ b/src/disk_reader/__init__.py @@ -0,0 +1,9 @@ +from disk_reader.fat.fat12 import FAT12Reader +from disk_reader.fat.fat16 import FAT16Reader +from disk_reader.fat.fat32 import FAT32Reader + +__all__ = [ + 'FAT12Reader', + 'FAT16Reader', + 'FAT32Reader' +] diff --git a/fat/fat.py b/src/disk_reader/fat/__init__.py similarity index 99% rename from fat/fat.py rename to src/disk_reader/fat/__init__.py index f35e153..8085cd5 100644 --- a/fat/fat.py +++ b/src/disk_reader/fat/__init__.py @@ -2,8 +2,8 @@ from itertools import accumulate, takewhile, repeat from struct import unpack -from reader import Reader -from utils import groupby, slice_len +from disk_reader.reader import Reader +from disk_reader.utils import groupby, slice_len class FATException(Exception): diff --git a/fat/fat12.py b/src/disk_reader/fat/fat12.py similarity index 89% rename from fat/fat12.py rename to src/disk_reader/fat/fat12.py index f641011..929de90 100644 --- a/fat/fat12.py +++ b/src/disk_reader/fat/fat12.py @@ -1,7 +1,23 @@ +from struct import unpack from collections import namedtuple -from .fat import FATTable, FATEntryReader, FATReader, FATEntry, FATDir, FATBootSector -from .signatures import * +from disk_reader.fat import ( + FATTable, + FATEntryReader, + FATReader, + FATEntry, + FATDir, + FATBootSector +) +from disk_reader.fat.signatures import ( + FAT12_SIGN, + FAT12_ENTRY_PERMS, + FAT12_ENTRY, + FAT12_LFN, + FAT12_ENTRY_SIZE +) +from disk_reader.utils import slice_len + FAT12_STRUCT = namedtuple("FAT12", (it[2] for it in FAT12_SIGN)) FAT12_ENTRY_STRUCT = namedtuple("FAT12Directory", (it[2] for it in FAT12_ENTRY)) diff --git a/fat/fat16.py b/src/disk_reader/fat/fat16.py similarity index 89% rename from fat/fat16.py rename to src/disk_reader/fat/fat16.py index 20d94b1..f27aa9a 100644 --- a/fat/fat16.py +++ b/src/disk_reader/fat/fat16.py @@ -1,7 +1,21 @@ +from struct import unpack from collections import namedtuple - -from .fat import FATTable, FATEntryReader, FATReader, FATEntry, FATDir, FATBootSector -from .signatures import * +from disk_reader.fat import ( + FATTable, + FATEntryReader, + FATReader, + FATEntry, + FATDir, + FATBootSector +) +from disk_reader.fat.signatures import ( + FAT12_ENTRY_SIZE, + FAT16_SIGN, + FAT16_ENTRY_PERMS, + FAT16_ENTRY, + FAT16_LFN, + FAT16_ENTRY_SIZE +) FAT16_STRUCT = namedtuple("FAT16", (it[2] for it in FAT16_SIGN)) FAT16_ENTRY_STRUCT = namedtuple("FAT16Directory", (it[2] for it in FAT16_ENTRY)) diff --git a/fat/fat32.py b/src/disk_reader/fat/fat32.py similarity index 88% rename from fat/fat32.py rename to src/disk_reader/fat/fat32.py index 5d3b8a7..829088a 100644 --- a/fat/fat32.py +++ b/src/disk_reader/fat/fat32.py @@ -1,7 +1,22 @@ +from struct import unpack from collections import namedtuple +from disk_reader.fat import ( + FATTable, + FATEntryReader, + FATReader, + FATEntry, + FATDir, + FATBootSector +) +from disk_reader.fat.signatures import ( + FAT32_SIGN, + FAT32_ENTRY_PERMS, + FAT32_ENTRY, + FAT32_LFN, + FAT32_ENTRY_SIZE +) +from disk_reader.utils import slice_len -from .fat import FATTable, FATEntryReader, FATReader, FATEntry, FATDir, FATBootSector -from .signatures import * FAT32_STRUCT = namedtuple("FAT32", (it[2] for it in FAT32_SIGN)) FAT32_ENTRY_STRUCT = namedtuple("FAT32Directory", (it[2] for it in FAT32_ENTRY)) diff --git a/fat/signatures.py b/src/disk_reader/fat/signatures.py similarity index 92% rename from fat/signatures.py rename to src/disk_reader/fat/signatures.py index 466199b..6eb013f 100644 --- a/fat/signatures.py +++ b/src/disk_reader/fat/signatures.py @@ -1,3 +1,20 @@ +from collections import namedtuple + +__all__ = [ + 'FAT12_SIGN', + 'FAT12_ENTRY_PERMS', + 'FAT12_ENTRY', + 'FAT12_LFN', + 'FAT16_SIGN', + 'FAT16_ENTRY_PERMS', + 'FAT16_ENTRY', + 'FAT16_LFN', + 'FAT32_SIGN', + 'FAT32_ENTRY_PERMS', + 'FAT32_ENTRY', + 'FAT32_LFN' +] + FAT12_SIGN = ( # ( offset, size, name, unpack string) (0x00, 3, 'JumpInstruction', '3s'), diff --git a/reader.py b/src/disk_reader/reader.py similarity index 100% rename from reader.py rename to src/disk_reader/reader.py diff --git a/utils.py b/src/disk_reader/utils.py similarity index 100% rename from utils.py rename to src/disk_reader/utils.py