Организация сервиса для обмена скриншотами

()

Для создания и обмена снимками экрана часто используется сервис Clip2Net или подобный ему. Часто даже большие серьёзные организации используют публичные сервисы для такого обмена скриншотами. Однако что делать если на скриншотах может быть какая-то секретная информация, которая не должна выходить за пределы организации? В этом случае имеет смысл организовать свой собственный сервис скриншотов, доступный только внутри организации.

Озвучим основую идею работы сервиса: небольшое приложение, установленное на клиентский компьютер, должно позволить пользователю выделить произвольную область на экране, сделать скриншот этой области, в случае необходимости - позволить отредактировать его, затем закачать на веб-сервер и в конце-концов получить ссылку на изображение для передачи коллегам.

Что у нас есть:

  • Локальный LAMP-сервер под управлением Ubuntu Server 10.10;
  • На всех клиентских машинах в организации используется Ubuntu 10.10

Для начала создам на сервере виртуальный хост "shots", корнем которого будет директория "/var/www/shots". В этой директории создадим файл "upload.php" следующего содержания:

<?php
$base_url = 'http://shots/';


print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print "<result>\n";


// Если получен файл
if (isset($_FILES['file'])) {
        // Получаем временную метку
        $current_timestamp = time();
        // Конвертируем её в 36-разрядную систему счисления
        $current_timestamp_36 = base_convert($current_timestamp, 10, 36);

        // Вычисляем директорию для заливки
        $dir_name = 'data/' . substr($current_timestamp_36 , 0, 2) . '/' . $current_timestamp_36;

        // Создаём директорию
        @mkdir($dir_name, 0777, TRUE);

        // Вычисляем имя файла
        $target_path = $dir_name . '/' . basename($_FILES['file']['name']);

        // пытаемся переместить
        if(@move_uploaded_file($_FILES['file']['tmp_name'], $target_path)) {
                // Формируем ссылку
                $link = $base_url . $dir_name . '/' . rawurlencode(basename($_FILES['file']['name']));
                print "<weburl>".htmlspecialchars($link)."</weburl>\n";
        }
        else {
                print "<error>Some troubles when processing file...</error>\n";
        }
}
// Если же файл загружен не был
else {
        print "<error>No file uploaded!</error>\n";
}

Все картинки будут сохранены в поддиректории "data" и поэтому у скрипта должна быть возможность записи в эту директорию:

mkdir -p data && chmod 777 data

Поскольку скрипт позволяет закачивать на сервер не только картинки, но и любые другие файлы на всякий случай запретим выполнение скриптов. Для этого создадим файл "data/.htaccess" следующего содержания:

php_flag engine off

Для тестирования создадим на сервере файл "index.html":

<html>
<head>
<title>File Storage</title>
</head>
<body>
<form action="./upload.php" method="post" enctype="multipart/form-data">
        <input type="hidden" name="MAX_FILE_SIZE" value="1024000">
        <input type="file" name="file" id="file">
        <input type="submit" name="submit" value="Upload">
</form>
</body>
</html>

Убедившись что через форму на сайте файлы успешно загружаются на сервер перейдём к настройке клиетских машин. Первым делом установим на все машины необходимое ПО:

sudo apt-get install zenity scrot mtpaint

Затем создадим скрипт /usr/local/scripts/upload_to_shots.sh:

#!/bin/sh

# Базовый урл
HTTP_UPLOAD_PATH="http://shots/upload.php"

# Имя временного файла
FILENAME=/tmp/`date +%s | md5sum | awk '{print $1;}'`.png

# Получаем изображение
scrot -s ${FILENAME}

# Если изображение не было получено
if [ ! -e ${FILENAME} ]; then
        # Завершаем работу
        exit 1
fi

# Открываем изображение в редакторе
mtpaint ${FILENAME}

# Задаём вопрос перед закачкой
zenity --question --text='Upload this image to Shots?' --title='Shots'

# Заливаем изображение
if [ $? -eq 0 ]; then
        # Получаем данные с сервера
        DATA=`curl -0 -s -F "file=@${FILENAME}" ${HTTP_UPLOAD_PATH} -o - | grep -P '<weburl>|<error>'`
        
        # Если произошла ошибка
        if [ `echo $DATA | grep '<error>' | wc -l` -gt 0 ]; then
                MSG=`echo $DATA | sed -r 's/<\/?error>//g'`
                # Показываем сообщение об ошибке
                zenity --error --text="${MSG}"
        else
                MSG=`echo $DATA | sed -r 's/<\/?weburl>//g'`
                # Показываем ссылку на изображение
                echo $MSG | zenity --text-info --title='Shots'
        fi
fi

# Удаляем временный файл
rm -f ${FILENAME}

Остаётся только создать кнопку на панели для запуска скрипта. Работа скрипта продемонстрирована на видео:

Если по какой-то причине видео у вас не отобразилось или отобразилось не правильно, то вы можете скачать его в формате WebM.

На этом всё. Приятной работы!

Ключевые слова: zenity, mtpaint, curl, scrot, clip2net, программирование, bash, php.

Комментарии:

Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE