using System.Linq; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; using AyaNova.Models; using AyaNova.Util; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; namespace AyaNova.Api.Controllers { /// /// Log files controller /// [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/[controller]")] //[Produces("application/json")] [Authorize] public class LogFilesController : Controller { private readonly AyContext ct; private readonly ILogger log; private readonly ApiServerState serverState; /// /// ctor /// /// /// /// public LogFilesController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) { ct = dbcontext; log = logger; serverState = apiServerState; } /// /// Get server log /// /// Required roles: /// OpsAdminFull | OpsAdminLimited /// /// /// A single log file in plain text [HttpGet("{logname}")] public ActionResult GetLog([FromRoute] string logname) { //Open or opsOnly and user is opsadminfull or opsadminlimited if (!serverState.IsOpenOrOpsOnly || (serverState.IsOpsOnly && !Authorized.HasAnyRole(HttpContext.Items, AuthorizationRoles.OpsAdminFull | AuthorizationRoles.OpsAdminLimited))) { return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); } if (!Authorized.IsAuthorizedToReadFullRecord(HttpContext.Items, AyaType.LogFile)) { return StatusCode(403, new ApiNotAuthorizedResponse()); } if (!ModelState.IsValid) { return BadRequest(new ApiErrorResponse(ModelState)); } //stream the file contents into a json object and return //build the full path from the log file name and defined path var logFilePath = System.IO.Path.Combine(ServerBootConfig.AYANOVA_LOG_PATH, logname); //does file exist? if (!System.IO.File.Exists(logFilePath)) { return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND)); } //Log // EventLogProcessor.AddEntry(new Event(UserIdFromContext.Id(HttpContext.Items), 0, AyaType.LogFile, AyaEvent.Retrieved,logname), ct); return Content(System.IO.File.ReadAllText(logFilePath)); } /// /// Get list of operations logs /// /// Required roles: /// OpsAdminFull | OpsAdminLimited /// /// /// [HttpGet()] public ActionResult ListLogs() { //Open or opsOnly and user is opsadminfull or opsadminlimited if (!serverState.IsOpenOrOpsOnly || (serverState.IsOpsOnly && !Authorized.HasAnyRole(HttpContext.Items, AuthorizationRoles.OpsAdminFull | AuthorizationRoles.OpsAdminLimited))) { return StatusCode(503, new ApiErrorResponse(ApiErrorCode.API_CLOSED, null, serverState.Reason)); } if (!Authorized.IsAuthorizedToReadFullRecord(HttpContext.Items, AyaType.LogFile)) { return StatusCode(403, new ApiNotAuthorizedResponse()); } if (!ModelState.IsValid) { return BadRequest(new ApiErrorResponse(ModelState)); } //Iterate all log files and build return var files = System.IO.Directory.GetFiles(ServerBootConfig.AYANOVA_LOG_PATH, "log-ayanova*.txt"); Newtonsoft.Json.Linq.JObject o = Newtonsoft.Json.Linq.JObject.FromObject(new { logs = from f in files orderby f select new { logName = System.IO.Path.GetFileName(f) } }); return Ok(ApiOkResponse.Response(o, true)); } //------------ } }