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 } ?>
  • 相关阅读:
    POJ3320 Jessica's Reading Problem
    POJ3320 Jessica's Reading Problem
    CodeForces 813B The Golden Age
    CodeForces 813B The Golden Age
    An impassioned circulation of affection CodeForces
    An impassioned circulation of affection CodeForces
    Codeforces Round #444 (Div. 2) B. Cubes for Masha
    2013=7=21 进制转换
    2013=7=15
    2013=7=14
  • 原文地址:https://www.cnblogs.com/zengjfgit/p/4585244.html
Copyright © 2011-2022 走看看