class FirstRun(CategoryPlugin, URLHandler): text = 'First run wizard' iconfont = None folder = None def on_session_start(self): self._step = 1 self._tree = TreeManager() self._reboot = True self._username = '' self._password = '' def get_ui(self): ui = self.app.inflate('firstrun:main') step = self.app.inflate('firstrun:step%i'%self._step) ui.append('content', step) if self._step == 3: tz_sel = [UI.SelectOption(text = x, value = x, selected = False) for x in zonelist.zones] ui.appendAll('zoneselect', *tz_sel) if self._step == 4: self._mgr = RepositoryManager(self.app.config) self._mgr.update_list() lst = self._mgr.available for k in sorted(lst, key=lambda x:x.name): row = self.app.inflate('firstrun:item') row.find('name').set('text', k.name) row.find('desc').set('text', k.description) row.find('icon').set('class', k.icon) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) req = k.str_req() row.find('check').set('name', 'install-'+k.id) if req != '': row.append('reqs', UI.HelpIcon(text=req)) ui.append('list', row) return ui def resize(self): shell_stdin('fdisk /dev/mmcblk0', 'd\n2\nn\np\n2\n\n\nw\n') shell('resize2fs /dev/mmcblk0p2') shell('e2fsck -fy /dev/mmcblk0p2') self.app.gconfig.set('genesis', 'restartmsg', 'yes') self.app.gconfig.save() @event('form/submit') def on_event(self, event, params, vars=None): reboot = False if params[0] == 'splash': self._step = 2 if params[0] == 'frmChangePassword': self._username = vars.getvalue('login', '') self._password = vars.getvalue('password', '') if self._username == '' or self._password == '': self.put_message('err', 'Enter valid login and password') else: # add Unix user self.backend = UsersBackend(self.app) users = self.backend.get_all_users() for u in users: if u.login == self._username: self.put_message('err', 'Duplicate name, please choose another') self._editing = '' return self._step = 3 if params[0] == 'frmSettings': hostname = vars.getvalue('hostname', '') zone = vars.getvalue('zoneselect', 'UTC') resize = vars.getvalue('resize', 'False') ssh = vars.getvalue('ssh', 'False') if resize: reboot = self.resize() self.put_message('info', 'Remember to restart your arkOS node after this wizard. To do this, click "Settings > Reboot".') if not ssh: shell('sed -i "s/PermitRootLogin yes/PermitRootLogin no/g" /etc/ssh/sshd_config') if hostname: shell('echo "' + hostname + '" > /etc/hostname') zone = zone.split('/') try: zonepath = os.path.join('/usr/share/zoneinfo', zone[0], zone[1]) except IndexError: zonepath = os.path.join('/usr/share/zoneinfo', zone[0]) if os.path.exists('/etc/localtime'): os.remove('/etc/localtime') os.symlink(zonepath, '/etc/localtime') self._step = 4 if params[0] == 'frmPlugins': lst = self._mgr.available for k in lst: if vars.getvalue('install-'+k.id, '0') == '1': try: self._mgr.install(k.id) except: pass ComponentManager.get().rescan() ConfManager.get().rescan(); self.app.gconfig.set('genesis', 'firstrun', 'no') self.app.gconfig.save() self.put_message('info', 'Setup complete!') # add Unix user and allow sudo use self.backend = UsersBackend(self.app) self.backend.add_user(self._username) self.backend.change_user_password(self._username, self._password) sudofile = open('/etc/sudoers', 'r+') filedata = sudofile.readlines() filedata = ["%sudo ALL=(ALL) ALL\n" if "# %sudo" in line else line for line in filedata] sudofile.close() sudofile = open('/etc/sudoers', 'w') for thing in filedata: sudofile.write(thing) sudofile.close() shell('usermod -a -G sudo ' + self._username) # add user to Genesis config self.app.gconfig.remove_option('users', 'admin') self.app.gconfig.set('users', self._username, hashpw(self._password)) self.app.gconfig.save() self._step = 5
class FirstRun(CategoryPlugin, URLHandler): text = 'First run wizard' iconfont = None folder = None def on_session_start(self): self._step = 1 self._tree = TreeManager() self._reboot = True self._username = '' self._password = '' def get_ui(self): ui = self.app.inflate('firstrun:main') step = self.app.inflate('firstrun:step%i' % self._step) ui.append('content', step) if self._step == 3: tz_sel = [ UI.SelectOption(text=x, value=x, selected=False) for x in zonelist.zones ] ui.appendAll('zoneselect', *tz_sel) if self._step == 4: self._mgr = RepositoryManager(self.app.config) self._mgr.update_list() lst = self._mgr.available for k in sorted(lst, key=lambda x: x.name): row = self.app.inflate('firstrun:item') row.find('name').set('text', k.name) row.find('desc').set('text', k.description) row.find('icon').set('class', k.icon) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) req = k.str_req() row.find('check').set('name', 'install-' + k.id) if req != '': row.append('reqs', UI.HelpIcon(text=req)) ui.append('list', row) return ui def resize(self): shell_stdin('fdisk /dev/mmcblk0', 'd\n2\nn\np\n2\n\n\nw\n') shell('resize2fs /dev/mmcblk0p2') shell('e2fsck -fy /dev/mmcblk0p2') self.app.gconfig.set('genesis', 'restartmsg', 'yes') self.app.gconfig.save() @event('form/submit') def on_event(self, event, params, vars=None): reboot = False if params[0] == 'splash': self._step = 2 if params[0] == 'frmChangePassword': self._username = vars.getvalue('login', '') self._password = vars.getvalue('password', '') if self._username == '' or self._password == '': self.put_message('err', 'Enter valid login and password') else: # add Unix user self.backend = UsersBackend(self.app) users = self.backend.get_all_users() for u in users: if u.login == self._username: self.put_message( 'err', 'Duplicate name, please choose another') self._editing = '' return self._step = 3 if params[0] == 'frmSettings': hostname = vars.getvalue('hostname', '') zone = vars.getvalue('zoneselect', 'UTC') resize = vars.getvalue('resize', 'False') ssh = vars.getvalue('ssh', 'False') if resize: reboot = self.resize() self.put_message( 'info', 'Remember to restart your arkOS node after this wizard. To do this, click "Settings > Reboot".' ) if not ssh: shell( 'sed -i "s/PermitRootLogin yes/PermitRootLogin no/g" /etc/ssh/sshd_config' ) if hostname: shell('echo "' + hostname + '" > /etc/hostname') zone = zone.split('/') try: zonepath = os.path.join('/usr/share/zoneinfo', zone[0], zone[1]) except IndexError: zonepath = os.path.join('/usr/share/zoneinfo', zone[0]) if os.path.exists('/etc/localtime'): os.remove('/etc/localtime') os.symlink(zonepath, '/etc/localtime') self._step = 4 if params[0] == 'frmPlugins': lst = self._mgr.available for k in lst: if vars.getvalue('install-' + k.id, '0') == '1': try: self._mgr.install(k.id) except: pass ComponentManager.get().rescan() ConfManager.get().rescan() self.app.gconfig.set('genesis', 'firstrun', 'no') self.app.gconfig.save() self.put_message('info', 'Setup complete!') # add Unix user and allow sudo use self.backend = UsersBackend(self.app) self.backend.add_user(self._username) self.backend.change_user_password(self._username, self._password) sudofile = open('/etc/sudoers', 'r+') filedata = sudofile.readlines() filedata = [ "%sudo ALL=(ALL) ALL\n" if "# %sudo" in line else line for line in filedata ] sudofile.close() sudofile = open('/etc/sudoers', 'w') for thing in filedata: sudofile.write(thing) sudofile.close() shell('usermod -a -G sudo ' + self._username) # add user to Genesis config self.app.gconfig.remove_option('users', 'admin') self.app.gconfig.set('users', self._username, hashpw(self._password)) self.app.gconfig.save() self._step = 5
class FirstRun(CategoryPlugin, URLHandler): text = 'First run wizard' icon = None folder = None def on_session_start(self): self._step = 1 def get_ui(self): ui = self.app.inflate('firstrun:main') step = self.app.inflate('firstrun:step%i'%self._step) ui.append('content', step) if self._step == 2: self._mgr = RepositoryManager(self.app.config) self._mgr.update_list() lst = self._mgr.available for k in sorted(lst, key=lambda x:x.name): row = self.app.inflate('firstrun:item') row.find('name').set('text', k.name) row.find('desc').set('text', k.description) row.find('icon').set('file', k.icon) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) req = k.str_req() row.find('check').set('name', 'install-'+k.id) if req != '': row.append('reqs', UI.HelpIcon(text=req)) ui.append('list', row) return ui @event('form/submit') def on_event(self, event, params, vars=None): if params[0] == 'frmChangePassword': login = vars.getvalue('login', '') password = vars.getvalue('password', '') if login == '' or password == '': self.put_message('err', 'Enter valid login and password') else: self.app.gconfig.remove_option('users', 'admin') self.app.gconfig.set('users', login, hashpw(password)) self.app.gconfig.save() self._step = 2 if params[0] == 'frmPlugins': lst = self._mgr.available for k in lst: if vars.getvalue('install-'+k.id, '0') == '1': try: self._mgr.install(k.id) except: pass ComponentManager.get().rescan() ConfManager.get().rescan(); self.app.gconfig.set('genesis', 'firstrun', 'no') self.app.gconfig.save() self.put_message('info', 'Setup complete') self._step = 3
class FirstRun(CategoryPlugin, URLHandler): text = 'First run wizard' iconfont = None folder = None def on_session_start(self): self._step = 1 self._tree = TreeManager() self._reboot = True self._username = '' self._password = '' def get_ui(self): ui = self.app.inflate('firstrun:main') step = self.app.inflate('firstrun:step%i'%self._step) ui.append('content', step) if self._step == 4: tz_sel = [UI.SelectOption(text = x, value = x, selected = False) for x in zonelist.zones] ui.appendAll('zoneselect', *tz_sel) if self._step == 5: self._mgr = RepositoryManager(self.app.config) self._mgr.update_list() lst = self._mgr.available for k in sorted(lst, key=lambda x:x.name): row = self.app.inflate('firstrun:item') row.find('name').set('text', k.name) row.find('desc').set('text', k.description) row.find('icon').set('class', k.icon) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) req = k.str_req() row.find('check').set('name', 'install-'+k.id) if req != '': row.append('reqs', UI.HelpIcon(text=req)) ui.append('list', row) return ui def resize(self): shell_stdin('fdisk /dev/mmcblk0', 'd\n2\nn\np\n2\n\n\nw\n') f = open('/etc/cron.d/resize', 'w') f.write('@reboot root resize2fs /dev/mmcblk0p2\n') f.write('@reboot root rm /etc/cron.d/resize\n') f.close() self.app.gconfig.set('genesis', 'restartmsg', 'yes') self.app.gconfig.save() @event('form/submit') def on_event(self, event, params, vars=None): reboot = False if params[0] == 'splash': self._step = 2 if params[0] == 'frmChangePassword': self._username = vars.getvalue('login', '') self._password = vars.getvalue('password', '') self._password_again = vars.getvalue('password_again', '') if self._username == '': self.put_message('err', 'The username can\'t be empty') elif self._password == '': self.put_message('err', 'The password can\'t be empty') elif self._password != self._password_again: self.put_message('err', 'The passwords don\'t match') else: # add Unix user self.backend = UsersBackend(self.app) users = self.backend.get_all_users() for u in users: if u.login == self._username: self.put_message('err', 'Duplicate name, please choose another') self._editing = '' return self._step = 3 if params[0] == 'frmChangeRootPassword': self._root_password = vars.getvalue('root_password', '') self._root_password_again = vars.getvalue('root_password_again', '') if self._root_password == '': self.put_message('err', 'The password can\'t be empty') elif self._root_password != self._root_password_again: self.put_message('err', 'The passwords don\'t match') else: self._step = 4 if params[0] == 'frmSettings': hostname = vars.getvalue('hostname', '') zone = vars.getvalue('zoneselect', 'UTC') resize = vars.getvalue('resize', 'False') gpumem = vars.getvalue('gpumem', 'False') ssh_as_root = vars.getvalue('ssh_as_root', 'False') if resize != '0': reboot = self.resize() self.put_message('info', 'Remember to restart your arkOS node after this wizard. To do this, click "Settings > Reboot".') if ssh_as_root != '0': shell('sed -i "/PermitRootLogin no/c\PermitRootLogin yes" /etc/ssh/sshd_config') else: shell('sed -i "/PermitRootLogin yes/c\PermitRootLogin no" /etc/ssh/sshd_config') if hostname != '0': shell('echo "' + hostname + '" > /etc/hostname') if gpumem != '0': shell('mount /dev/mmcblk0p1 /boot') if os.path.exists('/boot/config.txt'): shell('sed -i "/gpu_mem=/c\gpu_mem=16" /boot/config.txt') else: shell('echo "gpu_mem=16" >> /boot/config.txt') zone = zone.split('/') try: zonepath = os.path.join('/usr/share/zoneinfo', zone[0], zone[1]) except IndexError: zonepath = os.path.join('/usr/share/zoneinfo', zone[0]) if os.path.exists('/etc/localtime'): os.remove('/etc/localtime') os.symlink(zonepath, '/etc/localtime') self._step = 5 if params[0] == 'frmPlugins': lst = self._mgr.available toinst = [] for k in lst: if vars.getvalue('install-'+k.id, '0') == '1': toinst.append(k.id) t = self._mgr.list_available() for y in toinst: for i in eval(t[y].deps): for dep in i[1]: if dep[0] == 'plugin' and dep[1] not in toinst: self.put_message('err', ('%s can\'t be installed, as it depends on %s. Please ' 'install that also.' % (t[y].name, t[dep[1]].name))) return for k in lst: if vars.getvalue('install-'+k.id, '0') == '1': try: self._mgr.install(k.id) except: pass ComponentManager.get().rescan() ConfManager.get().rescan(); self.app.gconfig.set('genesis', 'firstrun', 'no') self.app.gconfig.save() self.put_message('info', 'Setup complete!') # change root password, add Unix user, and allow sudo use self.backend = UsersBackend(self.app) self.backend.change_user_password('root', self._root_password) self.backend.add_user(self._username) self.backend.change_user_password(self._username, self._password) sudofile = open('/etc/sudoers', 'r+') filedata = sudofile.readlines() filedata = ["%sudo ALL=(ALL) ALL\n" if "# %sudo" in line else line for line in filedata] sudofile.close() sudofile = open('/etc/sudoers', 'w') for thing in filedata: sudofile.write(thing) sudofile.close() shell('groupadd sudo') shell('usermod -a -G sudo ' + self._username) # add user to Genesis config self.app.gconfig.remove_option('users', 'admin') self.app.gconfig.set('users', self._username, hashpw(self._password)) self.app.gconfig.save() self._step = 6
class PluginManager(CategoryPlugin, URLHandler): text = 'Plugins' icon = '/dl/plugins/icon.png' folder = 'bottom' def on_session_start(self): self._mgr = RepositoryManager(self.app.config) def on_init(self): self._mgr.refresh() def get_counter(self): return len(self._mgr.upgradable) or None def get_ui(self): ui = self.app.inflate('plugins:main') inst = self._mgr.installed for k in inst: row = self.app.inflate('plugins:item') desc = '<span class="ui-el-label-1" style="padding-left: 5px;">%s</span>'%k.desc row.find('name').set('text', k.name) row.find('desc').set('text', k.desc) row.find('icon').set('file', k.icon) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) row.append('buttons', UI.TipIcon( icon='/dl/core/ui/stock/delete.png', text='Uninstall', id='remove/'+k.id, warning='Completely remove plugin "%s"'%k.name, )) if k.problem: row.find('status').set('file', '/dl/plugins/broken.png') row.append('reqs', UI.Icon(icon='/dl/core/ui/stock/warning.png', text=k.problem)) else: row.find('status').set('file', '/dl/plugins/good.png') ui.append('list', row) lst = self._mgr.available btn = UI.Button(text='Check for updates', id='update') if len(lst) == 0: btn['text'] = 'Download plugin list' for k in lst: row = self.app.inflate('plugins:item') row.find('name').set('text', k.name) row.find('desc').set('text', k.description) row.find('icon').set('file', k.icon) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) row.find('status').set('file', '/dl/plugins/none.png') for p in inst: if k.id == p.id and not p.problem: row.find('status').set('file', '/dl/plugins/upgrade.png') reqs = k.str_req() url = 'http://%s/view/plugins.php?id=%s' % ( self.app.config.get('genesis', 'update_server'), k.id ) if reqs == '': row.append('buttons', UI.TipIcon( icon='/dl/core/ui/stock/download.png', text='Download and install', id='install/'+k.id, )) else: row.append('reqs', UI.Icon(icon='/dl/core/ui/stock/warning.png', text=reqs)) ui.append('avail', row) return ui def get_ui_upload(self): return UI.Uploader( url='/upload_plugin', text='Install' ) @url('^/upload_plugin$') def upload(self, req, sr): vars = get_environment_vars(req) f = vars.getvalue('file', None) try: self._mgr.install_stream(f) except: pass sr('301 Moved Permanently', [('Location', '/')]) return '' @event('button/click') def on_click(self, event, params, vars=None): if params[0] == 'update': self._mgr.update_list() self.put_message('info', 'Plugin list updated') if params[0] == 'remove': self._mgr.remove(params[1]) self.put_message('info', 'Plugin removed. Refresh page for changes to take effect.') if params[0] == 'reload': try: PluginLoader.unload(params[1]) except: pass try: PluginLoader.load(params[1]) except: pass self.put_message('info', 'Plugin reloaded. Refresh page for changes to take effect.') if params[0] == 'restart': self.app.restart() if params[0] == 'install': self._mgr.install(params[1], load=True) self.put_message('info', 'Plugin installed. Refresh page for changes to take effect.') ComponentManager.get().rescan() ConfManager.get().rescan();
class PluginManager(CategoryPlugin, URLHandler): text = 'Applications' iconfont = 'gen-box-add' folder = None def on_session_start(self): self._mgr = RepositoryManager(self.app.config) def on_init(self): self._mgr.refresh() def get_counter(self): return len(self._mgr.upgradable) or None def get_ui(self): ui = self.app.inflate('plugins:main') inst = self._mgr.installed for k in inst: row = self.app.inflate('plugins:item') desc = '<span class="ui-el-label-1" style="padding-left: 5px;">%s</span>'%k.desc row.find('name').set('text', k.name) row.find('desc').set('text', k.desc) row.find('icon').set('class', k.iconfont) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) row.append('buttons', UI.TipIcon( iconfont="gen-cancel-circle", text='Uninstall', id='remove/'+k.id, warning='Completely remove plugin "%s"' % k.name, )) if k.problem: row.find('status').set('iconfont', 'gen-close-2 text-error') row.find('status').set('text', 'Error') row.find('icon').set('class', k.iconfont + ' text-error') row.find('name').set('class', 'text-error') row.find('desc').set('class', 'text-error') row.append('reqs', UI.IconFont(iconfont="gen-warning text-error", text=k.problem)) else: row.find('status').set('iconfont', 'gen-checkmark') row.find('status').set('text', 'Installed and Enabled') ui.append('list', row) lst = self._mgr.available btn = UI.Button(text='Check for updates', id='update') if len(lst) == 0: btn['text'] = 'Download plugin list' for k in lst: row = self.app.inflate('plugins:item') row.find('name').set('text', k.name) row.find('desc').set('text', k.description) row.find('icon').set('class', k.icon) row.find('version').set('text', k.version) row.find('author').set('text', k.author) row.find('author').set('url', k.homepage) for p in inst: if k.id == p.id and not p.problem: row.find('status').set('iconfont', 'gen-arrow-up-2') row.find('status').set('text', 'Upgrade Available') reqs = k.str_req() url = 'http://%s/view/plugins.php?id=%s' % ( self.app.config.get('genesis', 'update_server'), k.id ) if reqs == '': row.append('buttons', UI.TipIcon( iconfont="gen-box-add", text='Download and install', id='install/'+k.id, )) else: row.append('reqs', UI.Icon(iconfont="gen-warning", text=reqs)) ui.append('avail', row) return ui def get_ui_upload(self): return UI.Uploader( url='/upload_plugin', text='Install' ) @url('^/upload_plugin$') def upload(self, req, sr): vars = get_environment_vars(req) f = vars.getvalue('file', None) try: self._mgr.install_stream(f) except: pass sr('301 Moved Permanently', [('Location', '/')]) return '' @event('button/click') def on_click(self, event, params, vars=None): if params[0] == 'update': self._mgr.update_list() self.put_message('info', 'Plugin list updated') if params[0] == 'remove': self._mgr.remove(params[1]) self.put_message('info', 'Plugin removed. Refresh page for changes to take effect.') if params[0] == 'reload': try: PluginLoader.unload(params[1]) except: pass try: PluginLoader.load(params[1]) except: pass self.put_message('info', 'Plugin reloaded. Refresh page for changes to take effect.') if params[0] == 'restart': self.app.restart() if params[0] == 'install': self._mgr.install(params[1], load=True) self.put_message('info', 'Plugin installed. Refresh page for changes to take effect.') ComponentManager.get().rescan() ConfManager.get().rescan();