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,103 @@
1
+ <div navbar ng-init="currentItem='utils.autofm'"></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>自动格式化挂载</h3>
9
+ </div>
10
+
11
+ <div style="display:none" ng-show="diskcount==0">
12
+ <div class="panel panel-default">
13
+ <div class="panel-heading">
14
+ <div class="panel-title">没有检测到未挂载的存储设备</div>
15
+ </div>
16
+ <div class="panel-body">
17
+ <p>您可以点击磁盘管理按钮,查看所有存储设备。</p>
18
+ <p>
19
+ <a class="btn btn-default" href="#/utils">取消返回</a>
20
+ <a class="btn btn-default" href="#/storage">磁盘管理</a>
21
+ </p>
22
+ </div>
23
+ </div>
24
+ </div>
25
+
26
+ <div style="display:none" ng-init="loadDiskinfo()" ng-show="diskcount > 0">
27
+ <h5>未挂载的设备列表</h5>
28
+ <table class="table table-bordered table-hover table-condensed">
29
+ <thead>
30
+ <tr>
31
+ <th>设备名称</td>
32
+ <th style="width:100px">存储空间</th>
33
+ <th style="width:200px">操作</th>
34
+ </tr>
35
+ </thead>
36
+ <tbody>
37
+ <tr ng-repeat="partition in diskinfo['partitions'] | filter:{'is_hw':true, 'is_pv':false, 'partcount':0, 'mount':''}">
38
+ <td>{{ partition['name'] }}</td>
39
+ <td>{{ partition['size'] }}</td>
40
+ <td>
41
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-click="confirm(partition['name'])">格式化并挂载</button>
42
+ </td>
43
+ </tr>
44
+ </tbody>
45
+ </table>
46
+ </div>
47
+ </div>
48
+
49
+ <div id="confirm" class="modal fade">
50
+ <div class="modal-dialog" role="document">
51
+ <div class="modal-content">
52
+ <div class="modal-header">
53
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
54
+ <h3 class="modal-title">自动格式化并挂载 {{devname}} </h3>
55
+ </div>
56
+ <div class="modal-body">
57
+ <form class="form-horizontal" onsubmit="return false">
58
+ <div class="form-group form-inline">
59
+ <label class="col-sm-3 control-label">文件系统格式:</label>
60
+ <div class="col-sm-9">
61
+ <select class="form-control" ng-model="fstype" ng-options="fs for fs in supportfs"></select>
62
+ </div>
63
+ </div>
64
+ <div class="form-group form-inline">
65
+ <label class="col-sm-3 control-label">将 {{devname}} 挂载到:</label>
66
+ <div class="col-sm-9">
67
+ <div class="input-group">
68
+ <input type="text" class="form-control" ng-model="mountpoint" ng-disabled="processing">
69
+ <span class="input-group-btn">
70
+ <button class="btn btn-default" ng-click="selectmountpoint()" title="选择挂载点">
71
+ <i class="glyphicon glyphicon-folder-open"></i>
72
+ </button>
73
+ </span>
74
+ </div>
75
+ <label>建议直接使用默认挂载点</span>
76
+ </div>
77
+ </div>
78
+ </form>
79
+ </div>
80
+ <div class="modal-footer">
81
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
82
+ <button class="btn btn-primary" onclick="$('#confirm').modal('hide')" ng-disabled="!fstype||!mountpoint" ng-click="autofm()">确定</button>
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
87
+
88
+ <div id="selector" class="modal fade">
89
+ <div class="modal-dialog" role="document">
90
+ <div class="modal-content">
91
+ <div class="modal-header">
92
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
93
+ <h3 class="modal-title">{{selector_title}}</h3>
94
+ </div>
95
+ <div class="modal-body">
96
+ <div selector></div>
97
+ </div>
98
+ <div class="modal-footer">
99
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
100
+ </div>
101
+ </div>
102
+ </div>
103
+ </div>
@@ -0,0 +1,42 @@
1
+ <div navbar ng-init="currentItem='utils.backup'"></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>备份管理</h3>
9
+ </div>
10
+ <p>备份管理功能即将推出,敬请留意 InPanel 的版本更新。<a href="#/setting?s=upversion">检测新版本</a></p>
11
+ <div class="tabbable" ng-init="load()">
12
+ <ul class="nav nav-tabs">
13
+ <li ng-class="'active' | iftrue:activeTabName=='files'">
14
+ <a href="#files" ng-click="sec('files')" data-toggle="tab">文件备份</a>
15
+ </li>
16
+ <li ng-class="'active' | iftrue:activeTabName=='database'">
17
+ <a href="#database" ng-click="sec('database')" data-toggle="tab">数据库备份</a>
18
+ </li>
19
+ <li ng-class="'active' | iftrue:activeTabName=='remote'">
20
+ <a href="#remote" ng-click="sec('remote')" data-toggle="tab">远程备份</a>
21
+ </li>
22
+ </ul>
23
+ <div class="tab-content">
24
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='files'" id="files">
25
+ <div>
26
+ <p>文件备份列表、新增、删除、下载、恢复</p>
27
+ </div>
28
+ </div>
29
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='database'" id="database">
30
+ <div>
31
+ <p>数据库备份列表、增加、删除、下载、恢复</p>
32
+ </div>
33
+ </div>
34
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='remote'" id="remote">
35
+ <div>
36
+ <p>远程备份服务器:列表、配置、新增、删除</p>
37
+ <p>远程备份定时任务:列表、新增、编辑、修改、删除、执行</p>
38
+ </div>
39
+ </div>
40
+ </div>
41
+ </div>
42
+ </div>
@@ -0,0 +1,360 @@
1
+ <div navbar ng-init="currentItem='utils.storage'"></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>磁盘管理</h3>
9
+ </div>
10
+
11
+ <div class="tabbable" ng-init="load()">
12
+ <ul class="nav nav-tabs">
13
+ <li ng-class="'active' | iftrue:activeTabName=='local'"><a href="#local" ng-click="tab_sec('local')" data-toggle="tab">本地磁盘</a></li>
14
+ <li ng-class="'active' | iftrue:activeTabName=='remote'"><a href="#remote" ng-click="tab_sec('remote')" data-toggle="tab">网络磁盘</a></li>
15
+ </ul>
16
+ <div class="tab-content">
17
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='local'" id="local">
18
+ <div ng-show="virt == 'Virtuozzo/OpenVZ'">
19
+ 在 Virtuozzo/OpenVZ 虚拟化平台下无法使用磁盘分区功能
20
+ </div>
21
+ <div style="display:none;" ng-show="virt != 'Virtuozzo/OpenVZ' && virt != '?'">
22
+ <div style="display:none" ng-show="diskinfo['count'] > 0">
23
+ <div>
24
+ <h5 class="pull-left">物理分区管理</h5>
25
+ <button class="btn btn-default btn-sm pull-right" title="刷新磁盘列表" ng-click="get_diskinfo()" ng-disabled="!loaded"><i class="glyphicon glyphicon-refresh"></i></button>
26
+ </div>
27
+ <div class="table-responsive">
28
+ <table class="table table-bordered table-hover table-condensed">
29
+ <tbody ng-repeat="partition in diskinfo['partitions']">
30
+ <tr class="warning">
31
+ <td style="width:80px;">设备{{$index+1}}</td>
32
+ <td style="width:60px;">分区</td>
33
+ <td style="width:70px;">大小</td>
34
+ <td style="width:70px;">文件系统</td>
35
+ <td style="width:90px;">挂载点</td>
36
+ <td style="width:200px;">操作</td>
37
+ </tr>
38
+ <tr>
39
+ <td>{{ partition['name'] | iftrue:partition['is_hw'] }}</td>
40
+ <td>{{ partition['name'] | iftrue:!partition['is_hw'] }}</td>
41
+ <td>{{ partition['size'] }}</td>
42
+ <td>{{ partition['fstype'] | iftrue:!partition['is_pv']&&partition['partcount']==0 }}{{ 'LVM卷' | iftrue:partition['is_pv'] }}</td>
43
+ <td>{{ partition['mount'] }}</td>
44
+ <td>
45
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!partition['is_pv']&&!partition['mount']&&partition['fstype']=='swap'&&partition['partcount']==0" ng-click="swaponconfirm(partition['name'])">启用</button>
46
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!partition['is_pv']&&partition['mount']&&partition['fstype']=='swap'&&partition['partcount']==0" ng-click="swapoffconfirm(partition['name'])">停用</button>
47
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!partition['is_pv']&&!partition['mount']&&partition['fstype']!='swap'&&partition['fstype']&&partition['partcount']==0" ng-click="mountconfirm(partition['name'], partition['fstype'])">挂载</button>
48
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!partition['is_pv']&&partition['mount']&&partition['fstype']!='swap'&&partition['partcount']==0" ng-click="umountconfirm(partition['name'])">卸载</button>
49
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!partition['is_pv']&&!partition['mount']&&partition['partcount']==0" ng-click="formatconfirm(partition['name'])">格式化</button>
50
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="partition['is_hw']&&!partition['is_pv']&&!partition['mount']" ng-click="scanpartconfirm(partition['name'])">扫描</button>
51
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="partition['is_hw']&&!partition['is_pv']&&!partition['mount']&&partition['unpartition']!='0'&&partition['partcount']<4" ng-click="addpartconfirm(partition['name'], partition['unpartition'])">新建分区</button>
52
+ </td>
53
+ </tr>
54
+ <tr ng-repeat="subpart in partition['partitions'] | filter: {'is_lv': false}">
55
+ <td>{{ subpart['name'] | iftrue:subpart['is_hw'] }}</td>
56
+ <td>{{ subpart['name'] | iftrue:!subpart['is_hw'] }}</td>
57
+ <td>{{ subpart['size'] }}</td>
58
+ <td>{{ subpart['fstype'] | iftrue:!subpart['is_pv'] }}{{ 'LVM卷' | iftrue: subpart['is_pv'] }}</td>
59
+ <td>{{ subpart['mount'] }}</td>
60
+ <td>
61
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!subpart['is_pv']&&!subpart['mount']&&subpart['fstype']=='swap'&&subpart['partcount']==0" ng-click="swaponconfirm(subpart['name'])">启用</button>
62
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!subpart['is_pv']&&subpart['mount']&&subpart['fstype']=='swap'&&subpart['partcount']==0" ng-click="swapoffconfirm(subpart['name'])">停用</button>
63
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!subpart['is_pv']&&!subpart['mount']&&subpart['fstype']!='swap'&&subpart['fstype']&&subpart['partcount']==0" ng-click="mountconfirm(subpart['name'], subpart['fstype'])">挂载</button>
64
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!subpart['is_pv']&&subpart['mount']&&subpart['fstype']!='swap'&&subpart['partcount']==0" ng-click="umountconfirm(subpart['name'])">卸载</button>
65
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!subpart['is_pv']&&!subpart['mount']&&subpart['partcount']==0" ng-click="formatconfirm(subpart['name'])">格式化</button>
66
+ <button class="btn btn-default btn-xs" ng-disabled="waiting" ng-show="!subpart['is_hw']&&!subpart['is_pv']&&!subpart['mount']" ng-click="delpartconfirm(subpart['name'])">删除分区</button>
67
+ </td>
68
+ </tr>
69
+ </tbody>
70
+ </table>
71
+ </div>
72
+ </div>
73
+
74
+ <div style="margin-top:40px;display:none" ng-show="diskinfo['lvscount'] > 0">
75
+ <h5>LVM逻辑卷(只读)</h5>
76
+ <table class="table table-bordered table-hover table-condensed">
77
+ <tbody>
78
+ <tr class="warning">
79
+ <td style="width:100px;">设备</td>
80
+ <td>卷名</td>
81
+ <td style="width:100px;">大小</td>
82
+ <td style="width:100px;">文件系统</td>
83
+ <td style="width:200px;">挂载点</td>
84
+ </tr>
85
+ <tr ng-repeat="partition in diskinfo['lvm']['partitions']">
86
+ <td>{{ partition['name'] }}</td>
87
+ <td>{{ partition['vname'] }}</td>
88
+ <td>{{ partition['size'] }}</td>
89
+ <td>{{ partition['fstype'] }}</td>
90
+ <td>{{ partition['mount'] }}</td>
91
+ </tr>
92
+ </tbody>
93
+ </table>
94
+ </div>
95
+ </div>
96
+ </div>
97
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='remote'" id="remote">
98
+ <div>
99
+ <h5 class="pull-left">网络磁盘(开发中)</h5>
100
+ <div class="btn-group btn-group-sm pull-right">
101
+ <button class="btn btn-default" title="刷新磁盘列表" ng-disabled="!loaded"><i class="glyphicon glyphicon-refresh"></i></button>
102
+ <a class="btn btn-default" href="#/storage/remote/new" title="添加网络磁盘" ng-disabled="!loaded"><i class="glyphicon glyphicon-plus"></i></a>
103
+ </div>
104
+ </div>
105
+ <div class="table-responsive">
106
+ <table class="table table-hover table-bordered table-condensed">
107
+ <thead>
108
+ <tr>
109
+ <th style="width:50px;">序号</th>
110
+ <th style="width:50px;">类型</th>
111
+ <th>名称</th>
112
+ <th>存储容量</th>
113
+ <th>流量</th>
114
+ <th>挂载点</th>
115
+ <th style="width:130px">操作</th>
116
+ </tr>
117
+ </thead>
118
+ <tbody>
119
+ <tr>
120
+ <td>1</td>
121
+ <td>FTP</td>
122
+ <td>国内服务器</td>
123
+ <td>10.4G/100G</td>
124
+ <td>10.4G</td>
125
+ <td>/data</td>
126
+ <td>
127
+ <a class="btn btn-default btn-xs" href="#/storage/remote/edit">编辑</a>
128
+ <button class="btn btn-default btn-xs">删除</button>
129
+ </td>
130
+ </tr>
131
+ <tr>
132
+ <td>2</td>
133
+ <td>WebDAV</td>
134
+ <td>坚果云</td>
135
+ <td>10.4G/无限</td>
136
+ <td>500M/1G</td>
137
+ <td>/important/backup</td>
138
+ <td>
139
+ <a class="btn btn-default btn-xs" href="#/storage/remote/edit_webdav_abc.com">编辑</a>
140
+ <button class="btn btn-default btn-xs">删除</button>
141
+ </td>
142
+ </tr>
143
+ </tbody>
144
+ </table>
145
+ </div>
146
+ </div>
147
+ </div>
148
+ </div>
149
+ </div>
150
+
151
+ <div id="swaponconfirm" class="modal fade">
152
+ <div class="modal-dialog">
153
+ <div class="modal-content">
154
+ <div class="modal-header">
155
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
156
+ <h3 class="modal-title">启用交换分区 {{devname}} </h3>
157
+ </div>
158
+ <div class="modal-body">
159
+ <p>确定要启用交换分区 {{devname}} 吗?</p>
160
+ </div>
161
+ <div class="modal-footer">
162
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
163
+ <button class="btn btn-primary" onclick="$('#swaponconfirm').modal('hide')" ng-click="swapon()">确定</button>
164
+ </div>
165
+ </div>
166
+ </div>
167
+ </div>
168
+
169
+ <div id="swapoffconfirm" class="modal fade">
170
+ <div class="modal-dialog">
171
+ <div class="modal-content">
172
+ <div class="modal-header">
173
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
174
+ <h3 class="modal-title">停用交换分区 {{devname}} </h3>
175
+ </div>
176
+ <div class="modal-body">
177
+ <p>确定要停用交换分区 {{devname}} 吗?</p>
178
+ </div>
179
+ <div class="modal-footer">
180
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
181
+ <button class="btn btn-primary" onclick="$('#swapoffconfirm').modal('hide')" ng-click="swapoff()">确定</button>
182
+ </div>
183
+ </div>
184
+ </div>
185
+ </div>
186
+
187
+ <div id="umountconfirm" class="modal fade">
188
+ <div class="modal-dialog">
189
+ <div class="modal-content">
190
+ <div class="modal-header">
191
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
192
+ <h3 class="modal-title">卸载 {{devname}} </h3>
193
+ </div>
194
+ <div class="modal-body">
195
+ <p>确定要卸载 {{devname}} 吗?</p>
196
+ </div>
197
+ <div class="modal-footer">
198
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
199
+ <button class="btn btn-warning" onclick="$('#umountconfirm').modal('hide')" ng-click="umount()">确定</button>
200
+ </div>
201
+ </div>
202
+ </div>
203
+ </div>
204
+
205
+ <div id="mountconfirm" class="modal fade">
206
+ <div class="modal-dialog">
207
+ <div class="modal-content">
208
+ <div class="modal-header">
209
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
210
+ <h3 class="modal-title">挂载 {{devname}}</h3>
211
+ </div>
212
+ <div class="modal-body">
213
+ <form class="form-horizontal" onsubmit="return false">
214
+ <div class="form-group form-inline">
215
+ <label class="col-sm-4 control-label">将 {{devname}} 挂载到:</label>
216
+ <div class="col-sm-8">
217
+ <div class="input-group">
218
+ <input type="text" class="form-control" ng-model="mountpoint" ng-disabled="processing" placeholder="选择挂载点">
219
+ <div class="input-group-btn">
220
+ <button class="btn btn-default" ng-click="selectmountpoint()" title="选择挂载点"><i class="glyphicon glyphicon-folder-open"></i></button>
221
+ </div>
222
+ </div>
223
+ </div>
224
+ </div>
225
+ </form>
226
+ </div>
227
+ <div class="modal-footer">
228
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
229
+ <button class="btn btn-primary" onclick="$('#mountconfirm').modal('hide')" ng-click="mount()">确定</button>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ </div>
234
+
235
+ <div id="formatconfirm" class="modal fade">
236
+ <div class="modal-dialog">
237
+ <div class="modal-content">
238
+ <div class="modal-header">
239
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
240
+ <h3 class="modal-title">格式化 {{devname}} </h3>
241
+ </div>
242
+ <div class="modal-body">
243
+ <form class="form-horizontal" onsubmit="return false">
244
+ <div class="form-group form-inline">
245
+ <label class="col-sm-3 control-label">文件系统格式:</label>
246
+ <div class="col-sm-9">
247
+ <select class="form-control" ng-model="fstype" ng-options="fs for fs in supportfs"></select>
248
+ </div>
249
+ </div>
250
+ </form>
251
+ </div>
252
+ <div class="modal-footer">
253
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
254
+ <button class="btn btn-danger" onclick="$('#formatconfirm').modal('hide')" ng-click="format()">确定</button>
255
+ </div>
256
+ </div>
257
+ </div>
258
+ </div>
259
+
260
+ <div id="addpartconfirm" class="modal fade">
261
+ <div class="modal-dialog">
262
+ <div class="modal-content">
263
+ <div class="modal-header">
264
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
265
+ <h3 class="modal-title">在 {{devname}} 下添加分区</h3>
266
+ </div>
267
+ <div class="modal-body">
268
+ <div class="alert alert-info">
269
+ <p>提示:</p>
270
+ <ul>
271
+ <li>不输入分区大小表示使用所有可连续分配的空间。</li>
272
+ <li>如果分区大小超过可连续分配的空间,则将使用可连续分配的空间大小。</li>
273
+ <li>每个设备下最多可创建4个分区。</li>
274
+ <li>请在分区前先卸载该设备上已挂载的分区,否则分区的修改将不可见。</li>
275
+ </ul>
276
+ </div>
277
+ <form class="form-horizontal" onsubmit="return false">
278
+ <div class="form-group form-inline">
279
+ <label class="col-sm-3 control-label">剩余空间:</label>
280
+ <div class="col-sm-9">
281
+ <p class="form-control-static">{{unpartition}}</p>
282
+ </div>
283
+ </div>
284
+ <div class="form-group form-inline">
285
+ <label class="col-sm-3 control-label">分区大小:</label>
286
+ <div class="col-sm-9">
287
+ <input class="form-control" type="text" ng-model="size" />
288
+ <select class="form-control" style="width:60px" ng-model="unit" ng-init="unit='G'" ng-options="unit for unit in ['M', 'G']"></select>
289
+ </div>
290
+ </div>
291
+ </form>
292
+ </div>
293
+ <div class="modal-footer">
294
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
295
+ <button class="btn btn-primary" onclick="$('#addpartconfirm').modal('hide')" ng-click="addpart()">确定</button>
296
+ </div>
297
+ </div>
298
+ </div>
299
+ </div>
300
+
301
+ <div id="delpartconfirm" class="modal fade">
302
+ <div class="modal-dialog">
303
+ <div class="modal-content">
304
+ <div class="modal-header">
305
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
306
+ <h3 class="modal-title">删除分区 {{devname}}</h3>
307
+ </div>
308
+ <div class="modal-body">
309
+ <div class="alert alert-danger">
310
+ <p>分区删除后,该分区中的数据将丢失!</p>
311
+ <p>确定要删除分区 {{devname}} 吗?</p>
312
+ </div>
313
+ <div class="input-group">
314
+ <span class="input-group-addon">请输入大写的 OK 后继续</span>
315
+ <input type="text" class="form-control" max-length="2" ng-model="confirmok" placeholder="输入 OK">
316
+ </div>
317
+ </div>
318
+ <div class="modal-footer">
319
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
320
+ <button class="btn btn-danger" onclick="$('#delpartconfirm').modal('hide')" ng-disabled="confirmok!='OK'" ng-click="delpart()">确定删除</button>
321
+ </div>
322
+ </div>
323
+ </div>
324
+ </div>
325
+
326
+ <div id="scanpartconfirm" class="modal fade">
327
+ <div class="modal-dialog">
328
+ <div class="modal-content">
329
+ <div class="modal-header">
330
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
331
+ <h3 class="modal-title">扫描设备 {{devname}} 的分区</h3>
332
+ </div>
333
+ <div class="modal-body">
334
+ <p>扫描分区前,请先卸载该设备下所有已挂载的分区。</p>
335
+ <p>确定要开始扫描设备 {{devname}} 吗?</p>
336
+ </div>
337
+ <div class="modal-footer">
338
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
339
+ <button class="btn btn-primary" onclick="$('#scanpartconfirm').modal('hide')" ng-click="scanpart()">确定</button>
340
+ </div>
341
+ </div>
342
+ </div>
343
+ </div>
344
+
345
+ <div id="selector" class="modal fade">
346
+ <div class="modal-dialog">
347
+ <div class="modal-content">
348
+ <div class="modal-header">
349
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
350
+ <h3 class="modal-title">{{selector_title}}</h3>
351
+ </div>
352
+ <div class="modal-body">
353
+ <div selector></div>
354
+ </div>
355
+ <div class="modal-footer">
356
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
357
+ </div>
358
+ </div>
359
+ </div>
360
+ </div>
@@ -0,0 +1,93 @@
1
+ <div navbar ng-init="currentItem='utils.migrate'"></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>文件传输</h3>
9
+ </div>
10
+ <div class="tabbable" ng-init="load()">
11
+ <ul class="nav nav-tabs">
12
+ <li ng-class="'active' | iftrue:activeTabName=='ftp'">
13
+ <a href="#ftp" ng-click="sec('ftp')" data-toggle="tab">FTP</a>
14
+ </li>
15
+ <li ng-class="'active' | iftrue:activeTabName=='nutstore'">
16
+ <a href="#nutstore" ng-click="sec('nutstore')" data-toggle="tab">坚果云(待开发)</a>
17
+ </li>
18
+ </ul>
19
+ <div class="tab-content">
20
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='ftp'" id="ftp">
21
+ <div>
22
+ <p>传输文件到FTP</p>
23
+ </div>
24
+ <div class="form-horizontal form-horizontal-small">
25
+ <div class="form-group form-inline">
26
+ <label class="col-sm-2 control-label">服务器</label>
27
+ <div class="col-sm-10">
28
+ <input class="form-control" ng-model="remote.address" type="text" placeholder="服务器地址">
29
+ </div>
30
+ </div>
31
+ <div class="form-group form-inline">
32
+ <label class="col-sm-2 control-label">授权账户</label>
33
+ <div class="col-sm-10">
34
+ <input class="form-control" ng-model="remote.account" type="text" placeholder="授权账户">
35
+ </div>
36
+ </div>
37
+ <div class="form-group form-inline">
38
+ <label class="col-sm-2 control-label">授权密码</label>
39
+ <div class="col-sm-10">
40
+ <input class="form-control" ng-model="remote.password" type="text" placeholder="授权密码">
41
+ </div>
42
+ </div>
43
+ <div class="form-group">
44
+ <label class="col-sm-2 control-label">本地路径</label>
45
+ <div class="col-sm-10">
46
+ <div class="input-group">
47
+ <span class="input-group-btn">
48
+ <button class="btn btn-default" ng-click="select_files()" title="选择文件">
49
+ <i class="glyphicon glyphicon-folder-open"></i>
50
+ </button>
51
+ </span>
52
+ <input type="text" class="form-control" ng-model="remote.source" ng-disabled="processing" placeholder="请选择本地需要迁移的文件">
53
+ </div>
54
+ </div>
55
+ </div>
56
+ <div class="form-group">
57
+ <label class="col-sm-2 control-label">目标路径</label>
58
+ <div class="col-sm-10">
59
+ <input class="form-control" ng-model="remote.target" type="text" placeholder="请输入远程服务器保存路径">
60
+ </div>
61
+ </div>
62
+ <hr/>
63
+ <p>
64
+ <button class="btn btn-primary" ng-click="migrate_ftp()">传输</button>
65
+ <button class="btn btn-warning" ng-click="reset_form()">重置</button>
66
+ </p>
67
+ </div>
68
+ </div>
69
+ <div class="tab-pane" ng-class="'active' | iftrue:activeTabName=='nutstore'" id="nutstore">
70
+ <div>
71
+ <p>文件传输到坚果云</p>
72
+ </div>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+
78
+ <div id="selector" class="modal fade" style="display: none;">
79
+ <div class="modal-dialog" role="document">
80
+ <div class="modal-content">
81
+ <div class="modal-header">
82
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
83
+ <h3 class="modal-title">{{selector_title}}</h3>
84
+ </div>
85
+ <div class="modal-body">
86
+ <div selector></div>
87
+ </div>
88
+ <div class="modal-footer">
89
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>