Fix device.getDrive returning incorrect promise

rolled back change in useradmin/view drive
pull/4/head
AdamSBlack 2022-01-16 17:32:37 +00:00
parent 6a229eadb0
commit 0fa15ee61c
No known key found for this signature in database
GPG Key ID: E66E51A97D150E28
3 changed files with 93 additions and 93 deletions

View File

@ -193,7 +193,8 @@ async function getDrives(dongleId, includeDeleted, includeMeta) {
}
async function getDrive(dongleId, identifier) {
const drive = orm.models.drives.findOne({ where: { identifier, dongle_id: dongleId } });
const drive = await orm.models.drives.findOne({ where: { identifier, dongle_id: dongleId } });
console.log(drive);
if (drive.dataValues) return drive.dataValues;
return null;

View File

@ -573,65 +573,64 @@ router.get('/useradmin/drive/:dongleId/:driveIdentifier', runAsyncWrapper(async
<table border=1 cellpadding=2 cellspacing=2>
<tr><th>segment</th><th>qcamera</th><th>qlog</th><th>fcamera</th><th>rlog</th><th>dcamera</th><th>processed</th><th>stalled</th></tr>`;
const directoryTree = dirTree(`${config.storagePath + device.dongle_id}/${dongleIdHash}/${driveIdentifierHash}/${drive.identifier}`);
const directoryTree = dirTree(config.storagePath + device.dongle_id + "/" + dongleIdHash + "/" + driveIdentifierHash + "/" + drive.identifier);
const directorySegments = {};
await Promise.all(directoryTree.children
for (var i in directoryTree.children) {
// skip any non-directory entries (for example m3u8 file in the drive directory)
.filter((file) => file.type === 'directory')
.map(async (directory) => {
const segment = directory.name;
if (directoryTree.children[i].type != 'directory') continue;
// generate file links
const files = {
qcamera: '--',
fcamera: '--',
dcamera: '--',
qlog: '--',
rlog: '--',
};
directory.children
.filter((file) => file.name in files)
.forEach((file) => {
files[file.name] = `<a target="_blank" href="${driveUrl}${segment}/${file.name}">${file.name}</a>`;
});
var segment = directoryTree.children[i].name;
// get processed/stalled status
let isProcessed = '?';
let isStalled = '?';
const driveSegment = await deviceController.getDriveSegment(device.dongle_id, drive.identifier, parseInt(segment, 10));
if (driveSegment) {
isProcessed = driveSegment.is_processed;
isStalled = driveSegment.is_stalled;
}
directorySegments[`seg-${segment}`] = `<tr>
<td>${segment}</td>
<td>${files.qcamera}</td>
<td>${files.qlog}</td>
<td>${files.fcamera}</td>
<td>${files.rlog}</td>
<td>${files.dcamera}</td>
<td>${isProcessed}</td>
<td>${isStalled}</td>
</tr>`;
}));
for (let i = 0; i <= drive.max_segment; i++) {
if (directorySegments[`seg-${i}`]) {
response += directorySegments[`seg-${i}`];
} else {
response += `<tr><td>${i}</td><td>--</td><td>--</td><td>--</td><td>--</td><td>--</td><td>?</td><td>?</td></tr>`;
var qcamera = '--';
var fcamera = '--';
var dcamera = '--';
var qlog = '--';
var rlog = '--';
for (var c in directoryTree.children[i].children) {
if (directoryTree.children[i].children[c].name == 'fcamera.hevc') fcamera = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
if (directoryTree.children[i].children[c].name == 'dcamera.hevc') fcamera = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
if (directoryTree.children[i].children[c].name == 'qcamera.ts') qcamera = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
if (directoryTree.children[i].children[c].name == 'qlog.bz2') qlog = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
if (directoryTree.children[i].children[c].name == 'rlog.bz2') rlog = '<a target="_blank" href="' + driveUrl + segment + '/' + directoryTree.children[i].children[c].name + '">' + directoryTree.children[i].children[c].name + '</a>';
}
}
response += `</table>
<br><br>
<hr/>
<a href="/useradmin/signout">Sign Out</a></body></html>`;
var isProcessed = '?';
var isStalled = '?';
return res.status(200).send(response);
}));
const drive_segment = await models.__db.get('SELECT * FROM drive_segments WHERE segment_id = ? AND drive_identifier = ? AND dongle_id = ?', parseInt(segment), drive.identifier, device.dongle_id);
if (drive_segment) {
isProcessed = drive_segment.is_processed;
isStalled = drive_segment.is_stalled;
}
directorySegments["seg-" + segment] = '<tr><td>' + segment + '</td><td>' + qcamera + '</td><td>' + qlog + '</td><td>' + fcamera + '</td><td>' + rlog + '</td><td>' + dcamera + '</td><td>' + isProcessed + '</td><td>' + isStalled + '</td></tr>';
}
var qcamera = '--';
var fcamera = '--';
var dcamera = '--';
var qlog = '--';
var rlog = '--';
var isProcessed = '?';
var isStalled = '?';
for (var i = 0; i <= drive.max_segment; i++) {
if (directorySegments["seg-" + i] == undefined) {
response += '<tr><td>' + i + '</td><td>' + qcamera + '</td><td>' + qlog + '</td><td>' + fcamera + '</td><td>' + rlog + '</td><td>' + dcamera + '</td><td>' + isProcessed + '</td><td>' + isStalled + '</td></tr>';
} else
response += directorySegments["seg-" + i];
}
response += `</table>
<br><br>
<hr/>
<a href="/useradmin/signout">Sign Out</a></body></html>`;
res.status(200);
res.send(response);
}))
export default router;

View File

@ -14,6 +14,7 @@ import { execSync } from 'child_process';
import Reader from '@commaai/log_reader';
import ffprobe from 'ffprobe';
import ffprobeStatic from 'ffprobe-static';
import orm from './models/index.model'
var db = null;
@ -366,19 +367,15 @@ function processSegmentsRecursive() {
(async () => {
logger.info(`processSegmentsRecursive ${segment.dongle_id} ${segment.drive_identifier} ${segment.segment_id} internal gps: ${Math.round(rlog_totalDistInternal * 100) / 100}m, external gps: ${Math.round(rlog_totalDistExternal * 100) / 100}m, duration: ${qcamera_duration}s`);
const driveSegmentResult = await dbProtectedRun(
'UPDATE drive_segments SET duration = ?, distance_meters = ?, is_processed = ?, upload_complete = ?, is_stalled = ? WHERE id = ?',
qcamera_duration,
const driveSegmentResult = await orm.models.drive_segments.update({
duration: qcamera_duration,
distance_meters: Math.round(Math.max(rlog_totalDistInternal, rlog_totalDistExternal) * 10) / 10,
is_processed: true,
upload_complete: uploadComplete,
is_stalled: false
Math.round(Math.max(rlog_totalDistInternal, rlog_totalDistExternal) * 10) / 10,
}, {where: {id: segment.id}})
true,
uploadComplete,
false,
segment.id
);
if (driveSegmentResult === null) // if the update failed, stop right here with segment processing and try to update the drives at least
{
@ -517,12 +514,12 @@ async function updateDevices() {
.toString()) / 1024);
logger.info(`updateDevices device ${dongleId} has an updated storage_used of: ${deviceQuotaMb} MB`);
const deviceResult = await dbProtectedRun(
'UPDATE devices SET storage_used = ? WHERE dongle_id = ?',
deviceQuotaMb,
const deviceResult = await orm.models.drives.update(
{storage_used: deviceQuotaMb},
{where: {dongle_id: device.dongle_id}}
)
device.dongle_id
);
}
affectedDevices = [];
}
@ -534,9 +531,9 @@ async function updateDrives() {
var dongleId,
driveIdentifier;
[dongleId, driveIdentifier] = key.split('|');
const drive = await dbProtectedGet('SELECT * FROM drives WHERE identifier = ? AND dongle_id = ?', driveIdentifier, dongleId);
let drive = await orm.models.drives({where: {driveIdentifier: driveIdentifier, dongleId: dongleId}})
if (drive == null) continue;
drive = drive.dataValues;
var dongleIdHash = crypto.createHmac('sha256', config.applicationSalt)
.update(drive.dongle_id)
.digest('hex');
@ -553,7 +550,16 @@ async function updateDrives() {
var totalDurationSeconds = 0;
var playlistSegmentStrings = '';
const drive_segments = await dbProtectedAll('SELECT * FROM drive_segments WHERE drive_identifier = ? AND dongle_id = ? ORDER BY segment_id ASC', driveIdentifier, dongleId);
const drive_segments= await orm.models.drive_segments.findAll({
where: {
drive_identifier: driveIdentifier,
dongle_id: dongleId
},
order: [
sequelize.fn('ASC', sequelize.col('segment_id')),
]
})
if (drive_segments != null) {
for (var t = 0; t < drive_segments.length; t++) {
if (!drive_segments[t].upload_complete) uploadComplete = false;
@ -600,22 +606,17 @@ async function updateDrives() {
logger.info(`updateDrives drive ${dongleId} ${driveIdentifier} uploadComplete: ${uploadComplete}`);
const driveResult = await dbProtectedRun(
'UPDATE drives SET distance_meters = ?, duration = ?, upload_complete = ?, is_processed = ?, filesize = ?, metadata = ? WHERE id = ?',
Math.round(totalDistanceMeters),
const driveResult = await orm.models.drives.update(
{distance_meters: Math.round(totalDistanceMeters),
duration: totalDurationSeconds,
upload_complete: uploadComplete,
is_processed: isProcessed,
filesize,
metadata:JSON.stringify(metadata)
},
{where: {id: drive.id}}
)
totalDurationSeconds,
uploadComplete,
isProcessed,
filesize,
JSON.stringify(metadata),
drive.id
);
affectedDevices[dongleId] = true;
@ -646,12 +647,11 @@ async function deleteExpiredDrives() {
if (expiredDrives != null) {
for (var t = 0; t < expiredDrives.length; t++) {
logger.info(`deleteExpiredDrives drive ${expiredDrives[t].dongle_id} ${expiredDrives[t].identifier} is older than ${config.deviceDriveExpirationDays} days, set is_deleted=true`);
const driveResult = await dbProtectedRun(
'UPDATE drives SET is_deleted = ? WHERE id = ?',
true,
expiredDrives[t].id
);
const driveResult = await orm.models.drives.update({
is_deleted: true
},
{where: {id: expiredDrives[t].id}})
}
}
}