diff --git a/.github/workflows/app-ci.yml b/.github/workflows/app-ci.yml index d2bddd2..98bbee4 100644 --- a/.github/workflows/app-ci.yml +++ b/.github/workflows/app-ci.yml @@ -50,6 +50,10 @@ jobs: ./release/generate_linux_binary.sh chmod +x ./dist/varc ./dist/varc # check it doesn't return non 0 exit status, i.e. crash + - uses: actions/upload-artifact@v3 + with: + name: varc + path: ./dist/varc centos: runs-on: ubuntu-latest @@ -102,6 +106,7 @@ jobs: windows: runs-on: windows-latest + timeout-minutes: 30 steps: - uses: actions/checkout@v3 - name: Set up Python @@ -113,7 +118,14 @@ jobs: pip3 install -r ./requirements.txt - name: Run varc Python run: | - python3 varc.py + python3 varc.py --skip-memory + cd release + pip3 install pyinstaller==5.0 + ./generate_windows_binary.bat + - uses: actions/upload-artifact@v3 + with: + name: varc + path: ./dist/varc.exe macos: runs-on: macos-12 @@ -129,3 +141,13 @@ jobs: - name: Run varc Python run: | python3 varc.py + - name: Build & Run Binary + run: | + chmod +x ./release/generate_linux_binary.sh + ./release/generate_linux_binary.sh + chmod +x ./dist/varc + ./dist/varc # check it doesn't return non 0 exit status, i.e. crash + - uses: actions/upload-artifact@v3 + with: + name: varc + path: ./dist/varc \ No newline at end of file diff --git a/release/generate_osx_binary.sh b/release/generate_osx_binary.sh index 4be76fd..e99aea2 100644 --- a/release/generate_osx_binary.sh +++ b/release/generate_osx_binary.sh @@ -1,4 +1,15 @@ # Tested with python 3.10 and PyInstaller 5.4.1 -pip3 install -r requirements.txt -pyinstaller --onefile --clean --target-arch universal2 varc.py +PATHS="../venv/lib/python3.10/site-packages" + +python3 -m venv venv +source ./venv/bin/activate +cd cado-host-python + + +python3 -m pip install --upgrade pip +python3 -m pip install pyinstaller==5.4.1 +python3 -m pip install -r requirements.txt +# Universal target currently fails +# python3 -m PyInstaller --onefile --clean --paths $PATHS --target-arch universal2 varc.py +python3 -m PyInstaller --onefile --clean --paths $PATHS varc.py diff --git a/setup.py b/setup.py index e5ae53d..94fb7b1 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ long_description = (this_directory / "README.md").read_text() -VERSION = '1.0.5' +VERSION = '1.0.6' setup( name='varc', diff --git a/varc_core/systems/linux.py b/varc_core/systems/linux.py index 04002e3..4b72da1 100644 --- a/varc_core/systems/linux.py +++ b/varc_core/systems/linux.py @@ -95,27 +95,30 @@ def dump_processes(self) -> None: """Dumps all processes to temp files, adds temp file to output archive then removes the temp file""" archive_out = self.output_path with zipfile.ZipFile(archive_out, "a", compression=zipfile.ZIP_DEFLATED) as zip_file: - for proc in tqdm(self.process_info, desc="Process dump progess", unit=" procs"): - pid = proc["Process ID"] - p_name = proc["Name"] - maps = self.parse_mem_map(pid, p_name) - if not maps: - continue - with NamedTemporaryFile(mode="w+b", buffering=0, delete=True) as tmpfile: - try: - for map in maps: - page_start = map[0] - page_len = map[1] - map[0] - mem_page_content = self.read_bytes(pid, page_start, page_len) - if mem_page_content: - tmpfile.write(mem_page_content) - zip_file.write(tmpfile.name, f"process_dumps{sep}{p_name}_{pid}.mem") - except PermissionError: - logging.warning(f"Permission denied opening process memory for {p_name} (pid {pid}). Cannot dump this process.") + try: + for proc in tqdm(self.process_info, desc="Process dump progess", unit=" procs"): + pid = proc["Process ID"] + p_name = proc["Name"] + maps = self.parse_mem_map(pid, p_name) + if not maps: continue - except OSError as oserror: - logging.warning(f"Error opening process memory page for {p_name} (pid {pid}). Error was {oserror}. Dump may be incomplete.") - pass - + with NamedTemporaryFile(mode="w+b", buffering=0, delete=True) as tmpfile: + try: + for map in maps: + page_start = map[0] + page_len = map[1] - map[0] + mem_page_content = self.read_bytes(pid, page_start, page_len) + if mem_page_content: + tmpfile.write(mem_page_content) + zip_file.write(tmpfile.name, f"process_dumps{sep}{p_name}_{pid}.mem") + except PermissionError: + logging.warning(f"Permission denied opening process memory for {p_name} (pid {pid}). Cannot dump this process.") + continue + except OSError as oserror: + logging.warning(f"Error opening process memory page for {p_name} (pid {pid}). Error was {oserror}. Dump may be incomplete.") + pass + except MemoryError: + logging.warning("Exceeded available memory, skipping further memory collection") + logging.info(f"Dumping processing has completed. Output file is located: {archive_out}") \ No newline at end of file