| 
									
										
										
										
											2017-10-21 21:10:33 -04:00
										 |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-02 20:46:46 -04:00
										 |  |  | const dateUtils = require('./date_utils'); | 
					
						
							| 
									
										
										
										
											2018-04-01 21:27:46 -04:00
										 |  |  | const optionService = require('./options'); | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | const fs = require('fs-extra'); | 
					
						
							| 
									
										
										
										
											2017-10-23 23:30:23 -04:00
										 |  |  | const dataDir = require('./data_dir'); | 
					
						
							| 
									
										
										
										
											2017-10-24 22:17:48 -04:00
										 |  |  | const log = require('./log'); | 
					
						
							| 
									
										
										
										
											2017-11-29 20:47:01 -05:00
										 |  |  | const sql = require('./sql'); | 
					
						
							| 
									
										
										
										
											2018-04-01 21:27:46 -04:00
										 |  |  | const syncMutexService = require('./sync_mutex'); | 
					
						
							| 
									
										
										
										
											2018-03-28 23:41:22 -04:00
										 |  |  | const cls = require('./cls'); | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | async function regularBackup() { | 
					
						
							| 
									
										
										
										
											2017-12-10 12:56:59 -05:00
										 |  |  |     const now = new Date(); | 
					
						
							| 
									
										
										
										
											2018-04-02 20:46:46 -04:00
										 |  |  |     const lastBackupDate = dateUtils.parseDateTime(await optionService.getOption('last_backup_date')); | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-10 12:56:59 -05:00
										 |  |  |     console.log(lastBackupDate); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (now.getTime() - lastBackupDate.getTime() > 43200 * 1000) { | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  |         await backupNow(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     await cleanupOldBackups(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function backupNow() { | 
					
						
							| 
									
										
										
										
											2018-01-04 21:37:36 -05:00
										 |  |  |     // we don't want to backup DB in the middle of sync with potentially inconsistent DB state
 | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-01 21:27:46 -04:00
										 |  |  |     await syncMutexService.doExclusively(async () => { | 
					
						
							| 
									
										
										
										
											2018-04-02 20:46:46 -04:00
										 |  |  |         const backupFile = dataDir.BACKUP_DIR + "/" + "backup-" + dateUtils.getDateTimeForFile() + ".db"; | 
					
						
							| 
									
										
										
										
											2017-10-24 22:17:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-04 21:37:36 -05:00
										 |  |  |         fs.copySync(dataDir.DOCUMENT_PATH, backupFile); | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-04 21:37:36 -05:00
										 |  |  |         log.info("Created backup at " + backupFile); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-02 20:46:46 -04:00
										 |  |  |         await optionService.setOption('last_backup_date', dateUtils.nowDate()); | 
					
						
							| 
									
										
										
										
											2018-01-13 22:51:39 -05:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | async function cleanupOldBackups() { | 
					
						
							|  |  |  |     const now = new Date(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-23 23:30:23 -04:00
										 |  |  |     fs.readdirSync(dataDir.BACKUP_DIR).forEach(file => { | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  |         const match = file.match(/backup-([0-9 -:]+)\.db/); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (match) { | 
					
						
							| 
									
										
										
										
											2017-10-22 20:22:09 -04:00
										 |  |  |             const date_str = match[1]; | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |             const date = Date.parse(date_str); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (now.getTime() - date.getTime() > 30 * 24 * 3600 * 1000) { | 
					
						
							| 
									
										
										
										
											2017-10-24 22:17:48 -04:00
										 |  |  |                 log.info("Removing old backup - " + file); | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-23 23:30:23 -04:00
										 |  |  |                 fs.unlink(dataDir.BACKUP_DIR + "/" + file); | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-28 12:23:11 -04:00
										 |  |  | if (!fs.existsSync(dataDir.BACKUP_DIR)) { | 
					
						
							|  |  |  |     fs.mkdirSync(dataDir.BACKUP_DIR, 0o700); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-03 19:18:33 -05:00
										 |  |  | sql.dbReady.then(() => { | 
					
						
							| 
									
										
										
										
											2018-03-28 23:41:22 -04:00
										 |  |  |     setInterval(cls.wrap(regularBackup), 60 * 60 * 1000); | 
					
						
							| 
									
										
										
										
											2017-10-28 12:23:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-03 19:18:33 -05:00
										 |  |  |     // kickoff backup immediately
 | 
					
						
							| 
									
										
										
										
											2018-03-28 23:41:22 -04:00
										 |  |  |     setTimeout(cls.wrap(regularBackup), 1000); | 
					
						
							| 
									
										
										
										
											2017-12-03 19:18:33 -05:00
										 |  |  | }); | 
					
						
							| 
									
										
										
										
											2017-10-28 12:23:11 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-14 23:31:44 -04:00
										 |  |  | module.exports = { | 
					
						
							|  |  |  |     backupNow | 
					
						
							|  |  |  | }; |