mirror of
https://github.com/Tygs/0bin.git
synced 2023-08-10 21:13:00 +03:00
Merging counter
This commit is contained in:
commit
02a5aa6cf6
37
stats.py
Normal file
37
stats.py
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vim: ai ts=4 sts=4 et sw=4
|
||||||
|
|
||||||
|
|
||||||
|
"""
|
||||||
|
Exctract usefull infos from web server logs
|
||||||
|
"""
|
||||||
|
|
||||||
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
# define your web server logs path
|
||||||
|
LOGS_PATH = "/var/log/nginx/access_0bin.log"
|
||||||
|
|
||||||
|
|
||||||
|
rexp = re.compile('(\d+\.\d+\.\d+\.\d+) - - \[([^\[\]:]+):(\d+:\d+:\d+) -(\d\d\d\d\)] ("[^"]*")(\d+) (-|\d+) ("[^"]*") (".*")\s*\Z')
|
||||||
|
|
||||||
|
|
||||||
|
f = open(LOGS_PATH, 'r')
|
||||||
|
|
||||||
|
for line in f:
|
||||||
|
a = rexp.match(line)
|
||||||
|
|
||||||
|
if not a is None:
|
||||||
|
# a.group(1) #IP address
|
||||||
|
# a.group(2) #day/month/year
|
||||||
|
# a.group(3) #time of day
|
||||||
|
# a.group(4) #timezone
|
||||||
|
# a.group(5) #request
|
||||||
|
# a.group(6) #code 200 for success, 404 for not found, etc.
|
||||||
|
# a.group(7) #bytes transferred
|
||||||
|
# a.group(8) #referrer
|
||||||
|
# a.group(9) #browser
|
||||||
|
print a.group(8) #referrer
|
||||||
|
|
||||||
|
f.close()
|
@ -53,6 +53,12 @@ PORT = "8000"
|
|||||||
USER = None
|
USER = None
|
||||||
GROUP = None
|
GROUP = None
|
||||||
|
|
||||||
|
# Display a tiny counter for pastes created.
|
||||||
|
# Be carreful if your site have to many pastes this can hurt your hard drive performances.
|
||||||
|
# Refresh counter interval. Default to every minute after a paste.
|
||||||
|
DISPLAY_COUNTER = True
|
||||||
|
REFRESH_COUNTER = 60 * 1
|
||||||
|
|
||||||
# Names/links to insert in the menu bar.
|
# Names/links to insert in the menu bar.
|
||||||
# Any link with "mailto:" will be escaped to prevent spam
|
# Any link with "mailto:" will be escaped to prevent spam
|
||||||
MENU = (
|
MENU = (
|
||||||
|
@ -112,6 +112,58 @@ class Paste(object):
|
|||||||
return cls.load_from_file(cls.get_path(uuid))
|
return cls.load_from_file(cls.get_path(uuid))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def increment_counter(self):
|
||||||
|
"""
|
||||||
|
Increment pastes counter
|
||||||
|
"""
|
||||||
|
|
||||||
|
# simple counter incrementation
|
||||||
|
# using lock file to prevent multi access to the file
|
||||||
|
# could be improved.
|
||||||
|
|
||||||
|
|
||||||
|
path = settings.PASTE_FILES_ROOT
|
||||||
|
counter_file = os.path.join(path, 'counter')
|
||||||
|
lock_file = os.path.join(path, 'counter.lock')
|
||||||
|
|
||||||
|
if not os.path.isfile(lock_file):
|
||||||
|
try:
|
||||||
|
#make lock file
|
||||||
|
flock = open(lock_file, "w")
|
||||||
|
flock.write('lock')
|
||||||
|
flock.close()
|
||||||
|
|
||||||
|
# init counter (first time)
|
||||||
|
if not os.path.isfile(counter_file):
|
||||||
|
fcounter = open(counter_file, "w")
|
||||||
|
fcounter.write('1')
|
||||||
|
fcounter.close()
|
||||||
|
|
||||||
|
# get counter value
|
||||||
|
fcounter = open(counter_file, "r")
|
||||||
|
counter_value = fcounter.read(50)
|
||||||
|
fcounter.close()
|
||||||
|
|
||||||
|
try:
|
||||||
|
counter_value = long(counter_value) + 1
|
||||||
|
except ValueError:
|
||||||
|
counter_value = 1
|
||||||
|
|
||||||
|
# write new value to counter
|
||||||
|
fcounter = open(counter_file, "w")
|
||||||
|
fcounter.write(str(counter_value))
|
||||||
|
fcounter.close()
|
||||||
|
|
||||||
|
#remove lock file
|
||||||
|
os.remove(lock_file)
|
||||||
|
except (IOError, OSError):
|
||||||
|
if os.path.isfile(lock_file):
|
||||||
|
#remove lock file
|
||||||
|
os.remove(lock_file)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
"""
|
"""
|
||||||
Save the content of this paste to a file.
|
Save the content of this paste to a file.
|
||||||
|
@ -23,14 +23,16 @@ from bottle import (Bottle, run, static_file, view, request)
|
|||||||
import clize
|
import clize
|
||||||
|
|
||||||
from paste import Paste
|
from paste import Paste
|
||||||
from utils import drop_privileges, dmerge
|
from utils import drop_privileges, dmerge, get_pastes_count
|
||||||
|
|
||||||
|
|
||||||
app = Bottle()
|
app = Bottle()
|
||||||
GLOBAL_CONTEXT = {
|
GLOBAL_CONTEXT = {
|
||||||
'settings': settings
|
'settings': settings,
|
||||||
|
'pastes_count': get_pastes_count(),
|
||||||
|
'refresh_counter': datetime.now()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@app.route('/')
|
@app.route('/')
|
||||||
@view('home')
|
@view('home')
|
||||||
@ -64,6 +66,19 @@ def create_paste():
|
|||||||
expiration = request.forms.get('expiration', u'burn_after_reading')
|
expiration = request.forms.get('expiration', u'burn_after_reading')
|
||||||
paste = Paste(expiration=expiration, content=content)
|
paste = Paste(expiration=expiration, content=content)
|
||||||
paste.save()
|
paste.save()
|
||||||
|
|
||||||
|
# display counter
|
||||||
|
if settings.DISPLAY_COUNTER:
|
||||||
|
|
||||||
|
#increment paste counter
|
||||||
|
paste.increment_counter()
|
||||||
|
|
||||||
|
# if refresh time elapsed pick up new counter value
|
||||||
|
if GLOBAL_CONTEXT['refresh_counter'] + timedelta(seconds=settings.REFRESH_COUNTER) < datetime.now():
|
||||||
|
GLOBAL_CONTEXT['pastes_count'] = get_pastes_count()
|
||||||
|
GLOBAL_CONTEXT['refresh_counter'] = datetime.now()
|
||||||
|
|
||||||
|
|
||||||
return {'status': 'ok',
|
return {'status': 'ok',
|
||||||
'paste': paste.uuid}
|
'paste': paste.uuid}
|
||||||
|
|
||||||
|
@ -31,6 +31,10 @@
|
|||||||
margin-bottom: 0px !important;
|
margin-bottom: 0px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
.about span{
|
.about span{
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ import os
|
|||||||
import glob
|
import glob
|
||||||
import tempfile
|
import tempfile
|
||||||
import sys
|
import sys
|
||||||
|
import locale
|
||||||
|
|
||||||
import default_settings
|
import default_settings
|
||||||
sys.path.append(default_settings.LIBS_DIR)
|
sys.path.append(default_settings.LIBS_DIR)
|
||||||
@ -53,6 +54,21 @@ def dmerge(*args):
|
|||||||
return dictionary
|
return dictionary
|
||||||
|
|
||||||
|
|
||||||
|
def get_pastes_count():
|
||||||
|
"""
|
||||||
|
Return the number of pastes created (must have option DISPLAY_COUNTER enabled)
|
||||||
|
"""
|
||||||
|
locale.setlocale(locale.LC_ALL, 'en_US')
|
||||||
|
counter_path = settings.PASTE_FILES_ROOT
|
||||||
|
counter_file = os.path.join(counter_path, 'counter')
|
||||||
|
try:
|
||||||
|
with open(counter_file, "r") as f:
|
||||||
|
count = f.read(50)
|
||||||
|
f.close
|
||||||
|
except IOError:
|
||||||
|
count = 0
|
||||||
|
|
||||||
|
return locale.format("%d", long(float(count)), grouping=True)
|
||||||
|
|
||||||
|
|
||||||
class SettingsContainer(object):
|
class SettingsContainer(object):
|
||||||
|
@ -33,4 +33,4 @@
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
||||||
%rebase base settings=settings
|
%rebase base settings=settings, pastes_count=pastes_count
|
||||||
|
@ -125,13 +125,13 @@
|
|||||||
<p>“Few persons can be made to believe that it is not quite an easy thing to invent a method of secret writing which shall baffle investigation. Yet it may be roundly asserted that human ingenuity cannot concoct a cipher which human ingenuity cannot resolve...”</p>
|
<p>“Few persons can be made to believe that it is not quite an easy thing to invent a method of secret writing which shall baffle investigation. Yet it may be roundly asserted that human ingenuity cannot concoct a cipher which human ingenuity cannot resolve...”</p>
|
||||||
<small>Edgar Allan Poe</small>
|
<small>Edgar Allan Poe</small>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|
||||||
|
|
||||||
<!-- <h4 id="pixels-total" >
|
|
||||||
<p>ø</p>
|
|
||||||
<strong>41,017,923,819</strong> pastes øbinned
|
|
||||||
</h4> -->
|
|
||||||
|
|
||||||
|
%if settings.DISPLAY_COUNTER:
|
||||||
|
<h4 id="pixels-total" >
|
||||||
|
<p>ø</p>
|
||||||
|
<strong>{{ pastes_count }}</strong> </br>pastes øbinned
|
||||||
|
</h4>
|
||||||
|
%end
|
||||||
|
|
||||||
</br>
|
</br>
|
||||||
<p class="greetings span12">
|
<p class="greetings span12">
|
||||||
|
@ -32,4 +32,4 @@
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
%rebase base settings=settings
|
%rebase base settings=settings, pastes_count=pastes_count
|
||||||
|
@ -25,4 +25,4 @@
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
||||||
%rebase base settings=settings
|
%rebase base settings=settings, pastes_count=pastes_count
|
||||||
|
@ -78,4 +78,4 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
%rebase base settings=settings
|
%rebase base settings=settings, pastes_count=pastes_count
|
||||||
|
Loading…
Reference in New Issue
Block a user