[NO TESTS] WIP
This commit is contained in:
parent
80e908e7f9
commit
9b7144047c
2 changed files with 141 additions and 0 deletions
94
projects/archlinux/rollback.py
Normal file
94
projects/archlinux/rollback.py
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main(opts, args):
|
||||||
|
"""Usage: python rollback.py date
|
||||||
|
|
||||||
|
Parse /var/log/pacman.log, enumerating package transactions since the
|
||||||
|
specified date and building a plan for restoring the state of your system to
|
||||||
|
what it was at the specified date.
|
||||||
|
|
||||||
|
Assumes:
|
||||||
|
- /var/log/pacman.log has not been truncated
|
||||||
|
|
||||||
|
- /var/cache/pacman/pkg has not been flushed and still contains all required
|
||||||
|
packages
|
||||||
|
|
||||||
|
- The above paths are Arch default and have not been customized
|
||||||
|
|
||||||
|
- That it is not necessary to remove any "installed" packages
|
||||||
|
|
||||||
|
Note: no attempt is made to inspect the dependency graph of packages to be
|
||||||
|
downgraded to detect when a package is already transitively listed for
|
||||||
|
downgrading. This can create some annoying errors where eg. systemd will be
|
||||||
|
downgraded, meaning libsystemd will also be downgraded, but pacman considers
|
||||||
|
explicitly listing the downgrade of libsystemd when it will already be
|
||||||
|
transitively downgraded an error.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
date, = args
|
||||||
|
|
||||||
|
print("Attempting to roll back package state to that of {0}...\n"
|
||||||
|
.format(date),
|
||||||
|
file=sys.stderr)
|
||||||
|
|
||||||
|
# These patterns can't be collapsed because we want to select different
|
||||||
|
# version identifying strings depending on which case we're in. Not ideal,
|
||||||
|
# but it works.
|
||||||
|
|
||||||
|
# Ex. [2017-04-01 09:51] [ALPM] upgraded filesystem (2016.12-2 -> 2017.03-2)
|
||||||
|
upgraded_pattern = re.compile(
|
||||||
|
".*? upgraded (?P<name>\w+) \((?P<from>[^ ]+) -> (?P<to>[^\)]+)\)")
|
||||||
|
|
||||||
|
# Ex: [2018-02-23 21:18] [ALPM] downgraded emacs (25.3-3 -> 25.3-2)
|
||||||
|
downgraded_pattern = re.compile(
|
||||||
|
".*? downgraded (?P<name>\w+) \((?P<to>[^ ]+) -> (?P<from>[^\)]+)\)")
|
||||||
|
|
||||||
|
# Ex: [2017-03-31 07:05] [ALPM] removed gdm (3.22.3-1)
|
||||||
|
removed_pattern = re.compile(
|
||||||
|
".*? removed (?P<name>\w+) \((?P<from>[^ ]+)\)")
|
||||||
|
|
||||||
|
checkpoint = {}
|
||||||
|
flag = False
|
||||||
|
|
||||||
|
with open("/var/log/pacman.log") as logfile:
|
||||||
|
for line in logfile:
|
||||||
|
if date in line:
|
||||||
|
flag = True
|
||||||
|
elif not flag:
|
||||||
|
continue
|
||||||
|
|
||||||
|
match = re.match(upgraded_pattern, line)\
|
||||||
|
or re.match(downgraded_pattern, line)\
|
||||||
|
or re.match(removed_pattern, line)
|
||||||
|
|
||||||
|
if match:
|
||||||
|
package = match.group("name")
|
||||||
|
from_rev = match.group("from")
|
||||||
|
if package not in checkpoint:
|
||||||
|
checkpoint[package] = from_rev
|
||||||
|
continue
|
||||||
|
|
||||||
|
print("Checkpoint state:")
|
||||||
|
for k in checkpoint.keys():
|
||||||
|
print("{0} -> {1}".format(k, checkpoint[k]), file=sys.stderr)
|
||||||
|
|
||||||
|
pkgcache = "/var/cache/pacman/pkg"
|
||||||
|
pkgs = os.listdir(pkgcache)
|
||||||
|
pkgnames = ["{0}-{1}".format(k, v) for k, v in checkpoint.items()]
|
||||||
|
|
||||||
|
selected_pkgs = set([os.path.join(pkgcache, p)
|
||||||
|
for n in pkgnames
|
||||||
|
for p in pkgs
|
||||||
|
if n in p])
|
||||||
|
|
||||||
|
print("Suggested incantation:\n", file=sys.stderr)
|
||||||
|
print("sudo pacman --noconfirm -U {}"
|
||||||
|
.format("\\\n ".join(selected_pkgs)))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main(None, sys.argv[1:])
|
47
projects/flowmetal/call_cc_airflow.md
Normal file
47
projects/flowmetal/call_cc_airflow.md
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
# An Asynchronous, Distributed Task Engine
|
||||||
|
|
||||||
|
This document presents a design without reference implementation for a distributed programming system;
|
||||||
|
sometimes called a workflow engine.
|
||||||
|
It is intended to provide architectural level clarity allowing for the development of alternative designs or implementations as may suit.
|
||||||
|
|
||||||
|
## Problem Statement
|
||||||
|
|
||||||
|
In building, operating and maintaining distributed systems (many computers in concert) engineers face a tooling gap.
|
||||||
|
|
||||||
|
Within the confines of a single computer, we have shells (`bash`, `csh`, `zsh`, `oil` etc.)
|
||||||
|
and a suite of small programs which mesh together well enough for the completion of small tasks with ad-hoc automation.
|
||||||
|
This is an enormous tooling win, as it allows small tasks to be automated at least for a time with a minimum of effort and with tools close to hand.
|
||||||
|
|
||||||
|
In interacting with networks, communicating between computers is difficult with traditional tools and communication failure becomes an ever-present concern.
|
||||||
|
Traditional automation tools such as shells are inadequate for this environment because achieving network communication is excessively difficult.
|
||||||
|
|
||||||
|
In a distributed environment it cannot be assumed that a single machine can remain available to execute automation;
|
||||||
|
This requires an approach to automation which allows for the incremental execution of single tasks at a time with provisions for relocation and recovery should failure occur.
|
||||||
|
|
||||||
|
It also cannot be assumed that a single machine is sufficiently available to receive and process incoming events such as callbacks.
|
||||||
|
A distributed system is needed to wrangle distributed systems.
|
||||||
|
|
||||||
|
## Design Considerations
|
||||||
|
|
||||||
|
- Timeouts are everywhere
|
||||||
|
- Sub-Turing/boundable
|
||||||
|
-
|
||||||
|
|
||||||
|
## Architectural Overview
|
||||||
|
|
||||||
|
### Events
|
||||||
|
Things that will happen, or time out.
|
||||||
|
|
||||||
|
### Actions
|
||||||
|
Things the workflow will do, or time out.
|
||||||
|
|
||||||
|
### Bindings
|
||||||
|
Data the workflow either was given or computed.
|
||||||
|
|
||||||
|
### Conditionals
|
||||||
|
Decisions the workflow may make.
|
||||||
|
|
||||||
|
### Functions
|
||||||
|
A convenient way to talk about fragments of control flow graph.
|
||||||
|
|
||||||
|
### Tracing & Reporting
|
Loading…
Reference in a new issue