From 21cc175867d1eeb57f4ad30df3b5ea9e647c7452 Mon Sep 17 00:00:00 2001 From: Dan Puttick Date: Wed, 18 Jan 2017 16:56:16 -0500 Subject: [PATCH] Move non-filecheck.py binaries into examples directory Tests for these scripts also removed from /tests and from .travis.yml Two .zip archives accidentally deleted from /tests/src_invalid, re-added them and changed .gitignore to prevent the problem --- .gitignore | 10 ++--- .travis.yml | 20 +-------- bin/README.md | 69 ++++--------------------------- examples/README.md | 56 +++++++++++++++++++++++++ {bin => examples}/generic.py | 0 {bin => examples}/pier9.py | 0 {bin => examples}/specific.py | 0 setup.py | 3 -- tests/src_invalid/42.zip | Bin 0 -> 42838 bytes tests/src_invalid/blah.zip | Bin 0 -> 344 bytes tests/test_generic.py | 50 ---------------------- tests/test_specific_and_pier9.py | 53 ------------------------ 12 files changed, 72 insertions(+), 189 deletions(-) create mode 100644 examples/README.md rename {bin => examples}/generic.py (100%) rename {bin => examples}/pier9.py (100%) rename {bin => examples}/specific.py (100%) create mode 100644 tests/src_invalid/42.zip create mode 100644 tests/src_invalid/blah.zip delete mode 100644 tests/test_generic.py delete mode 100644 tests/test_specific_and_pier9.py diff --git a/.gitignore b/.gitignore index 95e49f2..ecf6be3 100644 --- a/.gitignore +++ b/.gitignore @@ -67,8 +67,8 @@ target/ *.vrb # Project specific -/tests/dst/* -!/tests/logs/ -!/tests/.keepdir - - +tests/dst/* +tests/test_logs/* +!tests/**/.keepdir +!tests/src_invalid/* +!tests/src_valid/* diff --git a/.travis.yml b/.travis.yml index 8866a29..8e3dfb7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,8 +17,6 @@ addons: packages: # General dependencies - p7zip-full - # generic.py dependencies - - ghostscript # Testing dependencies - mercurial @@ -26,21 +24,7 @@ install: # General dependencies - sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ trusty multiverse" && sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu/ trusty-updates multiverse" - sudo apt-get update -qq - - sudo apt-get install -y p7zip-rar - # generic.py: pdf2htmlEX + dependencies - - sudo add-apt-repository ppa:fontforge/fontforge --yes - # to get a working 0.26 poppler - - sudo add-apt-repository ppa:delayargentina/delayx --yes - - sudo apt-get update -qq - - sudo apt-get install -y libpoppler-dev libpoppler-private-dev libspiro-dev libcairo-dev libpango1.0-dev libfreetype6-dev libltdl-dev libfontforge-dev python-imaging python-pip firefox xvfb - - git clone https://github.com/coolwanglu/pdf2htmlEX.git - - pushd pdf2htmlEX - - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_SVG=ON . - - make - - sudo make install - - popd - # generic.py: Other dependencies - - sudo apt-get install -y libreoffice libreoffice-script-provider-python unoconv + - sudo apt-get install -y p7zip-rar python-pip # filecheck.py dependencies - sudo apt-get install libxml2-dev libxslt1-dev - wget https://didierstevens.com/files/software/pdfid_v0_2_1.zip @@ -82,7 +66,7 @@ install: - wget --no-check-certificate https://www.officedissector.com/corpus/fraunhoferlibrary.zip - unzip -o fraunhoferlibrary.zip - rm fraunhoferlibrary.zip - - 7z x 42.zip -p42 + - 7z x -p42 42.zip - wget http://www.sample-videos.com/audio/mp3/india-national-anthem.mp3 - wget http://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_1mb.mp4 - wget http://thewalter.net/stef/software/rtfx/sample.rtf diff --git a/bin/README.md b/bin/README.md index b910162..f509f34 100644 --- a/bin/README.md +++ b/bin/README.md @@ -1,25 +1,18 @@ -Examples -======== - -These are several sanitizers that demonstrate PyCIRCLean's capabilities. Feel free to -adapt or modify any of them to suit your requirements. In order to use any of these scripts, -you will first need to install the PyCIRCLean dependencies (preferably in a virtualenv): - -``` - pip install . -``` - -Requirements per script -======================= - filecheck.py ------------- +============ This is the script used by the [CIRCLean](https://github.com/CIRCL/Circlean) USB key sanitizer. It is designed to handle a range of file types, and will mark them as dangerous if they meet certain criteria. -Requirements by type of document: +Before installing the filecheck.py depenencies, make sure to install the PyCIRCLean +dependencies: + +``` + pip install . +``` + +Dependencies by type of document: * Microsoft office: oletools, olefile * OOXML: officedissector * PDF: pdfid @@ -38,47 +31,3 @@ manually in the directory where filecheck will be run. wget https://didierstevens.com/files/software/pdfid_v0_2_1.zip unzip pdfid_v0_2_1.zip ``` - -generic.py ----------- - -This is a script used by an older version of CIRCLean. It has more dependencies -than filecheck.py and they are more complicated to install. - -Requirements by type of document: -* Office and all text files: unoconv, libreoffice -* PDF: ghostscript, pdf2htmlEX - -``` - # required for pdf2htmlEX - sudo add-apt-repository ppa:fontforge/fontforge --yes - sudo add-apt-repository ppa:coolwanglu/pdf2htmlex --yes - sudo apt-get update -qq - sudo apt-get install -qq libpoppler-dev libpoppler-private-dev libspiro-dev libcairo-dev libpango1.0-dev libfreetype6-dev libltdl-dev libfontforge-dev python-imaging python-pip firefox xvfb - # install pdf2htmlEX - git clone https://github.com/coolwanglu/pdf2htmlEX.git - pushd pdf2htmlEX - cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_SVG=ON . - make - sudo make install - popd - # Installing the rest - sudo apt-get install ghostscript p7zip-full p7zip-rar libreoffice unoconv -``` - -pier9.py --------- - -This script has a list of file formats for various brands of industrial -manufacturing equipment, such as 3d printers, CNC machines, etc. It only -copies files that match these file formats. - -No external dependencies required. - -specific.py ------------ - -As the name suggests, this script copies only specific file formats according -to the configuration provided by the user. - -No external dependencies required. diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 0000000..933e1d9 --- /dev/null +++ b/examples/README.md @@ -0,0 +1,56 @@ +Examples +======== + +These are several sanitizers that demonstrate PyCIRCLean's capabilities. Feel free to +adapt or modify any of them to suit your requirements. In order to use any of these scripts, +you will first need to install the PyCIRCLean dependencies (preferably in a virtualenv): + +``` + pip install . +``` + +Requirements per script +======================= + +generic.py +---------- + +This is a script that was used by an older version of CIRCLean. + +Requirements by type of document: +* Office and all text files: unoconv, libreoffice +* PDF: ghostscript, pdf2htmlEX + +``` + # required for pdf2htmlEX + sudo add-apt-repository ppa:fontforge/fontforge --yes + sudo add-apt-repository ppa:coolwanglu/pdf2htmlex --yes + sudo apt-get update -qq + sudo apt-get install -qq libpoppler-dev libpoppler-private-dev libspiro-dev libcairo-dev libpango1.0-dev libfreetype6-dev libltdl-dev libfontforge-dev python-imaging python-pip firefox xvfb + # install pdf2htmlEX + git clone https://github.com/coolwanglu/pdf2htmlEX.git + pushd pdf2htmlEX + cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr -DENABLE_SVG=ON . + make + sudo make install + popd + # Installing the rest + sudo apt-get install ghostscript p7zip-full p7zip-rar libreoffice unoconv +``` + +pier9.py +-------- + +This script contains a list of file formats for various brands of industrial +manufacturing equipment, such as 3d printers, CNC machines, etc. It only +copies files that match these file formats. + +No external dependencies required. + +specific.py +----------- + +As the name suggests, this script copies only specific file formats according +to the configuration provided by the user. + +No external dependencies required. diff --git a/bin/generic.py b/examples/generic.py similarity index 100% rename from bin/generic.py rename to examples/generic.py diff --git a/bin/pier9.py b/examples/pier9.py similarity index 100% rename from bin/pier9.py rename to examples/pier9.py diff --git a/bin/specific.py b/examples/specific.py similarity index 100% rename from bin/specific.py rename to examples/specific.py diff --git a/setup.py b/setup.py index f20da6a..7f84998 100644 --- a/setup.py +++ b/setup.py @@ -12,9 +12,6 @@ setup( description='Standalone CIRCLean/KittenGroomer code.', packages=['kittengroomer'], scripts=[ - 'bin/generic.py', - 'bin/pier9.py', - 'bin/specific.py', 'bin/filecheck.py' ], include_package_data=True, diff --git a/tests/src_invalid/42.zip b/tests/src_invalid/42.zip new file mode 100644 index 0000000000000000000000000000000000000000..e7681537ced5f7abcc7dfb999da856951911649d GIT binary patch literal 42838 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 I_n*~&0V&+h761SM literal 0 HcmV?d00001 diff --git a/tests/src_invalid/blah.zip b/tests/src_invalid/blah.zip new file mode 100644 index 0000000000000000000000000000000000000000..3e809f43758641b17be4cfd469a7f60f09025340 GIT binary patch literal 344 zcmWIWW@h1H0D+Q*D0kr(r_}|3Y!K#TkYPy5NzBko&d*B=4dG;9KJB0vc3_TvSZM_} z10%}|W(Ec@5t5NvtN=ub3MHw2kn0&3fp|+Jh=t^6R*0j~930?{Fb>m+$i@Z3i~~CuXd1}D7^bnZfvjZ$!nr_t IDTu=W0EsR|>Hq)$ literal 0 HcmV?d00001 diff --git a/tests/test_generic.py b/tests/test_generic.py deleted file mode 100644 index a17fb5e..0000000 --- a/tests/test_generic.py +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import os - -import pytest - -from bin.generic import KittenGroomer, File, main -from tests.logging import save_logs - -skipif_nodeps = pytest.mark.skipif(os.path.exists('/usr/bin/unoconv') is False, - reason="Dependencies aren't installed") - - -@skipif_nodeps -class TestIntegration: - - @pytest.fixture - def src_valid(self): - return os.path.join(os.getcwd(), 'tests/src_valid') - - @pytest.fixture - def src_invalid(self): - return os.path.join(os.getcwd(), 'tests/src_invalid') - - @pytest.fixture - def dst(self): - return os.path.join(os.getcwd(), 'tests/dst') - - def test_generic(self, src_valid, dst): - groomer = KittenGroomer(src_valid, dst, debug=True) - groomer.processdir() - test_description = 'generic_valid' - save_logs(groomer, test_description) - - def test_generic_2(self, src_invalid, dst): - groomer = KittenGroomer(src_invalid, dst, debug=True) - groomer.processdir() - test_description = 'generic_invalid' - save_logs(groomer, test_description) - - -class TestFileHandling: - pass - - # We're going to give KittenGroomer a bunch of files, and it's going to process them - # Maybe we want to make a function that processdir delegates to? Or is it just the File Object that's responsible? - # Ideally we should be able to pass a path to a function and have it do stuff? And then we can test that function? - # So we have a function that takes a path and returns...log info? That makes sense actually. Or some sort of meta data - # The function could maybe be called processfile diff --git a/tests/test_specific_and_pier9.py b/tests/test_specific_and_pier9.py deleted file mode 100644 index d411aa8..0000000 --- a/tests/test_specific_and_pier9.py +++ /dev/null @@ -1,53 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import os - -import pytest - -from bin.specific import KittenGroomerSpec -from bin.pier9 import KittenGroomerPier9 -from tests.logging import save_logs - - -@pytest.fixture -def src_valid(): - return os.path.join(os.getcwd(), 'tests/src_valid') - - -@pytest.fixture -def src_invalid(): - return os.path.join(os.getcwd(), 'tests/src_invalid') - - -@pytest.fixture -def dst(): - return os.path.join(os.getcwd(), 'tests/dst') - - -def test_specific_valid(src_valid, dst): - groomer = KittenGroomerSpec(src_valid, dst, debug=True) - groomer.processdir() - test_description = 'specific_valid' - save_logs(groomer, test_description) - - -def test_specific_invalid(src_invalid, dst): - groomer = KittenGroomerSpec(src_invalid, dst, debug=True) - groomer.processdir() - test_description = 'specific_invalid' - save_logs(groomer, test_description) - - -def test_pier9_valid(src_invalid, dst): - groomer = KittenGroomerPier9(src_invalid, dst, debug=True) - groomer.processdir() - test_description = 'pier9_valid' - save_logs(groomer, test_description) - - -def test_pier9_invalid(src_invalid, dst): - groomer = KittenGroomerPier9(src_invalid, dst, debug=True) - groomer.processdir() - test_description = 'pier9_invalid' - save_logs(groomer, test_description)