Skip to content

Instantly share code, notes, and snippets.

Avatar

James Sumners jsumners

View GitHub Profile
@jsumners
jsumners / walk.mjs
Created Nov 18, 2021
Walk a Node project's dependency tree and list the dependencies and their versions
View walk.mjs
import fs from 'fs/promises';
import treeify from 'treeify';
const result = await readModDir('.');
console.log(treeify.asTree(result, true));
async function readModDir(modDirPath) {
const dirEntries = await fs.readdir(new URL(modDirPath, import.meta.url));
const hasNodeModules = dirEntries.some(entry => entry === 'node_modules');
const pkgSrc = await fs.readFile(new URL(`${modDirPath}/package.json`, import.meta.url));
View get-package-manager.sh
#!/bin/bash
if [ ! -f package.json ]; then
# Default to npm regardless of missing package file.
echo "npm"
exit 0
fi
NODE_VERSION=$(node --version)
NODE_VERSION="${NODE_VERSION%%\.*}"
@jsumners
jsumners / Readme.md
Created Oct 24, 2021
Retrieve tabs from iOS Safari backup
View Readme.md
  1. From a backup of the iOS device, extract /HomeDomain/Library/Safari/BrowserState.db to a local directory
  2. Place index.js and package.json in the same local directory
  3. npm install
  4. node index.js > lost_ios_safari_tabs.csv

Note: these instructions were created using an iMazing backup.

@jsumners
jsumners / readme.md
Last active Oct 11, 2021
Backup disk over ssh
View readme.md
  1. Boot host to be backed up with a rescue image, e.g. SystemRescueCD.
  2. Connect to destination host: ssh -L 8000:localhost:9000 destination.example.com
  3. On destination host: socat -u TCP4-LISTEN:9000,reuseaddr,fork OPEN:/tmp/backup.img.bz2,create,append
  4. On host to be backed up: dd if=/dev/sda | pv | bzip2 -9 | nc localhost 8000

Notes:

  1. socat installed on destination host
  2. /dev/sda is whatever disk is to be imaged and sent to remote host
@jsumners
jsumners / readme.md
Created Mar 3, 2021
Start new PR with an existing PR as a base
View readme.md

Ocassionally, someone will start a pull request and, for various reason, not see it through. Later, someone else may wish to finish that work. Even though the original author was unable to finish their work, we should still include their efforts in our project's history. To do so, the person wishing to finish the original pull request should start their new pull request using the original as the base.

The simplest workflow to accomplish this is:

$ # For the project on GitHub to your account and then:
$ git clone <your fork of the-project.git>
@jsumners
jsumners / no-wip.yml
Created Sep 23, 2020
No WIP PR merges
View no-wip.yml
name: "No WIP PR Title"
on:
pull_request_target:
types:
- opened
- edited
- synchronize
jobs:
@jsumners
jsumners / bar.js
Created Apr 21, 2020
self-ref testing
View bar.js
// `lib/bar.js`
module.exports = 'bar'
@jsumners
jsumners / bar.js
Created Apr 21, 2020
self-ref testing
View bar.js
// `lib/bar.js`
module.exports = 'bar'
@jsumners
jsumners / async-await-result-pattern.js
Created Jun 28, 2018
A simple pattern for working with async/await
View async-await-result-pattern.js
async function doFoo () {
let bar
try {
bar = await something_that_can_throw('a value')
} catch (error) {
return {error}
}
return {value: bar}
}
View 00README.md

Change Well Known Passwords

This is an Ansible playbook for chaning default, well known, or missing passwords on a set of hosts. To use it:

  1. Start a listener: socat tcp4-listen:8000,fork stdout
  2. Run the playbook: ansible-playbook update_password.pb.yml -e 'user=target_user' -e 'passwd=known_pass'

Your listener will receive notifications like: