Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/GeoIp2/vue/src/Geoip2Updater/Geoip2Updater.vue')
-rw-r--r--plugins/GeoIp2/vue/src/Geoip2Updater/Geoip2Updater.vue474
1 files changed, 474 insertions, 0 deletions
diff --git a/plugins/GeoIp2/vue/src/Geoip2Updater/Geoip2Updater.vue b/plugins/GeoIp2/vue/src/Geoip2Updater/Geoip2Updater.vue
new file mode 100644
index 0000000000..ed1f840905
--- /dev/null
+++ b/plugins/GeoIp2/vue/src/Geoip2Updater/Geoip2Updater.vue
@@ -0,0 +1,474 @@
+<!--
+ Matomo - free/libre analytics platform
+ @link https://matomo.org
+ @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+-->
+
+<template>
+ <ContentBlock :content-title="contentTitle" id="geoip-db-mangement">
+ <div v-if="showGeoipUpdateSection">
+ <div v-if="!geoipDatabaseInstalled">
+ <div v-show="showPiwikNotManagingInfo">
+ <h3>{{ translate('GeoIp2_NotManagingGeoIPDBs') }}</h3>
+ <div id="manage-geoip-dbs">
+ <div
+ class="row"
+ id="geoipdb-screen1"
+ >
+ <div class="geoipdb-column-1 col s6">
+ <p>{{ translate('GeoIp2_IWantToDownloadFreeGeoIP') }}<sup><small>*</small></sup></p>
+ </div>
+ <div class="geoipdb-column-2 col s6">
+ <p v-html="purchasedGeoIpText"></p>
+ </div>
+ <div class="geoipdb-column-1 col s6">
+ <input
+ type="button"
+ class="btn"
+ @click="startDownloadFreeGeoIp()"
+ :value="`${translate('General_GetStarted')}...`"
+ />
+ </div>
+ <div class="geoipdb-column-2 col s6">
+ <input
+ type="button"
+ class="btn"
+ id="start-automatic-update-geoip"
+ @click="startAutomaticUpdateGeoIp()"
+ :value="`${translate('General_GetStarted')}...`"
+ />
+ </div>
+ </div>
+ <div class="row">
+ <p><sup>* <small v-html="accuracyNote"></small></sup></p>
+ </div>
+ </div>
+ </div>
+ <div
+ id="geoipdb-screen2-download"
+ v-show="showFreeDownload"
+ >
+ <div>
+ <Progressbar
+ :label="freeProgressbarLabel"
+ :progress="progressFreeDownload"
+ >
+ </Progressbar>
+ </div>
+ </div>
+ </div>
+
+ <div
+ id="geoipdb-update-info"
+ v-if="geoipDatabaseInstalled && !downloadErrorMessage"
+ >
+ <p>
+ <span v-html="geoIPUpdaterInstructions"></span>
+ <br /><br />
+ <span v-if="!!dbipLiteUrl" v-html="geoliteCityLink"></span>
+ <span v-html="maxMindLinkExplanation"></span>
+ <span v-show="geoipDatabaseInstalled">
+ <br /><br />{{ translate('GeoIp2_GeoIPUpdaterIntro') }}:
+ </span>
+ </p>
+ <div>
+ <Field
+ uicontrol="text"
+ name="geoip-location-db"
+ :introduction="translate('GeoIp2_LocationDatabase')"
+ :title="translate('Actions_ColumnDownloadURL')"
+ :inline-help="translate('GeoIp2_LocationDatabaseHint')"
+ v-model="locationDbUrl"
+ >
+ </Field>
+ </div>
+ <div>
+ <Field
+ uicontrol="text"
+ name="geoip-isp-db"
+ :introduction="translate('GeoIp2_ISPDatabase')"
+ :title="translate('Actions_ColumnDownloadURL')"
+ :inline-help="providerPluginHelp"
+ v-model="ispDbUrl"
+ :disabled="!isProviderPluginActive"
+ >
+ </Field>
+ </div>
+ <div>
+ <Field
+ uicontrol="radio"
+ name="geoip-update-period"
+ :introduction="translate('GeoIp2_DownloadNewDatabasesEvery')"
+ v-model="updatePeriod"
+ :options="updatePeriodOptions"
+ >
+ <template v-slot:inline-help>
+ <div
+ id="locationProviderUpdatePeriodInlineHelp"
+ class="inline-help-node"
+ ref="inlineHelpNode"
+ >
+ <span
+ v-if="lastTimeUpdaterRun"
+ v-html="$sanitize(
+ translate('GeoIp2_UpdaterWasLastRun', lastTimeUpdaterRun),
+ )"
+ />
+ <span v-else>{{ translate('GeoIp2_UpdaterHasNotBeenRun') }}</span>
+ <br /><br />
+ <div id="geoip-updater-next-run-time" v-html="$sanitize(nextRunTimeText)">
+ </div>
+ </div>
+ </template>
+ </Field>
+ </div>
+ <input
+ type="button"
+ class="btn"
+ @click="saveGeoIpLinks()"
+ :value="buttonUpdateSaveText"
+ />
+ <div>
+ <div id="done-updating-updater" />
+ <div id="geoipdb-update-info-error" />
+ <div>
+ <Progressbar
+ v-show="isUpdatingGeoIpDatabase"
+ :progress="progressUpdateDownload"
+ :label="progressUpdateLabel"
+ />
+ </div>
+ </div>
+ </div>
+ <div v-if="downloadErrorMessage" v-html="$sanitize(downloadErrorMessage)"></div>
+ </div>
+ <div v-else>
+ <p class="form-description">{{ translate('GeoIp2_CannotSetupGeoIPAutoUpdating') }}</p>
+ </div>
+ </ContentBlock>
+</template>
+
+<script lang="ts">
+import { defineComponent } from 'vue';
+import {
+ translate,
+ AjaxHelper,
+ Progressbar,
+ ContentBlock,
+ NotificationsStore,
+} from 'CoreHome';
+import { Field } from 'CorePluginsAdmin';
+
+interface Geoip2UpdaterState {
+ geoipDatabaseInstalled: boolean;
+ showFreeDownload: boolean;
+ showPiwikNotManagingInfo: boolean;
+ progressFreeDownload: number;
+ progressUpdateDownload: number;
+ buttonUpdateSaveText: string;
+ progressUpdateLabel: string;
+ locationDbUrl: string;
+ ispDbUrl: string;
+ orgDbUrl: string;
+ updatePeriod: string;
+ isUpdatingGeoIpDatabase: boolean;
+ downloadErrorMessage: string|null;
+ nextRunTimePrettyUpdated?: string;
+}
+
+interface UpdateGeoIpLinksResponse {
+ to_download?: string;
+ to_download_label?: string;
+ nextRunTime: string;
+}
+
+interface DownloadChunkResponse {
+ current_size: number;
+ expected_file_size: number;
+ nextRunTime?: string;
+ to_download?: string;
+ to_download_label?: string;
+ error?: string;
+}
+
+const { $ } = window;
+
+export default defineComponent({
+ props: {
+ geoipDatabaseStartedInstalled: Boolean,
+ showGeoipUpdateSection: {
+ type: Boolean,
+ required: true,
+ },
+ dbipLiteUrl: {
+ type: String,
+ required: true,
+ },
+ dbipLiteFilename: {
+ type: String,
+ required: true,
+ },
+ geoipLocUrl: String,
+ isProviderPluginActive: Boolean,
+ geoipIspUrl: String,
+ lastTimeUpdaterRun: String,
+ geoipUpdatePeriod: String,
+ updatePeriodOptions: {
+ type: Object,
+ required: true,
+ },
+ nextRunTime: Number,
+ nextRunTimePretty: String,
+ },
+ components: {
+ Progressbar,
+ Field,
+ ContentBlock,
+ },
+ data(): Geoip2UpdaterState {
+ return {
+ geoipDatabaseInstalled: !!this.geoipDatabaseStartedInstalled,
+ showFreeDownload: false,
+ showPiwikNotManagingInfo: true,
+ progressFreeDownload: 0,
+ progressUpdateDownload: 0,
+ buttonUpdateSaveText: translate('General_Save'),
+ progressUpdateLabel: '',
+ locationDbUrl: this.geoipLocUrl || '',
+ ispDbUrl: this.geoipIspUrl || '',
+ orgDbUrl: '',
+ updatePeriod: this.geoipUpdatePeriod || 'month',
+ isUpdatingGeoIpDatabase: false,
+ downloadErrorMessage: null,
+ };
+ },
+ methods: {
+ startDownloadFreeGeoIp() {
+ this.showFreeDownload = true;
+ this.showPiwikNotManagingInfo = false;
+ this.progressFreeDownload = 0; // start download of free dbs
+
+ this.downloadNextChunk(
+ 'downloadFreeDBIPLiteDB',
+ (v) => {
+ this.progressFreeDownload = v;
+ },
+ false,
+ {},
+ ).then(() => {
+ window.location.reload();
+ }).catch((e) => {
+ this.geoipDatabaseInstalled = true;
+ this.downloadErrorMessage = e.message;
+ });
+ },
+ startAutomaticUpdateGeoIp() {
+ this.buttonUpdateSaveText = translate('General_Continue');
+ this.showGeoIpUpdateInfo();
+ },
+ showGeoIpUpdateInfo() {
+ this.geoipDatabaseInstalled = true; // todo we need to replace this the proper way eventually
+ },
+ saveGeoIpLinks() {
+ return AjaxHelper.post<UpdateGeoIpLinksResponse>(
+ {
+ period: this.updatePeriod,
+ module: 'GeoIp2',
+ action: 'updateGeoIPLinks',
+ },
+ {
+ loc_db: this.locationDbUrl,
+ isp_db: this.ispDbUrl,
+ org_db: this.orgDbUrl,
+ },
+ {
+ withTokenInUrl: true,
+ },
+ ).then(
+ (response) => this.downloadNextFileIfNeeded(response, null),
+ ).then((response) => {
+ this.progressUpdateLabel = '';
+ this.isUpdatingGeoIpDatabase = false;
+
+ NotificationsStore.show({
+ message: translate('General_Done'),
+ placeat: '#done-updating-updater',
+ context: 'success',
+ noclear: true,
+ type: 'toast',
+ style: {
+ display: 'inline-block',
+ },
+ id: 'userCountryGeoIpUpdate',
+ });
+
+ this.nextRunTimePrettyUpdated = response.nextRunTime;
+ $(this.$refs.inlineHelpNode as HTMLElement).effect('highlight', {
+ color: '#FFFFCB',
+ }, 2000);
+
+ return undefined;
+ }).catch((e) => {
+ this.isUpdatingGeoIpDatabase = false;
+
+ NotificationsStore.show({
+ message: e.message,
+ placeat: '#geoipdb-update-info-error',
+ context: 'error',
+ style: {
+ display: 'inline-block',
+ },
+ id: 'userCountryGeoIpUpdate',
+ type: 'transient',
+ });
+ });
+ },
+ downloadNextFileIfNeeded(
+ response: DownloadChunkResponse|UpdateGeoIpLinksResponse,
+ currentDownloading?: string|null,
+ ): Promise<DownloadChunkResponse|UpdateGeoIpLinksResponse> {
+ if (response?.to_download) {
+ const continuing = currentDownloading === response.to_download;
+
+ this.progressUpdateDownload = 0;
+ this.progressUpdateLabel = response.to_download_label!;
+ this.isUpdatingGeoIpDatabase = true; // start/continue download
+
+ return this.downloadNextChunk(
+ 'downloadMissingGeoIpDb',
+ (v) => {
+ this.progressUpdateDownload = v;
+ },
+ continuing,
+ {
+ key: response.to_download,
+ },
+ ).then((r) => this.downloadNextFileIfNeeded(r, response.to_download));
+ }
+
+ return Promise.resolve(response);
+ },
+ downloadNextChunk(
+ action: string,
+ progressBarSet: (value: number) => void,
+ cont: boolean,
+ extraData: QueryParameters,
+ ): Promise<DownloadChunkResponse> {
+ const data: QueryParameters = { ...extraData };
+
+ return AjaxHelper.post<DownloadChunkResponse>(
+ {
+ module: 'GeoIp2',
+ action,
+ continue: cont ? 1 : 0,
+ },
+ data,
+ { withTokenInUrl: true },
+ ).catch(() => {
+ throw new Error(translate('GeoIp2_FatalErrorDuringDownload'));
+ }).then((response) => {
+ if (response.error) {
+ throw new Error(response.error!);
+ }
+
+ // update progress bar
+ const newProgressVal = Math.floor(
+ (response.current_size / response.expected_file_size) * 100,
+ );
+
+ // if incomplete, download next chunk, otherwise, show updater manager
+ progressBarSet(Math.min(newProgressVal, 100));
+
+ if (newProgressVal < 100) {
+ return this.downloadNextChunk(action, progressBarSet, true, extraData);
+ }
+
+ return response;
+ });
+ },
+ },
+ computed: {
+ nextRunTimeText() {
+ if (this.nextRunTimePrettyUpdated) {
+ return this.nextRunTimePrettyUpdated;
+ }
+
+ if (!this.nextRunTime) {
+ return translate('GeoIp2_UpdaterIsNotScheduledToRun');
+ }
+
+ if (this.nextRunTime * 1000 < Date.now()) {
+ return translate('GeoIp2_UpdaterScheduledForNextRun');
+ }
+
+ return translate(
+ 'GeoIp2_UpdaterWillRunNext',
+ `<strong>${this.nextRunTimePretty}</strong>`,
+ );
+ },
+ providerPluginHelp() {
+ if (this.isProviderPluginActive) {
+ return undefined;
+ }
+
+ const text = translate('GeoIp2_ISPRequiresProviderPlugin');
+ return `<div style="margin:0" class='alert alert-warning'>${text}</div>`;
+ },
+ contentTitle() {
+ return translate(
+ this.geoipDatabaseInstalled ? 'GeoIp2_SetupAutomaticUpdatesOfGeoIP' : 'GeoIp2_GeoIPDatabases',
+ );
+ },
+ accuracyNote() {
+ return translate(
+ 'UserCountry_GeoIpDbIpAccuracyNote',
+ '<a href="https://dev.maxmind.com/geoip/geoip2/geolite2/?rId=piwik" rel="noreferrer noopener" target="_blank">',
+ '</a>',
+ );
+ },
+ purchasedGeoIpText() {
+ const maxMindLink = 'http://www.maxmind.com/en/geolocation_landing?rId=piwik';
+ return translate(
+ 'GeoIp2_IPurchasedGeoIPDBs',
+ `<a rel="noreferrer noopener" href="${maxMindLink}" target="_blank">`,
+ '</a>',
+ '<a rel="noreferrer noopener" href="https://db-ip.com/db/?refid=mtm" target="_blank">',
+ '</a>',
+ );
+ },
+ geoIPUpdaterInstructions() {
+ return translate(
+ 'GeoIp2_GeoIPUpdaterInstructions',
+ '<a href="http://www.maxmind.com/?rId=piwik" rel="noreferrer noopener" target="_blank">',
+ '</a>',
+ '<a rel="noreferrer noopener" href="https://db-ip.com/?refid=mtm" target="_blank">',
+ '</a>',
+ );
+ },
+ geoliteCityLink() {
+ const translation = translate(
+ 'GeoIp2_GeoLiteCityLink',
+ `<a rel="noreferrer noopener" href="${this.dbipLiteUrl}" target="_blank">`,
+ this.dbipLiteUrl,
+ '</a>',
+ );
+ return `${translation}<br /><br />`;
+ },
+ maxMindLinkExplanation() {
+ const link = 'https://matomo.org/faq/how-to/'
+ + 'how-do-i-get-the-geolocation-download-url-for-the-free-maxmind-db/';
+ return translate(
+ 'UserCountry_MaxMindLinkExplanation',
+ `<a href="${link}" rel="noreferrer noopener" target="_blank">`,
+ '</a>',
+ );
+ },
+ freeProgressbarLabel() {
+ return translate(
+ 'GeoIp2_DownloadingDb',
+ `<a href="${this.dbipLiteUrl}">${this.dbipLiteFilename}</a>...`,
+ );
+ },
+ },
+});
+</script>