mirror of
https://github.com/Ombi-app/Ombi.git
synced 2025-08-21 05:43:19 -07:00
parent
f6e0c25127
commit
ce62606000
13 changed files with 229 additions and 8 deletions
|
@ -6,5 +6,7 @@ namespace Ombi.Schedule.Ombi
|
||||||
public interface IOmbiAutomaticUpdater
|
public interface IOmbiAutomaticUpdater
|
||||||
{
|
{
|
||||||
Task Update(PerformContext context);
|
Task Update(PerformContext context);
|
||||||
|
string[] GetVersion();
|
||||||
|
Task<bool> UpdateAvailable(string branch, string currentVersion);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -5,10 +5,8 @@ using System.IO;
|
||||||
using System.IO.Compression;
|
using System.IO.Compression;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Runtime.InteropServices.ComTypes;
|
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Hangfire.Console;
|
using Hangfire.Console;
|
||||||
using Hangfire.Server;
|
using Hangfire.Server;
|
||||||
|
@ -16,29 +14,53 @@ using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
using Ombi.Api.Service;
|
using Ombi.Api.Service;
|
||||||
using Ombi.Api.Service.Models;
|
using Ombi.Api.Service.Models;
|
||||||
|
using Ombi.Core.Settings;
|
||||||
using Ombi.Helpers;
|
using Ombi.Helpers;
|
||||||
using Ombi.Schedule.Ombi;
|
using Ombi.Schedule.Ombi;
|
||||||
|
using Ombi.Settings.Settings.Models;
|
||||||
|
|
||||||
namespace Ombi.Schedule.Jobs.Ombi
|
namespace Ombi.Schedule.Jobs.Ombi
|
||||||
{
|
{
|
||||||
public class OmbiAutomaticUpdater : IOmbiAutomaticUpdater
|
public class OmbiAutomaticUpdater : IOmbiAutomaticUpdater
|
||||||
{
|
{
|
||||||
public OmbiAutomaticUpdater(ILogger<OmbiAutomaticUpdater> log, IOmbiService service)
|
public OmbiAutomaticUpdater(ILogger<OmbiAutomaticUpdater> log, IOmbiService service,
|
||||||
|
ISettingsService<UpdateSettings> s)
|
||||||
{
|
{
|
||||||
Logger = log;
|
Logger = log;
|
||||||
OmbiService = service;
|
OmbiService = service;
|
||||||
|
Settings = s;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ILogger<OmbiAutomaticUpdater> Logger { get; }
|
private ILogger<OmbiAutomaticUpdater> Logger { get; }
|
||||||
private IOmbiService OmbiService { get; }
|
private IOmbiService OmbiService { get; }
|
||||||
|
private ISettingsService<UpdateSettings> Settings { get;s }
|
||||||
private static PerformContext Ctx { get; set; }
|
private static PerformContext Ctx { get; set; }
|
||||||
|
|
||||||
|
public string[] GetVersion()
|
||||||
|
{
|
||||||
|
var productVersion = AssemblyHelper.GetRuntimeVersion();
|
||||||
|
var productArray = productVersion.Split('-');
|
||||||
|
return productArray;
|
||||||
|
}
|
||||||
|
public async Task<bool> UpdateAvailable(string branch, string currentVersion)
|
||||||
|
{
|
||||||
|
var updates = await OmbiService.GetUpdates(branch);
|
||||||
|
var serverVersion = updates.UpdateVersionString;
|
||||||
|
return !serverVersion.Equals(currentVersion, StringComparison.CurrentCultureIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
public async Task Update(PerformContext c)
|
public async Task Update(PerformContext c)
|
||||||
{
|
{
|
||||||
Ctx = c;
|
Ctx = c;
|
||||||
Ctx.WriteLine("Starting the updater");
|
Ctx.WriteLine("Starting the updater");
|
||||||
// IF AutoUpdateEnabled =>
|
|
||||||
// ELSE Return;
|
var settings = await Settings.GetSettingsAsync();
|
||||||
|
if (!settings.AutoUpdateEnabled)
|
||||||
|
{
|
||||||
|
Ctx.WriteLine("Auto update is not enabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var currentLocation = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
|
var currentLocation = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
|
||||||
Ctx.WriteLine("Path: {0}", currentLocation);
|
Ctx.WriteLine("Path: {0}", currentLocation);
|
||||||
|
|
||||||
|
@ -48,7 +70,7 @@ namespace Ombi.Schedule.Jobs.Ombi
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var productArray = productVersion.Split('-');
|
var productArray = GetVersion();
|
||||||
var version = productArray[0];
|
var version = productArray[0];
|
||||||
Ctx.WriteLine("Version {0}", version);
|
Ctx.WriteLine("Version {0}", version);
|
||||||
var branch = productArray[1];
|
var branch = productArray[1];
|
||||||
|
|
7
src/Ombi.Settings/Settings/Models/UpdateSettings.cs
Normal file
7
src/Ombi.Settings/Settings/Models/UpdateSettings.cs
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
namespace Ombi.Settings.Settings.Models
|
||||||
|
{
|
||||||
|
public class UpdateSettings : Settings
|
||||||
|
{
|
||||||
|
public bool AutoUpdateEnabled { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -17,6 +17,10 @@ export interface IOmbiSettings extends ISettings {
|
||||||
allowExternalUsersToAuthenticate: boolean;
|
allowExternalUsersToAuthenticate: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface IUpdateSettings extends ISettings {
|
||||||
|
autoUpdateEnabled: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
export interface IEmbySettings extends ISettings {
|
export interface IEmbySettings extends ISettings {
|
||||||
enable: boolean;
|
enable: boolean;
|
||||||
servers: IEmbyServer[];
|
servers: IEmbyServer[];
|
||||||
|
|
|
@ -9,3 +9,4 @@ export * from "./search.service";
|
||||||
export * from "./service.helpers";
|
export * from "./service.helpers";
|
||||||
export * from "./settings.service";
|
export * from "./settings.service";
|
||||||
export * from "./status.service";
|
export * from "./status.service";
|
||||||
|
export * from "./update.service";
|
||||||
|
|
|
@ -18,6 +18,7 @@ import {
|
||||||
IRadarrSettings,
|
IRadarrSettings,
|
||||||
ISlackNotificationSettings,
|
ISlackNotificationSettings,
|
||||||
ISonarrSettings,
|
ISonarrSettings,
|
||||||
|
IUpdateSettings
|
||||||
} from "../interfaces";
|
} from "../interfaces";
|
||||||
|
|
||||||
import { ServiceAuthHelpers } from "./service.helpers";
|
import { ServiceAuthHelpers } from "./service.helpers";
|
||||||
|
@ -166,4 +167,14 @@ export class SettingsService extends ServiceAuthHelpers {
|
||||||
.post(`${this.url}/notifications/slack`, JSON.stringify(settings), { headers: this.headers })
|
.post(`${this.url}/notifications/slack`, JSON.stringify(settings), { headers: this.headers })
|
||||||
.map(this.extractData).catch(this.handleError);
|
.map(this.extractData).catch(this.handleError);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public getUpdateSettings(): Observable<IUpdateSettings> {
|
||||||
|
return this.httpAuth.get(`${this.url}/update`).map(this.extractData).catch(this.handleError);
|
||||||
|
}
|
||||||
|
|
||||||
|
public saveUpdateSettings(settings: IUpdateSettings): Observable<boolean> {
|
||||||
|
return this.httpAuth
|
||||||
|
.post(`${this.url}/update`, JSON.stringify(settings), { headers: this.headers })
|
||||||
|
.map(this.extractData).catch(this.handleError);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
20
src/Ombi/ClientApp/app/services/update.service.ts
Normal file
20
src/Ombi/ClientApp/app/services/update.service.ts
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
import { Injectable } from "@angular/core";
|
||||||
|
import { Http } from "@angular/http";
|
||||||
|
import { AuthHttp } from "angular2-jwt";
|
||||||
|
import { Observable } from "rxjs/Rx";
|
||||||
|
|
||||||
|
import { ServiceAuthHelpers } from "./service.helpers";
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class UpdateService extends ServiceAuthHelpers {
|
||||||
|
constructor(http: AuthHttp, private regularHttp: Http) {
|
||||||
|
super(http, "/api/v1/Jobs/");
|
||||||
|
}
|
||||||
|
public forceUpdate(): Observable<boolean> {
|
||||||
|
return this.regularHttp.post(`${this.url}update/`, { headers: this.headers }).map(this.extractData);
|
||||||
|
}
|
||||||
|
|
||||||
|
public checkForNewUpdate(): Observable<boolean> {
|
||||||
|
return this.http.get(`${this.url}update/`).map(this.extractData);
|
||||||
|
}
|
||||||
|
}
|
36
src/Ombi/ClientApp/app/settings/update/update.component.html
Normal file
36
src/Ombi/ClientApp/app/settings/update/update.component.html
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
|
||||||
|
<settings-menu></settings-menu>
|
||||||
|
<div *ngIf="form">
|
||||||
|
<fieldset>
|
||||||
|
<legend>Update Settings</legend>
|
||||||
|
|
||||||
|
<form novalidate [formGroup]="form" (ngSubmit)="onSubmit(form)" style="padding-top:5%;">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="checkbox">
|
||||||
|
<input type="checkbox" id="autoUpdateEnabled" formControlName="autoUpdateEnabled">
|
||||||
|
<label for="autoUpdateEnabled">Enable Automatic Update</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group" *ngIf="!updateAvailable">
|
||||||
|
<div>
|
||||||
|
<button (click)="checkForUpdate()" class="btn btn-primary-outline">Check For Update</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group" *ngIf="updateAvailable">
|
||||||
|
<div>
|
||||||
|
<button (click)="update()" class="btn btn-success-outline">Update</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div>
|
||||||
|
<button type="submit" class="btn btn-primary-outline ">Submit</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
58
src/Ombi/ClientApp/app/settings/update/update.component.ts
Normal file
58
src/Ombi/ClientApp/app/settings/update/update.component.ts
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
import { Component, OnInit } from "@angular/core";
|
||||||
|
import { FormBuilder, FormGroup } from "@angular/forms";
|
||||||
|
|
||||||
|
import { NotificationService } from "../../services";
|
||||||
|
import { SettingsService, UpdateService } from "../../services";
|
||||||
|
|
||||||
|
@Component({
|
||||||
|
templateUrl: "./update.component.html",
|
||||||
|
})
|
||||||
|
export class UpdateComponent implements OnInit {
|
||||||
|
|
||||||
|
public form: FormGroup;
|
||||||
|
public updateAvailable = false;
|
||||||
|
|
||||||
|
constructor(private settingsService: SettingsService,
|
||||||
|
private notificationService: NotificationService,
|
||||||
|
private updateService: UpdateService,
|
||||||
|
private fb: FormBuilder) { }
|
||||||
|
|
||||||
|
public ngOnInit() {
|
||||||
|
|
||||||
|
this.settingsService.getUpdateSettings()
|
||||||
|
.subscribe(x => {
|
||||||
|
this.form = this.fb.group({
|
||||||
|
autoUpdateEnabled: [x.autoUpdateEnabled],
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public checkForUpdate() {
|
||||||
|
this.updateService.checkForNewUpdate().subscribe(x => {
|
||||||
|
if (x) {
|
||||||
|
this.updateAvailable = true;
|
||||||
|
this.notificationService.success("Update", "There is a new update available");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public update() {
|
||||||
|
this.updateService.forceUpdate().subscribe();
|
||||||
|
this.notificationService.success("Update", "We triggered the update job");
|
||||||
|
}
|
||||||
|
|
||||||
|
public onSubmit(form: FormGroup) {
|
||||||
|
if (form.invalid) {
|
||||||
|
this.notificationService.error("Validation", "Please check your entered values");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.settingsService.saveUpdateSettings(form.value)
|
||||||
|
.subscribe(x => {
|
||||||
|
if (x) {
|
||||||
|
this.notificationService.success("Settings Saved", "Successfully saved Update settings");
|
||||||
|
} else {
|
||||||
|
this.notificationService.error("Settings Saved", "There was an error when saving the Update settings");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
|
@ -32,7 +32,6 @@ namespace Ombi.Controllers
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The Identity Controller, the API for everything Identity/User related
|
/// The Identity Controller, the API for everything Identity/User related
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <seealso cref="Ombi.Controllers.BaseV1ApiController" />
|
|
||||||
[PowerUser]
|
[PowerUser]
|
||||||
[ApiV1]
|
[ApiV1]
|
||||||
[Produces("application/json")]
|
[Produces("application/json")]
|
||||||
|
|
40
src/Ombi/Controllers/JobController.cs
Normal file
40
src/Ombi/Controllers/JobController.cs
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Hangfire;
|
||||||
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Ombi.Api.Service;
|
||||||
|
using Ombi.Attributes;
|
||||||
|
using Ombi.Schedule.Ombi;
|
||||||
|
|
||||||
|
namespace Ombi.Controllers
|
||||||
|
{
|
||||||
|
[ApiV1]
|
||||||
|
[Admin]
|
||||||
|
[Produces("application/json")]
|
||||||
|
public class JobController : Controller
|
||||||
|
{
|
||||||
|
public JobController(IOmbiAutomaticUpdater updater)
|
||||||
|
{
|
||||||
|
_updater = updater;
|
||||||
|
}
|
||||||
|
|
||||||
|
private readonly IOmbiAutomaticUpdater _updater;
|
||||||
|
|
||||||
|
[HttpPost("update")]
|
||||||
|
public bool ForceUpdate()
|
||||||
|
{
|
||||||
|
BackgroundJob.Enqueue(() => _updater.Update(null));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpGet("update")]
|
||||||
|
public async Task<bool> CheckForUpdate()
|
||||||
|
{
|
||||||
|
var productArray = _updater.GetVersion();
|
||||||
|
var version = productArray[0];
|
||||||
|
var branch = productArray[1];
|
||||||
|
var updateAvailable = await _updater.UpdateAvailable(branch, version);
|
||||||
|
|
||||||
|
return updateAvailable;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -266,6 +266,28 @@ namespace Ombi.Controllers
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Save the Update settings.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="settings">The settings.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpPost("Update")]
|
||||||
|
public async Task<bool> UpdateSettings([FromBody]UpdateSettings settings)
|
||||||
|
{
|
||||||
|
return await Save(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the Update Settings.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet("Update")]
|
||||||
|
public async Task<UpdateSettings> UpdateSettings()
|
||||||
|
{
|
||||||
|
return await Get<UpdateSettings>();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Saves the email notification settings.
|
/// Saves the email notification settings.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -69,7 +69,6 @@
|
||||||
|
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Folder Include="ClientApp\app\settings\update\" />
|
|
||||||
<Folder Include="Styles\" />
|
<Folder Include="Styles\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue