\n"
" \n"
" Clients\n"
" %d registered", result->clients_len);
if (stale_count > 0) {
fprintf(f, "%d stale", stale_count);
}
fprintf(f,
"\n"
"
\n"
" \n"
" New Client
\n"
" \n"
" \n"
" \n"
"
\n"
" Name\n"
" Secret\n"
" Last Backup\n"
" Status\n"
" \n"
"
\n"
);
for (int i = 0; i < result->clients_len; i++) {
char masked_secret[16];
mask_secret(result->clients[i].secret, masked_secret, sizeof(masked_secret));
fprintf(f,
"
\n"
" %s\n"
" %s\n"
" %s\n"
" %s\n"
" View\n"
" \n",
result->clients[i].id,
result->clients[i].is_stale ? "stale" : "",
result->clients[i].name,
masked_secret,
result->clients[i].last_backup.tv_sec > 0.0 ? format_time(result->clients[i].last_backup).buf : "",
status_to_badge_class(result->clients[i].status),
status_to_display(result->clients[i].status)
);
}
fprintf(f,
"
\n"
" \n"
"\n"
"\n");
fclose(f);
*out_len = buf_len;
return buf;
}
char *html_render_client_detail_page(const struct Request *request, const struct GetClientOnlyResult *client_result, const struct GetBackupsResult *backups_result, size_t *out_len) {
// Determine status and staleness
int is_stale = 0;
enum BackupStatus current_status = 0;
if (backups_result->backups_len > 0) {
current_status = backups_result->backups[0].status;
}
char *buf = NULL;
size_t buf_len = 0;
FILE *f = open_memstream(&buf, &buf_len);
if (!f) {
return NULL;
}
fprintf(f,
"\n"
"\n"
"\n"
" \n"
"\n"
"\n");
fclose(f);
*out_len = buf_len;
return buf;
}