]> scripts.mit.edu Git - wizard.git/blobdiff - TODO
Move a number of common parameters to the baton.
[wizard.git] / TODO
diff --git a/TODO b/TODO
index 0cb9ebc3e4751a374991ada52e115ff7274184f9..2f44e559c86b6fb996cc32271446da15c741e62b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -2,43 +2,58 @@ The Git Autoinstaller
 
 TODO NOW:
 
 
 TODO NOW:
 
+- Remove "already migrated" cruft that will accumulate if we do small
+  --limit and then increase.
+- Allow to migrate just one user (user filtering of installs, also
+  has userland capabilities, although it means we need some way of
+  selectively publishing the versions directory)
+- Make migrate script rollback if it's interrupted (especially if
+  by signal)
+
+- Make parallel-find.pl use `sudo -u username git describe --tags`
+  to determine version.  Make parallel-find.pl have this have greater
+  precedence.  This also means, however, that we get
+  full mediawiki-1.2.3-2-abcdef names (Have patch, pending testing and commit)
+- Make the installer use 'wizard install' /or/ do a migration
+  after doing a normal install (the latter makes it easier
+  for mass-rollbacks).
+- Have the upgrader do locking (.scripts/lock, probably)
+
+- Relax MediaWiki regexes to terminate on semicolon, and not
+  require its own line.
+
 - Better error message if daemon/scripts-security-upd
   is not on scripts-security-upd list
 
 - Better error message if daemon/scripts-security-upd
   is not on scripts-security-upd list
 
-- Add repository flag to migrate so that we can specify an
-  arbitrary repository to migrate to
-
-- Build automation for generating config files; this automation
-  will be shared with the migrate script and the installer script
-  (migrate script needs to be able to pull out values from config
-  file, so will we; installer script needs to be able to run
-  the installer to generate config files, so will this)
-
-- The great initial deploy:
-    - Turn on mediawiki new autoinstaller
-    - Migrate all mediawiki installs
-
-- Consider making usermode wizard operation a support mode
-  (mostly for letting users upgrade things themself)
+- MediaWiki upgrade script does not give proper exit code;
+  if it fails, so be sure to check for "Done" in the last 10 characters.
+- Custom merge algo: absolute php.ini symlinks to relative symlinks
+- Custom merge algo: re-constitute AdminSettings.php if missing.  It looks
+  like this is the case for most 1.5.8 installs (check what the merges
+  do in both directions).  All 1.11.0 installs except four have
+  the other (check diff -u with all in /root)
 
 
-- Implement proper deploy log parsing; this basically means we
-  need to be able to introspect Git Log. Consider using git-python
-  for this.  There's also missing functionality, bad error handling
-  and hacks in the prototype implementation of upgrade
+- Make upgrade and install take version as a parameter
 
 
-- Wordpress needs to have .scripts dir in all -scripts versions
-  (remember --no-walk!) (also make .scripts/.htaccess)
-- Wordpress needs to have a .scripts/update script written for
-  its latest version (do this after its migration)
-- Wordpress needs to check for php.ini files (which it almost
-  certianly has) and commit messages
-- Wordpress needs user config and php.ini links made
+- Redo Wordpress conversion, with an eye for automating everything
+  possible (such as downloading the tarball and unpacking)
 
 
+- Genericize callAsUser and drop_priviledges in shell
 - Summary script should be more machine friendly, and should not
   output summary charts when I increase specificity
 - Summary script should be more machine friendly, and should not
   output summary charts when I increase specificity
+
+Some other stuff to do in your copious free time:
+- Summary script should do something intelligent when distinguishing
+  between old-style and new-style installs
 - Check how many autoinstalls are missing w bits for
   daemon.scripts (this would need pyafs)
 - Check how many autoinstalls are missing w bits for
   daemon.scripts (this would need pyafs)
-- Consider fixing Wizard's commit messages
+- Make scripts AFS patch advertise its existence so we can check for it.
+  (This might be otherwise possible using `fs sysname`)
+- Make 'wizard summary' generate nice pretty graphs of installs by date
+  (more histograms, will need to check actual .scripts-version files.)
+- It should be able to handle installs like Django where there's a component
+  that gets installed in web_scripts and another directory that gets installed
+  in Scripts.
 
 PULLING OUT CONFIGURATION FILES IN AN AUTOMATED MANNER
 
 
 PULLING OUT CONFIGURATION FILES IN AN AUTOMATED MANNER
 
@@ -100,18 +115,14 @@ Author: lockername locker <lockername@scripts.mit.edu>
 
 NOTES:
 
 
 NOTES:
 
-- A perfectly formed autoinstall with upgrade paths for all of
-  the intervening versions is not really feasible to implement.
-  As such, we want to migrate everything to -scripts, and then
-  generate a -scripts2 with the correct .scripts directory.
-  We will then nop update some installs, but this will prevent
-  us from having to migrate and update concurrently.  Treat
-  a scripts2 upgrade from migration the same way you would treat
-  a botched scripts upgrade.
+- It is not expected or required for update scripts to exist for all
+  intervening versions that were present pre-migration; only for it
+  to work on the most recent migration.
 
 - Currently all repositories are initialized with --shared, which
   means they have basically ~no space footprint.  However, it
 
 - Currently all repositories are initialized with --shared, which
   means they have basically ~no space footprint.  However, it
-  also means that /mit/scripts/wizard/srv MUST NOT lose revs.
+  also means that /mit/scripts/wizard/srv MUST NOT lose revs after
+  deployment.
 
 - Full fledged logging options. Namely:
   x all loggers (delay implementing this until we actually have debug stmts)
 
 - Full fledged logging options. Namely:
   x all loggers (delay implementing this until we actually have debug stmts)
@@ -120,20 +131,9 @@ NOTES:
   x stdout logger
     - default is WARNING (see below for exception)
     - verbose   => loglevel = INFO
   x stdout logger
     - default is WARNING (see below for exception)
     - verbose   => loglevel = INFO
-  x file logger (only allowed for serial processing)
+  x file logger (creates a dir and lots of little logfiles)
     - default is OFF
     - log-file   => loglevel = INFO
     - default is OFF
     - log-file   => loglevel = INFO
-  x database logger (necessary for parallel processing, not implemented)
-    - default is OFF
-    - log-db    => loglevel = INFO
-
-- More on the database logger: it will be very simple with one
-  table named `logs` in SQLite, with columns: `job`, `level`,
-  `message`.  Job identifies the subprocess/thread that emitted
-  the log, so things can be correlated together.  We will then
-  have `wizard dump` which takes a database like this and dumps
-  it into a file logger type file.  The database may also store
-  a queue like structure which can be used to coordinate jobs.
 
 OVERALL PLAN:
 
 
 OVERALL PLAN:
 
@@ -141,37 +141,34 @@ OVERALL PLAN:
   on documenting them.  Specifically, we will be keeping:
 
     - parallel-find.pl, and the resulting
   on documenting them.  Specifically, we will be keeping:
 
     - parallel-find.pl, and the resulting
-      /mitalso make .scripts/.htaccess/scripts/sec-tools/store/scriptslist
-      This script might need to be adapted if we decide to nuke
-      .scripts-version files.
-
-    - The current install scripts will be kept in place, sans changes
-      necessary to make them use Git install of copying the script over.
-      Porting these scripts to Python and making them modular would be
-      nice, but is priority.  For the long term, seeing this scripts
-      be packaged with rest of our code would be optimal.
+      /mit/scripts/.htaccess/scripts/sec-tools/store/scriptslist
 
 * The new procedure for generating an update is as follows:
   (check out the mass-migration instructions for something in this spirit,
 
 * The new procedure for generating an update is as follows:
   (check out the mass-migration instructions for something in this spirit,
-  although uglier in some ways)
+  although uglier in some ways; A indicates the step /should/ be automated)
 
     0. ssh into not-backward, temporarily give the daemon.scripts-security-upd
        bits by blanching it on system:scripts-security-upd, and run parallel-find.pl
 
     1. Have the Git repository and working copy for the project on hand.
 
 
     0. ssh into not-backward, temporarily give the daemon.scripts-security-upd
        bits by blanching it on system:scripts-security-upd, and run parallel-find.pl
 
     1. Have the Git repository and working copy for the project on hand.
 
-    2. Checkout the pristine branch
+/- wizard prepare-pristine --
 
 
-    3. Remove all files from the working copy.  Use `wipe-working-dir`
+A   2. Checkout the pristine branch
 
 
-    4. Download the new tarball
+A   3. Remove all files from the working copy.  Use `wipe-working-dir`
 
 
-    5. Extract the tarball over the working copy (`cp -R a/. b` works well,
-       remember that the working copy is empty)
+A   4. Download the new tarball
 
 
-    6. Check for empty directories and add stub files as necessary.
+A   5. Extract the tarball over the working copy (`cp -R a/. b` works well,
+       remember that the working copy is empty; this needs some intelligent
+       input)
+
+A   6. Check for empty directories and add stub files as necessary.
        Use `preserve-empty-dir`
 
        Use `preserve-empty-dir`
 
+\---
+
     7. Git add it all, and then commit as a new pristine version (v1.2.3)
 
     8. Checkout the master branch
     7. Git add it all, and then commit as a new pristine version (v1.2.3)
 
     8. Checkout the master branch
@@ -183,33 +180,40 @@ OVERALL PLAN:
        to keep our history clean
 
        [FOR NEW REPOSITORIES]
        to keep our history clean
 
        [FOR NEW REPOSITORIES]
-       See if any patches are needed to make this run smoothly on
-       scripts.
-
-    [FOR NEW REPOSITORIES]
-        mkdir .scripts
-        echo "Deny from all" > .scripts/.htaccess
-        touch .scripts/update
-        chmod a+x .scripts/update
-
-   10. Check if there are any special update procedures, and update/create the
-       .scripts/update shell script as necessary (this means that any
-       application specific update logic will be kept with the actual
-       source code.  The language of this update script will vary
-       depending on context.)
-
-   11. Commit your changes, and tag as v1.2.3-scripts (or scripts2, if
+       Check if any patches are needed to make the application work
+       on Scripts (ideally, it shouldn't.
+
+/- wizard prepare-new --
+
+    Currently not used for anything besides parallel-find.pl, but
+    we reserve the right to place files in here in the future.
+
+A       mkdir .scripts
+A       echo "Deny from all" > .scripts/.htaccess
+
+\---
+
+   10. Check if there are any special update procedures, and update
+       the wizard.app.APPNAME module accordingly (or create it, if
+       need be).
+
+   11. Run 'wizard prepare-config' on a scripts server while in a checkout
+       of this newest version.  This will prepare a new version of the
+       configuration file based on the application's latest installer.
+       Manually merge back in any custom changes we may have made.
+       Check if any of the regular expressions need tweaking by inspecting
+       the configuration files for user-specific gunk, and modify
+       wizard.app.APPNAME accordingly.
+
+   12. Commit your changes, and tag as v1.2.3-scripts (or scripts2, if
        you are amending an install without an upstream changes)
 
        you are amending an install without an upstream changes)
 
-   12. Test the new update procedure using
-       `wizard upgrade --with=/path/to/repo /your/autoinstall` (this will
-       read out master as your "latest" version).
-       Use git commit --amend to fix any bugs (alternatively, squash them
-       together later).
+      NOTE: These steps should be run on a scripts server
 
 
-   13. You can also do a "mass" version of this using:
-       `wizard -d testbed.txt massupgrade --with=/path/to/repo app`
-       You'll need perms for any testbed stuff you want.
+   13. Test the new update procedure using our test scripts.  See integration
+       tests for more information on how to do this.
+
+        http://scripts.mit.edu/wizard/testing.html#acceptance-tests
 
       GET APPROVAL BEFORE PROCEEDING ANY FURTHER
 
 
       GET APPROVAL BEFORE PROCEEDING ANY FURTHER
 
@@ -218,121 +222,53 @@ OVERALL PLAN:
       scripts-security-upd to get bits to do this.  Make sure you remove
       these bits when you're done.
 
       scripts-security-upd to get bits to do this.  Make sure you remove
       these bits when you're done.
 
-   14. Run `wizard research appname`
+A  14. Run `wizard research appname`
        which uses Git commands to check how many
        working copies apply the change cleanly, and writes out a logfile
        with the working copies that don't apply cleanly.  It also tells
        which uses Git commands to check how many
        working copies apply the change cleanly, and writes out a logfile
        with the working copies that don't apply cleanly.  It also tells
-       us about "corrupt" working copies.
+       us about "corrupt" working copies, i.e. working copies that
+       have over a certain threshold of changes.
 
 
-   15. Run `wizard massupgrade appname`, which applies the update to all working
+A  15. Run `wizard mass-upgrade appname`, which applies the update to all working
        copies possible, and sends mail to users to whom the working copy
        copies possible, and sends mail to users to whom the working copy
-       did not apply cleanly. It also frobs .scripts-version for successful
-       upgrades (maybe not, depending on our plans).
+       did not apply cleanly.
 
    16. Run parallel-find.pl to update our inventory
 
 
    16. Run parallel-find.pl to update our inventory
 
-* For mass importing into the repository, the steps are:
-  (this probably won't ever be automated, becuase there are fiddly bits)
-
-[TO SET IT UP]
-# let app-1.2.3 be the scripts folder originally in deploydev
-# let this folder be srv/
-# you can also do a git clone
-    mkdir app
-    cd app
-    git init
-    cd ..
-unfurl app-1.2.3 app  # [FIDDLY BIT]
-# NOTE: contents of application are now in app directory
-cd app
-git add .
-git commit -s -m "App 1.2.3"
-git tag v1.2.3
-git branch pristine
-# NOTE: you're still on master branch
-# WARNING: the following operation might require -p1
-patch -p0 < ../app-1.2.3/app-1.2.3.patch  # [FIDDLY BIT]
-# NOTE: please sanity check the patch!
-git add .
-# NOTE: -a flag is to handle if the patch deleted something
-git commit -as -m "App 1.2.3-scripts"
-git tag v1.2.3-scripts
-
-[TO ADD AN UPDATE]
-# let this folder be srv/app.git
-git checkout pristine
-# NOTE: this preserves your .git folder, but removes everything
-wipe-working-dir .
-cd ..
-unfurl app-1.2.3 app  # [FIDDLY BIT]
-cd app
-# NOTE: please sanity check app directory
-git add .
-# NOTE: -a is to take care of deletions
-git commit -as -m "App 1.2.3"
-git tag v1.2.3
-[FIDDLE AROUND. FIDDLE AROUND]
-[IF THE PATCH HAS CHANGED]
-    # You are on the pristine branch
-    # NOTE: Now, the tricky part (this is different from a real update)
-    git symbolic-ref HEAD refs/heads/master
-    # NOTE: Now, we think we're on the master branch, but we have
-    # pristine copy checked out
-    # NOTE: -p0 might need to be twiddled
-    patch -p0 < ../app-1.2.3/app-1.2.3.patch
-    git add .
-    # COMMENT: used to git checkout .scripts here
-    # then check if the directory needs an updated update script
-    # NOTE: Fake the merge
-    git rev-parse pristine > .git/MERGE_HEAD
-[IF THE PATCH HASN'T CHANGED]
-    git checkout master
-    git merge --no-commit pristine
-git commit -as -m "App 1.2.3-scripts"
-git tag v1.2.3-scripts
-
-* The repository for a given application will contain the following files:
-
-    - The actual application's files, as from the official tarball
-
-    - A .scripts directory, which contains the following information:
-
-        * .scripts/update shell script (with the +x bit set appropriately),
-          which performs the commands necessary to update a script.  This can
-          be in any language.
+* For mass importing into the repository, there are a few extra things:
 
 
-        * .scripts/.htaccess to prevent this directory from being accessed
-          from the web.
+    * Many applications had patches associated with them.  Be sure to
+      apply them, so later merges work better.
 
 
-        * .scripts/database (generated) contains the database the
-          user installed the script to, so scripts-remove can clean it
+        # the following operation might require -p1
+        patch -p0 < ../app-1.2.3/app-1.2.3.patch  # [FIDDLY BIT]
 
 
-            XXX: Could cause problems if a user copies the autoinstall,
-            fiddles with the DB credentials, and then scripts-remove's
-            the autoinstall.  Possible fix is to add the original
-            directory as a sanity check.  Additionally, we could have
-            the application read out of this file.
+    * When running updates, if the patch has changed you will have to
+      do a special procedure for your merge:
 
 
-        * .scripts/old-version (optional) the old value of .scripts-versoin
+        git checkout pristine
+        # NOTE: Now, the tricky part (this is different from a real update)
+        git symbolic-ref HEAD refs/heads/master
+        # NOTE: Now, we think we're on the master branch, but we have
+        # pristine copy checked out
+        # NOTE: -p0 might need to be twiddled
+        patch -p0 < ../app-1.2.3/app-1.2.3.patch
+        git add .
+        # reconstitute .scripts directory
+        git checkout v1.2.2-scripts -- .scripts
+        git add .scripts
+        # NOTE: Fake the merge
+        git rev-parse pristine > .git/MERGE_HEAD
 
 
-        * .scripts/install (eventually) interactively installs the
-          applicatoin from command line.
+      You could also just try your luck with a manual merge using the patch
+      as your guide.
 
 
-* The autoupgrade shall be the process of:
+* The repository for a given application will contain the following files:
 
 
-    # Make the directory not accessible by the outside world (htaccess, but be careful!)
-    git add -u .
-    git commit -m 'automatically generated backup'
-    git pull origin master
-    if [ $? ne 0 ]; then git reset --hard; echo 'conflicts during upgrade'; fi
-    ./.scripts/update
-    # Make it accessible
+    - The actual application's files, as from the official tarball
 
 
-  (with some more robust error checking, a proper dry run mechanism to, and
-  lots of su'ing)
+    - A .scripts directory, with the intent of holding Scripts specific files
+      if they become necessary.
 
 
-* Make 'wizard summary' generate nice pretty graphs of installs by date
-  (more histograms, will need to check actual .scripts-version files.)
+        * .scripts/lock (generated) which locks an autoinstall during upgrade
 
 
-* Update AFS patch to advertise its existence, so we can check for it
-  here.