diff --git a/AUTHORS b/AUTHORS index f90ff02..c729ee2 100644 --- a/AUTHORS +++ b/AUTHORS @@ -16,12 +16,12 @@ Contributors for modifications: # Liblor - Fixes # Loris Reiff # iamarf - # stylesuxx # denis-d # taffy-nay # risca # herr-gabriel # Jess Stubenbord + # Mike Weaver # ... and all others I might have forgotten. diff --git a/BuildScripts/README b/BuildScripts/README deleted file mode 100644 index 51eb5a8..0000000 --- a/BuildScripts/README +++ /dev/null @@ -1 +0,0 @@ -This folder contains the stuff needed to Build *nix packages like i.e. Debian, Fedora ... diff --git a/BuildScripts/RPi_motd.txt b/BuildScripts/RPi_motd.txt deleted file mode 100644 index 0d16e93..0000000 --- a/BuildScripts/RPi_motd.txt +++ /dev/null @@ -1,32 +0,0 @@ -PirateBox RPi-Image 1.0.1 -PirateBox Version 1.0.1 - Website: http://piratebox.cc - Forum: http://forum.piratebox.cc - IRC: #piratebox on irc.Freenode.net - -Want to start a not enabled piratebox, run - # systemctl start piratebox - -Next Steps after first flashing: -1. Change password of alarm user: - # passwd -2. Switch user to root (password is root) , to proceed with the final steps - # su -3. Change the password for the root user: - # password -4. If you want to have PirateBox enabled on startup: - # systemctl enable piratebox - # systemctl start piratebox -5. Enable Fake-Timeservice - 5.1 Set time like - # date 101016112014 for "Fri Oct 10 16:11:00 2014" format is: MMDDhhmmCCYY - # /opt/piratebox/bin/timesave.sh /opt/piratebox/conf/piratebox.conf install - 5.2 Enable for bootup - # systemctl enable timesave -6. Activate the Kareha Image and Discussion Board. - # /opt/piratebox/bin/board-autoconf.sh -7. If you want, enable UPnP Media Server - # cp /etc/minidlna.conf /etc/minidlna.conf.bkp - # cp /opt/piratebox/src/linux.example.minidlna.conf /etc/minidlna.conf - # systemctl start minidlna - # systemctl enable minidlna diff --git a/BuildScripts/RaspberryPi/README b/BuildScripts/RaspberryPi/README deleted file mode 100644 index d1e6b99..0000000 --- a/BuildScripts/RaspberryPi/README +++ /dev/null @@ -1,81 +0,0 @@ -http://blog.mx17.net/2012/07/13/raspberry-pi-tip-mount-raspbmc-images/ - -http://schloesser-edv.de/tips-und-tricks/linux/chroot-mount.html - -.. - -things done for image preparation - -Download: Raspbian “wheezy” -mount image (like first link) - - -mount -o bind /dev /mnt/dev -mount -t proc none /mnt/proc - -sudo chroot /mnt/ /bin/bash - -do: ---- - - apt-get -y install lighttpd - /etc/init.d/lighttpd stop - update-rc.d lighttpd remove - apt-get -y install dnsmasq - /etc/init.d/dnsmasq stop - update-rc.d dnsmasq remove - apt-get -y install hostapd - /etc/init.d/hostapd stop - update-rc.d hostapd remove - apt-get -y install iw - rm /bin/sh - ln /bin/bash /bin/sh - chmod a+rw /bin/sh - -Edit network config file /etc/network/interfaces - auto lo - - iface lo inet loopback - iface eth0 inet dhcp - - iface wlan0 inet manual - ### disalbed for PirateBox - #allow-hotplug wlan0 - #wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf - #iface default inet dhcp - - -wget http://downloads.piratebox.de/piratebox-ws_current.tar.gz -tar xzf piratebox-ws_current.tar.gz -cd piratebox -mkdir -p /opt -cp -rv piratebox /opt -cd /opt/piratebox -sed 's:DROOPY_USE_USER="no":DROOPY_USE_USER="yes":' -i /opt/piratebox/conf/piratebox.conf -sed 's:PROBE_INTERFACE="no":PROBE_INTERFACE="yes":' -i /opt/piratebox/conf/piratebox.conf -ln /opt/piratebox/init.d/piratebox /etc/init.d/piratebox -cd ../../ -rm -rv piratebox/ piratebox-ws_current.tar.gz - - - - ------------------------ - -Install Raspberry as normal: http://elinux.org/RPi_Easy_SD_Card_Setup - - Use my Image instead of the rpi.org one - Boot as normal with a Monitor, Keyboard & connected LAN (DHCP with Internet access) - Do the following steps in Raspi-Config - Enable SSH Server via raspberry-config - change Password - Expand FS - Finish & reboot now - -Wait until reboot is finished- needs a while because the OS is resizing the filesystem during this reboot - -If you want to run it via default: - - sudo update-rc.d piratebox defaults - sudo /etc/init.d/piratebox start - sudo touch /opt/piratebox/conf/init_done diff --git a/CHANGELOG b/CHANGELOG index bc9f575..a89f59d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,23 @@ CHANGELOG +=== 1.0.7 === +* [New] Lock shoutbox when you send a message. +* [New] Display disk space usage on front page. +* [New] Add webm mime-type to lighttpd +* [RPi] [New] RPi2 and Zero support +* [RPi] [New] USB activation scripts. +* [RPi] [New] udev rules for piratebox activation +* [RPi] [New] Script for activating the correct hostap for Realtek chipsets +* [RPI] [New] wpa_supplicant fallback if no AP enabled WiFi device was found +* [Fix] Send a proper HTTP Reason code back +* [Fix] Fix version number in RPi MOTD. +* [Fix] Insert mime-type for .svg +* [Fix] Improve Shoutbox update speed after sending a message. +* [Fix] Do not cleanup the rootfs if Shared folder does not exist. +* [Fix] Improved comparison of timestamps on RPi. +* [Fix] Improved MOTD for RPi. +* [Fix] Improved initialization of the board. + === 1.0.6 === * [Fix] Styling of the upload box iframe was quite ugly. diff --git a/Makefile b/Makefile index 94dac15..4ff0a33 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ NAME = piratebox-ws -VERSION = 1.0.6 +VERSION = 1.0.7 ARCH = all PB_FOLDER=piratebox PB_SRC_FOLDER=$(PB_FOLDER)/$(PB_FOLDER) diff --git a/piratebox/piratebox/bin/board-autoconf.sh b/piratebox/piratebox/bin/board-autoconf.sh index 18f25e1..7bfdc91 100755 --- a/piratebox/piratebox/bin/board-autoconf.sh +++ b/piratebox/piratebox/bin/board-autoconf.sh @@ -18,5 +18,6 @@ else # Remove temporary index page and then try to initialize the board test -e /opt/piratebox/share/board/index.htm && rm /opt/piratebox/share/board/index.htm - wget -q -s -O - http://127.0.0.1/board/kareha.pl 2>/dev/null + #wget -q -s -O - http://127.0.0.1/board/kareha.pl 2>/dev/null + wget -qO- http://127.0.0.1/board/kareha.pl &> /dev/null fi diff --git a/piratebox/piratebox/bin/delete_empty.sh b/piratebox/piratebox/bin/delete_empty.sh index 1cb1b55..ced7516 100755 --- a/piratebox/piratebox/bin/delete_empty.sh +++ b/piratebox/piratebox/bin/delete_empty.sh @@ -1,12 +1,17 @@ #!/bin/sh +# This script is needed for Piratebox on OpenWrt. +# The find utility there has only a limited feature set. + IFS=' ' +# Change directory, if not exist exit to not cleanup the +# OS filesystem. +cd $1 || exit 1 -cd $1 -ls_list=$( find ./ ) +ls_list=$( find ./ -type f ) for filename in $ls_list do diff --git a/piratebox/piratebox/bin/generate_config_files.sh b/piratebox/piratebox/bin/generate_config_files.sh index 8da4979..00e38d3 100755 --- a/piratebox/piratebox/bin/generate_config_files.sh +++ b/piratebox/piratebox/bin/generate_config_files.sh @@ -122,6 +122,7 @@ generate_lighttpd_env() { local SHOUTBOX_GEN_HTMLFILE=$4 local PIRATEBOX=$5 local SHOUTBOX_CHATFILE=$6 + local DISK_GEN_HTMLFILE=$7 echo "Generating Environment-config for lighttpd ....." @@ -134,6 +135,7 @@ generate_lighttpd_env() { \"PYTHONPATH\" => \"$PYTHONPATH:$PIRATEBOX/python_lib\", \"SHOUTBOX_GEN_HTMLFILE\" => \"$SHOUTBOX_GEN_HTMLFILE\" , \"SHOUTBOX_CHATFILE\" => \"$SHOUTBOX_CHATFILE\" , + \"DISK_GEN_HTMLFILE\" => \"$DISK_GEN_HTMLFILE\" , $LIGHTTPD_ENV_BR_LINE )" @@ -171,7 +173,7 @@ if [ "$IPV6_ENABLE" = "yes" ] ; then fi generate_hosts $HOST $IP $IPV6 generate_dnsmasq $NET $IP_SHORT $START_LEASE $END_LEASE $LEASE_DURATION $DNSMASQ_INTERFACE -generate_lighttpd_env $GLOBAL_CHAT "$GLOBAL_DEST" $PIRATEBOX_PYTHONPATH $GEN_CHATFILE $PIRATEBOX_FOLDER $CHATFILE +generate_lighttpd_env $GLOBAL_CHAT "$GLOBAL_DEST" $PIRATEBOX_PYTHONPATH $GEN_CHATFILE $PIRATEBOX_FOLDER $CHATFILE $GEN_DISKFILE diff --git a/piratebox/piratebox/bin/shoutbox_stuff.sh b/piratebox/piratebox/bin/shoutbox_stuff.sh index a7301d5..f07f9eb 100755 --- a/piratebox/piratebox/bin/shoutbox_stuff.sh +++ b/piratebox/piratebox/bin/shoutbox_stuff.sh @@ -19,15 +19,19 @@ cd python_lib export SHOUTBOX_CHATFILE=$CHATFILE export SHOUTBOX_GEN_HTMLFILE=$GEN_CHATFILE +export DISK_GEN_HTMLFILE=$GEN_DISKFILE #Writing init-message and reset chat.. if [ "$RESET_CHAT" = "yes" ] ; then echo $CHATMSG > $CHATFILE fi -#Generate content file +#Generate content file for Shoutbox python psogen.py generate +#Generate content file for DiskUsage +python diskusage.py generate + $( sleep 20 && touch $GEN_CHATFILE ) & #Set correct permissions @@ -36,4 +40,6 @@ chown $LIGHTTPD_USER:$LIGHTTPD_GROUP $SHOUTBOX_GEN_HTMLFILE chmod ug+rw $SHOUTBOX_CHATFILE chmod ug+rw $SHOUTBOX_GEN_HTMLFILE - +#DiskUsage correct permissions +chown $LIGHTTPD_USER:$LIGHTTPD_GROUP $DISK_GEN_HTMLFILE +chmod ug+rw $DISK_GEN_HTMLFILE diff --git a/piratebox/piratebox/bin/timesave.sh b/piratebox/piratebox/bin/timesave.sh index 73f9356..6ed7433 100755 --- a/piratebox/piratebox/bin/timesave.sh +++ b/piratebox/piratebox/bin/timesave.sh @@ -4,8 +4,8 @@ # for Systems without a Realtime Clock # like TP-Link MR3020 , RaspberryPI # -# It does not reflect the real time, but -# gives a sort of stability to complete standalone +# It does not reflect the real time, but +# gives a sort of stability to complete standalone # systems. # # Licenced under GPL-2 @ 2012,2015 @@ -13,14 +13,17 @@ ##function for similar saving & getting time get_datetime() { - # Get format from piratebox.conf - date $TIMESAVE_FORMAT + # Get format from piratebox.conf + date "${TIMESAVE_FORMAT}" } +# Strip spaces from datetime +sanitize_datetime() { + echo $1 | sed s/" "/""/g +} -# Load configfile - -if [ -z $1 ] || [ -z $2 ] ; then +# Print usage if parameters are not provided +if [ -z $1 ] || [ -z $2 ] ; then echo "Set up a crontab entry for regulary saving the time" echo "Usage $0 " echo " Valid steps are:" @@ -31,49 +34,52 @@ if [ -z $1 ] || [ -z $2 ] ; then exit 1 fi +# Load configfile . $1 - if [ "$2" = "install" ] ; then - crontab -l > $PIRATEBOX_FOLDER/tmp/crontab 2> /dev/null - echo "#--- Crontab for PirateBox-Timesave" >> $PIRATEBOX_FOLDER/tmp/crontab - echo " */5 * * * * $PIRATEBOX_FOLDER/bin/timesave.sh $PIRATEBOX_FOLDER/conf/piratebox.conf save " >> $PIRATEBOX_FOLDER/tmp/crontab - crontab $PIRATEBOX_FOLDER/tmp/crontab + crontab -l > $PIRATEBOX_FOLDER/tmp/crontab 2> /dev/null + echo "#--- Crontab for PirateBox-Timesave" >> $PIRATEBOX_FOLDER/tmp/crontab + echo " */5 * * * * $PIRATEBOX_FOLDER/bin/timesave.sh $PIRATEBOX_FOLDER/conf/piratebox.conf save" >> $PIRATEBOX_FOLDER/tmp/crontab + crontab $PIRATEBOX_FOLDER/tmp/crontab - echo "initialize timesave file" - touch $TIMESAVE - chmod a+rw $TIMESAVE - get_datetime > $TIMESAVE + echo "initialize timesave file" + touch $TIMESAVE + chmod a+rw $TIMESAVE + get_datetime > $TIMESAVE + echo "Remember MAY have to cron active..." + echo " on OpenWrt run: /etc/init.d/piratebox enable" - echo "Remember MAY have to cron active..." - echo " on OpenWrt run: /etc/init.d/piratebox enable" - - exit 0 + exit 0 fi +# Save current date-time in a recoverable format if [ "$2" = "save" ] ; then - if [ -e $TIMESAVE ] ; then - if [ `get_datetime` -lt `cat $TIMESAVE` ] ; then - logger -s "$0 : sorry, current date-time is lower then saved one, don't save it this time" - exit 1 - fi + if [ -e $TIMESAVE ] ; then + if [ $(sanitize_datetime "$(get_datetime)") -lt $(sanitize_datetime "$(cat $TIMESAVE)") ] ; then + logger -s "$0: Current date-time is lower then saved one. Not saving!" + exit 1 fi + fi - #Save Datetime in a recoverable format... - get_datetime > $TIMESAVE - exit 0 + get_datetime > $TIMESAVE + exit 0 fi +# Recover date-time from a previous state if [ "$2" = "recover" ] ; then - if [ `get_datetime` -lt `cat $TIMESAVE` ] ; then - date -s `cat $TIMESAVE ` - [ "$?" != "0" ] && echo "error in recovering time" && exit 255 - echo "Time recovered" - exit 0 + if [ $(sanitize_datetime "$(get_datetime)") -lt $(sanitize_datetime "$(cat $TIMESAVE)") ] ; then + date -s "$(cat $TIMESAVE)" > /dev/null + if [ "$?" != "0" ] ; then + logger -s "$0: Could not recover date-time." + exit 1 else - echo "Sorry, changing timebackward via timesave is not possible" - exit 1 + logger -s "$0: Sucessfully recovered date-time." + exit 0 fi + else + logger -s "$0: Time can not be changed to the past." + exit 1 + fi fi - diff --git a/piratebox/piratebox/conf/lighttpd/mime.types b/piratebox/piratebox/conf/lighttpd/mime.types index ea8b09a..97a4793 100644 --- a/piratebox/piratebox/conf/lighttpd/mime.types +++ b/piratebox/piratebox/conf/lighttpd/mime.types @@ -80,9 +80,12 @@ mimetype.assign = ( ".oti" => "application/vnd.oasis.opendocument.image-template", ".oth" => "application/vnd.oasis.opendocument.text-web", + ".webm" => "video/webm", + ".json" => "application/json", ".epub" => "application/epub+zip", ".fb2" => "text/xml", + ".svg" => "image/svg+xml", # make the default mime type application/octet-stream. "" => "application/octet-stream", diff --git a/piratebox/piratebox/conf/piratebox.conf b/piratebox/piratebox/conf/piratebox.conf index 44c9a98..e2b8ae3 100644 --- a/piratebox/piratebox/conf/piratebox.conf +++ b/piratebox/piratebox/conf/piratebox.conf @@ -145,6 +145,9 @@ CHATFILE="$WWW_FOLDER/cgi-bin/data.pso" #Generated File GEN_CHATFILE="$WWW_FOLDER/chat_content.html" +#Generated File for DiskUsage +GEN_DISKFILE="$WWW_FOLDER/diskusage.html" + # Reset Shoutbox on Startup? RESET_CHAT="yes" diff --git a/piratebox/piratebox/python_lib/diskusage.py b/piratebox/piratebox/python_lib/diskusage.py new file mode 100644 index 0000000..0862550 --- /dev/null +++ b/piratebox/piratebox/python_lib/diskusage.py @@ -0,0 +1,106 @@ +#!/usr/bin/python + +# Library to write the current disk usage + +# Heavily Modified version the ShoutBox Library (psogen.py) + +import os, re, datetime +from psutil import disk_usage + +htmlfilename = os.environ["DISK_GEN_HTMLFILE"] +delay = 60*5 #In seconds + +#-------------- +# Generates Shoutbox-HTML-Frame ... +# Imports: +# content - String containing preformatted data +#-------------- +def generate_html(content): + htmlstring = "DiskUsage Data" + htmlstring += content + htmlstring += "" + return htmlstring + +def modification_date(filename): + moddate = os.path.getmtime(filename) + return datetime.datetime.fromtimestamp(moddate) + +#-------------- +# Generates HTML Data based on given content and write it to static html file +# Imports: +# content - String containing preformatted data +#-------------- +def generate_html_into_file(content): + open(htmlfilename, 'w').close() + htmlstring = generate_html ( content ) + htmlfile = open( htmlfilename , 'w' ) + htmlfile.truncate() + htmlfile.write( htmlstring ) + htmlfile.close() + +#-------------- +# Function for saving the disk usage to a file. Called by HTML-Form +#-------------- +def get_usage(drive): + + try: + file_mod_time = modification_date(htmlfilename) + except OSError: + content = prepare_line(drive) + generate_html_into_file(content) + file_mod_time = modification_date(htmlfilename) + + now = datetime.datetime.today() + max_delay = datetime.timedelta(0,delay) + age = now - file_mod_time + + #Add delay. + if age < max_delay: + print "CRITICAL: {} modified {} minutes ago. Threshold set to {} minutes. Cannot update.".format(drive, age.seconds/60, max_delay.seconds/60) + else: + print "OK. File last modified {} minutes ago. Updating now...".format(age.seconds/60) + content = prepare_line(drive) + generate_html_into_file(content) + +#-------------- +# Function for returning the amount of free space as an Integer +#-------------- +def FreeSpace(drive): + """ Return the FreeSape of a shared drive in bytes""" + try: + usage = disk_usage(drive) + floatpercent = float(usage.used) / float(usage.total) + percent = int(100*floatpercent) + return percent + except: + return 0 + + +#-------------- +# Function which formats the about of freespace into a nice readable format +#-------------- +def prepare_line (drive): + data = str(FreeSpace(drive)) + # Trying to make it look like this: + #
+ #
+ # 15% Full + #
+ #
+ content = "
" + data + "% Full
" + return content + +#-------------- +# Generating static HTML File +#-------------- +if __name__ == "__main__": + + disk = "/opt/piratebox/share/Shared" + + if os.path.exists(htmlfilename) != True: + content = prepare_line(disk) + generate_html_into_file(content) + else: + get_usage(disk) + + print "Generated HTML-DiskUsage File." \ No newline at end of file diff --git a/piratebox/piratebox/python_lib/psutil.py b/piratebox/piratebox/python_lib/psutil.py new file mode 100644 index 0000000..17dc3e2 --- /dev/null +++ b/piratebox/piratebox/python_lib/psutil.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python + +""" +Return disk usage statistics about the given path as a (total, used, free) +namedtuple. Values are expressed in bytes. +""" +# Author: Giampaolo Rodola' +# License: MIT + +import os +import collections + +_ntuple_diskusage = collections.namedtuple('usage', 'total used free') + +if hasattr(os, 'statvfs'): # POSIX + def disk_usage(path): + st = os.statvfs(path) + free = st.f_bavail * st.f_frsize + total = st.f_blocks * st.f_frsize + used = (st.f_blocks - st.f_bfree) * st.f_frsize + return _ntuple_diskusage(total, used, free) + +elif os.name == 'nt': # Windows + import ctypes + import sys + + def disk_usage(path): + _, total, free = ctypes.c_ulonglong(), ctypes.c_ulonglong(), \ + ctypes.c_ulonglong() + if sys.version_info >= (3,) or isinstance(path, unicode): + fun = ctypes.windll.kernel32.GetDiskFreeSpaceExW + else: + fun = ctypes.windll.kernel32.GetDiskFreeSpaceExA + ret = fun(path, ctypes.byref(_), ctypes.byref(total), ctypes.byref(free)) + if ret == 0: + raise ctypes.WinError() + used = total.value - free.value + return _ntuple_diskusage(total.value, used, free.value) +else: + raise NotImplementedError("platform not supported") + +disk_usage.__doc__ = __doc__ + +if __name__ == '__main__': + print disk_usage(os.getcwd()) \ No newline at end of file diff --git a/piratebox/piratebox/rpi/bin/starter.sh b/piratebox/piratebox/rpi/bin/starter.sh new file mode 100755 index 0000000..61cad4f --- /dev/null +++ b/piratebox/piratebox/rpi/bin/starter.sh @@ -0,0 +1,3 @@ +#!/bin/sh +# Try to setup WiFi and if it succeeds, start the PirateBox +/bin/sh -c /opt/piratebox/rpi/bin/wifi_detect.sh && /usr/bin/systemctl start piratebox diff --git a/piratebox/piratebox/rpi/bin/usb_share.sh b/piratebox/piratebox/rpi/bin/usb_share.sh new file mode 100755 index 0000000..790abf2 --- /dev/null +++ b/piratebox/piratebox/rpi/bin/usb_share.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +# Find a vfat partition and configure it as an external share +MOUNTPOINT="/mnt/usbshare" +FS="vfat" +UUIDS=$(blkid | grep "/dev/sd*.*TYPE=\"${FS}\"" | egrep -o " UUID=\"([a-zA-Z0-9-])*\"" | sed 's/ //g') + +if [ $(echo "${UUIDS}" | wc -l) -gt 1 ]; then + echo "You seem to have more than one valid ${FS} partition for a USB share:" + echo "${UUIDS}\n" + echo "Please make sure you have a USB thumb drive attached with a single ${FS} partition." + exit 1 +fi + +if [ $(echo "${UUIDS}" | wc -l) -lt 1 ] || [[ $UUIDS == "" ]]; then + echo "You seem to have no valid ${FS} partition for a USB share." + echo "Please make sure you have a USB thumb drive attached with a single ${FS} partition." + exit 1 +fi + +UUID=$(echo "${UUIDS}" | cut -f2 -d" " | sed s/"\""/""/g) +grep "${UUID}" /etc/fstab > /dev/null +if [ $? -eq 0 ]; then + echo "Error: This disk is already configured as an USB share..." + exit 1 +fi + +echo "## Adding USB share..." +mkdir -p "${MOUNTPOINT}" > /dev/null +echo "${UUID} ${MOUNTPOINT} vfat umask=0,noatime,rw,user,uid=nobody,gid=nogroup 0 0" >> /etc/fstab +mount "${MOUNTPOINT}" > /dev/null + +if [ $? == 0 ]; then + echo "## Moving files..." + mv /opt/piratebox/share "${MOUNTPOINT}/share" > /dev/null 2>&1 + ln -s "${MOUNTPOINT}/share" /opt/piratebox/share > /dev/null +else + echo "Error: Mounting file system failed, will not move files..." + cat "/etc/fstab" +fi + +exit 0 diff --git a/piratebox/piratebox/rpi/bin/wifi_detect.sh b/piratebox/piratebox/rpi/bin/wifi_detect.sh new file mode 100755 index 0000000..f1dd2a1 --- /dev/null +++ b/piratebox/piratebox/rpi/bin/wifi_detect.sh @@ -0,0 +1,42 @@ +#!/bin/sh + +# Install the proper hostapd package and adjust the hostapd configuration +# accordingly. + +PACKAGE_PATH="/prebuild/hostapd" +CONFIG_PATH="/opt/piratebox/conf/hostapd.conf" + +# Check if we have an nl80211 enabled device with AP mode, then we are done +if iw list | grep > /dev/null "* AP$"; then + echo "Found nl80211 device capable of AP mode..." + yes | pacman -U --needed "${PACKAGE_PATH}/hostapd-2"* > /dev/null + sed -i 's/^#driver=nl80211/driver=nl80211/' "${CONFIG_PATH}" + exit 0 +fi + +# Check for r8188eu enabled device +if dmesg | grep > /dev/null "r8188eu:"; then + echo "Found r8188eu enabled device..." + yes | pacman -U --needed "${PACKAGE_PATH}/hostapd-8188eu-"* > /dev/null + sed -i 's/^driver=nl80211/#driver=nl80211/' "${CONFIG_PATH}" + exit 0 +fi + +# Check for rtl8192cu enabled device +if dmesg | grep > /dev/null "rtl8192cu"; then + echo "Found rtl8192cu enabled device..." + yes | pacman -U --needed "${PACKAGE_PATH}/hostapd-8192cu-"* > /dev/null + sed -i 's/^driver=nl80211/#driver=nl80211/' "${CONFIG_PATH}" + exit 0 +fi + +echo "Could not find an AP enabled WiFi card..." + +# Try to connect to Wifi if wpa_supplicant.conf is available. +if [ -f /boot/wpa_supplicant.conf ]; then + echo "Found wpa_supplicant conf, trying to connect..." + wpa_supplicant -iwlan0 -c /boot/wpa_supplicant.conf -B -D wext + dhcpcd wlan0 +fi + +exit 1 diff --git a/piratebox/piratebox/rpi/motd.txt b/piratebox/piratebox/rpi/motd.txt new file mode 100644 index 0000000..6c6b08f --- /dev/null +++ b/piratebox/piratebox/rpi/motd.txt @@ -0,0 +1,32 @@ +____________________.__ __ __________ +\______ \______ \__|___________ _/ |_ ____\______ \ _______ ___ + | _/| ___/ \_ __ \__ \\ __\/ __ \| | _// _ \ \/ / + | | \| | | || | \// __ \| | \ ___/| | ( <_> > < + |____|_ /|____| |__||__| (____ /__| \___ >______ /\____/__/\_ \ + \/ \/ \/ \/ \/ + +Website: http://piratebox.cc PirateBox Version: 1.0.7 +Forum: http://forum.piratebox.cc RPi Image Version: 1.0.7-1 +IRC: #piratebox irc.freenode.net Be open -- Share freely! + +First Steps After Flashing +1. Change password of alarm user + > passwd +2. Enable Fake-Timeservice + 2.1 Set date and time + # Disable network time sync + > sudo timedatectl set-ntp false + # Set time to "Mon May 23 17:42:00" (Format: CCYYMMDD hhmm) + > sudo date -s "20170523 1742" + > cd /opt/piratebox && sudo ./bin/timesave.sh ./conf/piratebox.conf install + 2.2 Enable on startup + > sudo systemctl enable timesave +3. Enable the Kareha Image and Discussion Board + > sudo /opt/piratebox/bin/board-autoconf.sh +4. Enable USB thumb drive share + > sudo /opt/piratebox/rpi/bin/usb_share.sh +5. Enable UPnP Media Server + > sudo cp /etc/minidlna.conf /etc/minidlna.conf.bkp + > sudo cp /opt/piratebox/src/linux.example.minidlna.conf /etc/minidlna.conf + > sudo systemctl start minidlna + > sudo systemctl enable minidlna diff --git a/BuildScripts/piratebox.service b/piratebox/piratebox/rpi/services/piratebox.service similarity index 100% rename from BuildScripts/piratebox.service rename to piratebox/piratebox/rpi/services/piratebox.service diff --git a/BuildScripts/timesave.service b/piratebox/piratebox/rpi/services/timesave.service similarity index 100% rename from BuildScripts/timesave.service rename to piratebox/piratebox/rpi/services/timesave.service diff --git a/piratebox/piratebox/rpi/udev/99-wifi.rules b/piratebox/piratebox/rpi/udev/99-wifi.rules new file mode 100644 index 0000000..b39d287 --- /dev/null +++ b/piratebox/piratebox/rpi/udev/99-wifi.rules @@ -0,0 +1 @@ +KERNEL=="wlan*", RUN+="/bin/sh -c /opt/piratebox/rpi/bin/starter.sh" diff --git a/piratebox/piratebox/src/openwrt.example.minidlna b/piratebox/piratebox/src/openwrt.example.minidlna index d8f25a4..87029a3 100644 --- a/piratebox/piratebox/src/openwrt.example.minidlna +++ b/piratebox/piratebox/src/openwrt.example.minidlna @@ -3,7 +3,7 @@ config minidlna config option port '8200' option interface 'br-lan' option friendly_name 'PirateBox DLNA' - option db_dir '/var/run/minidlna' + option db_dir '/opt/piratebox/share/minidlna' option log_dir '/var/log' option inotify '1' option enable_tivo '0' diff --git a/piratebox/piratebox/www/cgi-bin/diskwrite.py b/piratebox/piratebox/www/cgi-bin/diskwrite.py new file mode 100755 index 0000000..b2bd170 --- /dev/null +++ b/piratebox/piratebox/www/cgi-bin/diskwrite.py @@ -0,0 +1,14 @@ +#!/usr/bin/python + +# Disk Write +# Writes the total freespace to an HTML file. + +import cgi, datetime +from diskusage import get_usage + + +print "Content-type:text/html\r\n\r\n" + +get_usage("/opt/piratebox/share/Shared/") + +print """ok""" diff --git a/piratebox/piratebox/www/cgi-bin/psowrte.py b/piratebox/piratebox/www/cgi-bin/psowrte.py index 363d51c..e6f28a3 100755 --- a/piratebox/piratebox/www/cgi-bin/psowrte.py +++ b/piratebox/piratebox/www/cgi-bin/psowrte.py @@ -25,5 +25,6 @@ curdate = datetime.datetime.now() process_form(rawname, rawdata, color) +print "Status:200\r\n\r\n" print """ok""" diff --git a/piratebox/piratebox/www/index.html b/piratebox/piratebox/www/index.html index 08af48c..37c26da 100644 --- a/piratebox/piratebox/www/index.html +++ b/piratebox/piratebox/www/index.html @@ -5,6 +5,8 @@ PirateBox - Share Freely! + + @@ -48,6 +50,16 @@

Browse Files ->

+
+

Disk Usage

+
+
+
+ +
+
+
+
@@ -58,7 +70,7 @@
- +

Text Color:

diff --git a/piratebox/piratebox/www/jquery-ui.min.css b/piratebox/piratebox/www/jquery-ui.min.css new file mode 100644 index 0000000..5ceebe5 --- /dev/null +++ b/piratebox/piratebox/www/jquery-ui.min.css @@ -0,0 +1,7 @@ +/*! jQuery UI - v1.11.4 - 2015-09-17 +* http://jqueryui.com +* Includes: core.css, tooltip.css, theme.css +* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-clearfix{min-height:0}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important}.ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px;-webkit-box-shadow:0 0 5px #aaa;box-shadow:0 0 5px #aaa}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Trebuchet MS,Tahoma,Verdana,Arial,sans-serif;font-size:1em}.ui-widget-content{border:1px solid #ddd;background:#eee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x;color:#333}.ui-widget-content a{color:#333}.ui-widget-header{border:1px solid #e78f08;background:#f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:1px solid #ccc;background:#f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#1c94c4}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited{color:#1c94c4;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{border:1px solid #fbcb09;background:#fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#c77405}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited{color:#c77405;text-decoration:none}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{border:1px solid #fbd850;background:#fff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eb8f00}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#eb8f00;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #fed22f;background:#ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x;color:#363636}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#363636}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #cd0a0a;background:#b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat;color:#fff}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#fff}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#fff}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-default .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-active .ui-icon{background-image:url("images/ui-icons_ef8c08_256x240.png")}.ui-state-highlight .ui-icon{background-image:url("images/ui-icons_228ef1_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_ffd27a_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-carat-1-n{background-position:0 0}.ui-icon-carat-1-ne{background-position:-16px 0}.ui-icon-carat-1-e{background-position:-32px 0}.ui-icon-carat-1-se{background-position:-48px 0}.ui-icon-carat-1-s{background-position:-64px 0}.ui-icon-carat-1-sw{background-position:-80px 0}.ui-icon-carat-1-w{background-position:-96px 0}.ui-icon-carat-1-nw{background-position:-112px 0}.ui-icon-carat-2-n-s{background-position:-128px 0}.ui-icon-carat-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-64px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-64px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:0 -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:4px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:4px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:4px}.ui-widget-overlay{background:#666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat;opacity:.5;filter:Alpha(Opacity=50)}.ui-widget-shadow{margin:-5px 0 0 -5px;padding:5px;background:#000 url("images/ui-bg_flat_10_000000_40x100.png") 50% 50% repeat-x;opacity:.2;filter:Alpha(Opacity=20);border-radius:5px} \ No newline at end of file diff --git a/piratebox/piratebox/www/jquery-ui.min.js b/piratebox/piratebox/www/jquery-ui.min.js new file mode 100644 index 0000000..98783ec --- /dev/null +++ b/piratebox/piratebox/www/jquery-ui.min.js @@ -0,0 +1,6 @@ +/*! jQuery UI - v1.11.4 - 2015-09-17 +* http://jqueryui.com +* Includes: core.js, widget.js, position.js, tooltip.js +* Copyright 2015 jQuery Foundation and other contributors; Licensed MIT */ + +(function(e){"function"==typeof define&&define.amd?define(["jquery"],e):e(jQuery)})(function(e){function t(t,s){var n,a,o,r=t.nodeName.toLowerCase();return"area"===r?(n=t.parentNode,a=n.name,t.href&&a&&"map"===n.nodeName.toLowerCase()?(o=e("img[usemap='#"+a+"']")[0],!!o&&i(o)):!1):(/^(input|select|textarea|button|object)$/.test(r)?!t.disabled:"a"===r?t.href||s:s)&&i(t)}function i(t){return e.expr.filters.visible(t)&&!e(t).parents().addBack().filter(function(){return"hidden"===e.css(this,"visibility")}).length}e.ui=e.ui||{},e.extend(e.ui,{version:"1.11.4",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({scrollParent:function(t){var i=this.css("position"),s="absolute"===i,n=t?/(auto|scroll|hidden)/:/(auto|scroll)/,a=this.parents().filter(function(){var t=e(this);return s&&"static"===t.css("position")?!1:n.test(t.css("overflow")+t.css("overflow-y")+t.css("overflow-x"))}).eq(0);return"fixed"!==i&&a.length?a:e(this[0].ownerDocument||document)},uniqueId:function(){var e=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++e)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&e(this).removeAttr("id")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(i){return!!e.data(i,t)}}):function(t,i,s){return!!e.data(t,s[3])},focusable:function(i){return t(i,!isNaN(e.attr(i,"tabindex")))},tabbable:function(i){var s=e.attr(i,"tabindex"),n=isNaN(s);return(n||s>=0)&&t(i,!n)}}),e("").outerWidth(1).jquery||e.each(["Width","Height"],function(t,i){function s(t,i,s,a){return e.each(n,function(){i-=parseFloat(e.css(t,"padding"+this))||0,s&&(i-=parseFloat(e.css(t,"border"+this+"Width"))||0),a&&(i-=parseFloat(e.css(t,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],a=i.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+i]=function(t){return void 0===t?o["inner"+i].call(this):this.each(function(){e(this).css(a,s(this,t)+"px")})},e.fn["outer"+i]=function(t,n){return"number"!=typeof t?o["outer"+i].call(this,t):this.each(function(){e(this).css(a,s(this,t,!0,n)+"px")})}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e("").data("a-b","a").removeData("a-b").data("a-b")&&(e.fn.removeData=function(t){return function(i){return arguments.length?t.call(this,e.camelCase(i)):t.call(this)}}(e.fn.removeData)),e.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase()),e.fn.extend({focus:function(t){return function(i,s){return"number"==typeof i?this.each(function(){var t=this;setTimeout(function(){e(t).focus(),s&&s.call(t)},i)}):t.apply(this,arguments)}}(e.fn.focus),disableSelection:function(){var e="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.bind(e+".ui-disableSelection",function(e){e.preventDefault()})}}(),enableSelection:function(){return this.unbind(".ui-disableSelection")},zIndex:function(t){if(void 0!==t)return this.css("zIndex",t);if(this.length)for(var i,s,n=e(this[0]);n.length&&n[0]!==document;){if(i=n.css("position"),("absolute"===i||"relative"===i||"fixed"===i)&&(s=parseInt(n.css("zIndex"),10),!isNaN(s)&&0!==s))return s;n=n.parent()}return 0}}),e.ui.plugin={add:function(t,i,s){var n,a=e.ui[t].prototype;for(n in s)a.plugins[n]=a.plugins[n]||[],a.plugins[n].push([i,s[n]])},call:function(e,t,i,s){var n,a=e.plugins[t];if(a&&(s||e.element[0].parentNode&&11!==e.element[0].parentNode.nodeType))for(n=0;a.length>n;n++)e.options[a[n][0]]&&a[n][1].apply(e.element,i)}};var s=0,n=Array.prototype.slice;e.cleanData=function(t){return function(i){var s,n,a;for(a=0;null!=(n=i[a]);a++)try{s=e._data(n,"events"),s&&s.remove&&e(n).triggerHandler("remove")}catch(o){}t(i)}}(e.cleanData),e.widget=function(t,i,s){var n,a,o,r,h={},l=t.split(".")[0];return t=t.split(".")[1],n=l+"-"+t,s||(s=i,i=e.Widget),e.expr[":"][n.toLowerCase()]=function(t){return!!e.data(t,n)},e[l]=e[l]||{},a=e[l][t],o=e[l][t]=function(e,t){return this._createWidget?(arguments.length&&this._createWidget(e,t),void 0):new o(e,t)},e.extend(o,a,{version:s.version,_proto:e.extend({},s),_childConstructors:[]}),r=new i,r.options=e.widget.extend({},r.options),e.each(s,function(t,s){return e.isFunction(s)?(h[t]=function(){var e=function(){return i.prototype[t].apply(this,arguments)},n=function(e){return i.prototype[t].apply(this,e)};return function(){var t,i=this._super,a=this._superApply;return this._super=e,this._superApply=n,t=s.apply(this,arguments),this._super=i,this._superApply=a,t}}(),void 0):(h[t]=s,void 0)}),o.prototype=e.widget.extend(r,{widgetEventPrefix:a?r.widgetEventPrefix||t:t},h,{constructor:o,namespace:l,widgetName:t,widgetFullName:n}),a?(e.each(a._childConstructors,function(t,i){var s=i.prototype;e.widget(s.namespace+"."+s.widgetName,o,i._proto)}),delete a._childConstructors):i._childConstructors.push(o),e.widget.bridge(t,o),o},e.widget.extend=function(t){for(var i,s,a=n.call(arguments,1),o=0,r=a.length;r>o;o++)for(i in a[o])s=a[o][i],a[o].hasOwnProperty(i)&&void 0!==s&&(t[i]=e.isPlainObject(s)?e.isPlainObject(t[i])?e.widget.extend({},t[i],s):e.widget.extend({},s):s);return t},e.widget.bridge=function(t,i){var s=i.prototype.widgetFullName||t;e.fn[t]=function(a){var o="string"==typeof a,r=n.call(arguments,1),h=this;return o?this.each(function(){var i,n=e.data(this,s);return"instance"===a?(h=n,!1):n?e.isFunction(n[a])&&"_"!==a.charAt(0)?(i=n[a].apply(n,r),i!==n&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):e.error("no such method '"+a+"' for "+t+" widget instance"):e.error("cannot call methods on "+t+" prior to initialization; "+"attempted to call method '"+a+"'")}):(r.length&&(a=e.widget.extend.apply(null,[a].concat(r))),this.each(function(){var t=e.data(this,s);t?(t.option(a||{}),t._init&&t._init()):e.data(this,s,new i(a,this))})),h}},e.Widget=function(){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{disabled:!1,create:null},_createWidget:function(t,i){i=e(i||this.defaultElement||this)[0],this.element=e(i),this.uuid=s++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=e(),this.hoverable=e(),this.focusable=e(),i!==this&&(e.data(i,this.widgetFullName,this),this._on(!0,this.element,{remove:function(e){e.target===i&&this.destroy()}}),this.document=e(i.style?i.ownerDocument:i.document||i),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(t,i){var s,n,a,o=t;if(0===arguments.length)return e.widget.extend({},this.options);if("string"==typeof t)if(o={},s=t.split("."),t=s.shift(),s.length){for(n=o[t]=e.widget.extend({},this.options[t]),a=0;s.length-1>a;a++)n[s[a]]=n[s[a]]||{},n=n[s[a]];if(t=s.pop(),1===arguments.length)return void 0===n[t]?null:n[t];n[t]=i}else{if(1===arguments.length)return void 0===this.options[t]?null:this.options[t];o[t]=i}return this._setOptions(o),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,"disabled"===e&&(this.widget().toggleClass(this.widgetFullName+"-disabled",!!t),t&&(this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus"))),this},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_on:function(t,i,s){var n,a=this;"boolean"!=typeof t&&(s=i,i=t,t=!1),s?(i=n=e(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),e.each(s,function(s,o){function r(){return t||a.options.disabled!==!0&&!e(this).hasClass("ui-state-disabled")?("string"==typeof o?a[o]:o).apply(a,arguments):void 0}"string"!=typeof o&&(r.guid=o.guid=o.guid||r.guid||e.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+a.eventNamespace,u=h[2];u?n.delegate(u,l,r):i.bind(l,r)})},_off:function(t,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,t.unbind(i).undelegate(i),this.bindings=e(this.bindings.not(t).get()),this.focusable=e(this.focusable.not(t).get()),this.hoverable=e(this.hoverable.not(t).get())},_delay:function(e,t){function i(){return("string"==typeof e?s[e]:e).apply(s,arguments)}var s=this;return setTimeout(i,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,i,s){var n,a,o=this.options[t];if(s=s||{},i=e.Event(i),i.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),i.target=this.element[0],a=i.originalEvent)for(n in a)n in i||(i[n]=a[n]);return this.element.trigger(i,s),!(e.isFunction(o)&&o.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,i){e.Widget.prototype["_"+t]=function(s,n,a){"string"==typeof n&&(n={effect:n});var o,r=n?n===!0||"number"==typeof n?i:n.effect||i:t;n=n||{},"number"==typeof n&&(n={duration:n}),o=!e.isEmptyObject(n),n.complete=a,n.delay&&s.delay(n.delay),o&&e.effects&&e.effects.effect[r]?s[t](n):r!==t&&s[r]?s[r](n.duration,n.easing,a):s.queue(function(i){e(this)[t](),a&&a.call(s[0]),i()})}}),e.widget,function(){function t(e,t,i){return[parseFloat(e[0])*(p.test(e[0])?t/100:1),parseFloat(e[1])*(p.test(e[1])?i/100:1)]}function i(t,i){return parseInt(e.css(t,i),10)||0}function s(t){var i=t[0];return 9===i.nodeType?{width:t.width(),height:t.height(),offset:{top:0,left:0}}:e.isWindow(i)?{width:t.width(),height:t.height(),offset:{top:t.scrollTop(),left:t.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:t.outerWidth(),height:t.outerHeight(),offset:t.offset()}}e.ui=e.ui||{};var n,a,o=Math.max,r=Math.abs,h=Math.round,l=/left|center|right/,u=/top|center|bottom/,d=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,p=/%$/,f=e.fn.position;e.position={scrollbarWidth:function(){if(void 0!==n)return n;var t,i,s=e("
"),a=s.children()[0];return e("body").append(s),t=a.offsetWidth,s.css("overflow","scroll"),i=a.offsetWidth,t===i&&(i=s[0].clientWidth),s.remove(),n=t-i},getScrollInfo:function(t){var i=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),s=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),n="scroll"===i||"auto"===i&&t.widthi?"left":t>0?"right":"center",vertical:0>a?"top":s>0?"bottom":"middle"};d>m&&m>r(t+i)&&(h.horizontal="center"),c>g&&g>r(s+a)&&(h.vertical="middle"),h.important=o(r(t),r(i))>o(r(s),r(a))?"horizontal":"vertical",n.using.call(this,e,h)}),u.offset(e.extend(N,{using:l}))})},e.ui.position={fit:{left:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=e.left-t.collisionPosition.marginLeft,h=n-r,l=r+t.collisionWidth-a-n;t.collisionWidth>a?h>0&&0>=l?(i=e.left+h+t.collisionWidth-a-n,e.left+=h-i):e.left=l>0&&0>=h?n:h>l?n+a-t.collisionWidth:n:h>0?e.left+=h:l>0?e.left-=l:e.left=o(e.left-r,e.left)},top:function(e,t){var i,s=t.within,n=s.isWindow?s.scrollTop:s.offset.top,a=t.within.height,r=e.top-t.collisionPosition.marginTop,h=n-r,l=r+t.collisionHeight-a-n;t.collisionHeight>a?h>0&&0>=l?(i=e.top+h+t.collisionHeight-a-n,e.top+=h-i):e.top=l>0&&0>=h?n:h>l?n+a-t.collisionHeight:n:h>0?e.top+=h:l>0?e.top-=l:e.top=o(e.top-r,e.top)}},flip:{left:function(e,t){var i,s,n=t.within,a=n.offset.left+n.scrollLeft,o=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=e.left-t.collisionPosition.marginLeft,u=l-h,d=l+t.collisionWidth-o-h,c="left"===t.my[0]?-t.elemWidth:"right"===t.my[0]?t.elemWidth:0,p="left"===t.at[0]?t.targetWidth:"right"===t.at[0]?-t.targetWidth:0,f=-2*t.offset[0];0>u?(i=e.left+c+p+f+t.collisionWidth-o-a,(0>i||r(u)>i)&&(e.left+=c+p+f)):d>0&&(s=e.left-t.collisionPosition.marginLeft+c+p+f-h,(s>0||d>r(s))&&(e.left+=c+p+f))},top:function(e,t){var i,s,n=t.within,a=n.offset.top+n.scrollTop,o=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=e.top-t.collisionPosition.marginTop,u=l-h,d=l+t.collisionHeight-o-h,c="top"===t.my[1],p=c?-t.elemHeight:"bottom"===t.my[1]?t.elemHeight:0,f="top"===t.at[1]?t.targetHeight:"bottom"===t.at[1]?-t.targetHeight:0,m=-2*t.offset[1];0>u?(s=e.top+p+f+m+t.collisionHeight-o-a,(0>s||r(u)>s)&&(e.top+=p+f+m)):d>0&&(i=e.top-t.collisionPosition.marginTop+p+f+m-h,(i>0||d>r(i))&&(e.top+=p+f+m))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,i,s,n,o,r=document.getElementsByTagName("body")[0],h=document.createElement("div");t=document.createElement(r?"div":"body"),s={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},r&&e.extend(s,{position:"absolute",left:"-1000px",top:"-1000px"});for(o in s)t.style[o]=s[o];t.appendChild(h),i=r||document.documentElement,i.insertBefore(t,i.firstChild),h.style.cssText="position: absolute; left: 10.7432222px;",n=e(h).offset().left,a=n>10&&11>n,t.innerHTML="",i.removeChild(t)}()}(),e.ui.position,e.widget("ui.tooltip",{version:"1.11.4",options:{content:function(){var t=e(this).attr("title")||"";return e("
").text(t).html()},hide:!0,items:"[title]:not([disabled])",position:{my:"left top+15",at:"left bottom",collision:"flipfit flip"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_addDescribedBy:function(t,i){var s=(t.attr("aria-describedby")||"").split(/\s+/);s.push(i),t.data("ui-tooltip-id",i).attr("aria-describedby",e.trim(s.join(" ")))},_removeDescribedBy:function(t){var i=t.data("ui-tooltip-id"),s=(t.attr("aria-describedby")||"").split(/\s+/),n=e.inArray(i,s);-1!==n&&s.splice(n,1),t.removeData("ui-tooltip-id"),s=e.trim(s.join(" ")),s?t.attr("aria-describedby",s):t.removeAttr("aria-describedby")},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={},this.parents={},this.options.disabled&&this._disable(),this.liveRegion=e("
").attr({role:"log","aria-live":"assertive","aria-relevant":"additions"}).addClass("ui-helper-hidden-accessible").appendTo(this.document[0].body)},_setOption:function(t,i){var s=this;return"disabled"===t?(this[i?"_disable":"_enable"](),this.options[t]=i,void 0):(this._super(t,i),"content"===t&&e.each(this.tooltips,function(e,t){s._updateContent(t.element)}),void 0)},_disable:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur");n.target=n.currentTarget=s.element[0],t.close(n,!0)}),this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).removeAttr("title")})},_enable:function(){this.element.find(this.options.items).addBack().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var i=this,s=e(t?t.target:this.element).closest(this.options.items);s.length&&!s.data("ui-tooltip-id")&&(s.attr("title")&&s.data("ui-tooltip-title",s.attr("title")),s.data("ui-tooltip-open",!0),t&&"mouseover"===t.type&&s.parents().each(function(){var t,s=e(this);s.data("ui-tooltip-open")&&(t=e.Event("blur"),t.target=t.currentTarget=this,i.close(t,!0)),s.attr("title")&&(s.uniqueId(),i.parents[this.id]={element:this,title:s.attr("title")},s.attr("title",""))}),this._registerCloseHandlers(t,s),this._updateContent(s,t))},_updateContent:function(e,t){var i,s=this.options.content,n=this,a=t?t.type:null;return"string"==typeof s?this._open(t,e,s):(i=s.call(e[0],function(i){n._delay(function(){e.data("ui-tooltip-open")&&(t&&(t.type=a),this._open(t,e,i))})}),i&&this._open(t,e,i),void 0)},_open:function(t,i,s){function n(e){l.of=e,o.is(":hidden")||o.position(l)}var a,o,r,h,l=e.extend({},this.options.position);if(s){if(a=this._find(i))return a.tooltip.find(".ui-tooltip-content").html(s),void 0;i.is("[title]")&&(t&&"mouseover"===t.type?i.attr("title",""):i.removeAttr("title")),a=this._tooltip(i),o=a.tooltip,this._addDescribedBy(i,o.attr("id")),o.find(".ui-tooltip-content").html(s),this.liveRegion.children().hide(),s.clone?(h=s.clone(),h.removeAttr("id").find("[id]").removeAttr("id")):h=s,e("
").html(h).appendTo(this.liveRegion),this.options.track&&t&&/^mouse/.test(t.type)?(this._on(this.document,{mousemove:n}),n(t)):o.position(e.extend({of:i},this.options.position)),o.hide(),this._show(o,this.options.show),this.options.show&&this.options.show.delay&&(r=this.delayedShow=setInterval(function(){o.is(":visible")&&(n(l.of),clearInterval(r))},e.fx.interval)),this._trigger("open",t,{tooltip:o})}},_registerCloseHandlers:function(t,i){var s={keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var s=e.Event(t);s.currentTarget=i[0],this.close(s,!0)}}};i[0]!==this.element[0]&&(s.remove=function(){this._removeTooltip(this._find(i).tooltip)}),t&&"mouseover"!==t.type||(s.mouseleave="close"),t&&"focusin"!==t.type||(s.focusout="close"),this._on(!0,i,s)},close:function(t){var i,s=this,n=e(t?t.currentTarget:this.element),a=this._find(n);return a?(i=a.tooltip,a.closing||(clearInterval(this.delayedShow),n.data("ui-tooltip-title")&&!n.attr("title")&&n.attr("title",n.data("ui-tooltip-title")),this._removeDescribedBy(n),a.hiding=!0,i.stop(!0),this._hide(i,this.options.hide,function(){s._removeTooltip(e(this))}),n.removeData("ui-tooltip-open"),this._off(n,"mouseleave focusout keyup"),n[0]!==this.element[0]&&this._off(n,"remove"),this._off(this.document,"mousemove"),t&&"mouseleave"===t.type&&e.each(this.parents,function(t,i){e(i.element).attr("title",i.title),delete s.parents[t]}),a.closing=!0,this._trigger("close",t,{tooltip:i}),a.hiding||(a.closing=!1)),void 0):(n.removeData("ui-tooltip-open"),void 0)},_tooltip:function(t){var i=e("
").attr("role","tooltip").addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||"")),s=i.uniqueId().attr("id");return e("
").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),this.tooltips[s]={element:t,tooltip:i}},_find:function(e){var t=e.data("ui-tooltip-id");return t?this.tooltips[t]:null},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var n=e.Event("blur"),a=s.element;n.target=n.currentTarget=a[0],t.close(n,!0),e("#"+i).remove(),a.data("ui-tooltip-title")&&(a.attr("title")||a.attr("title",a.data("ui-tooltip-title")),a.removeData("ui-tooltip-title"))}),this.liveRegion.remove()}})}); \ No newline at end of file diff --git a/piratebox/piratebox/www/scripts.js b/piratebox/piratebox/www/scripts.js index 92e1216..5f60bc2 100755 --- a/piratebox/piratebox/www/scripts.js +++ b/piratebox/piratebox/www/scripts.js @@ -13,8 +13,18 @@ $(document).ready(function() { post_shoutbox(); }); + $("#du_form").submit(function(event) { + /* stop form from submitting normally */ + event.preventDefault(); + post_diskusage(); + }); + + display_diskusage(); display_shoutbox(); + // Add Tooltips + $('#du_form_button').tooltip(); + // Spin menu icon and toggle nav $('#menu-icon').click(function() { $(this).toggleClass('rotate'); @@ -105,11 +115,16 @@ function refresh_time_sb () { } function post_shoutbox () { - $.post("/cgi-bin/psowrte.py" , $("#sb_form").serialize()) - .success(function() { - refresh_shoutbox(); - }); - $('#shoutbox-input .message').val(''); + $("#send-button").prop('value', 'Sending...'); + $("#send-button").prop('disabled', true); + + $.post("/cgi-bin/psowrte.py" , $("#sb_form").serialize()) + .success(function() { + refresh_shoutbox(); + $("#send-button").prop('value', 'Send') + $("#send-button").prop('disabled', false); + }); + $('#shoutbox-input .message').val(''); } function display_shoutbox() { @@ -117,6 +132,37 @@ function display_shoutbox() { refresh_time_sb(); } +function refresh_diskusage() { + $.get('diskusage.html', function(data) { + $('div#diskusage').html(data); + }); +} + +function refresh_time_du () { + // Refresh rate in milli seconds + mytimedu=setTimeout('display_diskusage()', 10000); +} + +function post_diskusage() { + $("#du_form_button").prop('value', 'Refreshing...'); + $("#du_form_button").prop('disabled', true); + + $.post("/cgi-bin/diskwrite.py") + .success(function() { + refresh_diskusage(); + $("#du_form_button").prop('value', 'Refresh'); + $("#du_form_button").prop('disabled', false); + }); + $('#diskusage-input .message').val(''); + + +} + +function display_diskusage() { + refresh_diskusage(); + refresh_time_du(); +} + function fnGetDomain(url) { return url.match(/:\/\/(.[^/]+)/)[1]; } diff --git a/piratebox/piratebox/www/style.css b/piratebox/piratebox/www/style.css index cef92ac..ccdec0c 100644 --- a/piratebox/piratebox/www/style.css +++ b/piratebox/piratebox/www/style.css @@ -352,3 +352,31 @@ input[type=radio] { display: table-cell; } } + +/* +Progress bar used from the Bootstrap Library: +https://github.com/twbs/bootstrap + +Licensed under the MIT license. +*/ + +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #F5F5F5; + border-radius: 4px; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; +} + +.progress-bar { + float: left; + width: 0px; + font-size: 12px; + line-height: 20px; + color: #FFF; + text-align: center; + background-color: #337AB7; + box-shadow: 0px -1px 0px rgba(0, 0, 0, 0.15) inset; + transition: width 0.6s ease 0s; +}