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,501 @@
1
+ <div navbar ng-init="currentItem='file'"></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 ng-init="load()" id="list" class="file-list">
12
+ <div class="row padding-bottom">
13
+ <div class="col-md-10 col-sm-10 col-xs-9">
14
+ <form onsubmit="return false;" ng-submit="listdir()">
15
+ <div class="input-group input-group-sm">
16
+ <span class="input-group-addon">当前目录</span>
17
+ <input class="form-control" type="text" ng-model="path">
18
+ <div class="input-group-btn">
19
+ <button class="btn btn-default btn-sm" type="submit" title="刷新"><span class="glyphicon glyphicon-refresh"></span></button>
20
+ <button class="btn btn-default btn-sm" type="submit" title="打开"><span class="glyphicon glyphicon-menu-right"></span></button>
21
+ <button class="btn btn-default btn-sm dropdown-toggle" type="button" title="快捷操作" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"><span class="caret"></span></button>
22
+ <ul class="dropdown-menu dropdown-menu-right" style="max-height: 500px; overflow-x: auto;">
23
+ <li class="dropdown-header"><span class="glyphicon glyphicon-star"></span> 常用目录</li>
24
+ <li><a ng-click="listdir('/home')">用户目录 /home</a></li>
25
+ <li><a ng-click="listdir('/var/www')">站点目录 /var/www</a></li>
26
+ <li><a ng-click="listdir('/etc')">配置目录 /etc</a></li>
27
+ <li><a ng-click="listdir('/etc/nginx')">Nginx配置 /etc/nginx</a></li>
28
+ <li><a ng-click="listdir('/etc/inpanel')">InPanel配置 /etc/inpanel</a></li>
29
+ <li role="separator" class="divider"></li>
30
+ <li class="dropdown-header"><span class="glyphicon glyphicon-time"></span> 浏览历史(最大30条)</li>
31
+ <li ng-repeat="path in path_history" ng-show="path_history.length > 0">
32
+ <a ng-click="listdir(path)">{{$index+1}}. {{path}}</a>
33
+ </li>
34
+ <li ng-show="path_history.length < 1"><a ng-click="listdir(lastpath)">1. {{lastpath}}</a></li>
35
+ </ul>
36
+ </div>
37
+ </div>
38
+ </form>
39
+ </div>
40
+ <div class="col-md-2 col-sm-2 col-xs-3">
41
+ <a class="btn btn-default btn-sm pull-right" href="#/file/trash">
42
+ <span class="glyphicon glyphicon-trash"></span> 回收站
43
+ </a>
44
+ </div>
45
+ </div>
46
+ <div class="row">
47
+ <div class="col-md-12">
48
+ <ul class="breadcrumb">
49
+ <li>路径导航:</li>
50
+ <li><a ng-click="listdir('/')">根目录</a></li>
51
+ <li ng-repeat="pathinfo in pathinfos" ng-show="pathinfos.length>0">
52
+ <a ng-click="listdir(pathinfo.path)">{{pathinfo.name}}</a>
53
+ </li>
54
+ </ul>
55
+ </div>
56
+ </div>
57
+ <div class="row">
58
+ <div class="col-md-9 pull-left">
59
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="upandlist()"><i class="glyphicon glyphicon-arrow-up"></i> 返回上级</button>
60
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="newfolder()"><i class="glyphicon glyphicon-plus-sign"></i> 新建文件夹</button>
61
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="newfile()"><i class="glyphicon glyphicon-plus-sign"></i> 新建文件</button>
62
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="upload()"><i class="glyphicon glyphicon-upload"></i> 上传文件</button>
63
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="download()"><i class="glyphicon glyphicon-download"></i> 下载资源</button>
64
+ <button class="btn btn-default btn-sm" ng-disabled="clipboard.count==0||fileloading" ng-click="paste()"><i class="glyphicon glyphicon-paste"></i> 粘贴/链接</button>
65
+ </div>
66
+ <div class="col-md-3">
67
+ <button class="btn btn-default btn-sm pull-right" data-toggle="button" ng-click="togglehidden()"><i class="glyphicon glyphicon-eye-open"></i> 显示隐藏文件和目录</button>
68
+ </div>
69
+ </div>
70
+
71
+ <div ng-show="fileloading" style="margin-top:30px;margin-bottom: 30px;">
72
+ <div waiting ng-init="waitingText='正在加载文件列表,请稍候...'"></div>
73
+ </div>
74
+
75
+ <div ng-show="!fileloading" class="table-responsive" style="margin-top:10px;">
76
+ <table class="table table-hover table-bordered table-condensed text-center">
77
+ <thead>
78
+ <tr>
79
+ <th style="width:10px"><input type="checkbox" ng-model="selectall"></th>
80
+ <th>名称</th>
81
+ <th class="text-center">大小</th>
82
+ <th class="text-center" class="text-right">用户</th>
83
+ <th class="text-center">组</th>
84
+ <th class="text-center">权限</th>
85
+ <th class="text-center" style="width:140px; min-width:140px;">修改时间</th>
86
+ <th class="text-center" style="width:150px; min-width:150px;">操作</th>
87
+ <th class="text-center" style="width:70px;">压缩</th>
88
+ <th class="text-center" style="width:80px;">其它</th>
89
+ </tr>
90
+ </thead>
91
+ <tbody>
92
+ <tr ng-show="items.length==0">
93
+ <td colspan="10">当前目录是空的。</td>
94
+ </tr>
95
+ <tr ng-class="'warning'|iftrue:clipboard.srcpath==curpath&&clipboard.items[item.name]" ng-repeat="item in items">
96
+ <td><input type="checkbox" ng-model="selects[item.name]"></td>
97
+ <td class="text-left">
98
+ <i class="glyphicon glyphicon-folder-open" title="文件夹" ng-show="item.isdir"></i>
99
+ <i class="glyphicon glyphicon-file" title="文件" ng-show="item.isreg"></i>
100
+ <i class="glyphicon glyphicon-link" title="链接" ng-show="item.islnk&&(item.link_isdir||item.link_isreg)"></i>
101
+ <i class="glyphicon glyphicon-ban-circle" title="未知" ng-show="!item.isdir&&!item.isreg&&(!item.islnk||(item.islnk&&!item.link_isdir&&!item.link_isreg))"></i>
102
+ &nbsp;
103
+ <a ng-click="listdir(curpath+'/'+item.name)" ng-show="item.isdir||(item.islnk&&item.link_isdir)">{{item.name}}</a>
104
+ <a ng-click="editfile(item.name)" ng-show="!item.is_image && (item.isreg||(item.islnk&&!item.link_isdir))">{{item.name}}</a>
105
+ <a href="/page/file/preview/{{item.uri}}" ng-show="item.is_image && !item.isdir" title="预览" target="_blank">{{item.name}}</a>
106
+ <span ng-show="item.islnk&&!item.link_broken"><br /><i class="glyphicon glyphicon-hand-right"></i> &nbsp; {{item.linkto}}</span>
107
+ <span ng-show="item.islnk&&item.link_broken">(原文件已丢失)<br /><i class="glyphicon glyphicon-hand-right"></i> &nbsp; {{item.linkto}}</span>
108
+ </td>
109
+ <td style="padding-right:15px">{{item.size}}</td>
110
+ <td><a ng-click="chownconfirm(item.name, item.uname, item.gname, item.isdir)">{{item.uname|iftrue:item.uname!=''}}{{item.uid|iftrue:item.uname==''}}</a></td>
111
+ <td><a ng-click="chownconfirm(item.name, item.uname, item.gname, item.isdir)">{{item.gname|iftrue:item.gname!=''}}{{item.gid|iftrue:item.gname==''}}</a></td>
112
+ <td><a ng-click="chmodconfirm(item.name, item.perms, item.isdir)">{{item.perms}}</a></td>
113
+ <td>{{item.mtime}}</td>
114
+ <td>
115
+ <button class="btn btn-default btn-xs" ng-click="rename(item.name)" title="重命名"><i class="glyphicon glyphicon-edit"></i></button>
116
+ <button class="btn btn-default btn-xs" ng-class="'active'|iftrue:clipboard.srcpath==curpath&&clipboard.items[item.name]=='copy'" ng-click="togglecopy(item.name)" title="复制"><i class="glyphicon glyphicon-duplicate"></i></button>
117
+ <button class="btn btn-default btn-xs" ng-class="'active'|iftrue:clipboard.srcpath==curpath&&clipboard.items[item.name]=='cut'" ng-click="togglecut(item.name)" title="剪切"><i class="glyphicon glyphicon-scissors"></i></button>
118
+ <button class="btn btn-default btn-xs" ng-class="'active'|iftrue:clipboard.srcpath==curpath&&clipboard.items[item.name]=='link'" ng-click="togglelink(item.name)" title="链接"><i class="glyphicon glyphicon-link" title="链接"></i></button>
119
+ <button class="btn btn-default btn-xs" ng-click="move2trash(item.name)" title="删除"><i class="glyphicon glyphicon-trash"></i></button>
120
+ </td>
121
+ <td>
122
+ <button class="btn btn-default btn-xs" ng-click="decompress(item.name)" ng-show="true | ifmatch:[item.name, '.*\.(zip|gz|tgz|bz2)']" title="解压">解压</button>
123
+ <button class="btn btn-default btn-xs" ng-click="compressconfirm(item.name, item.isreg)" ng-show="true | ifnotmatch:[item.name, '.*\.(zip|gz|tgz|bz2)']" title="压缩">压缩</button>
124
+ </td>
125
+ <td>
126
+ <div ng-show="item.isdir||(item.islnk&&item.link_isdir)">
127
+ <button class="btn btn-default btn-xs" ng-disabled="true" title="设置自动同步(即将推出)"><i class="glyphicon glyphicon-repeat"></i></button>
128
+ <button class="btn btn-default btn-xs" ng-disabled="true" title="设置自动备份(即将推出)"><i class="glyphicon glyphicon-cloud-upload"></i></button>
129
+ </div>
130
+ <div ng-show="item.isreg||(item.islnk&&item.link_isreg)">
131
+ <a class="btn btn-default btn-xs" href="/api/file/download/{{item.uri}}" title="下载">
132
+ <i class="glyphicon glyphicon-download-alt"></i>
133
+ </a>
134
+ <a class="btn btn-default btn-xs" href="/page/file/preview/{{item.uri}}" ng-show="item.is_image && !item.isdir" title="预览" target="_blank">
135
+ <i class="glyphicon glyphicon-eye-open"></i>
136
+ </a>
137
+ </div>
138
+ </td>
139
+ </tr>
140
+ </tbody>
141
+ </table>
142
+ </div>
143
+ <div style="margin-top:5px;height:30px;">
144
+ <div class="pull-left">
145
+ <span>批量操作:</span>
146
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="multicopy()"><i class="glyphicon glyphicon-duplicate"></i> 复制</button>
147
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="multicut()"><i class="glyphicon glyphicon-scissors"></i> 剪切</button>
148
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="multidel()"><i class="glyphicon glyphicon-remove"></i> 删除</button>
149
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="tarconfirm()"><i class="glyphicon glyphicon-compressed"></i> 打包压缩</button>
150
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="chownconfirm()"><i class="glyphicon glyphicon-user"></i> 用户和组</button>
151
+ <button class="btn btn-default btn-sm" ng-disabled="fileloading" ng-click="chmodconfirm()"><i class="glyphicon glyphicon-lock"></i> 修改权限</button>
152
+ </div>
153
+ <div class="pull-right">
154
+ </div>
155
+ </div>
156
+ </div>
157
+
158
+ <div style="display:none" id="edit">
159
+ <h4><span>正在编辑:</span>{{filepath}}</h4>
160
+ <div style="margin:15px 0;height:30px;">
161
+ <div class="pull-left">
162
+ <button class="btn btn-default btn-sm" ng-click="return2list()">
163
+ <span class="glyphicon glyphicon-chevron-left"></span> 返回文件列表
164
+ </button>
165
+ </div>
166
+ <div class="pull-right">
167
+ 字符编码:<select class="input-sm" ng-model="filecharset" style="width:120px;margin-bottom:0;margin-right:10px">
168
+ <option value="utf-8">UTF-8</option>
169
+ <option value="gb2312">GB2312</option>
170
+ <option value="gbk">GBK</option>
171
+ <option value="gb18030">GB18030</option>
172
+ <option value="big5">BIG5</option>
173
+ <option value="euc-jp">EUC-JP</option>
174
+ <option value="euc-kr">EUC-KR</option>
175
+ <option value="iso-8859-2">ISO-8859-2</option>
176
+ <option value="shift_jis">Shift_JIS</option>
177
+ </select>
178
+ <button class="btn btn-primary btn-sm" ng-click="savefile()"><span class="glyphicon glyphicon-ok"></span> 保存修改</button>
179
+ <button class="btn btn-default btn-sm" ng-click="canceledit()"><span class="glyphicon glyphicon-remove"></span> 放弃修改</button>
180
+ </div>
181
+ </div>
182
+ <div id="editor"></div>
183
+ <div style="margin:15px 0;height:30px;">
184
+ <div class="pull-left">
185
+ <button class="btn btn-default btn-sm" ng-click="return2list()">
186
+ <span class="glyphicon glyphicon-chevron-left"></span> 返回文件列表
187
+ </button>
188
+ </div>
189
+ <div class="pull-right">
190
+ 字符编码:<select class="input-sm" ng-model="filecharset" style="width:120px;margin-bottom:0;margin-right:10px">
191
+ <option value="utf-8">UTF-8</option>
192
+ <option value="gb2312">GB2312</option>
193
+ <option value="gbk">GBK</option>
194
+ <option value="gb18030">GB18030</option>
195
+ <option value="big5">BIG5</option>
196
+ <option value="euc-jp">EUC-JP</option>
197
+ <option value="euc-kr">EUC-KR</option>
198
+ <option value="iso-8859-2">ISO-8859-2</option>
199
+ <option value="shift_jis">Shift_JIS</option>
200
+ </select>
201
+ <button class="btn btn-primary btn-sm" ng-click="savefile()"><span class="glyphicon glyphicon-ok"></span> 保存修改</button>
202
+ <button class="btn btn-default btn-sm" ng-click="canceledit()"><span class="glyphicon glyphicon-remove"></span> 放弃修改</button>
203
+ </div>
204
+ </div>
205
+ </div>
206
+ </div>
207
+
208
+ <div id="overwriteconfirm" class="modal fade">
209
+ <div class="modal-dialog" role="document">
210
+ <div class="modal-content">
211
+ <div class="modal-header">
212
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
213
+ <h3 class="modal-title">操作确认</h3>
214
+ </div>
215
+ <div class="modal-body">
216
+ <p>{{overwrite_filename}} 已存在,如何处理?</p>
217
+ <div class="form-group">
218
+ <div class="radio">
219
+ <label>
220
+ <input type="radio" ng-model="overwrite_option" value="overwrite">覆盖该文件或目录
221
+ </label>
222
+ </div>
223
+ </div>
224
+ <div class="form-group">
225
+ <div class="radio">
226
+ <label>
227
+ <input type="radio" ng-model="overwrite_option" value="rename">重命名为<br />
228
+ <input class="form-control" style="margin-top:10px" type="text" ng-model="overwrite_newname" ng-disabled="overwrite_option=='overwrite'">
229
+ </label>
230
+ </div>
231
+ </div>
232
+ </div>
233
+ <div class="modal-footer">
234
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true" ng-click="cancel()">取消</button>
235
+ <button class="btn btn-primary" onclick="$('#overwriteconfirm').modal('hide')" ng-click="overwrite()">确定</button>
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+
241
+ <div id="newname" class="modal fade" role="dialog">
242
+ <div class="modal-dialog" role="document">
243
+ <div class="modal-content">
244
+ <div class="modal-header">
245
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
246
+ <h3 class="modal-title">{{newname_title}}</h3>
247
+ </div>
248
+ <div class="modal-body">
249
+ <div class="input-group">
250
+ <span class="input-group-addon">{{newname_label}}</span>
251
+ <input class="form-control" type="text" ng-model="newname_name">
252
+ </div>
253
+ </div>
254
+ <div class="modal-footer">
255
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
256
+ <button class="btn btn-primary" onclick="$('#newname').modal('hide')" ng-click="newname()">确定</button>
257
+ </div>
258
+ </div>
259
+ </div>
260
+ </div>
261
+
262
+ <div id="upload" 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">上传文件到当前目录</h3>
268
+ </div>
269
+ <div class="modal-body">
270
+ <h5>请选择您要上传的文件:</h5>
271
+ <div ng-include src="'/api/xsrf'"></div>
272
+ <form id="uploadform" target="uploadframe" action="/api/file/upload" enctype="multipart/form-data" method="post" onsubmit="$('#_xsrf').val(getCookie('XSRF-TOKEN'))">
273
+ <input type="hidden" name="_xsrf" value="" id="_xsrf">
274
+ <input type="hidden" name="path" value="{{curpath}}">
275
+ <div class="input-group">
276
+ <input name="ufile" type="file" class="form-control">
277
+ <div class="input-group-btn">
278
+ <button class="btn btn-default" ng-click="doupload()">开始上传</button>
279
+ </div>
280
+ </div>
281
+ </form>
282
+ <iframe frameborder="0" name="uploadframe" width="100%" height="50"></iframe>
283
+ </div>
284
+ <div class="modal-footer">
285
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true" ng-click="listdir()">关闭</button>
286
+ </div>
287
+ </div>
288
+ </div>
289
+ </div>
290
+
291
+ <div id="download" class="modal fade">
292
+ <div class="modal-dialog" role="document">
293
+ <div class="modal-content">
294
+ <div class="modal-header">
295
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
296
+ <h3 class="modal-title">下载资源到当前目录</h3>
297
+ </div>
298
+ <div class="modal-body">
299
+ <div style="margin:10px 20px">
300
+ <h5>请在下框中输入资源的URL(一次只能下载一个):</h5>
301
+ <textarea class="form-control" rows="4" ng-model="downloadurl"></textarea>
302
+ </div>
303
+ </div>
304
+ <div class="modal-footer">
305
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
306
+ <button class="btn btn-primary" onclick="$('#download').modal('hide')" ng-click="dodownload()">开始下载</button>
307
+ </div>
308
+ </div>
309
+ </div>
310
+ </div>
311
+
312
+ <div id="compressconfirm" class="modal fade">
313
+ <div class="modal-dialog" role="document">
314
+ <div class="modal-content">
315
+ <div class="modal-header">
316
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
317
+ <h3 class="modal-title">压缩 {{compress_name}}</h3>
318
+ </div>
319
+ <div class="modal-body">
320
+ <form class="form-horizontal" onsubmit="return false">
321
+ <div class="form-group">
322
+ <div class="col-sm-3 control-label">
323
+ <label class="control-label">压缩格式:</label>
324
+ </div>
325
+ <div class="col-sm-3 control-label">
326
+ <select class="form-control" ng-model="compress_type">
327
+ <option value=".gz" ng-show="compress_isreg">.gz</option>
328
+ <option value=".tar.gz">.tar.gz</option>
329
+ <option value=".tar.bz2">.tar.bz2</option>
330
+ <option value=".zip">.zip</option>
331
+ <option value=".tgz">.tgz</option>
332
+ </select>
333
+ </div>
334
+ </div>
335
+ <div class="form-group" ng-show="compress_type!='.gz'">
336
+ <div class="col-sm-3 control-label">
337
+ <label class="control-label">压缩包文件名:</label>
338
+ </div>
339
+ <div class="col-sm-6 control-label">
340
+ <div class="input-group">
341
+ <input class="form-control" type="text" ng-model="compress_zipname">
342
+ <span class="input-group-addon">{{compress_type}}</span>
343
+ </div>
344
+ </div>
345
+ </div>
346
+ </form>
347
+ </div>
348
+ <div class="modal-footer">
349
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
350
+ <button class="btn btn-primary" onclick="$('#compressconfirm').modal('hide')" ng-click="tar()" ng-show="compress_names.length>0">确定</button>
351
+ <button class="btn btn-primary" onclick="$('#compressconfirm').modal('hide')" ng-click="compress()" ng-show="compress_names.length==0">确定</button>
352
+ </div>
353
+ </div>
354
+ </div>
355
+ </div>
356
+
357
+ <div id="selector" class="modal fade">
358
+ <div class="modal-dialog" role="document">
359
+ <div class="modal-content">
360
+ <div class="modal-header">
361
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
362
+ <h3 class="modal-title">{{selector_title}}</h3>
363
+ </div>
364
+ <div class="modal-body">
365
+ <div selector></div>
366
+ </div>
367
+ <div class="modal-footer">
368
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
369
+ </div>
370
+ </div>
371
+ </div>
372
+ </div>
373
+
374
+ <div id="chownconfirm" class="modal fade">
375
+ <div class="modal-dialog" role="document">
376
+ <div class="modal-content">
377
+ <div class="modal-header">
378
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
379
+ <h3 class="modal-title">修改用户和用户组</h3>
380
+ </div>
381
+ <div class="modal-body">
382
+ <form class="form-horizontal" onsubmit="return false">
383
+ <div class="form-group">
384
+ <div class="col-sm-3 control-label">
385
+ <label class="control-label">用户:</label>
386
+ </div>
387
+ <div class="col-sm-9 control-label">
388
+ <select class="form-control" style="width:150px" ng-model="chown_user" ng-options="user for user in users"></select>
389
+ </div>
390
+ </div>
391
+ <div class="form-group">
392
+ <div class="col-sm-3 control-label">
393
+ <label class="control-label">用户组:</label>
394
+ </div>
395
+ <div class="col-sm-9 control-label">
396
+ <select class="form-control" style="width:150px" ng-model="chown_group" ng-options="group for group in groups"></select>
397
+ </div>
398
+ </div>
399
+ <div class="form-group" ng-show="chown_hasdir">
400
+ <div class="col-sm-3 control-label">
401
+ <label class="control-label">递归修改:</label>
402
+ </div>
403
+ <div class="col-sm-9">
404
+ <div class="checkbox">
405
+ <label class="control-label">
406
+ <input type="checkbox" ng-model="chown_recursively"> 同时修改所有子目录中的项目
407
+ </label>
408
+ </div>
409
+ </div>
410
+ </div>
411
+ </form>
412
+ </div>
413
+ <div class="modal-footer">
414
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
415
+ <button class="btn btn-primary" onclick="$('#chownconfirm').modal('hide')" ng-click="chown()">确定</button>
416
+ </div>
417
+ </div>
418
+ </div>
419
+ </div>
420
+
421
+ <div id="chmodconfirm" class="modal fade">
422
+ <div class="modal-dialog" role="document">
423
+ <div class="modal-content">
424
+ <div class="modal-header">
425
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
426
+ <h3 class="modal-title">修改权限</h3>
427
+ </div>
428
+ <div class="modal-body">
429
+ <form class="form-horizontal" onsubmit="return false">
430
+ <div class="form-group">
431
+ <div class="col-sm-3 control-label">
432
+ <label class="control-label">所有者权限:</label>
433
+ </div>
434
+ <div class="col-sm-9">
435
+ <div class="checkbox">
436
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[0][0]"> 读取</label>
437
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[0][1]"> 写入</label>
438
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[0][2]"> 可执行</label>
439
+ </div>
440
+ </div>
441
+ </div>
442
+ <div class="form-group">
443
+ <div class="col-sm-3 control-label">
444
+ <label class="control-label">所属用户组权限:</label>
445
+ </div>
446
+ <div class="col-sm-9">
447
+ <div class="checkbox">
448
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[1][0]"> 读取</label>
449
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[1][1]"> 写入</label>
450
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[1][2]"> 可执行</label>
451
+ </div>
452
+ </div>
453
+ </div>
454
+ <div class="form-group">
455
+ <div class="col-sm-3 control-label">
456
+ <label class="control-label">其他用户组权限:</label>
457
+ </div>
458
+ <div class="col-sm-9">
459
+ <div class="checkbox">
460
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[2][0]"> 读取</label>
461
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[2][1]"> 写入</label>
462
+ <label class="checkbox-inline"><input type="checkbox" ng-model="chmod_permbits[2][2]"> 可执行</label>
463
+ </div>
464
+ </div>
465
+ </div>
466
+ <div class="form-group" ng-show="chmod_hasdir">
467
+ <div class="col-sm-3 control-label">
468
+ <label class="control-label">递归修改:</label>
469
+ </div>
470
+ <div class="col-sm-9">
471
+ <div class="checkbox">
472
+ <label class="control-label"><input type="checkbox" ng-model="chmod_recursively"> 同时修改所有子目录中的项目</label>
473
+ </div>
474
+ </div>
475
+ </div>
476
+ </form>
477
+ </div>
478
+ <div class="modal-footer">
479
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
480
+ <button class="btn btn-primary" onclick="$('#chmodconfirm').modal('hide')" ng-click="chmod()">确定</button>
481
+ </div>
482
+ </div>
483
+ </div>
484
+ </div>
485
+
486
+ <div id="confirm" class="modal fade">
487
+ <div class="modal-dialog" role="document">
488
+ <div class="modal-content">
489
+ <div class="modal-header">
490
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
491
+ <h3 class="modal-title">{{confirm_title}}</h3>
492
+ </div>
493
+ <div class="modal-body" ng-bind-html-unsafe="confirm_body">
494
+ </div>
495
+ <div class="modal-footer">
496
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true" ng-click="cancel()">取消</button>
497
+ <button class="btn btn-primary" onclick="$('#confirm').modal('hide')" ng-click="confirm()">确定</button>
498
+ </div>
499
+ </div>
500
+ </div>
501
+ </div>
@@ -0,0 +1,95 @@
1
+ <div navbar ng-init="currentItem='file'"></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 ng-init="tlist()">
12
+ <div class="row">
13
+ <div class="col-md-6 col-sm-6 col-xs-6">
14
+ <a class="btn btn-default btn-sm" href="#/file">
15
+ <span class="glyphicon glyphicon-chevron-left"></span> 返回文件管理
16
+ </a>
17
+ <button class="btn btn-danger btn-sm" ng-click="tcleanconfirm()">
18
+ <span class="glyphicon glyphicon-remove"></span> 清空回收站
19
+ </button>
20
+ </div>
21
+ <!-- <div class="col-md-6 col-sm-6 col-xs-6" ng-show="items.length>0">
22
+ <button class="btn btn-danger btn-sm pull-right" ng-click="tcleanconfirm()">
23
+ <span class="glyphicon glyphicon-remove"></span> 清空回收站
24
+ </button>
25
+ <a class="btn btn-default btn-sm pull-right" href="#/file">
26
+ <span class="glyphicon glyphicon-chevron-left"></span> 返回文件管理
27
+ </a>
28
+ </div> -->
29
+ </div>
30
+
31
+ <div style="margin-top: 10px;" ng-show="fileloading">
32
+ <div waiting ng-init="waitingText='正在加载文件列表,请稍候...'"></div>
33
+ </div>
34
+
35
+ <!-- <div class="well" style="display:none;" ng-show="!fileloading && items.length==0">
36
+ 当前回收站是空的
37
+ </div> -->
38
+ <div class="panel panel-success" style="margin-top: 20px;" ng-show="!fileloading && items.length==0">
39
+ <!-- <div class="panel-heading">
40
+ <div class="panel-title">
41
+ <span class="glyphicon glyphicon-info-sign"> 当前回收站是空的</span>
42
+ </div>
43
+ </div> -->
44
+ <div class="panel-body">
45
+ <p>当前回收站是空的</p>
46
+ </div>
47
+ </div>
48
+
49
+ <div ng-show="!fileloading && items.length>0" class="table-responsive" style="margin-top:10px;">
50
+ <table class="table table-hover table-bordered table-condensed">
51
+ <thead>
52
+ <tr>
53
+ <th>名称</th>
54
+ <th>原路径</th>
55
+ <th>删除时间</th>
56
+ <th>操作</th>
57
+ </tr>
58
+ </thead>
59
+ <tbody>
60
+ <tr ng-repeat="item in items">
61
+ <td>
62
+ <i class="glyphicon glyphicon-folder-open" title="文件夹" ng-show="item.isdir"></i>
63
+ <i class="glyphicon glyphicon-file" title="文件" ng-show="item.isreg"></i>
64
+ <i class="glyphicon glyphicon-link" title="链接" ng-show="item.islnk&&(item.link_isdir||item.link_isreg)"></i>
65
+ <i class="glyphicon glyphicon-ban-circle" title="未知" ng-show="!item.isdir&&!item.isreg&&(!item.islnk||(item.islnk&&!item.link_isdir&&!item.link_isreg))"></i> {{item.name}}
66
+ </td>
67
+ <td>{{item.path}}</td>
68
+ <td>{{item.time}}</td>
69
+ <td>
70
+ <button class="btn btn-primary btn-xs" ng-click="restore(item.mount, item.uuid)">还原文件</button>
71
+ <button class="btn btn-default btn-xs" ng-click="tdeleteconfirm(item.name, item.mount, item.uuid)">彻底删除</button>
72
+ </td>
73
+ </tr>
74
+ </tbody>
75
+ </table>
76
+ </div>
77
+ </div>
78
+ </div>
79
+
80
+ <div id="confirm" class="modal fade">
81
+ <div class="modal-dialog" role="document">
82
+ <div class="modal-content">
83
+ <div class="modal-header">
84
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
85
+ <h3 class="modal-title">{{confirm_title}}</h3>
86
+ </div>
87
+ <div class="modal-body" ng-bind-html-unsafe="confirm_body">
88
+ </div>
89
+ <div class="modal-footer">
90
+ <button class="btn btn-default" data-dismiss="modal" aria-hidden="true">取消</button>
91
+ <button class="btn btn-primary" onclick="$('#confirm').modal('hide')" ng-click="confirm()">确定</button>
92
+ </div>
93
+ </div>
94
+ </div>
95
+ </div>