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 /// [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/log-file")] //[Produces("application/json")] [Authorize] public class LogFilesController : ControllerBase { 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 /// /// /// A single log file in plain text [HttpGet("{logname}")] public ActionResult GetLog([FromRoute] string logname) { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!Authorized.HasReadFullRole(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 /// /// [HttpGet()] public ActionResult ListLogs() { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!Authorized.HasReadFullRole(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) // } // }); var ret = files.Where(z => !z.EndsWith("ayanova.txt")).OrderByDescending(z => z).Select(z => System.IO.Path.GetFileName(z)).ToList(); ret.Insert(0, "log-ayanova.txt"); return Ok(ApiOkResponse.Response(ret)); } //------------ } }