Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

preshus

PREServation Hash UtilitieS

or: tools for using checksums in preservation workflows

Here's a list of tools available in this repo

  • hashsync
  • hashmaker
  • hashchecker

hashsync

What Is It?

hashcopy is a tool that moves files from one directory or volume to another with logged checksum verification. The verification performed by hashcopy is done using checksums held in sidecar files. Here is the workflows

  • check to see if sidecar files exist for source file(s)
  • if sidecar files don't exist, make them
  • if sidecar files are out of date (modified date is earlier than modified date of parent file), remake them
  • move all files and sidecar files
  • validate any non-sidecar file once it is moved

What Is A Sidecar File?

A sidecar file is a plaintext file that contains the checksum of it's parent file, as well as the relative path to the parent file. Here's is the sample nesting of a sidecar file1

Directory
│
├── sample_file.mov
│
└── sample_file.mov.md5

here is the sample contents of the above sidecar file

d025ffdc24da6411ee12caf23b2f0616 *sample_file1.gif

the * character refers the fact that the path is relative. Since the sidecar file is nested next to the file there is nothing but the filename. This is useful for validation with other preservation tools, but isn't necessary or currently used by any preshus tools

Logging

It's very important for us to know if something failed. However, in some cases hundreds or thousands of files are being moved. In order to make it easier to see if there are failures, a log is created in the destination folder. The user can search for the text "ERROR" or "WARNING" to see if something went wrong. Here is the meaning of these messages

  • WARNING
    • A source checksum was found to be out of dated and was recreated
  • ERROR
    • A checksum was invalid after moving a file. this is very bad

General Usage

python hashsync.py [flags] [any number of source directories or source file full paths] [destination parent directory full path]

to copy a file (windows filepath)

python hashmove.py C:/path/to/file.ext C:/path/to/parent/dir

to copy a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir/ /home/path/to/destDir/

to copy two files and a directory (unix filepath)

python hashmove.py /home/path/to/sourceDir1/file1 /home/path/to/sourceDir2/ /home/path/to/sourceDir3/file3 /home/path/to/destDir/

hashmaker

hashmaker creates and validates sidecar checksum files

General Usage

python hashchecker.py [flags] [any number of source directories or source file full paths]

Important Details

  • In order to use hashmaker you'll need to give it either the -m flag (make mode) or -v flag (verify mode). You cannot run the script without one of these flags, and you cannot run it with both of them at the same time.
  • In make mode hashmaker will recreate a sidecar file if it's out of date. It will report this as a WARNING.

hashchecker

hashchecker will validate sidecar checksum files against checksums stored in Salesforce. This script is built to work with BAVC's Salesforce implementation, so it's not very extensible. However, it may be helpful for people trying to work with the Salesforce API.

Credentials Setup

In order to use this you'll need to create a config.py file with the following format:

username = "your.email@bavc.org"
password = "yourpassword"
security_token = "yourAPIkey"

Required Libraries

You'll need to install simple_salesforce. You can do so with the following command

pip3 install simple_salesforce

General Usage

python hashchecker.py [any number of source directories or source file full paths]

About

PREServation Hash UtilitieS

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages