mirror of
				https://git.sr.ht/~cadence/bibliogram
				synced 2025-10-31 11:35:35 +00:00 
			
		
		
		
	Add updater page, disabled by default
This commit is contained in:
		
							parent
							
								
									aac358cd65
								
							
						
					
					
						commit
						d6ee6c0411
					
				| @ -25,13 +25,15 @@ let constants = { | |||||||
| 
 | 
 | ||||||
| 	settings: { | 	settings: { | ||||||
| 		rss_enabled: true, | 		rss_enabled: true, | ||||||
| 		display_feed_validation_buttons: false | 		display_feed_validation_buttons: false, | ||||||
|  | 		enable_updater_page: false | ||||||
| 	}, | 	}, | ||||||
| 
 | 
 | ||||||
| 	caching: { | 	caching: { | ||||||
| 		image_cache_control: `public, max-age=${7*24*60*60}`, | 		image_cache_control: `public, max-age=${7*24*60*60}`, | ||||||
| 		resource_cache_time: 30*60*1000, | 		resource_cache_time: 30*60*1000, | ||||||
| 		instance_list_cache_time: 3*60*1000, | 		instance_list_cache_time: 3*60*1000, | ||||||
|  | 		updater_cache_time: 2*60*1000, | ||||||
| 		db_user_id: true, | 		db_user_id: true, | ||||||
| 		db_post_n3: true | 		db_post_n3: true | ||||||
| 	}, | 	}, | ||||||
|  | |||||||
							
								
								
									
										62
									
								
								src/site/api/admin.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								src/site/api/admin.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,62 @@ | |||||||
|  | const child_process = require("child_process") | ||||||
|  | const constants = require("../../lib/constants") | ||||||
|  | const {render} = require("pinski/plugins") | ||||||
|  | 
 | ||||||
|  | function run(command) { | ||||||
|  | 	return new Promise((resolve, reject) => { | ||||||
|  | 		child_process.exec(command, {encoding: "utf8"}, (error, stdout, stderr) => { | ||||||
|  | 			if (error) reject(error) | ||||||
|  | 			else resolve({stdout, stderr}) | ||||||
|  | 		}) | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | let lastFetchRunAt = 0 | ||||||
|  | async function fetch() { | ||||||
|  | 	if (lastFetchRunAt + constants.caching.updater_cache_time < Date.now()) { | ||||||
|  | 		await run("git fetch origin") | ||||||
|  | 		lastFetchRunAt = Date.now() | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | module.exports = [ | ||||||
|  | 	{route: "/admin/updater", methods: ["GET"], code: async () => { | ||||||
|  | 		if (constants.settings.enable_updater_page) { | ||||||
|  | 			let {stdout: current} = await run("git rev-parse --abbrev-ref HEAD") | ||||||
|  | 			current = current.trim() | ||||||
|  | 			let {stdout: upstream} = await run("git rev-parse --abbrev-ref '@{u}'") | ||||||
|  | 			upstream = upstream.trim() | ||||||
|  | 			if (current !== "master" || upstream !== "origin/master") { | ||||||
|  | 				return render(200, "pug/admin_update.pug", {error: `Refusing to automatically update: current is ${current}, upstream is ${upstream}, need master and origin/master`}) | ||||||
|  | 			} else { | ||||||
|  | 				await fetch() | ||||||
|  | 				let {stdout: log} = await run("git log --oneline origin/master ^master") | ||||||
|  | 				log = log.trim() | ||||||
|  | 				const numberOfCommits = log === "" ? 0 : log.split("\n").length | ||||||
|  | 				const {stdout: changedFiles} = await run("git diff master origin/master --name-only") | ||||||
|  | 				const changedFilesList = changedFiles.trim().split("\n") | ||||||
|  | 				let requiresRestart = false | ||||||
|  | 				let requiresDeps = false | ||||||
|  | 				if (changedFilesList.some(c => c.startsWith("src/lib") || c === "server.js")) { | ||||||
|  | 					requiresRestart = true | ||||||
|  | 				} | ||||||
|  | 				if (changedFilesList.some(c => c === "package.json" || c === "package-lock.json")) { | ||||||
|  | 					requiresDeps = true | ||||||
|  | 					requiresRestart = true | ||||||
|  | 				} | ||||||
|  | 				const formattedLog = log.split("\n").map(line => { | ||||||
|  | 					if (!line) return line // skip for empty string
 | ||||||
|  | 					const [hash, message] = line.match(/(\w+) (.*)$/).slice(1) | ||||||
|  | 					return {hash, message} | ||||||
|  | 				}) | ||||||
|  | 				return render(200, "pug/admin_update.pug", {formattedLog, numberOfCommits, requiresDeps, requiresRestart}) | ||||||
|  | 			} | ||||||
|  | 		} else { | ||||||
|  | 			return render(403, "pug/friendlyerror.pug", { | ||||||
|  | 				statusCode: 403, | ||||||
|  | 				title: "Updater page disabled", | ||||||
|  | 				message: "Updater page disabled" | ||||||
|  | 			}) | ||||||
|  | 		} | ||||||
|  | 	}} | ||||||
|  | ] | ||||||
							
								
								
									
										32
									
								
								src/site/pug/admin_update.pug
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								src/site/pug/admin_update.pug
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,32 @@ | |||||||
|  | //- Needs {error} or {formattedLog, numberOfCommits, requiresDeps, requiresRestart} | ||||||
|  | 
 | ||||||
|  | doctype html | ||||||
|  | html | ||||||
|  | 	head | ||||||
|  | 		title Updater | Bibliogram | ||||||
|  | 		include includes/head | ||||||
|  | 	body.updater-page | ||||||
|  | 		if error | ||||||
|  | 			h1 Aw man. | ||||||
|  | 			div= error | ||||||
|  | 		else | ||||||
|  | 			h1 Bibliogram updater | ||||||
|  | 			if numberOfCommits > 0 | ||||||
|  | 				div You are #{numberOfCommits} commits behind (most recent first): | ||||||
|  | 				div.commits | ||||||
|  | 					each line in formattedLog | ||||||
|  | 						div.commit | ||||||
|  | 							code.hash= line.hash | ||||||
|  | 							span.message= line.message | ||||||
|  | 				div | ||||||
|  | 					if requiresDeps | ||||||
|  | 						span.attention You must run #[code npm install] after pulling. | ||||||
|  | 					else | ||||||
|  | 						span No changes to dependencies. | ||||||
|  | 				div | ||||||
|  | 					if requiresRestart | ||||||
|  | 						span.attention You must restart Bibliogram after pulling. | ||||||
|  | 					else | ||||||
|  | 						span You do not need to restart Bibliogram after pulling. | ||||||
|  | 			else | ||||||
|  | 				div You are running the latest version. Hurrah! | ||||||
| @ -518,3 +518,29 @@ body | |||||||
| 		border: 2px solid #aaa | 		border: 2px solid #aaa | ||||||
| 		font-weight: bold | 		font-weight: bold | ||||||
| 		background-color: #282828 | 		background-color: #282828 | ||||||
|  | 
 | ||||||
|  | .updater-page | ||||||
|  | 	font-size: 20px | ||||||
|  | 	max-width: 800px | ||||||
|  | 	margin: 0 auto | ||||||
|  | 	color: #222 | ||||||
|  | 
 | ||||||
|  | 	code | ||||||
|  | 		font-size: 0.9em | ||||||
|  | 		background: #ccc | ||||||
|  | 		color: #000 | ||||||
|  | 		padding: 0px 4px | ||||||
|  | 		border-radius: 2px | ||||||
|  | 
 | ||||||
|  | 	.commits | ||||||
|  | 		border-left: 2px solid #555 | ||||||
|  | 		margin: 10px 0px | ||||||
|  | 		padding-left: 10px | ||||||
|  | 
 | ||||||
|  | 		.hash | ||||||
|  | 			margin-right: 6px | ||||||
|  | 
 | ||||||
|  | 	.attention | ||||||
|  | 		border-left: 2px solid | ||||||
|  | 		padding-left: 8px | ||||||
|  | 		color: #700 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user