zoukankan      html  css  js  c++  java
  • Texas Instruments matrix-gui-2.0 hacking -- run_script.php

    <?php
    /*
     * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 
     * 
     * 
     *  Redistribution and use in source and binary forms, with or without 
     *  modification, are permitted provided that the following conditions 
     *  are met:
     *
     *    Redistributions of source code must retain the above copyright 
     *    notice, this list of conditions and the following disclaimer.
     *
     *    Redistributions in binary form must reproduce the above copyright
     *    notice, this list of conditions and the following disclaimer in the 
     *    documentation and/or other materials provided with the   
     *    distribution.
     *
     *    Neither the name of Texas Instruments Incorporated nor the names of
     *    its contributors may be used to endorse or promote products derived
     *    from this software without specific prior written permission.
     *
     *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
     *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
     *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
     *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
     *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
     *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
     *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
     *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     *
    */
    
    # 函数规定报告哪个错误,该函数设置当前脚本的错误报告级别
    # 该函数返回旧的错误报告级别
    error_reporting(E_ALL);
    
    # 加载那些需要的函数
    require("helper_functions.php");
    
    $i = 0;
    $lock_string = "";
    $currently_locked = false;
    
    $var = read_desktop_file();         # 加载json对象
    
    if($var==null)
    {
        echo "Json.txt file is empty or doesn't exist.";
        return;
    }
    
    $submenu = isset($_GET["submenu"]) == true ? $_GET["submenu"] : "main_menu" ;
    
    # $link =  "run_script.php?&submenu=".urlencode($submenu)."&app=".urlencode($app_title);
    # 获取对应的app
    $found_app = get_application($var,$submenu,$_GET["app"]);
    
    # 查看当前的json.txt文件,其中的Lock字段的内容都是-1
    # 所以这一部分的其中很多内容可以不分析
    $lock_list = $found_app["Lock"];
    
    //Verify that there is a lock specified for this application
    # 应用有锁
    if($lock_list != -1 )
    {
        //Convert the string into an array. 
        //This might be backwards*********CHECKOUT********
        # explode(): 把字符串分割为数组
        $lock_list_array = explode($lock_list," ");
    
        //Check if the lock list only has one lock. If so add to the array
        //Since index 0 will be empty
        if(count($lock_list_array) == 1)
            $lock_list_array[0] = $lock_list;
    
        //Check to see if any of the locks exist.
        for($x = 0;$x<count($lock_list_array);$x++)
        {
            # 这里貌似是锁文件,是否存在的意思
            if(file_exists ("lock/".$lock_list_array[$x])==true)
            {
                $currently_locked = true;
                break;
            }
        }
    }
    else
        $lock_list = "";        # 就当前的json.txt文件而言,都是采用这种方式
    
    if($currently_locked==false)
    {
        $script_link = $found_app["Exec"];
    
        # strval(): 用于获取变量对应的字符串值
        # rand(): 返回随机整数
        $random_string = strval(rand());
        $random_string .= strval(rand());
    
        # addslashes(): 在指定的预定义字符前添加反斜杠
        $script_command = "./execute_command.sh "".addslashes($script_link). "" ".$random_string.".txt ".$lock_list;
    
        # 获取系统执行结果最后一行
        # system()第二个参数:如果提供的return_var参数,则外部命令执行后的
        # 返回状态将会被设置到此变量中
        $last_line = system($script_command." > /dev/null 2>/dev/null & ", $retval);
    }
    
    # 菜单标题采用app的名字
    $menu_title = $found_app["Name"];
    ?>
    
    <!-- 这里需要区分web的程序还是gui程序 -->
    <!-- 这里是没有锁,并且是程序类型不是web,也就是说gui程序会走接下来的这种方式 -->
    <?php if($currently_locked==false && $found_app["ProgramType"]!="web"){ ?>
    <!-- 加入菜单 -->
    <?php include "menubar.php"; ?>
    <div id="container"></div>
    
    <script>
        <?php echo "var uri_link = "$random_string";"; ?>     // 仅仅是一个随机数
    
        var fail_count = 0;
    
        // 这个函数的主要功能好像是,获取app的输出内容显示到网页上来,
        // 但这个函数是有时间限制的,如果在规定的时间内不能获取到相应的数据,
        // 那么就会提示出错了
        function update()
        {
            //This is a fix for IE browsers. IE likes to cache Ajax results. Therefore, adding a random string will prevent the browser from caching the Ajax request. 
            // 防止浏览器缓存页面导致不访问web服务器
            var uri = "tmp/"+uri_link+".txt?rand="+Math.round((Math.random()*2356))+Math.round((Math.random()*4321))+Math.round((Math.random()*3961));
        
            $.get(uri, function(data) 
            {
                fail_count = 0;
                data = jQuery.trim(data);
       
                //The execute_command script adds the text "_?!!MATRIX_SCRIPT_COMPLETED!!?_" to the end of the file to mark that the command is done executing
                // 获取系统返回的数据,并查找字符串
                var script_complete = data.indexOf("_?!!MATRIX_SCRIPT_COMPLETED!!?_");
                if(script_complete != -1)
                {
                    //Just replace the end of file text to Script Complete which 
                    data = data.replace("_?!!MATRIX_SCRIPT_COMPLETED!!?_", "Script Complete");
                }
    
                <?php 
                    //GUI applications shouldn't have any output that needs to be displayed. Therefore, don't include the code that will update the HTML container
                    //with the program's output. This prevents some flickering problems that occur in some GUI applications even if the HTML container is being passed no information.
                    // GUI程序没有任何输出需要显示,所以不需要将程序输出显示出来,
                    // 这里主要是为了防止一些无输出的问题
                    if($found_app["ProgramType"]!="gui"){ ?>
                    $('#container').html("<pre>"+data+"</pre>");
                    $('#container').scrollTop(document.getElementById("container").scrollHeight);        
                <?php } ?>
    
                if(script_complete != -1)
                {
                    //Display the exit and back button.
                    $('#main_menu_link').removeClass("hide_link");
                    $('#back_link').removeClass("hide_link");
    
                    <?php if($found_app["ProgramType"]=="gui"){ ?>
                        $('#back_link').click();            // 这里为什么会需要自动点击返回?
                    <?php } ?>
                }
                else
                    setTimeout("update()",1000);
    
            })
            //If a file cant be read or some other error related to trying to retrieve this file then JQuery executes the error function.
            //This sometimes occurs when the browser tries to read the output file before output file is even created. 
            .error(function() 
            { 
                //This function will attempt to read the file 3 times with an increase delay for each attempt. If the file still hasn't 
                //been able to be read then an error is displayed and the Exit and Back Link is enabled.
    
                fail_count++;
                if(fail_count==3)
                {
                    $('#container').html("Failed to read output file");
                    $('#main_menu_link').removeClass("hide_link");
                    $('#back_link').removeClass("hide_link");
                }
                else
                {
                    //Every time it fails wait a signifcantly longer amount of time
                    setTimeout("update()",fail_count*1500);
                }
            });
    
        
        }
        
        //Wait 500ms before trying to read the application output
        // 从这里开始开始调用前面的update()函数
        setTimeout("update()",500);     
    </script>
    <?php }if($currently_locked==false && $found_app["ProgramType"]=="web"){ ?>
    <?php include "menubar.php"; ?>
    
    <script>
    $('#main_menu_link').removeClass("hide_link");
    $('#back_link').removeClass("hide_link");
    
    $("#menubar").outerHeight(true)
    $("#menubar").outerWidth(true)
    
    // 在后面给调用
    function scrollbarWidth() {
        var $inner = jQuery('<div style=" 100%; height:200px;">test</div>'),
            $outer = jQuery('<div style="200px;height:150px; position: absolute; top: 0; left: 0; visibility: hidden; overflow:hidden;"></div>').append($inner),
            inner = $inner[0],
            outer = $outer[0];
    
        jQuery('body').append(outer);
        var width1 = inner.offsetWidth;
        $outer.css('overflow', 'scroll');
        var width2 = outer.clientWidth;
        $outer.remove();
    
        return (width1 - width2);
    }
    
    $("#html5-frame").width($("#menubar").width()-scrollbarWidth());
    $("#html5-frame").height($(window).height() - $("#menubar").outerHeight(true)-scrollbarWidth())
    
    </script>
    <!-- 用一个框架来显示一些东西 -->
    <iframe id = "html5-frame" src = "<?php echo $found_app["Exec"]; ?>"scrolling = "auto" style = "padding:5px;">
    
    <!-- 就目前的json.txt文本内容而言,currently_locked一直都是等于false -->
    <?php }if($currently_locked==true){?>
    <?php include "menubar.php"; ?>
    This program can't run since a program is already running that contains a lock that this program is trying to use
    <script>
        //Display the back and exit button since the application couldn't run
        $('#main_menu_link').removeClass("hide_link");
        $('#back_link').removeClass("hide_link");
    </script>
    
    <?php } ?>
  • 相关阅读:
    工作中常用,实用工具推荐!
    “如何管理好你的时间”
    经典SQL语句大全(绝对的经典eweqweqwe)
    第三节 MongoDB下samus源码初探
    ASP.NET(C#)常用数据加密和解密方法汇总
    全自动时代:JavaScript自动压缩插件
    SQL Server 获取所有表和数据的批量操作
    千万级别数据表,单列索引和多列索引性能对比
    第二节 为什么用MongoDB及.NET开发入门
    vs2005手机开发环境的配置
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4585244.html
Copyright © 2011-2022 走看看