InPanel 1.2.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. inpanel/__init__.py +29 -0
  2. inpanel/acme.py +289 -0
  3. inpanel/aliyuncs.py +269 -0
  4. inpanel/app.py +514 -0
  5. inpanel/apt.py +223 -0
  6. inpanel/base.py +200 -0
  7. inpanel/config.py +139 -0
  8. inpanel/data/config.ini +29 -0
  9. inpanel/data/history +5 -0
  10. inpanel/data/runlogs.ini +12 -0
  11. inpanel/data/update_info.ini +4 -0
  12. inpanel/dnf.py +225 -0
  13. inpanel/lib/__init__.py +9 -0
  14. inpanel/lib/async_process.py +98 -0
  15. inpanel/lib/filelock.py +82 -0
  16. inpanel/lib/magic.py +233 -0
  17. inpanel/lib/pxssh.py +310 -0
  18. inpanel/lib/pyDes.py +867 -0
  19. inpanel/mod/__init__.py +0 -0
  20. inpanel/mod/apt.py +316 -0
  21. inpanel/mod/certificate.py +268 -0
  22. inpanel/mod/config.py +372 -0
  23. inpanel/mod/cron.py +315 -0
  24. inpanel/mod/disk.py +322 -0
  25. inpanel/mod/dnf.py +239 -0
  26. inpanel/mod/file.py +722 -0
  27. inpanel/mod/firewall.py +199 -0
  28. inpanel/mod/firewall_base.py +137 -0
  29. inpanel/mod/firewall_firewalld.py +170 -0
  30. inpanel/mod/firewall_iptables.py +176 -0
  31. inpanel/mod/firewall_macos.py +213 -0
  32. inpanel/mod/firewall_ufw.py +128 -0
  33. inpanel/mod/ftp.py +231 -0
  34. inpanel/mod/httpd.py +1205 -0
  35. inpanel/mod/lighttpd.py +26 -0
  36. inpanel/mod/login.py +98 -0
  37. inpanel/mod/mysql.py +577 -0
  38. inpanel/mod/named.py +26 -0
  39. inpanel/mod/nginx.py +2327 -0
  40. inpanel/mod/package.py +33 -0
  41. inpanel/mod/package_apt.py +62 -0
  42. inpanel/mod/package_base.py +77 -0
  43. inpanel/mod/package_dnf.py +62 -0
  44. inpanel/mod/package_map.py +366 -0
  45. inpanel/mod/package_yum.py +64 -0
  46. inpanel/mod/php.py +289 -0
  47. inpanel/mod/process.py +291 -0
  48. inpanel/mod/proftpd.py +26 -0
  49. inpanel/mod/pureftpd.py +26 -0
  50. inpanel/mod/query.py +108 -0
  51. inpanel/mod/server.py +1319 -0
  52. inpanel/mod/service.py +262 -0
  53. inpanel/mod/setting.py +228 -0
  54. inpanel/mod/shell.py +78 -0
  55. inpanel/mod/ssh.py +280 -0
  56. inpanel/mod/system.py +220 -0
  57. inpanel/mod/task.py +1337 -0
  58. inpanel/mod/ufw.py +14 -0
  59. inpanel/mod/user.py +306 -0
  60. inpanel/mod/vsftpd.py +67 -0
  61. inpanel/mod/yum.py +243 -0
  62. inpanel/plugins/__init__.py +10 -0
  63. inpanel/plugins/__pycache__/__init__.cpython-313.pyc +0 -0
  64. inpanel/plugins/acme/static/index.html +10 -0
  65. inpanel/plugins/acme/static/index.js +13 -0
  66. inpanel/plugins/shadowsocks-libev/__pycache__/info.cpython-313.pyc +0 -0
  67. inpanel/plugins/shadowsocks-libev/info.py +73 -0
  68. inpanel/plugins/shadowsocks-libev/static/index.html +70 -0
  69. inpanel/plugins/shadowsocks-libev/static/index.js +18 -0
  70. inpanel/public/css/global.css +138 -0
  71. inpanel/public/favicon.ico +0 -0
  72. inpanel/public/images/alipay.jpg +0 -0
  73. inpanel/public/images/loading.gif +0 -0
  74. inpanel/public/images/weixin.jpg +0 -0
  75. inpanel/public/index.html +94 -0
  76. inpanel/public/js/controllers/controllers.js +566 -0
  77. inpanel/public/js/controllers/database.js +590 -0
  78. inpanel/public/js/controllers/ecs.js +624 -0
  79. inpanel/public/js/controllers/file.js +940 -0
  80. inpanel/public/js/controllers/plugins.js +105 -0
  81. inpanel/public/js/controllers/service.js +1460 -0
  82. inpanel/public/js/controllers/site.js +1241 -0
  83. inpanel/public/js/controllers/utils.js +2319 -0
  84. inpanel/public/js/core.js +221 -0
  85. inpanel/public/js/directives.js +784 -0
  86. inpanel/public/js/filters.js +395 -0
  87. inpanel/public/js/services.js +257 -0
  88. inpanel/public/lib/angular/1.0.2/angular-resource.min.js +10 -0
  89. inpanel/public/lib/angular/1.0.2/angular.min.js +158 -0
  90. inpanel/public/lib/bootstrap/css/bootstrap-theme.css +587 -0
  91. inpanel/public/lib/bootstrap/css/bootstrap-theme.css.map +1 -0
  92. inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css +6 -0
  93. inpanel/public/lib/bootstrap/css/bootstrap-theme.min.css.map +1 -0
  94. inpanel/public/lib/bootstrap/css/bootstrap.css +6757 -0
  95. inpanel/public/lib/bootstrap/css/bootstrap.css.map +1 -0
  96. inpanel/public/lib/bootstrap/css/bootstrap.min.css +6 -0
  97. inpanel/public/lib/bootstrap/css/bootstrap.min.css.map +1 -0
  98. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.eot +0 -0
  99. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.svg +288 -0
  100. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf +0 -0
  101. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff +0 -0
  102. inpanel/public/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 +0 -0
  103. inpanel/public/lib/bootstrap/img/glyphicons-halflings-white.png +0 -0
  104. inpanel/public/lib/bootstrap/img/glyphicons-halflings.png +0 -0
  105. inpanel/public/lib/bootstrap/js/bootstrap.js +2377 -0
  106. inpanel/public/lib/bootstrap/js/bootstrap.min.js +7 -0
  107. inpanel/public/lib/bootstrap/js/npm.js +13 -0
  108. inpanel/public/lib/codemirror/codemirror-compressed.js +1 -0
  109. inpanel/public/lib/codemirror/codemirror.css +173 -0
  110. inpanel/public/lib/jquery/jquery-1.12.4.min.js +5 -0
  111. inpanel/public/lib/md5/md5.js +379 -0
  112. inpanel/public/lib/md5/md5.min.js +1 -0
  113. inpanel/public/partials/database/index.html +172 -0
  114. inpanel/public/partials/database/mysql/dbedit.html +462 -0
  115. inpanel/public/partials/database/mysql/dbnew.html +348 -0
  116. inpanel/public/partials/database/mysql/useredit.html +310 -0
  117. inpanel/public/partials/database/mysql/usernew.html +97 -0
  118. inpanel/public/partials/directives/message.html +20 -0
  119. inpanel/public/partials/directives/navbar.html +25 -0
  120. inpanel/public/partials/directives/selector.html +57 -0
  121. inpanel/public/partials/directives/srvbase.html +72 -0
  122. inpanel/public/partials/directives/srvext.html +34 -0
  123. inpanel/public/partials/directives/srvfile.html +23 -0
  124. inpanel/public/partials/directives/srvinstall.html +34 -0
  125. inpanel/public/partials/directives/srvlog.html +23 -0
  126. inpanel/public/partials/directives/srvminiop.html +28 -0
  127. inpanel/public/partials/directives/srvuninstall.html +38 -0
  128. inpanel/public/partials/directives/srvupdate.html +30 -0
  129. inpanel/public/partials/ecs/account.html +156 -0
  130. inpanel/public/partials/ecs/ecs.html +198 -0
  131. inpanel/public/partials/ecs/index.html +40 -0
  132. inpanel/public/partials/ecs/setings.html +459 -0
  133. inpanel/public/partials/file/file.html +501 -0
  134. inpanel/public/partials/file/trash.html +95 -0
  135. inpanel/public/partials/ftp.html +36 -0
  136. inpanel/public/partials/log.html +83 -0
  137. inpanel/public/partials/login.html +79 -0
  138. inpanel/public/partials/logout.html +22 -0
  139. inpanel/public/partials/main.html +534 -0
  140. inpanel/public/partials/plugins/index.html +55 -0
  141. inpanel/public/partials/plugins/plugins.html +13 -0
  142. inpanel/public/partials/secure.html +13 -0
  143. inpanel/public/partials/service/apache.html +147 -0
  144. inpanel/public/partials/service/cron.html +71 -0
  145. inpanel/public/partials/service/index.html +293 -0
  146. inpanel/public/partials/service/iptables.html +40 -0
  147. inpanel/public/partials/service/lighttpd.html +63 -0
  148. inpanel/public/partials/service/mariadb.html +113 -0
  149. inpanel/public/partials/service/memcache.html +36 -0
  150. inpanel/public/partials/service/minio.html +44 -0
  151. inpanel/public/partials/service/mongodb.html +44 -0
  152. inpanel/public/partials/service/mysql.html +113 -0
  153. inpanel/public/partials/service/named.html +61 -0
  154. inpanel/public/partials/service/nginx.html +296 -0
  155. inpanel/public/partials/service/ntp.html +40 -0
  156. inpanel/public/partials/service/php.html +250 -0
  157. inpanel/public/partials/service/proftpd.html +59 -0
  158. inpanel/public/partials/service/pureftpd.html +59 -0
  159. inpanel/public/partials/service/redis.html +40 -0
  160. inpanel/public/partials/service/samba.html +58 -0
  161. inpanel/public/partials/service/sendmail.html +40 -0
  162. inpanel/public/partials/service/ssh.html +186 -0
  163. inpanel/public/partials/service/tomcat.html +65 -0
  164. inpanel/public/partials/service/vsftpd.html +195 -0
  165. inpanel/public/partials/setting.html +299 -0
  166. inpanel/public/partials/site/apache/site.html +277 -0
  167. inpanel/public/partials/site/index.html +344 -0
  168. inpanel/public/partials/site/nginx/site.html +558 -0
  169. inpanel/public/partials/sorry.html +19 -0
  170. inpanel/public/partials/storage/autofm.html +103 -0
  171. inpanel/public/partials/storage/backup.html +42 -0
  172. inpanel/public/partials/storage/index.html +360 -0
  173. inpanel/public/partials/storage/migrate.html +93 -0
  174. inpanel/public/partials/storage/movedata.html +98 -0
  175. inpanel/public/partials/storage/remote.html +77 -0
  176. inpanel/public/partials/utils/cron.html +486 -0
  177. inpanel/public/partials/utils/firewall.html +266 -0
  178. inpanel/public/partials/utils/index.html +193 -0
  179. inpanel/public/partials/utils/network.html +118 -0
  180. inpanel/public/partials/utils/process.html +239 -0
  181. inpanel/public/partials/utils/repository.html +373 -0
  182. inpanel/public/partials/utils/shell.html +28 -0
  183. inpanel/public/partials/utils/ssl.html +319 -0
  184. inpanel/public/partials/utils/time.html +109 -0
  185. inpanel/public/partials/utils/user.html +359 -0
  186. inpanel/public/robots.txt +2 -0
  187. inpanel/remote.py +109 -0
  188. inpanel/templates/file/preview.html +34 -0
  189. inpanel/templates/index.html +93 -0
  190. inpanel/utils.py +282 -0
  191. inpanel/web.py +1811 -0
  192. inpanel/yum.py +756 -0
  193. inpanel-1.2.1.dist-info/METADATA +399 -0
  194. inpanel-1.2.1.dist-info/RECORD +198 -0
  195. inpanel-1.2.1.dist-info/WHEEL +5 -0
  196. inpanel-1.2.1.dist-info/entry_points.txt +2 -0
  197. inpanel-1.2.1.dist-info/licenses/LICENSE +30 -0
  198. inpanel-1.2.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,277 @@
1
+ <div navbar ng-init="currentItem='site.apache'"></div>
2
+ <div ng-show="!loaded">
3
+ <div loading></div>
4
+ </div>
5
+
6
+ <div id="main" ng-show="loaded" style="display:none;">
7
+ <div class="module-header">
8
+ <h3>{{module_header}}</h3>
9
+ </div>
10
+
11
+ <div class="alert alert-danger" ng-show="!gen_by_inpanel" style="display:none;">
12
+ <p>该站点的配置不是使用 InPanel 生成的,继续配置有可能导致部分配置丢失。</p>
13
+ <p>建议使用 InPanel 为该站点新建一个配置,并将原配置迁移过来。</p>
14
+ <p>如要手工编辑原始配置文件内容,请<a href="#/service/apache?s=configfile">点击这里</a>。</p>
15
+ </div>
16
+
17
+ <div class="tabbable" ng-init="load()">
18
+ <ul class="nav nav-tabs">
19
+ <li ng-class="'active' | iftrue:activeTabName=='basic'"><a href="#basic" ng-click="sec('basic')" data-toggle="tab">基本设置</a></li>
20
+ <li ng-class="'active' | iftrue:activeTabName=='directory'"><a href="#directory" ng-click="sec('directory')" data-toggle="tab">目录设置</a></li>
21
+ <li ng-class="'active' | iftrue:activeTabName=='server-alias'"><a href="#server-alias" ng-click="sec('server-alias')" data-toggle="tab">绑定域名</a></li>
22
+ <li ng-class="'active' | iftrue:activeTabName=='advanced'"><a href="#advanced" ng-click="sec('advanced')" data-toggle="tab">高级设置</a></li>
23
+ </ul>
24
+ <div class="tab-content">
25
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='basic'" id="basic">
26
+ <div class="form-horizontal form-horizontal-small">
27
+ <div class="form-group form-inline">
28
+ <label class="col-sm-2 control-label">监听地址</label>
29
+ <div class="col-sm-10">
30
+ <input class="form-control" ng-model="setting.ip" type="text" placeholder="默认监听所有可用IP">
31
+ </div>
32
+ </div>
33
+ <div class="form-group form-inline">
34
+ <label class="col-sm-2 control-label">监听端口</label>
35
+ <div class="col-sm-10">
36
+ <div class="input-group">
37
+ <input class="form-control" ng-model="setting.port" type="text" placeholder="监听端口">
38
+ <div class="input-group-btn">
39
+ <button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">端口 <span class="caret"></span></button>
40
+ <ul class="dropdown-menu dropdown-menu-right">
41
+ <li><a href="javascript:void(0);" ng-click="setting.port='80'">80</a></li>
42
+ <li><a href="javascript:void(0);" ng-click="setting.port='81'">81</a></li>
43
+ <li><a href="javascript:void(0);" ng-click="setting.port='443'">443</a></li>
44
+ <li><a href="javascript:void(0);" ng-click="setting.port='8080'">8080</a></li>
45
+ <li><a href="javascript:void(0);" ng-click="setting.port='8899'">8899</a></li>
46
+ <li><a href="javascript:void(0);" ng-click="setting.port='9090'">9090</a></li>
47
+ </ul>
48
+ </div>
49
+ </div>
50
+ </div>
51
+ </div>
52
+ <div class="form-group form-inline">
53
+ <label class="col-sm-2 control-label">网站域名</label>
54
+ <div class="col-sm-10">
55
+ <input class="form-control" ng-model="setting.servername" type="text" placeholder="网站域名">
56
+ </div>
57
+ </div>
58
+ <div class="form-group">
59
+ <label class="col-sm-2 control-label">站点目录</label>
60
+ <div class="col-sm-10">
61
+ <div class="input-group">
62
+ <input class="form-control" ng-model="setting.documentroot" type="text" placeholder="网站存放目录">
63
+ <div class="input-group-btn">
64
+ <button class="btn btn-default" ng-click="select_document_root()" title="选择文件夹"><i class="glyphicon glyphicon-folder-open"></i></button>
65
+ </div>
66
+ </div>
67
+ <label class="checkbox-inline"><input ng-model="setting.autocreate" type="checkbox">目录不存在时,自动创建目录</label><br>
68
+ </div>
69
+ </div>
70
+ <div class="form-group">
71
+ <label class="col-sm-2 control-label">默认首页</label>
72
+ <div class="col-sm-10">
73
+ <input class="form-control" ng-model="setting.directoryindex" type="text" placeholder="首页默认访问文件">
74
+ </div>
75
+ </div>
76
+ <div class="form-group">
77
+ <label class="col-sm-2 control-label">错误日志</label>
78
+ <div class="col-sm-10">
79
+ <input class="form-control" ng-model="setting.errorlog" type="text">
80
+ </div>
81
+ </div>
82
+ <div class="form-group">
83
+ <label class="col-sm-2 control-label">CustomLog</label>
84
+ <div class="col-sm-10">
85
+ <input class="form-control" ng-model="setting.customlog" type="text">
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='directory'" id="directory">
91
+ <p>
92
+ <button class="btn btn-default" ng-click="add_directory($index)" ng-show="setting.directory.length==0" style="display:none">
93
+ <i class="glyphicon glyphicon-plus"></i> 添加目录
94
+ </button>
95
+ </p>
96
+ <ul class="nav nav-tabs" ng-show="setting.directory.length>0" style="display:none;">
97
+ <li ng-repeat="drct in setting.directory" ng-class="'active'|iftrue:$index==curdir_index" ng-click="setdir_index($index)">
98
+ <a href="#drct_{{$index}}" data-toggle="tab">{{drct.path}}</a>
99
+ </li>
100
+ <li class="pull-right">
101
+ <div class="btn-group" role="group">
102
+ <button type="button" class="btn btn-default" ng-click="add_directory()"><i class="glyphicon glyphicon-plus"></i></button>
103
+ <button type="button" class="btn btn-default" ng-click="del_directory(curdir_index)"><i class="glyphicon glyphicon-minus"></i></button>
104
+ </div>
105
+ </li>
106
+ </ul>
107
+ <div class="tab-content" ng-show="setting.directory.length>0" style="display:none;">
108
+ <div class="tab-pane" ng-repeat="drct in setting.directory" ng-class="'active'|iftrue:$index==curdir_index" id="drct_{{$index}}">
109
+ <div class="form-horizontal form-horizontal-small">
110
+ <div class="form-group">
111
+ <label class="col-sm-2 control-label">目录路径</label>
112
+ <div class="col-sm-10">
113
+ <input class="form-control" ng-model="drct.path" ng-change="drct_change(drct)" type="text" placeholder="URL路径">
114
+ <label class="checkbox-inline"><input ng-model="drct.autocreate" type="checkbox">目录不存在时,自动创建目录</label><br>
115
+ </div>
116
+ </div>
117
+ <div class="form-group form-inline">
118
+ <label class="col-sm-2 control-label">列表展示</label>
119
+ <div class="col-sm-10">
120
+ <select class="form-control" ng-model="drct.indexes">
121
+ <option value="">默认全局设置</option>
122
+ <option value="+">允许显示目录列表</option>
123
+ <option value="-">禁止显示目录列表</option>
124
+ </select>
125
+ </div>
126
+ </div>
127
+ <div class="form-group form-inline">
128
+ <label class="col-sm-2 control-label">符号链接</label>
129
+ <div class="col-sm-10">
130
+ <select class="form-control" ng-model="drct.followsymlinks">
131
+ <option value="">默认全局设置</option>
132
+ <option value="+">允许访问链接文件</option>
133
+ <option value="-">禁止访问链接文件</option>
134
+ </select>
135
+ </div>
136
+ </div>
137
+ <div class="form-group form-inline">
138
+ <label class="col-sm-2 control-label">CGI 程序</label>
139
+ <div class="col-sm-10">
140
+ <select class="form-control" ng-model="drct.execcgi">
141
+ <option value="">默认全局设置</option>
142
+ <option value="+">允许执行 CGI 程序</option>
143
+ <option value="-">禁止执行 CGI 程序</option>
144
+ </select>
145
+ </div>
146
+ </div>
147
+ <div class="form-group">
148
+ <label class="col-sm-2 control-label">白名单</label>
149
+ <div class="col-sm-10">
150
+ <label class="checkbox-inline"><input ng-model="drct.allow_enable" type="checkbox">启用白名单</label>
151
+ <div class="form-inline" ng-show="drct.allow_enable" style="margin-top:10px;display:none">
152
+ <textarea class="form-control" ng-model="drct.allow" style="height:100px;"></textarea>
153
+ </div>
154
+ </div>
155
+ </div>
156
+ <div class="form-group">
157
+ <label class="col-sm-2 control-label">黑名单</label>
158
+ <div class="col-sm-10">
159
+ <label class="checkbox-inline"><input ng-model="drct.deny_enable" type="checkbox">启用黑名单</label>
160
+ <div class="form-inline" ng-show="drct.deny_enable" style="margin-top:10px;display:none">
161
+ <textarea class="form-control" ng-model="drct.deny" style="height:100px;"></textarea>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
168
+ </div>
169
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='server-alias'" id="server-alias">
170
+ <p>
171
+ <button class="btn btn-default" ng-click="add_server_alias($index)" ng-show="setting.serveralias.length==0" style="display:none">
172
+ <i class="glyphicon glyphicon-plus"></i> 添加域名
173
+ </button>
174
+ </p>
175
+ <div class="form-group form-inline" ng-repeat="alias in setting.serveralias">
176
+ <div class="input-group">
177
+ <input class="form-control" ng-model="alias.name" type="text" placeholder="请输入域名">
178
+ <div class="input-group-btn">
179
+ <button class="btn btn-default" title="删除这个别名" ng-click="del_server_alias($index)"><i class="glyphicon glyphicon-minus"></i></button>
180
+ <button class="btn btn-default" title="增加一个别名" ng-click="add_server_alias()"><i class="glyphicon glyphicon-plus"></i></button>
181
+ </div>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='advanced'" id="advanced">
186
+ <div class="form-horizontal form-horizontal-small">
187
+ <div class="form-group">
188
+ <label class="col-sm-2 control-label">管理员</label>
189
+ <div class="col-sm-10">
190
+ <input class="form-control" ng-model="setting.serveradmin" type="text" placeholder="管理员邮箱或地址">
191
+ </div>
192
+ </div>
193
+ <div class="form-group form-inline">
194
+ <label class="col-sm-2 control-label">下载限制</label>
195
+ <div class="col-sm-10">
196
+ <div class="input-group">
197
+ <input class="form-control" ng-model="setting.limit_rate" type="text" placeholder="不限制">
198
+ <span class="input-group-addon">KB / S</span>
199
+ </div>
200
+ </div>
201
+ </div>
202
+ <div class="form-group form-inline">
203
+ <label class="col-sm-2 control-label">连接限制</label>
204
+ <div class="col-sm-10">
205
+ <div class="input-group">
206
+ <input class="form-control" ng-model="setting.limit_conn" type="text" placeholder="不限制">
207
+ <span class="input-group-addon">个 / IP</span>
208
+ </div>
209
+ </div>
210
+ </div>
211
+ <div class="form-group">
212
+ <label class="col-sm-2 control-label">SSL证书</label>
213
+ <div class="col-sm-10">
214
+ <div class="input-group">
215
+ <input ng-model="setting.ssl_crt" type="text" class="form-control" placeholder="SSL证书文件">
216
+ <div class="input-group-btn">
217
+ <button class="btn btn-default" ng-click="selectsslcrt()" title="选择文件"><i class="glyphicon glyphicon-file"></i></button>
218
+ </div>
219
+ </div>
220
+ </div>
221
+ </div>
222
+ <div class="form-group">
223
+ <label class="col-sm-2 control-label">SSL密钥</label>
224
+ <div class="col-sm-10">
225
+ <div class="input-group">
226
+ <input ng-model="setting.ssl_key" type="text" class="form-control" placeholder="SSL密钥文件">
227
+ <div class="input-group-btn">
228
+ <button class="btn btn-default" ng-click="selectsslkey()" title="选择文件"><i class="glyphicon glyphicon-file"></i></button>
229
+ </div>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ <div class="form-group">
234
+ <label class="col-sm-2 control-label">重定向</label>
235
+ <div class="col-sm-10">
236
+ <label class="checkbox-inline"><input ng-model="setting.rewrite_enable" type="checkbox">启用全局 Rewrite</label>
237
+ <div class="form-inline" ng-show="setting.rewrite_enable" style="margin-top:10px;display:none">
238
+ <select class="form-control" ng-model="rewrite_template">
239
+ <option value="">常用 Rewrite 规则</option>
240
+ <option value="301_1">301跳转,保留原路径</option>
241
+ <option value="301_2">301跳转,不保留原路径</option>
242
+ <option value="302_1">302跳转,保留原路径</option>
243
+ <option value="302_2">302跳转,不保留原路径</option>
244
+ </select><br>
245
+ <textarea class="form-control" ng-model="setting.rewrite_rules" style="width:400px;height:100px;margin-top:15px;"></textarea>
246
+ </div>
247
+ </div>
248
+ </div>
249
+ </div>
250
+ </div>
251
+ </div>
252
+ <hr/>
253
+ <p>
254
+ <button class="btn btn-primary" ng-click="submit()">提交</button>
255
+ <button class="btn btn-success" ng-click="submit('active')">生效</button>
256
+ <button class="btn btn-warning" ng-show="action=='edit'" ng-click="restore()">重置</button>
257
+ <a class="btn btn-default" href="#/site?s=apache">取消</a>
258
+ </p>
259
+ </div>
260
+ </div>
261
+
262
+ <div id="selector" class="modal fade">
263
+ <div class="modal-dialog" role="document">
264
+ <div class="modal-content">
265
+ <div class="modal-header">
266
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
267
+ <h3 class="modal-title">{{selector_title}}</h3>
268
+ </div>
269
+ <div class="modal-body">
270
+ <div selector></div>
271
+ </div>
272
+ <div class="modal-footer">
273
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
274
+ </div>
275
+ </div>
276
+ </div>
277
+ </div>
@@ -0,0 +1,344 @@
1
+ <div navbar ng-init="currentItem='site'"></div>
2
+ <div ng-hide="loaded">
3
+ <div loading></div>
4
+ </div>
5
+
6
+ <div id="main" ng-init="load()" ng-show="loaded" style="display:none">
7
+ <div class="module-header">
8
+ <h3>网站管理</h3>
9
+ </div>
10
+
11
+ <div class="tabbable" ng-show="has_httpserver">
12
+ <ul class="nav nav-tabs">
13
+ <li ng-class="'active' | iftrue:activeTabName=='nginx'" ng-show="nginx_supported" style="display:none"><a href="#nginx" ng-click="loadnginx()" data-toggle="tab">Nginx</a></li>
14
+ <li ng-class="'active' | iftrue:activeTabName=='apache'" ng-show="apache_supported" style="display:none"><a href="#apache" ng-click="loadapache()" data-toggle="tab">Apache</a></li>
15
+ <li ng-class="'active' | iftrue:activeTabName=='package'" ng-show="has_httpserver" style="display:none"><a href="#package" ng-click="loadpackage()" data-toggle="tab">快速安装网站系统</a></li>
16
+ <li ng-class="'active' | iftrue:activeTabName=='subDomain'" ng-show="false" style="display:none"><a href="#subDomain" ng-click="sec('subDomain')" data-toggle="tab">快速创建子站点</a></li>
17
+ </ul>
18
+ <div class="tab-content">
19
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='nginx'" ng-show="nginx_supported" style="display:none" id="nginx">
20
+ <div ng-show="nginxloading"><div waiting></div></div>
21
+ <div ng-show="!nginxloading">
22
+ <div class="pull-left"><h5>站点列表</h5></div>
23
+ <div class="pull-right">
24
+ <div class="btn-group btn-group-sm">
25
+ <button class="btn btn-default" title="刷新列表" disabled><i class="glyphicon glyphicon-refresh"></i></button>
26
+ <a class="btn btn-default btn-sm" href="#/site/nginx/new"><span class="glyphicon glyphicon-plus"></span> 新建站点</a>
27
+ </div>
28
+ <div class="btn-group btn-group-sm">
29
+ <button class="btn btn-default" title="重启 Nginx" ng-click="nginx_set_status('restart')" ng-disabled="nginxloading || !nginx_supported || nginx_status=='stopped'"><i class="glyphicon glyphicon-repeat"></i></button>
30
+ <button class="btn btn-default" title="启动 Nginx" ng-click="nginx_set_status('start')" ng-disabled="nginxloading || !nginx_supported || nginx_status=='running'"><i class="glyphicon glyphicon-play"></i></button>
31
+ <button class="btn btn-default" title="停止 Nginx" ng-click="nginx_set_status('stop')" ng-disabled="nginxloading || !nginx_supported || nginx_status=='stopped'"><i class="glyphicon glyphicon-stop"></i></button>
32
+ <a class="btn btn-default btn-sm" role="button" href="#/service/nginx?s=setting" title="设置 Nginx" ng-disabled="nginxloading || !nginx_supported">
33
+ <span class="glyphicon glyphicon-wrench"></span>
34
+ </a>
35
+ </div>
36
+ </div>
37
+ <table class="table table-hover table-bordered table-condensed">
38
+ <thead>
39
+ <tr>
40
+ <th style="width: 20px;" class="text-right">#</th>
41
+ <th style="width: 50px;">状态</th>
42
+ <th>域名</th>
43
+ <th style="width: 140px;">绑定地址</th>
44
+ <th style="width: 210px;">站点引擎</th>
45
+ <th style="width: 110px;">操作</th>
46
+ </tr>
47
+ </thead>
48
+ <tbody>
49
+ <tr ng-show="nginxservers.length==0">
50
+ <td colspan="6">尚未添加站点。</td>
51
+ </tr>
52
+ <tr ng-repeat="server in nginxservers">
53
+ <td class="text-right">{{$index+1}}</td>
54
+ <td ng-bind-html-unsafe="server.status | site.status"></td>
55
+ <td>
56
+ <span ng-repeat="server_name in server.server_names">
57
+ <a href="http{{'s' | iftrue:server.listens[0].port=='443'}}://{{server_name}}" target="_blank" ng-show="server_name!='_'">{{server_name}}</a>
58
+ <span ng-show="server_name=='_'">任意域名</span>
59
+ <br>
60
+ </span>
61
+ </td>
62
+ <td>
63
+ <span ng-repeat="listen in server.listens">
64
+ {{listen.ip | site.ip}}:{{listen.port}}
65
+ <span ng-show="listen.port==443||listen.port==80">({{listen.port | site.port}})</span>
66
+ <span ng-show="listen.default_server">(默认)</span>
67
+ <br>
68
+ </span>
69
+ </td>
70
+ <td>
71
+ <span ng-repeat="engine in server.engines">{{engine | site.engine}}<span ng-show="$index<server.engines.length-1">+</span></span>
72
+ </td>
73
+ <td>
74
+ <div class="btn-group">
75
+ <a class="btn btn-default btn-xs" title="设置站点" href="#/site/nginx/edit_{{server.listens[0].ip}}_{{server.listens[0].port}}_{{server.server_names[0]}}">
76
+ <i class="glyphicon glyphicon-wrench"></i>
77
+ </a>
78
+ <button class="btn btn-default btn-xs" ng-show="server.status!='on'" title="启用该站点" ng-click="change_server('nginx', 'enable', server.server_names[0], server.listens[0].ip, server.listens[0].port)">
79
+ <i class="glyphicon glyphicon-play"></i>
80
+ </button>
81
+ <button class="btn btn-default btn-xs" ng-show="server.status=='on'" title="停用该站点" ng-click="change_server('nginx', 'disable', server.server_names[0], server.listens[0].ip, server.listens[0].port)">
82
+ <i class="glyphicon glyphicon-stop"></i>
83
+ </button>
84
+ <button class="btn btn-default btn-xs" title="删除该站点" ng-click="delete_server_confirm('nginx', server.server_names[0], server.listens[0].ip, server.listens[0].port)">
85
+ <i class="glyphicon glyphicon-remove"></i>
86
+ </button>
87
+ </div>
88
+ </td>
89
+ </tr>
90
+ </tbody>
91
+ </table>
92
+ </div>
93
+ </div>
94
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='apache'" ng-show="apache_supported" style="display:none" id="apache">
95
+ <div ng-show="apacheloading"><div waiting></div></div>
96
+ <div class="pull-left" ng-show="!apacheloading"><h5>站点列表</h5></div>
97
+ <div class="pull-right" ng-show="!apacheloading">
98
+ <div class="btn-group btn-group-sm">
99
+ <button class="btn btn-default" title="刷新列表" disabled><i class="glyphicon glyphicon-refresh"></i></button>
100
+ <a class="btn btn-default" href="#/site/apache/new"><i class="glyphicon glyphicon-plus"></i> 新建站点</a>
101
+ </div>
102
+ <div class="btn-group btn-group-sm">
103
+ <button class="btn btn-default" title="重启 Apache" ng-click="apache_set_status('restart')" ng-disabled="apacheloading || !apache_supported || apache_status=='stopped'"><i class="glyphicon glyphicon-repeat"></i></button>
104
+ <button class="btn btn-default" title="启动 Apache" ng-click="apache_set_status('start')" ng-disabled="apacheloading || !apache_supported || apache_status=='running'"><i class="glyphicon glyphicon-play"></i></button>
105
+ <button class="btn btn-default" title="停止 Apache" ng-click="apache_set_status('stop')" ng-disabled="apacheloading || !apache_supported || apache_status=='stopped'"><i class="glyphicon glyphicon-stop"></i></button>
106
+ <a class="btn btn-default" role="button" href="#/service/apache?s=setting" title="设置 Apache" ng-disabled="nginxloading || !nginx_supported">
107
+ <span class="glyphicon glyphicon-wrench"></span>
108
+ </a>
109
+ </div>
110
+ </div>
111
+ <table class="table table-hover table-bordered table-condensed" ng-show="!apacheloading">
112
+ <thead>
113
+ <tr>
114
+ <th style="width: 20px;" class="text-right">#</th>
115
+ <th style="width: 50px;">状态</th>
116
+ <th>域名</th>
117
+ <th style="width: 140px;">绑定地址</th>
118
+ <th style="width: 210px;">站点类型</th>
119
+ <th style="width: 110px;">操作</th>
120
+ </tr>
121
+ </thead>
122
+ <tbody>
123
+ <tr ng-show="apacheservers.length==0">
124
+ <td colspan="6">尚未添加站点。</td>
125
+ </tr>
126
+ <tr ng-repeat="server in apacheservers">
127
+ <td class="text-right">{{$index+1}}</td>
128
+ <td ng-bind-html-unsafe="server.status | site.status"></td>
129
+ <td>
130
+ <span><a href="http{{'s' | iftrue:server.port=='443'}}://{{server.servername}}" target="_blank" ng-show="server.servername!='_'">{{server.servername}}</a></span>
131
+ <span ng-show="server.servername=='_'">任意域名</span>
132
+ <br>
133
+ <span ng-repeat="server_name in server.serveralias">
134
+ <a href="http{{'s' | iftrue:server.port=='443'}}://{{server_name}}" target="_blank" ng-show="server_name!='_'">{{server_name}}</a>
135
+ <span ng-show="server_name=='_'">任意域名</span>
136
+ <br>
137
+ </span>
138
+ </td>
139
+ <td>
140
+ {{server.ip | site.ip}}:{{server.port}}
141
+ <span ng-show="server.port==443||server.port==80">({{server.port | site.port}})</span>
142
+ <span ng-show="listen.default_server">(默认)</span>
143
+ </td>
144
+ <td>
145
+ <span ng-repeat="engine in server.engines">{{engine | site.engine}}<span ng-show="$index<server.engines.length-1">+</span></span>
146
+ </td>
147
+ <td>
148
+ <div class="btn-group">
149
+ <a class="btn btn-default btn-xs" title="管理站点文件" href="#/file?path=/{{server.documentroot}}">
150
+ <i class="glyphicon glyphicon-folder-open"></i>
151
+ </a>
152
+ <a class="btn btn-default btn-xs" title="设置站点" href="#/site/apache/edit_{{server.ip}}_{{server.port}}_{{server.servername}}">
153
+ <i class="glyphicon glyphicon-wrench"></i>
154
+ </a>
155
+ <button class="btn btn-default btn-xs" ng-show="server.status!='on'" title="启用该站点" ng-click="change_server('apache', 'enable', server.servername, server.ip, server.port)">
156
+ <i class="glyphicon glyphicon-play"></i>
157
+ </button>
158
+ <button class="btn btn-default btn-xs" ng-show="server.status=='on'" title="停用该站点" ng-click="change_server('apache', 'disable', server.servername, server.ip, server.port)">
159
+ <i class="glyphicon glyphicon-stop"></i>
160
+ </button>
161
+ <button class="btn btn-default btn-xs" title="删除该站点" ng-click="delete_server_confirm('apache', server.servername, server.ip, server.port)">
162
+ <i class="glyphicon glyphicon-remove"></i>
163
+ </button>
164
+ </div>
165
+ </td>
166
+ </tr>
167
+ </tbody>
168
+ </table>
169
+ </div>
170
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='package'" id="package">
171
+ <div ng-show="packageloading"><div waiting></div></div>
172
+ <div ng-show="!packageloading">
173
+ <div class="well" ng-show="site_packages.length==0">未找到网站程序。</div>
174
+ <table class="table table-hover table-bordered table-condensed" ng-repeat="cate in site_packages">
175
+ <thead>
176
+ <tr>
177
+ <th colspan="3">{{cate.name}}</th>
178
+ </tr>
179
+ </thead>
180
+ <tbody>
181
+ <tr ng-repeat="package in cate.packages">
182
+ <td style="width: 120px;">
183
+ <a href="{{package.official_site}}" target="_blank">{{package.name}}</a>
184
+ </td>
185
+ <td style="width: 380px;" class="muted">{{package.description}}</td>
186
+ <td style="width: 100px;">
187
+ <button class="btn btn-default btn-xs" ng-click="package_install_setting(package)">开始安装</button>
188
+ </td>
189
+ </tr>
190
+ </tbody>
191
+ </table>
192
+ </div>
193
+ </div>
194
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='subDomain'" id="subDomain">
195
+ <div class="panel panel-default">
196
+ <div class="panel-heading">
197
+ <div class="panel-title">
198
+ <i class="glyphicon glyphicon-plus"></i>
199
+ <span> 创建子站点</span>
200
+ </div>
201
+ </div>
202
+ <div class="panel-body form-horizontal form-horizontal-small">
203
+ <div class="form-group form-inline">
204
+ <label class="col-sm-2 control-label">站点域名</label>
205
+ <div class="col-sm-10">
206
+ <input class="form-control" type="text" ng-disabled="processing" ng-model="site.domain" autofocus placeholder="请输入域名">
207
+ </div>
208
+ </div>
209
+ <div class="form-group form-inline">
210
+ <label class="col-sm-2 control-label">FTP 信息</label>
211
+ <div class="col-sm-10">
212
+ <div class="control-group">
213
+ <label class="control-label">用户名</label>
214
+ <div class="controls">
215
+ <input class="form-control" type="text" ng-disabled="processing" ng-model="server_name.ftp_user" placeholder="请输入FTP用户名">
216
+ </div>
217
+ </div>
218
+ <div class="control-group">
219
+ <label class="control-label">密码</label>
220
+ <div class="controls">
221
+ <input class="form-control" type="text" ng-disabled="processing" ng-model="server_name.ftp_user" placeholder="请输入FTP密码">
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </div>
226
+ <div class="form-group form-inline">
227
+ <label class="col-sm-2 control-label">SVN </label>
228
+ <div class="col-sm-10">
229
+ <input class="form-control" type="text" ng-disabled="processing" ng-model="server_name.name" autofocus placeholder="请输入域名">
230
+ </div>
231
+ </div>
232
+ <div class="form-group form-inline">
233
+ <label class="col-sm-2 control-label">数据库</label>
234
+ <div class="col-sm-10">
235
+ <input class="form-control" type="text" ng-disabled="processing" ng-model="server_name.name" autofocus placeholder="请输入域名">
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ </div>
243
+ <div ng-hide="has_httpserver" value="install" style="display:none">
244
+ <div class="well">
245
+ <p>系统检测到您还未安装 HTTP 服务器。</p>
246
+ <p>请先安装任意一款 HTTP 服务器后继续操作。</p>
247
+ <p style="padding-top: 10px;"><a class="btn btn-default" href="#/service?s=http">立即安装</a></p>
248
+ </div>
249
+ </div>
250
+ </div>
251
+
252
+ <div id="pkg_install_setting" class="modal fade">
253
+ <div class="modal-dialog" role="document">
254
+ <div class="modal-content">
255
+ <div class="modal-header">
256
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
257
+ <h3 class="modal-title">{{curpkg.name}} 安装设置</h3>
258
+ </div>
259
+ <div class="modal-body">
260
+ <h5>请选择要安装的版本</h5>
261
+ <table class="table table-condensed" style="width: 350px;">
262
+ <thead>
263
+ <tr>
264
+ <th>版本名称</th>
265
+ <th>大小</th>
266
+ <th>选择</th>
267
+ </tr>
268
+ </thead>
269
+ <tbody>
270
+ <tr ng-repeat="v in curpkg.versions">
271
+ <td>{{v.name}}</td>
272
+ <td>{{v.size}}</td>
273
+ <td><input type="radio" name="pkgver" ng-model="pkgver" ng-click="package_version_select(v)" value="{{v.code}}"></td>
274
+ </tr>
275
+ </tbody>
276
+ </table>
277
+ <h5>请设置要安装到的目录</h5>
278
+ <div class="input-group">
279
+ <input class="form-control" ng-model="installpath" type="text" placeholder="网站系统的安装目录">
280
+ <div class="input-group-btn">
281
+ <button class="btn btn-default" ng-click="selectinstallpath()"><i class="glyphicon glyphicon-folder-open"></i></button>
282
+ </div>
283
+ </div>
284
+ </div>
285
+ <div class="modal-footer">
286
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
287
+ <button class="btn btn-primary" onclick="$('#pkg_install_setting').modal('hide')" ng-click="package_install()">开始安装</button>
288
+ </div>
289
+ </div>
290
+ </div>
291
+ </div>
292
+
293
+ <div id="confirm" class="modal fade">
294
+ <div class="modal-dialog" role="document">
295
+ <div class="modal-content">
296
+ <div class="modal-header">
297
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
298
+ <h3 class="modal-title">{{confirm_title}}</h3>
299
+ </div>
300
+ <div class="modal-body" ng-bind-html-unsafe="confirm_body">
301
+ </div>
302
+ <div class="modal-footer">
303
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true" ng-click="cancel()">取消</button>
304
+ <button class="btn btn-primary" onclick="$('#confirm').modal('hide')" ng-click="confirm()">确定</button>
305
+ </div>
306
+ </div>
307
+ </div>
308
+ </div>
309
+
310
+ <div id="delete-server-confirm" class="modal fade">
311
+ <div class="modal-dialog" role="document">
312
+ <div class="modal-content">
313
+ <div class="modal-header">
314
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
315
+ <h3 class="modal-title">删除 <span style="text-transform: capitalize;">{{current_server.type}}</span> 站点</h3>
316
+ </div>
317
+ <div class="modal-body">
318
+ <p>确认删除 “{{current_server.name}}:{{current_server.port}}” 这个站点?</p>
319
+ <p class="text-error">注意:此处仅删除站点配置文件,网站的其它数据不受影响。</p>
320
+ </div>
321
+ <div class="modal-footer">
322
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
323
+ <button class="btn btn-primary" onclick="$('#delete-server-confirm').modal('hide')" ng-click="delete_server()">确定</button>
324
+ </div>
325
+ </div>
326
+ </div>
327
+ </div>
328
+
329
+ <div id="selector" class="modal fade">
330
+ <div class="modal-dialog" role="document">
331
+ <div class="modal-content">
332
+ <div class="modal-header">
333
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
334
+ <h3 class="modal-title">{{selector_title}}</h3>
335
+ </div>
336
+ <div class="modal-body">
337
+ <div selector></div>
338
+ </div>
339
+ <div class="modal-footer">
340
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
341
+ </div>
342
+ </div>
343
+ </div>
344
+ </div>