feat: crontab generator

Signed-off-by: Corentin Thomasset <corentin.thomasset74@gmail.com>
This commit is contained in:
Corentin Thomasset 2020-07-23 23:25:15 +02:00
parent baee5e6656
commit 55dffa5635
No known key found for this signature in database
GPG key ID: DBD997E935996158
6 changed files with 245 additions and 2 deletions

View file

@ -3,6 +3,9 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## Next
- [feat] [Crontab friendly generator](https://it-tools.tech/crontab-generator)
## 1.6.0 ## 1.6.0
- [feat] [BIP39 generator](https://it-tools.tech/bip39-generator) - [feat] [BIP39 generator](https://it-tools.tech/bip39-generator)
- [feat] [Base 64 converter](https://it-tools.tech/base64-string-converter) - [feat] [Base 64 converter](https://it-tools.tech/base64-string-converter)

View file

@ -20,12 +20,12 @@ Here is an unordered list of the current functionalities, and some that may come
- [x] Git memo (cheat sheet) - [x] Git memo (cheat sheet)
- [x] QR code generator - [x] QR code generator
- [x] Bip39 pass-phrase generator - [x] Bip39 pass-phrase generator
- [ ] Base 64 string converter - [x] Base 64 string converter
- [x] Crontab friendly generator
- [ ] CSS memo (cheat sheet) - [ ] CSS memo (cheat sheet)
- [ ] REGEX memo (cheat sheet) + tester? - [ ] REGEX memo (cheat sheet) + tester?
- [ ] Minify/un-minify - [ ] Minify/un-minify
- [ ] Image exif editor/remover - [ ] Image exif editor/remover
- [ ] Crontab friendly generator
- [ ] Image format converter? - [ ] Image format converter?
- [ ] Image cropper - [ ] Image cropper
- [ ] Image resizer - [ ] Image resizer

10
package-lock.json generated
View file

@ -3720,6 +3720,16 @@
"sha.js": "^2.4.8" "sha.js": "^2.4.8"
} }
}, },
"cron-validator": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/cron-validator/-/cron-validator-1.1.1.tgz",
"integrity": "sha512-vfZb05w/wezuwPZBDvdIBmJp2BvuJExHeyKRa5oBqD2ZDXR61hb3QgPc/3ZhBEQJlAy8Jlnn5XC/JCT3IDqxwg=="
},
"cronstrue": {
"version": "1.96.0",
"resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-1.96.0.tgz",
"integrity": "sha512-kNuuN0AXqspm+jlpwiecFSFBrG5dYBaL5EaW5MEjGAh4IFT/jbKwKCNhzWb8N5NulKQUHEDN7w98GjoAm6PmMg=="
},
"cross-spawn": { "cross-spawn": {
"version": "6.0.5", "version": "6.0.5",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",

View file

@ -14,6 +14,8 @@
"color-convert": "^2.0.1", "color-convert": "^2.0.1",
"color-name": "^1.1.4", "color-name": "^1.1.4",
"core-js": "^3.6.4", "core-js": "^3.6.4",
"cron-validator": "^1.1.1",
"cronstrue": "^1.96.0",
"dompurify": "^2.0.11", "dompurify": "^2.0.11",
"marked": "^1.1.0", "marked": "^1.1.0",
"qrcode.vue": "^1.7.0", "qrcode.vue": "^1.7.0",

View file

@ -138,6 +138,13 @@ const toolsComponents = [
{ {
title: 'Miscellaneous', title: 'Miscellaneous',
child: [ child: [
{
text: 'Crontab generator',
path: '/crontab-generator',
icon: 'fa-clock',
component: () => import('./routes/tools/CrontabGenerator'),
keywords: ['Cron', 'Schedule']
},
{ {
text: 'QR Code generator', text: 'QR Code generator',
path: '/qrcode-generator', path: '/qrcode-generator',

View file

@ -0,0 +1,221 @@
<template>
<v-row justify="center" align="center">
<v-col cols="12" xl="5" lg="5" md="12">
<v-card>
<v-card-title>Crontab generator</v-card-title>
<v-card-text>
<div class="result">{{cronString}}</div>
<v-text-field
ref="cron"
class="cron-wrapper"
outlined
v-model="cron"
label="Cron"
append-icon="fa-copy"
@click:append="copy(cron)"
:rules="[isCronValid]"
hide-details="auto"
/>
<v-checkbox
hide-details
label="Verbose"
v-model="cronstrueConfig.verbose"
/>
<v-checkbox
hide-details
label="Use 24 hour time format"
v-model="cronstrueConfig.use24HourTimeFormat"
/>
<v-checkbox
hide-details
label="Day of the week start a index 0"
v-model="cronstrueConfig.dayOfWeekStartIndexZero"
/>
</v-card-text>
</v-card>
</v-col>
<v-col cols="12" xl="6" lg="7" md="12">
<v-card>
<v-card-title>Crontab helper</v-card-title>
<v-card-text>
<div class="text-center">
<pre>
day of week (0 - 6, sunday=0) OR sun,mon ...
| month (1 - 12) OR jan,feb,mar,apr ...
| | day of month (1 - 31)
| | | hour (0 - 23)
| | | | minute (0 - 59)
| | | | |
* * * * * command
</pre>
</div>
<br>
<v-simple-table dense>
<template v-slot:default>
<thead>
<tr>
<th class="text-left">Symbol</th>
<th class="text-left">Meaning</th>
<th class="text-left">Example</th>
<th class="text-left">Equivalent</th>
</tr>
</thead>
<tbody>
<tr>
<td>*</td>
<td>Any value</td>
<td>
<pre>* * * *</pre>
</td>
<td>Every minute</td>
</tr>
<tr>
<td>-</td>
<td>Range of values</td>
<td>
<pre>1-10 * * *</pre>
</td>
<td>Minutes 1 through 10</td>
</tr>
<tr>
<td>,</td>
<td>List of values</td>
<td>
<pre>1,10 * * *</pre>
</td>
<td>At minutes 1 and 10</td>
</tr>
<tr>
<td>/</td>
<td>Step values</td>
<td>
<pre>*/10 * * *</pre>
</td>
<td>Every 10 minutes</td>
</tr>
<tr>
<td>@yearly</td>
<td>Once every year at midnight of 1 January</td>
<td>
<pre>@yearly</pre>
</td>
<td>0 0 1 1 *</td>
</tr>
<tr>
<td>@annually</td>
<td>Same as @yearly</td>
<td>
<pre>@annually</pre>
</td>
<td>0 0 1 1 *</td>
</tr>
<tr>
<td>@monthly</td>
<td>Once a month at midnight on the first day</td>
<td>
<pre>@monthly</pre>
</td>
<td>0 0 1 * *</td>
</tr>
<tr>
<td>@weekly</td>
<td>Once a week at midnight on Sunday morning</td>
<td>
<pre>@weekly</pre>
</td>
<td>0 0 * * 0</td>
</tr>
<tr>
<td>@daily</td>
<td>Once a day at midnight</td>
<td>
<pre>@daily</pre>
</td>
<td>0 0 * * *</td>
</tr>
<tr>
<td>@midnight</td>
<td>Same as @daily</td>
<td>
<pre>@midnight</pre>
</td>
<td>0 0 * * *</td>
</tr>
<tr>
<td>@hourly</td>
<td>Once an hour at the beginning of the hour</td>
<td>
<pre>@hourly</pre>
</td>
<td>0 * * * *</td>
</tr>
<tr>
<td>@reboot</td>
<td>Run at startup</td>
<td></td>
<td></td>
</tr>
</tbody>
</template>
</v-simple-table>
</v-card-text>
</v-card>
</v-col>
</v-row>
</template>
<script>
import {copyable} from "../../mixins/copyable.mixin";
import cronstrue from 'cronstrue';
import * as CronValidator from 'cron-validator'
export default {
name: "CrontabGenerator",
mixins: [copyable],
data: () => ({
cron: '* * * * *',
cronstrueConfig: {
verbose: true,
dayOfWeekStartIndexZero: true,
use24HourTimeFormat: true,
throwExceptionOnParseError: true
}
}),
methods: {
isCronValid(v) {
return CronValidator.isValidCron(v, {allowBlankDay: true, alias: true});
}
},
computed: {
cronString() {
if (this.isCronValid(this.cron)) {
return cronstrue.toString(this.cron, this.cronstrueConfig)
} else {
return ' '
}
}
}
}
</script>
<style scoped lang="less">
::v-deep .cron-wrapper input {
text-align: center;
font-size: 22px;
font-family: Consolas, monospace;
}
.result {
text-align: center;
font-size: 18px;
margin-bottom: 22px;
}
.text-center{
pre{
display: inline-block;
text-align: left;
}
}
</style>