歌者泰戈 發表於 2020-6-16 15:29:00

iOS企业证书开发的APP证书过期时间监控

<p>大家都知道iOS的企业证书开发的APP,证书都是一年有效期,满一年得新建证书重新打包,否则无法继续使用。</p>
<p>我们一个企业账号下有几十个APP,一个个去看也很麻烦~~搞个监控呗!!!</p>
<p>&nbsp;</p>
<p>写个脚本放Jenkins上定时跑就行,跑完发布邮件:</p>
<p>&nbsp;</p>
<p><img src="https://img2020.cnblogs.com/blog/1546913/202007/1546913-20200730093351378-344385800.png"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>1.邮件包含信息:APP名称,APP相关的bundle id、证书名称、签名时间、团队id,过期时间,以及剩余有效的月数。</p>
<p><img src="https://img2020.cnblogs.com/blog/1546913/202006/1546913-20200616150648027-2133544285.png"></p>
<p>&nbsp;</p>
<p>common_mail.py: 发布邮件,邮件发送网上多,自己找,不累述</p>
<p>copy_ipa_monitor.py: 把打好的ipa复制到指定的目录,这个目录给监控的扫描用</p>
<p>date_month.py: 专门计算月份差,Python没有直接计算月份差的模块,自己写,考虑下各种条件计算</p>
<p>ipa_monitor.py: 获取ipa的有效时间以及ipa包里描述文件里的有效时间</p>
<p>ipa_monitor_html.py: 生成邮件发送的html模版</p>
<p>&nbsp;</p>
<p>贴代码:</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"># ipa_monitor.py</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> coding = utf-8</span>
<span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 读取配置证书</span>
<span style="color: rgba(0, 128, 128, 1)">4</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> os
</span><span style="color: rgba(0, 128, 128, 1)">6</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> time
</span><span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> shutil
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> datetime
</span><span style="color: rgba(0, 128, 128, 1)">9</span> <span style="color: rgba(0, 0, 255, 1)">from</span> pkg_common.cmd <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> common_run_cmd as cmd
</span><span style="color: rgba(0, 128, 128, 1)"> 10</span> <span style="color: rgba(0, 0, 255, 1)">from</span> pkg_common.handle_file <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> find_file as find
</span><span style="color: rgba(0, 128, 128, 1)"> 11</span> <span style="color: rgba(0, 0, 255, 1)">from</span> pkg_common.ipa_monitor <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> common_mail as mail
</span><span style="color: rgba(0, 128, 128, 1)"> 12</span> <span style="color: rgba(0, 0, 255, 1)">from</span> pkg_common.ipa_monitor <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> ipa_monitor_html as html
</span><span style="color: rgba(0, 128, 128, 1)"> 13</span>
<span style="color: rgba(0, 128, 128, 1)"> 14</span>
<span style="color: rgba(0, 128, 128, 1)"> 15</span> to_find_path = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/Users/Work/package/ipa_monitor</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 16</span>
<span style="color: rgba(0, 128, 128, 1)"> 17</span>
<span style="color: rgba(0, 128, 128, 1)"> 18</span> <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取证书时间一些命令 </span>
<span style="color: rgba(0, 128, 128, 1)"> 19</span> codesign_cmd = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">codesign -d --extract-certificates Payload/*.app</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 20</span> openssl_cmd = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">openssl x509 -inform DER -in codesign0 -noout -nameopt -oneline -dates</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 21</span> codesign_get_cmd = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">codesign -dv --verbose=4 Payload/*.app</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 22</span> mobile_provision_cmd = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">more Payload/Runner.app/embedded.mobileprovision</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 23</span>
<span style="color: rgba(0, 128, 128, 1)"> 24</span>
<span style="color: rgba(0, 128, 128, 1)"> 25</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> get_ipa_time():
</span><span style="color: rgba(0, 128, 128, 1)"> 26</span>   f, f_l = find.find_file(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">'*.ipa'</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, to_find_path)
</span><span style="color: rgba(0, 128, 128, 1)"> 27</span>   all_dic =<span style="color: rgba(0, 0, 0, 1)"> []
</span><span style="color: rgba(0, 128, 128, 1)"> 28</span>   <span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> f_l:
</span><span style="color: rgba(0, 128, 128, 1)"> 29</span>         dic =<span style="color: rgba(0, 0, 0, 1)"> {}
</span><span style="color: rgba(0, 128, 128, 1)"> 30</span>         dir_name =<span style="color: rgba(0, 0, 0, 1)"> os.path.dirname(i)
</span><span style="color: rgba(0, 128, 128, 1)"> 31</span>         app_name = dir_name.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/</span><span style="color: rgba(128, 0, 0, 1)">'</span>)[-1<span style="color: rgba(0, 0, 0, 1)">]
</span><span style="color: rgba(0, 128, 128, 1)"> 32</span>         dic[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">app_name</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> app_name
</span><span style="color: rgba(0, 128, 128, 1)"> 33</span>         base_name =<span style="color: rgba(0, 0, 0, 1)"> os.path.basename(i)
</span><span style="color: rgba(0, 128, 128, 1)"> 34</span>         un_zip_cmd = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">unzip -q %s</span><span style="color: rgba(128, 0, 0, 1)">'</span> %<span style="color: rgba(0, 0, 0, 1)"> base_name
</span><span style="color: rgba(0, 128, 128, 1)"> 35</span>         <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 解压ipa文件</span>
<span style="color: rgba(0, 128, 128, 1)"> 36</span> <span style="color: rgba(0, 0, 0, 1)">      cmd.run_cmd(un_zip_cmd, dir_name)
</span><span style="color: rgba(0, 128, 128, 1)"> 37</span>         time.sleep(2<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 38</span> <span style="color: rgba(0, 0, 0, 1)">      cmd.run_commands(codesign_cmd, dir_name)
</span><span style="color: rgba(0, 128, 128, 1)"> 39</span>         time.sleep(2<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 40</span>         not_time = cmd.run_commands(openssl_cmd, dir_name)
</span><span style="color: rgba(0, 128, 128, 1)"> 41</span>         not_after, not_stamp = deal_gmt(not_time.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\n</span><span style="color: rgba(128, 0, 0, 1)">'</span>).split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">'</span>))
</span><span style="color: rgba(0, 128, 128, 1)"> 42</span>         f, f_l = find.find_file(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">'*.mobileprovision'</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, dir_name)
</span><span style="color: rgba(0, 128, 128, 1)"> 43</span>         ipa_no_time = <span style="color: rgba(128, 0, 0, 1)">''</span>
<span style="color: rgba(0, 128, 128, 1)"> 44</span>         ipa_no_stamp =<span style="color: rgba(0, 0, 0, 1)"> 0
</span><span style="color: rgba(0, 128, 128, 1)"> 45</span>         <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 获取描述文件里的过期时间,这里解码格式一定要用ISO-8859-1</span>
<span style="color: rgba(0, 128, 128, 1)"> 46</span>         with open(f_l, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">r</span><span style="color: rgba(128, 0, 0, 1)">'</span>, encoding=<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ISO-8859-1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">) as f_w:
</span><span style="color: rgba(0, 128, 128, 1)"> 47</span>             lines =<span style="color: rgba(0, 0, 0, 1)"> f_w.readlines()
</span><span style="color: rgba(0, 128, 128, 1)"> 48</span>             <span style="color: rgba(0, 0, 255, 1)">for</span> index, l <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> enumerate(lines):
</span><span style="color: rgba(0, 128, 128, 1)"> 49</span>               <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ExpirationDate</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> l:
</span><span style="color: rgba(0, 128, 128, 1)"> 50</span>                     ipa_no_time = lines.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">&gt;</span><span style="color: rgba(128, 0, 0, 1)">'</span>).split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 51</span>                     ipa_no_time, ipa_no_stamp =<span style="color: rgba(0, 0, 0, 1)"> deal_utc(ipa_no_time)
</span><span style="color: rgba(0, 128, 128, 1)"> 52</span>                     <span style="color: rgba(0, 0, 255, 1)">break</span>
<span style="color: rgba(0, 128, 128, 1)"> 53</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> not_stamp &lt;=<span style="color: rgba(0, 0, 0, 1)"> ipa_no_stamp:
</span><span style="color: rgba(0, 128, 128, 1)"> 54</span>             expired_time =<span style="color: rgba(0, 0, 0, 1)"> not_after
</span><span style="color: rgba(0, 128, 128, 1)"> 55</span>         <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)"> 56</span>             expired_time =<span style="color: rgba(0, 0, 0, 1)"> ipa_no_time
</span><span style="color: rgba(0, 128, 128, 1)"> 57</span>         dic[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">expired_time</span><span style="color: rgba(128, 0, 0, 1)">'</span>] =<span style="color: rgba(0, 0, 0, 1)"> expired_time
</span><span style="color: rgba(0, 128, 128, 1)"> 58</span>         pro_info = cmd.run_commands(codesign_get_cmd, dir_name).split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">\n</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 59</span> <span style="color: rgba(0, 0, 0, 1)">      delete_file(dir_name)
</span><span style="color: rgba(0, 128, 128, 1)"> 60</span>
<span style="color: rgba(0, 128, 128, 1)"> 61</span>         <span style="color: rgba(0, 0, 255, 1)">for</span> x <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> pro_info:
</span><span style="color: rgba(0, 128, 128, 1)"> 62</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Identifier</span><span style="color: rgba(128, 0, 0, 1)">'</span> == x.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">):
</span><span style="color: rgba(0, 128, 128, 1)"> 63</span>               dic[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Identifier</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = x.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">'</span>)
</span><span style="color: rgba(0, 128, 128, 1)"> 64</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Authority</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> x:
</span><span style="color: rgba(0, 128, 128, 1)"> 65</span>               <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Authority</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">not</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> dic:
</span><span style="color: rgba(0, 128, 128, 1)"> 66</span>                     dic[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Authority</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = x.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">'</span>)
</span><span style="color: rgba(0, 128, 128, 1)"> 67</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Signed Time</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> x:
</span><span style="color: rgba(0, 128, 128, 1)"> 68</span>               dic[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Signed_time</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = x.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">'</span>)
</span><span style="color: rgba(0, 128, 128, 1)"> 69</span>             <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">TeamIdentifier</span><span style="color: rgba(128, 0, 0, 1)">'</span> <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> x:
</span><span style="color: rgba(0, 128, 128, 1)"> 70</span>               dic[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">TeamIdentifier</span><span style="color: rgba(128, 0, 0, 1)">'</span>] = x.split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">'</span>)
</span><span style="color: rgba(0, 128, 128, 1)"> 71</span> <span style="color: rgba(0, 0, 0, 1)">      all_dic.append(dic)
</span><span style="color: rgba(0, 128, 128, 1)"> 72</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> all_dic
</span><span style="color: rgba(0, 128, 128, 1)"> 73</span>
<span style="color: rgba(0, 128, 128, 1)"> 74</span>
<span style="color: rgba(0, 128, 128, 1)"> 75</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> deal_gmt(gmt_time):
</span><span style="color: rgba(0, 128, 128, 1)"> 76</span>   <span style="color: rgba(128, 0, 0, 1)">"""</span>
<span style="color: rgba(0, 128, 128, 1)"> 77</span> <span style="color: rgba(128, 0, 0, 1)">    GMT时间转换
</span><span style="color: rgba(0, 128, 128, 1)"> 78</span> <span style="color: rgba(128, 0, 0, 1)">    :param gmt_time:
</span><span style="color: rgba(0, 128, 128, 1)"> 79</span> <span style="color: rgba(128, 0, 0, 1)">    :return:
</span><span style="color: rgba(0, 128, 128, 1)"> 80</span>   <span style="color: rgba(128, 0, 0, 1)">"""</span>
<span style="color: rgba(0, 128, 128, 1)"> 81</span>   gmt_format = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%b %d %H:%M:%S %Y GMT</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 82</span>   <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> GMT时间与北京时间相差8小时</span>
<span style="color: rgba(0, 128, 128, 1)"> 83</span>   sta_time = datetime.datetime.strptime(gmt_time, gmt_format) + datetime.timedelta(hours=8<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 84</span>   time_array = time.strptime(str(sta_time), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%Y-%m-%d %H:%M:%S</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 85</span>   time_stamp =<span style="color: rgba(0, 0, 0, 1)"> int(time.mktime(time_array))
</span><span style="color: rgba(0, 128, 128, 1)"> 86</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sta_time, time_stamp
</span><span style="color: rgba(0, 128, 128, 1)"> 87</span>
<span style="color: rgba(0, 128, 128, 1)"> 88</span>
<span style="color: rgba(0, 128, 128, 1)"> 89</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> deal_utc(utc_time):
</span><span style="color: rgba(0, 128, 128, 1)"> 90</span>   utc_format = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%Y-%m-%dT%H:%M:%SZ</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)"> 91</span>   sta_time = datetime.datetime.strptime(utc_time, utc_format) + datetime.timedelta(hours=8<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 92</span>   time_array = time.strptime(str(sta_time), <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">%Y-%m-%d %H:%M:%S</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)"> 93</span>   time_stamp =<span style="color: rgba(0, 0, 0, 1)"> int(time.mktime(time_array))
</span><span style="color: rgba(0, 128, 128, 1)"> 94</span>   <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sta_time, time_stamp
</span><span style="color: rgba(0, 128, 128, 1)"> 95</span>
<span style="color: rgba(0, 128, 128, 1)"> 96</span>
<span style="color: rgba(0, 128, 128, 1)"> 97</span> <span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> delete_file(dir_name):
</span><span style="color: rgba(0, 128, 128, 1)"> 98</span>   <span style="color: rgba(128, 0, 0, 1)">"""</span>
<span style="color: rgba(0, 128, 128, 1)"> 99</span> <span style="color: rgba(128, 0, 0, 1)">    删除多余文件
</span><span style="color: rgba(0, 128, 128, 1)">100</span> <span style="color: rgba(128, 0, 0, 1)">    :param dir_name:
</span><span style="color: rgba(0, 128, 128, 1)">101</span> <span style="color: rgba(128, 0, 0, 1)">    :return:
</span><span style="color: rgba(0, 128, 128, 1)">102</span>   <span style="color: rgba(128, 0, 0, 1)">"""</span>
<span style="color: rgba(0, 128, 128, 1)">103</span>   os.remove(dir_name + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/codesign0</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">104</span>   os.remove(dir_name + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/codesign1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">105</span>   os.remove(dir_name + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/codesign2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">106</span>   shutil.rmtree(dir_name + <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">/Payload</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">107</span>
<span style="color: rgba(0, 128, 128, 1)">108</span>
<span style="color: rgba(0, 128, 128, 1)">109</span> <span style="color: rgba(0, 0, 255, 1)">if</span> <span style="color: rgba(128, 0, 128, 1)">__name__</span> == <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">__main__</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">110</span>   ipa_info =<span style="color: rgba(0, 0, 0, 1)"> get_ipa_time()
</span><span style="color: rgba(0, 128, 128, 1)">111</span>   subject, html =<span style="color: rgba(0, 0, 0, 1)"> html.deal_html(ipa_info)
</span><span style="color: rgba(0, 128, 128, 1)">112</span>   <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">113</span>         <span style="color: rgba(0, 0, 255, 1)">if</span> mail.cs_mail_send(subject, html, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">c</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">):
</span><span style="color: rgba(0, 128, 128, 1)">114</span>             <span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Send success</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">115</span>         <span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
</span><span style="color: rgba(0, 128, 128, 1)">116</span>             <span style="color: rgba(0, 0, 255, 1)">print</span>(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Send failure</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">117</span>   <span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> Exception as e:
</span><span style="color: rgba(0, 128, 128, 1)">118</span>         <span style="color: rgba(0, 0, 255, 1)">raise</span><span style="color: rgba(0, 0, 0, 1)"> e
</span><span style="color: rgba(0, 128, 128, 1)">119</span>         </pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"># date_month.py</span>

<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> datetime
</span><span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> calendar as c


</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> cal_months(start_date, end_date):

    </span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 计算两个日期相隔月差</span>
    <span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
      same_month_date </span>=<span style="color: rgba(0, 0, 0, 1)"> datetime.date(end_date.year, end_date.month, start_date.day)
    </span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> Exception as e:
      </span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(e)
      same_month_date </span>= datetime.date(end_date.year, end_date.month, c.monthrange(end_date.year, end_date.month))
    decimal_month </span>= 0.0
    <span style="color: rgba(0, 0, 255, 1)">if</span> same_month_date &gt;<span style="color: rgba(0, 0, 0, 1)"> end_date:
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
            pre_date </span>= datetime.date(end_date.year, end_date.month - 1<span style="color: rgba(0, 0, 0, 1)">, start_date.day)
      </span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> Exception as e:
            </span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(e)
            pre_date </span>= datetime.date(end_date.year, end_date.month - 1, c.monthrange(end_date.year, end_date.month - 1))
      curr_month_days </span>= (same_month_date -<span style="color: rgba(0, 0, 0, 1)"> pre_date).days
      hold_months </span>= (pre_date.year - start_date.year) * 12 + pre_date.month -<span style="color: rgba(0, 0, 0, 1)"> start_date.month
      decimal_month </span>= round((end_date - pre_date).days / curr_month_days, 1<span style="color: rgba(0, 0, 0, 1)">)

    </span><span style="color: rgba(0, 0, 255, 1)">elif</span> same_month_date &lt;<span style="color: rgba(0, 0, 0, 1)"> end_date:
      </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">:
            next_month_date </span>= datetime.date(end_date.year, end_date.month + 1<span style="color: rgba(0, 0, 0, 1)">, start_date.day)
      </span><span style="color: rgba(0, 0, 255, 1)">except</span><span style="color: rgba(0, 0, 0, 1)"> Exception as e:
            </span><span style="color: rgba(0, 0, 255, 1)">print</span><span style="color: rgba(0, 0, 0, 1)">(e)
            next_month_date </span>= datetime.date(end_date.year, end_date.month + 1, c.monthrange(end_date.year, end_date.month + 1))
      curr_month_days </span>= (next_month_date -<span style="color: rgba(0, 0, 0, 1)"> same_month_date).days
      hold_months </span>= (same_month_date.year - start_date.year) * 12 + same_month_date.month -<span style="color: rgba(0, 0, 0, 1)"> start_date.month
      decimal_month </span>= round((end_date - same_month_date).days / curr_month_days, 1<span style="color: rgba(0, 0, 0, 1)">)

    </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
      hold_months </span>= (end_date.year - start_date.year) * 12 + end_date.month -<span style="color: rgba(0, 0, 0, 1)"> start_date.month

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> hold_months + decimal_month</pre>
</div>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"># ipa_monitor_html.py</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> coding = utf-8</span><span style="color: rgba(0, 128, 0, 1)">
#</span><span style="color: rgba(0, 128, 0, 1)"> ipa过期时间监控</span>

<span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> datetime
</span><span style="color: rgba(0, 0, 255, 1)">from</span> pkg_common.ipa_monitor <span style="color: rgba(0, 0, 255, 1)">import</span><span style="color: rgba(0, 0, 0, 1)"> date_month as dm


</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 处理html</span>
<span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> deal_html(data):
    tl </span>=<span style="color: rgba(0, 0, 0, 1)"> deal_tl(data)
    subject </span>= <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">企业证书iOS应用过期时间监控</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">
    html </span>= <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
      &lt;head&gt;
      &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;
      &lt;title&gt;企业证书iOS应用过期时间监控&lt;/title&gt;
      &lt;body&gt;
      &lt;div id="container"&gt;
         &lt;center&gt;
      &lt;strong&gt;汇总时间: </span><span style="color: rgba(128, 0, 0, 1)">"""</span> + str(datetime.datetime.now().strftime(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">%Y-%m-%d %H:%M:%S</span><span style="color: rgba(128, 0, 0, 1)">'</span>)) + <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">&lt;/strong&gt;
      &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;
      &lt;div id="content"&gt;
         &lt;table border="1" cellpadding="2" style="border-collapse:collapse;margin-top:10px"&gt;
         &lt;tr&gt;
         &lt;td colspan="4" align="center" height="35px"&gt;&lt;font size="4"&gt;&lt;strong&gt;只针对企业证书打包的应用&lt;/strong&gt;[&lt;font color="red"&gt;有效期小于3月的红色加粗显示&lt;/font&gt;]&lt;/font&gt;&lt;/td&gt;
         &lt;/tr&gt;
         &lt;tr height="28px" bgcolor="#f0f8ff"&gt;
          &lt;td width="120" align="center"&gt;&lt;font size="3"&gt;&lt;strong&gt;应用名称&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
          &lt;td width="520" align="center"&gt;&lt;font size="3"&gt;&lt;strong&gt;APP参数&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
          &lt;td width="180" align="center"&gt;&lt;font size="3"&gt;&lt;strong&gt;过期时间&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
          &lt;td width="80" align="center"&gt;&lt;font size="3"&gt;&lt;strong&gt;剩余月数&lt;/strong&gt;&lt;/font&gt;&lt;/td&gt;
         &lt;/tr&gt;            
      </span><span style="color: rgba(128, 0, 0, 1)">"""</span> + tl + <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
      &lt;/tr&gt;
      &lt;/table&gt;
      &lt;p&gt;&lt;font size="3" &gt;&lt;center&gt;--------------------&lt;strong&gt;&lt;a href="http://chandao.thecover.cn/"&gt;汇总数据源于测试监控系统&lt;/a&gt;&lt;/strong&gt;--------------------&lt;/center&gt;&lt;/font&gt;
      &lt;/center&gt;
      &lt;/div&gt;
      &lt;/div&gt;
      &lt;/div&gt;
      &lt;/body&gt;
      &lt;/html&gt;
            </span><span style="color: rgba(128, 0, 0, 1)">"""</span>
    <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> subject, html


</span><span style="color: rgba(0, 0, 255, 1)">def</span><span style="color: rgba(0, 0, 0, 1)"> deal_tl(data):

    tl_a </span>= <span style="color: rgba(128, 0, 0, 1)">''</span>
    <span style="color: rgba(0, 0, 255, 1)">for</span> i <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> data:

      dt1 </span>= i[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">expired_time</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">].date()
      dt2 </span>=<span style="color: rgba(0, 0, 0, 1)"> datetime.date.today()
      dt </span>=<span style="color: rgba(0, 0, 0, 1)"> dm.cal_months(dt2, dt1)

      a </span>= <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
      &lt;tr&gt;
            &lt;td rowspan="4" align="center"&gt; %s &lt;/td&gt;
            &lt;td align="left"&gt; Identifier:%s&lt;/td&gt;
            &lt;td rowspan="4" align="center"&gt; %s&lt;/td&gt;
      </span><span style="color: rgba(128, 0, 0, 1)">"""</span> % (i[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">app_name</span><span style="color: rgba(128, 0, 0, 1)">'</span>], i[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Identifier</span><span style="color: rgba(128, 0, 0, 1)">'</span>], i[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">expired_time</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])

      </span><span style="color: rgba(0, 0, 255, 1)">if</span> dt &gt; 3<span style="color: rgba(0, 0, 0, 1)">:
            b </span>= <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)"> &lt;td rowspan="4" align="center"&gt; %s&lt;/td&gt; </span><span style="color: rgba(128, 0, 0, 1)">"""</span> %<span style="color: rgba(0, 0, 0, 1)"> dt
      </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">:
            b </span>= <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)"> &lt;td rowspan="4" align="center"&gt; &lt;strong&gt;&lt;font color="red"&gt; %s &lt;/font&gt;&lt;/strong&gt;&lt;/td&gt; </span><span style="color: rgba(128, 0, 0, 1)">"""</span> %<span style="color: rgba(0, 0, 0, 1)"> dt

      c </span>= <span style="color: rgba(128, 0, 0, 1)">"""</span><span style="color: rgba(128, 0, 0, 1)">
      &lt;/tr&gt;
      &lt;tr&gt;
            &lt;td align="left"&gt; Authority:%s&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
            &lt;td align="left"&gt; Signed_time:%s &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
            &lt;td align="left"&gt; TeamIdentifier:%s &lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
            &lt;td colspan="4" align="center" height="0px" bgcolor="#a9a9a9"&gt;&lt;font size="4"&gt; &lt;/td&gt;
      &lt;/tr&gt;
      </span><span style="color: rgba(128, 0, 0, 1)">"""</span> % (i[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Authority</span><span style="color: rgba(128, 0, 0, 1)">'</span>], i[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Signed_time</span><span style="color: rgba(128, 0, 0, 1)">'</span>], i[<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">TeamIdentifier</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">])

      tl_a </span>= tl_a + a + b +<span style="color: rgba(0, 0, 0, 1)"> c

    </span><span style="color: rgba(0, 0, 255, 1)">return</span> tl_a</pre>
</div>
<p>&nbsp;</p>
<p>其他py文件很简单,就不贴了,若遇到问题,可留言交流~~</p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:drewgg,转载请注明原文链接:https://www.cnblogs.com/drewgg/p/13141196.html</p><br><br>
来源:https://www.cnblogs.com/drewgg/p/13141196.html
頁: [1]
查看完整版本: iOS企业证书开发的APP证书过期时间监控