Mac dnsmasq 让别人自助修改dnsmasq配置(二)

场景

公司同事们在开发手机网页时,无越狱iphone无法修改hosts,越狱的iphone和root的android修改起来也十分麻烦。使用内部dns把域名解析到公司测试机,开发机或者同事自己的机器上,使用dnsmasq和自主修改的配置是比较好的解决方案。

局限

解析独占,当一个人在使用此服务的时候,其他人修改配置会影响当前的解析。因此适用于开发人员较少,测试频率较少的情况。

步骤

  1. 配置dnsmasq,不使用本机hosts(/etc/hosts),而是使用额外的hosts(我使用 /usr/local/etc/hosts文件)配置,具体配置请参考上一篇文章。
  2. 编写代码读写/usr/local/hosts文件。可以做成网页版的文件编辑页面。功能更强大。
  3. 使用php控制dnsmasq的重启,关闭,刷新配置等操作。
    • 难点一: 重启,或者刷新dnsmasq的配置都是需要sudo权限的。可以使用
      echo "password" | sudo kill -1 pid
    • 难点二:php没有执行脚本的权限。
      把apache的运行目录修改为本机用户
      User wbean
      Group staff
  4. 我的应用截图:

    image

  5. 附:代码
    start_dnsmasq.sh
    
    #!/bin/bash
    echo password | sudo -S /usr/local/Cellar/dnsmasq/2.66/sbin/dnsmasq
    
    restart_dnsmasq.sh
    
    #!/bin/bash
    pid=`ps aux | grep -v greq |grep dnsmasq |grep nobody|grep Cellar |awk '{print $2}'`
    echo password | sudo -S kill -9 ${pid}
    echo password | sudo -S /usr/local/Cellar/dnsmasq/2.66/sbin/dnsmasq
    
    flush_dnsmasq.sh
    
    !/bin/bash
    pid=`ps aux | grep -v greq |grep dnsmasq |grep nobody|grep Cellar |awk '{print $2}'`
    echo password | sudo -S kill -1 ${pid}
    
    stop_dnsmsql.sh
    
    !/bin/bash
    pid=`ps aux | grep -v greq |grep dnsmasq |grep nobody|grep Cellar |awk '{print $2}'`
    echo password | sudo -S kill -9 ${pid}
    
    dns.php
    
    <?php
    header("Content-type: text/html; charset=utf-8");
    $file_name_map = [
        'hosts'     => '正在使用',
        'hosts_pre' => '预发布(请勿修改)',
    ]; 
    $dir_path   = '/usr/local/etc/';
    
    if ($dh = opendir($dir_path)){
        while (($file = readdir($dh)) !== false){
            if(strpos($file, 'hosts') === 0){
                $file_name = isset($file_name_map[$file]) ? $file_name_map[$file] : $file;
                echo '<a href="dns.php?file='.$file.'">'.$file_name.'</a><br/>';
            }
        }   
    } 
    
    $file = isset($_GET['file']) ? $_GET['file'] : '';
    if(!$file){
        $file = 'hosts';
    }
    
    if(isset($_POST['btn1'])){
        file_put_contents($dir_path.'hosts', $_POST['text']);
        file_put_contents($dir_path.$_POST['file'], $_POST['text']);
    }
    if(isset($_POST['btn2'])){
        file_put_contents($dir_path.$file, $_POST['text']);
    }
    if(isset($_POST['btn3'])){
        if(isset($_POST['file_name'])){
            file_put_contents($dir_path.'hosts_'.$_POST['file_name'], $_POST['text']);
            header("Location: dns.php?file=hosts_".$_POST['file_name']);
        }
    }
    
    $content = file_get_contents($dir_path.$file);
    
    if(isset($_GET['action'])){
        if($_GET['action'] == 'start'){
            echo `/usr/local/etc/start_dnsmasq.sh`;
        }
        if($_GET['action'] == 'flush'){
            echo `/usr/local/etc/flush_dnsmasq.sh`;
        }
        if($_GET['action'] == 'reboot'){
            echo `/usr/local/etc/restart_dnsmasq.sh`;
        }
        if($_GET['action'] == 'stop'){
            echo `/usr/local/etc/stop_dnsmasq.sh`;
        }
        header("Location: dns.php?file=hosts");
    }
    
    ?>
    <br />
    <br />
    dnsmasq操作 :&nbsp;&nbsp;&nbsp;&nbsp;<a href="dns.php?action=start">启动</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="dns.php?action=flush">刷新</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="dns.php?action=reboot">重启</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="dns.php?action=stop">停止</a>
    <br /><br /><br />
    正在操作&nbsp;&nbsp;&nbsp;&nbsp;<b><?php $file_name = isset($file_name_map[$file]) ? $file_name_map[$file] : $file; echo $file_name; ?></b>&nbsp;&nbsp;&nbsp;&nbsp;的文件
    <br />
    <br />
    <form action='dns.php?file=<?php echo $file;?>' method='post'>
        <input name="btn1" type="submit" value="保存&使用host" /></br>
        <input name="btn2" type="submit" value="保存到当前文件" /></br>
        <input name="file_name" type="text" value="" /><input type="submit" value="保存到新文件" name="btn3" /></br>
        <textarea name = 'text' cols="80" rows="32">
            <?php echo $content; ?>
        </textarea>
        <input type="hidden" name="file" value="<?php echo $file?>" />
    </form>
Comments
Write a Comment