-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
226 lines (180 loc) · 13.9 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset="utf-8">
<title>OliveTin - give safe and simple access to predefined shell commands from a web interface</title>
<meta name = "description" content = "Useful for routine jobs like restarting services, starting backup scripts, or sending pings, when direct SSH access is difficult, not possible, or a just pain to use." />
<link rel = "stylesheet" type = "text/css" href = "resources/stylesheets/main.css" />
<link rel = "shortcut icon" type = "image/png" href = "resources/images/logo.png" />
<meta name = "viewport" content="width=device-width, initial-scale=1.0">
<meta property="og:title" content="OliveTin - give safe and simple access to predefined shell commands from a web interface" />
<meta property="og:description" content="Useful for routine jobs like restarting services, starting backup scripts, or sending pings, when direct SSH access is difficult, not possible, or a just pain to use." />
<meta property="og:image" content="https://www.olivetin.app/resources/images/promo2.png" />
<meta property="og:url" content="https://www.olivetin.app/" />
<meta property="og:type" content="website" />
</head>
<body>
<header aria-label = "Header, with main navigation">
<div class = "contentWrap" role = "none">
<nav aria-label = "Main navigation">
<ul role = "none">
<li><a href = "https://www.olivetin.app">Homepage</a></li>
<li><a href = "https://docs.olivetin.app">Documentation</a> (<a href = "https://docs.olivetin.app/installation.html">Install Guide</a>) </li>
<li><a href = "https://discord.gg/jhYWWpNJ3v" target = "_new">Chat on Discord</a></li>
<li><a href = "https://www.olivetin.app/themes" target = "_new">Themes</a></li>
<li><a href = "https://github.com/OliveTin/OliveTin" target = "_new">Code on GitHub</a></li>
</ul>
</nav>
</div>
</header>
<main aria-label = "Main content">
<div class = "promo alt-section">
<div class = "contentWrap" role = "none">
<div class = "promoBanner">
<img id = "logo" src = "resources/images/logo.png" alt = "OliveTin logo" style = "width: 4em; height: 4em;" />
<div class = "promoText">
<h1>OliveTin</h1>
<p>Give <strong>safe</strong> and <strong>simple</strong> access to predefined shell commands from a web interface.</p>
</div>
</div>
<div class = "promoImages">
<iframe width="560" height="315" src="https://www.youtube.com/embed/UBgOfNrzId4?si=Guu70KwcIn8EDemS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>See it in action more with some <a href = "https://www.youtube.com/channel/UCE0GT30C2DJzpIhIwlBRm5A" target = "_new">OliveTin demo videos on YouTube</a>.</p>
</div>
</div>
</div>
<div class = "contentWrap alt-section ">
<h2>Use case: <strong>Safely</strong> give access to commands, for less technical people;</h2>
<ul>
<li>eg: Give your family a button to <tt>podman restart plex</tt>
<li>eg: Give junior admins a simple web form with dropdowns, to start your custom script. <tt>backupScript.sh --folder {{ customerName }}</tt></li>
<li>eg: Enable SSH access to the server for the next 20 mins <tt>firewall-cmd --add-service ssh --timeout 20m</tt></li>
</ul>
</div>
<div class = "alt-section">
<div class = "contentWrap">
<h2>Use case: <strong>Simplify</strong> complex commands, make them accessible and repeatable;</h2>
<ul>
<li>eg: Expose complex commands on touchscreen tablets stuck on walls around your house. <tt>wake-on-lan aa:bb:cc:11:22:33</tt></li>
<li>eg: Run long-lived commands on your servers from your cell phone. <tt>dnf update -y</tt></li>
<li>eg: Define complex commands with lots of preset arguments, and turn a few arguments into dropdown select boxes. <tt>docker rm {{ container }} && docker create {{ container }} && docker start {{ container }}</tt>
</ul>
</div>
</div>
<div class = "alt-section">
<div class = "contentWrap">
<h2>Features</h2>
<ul class = "bigblocks">
<li>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M16 21V8H9.5V3H21v18zm-6.5 0V10H14v11zM3 21V10h4.5v11z"/></svg>
<strong>Responsive</strong>
Great for tablets and mobile, with a touch-friendly UI.
</li>
<li>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M11.01 3.05C6.51 3.54 3 7.36 3 12a9 9 0 0 0 9 9c4.63 0 8.45-3.5 8.95-8c.09-.79-.78-1.42-1.54-.95A5.403 5.403 0 0 1 11.1 7.5c0-1.06.31-2.06.84-2.89c.45-.67-.04-1.63-.93-1.56"/></svg>
<strong>Auto Light/Dark mode</strong>
For those of you that don't like bright screens.
</li>
<li>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" fill-rule="evenodd" d="M6.237 4.712a.75.75 0 0 0-.474-1.423l-.555.185c-.57.19-1.055.351-1.439.527c-.409.187-.767.416-1.051.776c-.285.36-.426.76-.515 1.2c-.083.415-.129.923-.183 1.522l-.698 7.67a5 5 0 0 0-.072.823C1.255 18.611 3.38 20.75 6 20.75a4.75 4.75 0 0 0 4.689-3.986l.219-.078a3.25 3.25 0 0 1 2.184 0l.22.078A4.75 4.75 0 0 0 18 20.75c2.62 0 4.744-2.14 4.75-4.758q0-.421-.073-.823L21.98 7.5c-.054-.6-.1-1.107-.183-1.521c-.089-.441-.23-.842-.515-1.201s-.642-.59-1.051-.776c-.384-.176-.868-.337-1.439-.527l-.555-.185a.75.75 0 0 0-.474 1.423l.518.172c.617.206 1.024.343 1.326.481c.286.13.414.235.5.343c.085.107.157.256.219.564c.065.326.105.753.164 1.401l.415 4.569a4.75 4.75 0 0 0-7.585 2.942a4.75 4.75 0 0 0-2.64 0a4.75 4.75 0 0 0-7.585-2.942l.048-.532l.367-4.037c.059-.648.099-1.075.164-1.4c.062-.309.134-.458.22-.565c.085-.108.213-.212.499-.343c.302-.138.709-.275 1.326-.48z" clip-rule="evenodd"/></svg>
<strong>Accessible</strong>
Passes all the accessibility checks in Firefox, and issues with accessibility are taken seriously.
</li>
<li>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M10 5a1.96 1.96 0 0 0 .796 1.56L5.5 9.986H3.997A1.997 1.997 0 0 0 2 11.983v8.023a1.997 1.997 0 0 0 1.997 1.997h16A2.004 2.004 0 0 0 22 19.999v-8.016a1.997 1.997 0 0 0-1.997-1.997h-1.491L13.21 6.555A1.96 1.96 0 0 0 14 5a2.03 2.03 0 0 0-1-1.721V2h-1v2a1 1 0 1 1-1 1m.995 1.974l.005.001l.017-.002l4.655 3.013h-9.33ZM7 18a1 1 0 0 1-2 0v-4a1 1 0 0 1 2 0Zm4 0a1 1 0 0 1-2 0v-4a1 1 0 0 1 2 0Zm4 0a1 1 0 0 1-2 0v-4a1 1 0 0 1 2 0Zm4 0a1 1 0 0 1-2 0v-4a1 1 0 0 1 2 0Z"/></svg>
<strong><a href = "https://docs.olivetin.app/installation.html">Linux Container</a></strong>
For quickly testing and getting it up and running, great for the selfhosted community.
</li>
<li>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="m9.6 15.6l1.4-1.45L8.85 12L11 9.85L9.6 8.4L6 12zm4.8 0L18 12l-3.6-3.6L13 9.85L15.15 12L13 14.15zM5 21q-.825 0-1.412-.587T3 19V5q0-.825.588-1.412T5 3h4.2q.325-.9 1.088-1.45T12 1t1.713.55T14.8 3H19q.825 0 1.413.588T21 5v14q0 .825-.587 1.413T19 21zm7-16.75q.325 0 .538-.213t.212-.537t-.213-.537T12 2.75t-.537.213t-.213.537t.213.538t.537.212"/></svg>
<strong>Integrate with anything</strong>
It just runs shell commands - you could integrate with a bunch of stuff just by using curl, ping, etc.
</li>
<li>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 2a10 10 0 0 1 10 10a10 10 0 0 1-10 10A10 10 0 0 1 2 12A10 10 0 0 1 12 2m0 2a8 8 0 0 0-8 8c0 2.4 1 4.5 2.7 6c1.4-1.3 3.3-2 5.3-2s3.8.7 5.3 2c1.7-1.5 2.7-3.6 2.7-6a8 8 0 0 0-8-8m2 2a1 1 0 0 1 1 1a1 1 0 0 1-1 1a1 1 0 0 1-1-1a1 1 0 0 1 1-1m-4 0a1 1 0 0 1 1 1a1 1 0 0 1-1 1a1 1 0 0 1-1-1a1 1 0 0 1 1-1M6.91 8.94c.13 0 .25.03.39.06l3.2 1.32l.27.11c.56-.43 1.32-.55 1.98-.28c1.02.41 1.52 1.58 1.1 2.6a1.99 1.99 0 0 1-2.6 1.1c-.66-.26-1.13-.85-1.25-1.57l-.23-.1l-3.22-1.3l-.02-.01c-.53-.21-.76-.79-.56-1.31a1 1 0 0 1 .94-.62M17 9a1 1 0 0 1 1 1a1 1 0 0 1-1 1a1 1 0 0 1-1-1a1 1 0 0 1 1-1"/></svg>
<strong>Lightweight on resources</strong>
Uses only a few MB of RAM and barely any CPU, written in Go + JS with relatively few dependencies.
</li>
<li>
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M17.416 2.624a.75.75 0 1 0-.832-1.248L13.669 3.32A4.5 4.5 0 0 0 12 3c-.59 0-1.153.113-1.669.32L7.416 1.376a.75.75 0 0 0-.832 1.248l2.36 1.573a4.5 4.5 0 0 0-1.368 2.475A5.5 5.5 0 0 1 8.938 6.5h6.125q.707.002 1.361.172a4.5 4.5 0 0 0-1.368-2.475zM1.25 14a.75.75 0 0 1 .75-.75h3v-1.312c0-.836.26-1.611.704-2.248l-2.483-.994a.75.75 0 0 1 .558-1.392l3.136 1.254A3.9 3.9 0 0 1 8.938 8h6.124c.74 0 1.432.204 2.023.558l3.136-1.254a.75.75 0 1 1 .558 1.392l-2.483.994A3.9 3.9 0 0 1 19 11.938v1.312h3a.75.75 0 0 1 0 1.5h-3V15a7 7 0 0 1-.808 3.269l2.587 1.035a.75.75 0 0 1-.558 1.393l-2.892-1.158a7 7 0 0 1-4.579 2.421V15a.75.75 0 1 0-1.5 0v6.96a7 7 0 0 1-4.579-2.42L3.78 20.696a.75.75 0 1 1-.558-1.393l2.588-1.035A7 7 0 0 1 5 15v-.25H2a.75.75 0 0 1-.75-.75"/></svg>
<strong>Well tested</strong>
Well, nobody like bugs, after all.
</li>
</ul>
</div>
</div>
<div class = "alt-section">
<div class = "contentWrap">
<h2>Configuration Example</h2>
<p><strong>YAML</strong> - Configuration as code, rather than configuration via a million little options in an admin panel :-)</p>
<div class="highlight highlight-source-yaml notranslate position-relative overflow-auto" dir="auto"><pre><span class="pl-c"><span class="pl-c">#</span> Listen on all addresses available, port 1337</span>
<span class="pl-ent">listenAddressSingleHTTPFrontend</span>: <span class="pl-s">0.0.0.0:1337</span>
<span class="pl-c"><span class="pl-c">#</span> Choose from INFO (default), WARN and DEBUG</span>
<span class="pl-ent">logLevel</span>: <span class="pl-s"><span class="pl-pds">"</span>INFO<span class="pl-pds">"</span></span>
<span class="pl-c"><span class="pl-c">#</span> Actions (buttons) to show up on the WebUI:</span>
<span class="pl-ent">actions</span>:
<span class="pl-c"><span class="pl-c">#</span> Docs: https://docs.olivetin.app/action-container-control.html</span>
- <span class="pl-ent">title</span>: <span class="pl-s">Restart Plex</span>
<span class="pl-ent">icon</span>: <span class="pl-s">restart</span>
<span class="pl-ent">shell</span>: <span class="pl-s">docker restart plex</span>
<span class="pl-c"><span class="pl-c">#</span> This will send 1 ping</span>
<span class="pl-c"><span class="pl-c">#</span> Docs: https://docs.olivetin.app/action-ping.html</span>
- <span class="pl-ent">title</span>: <span class="pl-s">Ping host</span>
<span class="pl-ent">shell</span>: <span class="pl-s">ping {{ host }} -c {{ count }}</span>
<span class="pl-ent">icon</span>: <span class="pl-s">ping</span>
<span class="pl-ent">arguments</span>:
- <span class="pl-ent">name</span>: <span class="pl-s">host</span>
<span class="pl-ent">title</span>: <span class="pl-s">host</span>
<span class="pl-ent">type</span>: <span class="pl-s">ascii_identifier</span>
<span class="pl-ent">default</span>: <span class="pl-s">example.com</span>
- <span class="pl-ent">name</span>: <span class="pl-s">count</span>
<span class="pl-ent">title</span>: <span class="pl-s">Count</span>
<span class="pl-ent">type</span>: <span class="pl-s">int</span>
<span class="pl-ent">default</span>: <span class="pl-c1">1</span>
<span class="pl-c"><span class="pl-c">#</span> Restart http on host "webserver1"</span>
<span class="pl-c"><span class="pl-c">#</span> Docs: https://docs.olivetin.app/action-ssh.html</span>
- <span class="pl-ent">title</span>: <span class="pl-s">restart httpd</span>
<span class="pl-ent">icon</span>: <span class="pl-s">restart</span>
<span class="pl-ent">shell</span>: <span class="pl-s">ssh root@webserver1 'service httpd restart'</span></pre>
</div>
</div>
</div>
<div class = "alt-section">
<div class = "contentWrap">
<h2>Installation</h2>
<p>Installation instructions can be found on the <a href = "https://docs.olivetin.app/installation.html">OliveTin installation documentation page</a>.</p>
<h2>Download</h2>
<p>Downloads can be found on the <a href = "https://docs.olivetin.app/choose-package.html">Which download do I need?</a> documentation page.
<h2 id = "opensource">Open Source</h2>
<p>This project is open source, and feature requests, bugs, security issues and similar can all be raised via the <a href = "https://github.com/OliveTin/OliveTin/issues/new/choose">OliveTin new issue</a> page in the OliveTin GitHub repository.</p>
<p>Contributions to documentation, code, and other parts of the project are most welcome. You can find the <a href = "https://github.com/OliveTin/OliveTin/blob/main/CONTRIBUTING.adoc">contribution guidelines</a> in the repository.</p>
</div>
</div>
</main>
<footer aria-label = "Footer">
<div class = "contentWrap" role = "none">
OliveTin
</div>
</footer>
<script type="application/ld+json">
{
"@context": "https://schema.org/",
"@type": "SoftwareApplication",
"name": "OliveTin - give safe and simple access to predefined shell commands from a web interface",
"url": "https://www.olivetin.app",
"downloadUrl": "https://github.com/OliveTin/OliveTin/releases",
"screenshot": "https://www.olivetin.app/resources/images/promo2.png",
"image": "https://www.olivetin.app/resources/images/logo.png",
"description": "Useful for routine jobs like restarting services, starting backup scripts, or sending pings, when direct SSH access is difficult, not possible, or a just pain to use.",
"applicationCategory": "Utility",
"operatingSystem": "Linux",
"offers": {
"@type": "Offer",
"url": "https://www.olivetin.app",
"priceCurrency": "USD",
"price": "0"
}
}
</script>
</body>
</html>