| 
									
										
										
										
											2018-03-05 20:51:42 -08:00
										 |  |  | import { restoreMastodonData } from './restore-mastodon-data' | 
					
						
							| 
									
										
										
										
											2019-01-19 15:06:25 -08:00
										 |  |  | import { promisify } from 'util' | 
					
						
							| 
									
										
										
										
											2018-03-05 20:51:42 -08:00
										 |  |  | import childProcessPromise from 'child-process-promise' | 
					
						
							|  |  |  | import path from 'path' | 
					
						
							|  |  |  | import fs from 'fs' | 
					
						
							| 
									
										
										
										
											2018-03-06 09:21:17 -08:00
										 |  |  | import { waitForMastodonUiToStart, waitForMastodonApiToStart } from './wait-for-mastodon-to-start' | 
					
						
							| 
									
										
										
										
											2018-03-05 20:53:52 -08:00
										 |  |  | import mkdirpCB from 'mkdirp' | 
					
						
							| 
									
										
										
										
											2018-03-05 20:51:42 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const exec = childProcessPromise.exec | 
					
						
							|  |  |  | const spawn = childProcessPromise.spawn | 
					
						
							| 
									
										
										
										
											2019-01-19 15:06:25 -08:00
										 |  |  | const mkdirp = promisify(mkdirpCB) | 
					
						
							|  |  |  | const stat = promisify(fs.stat) | 
					
						
							|  |  |  | const writeFile = promisify(fs.writeFile) | 
					
						
							| 
									
										
										
										
											2018-03-05 20:51:42 -08:00
										 |  |  | const dir = __dirname | 
					
						
							| 
									
										
										
										
											2018-02-18 10:42:27 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-07 15:26:47 -07:00
										 |  |  | const GIT_URL = 'https://github.com/tootsuite/mastodon.git' | 
					
						
							| 
									
										
										
										
											2019-01-20 13:44:06 -08:00
										 |  |  | const GIT_TAG = 'v2.7.0' | 
					
						
							| 
									
										
										
										
											2018-04-10 18:39:56 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | const DB_NAME = 'pinafore_development' | 
					
						
							|  |  |  | const DB_USER = 'pinafore' | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  | const DB_PASS = 'pinafore' | 
					
						
							| 
									
										
										
										
											2018-06-07 15:26:47 -07:00
										 |  |  | const DB_PORT = process.env.PGPORT || 5432 | 
					
						
							|  |  |  | const DB_HOST = '127.0.0.1' | 
					
						
							| 
									
										
										
										
											2018-04-08 14:43:24 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-18 10:42:27 -08:00
										 |  |  | const envFile = `
 | 
					
						
							|  |  |  | PAPERCLIP_SECRET=foo | 
					
						
							|  |  |  | SECRET_KEY_BASE=bar | 
					
						
							|  |  |  | OTP_SECRET=foobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobarfoobar | 
					
						
							| 
									
										
										
										
											2018-06-07 15:26:47 -07:00
										 |  |  | DB_HOST=${DB_HOST} | 
					
						
							|  |  |  | DB_PORT=${DB_PORT} | 
					
						
							| 
									
										
										
										
											2018-04-10 16:45:51 -07:00
										 |  |  | DB_USER=${DB_USER} | 
					
						
							| 
									
										
										
										
											2018-04-10 18:39:56 -07:00
										 |  |  | DB_NAME=${DB_NAME} | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  | DB_PASS=${DB_PASS} | 
					
						
							| 
									
										
										
										
											2018-02-18 10:42:27 -08:00
										 |  |  | `
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  | const mastodonDir = path.join(dir, '../mastodon') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-06 21:32:56 -08:00
										 |  |  | let childProc | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-18 15:30:42 -08:00
										 |  |  | async function cloneMastodon () { | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   try { | 
					
						
							|  |  |  |     await stat(mastodonDir) | 
					
						
							|  |  |  |   } catch (e) { | 
					
						
							|  |  |  |     console.log('Cloning mastodon...') | 
					
						
							| 
									
										
										
										
											2018-06-08 21:53:59 -07:00
										 |  |  |     await exec(`git clone --single-branch --branch master ${GIT_URL} "${mastodonDir}"`) | 
					
						
							| 
									
										
										
										
											2018-12-08 12:46:00 -08:00
										 |  |  |     await exec(`git fetch origin --tags`, { cwd: mastodonDir }) // may already be cloned, e.g. in CI
 | 
					
						
							| 
									
										
										
										
											2018-06-07 15:26:47 -07:00
										 |  |  |     await exec(`git checkout ${GIT_TAG}`, { cwd: mastodonDir }) | 
					
						
							| 
									
										
										
										
											2018-02-18 10:42:27 -08:00
										 |  |  |     await writeFile(path.join(dir, '../mastodon/.env'), envFile, 'utf8') | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-05 23:56:48 -08:00
										 |  |  | async function setupMastodonDatabase () { | 
					
						
							| 
									
										
										
										
											2018-03-05 10:10:50 -08:00
										 |  |  |   console.log('Setting up mastodon database...') | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   try { | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  |     await exec(`psql -d template1 -c "CREATE USER ${DB_USER} WITH PASSWORD '${DB_PASS}' CREATEDB;"`) | 
					
						
							| 
									
										
										
										
											2018-04-10 18:39:56 -07:00
										 |  |  |   } catch (e) { /* ignore */ } | 
					
						
							|  |  |  |   try { | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  |     await exec(`dropdb -h 127.0.0.1 -U ${DB_USER} -w ${DB_NAME}`, { | 
					
						
							|  |  |  |       cwd: mastodonDir, | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |       env: Object.assign({ PGPASSWORD: DB_PASS }, process.env) | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  |     }) | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   } catch (e) { /* ignore */ } | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  |   await exec(`createdb -h 127.0.0.1 -U ${DB_USER} -w ${DB_NAME}`, { | 
					
						
							|  |  |  |     cwd: mastodonDir, | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |     env: Object.assign({ PGPASSWORD: DB_PASS }, process.env) | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-19 13:32:36 -08:00
										 |  |  |   let dumpFile = path.join(dir, '../tests/fixtures/dump.sql') | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  |   await exec(`psql -h 127.0.0.1 -U ${DB_USER} -w -d ${DB_NAME} -f "${dumpFile}"`, { | 
					
						
							|  |  |  |     cwd: mastodonDir, | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |     env: Object.assign({ PGPASSWORD: DB_PASS }, process.env) | 
					
						
							| 
									
										
										
										
											2018-04-10 18:53:22 -07:00
										 |  |  |   }) | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-19 13:32:36 -08:00
										 |  |  |   let tgzFile = path.join(dir, '../tests/fixtures/system.tgz') | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   let systemDir = path.join(mastodonDir, 'public/system') | 
					
						
							|  |  |  |   await mkdirp(systemDir) | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |   await exec(`tar -xzf "${tgzFile}"`, { cwd: systemDir }) | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-18 15:30:42 -08:00
										 |  |  | async function runMastodon () { | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   console.log('Running mastodon...') | 
					
						
							| 
									
										
										
										
											2018-06-07 15:26:47 -07:00
										 |  |  |   let env = Object.assign({}, process.env, { | 
					
						
							|  |  |  |     RAILS_ENV: 'development', | 
					
						
							|  |  |  |     NODE_ENV: 'development', | 
					
						
							|  |  |  |     DB_NAME, | 
					
						
							|  |  |  |     DB_USER, | 
					
						
							|  |  |  |     DB_PASS, | 
					
						
							|  |  |  |     DB_HOST, | 
					
						
							|  |  |  |     DB_PORT | 
					
						
							|  |  |  |   }) | 
					
						
							|  |  |  |   let cwd = mastodonDir | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   let cmds = [ | 
					
						
							| 
									
										
										
										
											2018-03-08 18:08:14 -08:00
										 |  |  |     'gem install bundler foreman', | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |     'bundle install', | 
					
						
							| 
									
										
										
										
											2018-06-07 15:26:47 -07:00
										 |  |  |     'bundle exec rails db:migrate', | 
					
						
							| 
									
										
										
										
											2018-04-10 19:32:47 -07:00
										 |  |  |     'yarn --pure-lockfile' | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   ] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-11-11 11:12:47 -08:00
										 |  |  |   const installedFile = path.join(mastodonDir, 'installed.txt') | 
					
						
							|  |  |  |   try { | 
					
						
							|  |  |  |     await stat(installedFile) | 
					
						
							|  |  |  |     console.log('Already installed Mastodon') | 
					
						
							|  |  |  |   } catch (e) { | 
					
						
							|  |  |  |     console.log('Installing Mastodon...') | 
					
						
							|  |  |  |     for (let cmd of cmds) { | 
					
						
							|  |  |  |       console.log(cmd) | 
					
						
							|  |  |  |       await exec(cmd, { cwd, env }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     await writeFile(installedFile, '', 'utf8') | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-08-29 21:42:57 -07:00
										 |  |  |   const promise = spawn('foreman', ['start'], { cwd, env }) | 
					
						
							|  |  |  |   const log = fs.createWriteStream('mastodon.log', { flags: 'a' }) | 
					
						
							| 
									
										
										
										
											2018-03-06 21:32:56 -08:00
										 |  |  |   childProc = promise.childProcess | 
					
						
							|  |  |  |   childProc.stdout.pipe(log) | 
					
						
							|  |  |  |   childProc.stderr.pipe(log) | 
					
						
							| 
									
										
										
										
											2018-04-10 19:43:36 -07:00
										 |  |  |   promise.catch(err => { | 
					
						
							|  |  |  |     console.error('foreman start failed, see mastodon.log for details') | 
					
						
							|  |  |  |     console.error(err) | 
					
						
							|  |  |  |     shutdownMastodon() | 
					
						
							|  |  |  |     process.exit(1) | 
					
						
							|  |  |  |   }) | 
					
						
							| 
									
										
										
										
											2018-02-18 10:42:27 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-18 15:30:42 -08:00
										 |  |  | async function main () { | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   await cloneMastodon() | 
					
						
							| 
									
										
										
										
											2018-03-05 20:51:42 -08:00
										 |  |  |   await setupMastodonDatabase() | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   await runMastodon() | 
					
						
							| 
									
										
										
										
											2018-03-05 21:21:28 -08:00
										 |  |  |   await waitForMastodonApiToStart() | 
					
						
							| 
									
										
										
										
											2018-03-06 09:04:09 -08:00
										 |  |  |   await restoreMastodonData() | 
					
						
							| 
									
										
										
										
											2018-03-05 21:58:29 -08:00
										 |  |  |   await waitForMastodonUiToStart() | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-06 23:57:06 -08:00
										 |  |  | function shutdownMastodon () { | 
					
						
							| 
									
										
										
										
											2018-03-06 21:32:56 -08:00
										 |  |  |   if (childProc) { | 
					
						
							|  |  |  |     console.log('killing child process') | 
					
						
							|  |  |  |     childProc.kill() | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-03-06 09:03:59 -08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | process.on('SIGINT', function () { | 
					
						
							|  |  |  |   shutdownMastodon() | 
					
						
							| 
									
										
										
										
											2018-02-18 11:53:50 -08:00
										 |  |  |   process.exit(0) | 
					
						
							|  |  |  | }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-02-18 10:42:27 -08:00
										 |  |  | main().catch(err => { | 
					
						
							|  |  |  |   console.error(err) | 
					
						
							| 
									
										
										
										
											2018-03-06 09:03:59 -08:00
										 |  |  |   shutdownMastodon() | 
					
						
							| 
									
										
										
										
											2018-02-18 10:42:27 -08:00
										 |  |  |   process.exit(1) | 
					
						
							|  |  |  | }) |