HEX
Server: Apache/2.2.34 (Unix) mod_fastcgi/mod_fastcgi-SNAP-0910052141
System: Linux Kou-Etsu-Dou 4.4.59+ #25556 SMP PREEMPT Thu Mar 4 18:03:46 CST 2021 x86_64
User: hosam (1026)
PHP: 7.2.29
Disabled: NONE
Upload Files
File: //usr/syno/etc/rc.sysv/synologd.sh
#!/bin/sh

SYNOLOGD="/usr/syno/bin/synologd"
PID_FILE="/var/run/synologd.pid"
PGUPGRADE_FLAG="/tmp/.UpgradePGSQLDatabase"
SQLITE="/bin/sqlite3"

get_pid()
{
    if [ ! -f ${PID_FILE} ]; then
        echo "${PID_FILE} not found. Not running?"
        return 1
    else
        pid=`cat ${PID_FILE} 2>/dev/null`
        if [ -f /proc/$pid/cmdline ]; then
            echo $pid
            return 0
        else
            rm -f ${PID_FILE}
            echo "${PID_FILE} is found, but not running?"
            return 1
        fi
    fi
}

FuncCheckDB()
{
    if [ -e $PGUPGRADE_FLAG ] || ! pidof postgres; then
        echo "PGSQL is not available"
        exit 1;
    fi

    echo "Checking synolog database existence..."
    su postgres -c "/usr/bin/psql synolog -c \"SELECT 1 FROM ftpxfer LIMIT 1\" > /dev/null"
    Ret=$?
    if [ $Ret = 2 ]; then
        echo "Creating synolog database..."
        su postgres -c "/usr/bin/createdb synolog"
        if [ $? != 0 ]; then
            echo "Failed to create database"
            exit 1
        fi
        Ret=1
    fi

    if [ $Ret = 1 ]; then
        echo "Creating synolog tables..."
        su postgres -c "/usr/bin/psql synolog -f /usr/syno/synologd/sql/synolog.pgsql"
        if [ $? != 0 ]; then
            echo "Failed to create tables in synolog database"
            exit 1
        fi
    elif [ $Ret = 0 ]; then
        upgrades=`find /usr/syno/synologd/sql/upgrade -name "*.sh" | sort`
        for ThisArg in $upgrades;
        do
            $ThisArg
        done
    else
        echo "Unknown error"
        exit 1
    fi

    return 0
}

FuncDropWebfmTable()
{
    echo "Drop TABLE webfmxfer ..."
    su postgres -c "/usr/bin/psql synolog -c \"SELECT 1 FROM webfmxfer LIMIT 1\" > /dev/null"
    if [ $? = 0 ]; then
        su postgres -c "/usr/bin/psql synolog -c \"INSERT INTO dsmfmxfer SELECT * FROM webfmxfer\" > /dev/null"
        if [ $? != 0 ]; then
            echo "Fail to SELECT * INTO dsmfmxfer FROM webfmxfer"
        fi
        su postgres -c "/usr/bin/psql synolog -c \"DROP TABLE webfmxfer\" > /dev/null"
        if [ $? != 0 ]; then
            echo "Failed to DROP TABLE webfmxfer"
        fi
    fi
}

FuncCheckIfNeedRun()
{
    echo "Checking if need to run synologd..."
    /usr/syno/sbin/synoservice --is-enabled ftpd
    RunFTP=$?
    /usr/syno/sbin/synoservice --is-enabled ftpd-ssl
    RunFTPS=$?
    /usr/syno/sbin/synoservice --is-enabled sftp
    RunSFTP=$?
    /usr/syno/sbin/synoservice --is-enabled tftp
    RunTFTP=$?
    LogFTP=`/bin/get_key_value /etc/synoinfo.conf ftpxferlog`
    LogTFTP=`/bin/get_key_value /etc/synoinfo.conf tftpxferlog`
    LogDSMFM=`/bin/get_key_value /etc/synoinfo.conf filebrowserxferlog`
    RunWEBDAV=`/bin/get_key_value /var/packages/WebDAVServer/target/etc/webdav.cfg enable_http`
    RunWEBDAVS=`/bin/get_key_value /var/packages/WebDAVServer/target/etc/webdav.cfg enable_https`
    LogWEBDAV=`/bin/get_key_value /etc/synoinfo.conf webdavxferlog`
    /usr/syno/sbin/synoservice --is-enabled samba
    RunSMB=$?
    LogSMB=`/bin/get_key_value /etc/synoinfo.conf smbxferlog`
    /usr/syno/sbin/synoservice --is-enabled atalk
    RunAFP=$?
    LogAFP=`/bin/get_key_value /etc/synoinfo.conf afpxferlog`

    if [  "$RunFTP" -eq 1 -o "$RunFTPS" -eq 1 -o "$RunSFTP" -eq 1 ] && [ "yes" = "$LogFTP" ]; then
        return 0
    elif [ "$RunTFTP" -eq 1 ] && [ "yes" = "$LogTFTP" ]; then
        return 0
    elif [ "yes" = "$LogDSMFM" ]; then
        return 0
    elif [ "$RunSMB" -eq 1 ] && [ "yes" = "$LogSMB" ]; then
        return 0
    elif [ "$RunAFP" -eq 1 ] && [ "yes" = "$LogAFP" ]; then
        return 0
    elif [ "yes" == "$RunWEBDAV" -o "yes" == "$RunWEBDAVS" ] && [ "yes" = "$LogWEBDAV" ]; then
        return 0
    fi
    echo "No need to start synologd..."
    return 1
}

ConvertXferLogToSqlite()
{
    PGDUMP="/bin/pg_dump"
    PGSQL="/bin/psql"
    SYNOLOG_FOLDER="/var/log/synolog"
    ALIVE_VOLUME="$(/usr/syno/bin/servicetool --get-first-alive-volume)"
    XFERLOG_FOLDER="$ALIVE_VOLUME/@database/synolog"
    TYPES="ftpxfer dsmfmxfer webdavxfer smbxfer afpxfer tftpxfer"

    if [ -e $PGUPGRADE_FLAG ] || ! pidof postgres > /dev/null; then
        echo "PGSQL is not available"
        exit 1;
    fi

    if [ "${ALIVE_VOLUME:0:7}" != "/volume" ]; then
        echo "No available volume"
        return 1
    fi

    mkdir -p "$XFERLOG_FOLDER"
    chown -R system:log "$XFERLOG_FOLDER"

    for TYPE in $TYPES; do
        case $TYPE in
            ftpxfer)
                DBPATH="$XFERLOG_FOLDER/.FTPXFERDB"
                ;;
            dsmfmxfer)
                DBPATH="$XFERLOG_FOLDER/.DSMFMXFERDB"
                ;;
            webdavxfer)
                DBPATH="$XFERLOG_FOLDER/.WEBDAVXFERDB"
                ;;
            smbxfer)
                DBPATH="$XFERLOG_FOLDER/.SMBXFERDB"
                ;;
            afpxfer)
                DBPATH="$XFERLOG_FOLDER/.AFPXFERDB"
                ;;
            tftpxfer)
                DBPATH="$XFERLOG_FOLDER/.TFTPXFERDB"
                ;;
            *)
                echo "Unsupported type."
                exit 1
                ;;
        esac

        # init sqlite db
        if [ ! -f "$DBPATH" ]; then
            CREATE_TABLE="CREATE TABLE logs (
                id integer primary key,
                time int default NULL,
                ip text default NULL,
                username text default NULL,
                cmd text default NULL,
                filesize int default NULL,
                filename text default NULL,
                isdir integer default 0);"
            if ! $SQLITE $DBPATH "$CREATE_TABLE"; then
                echo "Create DB \"$TYPE\" failed."
                continue
            fi
            /bin/chown system:log $DBPATH
            /bin/chmod 660 $DBPATH
        fi

        # link db to /var/log/synolog
        ln -sf "$DBPATH" "$SYNOLOG_FOLDER/$db"

        # check table exist
        $PGSQL -U postgres synolog -c "\\dt" | grep -o " $TYPE " > /dev/null 2>&1 || continue

        # dump xferlog
        DUMP_SQL="/var/tmp/${TYPE}.sql"
        if ! $PGDUMP -U postgres --dbname=synolog --table=$TYPE --column-inserts --data-only | grep "INSERT" > $DUMP_SQL; then
            echo "Dump \"$TYPE\" failed."
            continue
        fi
        sed -i "s/INSERT INTO $TYPE/INSERT INTO logs/g; s/false/0/g; s/true/1/g" $DUMP_SQL
        sed -i '1i BEGIN TRANSACTION;' $DUMP_SQL
        sed -i "\$a COMMIT;" $DUMP_SQL

        if $SQLITE $DBPATH < $DUMP_SQL; then
            $PGSQL -U postgres synolog -c "DROP TABLE $TYPE" > /dev/null 2>&1
        else
            echo "Convert \"$TYPE\" to \"$DBPATH\" failed."
        fi
        rm -f $DUMP_SQL
    done
}

MoveXferLogToVolume()
{
    SYNOLOG_FOLDER="/var/log/synolog"

    if [ -L "$SYNOLOG_FOLDER/.SMBXFERDB" ]; then
        return 0
    fi

    XFERLOG_DBSIZE=$(du -d0 -m "$SYNOLOG_FOLDER" | awk '{print $1}')
    ALIVE_VOLUME="$(/usr/syno/bin/servicetool --get-alive-volume $XFERLOG_DBSIZE)"
    XFERLOG_FOLDER="$ALIVE_VOLUME/@database/synolog"
    XFERLOG_DBS=".AFPXFERDB .DSMFMXFERDB .FTPXFERDB .SMBXFERDB .TFTPXFERDB .WEBDAVXFERDB"

    if [ "${ALIVE_VOLUME:0:7}" != "/volume" ]; then
        echo "No available volume"
        return 1
    fi

    mkdir -p "$XFERLOG_FOLDER"
    for db in $XFERLOG_DBS; do
        [ -f "$SYNOLOG_FOLDER/$db" ] || touch "$SYNOLOG_FOLDER/$db"
        mv "$SYNOLOG_FOLDER/$db" "$XFERLOG_FOLDER/$db"
        ln -sf "$XFERLOG_FOLDER/$db" "$SYNOLOG_FOLDER/$db"
    done
    chown -R system:log "$XFERLOG_FOLDER"
}

InitXferLogDatabase()
{
    SYNOLOG_FOLDER="/var/log/synolog"
    XFERLOG_DBS=".AFPXFERDB .DSMFMXFERDB .FTPXFERDB .SMBXFERDB .TFTPXFERDB .WEBDAVXFERDB"
    CREATE_TABLE="CREATE TABLE logs (
        id integer primary key,
        time int default NULL,
        ip text default NULL,
        username text default NULL,
        cmd text default NULL,
        filesize int default NULL,
        filename text default NULL,
        isdir integer default 0);"

    local REAL_DBPATH=
    for db in $XFERLOG_DBS; do
        if [ -L "$SYNOLOG_FOLDER/$db" ]; then
            REAL_DBPATH="$(realpath "$SYNOLOG_FOLDER/$db")"
            if ! [ -s "$REAL_DBPATH" ]; then
                $SQLITE "$REAL_DBPATH" "$CREATE_TABLE"
            else
                echo "$db was inited."
            fi
        else
            echo "Error occured. $db should be a symlink."
        fi
    done
}

case $1 in
check_if_need_run)
    FuncCheckIfNeedRun
    exit $?
    ;;
check_db)
    FuncCheckDB
    exit $?
    ;;
drop_webfm_table)
    FuncDropWebfmTable
    exit 0
    ;;
convert_xferlog)
    ConvertXferLogToSqlite
    exit 0
    ;;
move_xferlog)
    MoveXferLogToVolume
    exit $?
    ;;
init_xferlog_db)
    InitXferLogDatabase
    exit 0
    ;;
*)
    echo "Usage: $0 [check_if_need_run|check_db|drop_webfm_table|convert_xferlog|move_xferlog|init_xferlog_db]"
    exit 0
    ;;
esac